From 784e337ac48ded33f391e10d90249ffe836821b1 Mon Sep 17 00:00:00 2001 From: Jacob Floyd Date: Mon, 6 Feb 2023 22:38:46 -0600 Subject: [PATCH 1/7] bump pants to 2.15.0 --- pants.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pants.toml b/pants.toml index b88ae3e04a..99ebdae93a 100644 --- a/pants.toml +++ b/pants.toml @@ -6,7 +6,7 @@ enabled = false repo_id = "de0dea7a-9f6a-4c6e-aa20-6ba5ad969b8a" [GLOBAL] -pants_version = "2.14.0" +pants_version = "2.15.0" pythonpath = ["%(buildroot)s/pants-plugins"] build_file_prelude_globs = ["pants-plugins/macros.py"] backend_packages = [ From 11187ac057ada71e2235f8a328d2a23bb9755f0f Mon Sep 17 00:00:00 2001 From: Jacob Floyd Date: Wed, 8 Feb 2023 10:26:43 -0600 Subject: [PATCH 2/7] update pants-plugins/api_spec to pants 2.15 The Fmt/Lint plugin API changed in pants 2.15 It now requires a Subsystem with a SkipOption. I took advantage of this to consolidate the constants and all the address and pex request definitions in the Subsystem subclass. It now requires 2 rules instead of 1: to partition, then fmt/lint. That means the structure of the rule requests had to change slightly. The tests also had to account for the modified rules. --- pants-plugins/api_spec/rules.py | 164 +++++++-------------------- pants-plugins/api_spec/rules_test.py | 94 ++++++++++----- pants-plugins/api_spec/subsystem.py | 70 ++++++++++++ 3 files changed, 174 insertions(+), 154 deletions(-) create mode 100644 pants-plugins/api_spec/subsystem.py diff --git a/pants-plugins/api_spec/rules.py b/pants-plugins/api_spec/rules.py index 7d941475df..b0f2aea445 100644 --- a/pants-plugins/api_spec/rules.py +++ b/pants-plugins/api_spec/rules.py @@ -13,7 +13,6 @@ # limitations under the License. from dataclasses import dataclass -from pants.backend.python.target_types import EntryPoint from pants.backend.python.util_rules import pex, pex_from_targets from pants.backend.python.util_rules.pex import ( VenvPex, @@ -21,10 +20,10 @@ ) from pants.backend.python.util_rules.pex_from_targets import PexFromTargetsRequest from pants.core.goals.fmt import FmtResult, FmtTargetsRequest -from pants.core.goals.lint import LintResult, LintResults, LintTargetsRequest -from pants.core.target_types import FileSourceField, ResourceSourceField +from pants.core.goals.lint import LintResult, LintTargetsRequest +from pants.core.util_rules.config_files import ConfigFiles, ConfigFilesRequest +from pants.core.util_rules.partitions import PartitionerType from pants.core.util_rules.source_files import SourceFiles, SourceFilesRequest -from pants.engine.addresses import Address from pants.engine.fs import ( CreateDigest, Digest, @@ -34,26 +33,14 @@ ) from pants.engine.process import FallibleProcessResult, ProcessResult from pants.engine.rules import Get, MultiGet, collect_rules, rule -from pants.engine.target import ( - FieldSet, - SourcesField, - TransitiveTargets, - TransitiveTargetsRequest, -) -from pants.engine.unions import UnionRule +from pants.engine.target import FieldSet from pants.util.logging import LogLevel +from pants.util.strutil import strip_v2_chroot_path +from api_spec.subsystem import GenerateApiSpec, ValidateApiSpec from api_spec.target_types import APISpecSourceField -# these constants are also used in the tests -CMD_SOURCE_ROOT = "st2common" -CMD_DIR = "st2common/st2common/cmd" -CMD_MODULE = "st2common.cmd" -GENERATE_CMD = "generate_api_spec" -VALIDATE_CMD = "validate_api_spec" - - @dataclass(frozen=True) class APISpecFieldSet(FieldSet): required_fields = (APISpecSourceField,) @@ -63,12 +50,14 @@ class APISpecFieldSet(FieldSet): class GenerateAPISpecViaFmtTargetsRequest(FmtTargetsRequest): field_set_type = APISpecFieldSet - name = GENERATE_CMD + tool_subsystem = GenerateApiSpec + partitioner_type = PartitionerType.DEFAULT_SINGLE_PARTITION class ValidateAPISpecRequest(LintTargetsRequest): field_set_type = APISpecFieldSet - name = VALIDATE_CMD + tool_subsystem = ValidateApiSpec + partitioner_type = PartitionerType.DEFAULT_SINGLE_PARTITION @rule( @@ -76,66 +65,24 @@ class ValidateAPISpecRequest(LintTargetsRequest): level=LogLevel.DEBUG, ) async def generate_api_spec_via_fmt( - request: GenerateAPISpecViaFmtTargetsRequest, + request: GenerateAPISpecViaFmtTargetsRequest.Batch, + subsystem: GenerateApiSpec, ) -> FmtResult: # There will only be one target+field_set, but we iterate # to satisfy how fmt expects that there could be more than one. # If there is more than one, they will all get the same contents. - # Find all the dependencies of our target - transitive_targets = await Get( - TransitiveTargets, - TransitiveTargetsRequest( - [field_set.address for field_set in request.field_sets] - ), - ) - - dependency_files_get = Get( - SourceFiles, - SourceFilesRequest( - sources_fields=[ - tgt.get(SourcesField) for tgt in transitive_targets.dependencies - ], - for_sources_types=(FileSourceField, ResourceSourceField), - ), - ) - - source_files_get = Get( - SourceFiles, - SourceFilesRequest(field_set.source for field_set in request.field_sets), - ) + config_files_get = Get(ConfigFiles, ConfigFilesRequest, subsystem.config_request()) # actually generate it with an external script. # Generation cannot be inlined here because it needs to import the st2 code. - pex_get = Get( - VenvPex, - PexFromTargetsRequest( - [ - Address( - CMD_DIR, - target_name="cmd", - relative_file_path=f"{GENERATE_CMD}.py", - ), - ], - output_filename=f"{GENERATE_CMD}.pex", - internal_only=True, - main=EntryPoint.parse(f"{CMD_MODULE}.{GENERATE_CMD}:main"), - ), - ) + pex_get = Get(VenvPex, PexFromTargetsRequest, subsystem.pex_request()) - pex, dependency_files, source_files = await MultiGet( - pex_get, dependency_files_get, source_files_get - ) - - # If we were given an input digest from a previous formatter for the source files, then we - # should use that input digest instead of the one we read from the filesystem. - source_files_snapshot = ( - source_files.snapshot if request.snapshot is None else request.snapshot - ) + config_files, pex = await MultiGet(config_files_get, pex_get) input_digest = await Get( Digest, - MergeDigests((dependency_files.snapshot.digest, source_files_snapshot.digest)), + MergeDigests((config_files.snapshot.digest, request.snapshot.digest)), ) result = await Get( @@ -144,7 +91,7 @@ async def generate_api_spec_via_fmt( pex, argv=( "--config-file", - "conf/st2.dev.conf", + subsystem.config_file, ), input_digest=input_digest, description="Regenerating openapi.yaml api spec", @@ -152,18 +99,19 @@ async def generate_api_spec_via_fmt( ), ) - contents = [ - FileContent( - f"{field_set.address.spec_path}/{field_set.source.value}", - result.stdout, - ) - for field_set in request.field_sets - ] + contents = [FileContent(file, result.stdout) for file in request.files] output_digest = await Get(Digest, CreateDigest(contents)) output_snapshot = await Get(Snapshot, Digest, output_digest) - # TODO: Drop result.stdout since we already wrote it to a file? - return FmtResult.create(request, result, output_snapshot, strip_chroot_path=True) + + return FmtResult( + input=request.snapshot, + output=output_snapshot, + # Drop result.stdout since we already wrote it to a file + stdout="", + stderr=strip_v2_chroot_path(result.stderr), + tool_name=request.tool_name, + ) @rule( @@ -171,60 +119,31 @@ async def generate_api_spec_via_fmt( level=LogLevel.DEBUG, ) async def validate_api_spec( - request: ValidateAPISpecRequest, -) -> LintResults: + request: ValidateAPISpecRequest.Batch, + subsystem: ValidateApiSpec, +) -> LintResult: # There will only be one target+field_set, but we iterate # to satisfy how lint expects that there could be more than one. # If there is more than one, they will all get the same contents. - # Find all the dependencies of our target - transitive_targets = await Get( - TransitiveTargets, - TransitiveTargetsRequest( - [field_set.address for field_set in request.field_sets] - ), - ) - - dependency_files_get = Get( - SourceFiles, - SourceFilesRequest( - sources_fields=[ - tgt.get(SourcesField) for tgt in transitive_targets.dependencies - ], - for_sources_types=(FileSourceField, ResourceSourceField), - ), - ) - source_files_get = Get( SourceFiles, - SourceFilesRequest(field_set.source for field_set in request.field_sets), + SourceFilesRequest(field_set.source for field_set in request.elements), ) + config_files_get = Get(ConfigFiles, ConfigFilesRequest, subsystem.config_request()) + # actually validate it with an external script. # Validation cannot be inlined here because it needs to import the st2 code. - pex_get = Get( - VenvPex, - PexFromTargetsRequest( - [ - Address( - CMD_DIR, - target_name="cmd", - relative_file_path=f"{VALIDATE_CMD}.py", - ), - ], - output_filename=f"{VALIDATE_CMD}.pex", - internal_only=True, - main=EntryPoint.parse(f"{CMD_MODULE}.{VALIDATE_CMD}:main"), - ), - ) + pex_get = Get(VenvPex, PexFromTargetsRequest, subsystem.pex_request()) - pex, dependency_files, source_files = await MultiGet( - pex_get, dependency_files_get, source_files_get + source_files, config_files, pex = await MultiGet( + source_files_get, config_files_get, pex_get ) input_digest = await Get( Digest, - MergeDigests((dependency_files.snapshot.digest, source_files.snapshot.digest)), + MergeDigests((config_files.snapshot.digest, source_files.snapshot.digest)), ) process_result = await Get( @@ -233,7 +152,7 @@ async def validate_api_spec( pex, argv=( "--config-file", - "conf/st2.dev.conf", + subsystem.config_file, # TODO: Uncomment these as part of a project to fix the (many) issues it identifies. # We can uncomment --validate-defs (and possibly --verbose) once the spec defs are valid. # "--validate-defs", # check for x-api-model in definitions @@ -245,15 +164,14 @@ async def validate_api_spec( ), ) - result = LintResult.from_fallible_process_result(process_result) - return LintResults([result], linter_name=request.name) + return LintResult.create(request, process_result) def rules(): return [ *collect_rules(), - UnionRule(FmtTargetsRequest, GenerateAPISpecViaFmtTargetsRequest), - UnionRule(LintTargetsRequest, ValidateAPISpecRequest), + *GenerateAPISpecViaFmtTargetsRequest.rules(), + *ValidateAPISpecRequest.rules(), *pex.rules(), *pex_from_targets.rules(), ] diff --git a/pants-plugins/api_spec/rules_test.py b/pants-plugins/api_spec/rules_test.py index 0492a5d5dc..f575913608 100644 --- a/pants-plugins/api_spec/rules_test.py +++ b/pants-plugins/api_spec/rules_test.py @@ -22,24 +22,23 @@ from pants.backend.python import target_types_rules from pants.backend.python.target_types import PythonSourcesGeneratorTarget +from pants.core.util_rules.config_files import rules as config_files_rules from pants.core.util_rules.source_files import SourceFiles, SourceFilesRequest from pants.engine.addresses import Address from pants.engine.fs import CreateDigest, Digest, EMPTY_DIGEST, FileContent, Snapshot from pants.engine.target import Target from pants.core.goals.fmt import FmtResult -from pants.core.goals.lint import LintResult, LintResults +from pants.core.goals.lint import LintResult +from pants.core.util_rules.partitions import Partitions from pants.testutil.rule_runner import QueryRule, RuleRunner from .rules import ( - CMD_DIR, - CMD_SOURCE_ROOT, - GENERATE_CMD, - VALIDATE_CMD, APISpecFieldSet, GenerateAPISpecViaFmtTargetsRequest, ValidateAPISpecRequest, rules as api_spec_rules, ) +from .subsystem import GenerateApiSpec, ValidateApiSpec from .target_types import APISpec @@ -49,8 +48,16 @@ def rule_runner() -> RuleRunner: rules=[ *api_spec_rules(), *target_types_rules.rules(), - QueryRule(FmtResult, (GenerateAPISpecViaFmtTargetsRequest,)), - QueryRule(LintResults, (ValidateAPISpecRequest,)), + *config_files_rules(), + # generate + QueryRule( + Partitions, (GenerateAPISpecViaFmtTargetsRequest.PartitionRequest,) + ), + QueryRule(FmtResult, (GenerateAPISpecViaFmtTargetsRequest.Batch,)), + # validate + QueryRule(Partitions, (ValidateAPISpecRequest.PartitionRequest,)), + QueryRule(LintResult, (ValidateAPISpecRequest.Batch,)), + # etc QueryRule(SourceFiles, (SourceFilesRequest,)), ], target_types=[APISpec, PythonSourcesGeneratorTarget], @@ -66,23 +73,35 @@ def run_st2_generate_api_spec( rule_runner.set_options( [ "--backend-packages=api_spec", - f"--source-root-patterns=/{CMD_SOURCE_ROOT}", + f"--source-root-patterns=/{GenerateApiSpec.source_root}", *(extra_args or ()), ], env_inherit={"PATH", "PYENV_ROOT", "HOME"}, ) - field_sets = [APISpecFieldSet.create(tgt) for tgt in targets] + field_sets = tuple(APISpecFieldSet.create(tgt) for tgt in targets) input_sources = rule_runner.request( SourceFiles, [ SourceFilesRequest(field_set.source for field_set in field_sets), ], ) + + # run generate_api_spec_partitioner rule + partitions = rule_runner.request( + Partitions, + [GenerateAPISpecViaFmtTargetsRequest.PartitionRequest(field_sets)], + ) + assert len(partitions) == 1 + + # run generate_api_spec_via_fmt rule fmt_result = rule_runner.request( FmtResult, [ - GenerateAPISpecViaFmtTargetsRequest( - field_sets, snapshot=input_sources.snapshot + GenerateAPISpecViaFmtTargetsRequest.Batch( + tool_name="", + elements=partitions[0].elements, # ie: files + partition_metadata=partitions[0].metadata, + snapshot=input_sources.snapshot, ), ], ) @@ -98,19 +117,32 @@ def run_st2_validate_api_spec( rule_runner.set_options( [ "--backend-packages=api_spec", - f"--source-root-patterns=/{CMD_SOURCE_ROOT}", + f"--source-root-patterns=/{ValidateApiSpec.source_root}", *(extra_args or ()), ], env_inherit={"PATH", "PYENV_ROOT", "HOME"}, ) - field_sets = [APISpecFieldSet.create(tgt) for tgt in targets] - lint_results = rule_runner.request( - LintResults, + field_sets = tuple(APISpecFieldSet.create(tgt) for tgt in targets) + + # run validate_api_spec_partitioner rule + partitions = rule_runner.request( + Partitions, + [ValidateAPISpecRequest.PartitionRequest(field_sets)], + ) + assert len(partitions) == 1 + + # run validate_api_spec_via_fmt rule + lint_result = rule_runner.request( + LintResult, [ - ValidateAPISpecRequest(field_sets), + ValidateAPISpecRequest.Batch( + tool_name="", + elements=partitions[0].elements, # ie: field_sets + partition_metadata=partitions[0].metadata, + ), ], ) - return lint_results.results + return lint_result # copied from pantsbuild/pants.git/src/python/pants/backend/python/lint/black/rules_integration_test.py @@ -144,14 +176,15 @@ def write_generate_files( f"{api_spec_dir}/{api_spec_file}": before, f"{api_spec_dir}/BUILD": f"api_spec(name='t', source='{api_spec_file}')", # add in the target that's hard-coded in the generate_api_spec_via_fmt rule - f"{CMD_DIR}/{GENERATE_CMD}.py": GENERATE_API_SPEC_PY.format( + f"{GenerateApiSpec.directory}/{GenerateApiSpec.cmd}.py": GENERATE_API_SPEC_PY.format( api_spec_dir=api_spec_dir, api_spec_text=after ), - f"{CMD_DIR}/BUILD": "python_sources()", + f"{GenerateApiSpec.directory}/BUILD": "python_sources()", + GenerateApiSpec.config_file: "", } - module = CMD_DIR - while module != CMD_SOURCE_ROOT: + module = GenerateApiSpec.directory + while module != GenerateApiSpec.source_root: files[f"{module}/__init__.py"] = "" module = os.path.dirname(module) @@ -217,14 +250,15 @@ def write_validate_files( f"{api_spec_dir}/{api_spec_file}": contents, f"{api_spec_dir}/BUILD": f"api_spec(name='t', source='{api_spec_file}')", # add in the target that's hard-coded in the generate_api_spec_via_fmt rule - f"{CMD_DIR}/{VALIDATE_CMD}.py": VALIDATE_API_SPEC_PY.format( + f"{ValidateApiSpec.directory}/{ValidateApiSpec.cmd}.py": VALIDATE_API_SPEC_PY.format( api_spec_dir=api_spec_dir, rc=rc ), - f"{CMD_DIR}/BUILD": "python_sources()", + f"{ValidateApiSpec.directory}/BUILD": "python_sources()", + ValidateApiSpec.config_file: "", } - module = CMD_DIR - while module != CMD_SOURCE_ROOT: + module = ValidateApiSpec.directory + while module != ValidateApiSpec.source_root: files[f"{module}/__init__.py"] = "" module = os.path.dirname(module) @@ -244,9 +278,8 @@ def test_validate_passed(rule_runner: RuleRunner) -> None: Address("my_dir", target_name="t", relative_file_path="dummy.yaml") ) lint_result = run_st2_validate_api_spec(rule_runner, [tgt]) - assert len(lint_result) == 1 - assert lint_result[0].exit_code == 0 - assert lint_result[0].report == EMPTY_DIGEST + assert lint_result.exit_code == 0 + assert lint_result.report == EMPTY_DIGEST def test_validate_failed(rule_runner: RuleRunner) -> None: @@ -262,6 +295,5 @@ def test_validate_failed(rule_runner: RuleRunner) -> None: Address("my_dir", target_name="t", relative_file_path="dummy.yaml") ) lint_result = run_st2_validate_api_spec(rule_runner, [tgt]) - assert len(lint_result) == 1 - assert lint_result[0].exit_code == 1 - assert lint_result[0].report == EMPTY_DIGEST + assert lint_result.exit_code == 1 + assert lint_result.report == EMPTY_DIGEST diff --git a/pants-plugins/api_spec/subsystem.py b/pants-plugins/api_spec/subsystem.py new file mode 100644 index 0000000000..abc25cd747 --- /dev/null +++ b/pants-plugins/api_spec/subsystem.py @@ -0,0 +1,70 @@ +# Copyright 2023 The StackStorm Authors. +# +# 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 pants.backend.python.target_types import EntryPoint +from pants.backend.python.util_rules.pex_from_targets import PexFromTargetsRequest +from pants.core.util_rules.config_files import ConfigFilesRequest +from pants.engine.addresses import Address +from pants.option.option_types import SkipOption +from pants.option.subsystem import Subsystem + + +class Cmd(Subsystem): + name: str + options_scope: str + skip: SkipOption + + source_root = "st2common" + directory = "st2common/st2common/cmd" + module = "st2common.cmd" + cmd: str + config_file = "conf/st2.dev.conf" + + def address(self) -> Address: + return Address( + self.directory, + target_name="cmd", + relative_file_path=f"{self.cmd}.py", + ) + + def pex_request(self) -> PexFromTargetsRequest: + return PexFromTargetsRequest( + [self.address()], + output_filename=f"{self.cmd}.pex", + internal_only=True, + main=EntryPoint.parse(f"{self.module}.{self.cmd}:main"), + ) + + def config_request(self) -> ConfigFilesRequest: + return ConfigFilesRequest( + specified=(self.config_file,), + discovery=False, + ) + + +class GenerateApiSpec(Cmd): + name = "StackStorm OpenAPI Spec Generator" + options_scope = "st2-generate-api-spec" + skip = SkipOption("fmt", "lint") + help = "The StackStorm openapi.yaml generator." + + cmd = "generate_api_spec" + + +class ValidateApiSpec(Cmd): + name = "StackStorm OpenAPI Spec Validator" + options_scope = "st2-validate-api-spec" + skip = SkipOption("lint") + help = "The StackStorm openapi.yaml validator." + + cmd = "validate_api_spec" From 00b81374193db4da23f843e8d9006e68fdedb71a Mon Sep 17 00:00:00 2001 From: Jacob Floyd Date: Wed, 8 Feb 2023 11:05:45 -0600 Subject: [PATCH 3/7] update pants-plugins/sample_conf to pants 2.15 The Fmt/Lint plugin API changed in pants 2.15 It now requires a Subsystem with a SkipOption. I took advantage of this to consolidate the constants and all the address and pex request definitions in the Subsystem subclass. It now requires 2 rules instead of 1: to partition, then fmt/lint. That means the structure of the rule requests had to change slightly. The tests also had to account for the modified rules. --- pants-plugins/sample_conf/rules.py | 55 +++++++++---------------- pants-plugins/sample_conf/rules_test.py | 37 ++++++++++++----- pants-plugins/sample_conf/subsystem.py | 43 +++++++++++++++++++ 3 files changed, 90 insertions(+), 45 deletions(-) create mode 100644 pants-plugins/sample_conf/subsystem.py diff --git a/pants-plugins/sample_conf/rules.py b/pants-plugins/sample_conf/rules.py index ccc51aac81..e50c6f0a16 100644 --- a/pants-plugins/sample_conf/rules.py +++ b/pants-plugins/sample_conf/rules.py @@ -13,7 +13,6 @@ # limitations under the License. from dataclasses import dataclass -from pants.backend.python.target_types import EntryPoint from pants.backend.python.util_rules import pex, pex_from_targets from pants.backend.python.util_rules.pex import ( VenvPex, @@ -21,7 +20,7 @@ ) from pants.backend.python.util_rules.pex_from_targets import PexFromTargetsRequest from pants.core.goals.fmt import FmtResult, FmtTargetsRequest -from pants.engine.addresses import Address +from pants.core.util_rules.partitions import PartitionerType from pants.engine.fs import ( CreateDigest, Digest, @@ -31,17 +30,13 @@ from pants.engine.process import FallibleProcessResult from pants.engine.rules import Get, collect_rules, rule from pants.engine.target import FieldSet -from pants.engine.unions import UnionRule from pants.util.logging import LogLevel +from pants.util.strutil import strip_v2_chroot_path +from sample_conf.subsystem import ConfigGen from sample_conf.target_types import SampleConfSourceField -# these constants are also used in the tests. -SCRIPT_DIR = "tools" -SCRIPT = "config_gen" - - @dataclass(frozen=True) class GenerateSampleConfFieldSet(FieldSet): required_fields = (SampleConfSourceField,) @@ -51,15 +46,17 @@ class GenerateSampleConfFieldSet(FieldSet): class GenerateSampleConfViaFmtTargetsRequest(FmtTargetsRequest): field_set_type = GenerateSampleConfFieldSet - name = SCRIPT + tool_subsystem = ConfigGen + partitioner_type = PartitionerType.DEFAULT_SINGLE_PARTITION @rule( - desc=f"Update conf/st2.conf.sample with {SCRIPT_DIR}/{SCRIPT}.py", + desc=f"Update conf/st2.conf.sample with {ConfigGen.directory}/{ConfigGen.script}.py", level=LogLevel.DEBUG, ) async def generate_sample_conf_via_fmt( - request: GenerateSampleConfViaFmtTargetsRequest, + request: GenerateSampleConfViaFmtTargetsRequest.Batch, + subsystem: ConfigGen, ) -> FmtResult: # There will only be one target+field_set, but we iterate # to satisfy how fmt expects that there could be more than one. @@ -67,21 +64,7 @@ async def generate_sample_conf_via_fmt( # actually generate it with an external script. # Generation cannot be inlined here because it needs to import the st2 code. - pex = await Get( - VenvPex, - PexFromTargetsRequest( - [ - Address( - SCRIPT_DIR, - target_name=SCRIPT_DIR, - relative_file_path=f"{SCRIPT}.py", - ) - ], - output_filename=f"{SCRIPT}.pex", - internal_only=True, - main=EntryPoint(SCRIPT), - ), - ) + pex = await Get(VenvPex, PexFromTargetsRequest, subsystem.pex_request()) result = await Get( FallibleProcessResult, @@ -91,23 +74,25 @@ async def generate_sample_conf_via_fmt( ), ) - contents = [ - FileContent( - f"{field_set.address.spec_path}/{field_set.source.value}", - result.stdout, - ) - for field_set in request.field_sets - ] + contents = [FileContent(file, result.stdout) for file in request.files] output_digest = await Get(Digest, CreateDigest(contents)) output_snapshot = await Get(Snapshot, Digest, output_digest) - return FmtResult.create(request, result, output_snapshot, strip_chroot_path=True) + + return FmtResult( + input=request.snapshot, + output=output_snapshot, + # Drop result.stdout since we already wrote it to a file + stdout="", + stderr=strip_v2_chroot_path(result.stderr), + tool_name=request.tool_name, + ) def rules(): return [ *collect_rules(), - UnionRule(FmtTargetsRequest, GenerateSampleConfViaFmtTargetsRequest), + *GenerateSampleConfViaFmtTargetsRequest.rules(), *pex.rules(), *pex_from_targets.rules(), ] diff --git a/pants-plugins/sample_conf/rules_test.py b/pants-plugins/sample_conf/rules_test.py index 4986e7b905..47de2a64cf 100644 --- a/pants-plugins/sample_conf/rules_test.py +++ b/pants-plugins/sample_conf/rules_test.py @@ -23,15 +23,15 @@ from pants.engine.fs import CreateDigest, Digest, FileContent, Snapshot from pants.engine.target import Target from pants.core.goals.fmt import FmtResult +from pants.core.util_rules.partitions import Partitions from pants.testutil.rule_runner import QueryRule, RuleRunner from .rules import ( - SCRIPT, - SCRIPT_DIR, GenerateSampleConfFieldSet, GenerateSampleConfViaFmtTargetsRequest, rules as sample_conf_rules, ) +from .subsystem import ConfigGen from .target_types import SampleConf @@ -41,7 +41,10 @@ def rule_runner() -> RuleRunner: rules=[ *sample_conf_rules(), *target_types_rules.rules(), - QueryRule(FmtResult, (GenerateSampleConfViaFmtTargetsRequest,)), + QueryRule( + Partitions, (GenerateSampleConfViaFmtTargetsRequest.PartitionRequest,) + ), + QueryRule(FmtResult, (GenerateSampleConfViaFmtTargetsRequest.Batch,)), QueryRule(SourceFiles, (SourceFilesRequest,)), ], target_types=[SampleConf, PythonSourcesGeneratorTarget], @@ -57,23 +60,35 @@ def run_st2_generate_sample_conf( rule_runner.set_options( [ "--backend-packages=sample_conf", - f"--source-root-patterns=/{SCRIPT_DIR}", + f"--source-root-patterns=/{ConfigGen.directory}", *(extra_args or ()), ], env_inherit={"PATH", "PYENV_ROOT", "HOME"}, ) - field_sets = [GenerateSampleConfFieldSet.create(tgt) for tgt in targets] + field_sets = tuple(GenerateSampleConfFieldSet.create(tgt) for tgt in targets) input_sources = rule_runner.request( SourceFiles, [ SourceFilesRequest(field_set.source for field_set in field_sets), ], ) + + # run DEFAULT_SINGLE_PARTITION rule + partitions = rule_runner.request( + Partitions, + [GenerateSampleConfViaFmtTargetsRequest.PartitionRequest(field_sets)], + ) + assert len(partitions) == 1 + + # run generate_schemas_via_fmt rule fmt_result = rule_runner.request( FmtResult, [ - GenerateSampleConfViaFmtTargetsRequest( - field_sets, snapshot=input_sources.snapshot + GenerateSampleConfViaFmtTargetsRequest.Batch( + tool_name="", + elements=partitions[0].elements, # ie: files + partition_metadata=partitions[0].metadata, + snapshot=input_sources.snapshot, ), ], ) @@ -112,9 +127,11 @@ def write_files( f"{sample_conf_dir}/{sample_conf_file}": before, f"{sample_conf_dir}/BUILD": f"sample_conf(name='t', source='{sample_conf_file}')", # add in the target that's hard-coded in the generate_sample_conf_via_fmt rue - f"{SCRIPT_DIR}/{SCRIPT}.py": SCRIPT_PY.format(sample_conf_text=after), - f"{SCRIPT_DIR}/__init__.py": "", - f"{SCRIPT_DIR}/BUILD": "python_sources()", + f"{ConfigGen.directory}/{ConfigGen.script}.py": SCRIPT_PY.format( + sample_conf_text=after + ), + f"{ConfigGen.directory}/__init__.py": "", + f"{ConfigGen.directory}/BUILD": "python_sources()", } rule_runner.write_files(files) diff --git a/pants-plugins/sample_conf/subsystem.py b/pants-plugins/sample_conf/subsystem.py new file mode 100644 index 0000000000..20f5c78b59 --- /dev/null +++ b/pants-plugins/sample_conf/subsystem.py @@ -0,0 +1,43 @@ +# Copyright 2023 The StackStorm Authors. +# +# 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 pants.backend.python.target_types import EntryPoint +from pants.backend.python.util_rules.pex_from_targets import PexFromTargetsRequest +from pants.engine.addresses import Address +from pants.option.option_types import SkipOption +from pants.option.subsystem import Subsystem + + +class ConfigGen(Subsystem): + name = "StackStorm Sample st2.conf Generator" + options_scope = "st2-config-gen" + skip = SkipOption("fmt", "lint") + help = "The StackStorm st2.conf.sample generator." + + directory = "tools" + script = "config_gen" + + def address(self) -> Address: + return Address( + self.directory, + target_name=self.directory, + relative_file_path=f"{self.script}.py", + ) + + def pex_request(self) -> PexFromTargetsRequest: + return PexFromTargetsRequest( + [self.address()], + output_filename=f"{self.script}.pex", + internal_only=True, + main=EntryPoint(self.script), + ) From 30b116ff973ede26d73271a3099170f83fdb97d2 Mon Sep 17 00:00:00 2001 From: Jacob Floyd Date: Wed, 8 Feb 2023 11:39:18 -0600 Subject: [PATCH 4/7] update pants-plugins/schemas to pants 2.15 The Fmt/Lint plugin API changed in pants 2.15 It now requires a Subsystem with a SkipOption. I took advantage of this to consolidate the constants and all the address and pex request definitions in the Subsystem subclass. It now requires 2 rules instead of 1: to partition, then fmt/lint. That means the structure of the rule requests had to change slightly. The tests also had to account for the modified rules. --- pants-plugins/schemas/rules.py | 44 ++++++++-------------------- pants-plugins/schemas/rules_test.py | 38 ++++++++++++++++-------- pants-plugins/schemas/subsystem.py | 45 +++++++++++++++++++++++++++++ 3 files changed, 83 insertions(+), 44 deletions(-) create mode 100644 pants-plugins/schemas/subsystem.py diff --git a/pants-plugins/schemas/rules.py b/pants-plugins/schemas/rules.py index 4b49e8c3b6..c9d9622966 100644 --- a/pants-plugins/schemas/rules.py +++ b/pants-plugins/schemas/rules.py @@ -11,9 +11,9 @@ # 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. +import os from dataclasses import dataclass -from pants.backend.python.target_types import EntryPoint from pants.backend.python.util_rules import pex, pex_from_targets from pants.backend.python.util_rules.pex import ( VenvPex, @@ -21,25 +21,18 @@ ) from pants.backend.python.util_rules.pex_from_targets import PexFromTargetsRequest from pants.core.goals.fmt import FmtResult, FmtTargetsRequest -from pants.engine.addresses import Address +from pants.core.util_rules.partitions import PartitionerType from pants.engine.fs import MergeDigests, Snapshot from pants.engine.process import FallibleProcessResult from pants.engine.rules import Get, MultiGet, collect_rules, rule from pants.engine.target import FieldSet -from pants.engine.unions import UnionRule from pants.util.logging import LogLevel from pants.util.strutil import strip_v2_chroot_path +from schemas.subsystem import GenerateSchemas from schemas.target_types import SchemasSourcesField -# these constants are also used in the tests. -CMD_SOURCE_ROOT = "st2common" -CMD_DIR = "st2common/st2common/cmd" -CMD_MODULE = "st2common.cmd" -CMD = "generate_schemas" - - @dataclass(frozen=True) class GenerateSchemasFieldSet(FieldSet): required_fields = (SchemasSourcesField,) @@ -49,7 +42,8 @@ class GenerateSchemasFieldSet(FieldSet): class GenerateSchemasViaFmtTargetsRequest(FmtTargetsRequest): field_set_type = GenerateSchemasFieldSet - name = CMD + tool_subsystem = GenerateSchemas + partitioner_type = PartitionerType.DEFAULT_SINGLE_PARTITION @rule( @@ -57,29 +51,15 @@ class GenerateSchemasViaFmtTargetsRequest(FmtTargetsRequest): level=LogLevel.DEBUG, ) async def generate_schemas_via_fmt( - request: GenerateSchemasViaFmtTargetsRequest, + request: GenerateSchemasViaFmtTargetsRequest.Batch, + subsystem: GenerateSchemas, ) -> FmtResult: # We use a pex to actually generate the schemas with an external script. # Generation cannot be inlined here because it needs to import the st2 code. - pex = await Get( - VenvPex, - PexFromTargetsRequest( - [ - Address( - CMD_DIR, - target_name="cmd", - relative_file_path=f"{CMD}.py", - ) - ], - output_filename=f"{CMD}.pex", - internal_only=True, - main=EntryPoint.parse(f"{CMD_MODULE}.{CMD}:main"), - ), - ) + pex = await Get(VenvPex, PexFromTargetsRequest, subsystem.pex_request()) - # There will probably only be one target+field_set, but we iterate - # to satisfy how fmt expects that there could be more than one. - output_directories = [fs.address.spec_path for fs in request.field_sets] + # There will probably only be one target+field_set, and therefor only one directory + output_directories = {os.path.dirname(f) for f in request.files} results = await MultiGet( Get( @@ -112,14 +92,14 @@ async def generate_schemas_via_fmt( output=output_snapshot, stdout=stdout, stderr=stderr, - formatter_name=request.name, + tool_name=request.tool_name, ) def rules(): return [ *collect_rules(), - UnionRule(FmtTargetsRequest, GenerateSchemasViaFmtTargetsRequest), + *GenerateSchemasViaFmtTargetsRequest.rules(), *pex.rules(), *pex_from_targets.rules(), ] diff --git a/pants-plugins/schemas/rules_test.py b/pants-plugins/schemas/rules_test.py index 308db057a6..11865ed1fa 100644 --- a/pants-plugins/schemas/rules_test.py +++ b/pants-plugins/schemas/rules_test.py @@ -25,16 +25,15 @@ from pants.engine.fs import CreateDigest, Digest, FileContent, Snapshot from pants.engine.target import Target from pants.core.goals.fmt import FmtResult +from pants.core.util_rules.partitions import Partitions from pants.testutil.rule_runner import QueryRule, RuleRunner from .rules import ( - CMD, - CMD_DIR, - CMD_SOURCE_ROOT, GenerateSchemasFieldSet, GenerateSchemasViaFmtTargetsRequest, rules as schemas_rules, ) +from .subsystem import GenerateSchemas from .target_types import Schemas @@ -44,7 +43,10 @@ def rule_runner() -> RuleRunner: rules=[ *schemas_rules(), *target_types_rules.rules(), - QueryRule(FmtResult, (GenerateSchemasViaFmtTargetsRequest,)), + QueryRule( + Partitions, (GenerateSchemasViaFmtTargetsRequest.PartitionRequest,) + ), + QueryRule(FmtResult, (GenerateSchemasViaFmtTargetsRequest.Batch,)), QueryRule(SourceFiles, (SourceFilesRequest,)), ], target_types=[Schemas, PythonSourcesGeneratorTarget], @@ -60,23 +62,35 @@ def run_st2_generate_schemas( rule_runner.set_options( [ "--backend-packages=schemas", - f"--source-root-patterns=/{CMD_SOURCE_ROOT}", + f"--source-root-patterns=/{GenerateSchemas.source_root}", *(extra_args or ()), ], env_inherit={"PATH", "PYENV_ROOT", "HOME"}, ) - field_sets = [GenerateSchemasFieldSet.create(tgt) for tgt in targets] + field_sets = tuple(GenerateSchemasFieldSet.create(tgt) for tgt in targets) input_sources = rule_runner.request( SourceFiles, [ SourceFilesRequest(field_set.sources for field_set in field_sets), ], ) + + # run generate_schemas_partitioner rule + partitions = rule_runner.request( + Partitions, + [GenerateSchemasViaFmtTargetsRequest.PartitionRequest(field_sets)], + ) + assert len(partitions) == 1 + + # run generate_schemas_via_fmt rule fmt_result = rule_runner.request( FmtResult, [ - GenerateSchemasViaFmtTargetsRequest( - field_sets, snapshot=input_sources.snapshot + GenerateSchemasViaFmtTargetsRequest.Batch( + tool_name="", + elements=partitions[0].elements, # ie: files + partition_metadata=partitions[0].metadata, + snapshot=input_sources.snapshot, ), ], ) @@ -114,14 +128,14 @@ def write_files( f"{schemas_dir}/{schema_file}": before, f"{schemas_dir}/BUILD": "schemas(name='t')", # add in the target that's hard-coded in the generate_schemas_via_fmt rue - f"{CMD_DIR}/{CMD}.py": GENERATE_SCHEMAS_PY.format( + f"{GenerateSchemas.directory}/{GenerateSchemas.cmd}.py": GENERATE_SCHEMAS_PY.format( schemas_dir=schemas_dir, schema_text=after ), - f"{CMD_DIR}/BUILD": "python_sources()", + f"{GenerateSchemas.directory}/BUILD": "python_sources()", } - module = CMD_DIR - while module != CMD_SOURCE_ROOT: + module = GenerateSchemas.directory + while module != GenerateSchemas.source_root: files[f"{module}/__init__.py"] = "" module = os.path.dirname(module) diff --git a/pants-plugins/schemas/subsystem.py b/pants-plugins/schemas/subsystem.py new file mode 100644 index 0000000000..16e2758c16 --- /dev/null +++ b/pants-plugins/schemas/subsystem.py @@ -0,0 +1,45 @@ +# Copyright 2023 The StackStorm Authors. +# +# 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 pants.backend.python.target_types import EntryPoint +from pants.backend.python.util_rules.pex_from_targets import PexFromTargetsRequest +from pants.engine.addresses import Address +from pants.option.option_types import SkipOption +from pants.option.subsystem import Subsystem + + +class GenerateSchemas(Subsystem): + name = "StackStorm Content Schemas Generator" + options_scope = "st2-generate-schemas" + skip = SkipOption("fmt", "lint") + help = "The StackStorm content schemas generator." + + source_root = "st2common" + directory = "st2common/st2common/cmd" + module = "st2common.cmd" + cmd = "generate_schemas" + + def address(self) -> Address: + return Address( + self.directory, + target_name="cmd", + relative_file_path=f"{self.cmd}.py", + ) + + def pex_request(self) -> PexFromTargetsRequest: + return PexFromTargetsRequest( + [self.address()], + output_filename=f"{self.cmd}.pex", + internal_only=True, + main=EntryPoint.parse(f"{self.module}.{self.cmd}:main"), + ) From ef4744b789bb3c75491bde8e2ca80d009e720547 Mon Sep 17 00:00:00 2001 From: Jacob Floyd Date: Wed, 8 Feb 2023 16:24:50 -0600 Subject: [PATCH 5/7] regen pants-plugins lockfile for pants 2.15 --- lockfiles/pants-plugins.lock | 563 +++++++++++++++++++++++------------ 1 file changed, 374 insertions(+), 189 deletions(-) diff --git a/lockfiles/pants-plugins.lock b/lockfiles/pants-plugins.lock index b69416a9ba..fa10a530a8 100644 --- a/lockfiles/pants-plugins.lock +++ b/lockfiles/pants-plugins.lock @@ -9,8 +9,8 @@ // "CPython<3.10,>=3.7" // ], // "generated_with_requirements": [ -// "pantsbuild.pants.testutil<2.15,>=2.14.0a0", -// "pantsbuild.pants<2.15,>=2.14.0a0" +// "pantsbuild.pants.testutil<2.16,>=2.15.0a0", +// "pantsbuild.pants<2.16,>=2.15.0a0" // ], // "manylinux": "manylinux2014", // "requirement_constraints": [], @@ -50,51 +50,47 @@ "artifacts": [ { "algorithm": "sha256", - "hash": "86efa402f67bf2df34f51a335487cf46b1ec130d02b8d39fd248abfd30da551c", - "url": "https://files.pythonhosted.org/packages/f2/bc/d817287d1aa01878af07c19505fafd1165cd6a119e9d0821ca1d1c20312d/attrs-22.1.0-py2.py3-none-any.whl" + "hash": "29e95c7f6778868dbd49170f98f8818f78f3dc5e0e37c0b1f474e3561b240836", + "url": "https://files.pythonhosted.org/packages/fb/6e/6f83bf616d2becdf333a1640f1d463fef3150e2e926b7010cb0f81c95e88/attrs-22.2.0-py3-none-any.whl" }, { "algorithm": "sha256", - "hash": "29adc2665447e5191d0e7c568fde78b21f9672d344281d0c6e1ab085429b22b6", - "url": "https://files.pythonhosted.org/packages/1a/cb/c4ffeb41e7137b23755a45e1bfec9cbb76ecf51874c6f1d113984ecaa32c/attrs-22.1.0.tar.gz" + "hash": "c9227bfc2f01993c03f68db37d1d15c9690188323c067c641f1a35ca58185f99", + "url": "https://files.pythonhosted.org/packages/21/31/3f468da74c7de4fcf9b25591e682856389b3400b4b62f201e65f15ea3e07/attrs-22.2.0.tar.gz" } ], "project_name": "attrs", "requires_dists": [ - "cloudpickle; platform_python_implementation == \"CPython\" and extra == \"dev\"", - "cloudpickle; platform_python_implementation == \"CPython\" and extra == \"tests\"", + "attrs[docs,tests]; extra == \"dev\"", + "attrs[tests-no-zope]; extra == \"tests\"", + "attrs[tests]; extra == \"cov\"", + "cloudpickle; platform_python_implementation == \"CPython\" and extra == \"tests-no-zope\"", "cloudpickle; platform_python_implementation == \"CPython\" and extra == \"tests_no_zope\"", - "coverage[toml]>=5.0.2; extra == \"dev\"", - "coverage[toml]>=5.0.2; extra == \"tests\"", - "coverage[toml]>=5.0.2; extra == \"tests_no_zope\"", - "furo; extra == \"dev\"", + "coverage-enable-subprocess; extra == \"cov\"", + "coverage[toml]>=5.3; extra == \"cov\"", "furo; extra == \"docs\"", - "hypothesis; extra == \"dev\"", - "hypothesis; extra == \"tests\"", + "hypothesis; extra == \"tests-no-zope\"", "hypothesis; extra == \"tests_no_zope\"", - "mypy!=0.940,>=0.900; extra == \"dev\"", - "mypy!=0.940,>=0.900; extra == \"tests\"", - "mypy!=0.940,>=0.900; extra == \"tests_no_zope\"", - "pre-commit; extra == \"dev\"", - "pympler; extra == \"dev\"", - "pympler; extra == \"tests\"", + "mypy<0.990,>=0.971; platform_python_implementation == \"CPython\" and extra == \"tests-no-zope\"", + "mypy<0.990,>=0.971; platform_python_implementation == \"CPython\" and extra == \"tests_no_zope\"", + "myst-parser; extra == \"docs\"", + "pympler; extra == \"tests-no-zope\"", "pympler; extra == \"tests_no_zope\"", - "pytest-mypy-plugins; extra == \"dev\"", - "pytest-mypy-plugins; extra == \"tests\"", - "pytest-mypy-plugins; extra == \"tests_no_zope\"", - "pytest>=4.3.0; extra == \"dev\"", - "pytest>=4.3.0; extra == \"tests\"", + "pytest-mypy-plugins; (platform_python_implementation == \"CPython\" and python_version < \"3.11\") and extra == \"tests-no-zope\"", + "pytest-mypy-plugins; (platform_python_implementation == \"CPython\" and python_version < \"3.11\") and extra == \"tests_no_zope\"", + "pytest-xdist[psutil]; extra == \"tests-no-zope\"", + "pytest-xdist[psutil]; extra == \"tests_no_zope\"", + "pytest>=4.3.0; extra == \"tests-no-zope\"", "pytest>=4.3.0; extra == \"tests_no_zope\"", - "sphinx-notfound-page; extra == \"dev\"", "sphinx-notfound-page; extra == \"docs\"", - "sphinx; extra == \"dev\"", "sphinx; extra == \"docs\"", - "zope.interface; extra == \"dev\"", + "sphinxcontrib-towncrier; extra == \"docs\"", + "towncrier; extra == \"docs\"", "zope.interface; extra == \"docs\"", "zope.interface; extra == \"tests\"" ], - "requires_python": ">=3.5", - "version": "22.1" + "requires_python": ">=3.6", + "version": "22.2.0" }, { "artifacts": [ @@ -118,21 +114,222 @@ "artifacts": [ { "algorithm": "sha256", - "hash": "83e9a75d1911279afd89352c68b45348559d1fc0506b054b346651b5e7fee29f", - "url": "https://files.pythonhosted.org/packages/db/51/a507c856293ab05cdc1db77ff4bc1268ddd39f29e7dc4919aa497f0adbec/charset_normalizer-2.1.1-py3-none-any.whl" + "hash": "7e189e2e1d3ed2f4aebabd2d5b0f931e883676e51c7624826e0a4e5fe8a0bf24", + "url": "https://files.pythonhosted.org/packages/68/2b/02e9d6a98ddb73fa238d559a9edcc30b247b8dc4ee848b6184c936e99dc0/charset_normalizer-3.0.1-py3-none-any.whl" + }, + { + "algorithm": "sha256", + "hash": "9d9153257a3f70d5f69edf2325357251ed20f772b12e593f3b3377b5f78e7ef8", + "url": "https://files.pythonhosted.org/packages/00/35/830c29e5dab61932224c7a6c89427090164a3e425cf03486ce7a3ce60623/charset_normalizer-3.0.1-cp37-cp37m-musllinux_1_1_i686.whl" + }, + { + "algorithm": "sha256", + "hash": "39049da0ffb96c8cbb65cbf5c5f3ca3168990adf3551bd1dee10c48fce8ae820", + "url": "https://files.pythonhosted.org/packages/03/5e/e81488c74e86eef85cf085417ed945da2dcca87ed22d76202680c16bd3c3/charset_normalizer-3.0.1-cp38-cp38-musllinux_1_1_x86_64.whl" + }, + { + "algorithm": "sha256", + "hash": "024e606be3ed92216e2b6952ed859d86b4cfa52cd5bc5f050e7dc28f9b43ec42", + "url": "https://files.pythonhosted.org/packages/0e/d3/c5fa421dc69bb77c581ed561f1ec6656109c97731ad1128aa93d8bad3053/charset_normalizer-3.0.1-cp38-cp38-macosx_10_9_universal2.whl" + }, + { + "algorithm": "sha256", + "hash": "503e65837c71b875ecdd733877d852adbc465bd82c768a067badd953bf1bc5a3", + "url": "https://files.pythonhosted.org/packages/0f/45/f462f534dd2853ebbc186ed859661db454665b1dc9ae6c690d982153cda9/charset_normalizer-3.0.1-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl" + }, + { + "algorithm": "sha256", + "hash": "3e45867f1f2ab0711d60c6c71746ac53537f1684baa699f4f668d4c6f6ce8e14", + "url": "https://files.pythonhosted.org/packages/16/bd/671f11f920dfb46de848e9176d84ddb25b3bbdffac6751cbbf691c0b5b17/charset_normalizer-3.0.1-cp37-cp37m-macosx_10_9_x86_64.whl" + }, + { + "algorithm": "sha256", + "hash": "8eade758719add78ec36dc13201483f8e9b5d940329285edcd5f70c0a9edbd7f", + "url": "https://files.pythonhosted.org/packages/17/67/4b25c0358a2e812312b551e734d58855d58f47d0e0e9d1573930003910cb/charset_normalizer-3.0.1-cp39-cp39-macosx_10_9_universal2.whl" + }, + { + "algorithm": "sha256", + "hash": "81d6741ab457d14fdedc215516665050f3822d3e56508921cc7239f8c8e66a58", + "url": "https://files.pythonhosted.org/packages/17/da/fdf8ffc33716c82cae06008159a55a581fa515e8dd02e3395dcad42ff83d/charset_normalizer-3.0.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl" + }, + { + "algorithm": "sha256", + "hash": "e696f0dd336161fca9adbb846875d40752e6eba585843c768935ba5c9960722b", + "url": "https://files.pythonhosted.org/packages/20/a2/16b2cbf5f73bdd10624b94647b85c008ba25059792a5c7b4fdb8358bceeb/charset_normalizer-3.0.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl" + }, + { + "algorithm": "sha256", + "hash": "0f438ae3532723fb6ead77e7c604be7c8374094ef4ee2c5e03a3a17f1fca256c", + "url": "https://files.pythonhosted.org/packages/25/19/298089cef2eb82fd3810d982aa239d4226594f99e1fe78494cb9b47b03c9/charset_normalizer-3.0.1-cp39-cp39-musllinux_1_1_s390x.whl" + }, + { + "algorithm": "sha256", + "hash": "911d8a40b2bef5b8bbae2e36a0b103f142ac53557ab421dc16ac4aafee6f53dc", + "url": "https://files.pythonhosted.org/packages/25/b5/f477e419b06e49f3bae446cbdc1fd71d2599be8b12b4d45c641c5a4495b1/charset_normalizer-3.0.1-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl" + }, + { + "algorithm": "sha256", + "hash": "ab5de034a886f616a5668aa5d098af2b5385ed70142090e2a31bcbd0af0fdb3d", + "url": "https://files.pythonhosted.org/packages/31/06/f6330ee70c041a032ee1a5d32785d69748cfa41f64b6d327cc08cae51de9/charset_normalizer-3.0.1-cp39-cp39-musllinux_1_1_aarch64.whl" + }, + { + "algorithm": "sha256", + "hash": "f6f45710b4459401609ebebdbcfb34515da4fc2aa886f95107f556ac69a9147e", + "url": "https://files.pythonhosted.org/packages/31/af/67b7653a35dbd56f6bb9ff54652a551eae8420d1d0545f0042c5bdb15fb0/charset_normalizer-3.0.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl" + }, + { + "algorithm": "sha256", + "hash": "8b8af03d2e37866d023ad0ddea594edefc31e827fee64f8de5611a1dbc373174", + "url": "https://files.pythonhosted.org/packages/37/60/7a01f3a129d1af1f26ab2c56aae89a72dbf33fd46a467c1aa994ec62b90b/charset_normalizer-3.0.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl" + }, + { + "algorithm": "sha256", + "hash": "9cf4e8ad252f7c38dd1f676b46514f92dc0ebeb0db5552f5f403509705e24753", + "url": "https://files.pythonhosted.org/packages/56/5d/275fb120957dfe5a2262d04f28bc742fd4bcc2bd270d19bb8757e09737ef/charset_normalizer-3.0.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl" + }, + { + "algorithm": "sha256", + "hash": "11b53acf2411c3b09e6af37e4b9005cba376c872503c8f28218c7243582df45d", + "url": "https://files.pythonhosted.org/packages/5a/d8/9e76846e70e729de85ecc6af21edc584a2adfef202dc5f5ae00a02622e3d/charset_normalizer-3.0.1-cp37-cp37m-musllinux_1_1_x86_64.whl" + }, + { + "algorithm": "sha256", + "hash": "109487860ef6a328f3eec66f2bf78b0b72400280d8f8ea05f69c51644ba6521a", + "url": "https://files.pythonhosted.org/packages/5b/e7/5527effca09d873e07e128d3daac7c531203b5105cb4e2956c2b7a8cc41c/charset_normalizer-3.0.1-cp38-cp38-musllinux_1_1_aarch64.whl" + }, + { + "algorithm": "sha256", + "hash": "8499ca8f4502af841f68135133d8258f7b32a53a1d594aa98cc52013fff55678", + "url": "https://files.pythonhosted.org/packages/6a/ab/3a00ecbddabe25132c20c1bd45e6f90c537b5f7a0b5bcaba094c4922928c/charset_normalizer-3.0.1-cp39-cp39-macosx_10_9_x86_64.whl" + }, + { + "algorithm": "sha256", + "hash": "16a8663d6e281208d78806dbe14ee9903715361cf81f6d4309944e4d1e59ac5b", + "url": "https://files.pythonhosted.org/packages/71/67/79be03bf7ab4198d994c2e8da869ca354487bfa25656b95cf289cf6338a2/charset_normalizer-3.0.1-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl" + }, + { + "algorithm": "sha256", + "hash": "02a51034802cbf38db3f89c66fb5d2ec57e6fe7ef2f4a44d070a593c3688667b", + "url": "https://files.pythonhosted.org/packages/93/d1/569445a704414e150f198737c245ab96b40d28d5b68045a62c414a5157de/charset_normalizer-3.0.1-cp37-cp37m-musllinux_1_1_ppc64le.whl" + }, + { + "algorithm": "sha256", + "hash": "ebea339af930f8ca5d7a699b921106c6e29c617fe9606fa7baa043c1cdae326f", + "url": "https://files.pythonhosted.org/packages/96/d7/1675d9089a1f4677df5eb29c3f8b064aa1e70c1251a0a8a127803158942d/charset-normalizer-3.0.1.tar.gz" + }, + { + "algorithm": "sha256", + "hash": "3b590df687e3c5ee0deef9fc8c547d81986d9a1b56073d82de008744452d6541", + "url": "https://files.pythonhosted.org/packages/99/24/eb846dc9a797da58e6e5b3b5a71d3ff17264de3f424fb29aaa5d27173b55/charset_normalizer-3.0.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl" + }, + { + "algorithm": "sha256", + "hash": "4b0d02d7102dd0f997580b51edc4cebcf2ab6397a7edf89f1c73b586c614272c", + "url": "https://files.pythonhosted.org/packages/9c/42/c1ebc736c57459aab28bfb8aa28c6a047796f2ea46050a3b129b4920dbe4/charset_normalizer-3.0.1-cp38-cp38-macosx_10_9_x86_64.whl" }, { "algorithm": "sha256", - "hash": "5a3d016c7c547f69d6f81fb0db9449ce888b418b5b9952cc5e6e66843e9dd845", - "url": "https://files.pythonhosted.org/packages/a1/34/44964211e5410b051e4b8d2869c470ae8a68ae274953b1c7de6d98bbcf94/charset-normalizer-2.1.1.tar.gz" + "hash": "a16418ecf1329f71df119e8a65f3aa68004a3f9383821edcb20f0702934d8087", + "url": "https://files.pythonhosted.org/packages/a2/93/0b1aa4dbc0ae2aa2e1b2e6d037ab8984dc09912d6b26d63ced14da07e3a7/charset_normalizer-3.0.1-cp37-cp37m-musllinux_1_1_aarch64.whl" + }, + { + "algorithm": "sha256", + "hash": "358a7c4cb8ba9b46c453b1dd8d9e431452d5249072e4f56cfda3149f6ab1405e", + "url": "https://files.pythonhosted.org/packages/a2/a7/adc963ad8f8fddadd6be088e636972705ec9d1d92d1b45e6119eb02b7e9e/charset_normalizer-3.0.1-cp38-cp38-macosx_11_0_arm64.whl" + }, + { + "algorithm": "sha256", + "hash": "2e396d70bc4ef5325b72b593a72c8979999aa52fb8bcf03f701c1b03e1166918", + "url": "https://files.pythonhosted.org/packages/a3/09/a837b27b122e710dfad15b0b5df04cd0623c8d8d3382e4298f50798fb84a/charset_normalizer-3.0.1-cp37-cp37m-musllinux_1_1_s390x.whl" + }, + { + "algorithm": "sha256", + "hash": "f97e83fa6c25693c7a35de154681fcc257c1c41b38beb0304b9c4d2d9e164479", + "url": "https://files.pythonhosted.org/packages/aa/a4/2d6255d4db5d4558a92458fd8dacddfdda2fb4ad9c0a87db6f6034aded34/charset_normalizer-3.0.1-cp38-cp38-musllinux_1_1_ppc64le.whl" + }, + { + "algorithm": "sha256", + "hash": "00d3ffdaafe92a5dc603cb9bd5111aaa36dfa187c8285c543be562e61b755f6b", + "url": "https://files.pythonhosted.org/packages/b5/1a/932d86fde86bb0d2992c74552c9a422883fe0890132bbc9a5e2211f03318/charset_normalizer-3.0.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl" + }, + { + "algorithm": "sha256", + "hash": "a60332922359f920193b1d4826953c507a877b523b2395ad7bc716ddd386d866", + "url": "https://files.pythonhosted.org/packages/c1/b2/d81606aebeb7e9a33dc877ff3a206c9946f5bb374c99d22d4a28825aa270/charset_normalizer-3.0.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl" + }, + { + "algorithm": "sha256", + "hash": "9cb3032517f1627cc012dbc80a8ec976ae76d93ea2b5feaa9d2a5b8882597579", + "url": "https://files.pythonhosted.org/packages/c4/d4/94f1ea460cce04483d2460efba6fd4d66e6f60ad6fc6075dba13e3501e48/charset_normalizer-3.0.1-cp39-cp39-musllinux_1_1_i686.whl" + }, + { + "algorithm": "sha256", + "hash": "c22d3fe05ce11d3671297dc8973267daa0f938b93ec716e12e0f6dee81591dc1", + "url": "https://files.pythonhosted.org/packages/c8/a2/8f873138c99423de3b402daf8ccd7a538632c83d0c129444a6a18ef34e03/charset_normalizer-3.0.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl" + }, + { + "algorithm": "sha256", + "hash": "608862a7bf6957f2333fc54ab4399e405baad0163dc9f8d99cb236816db169d4", + "url": "https://files.pythonhosted.org/packages/c9/dd/80a5e8c080b7e1cc2b0ca35f0d6aeedafd7bbd06d25031ac20868b1366d6/charset_normalizer-3.0.1-cp39-cp39-musllinux_1_1_ppc64le.whl" + }, + { + "algorithm": "sha256", + "hash": "c2ac1b08635a8cd4e0cbeaf6f5e922085908d48eb05d44c5ae9eabab148512ca", + "url": "https://files.pythonhosted.org/packages/dc/ff/2c7655d83b1d6d6a0e132d50d54131fcb8da763b417ccc6c4a506aa0e08c/charset_normalizer-3.0.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl" + }, + { + "algorithm": "sha256", + "hash": "cadaeaba78750d58d3cc6ac4d1fd867da6fc73c88156b7a3212a3cd4819d679d", + "url": "https://files.pythonhosted.org/packages/df/2f/4806e155191f75e720aca98a969581c6b2676f0379dd315c34c388bbf8b5/charset_normalizer-3.0.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl" + }, + { + "algorithm": "sha256", + "hash": "3ae1de54a77dc0d6d5fcf623290af4266412a7c4be0b1ff7444394f03f5c54e3", + "url": "https://files.pythonhosted.org/packages/e3/96/8cdbce165c96cce5f2c9c7748f7ed8e0cf0c5d03e213bbc90b7c3e918bf5/charset_normalizer-3.0.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl" + }, + { + "algorithm": "sha256", + "hash": "37f8febc8ec50c14f3ec9637505f28e58d4f66752207ea177c1d67df25da5aed", + "url": "https://files.pythonhosted.org/packages/e8/80/141f6af05332cbb811ab469f64deb1e1d4cc9e8b0c003aa8a38d689ce84a/charset_normalizer-3.0.1-cp38-cp38-musllinux_1_1_i686.whl" + }, + { + "algorithm": "sha256", + "hash": "a152f5f33d64a6be73f1d30c9cc82dfc73cec6477ec268e7c6e4c7d23c2d2291", + "url": "https://files.pythonhosted.org/packages/f1/ff/9a1c65d8c44958f45ae40cd558ab63bd499a35198a2014e13c0887c07ed1/charset_normalizer-3.0.1-cp38-cp38-musllinux_1_1_s390x.whl" + }, + { + "algorithm": "sha256", + "hash": "3fc1c4a2ffd64890aebdb3f97e1278b0cc72579a08ca4de8cd2c04799a3a22be", + "url": "https://files.pythonhosted.org/packages/f5/84/cac681144a28114bd9e40d3cdbfd961c14ecc2b56f1baec2094afd6744c7/charset_normalizer-3.0.1-cp39-cp39-macosx_11_0_arm64.whl" + }, + { + "algorithm": "sha256", + "hash": "356541bf4381fa35856dafa6a965916e54bed415ad8a24ee6de6e37deccf2786", + "url": "https://files.pythonhosted.org/packages/f5/ec/a9bed59079bd0267d34ada58a4048c96a59b3621e7f586ea85840d41831d/charset_normalizer-3.0.1-cp39-cp39-musllinux_1_1_x86_64.whl" } ], "project_name": "charset-normalizer", - "requires_dists": [ - "unicodedata2; extra == \"unicode_backport\"" + "requires_dists": [], + "requires_python": null, + "version": "3.0.1" + }, + { + "artifacts": [ + { + "algorithm": "sha256", + "hash": "fbf996a709f8da2e745ef763f482ce2d311aa817d287593a5b990d6d6e4f0443", + "url": "https://files.pythonhosted.org/packages/52/93/342cc62a70ab727e093ed98e02a725d85b746345f05d2b5e5034649f4ec8/chevron-0.14.0-py3-none-any.whl" + }, + { + "algorithm": "sha256", + "hash": "87613aafdf6d77b6a90ff073165a61ae5086e21ad49057aa0e53681601800ebf", + "url": "https://files.pythonhosted.org/packages/15/1f/ca74b65b19798895d63a6e92874162f44233467c9e7c1ed8afd19016ebe9/chevron-0.14.0.tar.gz" + } ], - "requires_python": ">=3.6.0", - "version": "2.1.1" + "project_name": "chevron", + "requires_dists": [], + "requires_python": null, + "version": "0.14.0" }, { "artifacts": [ @@ -325,13 +522,13 @@ "artifacts": [ { "algorithm": "sha256", - "hash": "d84d17e21670ec07990e1044a99efe8d615d860fd176fc29ef5c306068fda313", - "url": "https://files.pythonhosted.org/packages/e1/16/1f59f5d87d256012e9cdf0e8af8810965fa253e835cfecce64f4b11d4f2d/importlib_metadata-5.1.0-py3-none-any.whl" + "hash": "7efb448ec9a5e313a57655d35aa54cd3e01b7e1fbcf72dce1bf06119420f5bad", + "url": "https://files.pythonhosted.org/packages/26/a7/9da7d5b23fc98ab3d424ac2c65613d63c1f401efb84ad50f2fa27b2caab4/importlib_metadata-6.0.0-py3-none-any.whl" }, { "algorithm": "sha256", - "hash": "d5059f9f1e8e41f80e9c56c2ee58811450c31984dfa625329ffd7c0dad88a73b", - "url": "https://files.pythonhosted.org/packages/32/5a/e0d75c8010295ae6746f379f5324bc726076dfc426548bfa6f0763fce870/importlib_metadata-5.1.0.tar.gz" + "hash": "e354bedeb60efa6affdcc8ae121b73544a7aa74156d047311948f6d711cd378d", + "url": "https://files.pythonhosted.org/packages/90/07/6397ad02d31bddf1841c9ad3ec30a693a3ff208e09c2ef45c9a8a5f85156/importlib_metadata-6.0.0.tar.gz" } ], "project_name": "importlib-metadata", @@ -354,12 +551,13 @@ "pytest-perf>=0.9.2; extra == \"testing\"", "pytest>=6; extra == \"testing\"", "rst.linker>=1.9; extra == \"docs\"", + "sphinx-lint; extra == \"docs\"", "sphinx>=3.5; extra == \"docs\"", "typing-extensions>=3.6.4; python_version < \"3.8\"", "zipp>=0.5" ], "requires_python": ">=3.7", - "version": "5.1" + "version": "6.0.0" }, { "artifacts": [ @@ -395,19 +593,19 @@ "artifacts": [ { "algorithm": "sha256", - "hash": "011e24c64b7f47f6ebd835bb12a743f2fbe9a26d4cecaa7f53bc4f35ee9da8b3", - "url": "https://files.pythonhosted.org/packages/9b/dd/b3c12c6d707058fa947864b67f0c4e0c39ef8610988d7baea9578f3c48f3/iniconfig-1.1.1-py2.py3-none-any.whl" + "hash": "b6a85871a79d2e3b22d2d1b94ac2824226a63c6b741c88f7ae975f18b6778374", + "url": "https://files.pythonhosted.org/packages/ef/a6/62565a6e1cf69e10f5727360368e451d4b7f58beeac6173dc9db836a5b46/iniconfig-2.0.0-py3-none-any.whl" }, { "algorithm": "sha256", - "hash": "bc3af051d7d14b2ee5ef9969666def0cd1a000e121eaea580d4a313df4b37f32", - "url": "https://files.pythonhosted.org/packages/23/a2/97899f6bd0e873fed3a7e67ae8d3a08b21799430fb4da15cfedf10d6e2c2/iniconfig-1.1.1.tar.gz" + "hash": "2d91e135bf72d31a410b17c16da610a82cb55f6b0477d1a902134b24a455b8b3", + "url": "https://files.pythonhosted.org/packages/d7/4b/cbd8e699e64a6f16ca3a8220661b5f83792b3017d0f79807cb8708d33913/iniconfig-2.0.0.tar.gz" } ], "project_name": "iniconfig", "requires_dists": [], - "requires_python": null, - "version": "1.1.1" + "requires_python": ">=3.7", + "version": "2.0.0" }, { "artifacts": [ @@ -433,65 +631,51 @@ "artifacts": [ { "algorithm": "sha256", - "hash": "262664d5bfe69d0354cc6f2cf6c34f9dfc662567c2a6b0bac68a521a0c229997", - "url": "https://files.pythonhosted.org/packages/71/bc/6662a9cc8cff3e2d4a116d33859c98c3295f45e93189096ca84b6f554a45/pantsbuild.pants-2.14.0-cp39-cp39-manylinux2014_x86_64.whl" - }, - { - "algorithm": "sha256", - "hash": "33e4816ccef54f48a33259df641bd5e2762779e17fe22eea5a4398a7c6bdd56e", - "url": "https://files.pythonhosted.org/packages/4e/fe/f46438d974b4d19b32728f3823f63ae05397ee7da064d9c2284272f351bc/pantsbuild.pants-2.14.0-cp38-cp38-manylinux2014_x86_64.whl" - }, - { - "algorithm": "sha256", - "hash": "92ece81be9078b2a0aa63579d1ea4c758ba182c5165e3aac5e98962c5e5da1bb", - "url": "https://files.pythonhosted.org/packages/65/4b/959230b5a72b177c1ef2c9dc6bdb7214fb429b39d694c7c85363bde4814f/pantsbuild.pants-2.14.0-cp37-cp37m-manylinux2014_x86_64.whl" - }, - { - "algorithm": "sha256", - "hash": "adccc2752051dfb5379b5171aa695d74042896503c8df8f482066041c30ddfb2", - "url": "https://files.pythonhosted.org/packages/68/48/b8df6c443d06187663b27d4e88c8ef8b1ba2916e225c78ab1b4b032c7072/pantsbuild.pants-2.14.0-cp39-cp39-macosx_10_16_x86_64.whl" + "hash": "f1b2c0710f747d0188c57596b0a3a57019f28d75a5c626f1b79a0830567ad2a2", + "url": "https://files.pythonhosted.org/packages/0c/04/ddba920ad27fd039e3af81190a149ae7a26b86bdb0f7d8242347954963df/pantsbuild.pants-2.15.0-cp39-cp39-manylinux2014_x86_64.whl" }, { "algorithm": "sha256", - "hash": "f02918c668209d213b263441e79160379b4b302ace565af8a8429332543d993f", - "url": "https://files.pythonhosted.org/packages/68/71/50d1567ce077b3dc8acf0d9a11e8878ece1d031f3bd432412da558381cd7/pantsbuild.pants-2.14.0-cp38-cp38-macosx_11_0_x86_64.whl" + "hash": "78568752d0105e9871300023c901a2c2ef252fadb2e08c2a5371d3a461200f1a", + "url": "https://files.pythonhosted.org/packages/28/52/5bd6112335602c44b39a4fef4d66227b165297ceab401e26d91eb6a9915e/pantsbuild.pants-2.15.0-cp37-cp37m-manylinux2014_x86_64.whl" }, { "algorithm": "sha256", - "hash": "1ec1498724ef90ff74609b1ae79b408542dedeb52a44edf937bff1fb44e8adec", - "url": "https://files.pythonhosted.org/packages/80/f9/f485c7a71d2adc937620c0d61fc4818da5ac92b968f6ea5dbffe280f29b7/pantsbuild.pants-2.14.0-cp39-cp39-macosx_11_0_arm64.whl" + "hash": "79de2888e61215f70ad6c990522c62507fbdbb425975ce37938e7637379168bc", + "url": "https://files.pythonhosted.org/packages/38/ca/8501babe1afe2bb3be5fe1b59ca32feb619dd06cf4016b56b54e3a061cb9/pantsbuild.pants-2.15.0-cp38-cp38-manylinux2014_x86_64.whl" }, { "algorithm": "sha256", - "hash": "947b90ed5f256df719f7ef296e9514fbe78eb841b96ee20e58894e719d44e32f", - "url": "https://files.pythonhosted.org/packages/92/6c/bd8b17ff1df4931ea0358c2475307f22259461df8f96a92db85ab8809c9c/pantsbuild.pants-2.14.0-cp37-cp37m-macosx_10_16_x86_64.whl" + "hash": "e360dc85e75771b06a329bf2b792a0e43c57c8d19c9f4dc1f95ecf60f2c22681", + "url": "https://files.pythonhosted.org/packages/a7/bd/020178714348a6535ff06f00752a6297a393f3b863572b56a6cb75a6e452/pantsbuild.pants-2.15.0-cp37-cp37m-macosx_10_15_x86_64.whl" }, { "algorithm": "sha256", - "hash": "87ee4f7b90434e491727b5ac53838627450addebfdbf89e8a1d5adb328ec78fb", - "url": "https://files.pythonhosted.org/packages/9b/e9/c00b331432f789bfb8c10b5489f19245edaf8ba9c5140cc5584530fded5c/pantsbuild.pants-2.14.0-cp39-cp39-macosx_10_15_x86_64.whl" + "hash": "5b0e83308297948f19173bf507e796d89e57649445cdb9b36002353c5e13c9c1", + "url": "https://files.pythonhosted.org/packages/b4/82/89d32a12eed118ed7003e892c6295a35449d94deb02b72afbc0b22a8107e/pantsbuild.pants-2.15.0-cp39-cp39-macosx_11_0_arm64.whl" }, { "algorithm": "sha256", - "hash": "5300a1c3c2c363c1c8cdb2a82f283024a96f3a421c913fa1e60d41e1bdb93cdb", - "url": "https://files.pythonhosted.org/packages/b6/f0/c3bb663441bf2dc30846690396a858c021a1fb02a4fa4c85af0f66cc041e/pantsbuild.pants-2.14.0-cp37-cp37m-macosx_10_15_x86_64.whl" + "hash": "c0d5e2afc5093e01cd54a7a6c2844aa7ec8cacbff013ff92d837568113113590", + "url": "https://files.pythonhosted.org/packages/f4/48/be06b39e592cae9b3a9cf683d4d30a23ab408c3b823e8554462539bf31e8/pantsbuild.pants-2.15.0-cp39-cp39-macosx_10_15_x86_64.whl" }, { "algorithm": "sha256", - "hash": "f3e9faf4e9ffeed3cf5b3e34e7c3f0cf514b6dd173c4e7fcf7dd5c9852eed468", - "url": "https://files.pythonhosted.org/packages/db/2d/3319dc26b7d372bbc3ddd096222613b36ba7fc428c4ba14ee012c0e700b9/pantsbuild.pants-2.14.0-cp38-cp38-macosx_10_15_x86_64.whl" + "hash": "127ab727c6a5254b023fb4ce4abacadfee71fd15680ca063607e58987b9b30cf", + "url": "https://files.pythonhosted.org/packages/f9/e9/11ebc51d7fa429c1f92392548dc71c3e62c1bce57763291a9521e96ff9b7/pantsbuild.pants-2.15.0-cp38-cp38-macosx_10_15_x86_64.whl" } ], "project_name": "pantsbuild-pants", "requires_dists": [ "PyYAML<7.0,>=6.0", "ansicolors==1.1.8", + "chevron==0.14.0", "fasteners==0.16.3", "humbug==0.2.7", "ijson==3.1.4", "importlib-resources==5.0.*", "packaging==21.3", - "pex==2.1.108", + "pex==2.1.111", "psutil==5.9.0", "python-lsp-jsonrpc==1.0.0", "setproctitle==1.2.2", @@ -503,35 +687,35 @@ "typing-extensions==4.3.0" ], "requires_python": "<3.10,>=3.7", - "version": "2.14" + "version": "2.15.0" }, { "artifacts": [ { "algorithm": "sha256", - "hash": "38062e52da1cc4d0ea81dc9de7e8385d27e915ffcc8465643be6810031ec38ac", - "url": "https://files.pythonhosted.org/packages/d8/d7/91a94e60402052eda39e2781ca2fb598fb5fb23a1b49a0d7153a98514a06/pantsbuild.pants.testutil-2.14.0-py3-none-any.whl" + "hash": "1502b9261668d4772cfff0bf7956c4400edf8feb9025fc5e024f19d4b84edab0", + "url": "https://files.pythonhosted.org/packages/1c/d4/49be72adb6aea5464a28767d5e3b726057b2a8e5d20388210f1cd052eddd/pantsbuild.pants.testutil-2.15.0-py3-none-any.whl" } ], "project_name": "pantsbuild-pants-testutil", "requires_dists": [ - "pantsbuild.pants==2.14.0", + "pantsbuild.pants==2.15.0", "pytest<7.1.0,>=6.2.4" ], "requires_python": "<3.10,>=3.7", - "version": "2.14" + "version": "2.15.0" }, { "artifacts": [ { "algorithm": "sha256", - "hash": "3f12edb36525daca66ac4e0e1a3bcaa76c119217bca1bac7c1b01e9a62641f25", - "url": "https://files.pythonhosted.org/packages/95/70/be0d481a60c87f16ca6cc29339ef79e88f5e4027b07c87660cbb9d873d56/pex-2.1.108-py2.py3-none-any.whl" + "hash": "3ac1ae69dfca900b41853f80d3ab0530bdb40e578a8274245fa0bf4a4a748316", + "url": "https://files.pythonhosted.org/packages/5d/08/89438cc626ec77a6f7dc3ab17cad581d14882a2f51a37d24c8a4c127e7bc/pex-2.1.111-py2.py3-none-any.whl" }, { "algorithm": "sha256", - "hash": "ec1263f39d24d61881ca4232db9972b74f67899393a7bb316efa3933cf59574f", - "url": "https://files.pythonhosted.org/packages/ee/cb/f483c30024d6bac3f7f46791a9eb92cbf70c8ba46848edaf72a7bba7cedc/pex-2.1.108.tar.gz" + "hash": "0bb8a122dc3db515f369a0f7581653d879e27e7652ffffe900e0e6c66a7fb15c", + "url": "https://files.pythonhosted.org/packages/1e/f2/7e05a54dd2655608e6ccadba75f79e9531cfefeb57ba06a4a250ee6fb736/pex-2.1.111.tar.gz" } ], "project_name": "pex", @@ -539,7 +723,7 @@ "subprocess32>=3.2.7; extra == \"subprocess\" and python_version < \"3\"" ], "requires_python": "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,<3.12,>=2.7", - "version": "2.1.108" + "version": "2.1.111" }, { "artifacts": [ @@ -563,7 +747,7 @@ "tox; extra == \"dev\"" ], "requires_python": ">=3.6", - "version": "1" + "version": "1.0.0" }, { "artifacts": [ @@ -628,7 +812,7 @@ "wmi; sys_platform == \"win32\" and extra == \"test\"" ], "requires_python": "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,>=2.6", - "version": "5.9" + "version": "5.9.0" }, { "artifacts": [ @@ -646,7 +830,7 @@ "project_name": "py", "requires_dists": [], "requires_python": "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,>=2.7", - "version": "1.11" + "version": "1.11.0" }, { "artifacts": [ @@ -728,7 +912,7 @@ "ujson>=3.0.0" ], "requires_python": null, - "version": "1" + "version": "1.0.0" }, { "artifacts": [ @@ -806,19 +990,19 @@ "project_name": "pyyaml", "requires_dists": [], "requires_python": ">=3.6", - "version": "6" + "version": "6.0" }, { "artifacts": [ { "algorithm": "sha256", - "hash": "8fefa2a1a1365bf5520aac41836fbee479da67864514bdb821f31ce07ce65349", - "url": "https://files.pythonhosted.org/packages/ca/91/6d9b8ccacd0412c08820f72cebaa4f0c0441b5cda699c90f618b6f8a1b42/requests-2.28.1-py3-none-any.whl" + "hash": "64299f4909223da747622c030b781c0d7811e359c37124b4bd368fb8c6518baa", + "url": "https://files.pythonhosted.org/packages/d2/f4/274d1dbe96b41cf4e0efb70cbced278ffd61b5c7bb70338b62af94ccb25b/requests-2.28.2-py3-none-any.whl" }, { "algorithm": "sha256", - "hash": "7c5599b102feddaa661c826c56ab4fee28bfd17f5abca1ebbe3e7f19d7c97983", - "url": "https://files.pythonhosted.org/packages/a5/61/a867851fd5ab77277495a8709ddda0861b28163c4613b011bc00228cc724/requests-2.28.1.tar.gz" + "hash": "98b1b2782e3c6c4904938b84c0eb932721069dfdb9134313beff7c83c2df24bf", + "url": "https://files.pythonhosted.org/packages/9d/ee/391076f5937f0a8cdf5e53b701ffc91753e87b07d66bae4a09aa671897bf/requests-2.28.2.tar.gz" } ], "project_name": "requests", @@ -826,12 +1010,12 @@ "PySocks!=1.5.7,>=1.5.6; extra == \"socks\"", "certifi>=2017.4.17", "chardet<6,>=3.0.2; extra == \"use_chardet_on_py3\"", - "charset-normalizer<3,>=2", + "charset-normalizer<4,>=2", "idna<4,>=2.5", "urllib3<1.27,>=1.21.1" ], "requires_python": "<4,>=3.7", - "version": "2.28.1" + "version": "2.28.2" }, { "artifacts": [ @@ -972,7 +1156,7 @@ "project_name": "six", "requires_dists": [], "requires_python": "!=3.0.*,!=3.1.*,!=3.2.*,>=2.7", - "version": "1.16" + "version": "1.16.0" }, { "artifacts": [ @@ -1080,207 +1264,207 @@ "project_name": "typing-extensions", "requires_dists": [], "requires_python": ">=3.7", - "version": "4.3" + "version": "4.3.0" }, { "artifacts": [ { "algorithm": "sha256", - "hash": "bca074d08f0677f05df8170b25ce6e61db3bcdfda78062444972fa6508dc825f", - "url": "https://files.pythonhosted.org/packages/bd/a5/81e34d1e05a8d2fc4002c7913bc336be491c14ed67c10f1039ce470874a3/ujson-5.6.0-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl" + "hash": "ea7423d8a2f9e160c5e011119741682414c5b8dce4ae56590a966316a07a4618", + "url": "https://files.pythonhosted.org/packages/b0/9b/7ae752c8f1e2e7bf261c4d5ded14a7e8dd6878350d130c78a74a833f37ac/ujson-5.7.0-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl" }, { "algorithm": "sha256", - "hash": "3f00dff3bf26bbb96791ceaf51ca95a3f34e2a21985748da855a650c38633b99", - "url": "https://files.pythonhosted.org/packages/01/7c/2959cbc544f63eb19473d188d86174a6f39c8f751168ea0a43cdd01978f3/ujson-5.6.0-cp39-cp39-macosx_10_9_x86_64.whl" + "hash": "581c945b811a3d67c27566539bfcb9705ea09cb27c4be0002f7a553c8886b817", + "url": "https://files.pythonhosted.org/packages/00/8c/ef2884d41cdeb0324c69be5acf4367282e34c0c80b7c255ac6955203b4a8/ujson-5.7.0-pp39-pypy39_pp73-macosx_10_9_x86_64.whl" }, { "algorithm": "sha256", - "hash": "a51cbe614acb5ea8e2006e4fd80b4e8ea7c51ae51e42c75290012f4925a9d6ab", - "url": "https://files.pythonhosted.org/packages/0b/db/72ab79518ecc94f23a5a47a2001b6e4e6794f01853428d4ca6a7aeaa8152/ujson-5.6.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl" + "hash": "75204a1dd7ec6158c8db85a2f14a68d2143503f4bafb9a00b63fe09d35762a5e", + "url": "https://files.pythonhosted.org/packages/02/5f/bef7d57cd7dba6c3124ce2c42c215e2194f51835c2e9176e2833ea04e15c/ujson-5.7.0-cp38-cp38-macosx_10_9_x86_64.whl" }, { "algorithm": "sha256", - "hash": "fadebaddd3eb71a5c986f0bdc7bb28b072bfc585c141eef37474fc66d1830b0a", - "url": "https://files.pythonhosted.org/packages/12/db/6b0e9fe9103aa476932ddf68d662318c34f5088d752c0240bb2fb67c87ba/ujson-5.6.0-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl" + "hash": "a5d2f44331cf04689eafac7a6596c71d6657967c07ac700b0ae1c921178645da", + "url": "https://files.pythonhosted.org/packages/08/47/41f40896aad1a098b4fea2e0bfe66a3fed8305d2457945f7082b7f493307/ujson-5.7.0-cp37-cp37m-musllinux_1_1_i686.whl" }, { "algorithm": "sha256", - "hash": "31288f85db6295ec63e128daff7285bb0bc220935e1b5107bd2d67e2dc687b7e", - "url": "https://files.pythonhosted.org/packages/1b/a7/e77e3500243290f00ea639fdd7509cab1189f6daa2d859107a5285af9113/ujson-5.6.0-cp38-cp38-musllinux_1_1_aarch64.whl" + "hash": "b01a9af52a0d5c46b2c68e3f258fdef2eacaa0ce6ae3e9eb97983f5b1166edb6", + "url": "https://files.pythonhosted.org/packages/18/19/2754b8d50affbf4456f31af5a75a1904d40499e89facdb742496b0a9c8c7/ujson-5.7.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl" }, { "algorithm": "sha256", - "hash": "2cb7a4bd91de97b4c8e57fb5289d1e5f3f019723b59d01d79e2df83783dce5a6", - "url": "https://files.pythonhosted.org/packages/2e/8b/6c23eface0e59fe76e2c80be3c9033c39d7ab937d2bb6e07e995ef44589c/ujson-5.6.0-pp37-pypy37_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl" + "hash": "800bf998e78dae655008dd10b22ca8dc93bdcfcc82f620d754a411592da4bbf2", + "url": "https://files.pythonhosted.org/packages/21/0b/9fd1a3dc94175d8cf141c3356776346e1b5fca10571441fc370fbf560e1c/ujson-5.7.0-cp39-cp39-musllinux_1_1_i686.whl" }, { "algorithm": "sha256", - "hash": "7174e81c137d480abe2f8036e9fb69157e509f2db0bfdee4488eb61dc3f0ff6b", - "url": "https://files.pythonhosted.org/packages/41/2b/9c5987375b2893b727af95249106e1869b7163712c2669cff6694cc6b113/ujson-5.6.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl" + "hash": "e87cec407ec004cf1b04c0ed7219a68c12860123dfb8902ef880d3d87a71c172", + "url": "https://files.pythonhosted.org/packages/22/27/81b6b0537fbc6ff0baaeb175738ee7464d643ad5ff30105e03a9e744682d/ujson-5.7.0-pp37-pypy37_pp73-macosx_10_9_x86_64.whl" }, { "algorithm": "sha256", - "hash": "f881e2d8a022e9285aa2eab6ba8674358dbcb2b57fa68618d88d62937ac3ff04", - "url": "https://files.pythonhosted.org/packages/45/48/466d672c53fcb93d64a2817e3a0306214103e3baba109821c88e1150c100/ujson-5.6.0.tar.gz" + "hash": "bab10165db6a7994e67001733f7f2caf3400b3e11538409d8756bc9b1c64f7e8", + "url": "https://files.pythonhosted.org/packages/2c/fe/855ee750936e9d065e6e49f7340571bd2db756fbcaf338c00456d39dd217/ujson-5.7.0-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl" }, { "algorithm": "sha256", - "hash": "d6f4be832d97836d62ac0c148026ec021f9f36481f38e455b51538fcd949ed2a", - "url": "https://files.pythonhosted.org/packages/46/71/ba0c0fc48b00b58f83fcec87a03422b6e900320c63cc5f6452e2645ebf18/ujson-5.6.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl" + "hash": "c0d1f7c3908357ee100aa64c4d1cf91edf99c40ac0069422a4fd5fd23b263263", + "url": "https://files.pythonhosted.org/packages/2e/4a/e802a5f22e0fffdeaceb3d139c79ab7995f118c2fadb8cdb129a7fd83c8d/ujson-5.7.0-cp37-cp37m-musllinux_1_1_aarch64.whl" }, { "algorithm": "sha256", - "hash": "57904e5b49ffe93189349229dcd83f73862ef9bb8517e8f1e62d0ff73f313847", - "url": "https://files.pythonhosted.org/packages/4e/09/61b38e03aa68a5905440bbd323d0e5505e3c9e081b94d0b9f37e3898394d/ujson-5.6.0-cp38-cp38-macosx_11_0_arm64.whl" + "hash": "341f891d45dd3814d31764626c55d7ab3fd21af61fbc99d070e9c10c1190680b", + "url": "https://files.pythonhosted.org/packages/30/c3/adb327b07e554f9c14f05df79bbad914532054f31303bb0716744354fe51/ujson-5.7.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl" }, { "algorithm": "sha256", - "hash": "b64d2ac99503a9a5846157631addacc9f74e23f64d5a886fe910e9662660fa10", - "url": "https://files.pythonhosted.org/packages/51/68/b6d3bc74f087a656734db96105e64e0c539dc6aa29f00e0d20e0c4186475/ujson-5.6.0-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl" + "hash": "4a3d794afbf134df3056a813e5c8a935208cddeae975bd4bc0ef7e89c52f0ce0", + "url": "https://files.pythonhosted.org/packages/34/ad/98c4bd2cfe2d04330bc7d6b7e3dee5b52b7358430b1cf4973ca25b7413c3/ujson-5.7.0-cp39-cp39-musllinux_1_1_aarch64.whl" }, { "algorithm": "sha256", - "hash": "f2d70b7f0b485f85141bbc518d0581ae96b912d9f8b070eaf68a9beef8eb1e60", - "url": "https://files.pythonhosted.org/packages/57/ae/a8b0329f43a1d1985ad9c63e6b92590557ba175f174209626cde5d396297/ujson-5.6.0-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl" + "hash": "18679484e3bf9926342b1c43a3bd640f93a9eeeba19ef3d21993af7b0c44785d", + "url": "https://files.pythonhosted.org/packages/37/34/017f0904417617d2af2a30021f0b494535e63cb4a343dc32b05d9f0e96dd/ujson-5.7.0-cp37-cp37m-macosx_10_9_x86_64.whl" }, { "algorithm": "sha256", - "hash": "20d929a27822cb79e034cc5e0bb62daa0257ab197247cb6f35d5149f2f438983", - "url": "https://files.pythonhosted.org/packages/5b/ce/f75c40db348d924971455f41f6d3f5bee8174cc6fab7b8d13c11e90b83fc/ujson-5.6.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl" + "hash": "64772a53f3c4b6122ed930ae145184ebaed38534c60f3d859d8c3f00911eb122", + "url": "https://files.pythonhosted.org/packages/3b/bd/a7ad5d56a4a9491487bd658cda12c2a7a0d5a41c9943086471e6cfa73854/ujson-5.7.0-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl" }, { "algorithm": "sha256", - "hash": "b2aece7a92dffc9c78787f5f36e47e24b95495812270c27abc2fa430435a931d", - "url": "https://files.pythonhosted.org/packages/62/50/3ab102908a6a6e1884cd66d493c6d03660a8fa36ab8ec94002f676b63677/ujson-5.6.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl" + "hash": "e788e5d5dcae8f6118ac9b45d0b891a0d55f7ac480eddcb7f07263f2bcf37b23", + "url": "https://files.pythonhosted.org/packages/43/1a/b0a027144aa5c8f4ea654f4afdd634578b450807bb70b9f8bad00d6f6d3c/ujson-5.7.0.tar.gz" }, { "algorithm": "sha256", - "hash": "9cf04fcc958bb52a6b6c301b780cb9afab3ec68713b17ca5aa423e1f99c2c1cf", - "url": "https://files.pythonhosted.org/packages/70/e8/8320614d0c2d944dc37b674c23aadaf4dc380e5ac0f8641c3f785d974ec2/ujson-5.6.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl" + "hash": "7312731c7826e6c99cdd3ac503cd9acd300598e7a80bcf41f604fee5f49f566c", + "url": "https://files.pythonhosted.org/packages/47/f8/8e5668e80f7389281954e283222bfaf7f3936809ecf9b9293b9d8b4b40e2/ujson-5.7.0-cp38-cp38-macosx_11_0_arm64.whl" }, { "algorithm": "sha256", - "hash": "1a7e4023c79d9a053c0c6b7c6ec50ea0af78381539ab27412e6af8d9410ae555", - "url": "https://files.pythonhosted.org/packages/79/3c/e39091753ba6896730b20a4260d67c5a3fb10fb7785e8cd795e7525d2f8a/ujson-5.6.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl" + "hash": "adf445a49d9a97a5a4c9bb1d652a1528de09dd1c48b29f79f3d66cea9f826bf6", + "url": "https://files.pythonhosted.org/packages/4d/f2/035e82d3baacc9c225ca3bae95bed5963bcdd796dd66ffa3fd0a5a087da7/ujson-5.7.0-pp38-pypy38_pp73-macosx_10_9_x86_64.whl" }, { "algorithm": "sha256", - "hash": "c4277f6b1d24be30b7f87ec5346a87693cbc1e55bbc5877f573381b2250c4dd6", - "url": "https://files.pythonhosted.org/packages/82/b0/d77702c0842c7f9d4fbb7b9fb7c4680984da0c45624e5871809f8ef49f0c/ujson-5.6.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl" + "hash": "3d3b3499c55911f70d4e074c626acdb79a56f54262c3c83325ffb210fb03e44d", + "url": "https://files.pythonhosted.org/packages/50/bf/1893d4f5dc6a2acb9a6db7ff018aa1cb7df367c35d491ebef6e30cdcc8ce/ujson-5.7.0-cp39-cp39-macosx_11_0_arm64.whl" }, { "algorithm": "sha256", - "hash": "0f0f21157d1a84ad5fb54388f31767cde9c1a48fb29de7ef91d8887fdc2ca92b", - "url": "https://files.pythonhosted.org/packages/82/ba/cae7021ae569909302ffb6c8b0f18e857c56a01f6b498dfd0edbee55b680/ujson-5.6.0-cp37-cp37m-musllinux_1_1_i686.whl" + "hash": "c3af9f9f22a67a8c9466a32115d9073c72a33ae627b11de6f592df0ee09b98b6", + "url": "https://files.pythonhosted.org/packages/59/9e/447bce1a6f29ff1bfd726ea5aa9b934bc02fef9f2b41689a00e17538f436/ujson-5.7.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl" }, { "algorithm": "sha256", - "hash": "9f4efcac06f45183b6ed8e2321554739a964a02d8aa3089ec343253d86bf2804", - "url": "https://files.pythonhosted.org/packages/90/c5/5c121516eb53637e04ba945910b6cc71005e09c41d090d6575683a209880/ujson-5.6.0-pp38-pypy38_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl" + "hash": "b5ac3d5c5825e30b438ea92845380e812a476d6c2a1872b76026f2e9d8060fc2", + "url": "https://files.pythonhosted.org/packages/5a/b1/7edca18e74a218d39fd8d00efc489cfd07c94271959103c647b794ce7bd5/ujson-5.7.0-cp39-cp39-musllinux_1_1_x86_64.whl" }, { "algorithm": "sha256", - "hash": "2a24b9a96364f943a4754fa00b47855d0a01b84ac4b8b11ebf058c8fb68c1f77", - "url": "https://files.pythonhosted.org/packages/92/a9/77b6cb4e1189d700a696a18442ede63547045e5bcd0fd74b7884f7c401c3/ujson-5.6.0-pp38-pypy38_pp73-macosx_10_9_x86_64.whl" + "hash": "b7316d3edeba8a403686cdcad4af737b8415493101e7462a70ff73dd0609eafc", + "url": "https://files.pythonhosted.org/packages/61/dd/38fc61ee050bd7cd24126721fae6cd7044b34cd8821e9d12a02c04757b7d/ujson-5.7.0-cp38-cp38-musllinux_1_1_aarch64.whl" }, { "algorithm": "sha256", - "hash": "52f536712d16a1f4e0f9d084982c28e11b7e70c397a1059069e4d28d53b3f522", - "url": "https://files.pythonhosted.org/packages/93/fe/2f54f7658f78be1bde2c4837cc18618da59bb1ee866c9af72d827b11eb0f/ujson-5.6.0-cp38-cp38-musllinux_1_1_x86_64.whl" + "hash": "8b4257307e3662aa65e2644a277ca68783c5d51190ed9c49efebdd3cbfd5fa44", + "url": "https://files.pythonhosted.org/packages/65/89/398648bb869af5fce3d246ba61fb154528d5e71c24d6bcb008676d15fc2c/ujson-5.7.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl" }, { "algorithm": "sha256", - "hash": "5e5715b0e2767b1987ceed0066980fc0a53421dd2f197b4f88460d474d6aef4c", - "url": "https://files.pythonhosted.org/packages/9a/b5/7b5c89063558aabf65d625c552c85aee3aead2e99e2c2aede5045668bbc0/ujson-5.6.0-cp39-cp39-musllinux_1_1_x86_64.whl" + "hash": "2f242eec917bafdc3f73a1021617db85f9958df80f267db69c76d766058f7b19", + "url": "https://files.pythonhosted.org/packages/69/24/a7df580e9981c4f8a28eb96eb897ab7363b96fca7f8a398ddc735bf190ea/ujson-5.7.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl" }, { "algorithm": "sha256", - "hash": "355ef5311854936b9edc7f1ce638f8257cb45fb6b9873f6b2d16a715eafc9570", - "url": "https://files.pythonhosted.org/packages/a1/60/fe4d7a34b546108a61fe657b93acf7b736f6d1229d9b5f066d69bba1c718/ujson-5.6.0-pp39-pypy39_pp73-macosx_10_9_x86_64.whl" + "hash": "dda9aa4c33435147262cd2ea87c6b7a1ca83ba9b3933ff7df34e69fee9fced0c", + "url": "https://files.pythonhosted.org/packages/73/34/8821ac107019227a5ba3a544208cff444fee14bf779e08ec4e3706c91d00/ujson-5.7.0-cp38-cp38-musllinux_1_1_x86_64.whl" }, { "algorithm": "sha256", - "hash": "72fa6e850831280a46704032721c75155fd41b839ddadabb6068ab218c56a37a", - "url": "https://files.pythonhosted.org/packages/a5/ea/1ae253cb569e32c545a4ddc90853a90dfcd84d569e0e99da9ec881969836/ujson-5.6.0-cp38-cp38-macosx_10_9_x86_64.whl" + "hash": "4ee997799a23227e2319a3f8817ce0b058923dbd31904761b788dc8f53bd3e30", + "url": "https://files.pythonhosted.org/packages/75/82/b08227424871ac0cd739d142a7fd071d2934755dfcf8460e6e13d649f1b1/ujson-5.7.0-cp38-cp38-musllinux_1_1_i686.whl" }, { "algorithm": "sha256", - "hash": "82bf24ea72a73c7d77402a7adc954931243e7ec4241d5738ae74894b53944458", - "url": "https://files.pythonhosted.org/packages/b2/55/b0988fc80c5888c27da1e6b241f8f6e6ac261186020dca363ec1574512ed/ujson-5.6.0-cp37-cp37m-musllinux_1_1_x86_64.whl" + "hash": "7592f40175c723c032cdbe9fe5165b3b5903604f774ab0849363386e99e1f253", + "url": "https://files.pythonhosted.org/packages/76/23/86820eb933c7d626380881a2d88bf9e395771ce349e5261df1e6760d209c/ujson-5.7.0-pp37-pypy37_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl" }, { "algorithm": "sha256", - "hash": "d1b5e233e42f53bbbc6961caeb492986e9f3aeacd30be811467583203873bad2", - "url": "https://files.pythonhosted.org/packages/b7/2a/fd2f82d576e4dce44634be0a6b17f602eb24038bd840ba9ab9205227b2fb/ujson-5.6.0-cp39-cp39-macosx_11_0_arm64.whl" + "hash": "6411aea4c94a8e93c2baac096fbf697af35ba2b2ed410b8b360b3c0957a952d3", + "url": "https://files.pythonhosted.org/packages/85/4a/1db9cc0d4d78d4485a6527cf5ed2602729d87d8c35a4f11ec6890708ac75/ujson-5.7.0-cp39-cp39-macosx_10_9_x86_64.whl" }, { "algorithm": "sha256", - "hash": "bca3c06c3f10ce03fa80b1301dce53765815c2578a24bd141ce4e5769bb7b709", - "url": "https://files.pythonhosted.org/packages/c4/e4/39380b7ce5e137477c346d6688ec2885e1b93ddbdbe71ae5b3749ad3e0aa/ujson-5.6.0-cp39-cp39-musllinux_1_1_i686.whl" + "hash": "35209cb2c13fcb9d76d249286105b4897b75a5e7f0efb0c0f4b90f222ce48910", + "url": "https://files.pythonhosted.org/packages/95/fb/fcd8f947f773ea55f650d64acd15240592c5637b3bfea164b4cd83da84c1/ujson-5.7.0-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl" }, { "algorithm": "sha256", - "hash": "24d40e01accbf4f0ba5181c4db1bac83749fdc1a5413466da582529f2a096085", - "url": "https://files.pythonhosted.org/packages/cc/42/afb6ce3e587aa7e3eb09fafc3aeaecba00c3b4937d71acb11c0e0e5d8933/ujson-5.6.0-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl" + "hash": "00343501dbaa5172e78ef0e37f9ebd08040110e11c12420ff7c1f9f0332d939e", + "url": "https://files.pythonhosted.org/packages/aa/e5/7655459351a1ce26202bbe971a6e6959d366925babe716f3751e1de96920/ujson-5.7.0-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl" }, { "algorithm": "sha256", - "hash": "798116b88158f13ed687417526100ef353ba4692e0aef8afbc622bd4bf7e9057", - "url": "https://files.pythonhosted.org/packages/d8/5f/1c3a4af4f6598ecfb17dab1c1ba625f3d92bc7fdc030502ac1ce132c163d/ujson-5.6.0-pp37-pypy37_pp73-macosx_10_9_x86_64.whl" + "hash": "b6a6961fc48821d84b1198a09516e396d56551e910d489692126e90bf4887d29", + "url": "https://files.pythonhosted.org/packages/b4/50/5146b9464506718a9372e12d15f2cff330575ee7cf5faf3c51aa83d82e4a/ujson-5.7.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl" }, { "algorithm": "sha256", - "hash": "c169e12642f0edf1dde607fb264721b88787b55a6da5fb3824302a9cac6f9405", - "url": "https://files.pythonhosted.org/packages/db/af/058e34df5773a952c56354e03779d9768497c9ddaabb9a9b7a6903e71241/ujson-5.6.0-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl" + "hash": "d36a807a24c7d44f71686685ae6fbc8793d784bca1adf4c89f5f780b835b6243", + "url": "https://files.pythonhosted.org/packages/c1/39/a4e45a0b9f1be517d0236a52292adb21ffdf6531bd36310488ed1ee07071/ujson-5.7.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl" }, { "algorithm": "sha256", - "hash": "7a66c5a75b46545361271b4cf55560d9ad8bad794dd054a14b3fbb031407948e", - "url": "https://files.pythonhosted.org/packages/e1/fa/3d274e028c45e7a3be7d0f856e799f456feae91ec2b182687530c23e705a/ujson-5.6.0-cp37-cp37m-macosx_10_9_x86_64.whl" + "hash": "b738282e12a05f400b291966630a98d622da0938caa4bc93cf65adb5f4281c60", + "url": "https://files.pythonhosted.org/packages/d1/7d/ec4dace4c686be92845e3d593f01828465546c5b8254ca296324cbcda8f8/ujson-5.7.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl" }, { "algorithm": "sha256", - "hash": "f3e651f04b7510fae7d4706a4600cd43457f015df08702ece82a71339fc15c3d", - "url": "https://files.pythonhosted.org/packages/e4/8d/06909767400f9c51cae9d2a348cac0ad27c107106b0b08fb81b5003ff498/ujson-5.6.0-cp38-cp38-musllinux_1_1_i686.whl" + "hash": "7b9dc5a90e2149643df7f23634fe202fed5ebc787a2a1be95cf23632b4d90651", + "url": "https://files.pythonhosted.org/packages/da/bc/d8b84c6e1156a7cdc4b3269994aff52e90101ddbfc0a8dabebbd8f484f54/ujson-5.7.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl" }, { "algorithm": "sha256", - "hash": "61fdf24f7bddc402ce06b25e4bed7bf5ee4f03e23028a0a09116835c21d54888", - "url": "https://files.pythonhosted.org/packages/e5/ca/e9e3607c49a390eda2651d589a954660bb4b04a3e1ad065fd4d868cfc4d0/ujson-5.6.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl" + "hash": "90712dfc775b2c7a07d4d8e059dd58636bd6ff1776d79857776152e693bddea6", + "url": "https://files.pythonhosted.org/packages/ea/f8/e547383551149f23a9cb40a717d75d2a72c6df50416c68538c64b79cd5bb/ujson-5.7.0-pp38-pypy38_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl" }, { "algorithm": "sha256", - "hash": "3f8b9e8c0420ce3dcc193ab6dd5628840ba79ad1b76e1816ac7ca6752c6bf035", - "url": "https://files.pythonhosted.org/packages/e7/91/50487d6378a2c12d748b818e3a323d627b7139e19f9cf38f2adc5477437b/ujson-5.6.0-cp37-cp37m-musllinux_1_1_aarch64.whl" + "hash": "b522be14a28e6ac1cf818599aeff1004a28b42df4ed4d7bc819887b9dac915fc", + "url": "https://files.pythonhosted.org/packages/ef/f5/76dfa7e2e8135213ece8cd18478338bc9a3b4820152ecec5632dce598f66/ujson-5.7.0-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl" }, { "algorithm": "sha256", - "hash": "7bde16cb18b95a8f68cc48715e4652b394b4fee68cb3f9fee0fd7d26b29a53b6", - "url": "https://files.pythonhosted.org/packages/f4/cc/063ab52cfcfcc371f4e9dbd3570db3b7b4a53c122716129205c97104e602/ujson-5.6.0-cp39-cp39-musllinux_1_1_aarch64.whl" + "hash": "16b2254a77b310f118717715259a196662baa6b1f63b1a642d12ab1ff998c3d7", + "url": "https://files.pythonhosted.org/packages/f8/d1/369fceb26e8eb69f9f8792323d123351c187c7866a0457c3ffe90ee9793c/ujson-5.7.0-cp37-cp37m-musllinux_1_1_x86_64.whl" }, { "algorithm": "sha256", - "hash": "6d0a60c5f065737a81249c819475d001a86da9a41900d888287e34619c9b4851", - "url": "https://files.pythonhosted.org/packages/fc/5b/e5bbf41f0d17c24bd80c6ea25f18cf0a364523c8a87a861c6510e11b21fc/ujson-5.6.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl" + "hash": "0ee295761e1c6c30400641f0a20d381633d7622633cdf83a194f3c876a0e4b7e", + "url": "https://files.pythonhosted.org/packages/fa/d6/01756485dd9c42f12f9b74c6b4b3f3008917e091597390a970cc85486631/ujson-5.7.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl" } ], "project_name": "ujson", "requires_dists": [], "requires_python": ">=3.7", - "version": "5.6" + "version": "5.7.0" }, { "artifacts": [ { "algorithm": "sha256", - "hash": "47cc05d99aaa09c9e72ed5809b60e7ba354e64b59c9c173ac3018642d8bb41fc", - "url": "https://files.pythonhosted.org/packages/65/0c/cc6644eaa594585e5875f46f3c83ee8762b647b51fc5b0fb253a242df2dc/urllib3-1.26.13-py2.py3-none-any.whl" + "hash": "75edcdc2f7d85b137124a6c3c9fc3933cdeaa12ecb9a6a959f22797a0feca7e1", + "url": "https://files.pythonhosted.org/packages/fe/ca/466766e20b767ddb9b951202542310cba37ea5f2d792dae7589f1741af58/urllib3-1.26.14-py2.py3-none-any.whl" }, { "algorithm": "sha256", - "hash": "c083dd0dce68dbfbe1129d5271cb90f9447dea7d52097c6e0126120c521ddea8", - "url": "https://files.pythonhosted.org/packages/c2/51/32da03cf19d17d46cce5c731967bf58de9bd71db3a379932f53b094deda4/urllib3-1.26.13.tar.gz" + "hash": "076907bf8fd355cde77728471316625a4d2f7e713c125f51953bb5b3eecf4f72", + "url": "https://files.pythonhosted.org/packages/c5/52/fe421fb7364aa738b3506a2d99e4f3a56e079c0a798e9f4fa5e14c60922f/urllib3-1.26.14.tar.gz" } ], "project_name": "urllib3", @@ -1297,25 +1481,25 @@ "urllib3-secure-extra; extra == \"secure\"" ], "requires_python": "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,>=2.7", - "version": "1.26.13" + "version": "1.26.14" }, { "artifacts": [ { "algorithm": "sha256", - "hash": "83a28fcb75844b5c0cdaf5aa4003c2d728c77e05f5aeabe8e95e56727005fbaa", - "url": "https://files.pythonhosted.org/packages/d8/20/256eb3f3f437c575fb1a2efdce5e801a5ce3162ea8117da96c43e6ee97d8/zipp-3.11.0-py3-none-any.whl" + "hash": "48904fc76a60e542af151aded95726c1a5c34ed43ab4134b597665c86d7ad556", + "url": "https://files.pythonhosted.org/packages/5b/fa/c9e82bbe1af6266adf08afb563905eb87cab83fde00a0a08963510621047/zipp-3.15.0-py3-none-any.whl" }, { "algorithm": "sha256", - "hash": "a7a22e05929290a67401440b39690ae6563279bced5f314609d9d03798f56766", - "url": "https://files.pythonhosted.org/packages/8e/b3/8b16a007184714f71157b1a71bbe632c5d66dd43bc8152b3c799b13881e1/zipp-3.11.0.tar.gz" + "hash": "112929ad649da941c23de50f356a2b5570c954b65150642bccdd66bf194d224b", + "url": "https://files.pythonhosted.org/packages/00/27/f0ac6b846684cecce1ee93d32450c45ab607f65c2e0255f0092032d91f07/zipp-3.15.0.tar.gz" } ], "project_name": "zipp", "requires_dists": [ + "big-O; extra == \"testing\"", "flake8<5; extra == \"testing\"", - "func-timeout; extra == \"testing\"", "furo; extra == \"docs\"", "jaraco.functools; extra == \"testing\"", "jaraco.itertools; extra == \"testing\"", @@ -1330,22 +1514,23 @@ "pytest-mypy>=0.9.1; platform_python_implementation != \"PyPy\" and extra == \"testing\"", "pytest>=6; extra == \"testing\"", "rst.linker>=1.9; extra == \"docs\"", + "sphinx-lint; extra == \"docs\"", "sphinx>=3.5; extra == \"docs\"" ], "requires_python": ">=3.7", - "version": "3.11" + "version": "3.15.0" } ], "platform_tag": null } ], "path_mappings": {}, - "pex_version": "2.1.108", + "pex_version": "2.1.111", "pip_version": "20.3.4-patched", "prefer_older_binary": false, "requirements": [ - "pantsbuild.pants.testutil<2.15,>=2.14.0a0", - "pantsbuild.pants<2.15,>=2.14.0a0" + "pantsbuild.pants.testutil<2.16,>=2.15.0a0", + "pantsbuild.pants<2.16,>=2.15.0a0" ], "requires_python": [ "<3.10,>=3.7" From ea02b9df580c3203305af1bc9df04de7d17d8bc9 Mon Sep 17 00:00:00 2001 From: Jacob Floyd Date: Thu, 9 Feb 2023 22:44:01 -0600 Subject: [PATCH 6/7] update changelog entry --- CHANGELOG.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.rst b/CHANGELOG.rst index f0c96789af..db098b39e3 100644 --- a/CHANGELOG.rst +++ b/CHANGELOG.rst @@ -16,7 +16,7 @@ Added to pants' use of PEX lockfiles. This is not a user-facing addition. #5778 #5789 #5817 #5795 #5830 #5833 #5834 #5841 #5840 #5838 #5842 #5837 #5849 #5850 #5846 #5853 #5848 #5847 #5858 #5857 #5860 #5868 #5871 #5864 #5874 #5884 #5893 #5891 - #5890 #5898 #5901 #5906 + #5890 #5898 #5901 #5906 #5899 Contributed by @cognifloyd * Added a joint index to solve the problem of slow mongo queries for scheduled executions. #5805 From ca671a936b4b932451d06cf75bdd4a85fd486766 Mon Sep 17 00:00:00 2001 From: Jacob Floyd Date: Mon, 27 Feb 2023 11:37:54 -0600 Subject: [PATCH 7/7] clarify pants-plugins code comments based on PR feedback --- pants-plugins/api_spec/rules.py | 14 ++++---------- pants-plugins/sample_conf/rules.py | 7 ++----- pants-plugins/schemas/rules.py | 1 + 3 files changed, 7 insertions(+), 15 deletions(-) diff --git a/pants-plugins/api_spec/rules.py b/pants-plugins/api_spec/rules.py index b0f2aea445..f778cd3247 100644 --- a/pants-plugins/api_spec/rules.py +++ b/pants-plugins/api_spec/rules.py @@ -68,14 +68,11 @@ async def generate_api_spec_via_fmt( request: GenerateAPISpecViaFmtTargetsRequest.Batch, subsystem: GenerateApiSpec, ) -> FmtResult: - # There will only be one target+field_set, but we iterate - # to satisfy how fmt expects that there could be more than one. - # If there is more than one, they will all get the same contents. - config_files_get = Get(ConfigFiles, ConfigFilesRequest, subsystem.config_request()) - # actually generate it with an external script. + # We use a pex to actually generate the api spec with an external script. # Generation cannot be inlined here because it needs to import the st2 code. + # (the script location is defined on the GenerateApiSpec subsystem) pex_get = Get(VenvPex, PexFromTargetsRequest, subsystem.pex_request()) config_files, pex = await MultiGet(config_files_get, pex_get) @@ -122,10 +119,6 @@ async def validate_api_spec( request: ValidateAPISpecRequest.Batch, subsystem: ValidateApiSpec, ) -> LintResult: - # There will only be one target+field_set, but we iterate - # to satisfy how lint expects that there could be more than one. - # If there is more than one, they will all get the same contents. - source_files_get = Get( SourceFiles, SourceFilesRequest(field_set.source for field_set in request.elements), @@ -133,8 +126,9 @@ async def validate_api_spec( config_files_get = Get(ConfigFiles, ConfigFilesRequest, subsystem.config_request()) - # actually validate it with an external script. + # We use a pex to actually validate the api spec with an external script. # Validation cannot be inlined here because it needs to import the st2 code. + # (the script location is defined on the ValidateApiSpec subsystem) pex_get = Get(VenvPex, PexFromTargetsRequest, subsystem.pex_request()) source_files, config_files, pex = await MultiGet( diff --git a/pants-plugins/sample_conf/rules.py b/pants-plugins/sample_conf/rules.py index e50c6f0a16..97195943d5 100644 --- a/pants-plugins/sample_conf/rules.py +++ b/pants-plugins/sample_conf/rules.py @@ -58,12 +58,9 @@ async def generate_sample_conf_via_fmt( request: GenerateSampleConfViaFmtTargetsRequest.Batch, subsystem: ConfigGen, ) -> FmtResult: - # There will only be one target+field_set, but we iterate - # to satisfy how fmt expects that there could be more than one. - # If there is more than one, they will all get the same contents. - - # actually generate it with an external script. + # We use a pex to actually generate the sample conf with an external script. # Generation cannot be inlined here because it needs to import the st2 code. + # (the script location is defined on the ConfigGen subsystem) pex = await Get(VenvPex, PexFromTargetsRequest, subsystem.pex_request()) result = await Get( diff --git a/pants-plugins/schemas/rules.py b/pants-plugins/schemas/rules.py index c9d9622966..72daefadae 100644 --- a/pants-plugins/schemas/rules.py +++ b/pants-plugins/schemas/rules.py @@ -56,6 +56,7 @@ async def generate_schemas_via_fmt( ) -> FmtResult: # We use a pex to actually generate the schemas with an external script. # Generation cannot be inlined here because it needs to import the st2 code. + # (the script location is defined on the GenerateSchemas subsystem) pex = await Get(VenvPex, PexFromTargetsRequest, subsystem.pex_request()) # There will probably only be one target+field_set, and therefor only one directory