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)
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)
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)
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)
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)
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" )
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")
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")
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)
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)
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", )
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", )
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, )
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, )
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, )
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, )
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, )
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 ]
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, )
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, )
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)
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 """)
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)
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 """)
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, )
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 ]
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, )
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 )
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, )