コード例 #1
0
async def run_buf_format(request: BufFormatRequest,
                         buf: BufSubsystem) -> FmtResult:
    if buf.skip_format:
        return FmtResult.skip(formatter_name=request.name)
    result = await Get(ProcessResult, BufFormatRequest, request)
    output_snapshot = await Get(Snapshot, Digest, result.output_digest)
    return FmtResult.create(request, result, output_snapshot)
コード例 #2
0
async def autoflake_fmt(request: AutoflakeRequest,
                        autoflake: Autoflake) -> FmtResult:
    if autoflake.skip:
        return FmtResult.skip(formatter_name=request.name)
    autoflake_pex = await Get(VenvPex, PexRequest, autoflake.to_pex_request())

    result = await Get(
        ProcessResult,
        VenvPexProcess(
            autoflake_pex,
            argv=(
                "--in-place",
                "--remove-all-unused-imports",
                *autoflake.args,
                *request.snapshot.files,
            ),
            input_digest=request.snapshot.digest,
            output_files=request.snapshot.files,
            description=
            f"Run Autoflake on {pluralize(len(request.field_sets), 'file')}.",
            level=LogLevel.DEBUG,
        ),
    )
    output_snapshot = await Get(Snapshot, Digest, result.output_digest)
    return FmtResult.create(request,
                            result,
                            output_snapshot,
                            strip_chroot_path=True)
コード例 #3
0
ファイル: rules.py プロジェクト: Thangiee/pants
async def isort_fmt(configs: IsortConfigurations, isort: Isort) -> FmtResult:
    if isort.options.skip:
        return FmtResult.noop()
    setup = await Get[Setup](SetupRequest(configs, check_only=False))
    result = await Get[ProcessResult](Process, setup.process)
    return FmtResult.from_process_result(result,
                                         original_digest=setup.original_digest)
コード例 #4
0
async def yapf_fmt(request: YapfRequest, yapf: Yapf) -> FmtResult:
    if yapf.skip:
        return FmtResult.skip(formatter_name=request.name)
    yapf_pex_get = Get(VenvPex, PexRequest, yapf.to_pex_request())
    config_files_get = Get(ConfigFiles, ConfigFilesRequest,
                           yapf.config_request(request.snapshot.dirs))
    yapf_pex, config_files = await MultiGet(yapf_pex_get, config_files_get)

    input_digest = await Get(
        Digest,
        MergeDigests((request.snapshot.digest, config_files.snapshot.digest)))

    result = await Get(
        ProcessResult,
        VenvPexProcess(
            yapf_pex,
            argv=(
                *yapf.args,
                "--in-place",
                *(("--style", yapf.config) if yapf.config else ()),
                *request.snapshot.files,
            ),
            input_digest=input_digest,
            output_files=request.snapshot.files,
            description=
            f"Run yapf on {pluralize(len(request.field_sets), 'file')}.",
            level=LogLevel.DEBUG,
        ),
    )
    output_snapshot = await Get(Snapshot, Digest, result.output_digest)
    return FmtResult.create(request, result, output_snapshot)
コード例 #5
0
async def docformatter_fmt(configs: DocformatterConfigurations,
                           docformatter: Docformatter) -> FmtResult:
    if docformatter.options.skip:
        return FmtResult.noop()
    setup = await Get[Setup](SetupRequest(configs, check_only=False))
    result = await Get[ProcessResult](Process, setup.process)
    return FmtResult.from_process_result(result)
コード例 #6
0
async def docformatter_fmt(request: DocformatterRequest, docformatter: Docformatter) -> FmtResult:
    if docformatter.options.skip:
        return FmtResult.noop()
    setup = await Get[Setup](SetupRequest(request, check_only=False))
    result = await Get[ProcessResult](Process, setup.process)
    return FmtResult.from_process_result(
        result, original_digest=setup.original_digest, formatter_name="Docformatter"
    )
コード例 #7
0
ファイル: rules.py プロジェクト: hephex/pants
async def shfmt_fmt(request: ShfmtRequest, shfmt: Shfmt) -> FmtResult:
    if shfmt.skip:
        return FmtResult.skip(formatter_name="shfmt")
    setup = await Get(Setup, SetupRequest(request, check_only=False))
    result = await Get(ProcessResult, Process, setup.process)
    return FmtResult.from_process_result(result,
                                         original_digest=setup.original_digest,
                                         formatter_name="shfmt")
コード例 #8
0
ファイル: gofmt.py プロジェクト: leigh-johnson/pants
async def gofmt_fmt(request: GofmtRequest, gofmt: GofmtSubsystem) -> FmtResult:
    if gofmt.options.skip:
        return FmtResult.skip(formatter_name="gofmt")
    setup = await Get(Setup, SetupRequest(request, check_only=False))
    result = await Get(ProcessResult, Process, setup.process)
    return FmtResult.from_process_result(result,
                                         original_digest=setup.original_digest,
                                         formatter_name="gofmt")
コード例 #9
0
async def google_java_format_fmt(
    request: GoogleJavaFormatRequest,
    tool: GoogleJavaFormatSubsystem,
    jdk: InternalJdk,
) -> FmtResult:
    if tool.skip:
        return FmtResult.skip(formatter_name=request.name)
    lockfile_request = await Get(GenerateJvmLockfileFromTool,
                                 GoogleJavaFormatToolLockfileSentinel())
    tool_classpath = await Get(ToolClasspath,
                               ToolClasspathRequest(lockfile=lockfile_request))

    toolcp_relpath = "__toolcp"
    extra_immutable_input_digests = {
        toolcp_relpath: tool_classpath.digest,
    }

    maybe_java11_or_higher_options = []
    if jdk.jre_major_version >= 11:
        maybe_java11_or_higher_options = [
            "--add-exports=jdk.compiler/com.sun.tools.javac.api=ALL-UNNAMED",
            "--add-exports=jdk.compiler/com.sun.tools.javac.file=ALL-UNNAMED",
            "--add-exports=jdk.compiler/com.sun.tools.javac.parser=ALL-UNNAMED",
            "--add-exports=jdk.compiler/com.sun.tools.javac.tree=ALL-UNNAMED",
            "--add-exports=jdk.compiler/com.sun.tools.javac.util=ALL-UNNAMED",
        ]

    args = [
        *maybe_java11_or_higher_options,
        "com.google.googlejavaformat.java.Main",
        *(["--aosp"] if tool.aosp else []),
        "--replace",
        *request.snapshot.files,
    ]

    result = await Get(
        ProcessResult,
        JvmProcess(
            jdk=jdk,
            argv=args,
            classpath_entries=tool_classpath.classpath_entries(toolcp_relpath),
            input_digest=request.snapshot.digest,
            extra_jvm_options=tool.jvm_options,
            extra_immutable_input_digests=extra_immutable_input_digests,
            extra_nailgun_keys=extra_immutable_input_digests,
            output_files=request.snapshot.files,
            description=
            f"Run Google Java Format on {pluralize(len(request.field_sets), 'file')}.",
            level=LogLevel.DEBUG,
        ),
    )
    output_snapshot = await Get(Snapshot, Digest, result.output_digest)
    return FmtResult.create(request,
                            result,
                            output_snapshot,
                            strip_chroot_path=True)
コード例 #10
0
async def fortran_fmt(request: FortranFmtRequest) -> FmtResult:
    if not any(fs.address.target_name == "needs_formatting"
               for fs in request.field_sets):
        return FmtResult.skip(formatter_name=request.name)
    output = await Get(Snapshot, CreateDigest([FORTRAN_FILE]))
    return FmtResult(input=request.snapshot,
                     output=output,
                     stdout="",
                     stderr="",
                     formatter_name=request.name)
コード例 #11
0
ファイル: rules.py プロジェクト: hephex/pants
async def pyupgrade_fmt(result: PyUpgradeResult,
                        pyupgrade: PyUpgrade) -> FmtResult:
    if pyupgrade.skip:
        return FmtResult.skip(formatter_name="pyupgrade")

    return FmtResult.from_process_result(
        result.process_result,
        original_digest=result.original_digest,
        formatter_name="pyupgrade",
    )
コード例 #12
0
async def yapf_fmt(request: YapfRequest, yapf: Yapf) -> FmtResult:
    if yapf.skip:
        return FmtResult.skip(formatter_name="yapf")
    setup = await Get(Setup, SetupRequest(request, check_only=False))
    result = await Get(ProcessResult, Process, setup.process)
    return FmtResult.from_process_result(
        result,
        original_digest=setup.original_digest,
        formatter_name="yapf",
    )
コード例 #13
0
ファイル: rules.py プロジェクト: jperkelens/pants
async def black_fmt(field_sets: BlackRequest, black: Black) -> FmtResult:
    if black.skip:
        return FmtResult.skip(formatter_name="Black")
    setup = await Get(Setup, SetupRequest(field_sets, check_only=False))
    result = await Get(ProcessResult, Process, setup.process)
    return FmtResult.from_process_result(
        result,
        original_digest=setup.original_digest,
        formatter_name="Black",
        strip_chroot_path=True,
    )
コード例 #14
0
ファイル: rules.py プロジェクト: LarryFinn/pants
async def black_fmt(field_sets: BlackFieldSets, black: Black) -> FmtResult:
    if black.options.skip:
        return FmtResult.noop()
    setup = await Get[Setup](SetupRequest(field_sets, check_only=False))
    result = await Get[ProcessResult](Process, setup.process)
    return FmtResult.from_process_result(
        result,
        original_digest=setup.original_digest,
        formatter_name="Black",
        strip_chroot_path=True,
    )
コード例 #15
0
ファイル: rules.py プロジェクト: hephex/pants
async def autoflake_fmt(field_sets: AutoflakeRequest,
                        autoflake: Autoflake) -> FmtResult:
    if autoflake.skip:
        return FmtResult.skip(formatter_name="autoflake")
    setup = await Get(Setup, SetupRequest(field_sets, check_only=False))
    result = await Get(ProcessResult, Process, setup.process)
    return FmtResult.from_process_result(
        result,
        original_digest=setup.original_digest,
        formatter_name="autoflake",
        strip_chroot_path=True,
    )
コード例 #16
0
async def yapf_fmt(request: YapfRequest, yapf: Yapf) -> FmtResult:
    if yapf.skip:
        return FmtResult.skip(formatter_name=request.name)
    setup = await Get(Setup, SetupRequest(request, check_only=False))
    result = await Get(ProcessResult, Process, setup.process)
    output_snapshot = await Get(Snapshot, Digest, result.output_digest)
    return FmtResult(
        setup.original_snapshot,
        output_snapshot,
        stdout=result.stdout.decode(),
        stderr=result.stderr.decode(),
        formatter_name=request.name,
    )
コード例 #17
0
ファイル: rules.py プロジェクト: codealchemy/pants
async def isort_fmt(request: IsortRequest, isort: Isort) -> FmtResult:
    if isort.skip:
        return FmtResult.skip(formatter_name=request.name)
    setup = await Get(Setup, SetupRequest(request, check_only=False))
    result = await Get(ProcessResult, Process, setup.process)
    output_snapshot = await Get(Snapshot, Digest, result.output_digest)
    return FmtResult(
        setup.original_snapshot,
        output_snapshot,
        stdout=strip_v2_chroot_path(result.stdout),
        stderr=strip_v2_chroot_path(result.stderr),
        formatter_name=request.name,
    )
コード例 #18
0
def test_streaming_output_not_changed(caplog) -> None:
    caplog.set_level(logging.DEBUG)
    result = FmtResult(
        input=EMPTY_SNAPSHOT,
        output=EMPTY_SNAPSHOT,
        stdout="stdout",
        stderr="stderr",
        formatter_name="formatter",
    )
    assert result.level() == LogLevel.INFO
    assert result.message() == "formatter made no changes."
    assert ["Output from formatter\nstdout\nstderr"] == [
        rec.message for rec in caplog.records if rec.levelno == logging.DEBUG
    ]
コード例 #19
0
ファイル: rules.py プロジェクト: codealchemy/pants
async def pyupgrade_fmt(result: PyUpgradeResult,
                        pyupgrade: PyUpgrade) -> FmtResult:
    if pyupgrade.skip:
        return FmtResult.skip(formatter_name=PyUpgradeRequest.name)

    output_snapshot = await Get(Snapshot, Digest,
                                result.process_result.output_digest)
    return FmtResult(
        result.original_snapshot,
        output_snapshot,
        stdout=result.process_result.stdout.decode(),
        stderr=result.process_result.stderr.decode(),
        formatter_name=PyUpgradeRequest.name,
    )
コード例 #20
0
ファイル: rules.py プロジェクト: codealchemy/pants
async def google_java_format_fmt(request: GoogleJavaFormatRequest,
                                 tool: GoogleJavaFormatSubsystem) -> FmtResult:
    if tool.skip:
        return FmtResult.skip(formatter_name=request.name)
    setup = await Get(Setup, SetupRequest(request, check_only=False))
    result = await Get(ProcessResult, JvmProcess, setup.process)
    output_snapshot = await Get(Snapshot, Digest, result.output_digest)
    return FmtResult(
        setup.original_snapshot,
        output_snapshot,
        stdout=strip_v2_chroot_path(result.stdout),
        stderr=strip_v2_chroot_path(result.stderr),
        formatter_name=request.name,
    )
コード例 #21
0
async def clangformat_fmt(request: ClangFormatRequest,
                          clangformat: ClangFormat) -> FmtResult:
    if clangformat.skip:
        return FmtResult.skip(formatter_name=request.name)

    # Look for any/all of the clang-format configuration files (recurse sub-dirs)
    config_files_get = Get(
        ConfigFiles,
        ConfigFilesRequest,
        clangformat.config_request(request.snapshot.dirs),
    )

    clangformat_pex, config_files = await MultiGet(
        Get(Pex, PexRequest, clangformat.to_pex_request()), config_files_get)

    # Merge source files, config files, and clang-format pex process
    input_digest = await Get(
        Digest,
        MergeDigests([
            request.snapshot.digest,
            config_files.snapshot.digest,
            clangformat_pex.digest,
        ]),
    )

    result = await Get(
        ProcessResult,
        PexProcess(
            clangformat_pex,
            argv=(
                "--style=file",  # Look for .clang-format files
                "--fallback-style=webkit",  # Use WebKit if there is no config file
                "-i",  # In-place edits
                "--Werror",  # Formatting warnings as errors
                *clangformat.args,  # User-added arguments
                *request.snapshot.files,
            ),
            input_digest=input_digest,
            output_files=request.snapshot.files,
            description=
            f"Run clang-format on {pluralize(len(request.snapshot.files), 'file')}.",
            level=LogLevel.DEBUG,
        ),
    )
    output_snapshot = await Get(Snapshot, Digest, result.output_digest)
    return FmtResult.create(request,
                            result,
                            output_snapshot,
                            strip_chroot_path=True)
コード例 #22
0
def test_streaming_output_not_changed() -> None:
    result = FmtResult(
        input=EMPTY_DIGEST,
        output=EMPTY_DIGEST,
        stdout="stdout",
        stderr="stderr",
        formatter_name="formatter",
    )
    assert result.level() == LogLevel.INFO
    assert result.message() == dedent("""\
        made no changes.
        stdout
        stderr

        """)
コード例 #23
0
async def format_python_target(
        python_fmt_targets: PythonFmtTargets,
        union_membership: UnionMembership) -> LanguageFmtResults:
    targets_with_origins = python_fmt_targets.targets_with_origins
    original_sources = await Get[SourceFiles](AllSourceFilesRequest(
        target_with_origin.target[PythonSources]
        for target_with_origin in python_fmt_targets.targets_with_origins))
    prior_formatter_result = original_sources.snapshot

    results: List[FmtResult] = []
    config_collection_types: Iterable[
        Type[FmtConfigurations]] = union_membership.union_rules[
            PythonFmtConfigurations]
    for config_collection_type in config_collection_types:
        result = await Get[FmtResult](
            PythonFmtConfigurations,
            config_collection_type(
                (config_collection_type.config_type.create(target_with_origin)
                 for target_with_origin in targets_with_origins),
                prior_formatter_result=prior_formatter_result,
            ),
        )
        if result != FmtResult.noop():
            results.append(result)
            prior_formatter_result = await Get[Snapshot](Digest, result.digest)
    return LanguageFmtResults(
        tuple(results),
        combined_digest=prior_formatter_result.directory_digest)
コード例 #24
0
def test_streaming_output_changed() -> None:
    changed_digest = Digest(EMPTY_DIGEST.fingerprint, 2)
    result = FmtResult(
        input=EMPTY_DIGEST,
        output=changed_digest,
        stdout="stdout",
        stderr="stderr",
        formatter_name="formatter",
    )
    assert result.level() == LogLevel.WARN
    assert result.message() == dedent("""\
        made changes.
        stdout
        stderr

        """)
コード例 #25
0
ファイル: python_fmt.py プロジェクト: wiwa/pants
async def format_python_target(
        python_fmt_targets: PythonFmtTargets,
        union_membership: UnionMembership) -> LanguageFmtResults:
    targets_with_origins = python_fmt_targets.targets_with_origins
    original_sources = await Get[SourceFiles](AllSourceFilesRequest(
        target_with_origin.target[PythonSources]
        for target_with_origin in python_fmt_targets.targets_with_origins))
    prior_formatter_result = original_sources.snapshot

    results: List[FmtResult] = []
    fmt_request_types: Iterable[
        Type[FmtRequest]] = union_membership.union_rules[PythonFmtRequest]
    for fmt_request_type in fmt_request_types:
        result = await Get[FmtResult](
            PythonFmtRequest,
            fmt_request_type(
                (fmt_request_type.field_set_type.create(target_with_origin)
                 for target_with_origin in targets_with_origins),
                prior_formatter_result=prior_formatter_result,
            ),
        )
        if result != FmtResult.noop():
            results.append(result)
        if result.did_change:
            prior_formatter_result = await Get[Snapshot](Digest, result.output)
    return LanguageFmtResults(
        tuple(results),
        input=original_sources.snapshot.digest,
        output=prior_formatter_result.digest,
    )
コード例 #26
0
def test_streaming_output_changed(caplog) -> None:
    caplog.set_level(logging.DEBUG)
    changed_digest = Digest(EMPTY_DIGEST.fingerprint, 2)
    changed_snapshot = Snapshot._unsafe_create(changed_digest, [], [])
    result = FmtResult(
        input=EMPTY_SNAPSHOT,
        output=changed_snapshot,
        stdout="stdout",
        stderr="stderr",
        formatter_name="formatter",
    )
    assert result.level() == LogLevel.WARN
    assert result.message() == "formatter made changes."
    assert ["Output from formatter\nstdout\nstderr"] == [
        rec.message for rec in caplog.records if rec.levelno == logging.DEBUG
    ]
コード例 #27
0
 def language_fmt_results(self,
                          result_digest: Digest) -> LanguageFmtResults:
     return LanguageFmtResults(
         (
             FmtResult(
                 input=result_digest,
                 output=result_digest,
                 stdout="",
                 stderr="",
                 formatter_name="SmalltalkDidNotChange",
             ),
             FmtResult.skip(formatter_name="SmalltalkSkipped"),
         ),
         input=EMPTY_DIGEST,
         output=result_digest,
     )
コード例 #28
0
async def fortran_fmt(request: FortranFmtRequest) -> FmtResult:
    output = (
        await Get(Snapshot, CreateDigest([FORTRAN_FILE]))
        if any(fs.address.target_name == "needs_formatting" for fs in request.field_sets)
        else EMPTY_SNAPSHOT
    )
    return FmtResult(
        input=EMPTY_SNAPSHOT, output=output, stdout="", stderr="", formatter_name=request.name
    )
コード例 #29
0
async def smalltalk_noop(request: SmalltalkNoopRequest) -> FmtResult:
    assert request.snapshot != EMPTY_SNAPSHOT
    return FmtResult(
        input=request.snapshot,
        output=request.snapshot,
        stdout="",
        stderr="",
        formatter_name=request.name,
    )