def test_coursier_resolve_updates_bogus_lockfile( rule_runner: RuleRunner) -> None: rule_runner.write_files({ "BUILD": dedent("""\ coursier_lockfile( name = 'example-lockfile', maven_requirements = [ 'org.hamcrest:hamcrest-core:1.3', ], ) """), "coursier_resolve.lockfile": "]bad json[", }) result = rule_runner.run_goal_rule(CoursierResolve, args=["::"]) assert result.exit_code == 0 assert result.stderr == "Updated lockfile at: coursier_resolve.lockfile\n" expected_lockfile = CoursierResolvedLockfile(entries=(CoursierLockfileEntry( coord=MavenCoord(coord="org.hamcrest:hamcrest-core:1.3"), file_name="hamcrest-core-1.3.jar", direct_dependencies=MavenCoordinates([]), dependencies=MavenCoordinates([]), file_digest=FileDigest( fingerprint= "66fdef91e9739348df7a096aa384a5685f4e875584cce89386a7a47251c4d8e9", serialized_bytes_length=45024, ), ), )) assert (Path(rule_runner.build_root, "coursier_resolve.lockfile").read_bytes() == expected_lockfile.to_json())
def test_generate_lockfile(rule_runner: RuleRunner) -> None: artifacts = ArtifactRequirements([ ArtifactRequirement(Coordinate("org.hamcrest", "hamcrest-core", "1.3")) ]) result = rule_runner.request( GenerateLockfileResult, [ GenerateJvmLockfile(artifacts=artifacts, resolve_name="test", lockfile_dest="lock.txt") ], ) digest_contents = rule_runner.request(DigestContents, [result.digest]) assert len(digest_contents) == 1 expected = CoursierResolvedLockfile( entries=(CoursierLockfileEntry( coord=Coordinate( group="org.hamcrest", artifact="hamcrest-core", version="1.3", ), file_name="org.hamcrest_hamcrest-core_1.3.jar", direct_dependencies=Coordinates([]), dependencies=Coordinates([]), file_digest=FileDigest( fingerprint= "66fdef91e9739348df7a096aa384a5685f4e875584cce89386a7a47251c4d8e9", serialized_bytes_length=45024, ), ), ), metadata=JVMLockfileMetadata.new(artifacts), ) assert CoursierResolvedLockfile.from_serialized( digest_contents[0].content) == expected
def test_coursier_resolve_noop_does_not_touch_lockfile( rule_runner: RuleRunner) -> None: expected_lockfile = CoursierResolvedLockfile(entries=(CoursierLockfileEntry( coord=MavenCoord(coord="org.hamcrest:hamcrest-core:1.3"), file_name="hamcrest-core-1.3.jar", direct_dependencies=MavenCoordinates([]), dependencies=MavenCoordinates([]), file_digest=FileDigest( fingerprint= "66fdef91e9739348df7a096aa384a5685f4e875584cce89386a7a47251c4d8e9", serialized_bytes_length=45024, ), ), )) rule_runner.write_files({ "BUILD": dedent("""\ coursier_lockfile( name = 'example-lockfile', maven_requirements = [ 'org.hamcrest:hamcrest-core:1.3', ], sources = [ "coursier_resolve.lockfile", ], ) """), "coursier_resolve.lockfile": expected_lockfile.to_json().decode("utf-8"), }) result = rule_runner.run_goal_rule(CoursierResolve, args=["::"]) assert result.exit_code == 0 assert result.stderr == ""
def test_compile_with_maven_deps(rule_runner: RuleRunner) -> None: resolved_joda_lockfile = CoursierResolvedLockfile( entries=(CoursierLockfileEntry( coord=Coordinate( group="joda-time", artifact="joda-time", version="2.10.10"), file_name="joda-time-2.10.10.jar", direct_dependencies=Coordinates([]), dependencies=Coordinates([]), file_digest=FileDigest( fingerprint= "dd8e7c92185a678d1b7b933f31209b6203c8ffa91e9880475a1be0346b9617e3", serialized_bytes_length=644419, ), ), )) rule_runner.write_files({ "BUILD": dedent("""\ jvm_artifact( name = "joda-time_joda-time", group = "joda-time", artifact = "joda-time", version = "2.10.10", ) scala_sources( name = 'main', dependencies = [":joda-time_joda-time"], ) """), "coursier_resolve.lockfile": resolved_joda_lockfile.to_json().decode("utf-8"), "Example.scala": dedent(""" package org.pantsbuild.example import org.joda.time.DateTime object Main { def main(args: Array[String]): Unit = { val dt = new DateTime() println(dt.getYear) } } """), }) request = CompileScalaSourceRequest( component=expect_single_expanded_coarsened_target( rule_runner, Address(spec_path="", target_name="main")), resolve=make_resolve(rule_runner), ) compiled_classfiles = rule_runner.request(ClasspathEntry, [request]) classpath = rule_runner.request(RenderedClasspath, [compiled_classfiles.digest]) assert classpath.content == { ".Example.scala.main.jar": { "META-INF/MANIFEST.MF", "org/pantsbuild/example/Main$.class", "org/pantsbuild/example/Main.class", } }
def test_compile_with_maven_deps(rule_runner: RuleRunner) -> None: resolved_joda_lockfile = CoursierResolvedLockfile( entries=(CoursierLockfileEntry( coord=Coordinate( group="joda-time", artifact="joda-time", version="2.10.10"), file_name="joda-time-2.10.10.jar", direct_dependencies=Coordinates([]), dependencies=Coordinates([]), file_digest=FileDigest( fingerprint= "dd8e7c92185a678d1b7b933f31209b6203c8ffa91e9880475a1be0346b9617e3", serialized_bytes_length=644419, ), ), )) rule_runner.write_files({ "BUILD": dedent("""\ jvm_artifact( name = "joda-time_joda-time", group = "joda-time", artifact = "joda-time", version = "2.10.10", ) java_sources( name = 'main', dependencies = [ ':joda-time_joda-time', ] ) """), "coursier_resolve.lockfile": resolved_joda_lockfile.to_json().decode("utf-8"), "Example.java": dedent(""" package org.pantsbuild.example; import org.joda.time.DateTime; public class Example { public static void main(String[] args) { DateTime dt = new DateTime(); System.out.println(dt.getYear()); } } """), }) request = CompileJavaSourceRequest( component=expect_single_expanded_coarsened_target( rule_runner, Address(spec_path="", target_name="main")), resolve=make_resolve(rule_runner), ) compiled_classfiles = rule_runner.request(ClasspathEntry, [request]) classpath = rule_runner.request(RenderedClasspath, [compiled_classfiles.digest]) assert classpath.content == { ".Example.java.main.jar": {"org/pantsbuild/example/Example.class"} }
def test_compile_with_undeclared_jvm_artifact_target_fails( rule_runner: RuleRunner) -> None: rule_runner.write_files({ "BUILD": dedent("""\ scala_sources( name = 'main', ) """), "coursier_resolve.lockfile": CoursierResolvedLockfile(entries=()).to_json().decode("utf-8"), "Example.scala": dedent(""" package org.pantsbuild.example import org.joda.time.DateTime object Main { def main(args: Array[String]): Unit = { val dt = new DateTime() println(dt.getYear) } } """), }) request = CompileScalaSourceRequest( component=expect_single_expanded_coarsened_target( rule_runner, Address(spec_path="", target_name="main")), resolve=make_resolve(rule_runner), ) fallible_result = rule_runner.request(FallibleClasspathEntry, [request]) assert fallible_result.result == CompileResult.FAILED and fallible_result.stderr assert "error: object joda is not a member of package org" in fallible_result.stderr
def test_resolve_with_transitive_deps(rule_runner: RuleRunner) -> None: junit_coord = Coordinate(group="junit", artifact="junit", version="4.13.2") resolved_lockfile = rule_runner.request( CoursierResolvedLockfile, [ ArtifactRequirements([junit_coord]), ], ) assert resolved_lockfile == CoursierResolvedLockfile(entries=( CoursierLockfileEntry( coord=junit_coord, file_name="junit-4.13.2.jar", direct_dependencies=Coordinates([HAMCREST_COORD]), dependencies=Coordinates([HAMCREST_COORD]), file_digest=FileDigest( fingerprint= "8e495b634469d64fb8acfa3495a065cbacc8a0fff55ce1e31007be4c16dc57d3", serialized_bytes_length=384581, ), ), CoursierLockfileEntry( coord=HAMCREST_COORD, file_name="hamcrest-core-1.3.jar", direct_dependencies=Coordinates([]), dependencies=Coordinates([]), file_digest=FileDigest( fingerprint= "66fdef91e9739348df7a096aa384a5685f4e875584cce89386a7a47251c4d8e9", serialized_bytes_length=45024, ), ), ))
def jvm_lockfile(self, request) -> JVMLockfileFixture: mark = request.node.get_closest_marker("jvm_lockfile") definition = JVMLockfileFixtureDefinition.from_kwargs(mark.kwargs) # Load the lockfile. lockfile_path = request.node.path.parent / definition.lockfile_rel_path lockfile_contents = lockfile_path.read_bytes() lockfile = CoursierResolvedLockfile.from_serialized(lockfile_contents) # Check the lockfile's requirements against the requirements in the lockfile. # Fail the test if the lockfile needs to be regenerated. artifact_reqs = ArtifactRequirements([ ArtifactRequirement(coordinate) for coordinate in definition.coordinates ]) if not lockfile.metadata: raise ValueError( f"Expected JVM lockfile {definition.lockfile_rel_path} to have metadata." ) if not lockfile.metadata.is_valid_for(artifact_reqs, LockfileContext.TOOL): raise ValueError( f"Lockfile fixture {definition.lockfile_rel_path} is not valid. " "Please re-generate it using: " f"{bin_name()} internal-generate-test-lockfile-fixtures ::") return JVMLockfileFixture(lockfile, lockfile_contents.decode(), artifact_reqs)
def test_compile_with_missing_dep_fails(rule_runner: RuleRunner) -> None: rule_runner.write_files( { "BUILD": dedent( """\ coursier_lockfile( name = 'lockfile', requirements = [], sources = [ "coursier_resolve.lockfile", ], ) java_sources( name = 'main', dependencies = [ ':lockfile', ] ) """ ), "Example.java": JAVA_LIB_MAIN_SOURCE, "coursier_resolve.lockfile": CoursierResolvedLockfile(entries=()) .to_json() .decode("utf-8"), } ) request = CompileJavaSourceRequest( component=expect_single_expanded_coarsened_target( rule_runner, Address(spec_path="", target_name="main") ) ) fallible_result = rule_runner.request(FallibleCompiledClassfiles, [request]) assert fallible_result.result == CompileResult.FAILED and fallible_result.stderr assert "package org.pantsbuild.example.lib does not exist" in fallible_result.stderr
def test_compile_multiple_source_files(rule_runner: RuleRunner) -> None: rule_runner.write_files( { "BUILD": dedent( """\ coursier_lockfile( name = 'lockfile', requirements = [], sources = [ "coursier_resolve.lockfile", ], ) java_sources( name = 'lib', dependencies = [ ':lockfile', ] ) """ ), "coursier_resolve.lockfile": CoursierResolvedLockfile(entries=()) .to_json() .decode("utf-8"), "ExampleLib.java": JAVA_LIB_SOURCE, "OtherLib.java": dedent( """\ package org.pantsbuild.example.lib; public class OtherLib { public static String hello() { return "Hello!"; } } """ ), } ) expanded_targets = rule_runner.request( Targets, [Addresses([Address(spec_path="", target_name="lib")])] ) assert sorted(t.address.spec for t in expanded_targets) == [ "//ExampleLib.java:lib", "//OtherLib.java:lib", ] coarsened_targets = rule_runner.request( CoarsenedTargets, [Addresses([t.address for t in expanded_targets])] ) assert len(coarsened_targets) == 1 coarsened_target = coarsened_targets[0] assert len(coarsened_target.members) == 2 request = CompileJavaSourceRequest(component=coarsened_target) compiled_classfiles = rule_runner.request(CompiledClassfiles, [request]) classfile_digest_contents = rule_runner.request(DigestContents, [compiled_classfiles.digest]) assert frozenset(content.path for content in classfile_digest_contents) == frozenset( ["org/pantsbuild/example/lib/ExampleLib.class", "org/pantsbuild/example/lib/OtherLib.class"] )
def test_deploy_jar_local_deps(rule_runner: RuleRunner) -> None: rule_runner.write_files({ "BUILD": dedent("""\ deploy_jar( name="example_app_deploy_jar", main="org.pantsbuild.example.Example", output_path="dave.jar", dependencies=[ ":example", ], ) java_sources( name="example", sources=["**/*.java", ], ) """), "coursier_resolve.lockfile": CoursierResolvedLockfile(entries=()).to_json().decode("utf-8"), "Example.java": JAVA_MAIN_SOURCE, "lib/ExampleLib.java": JAVA_LIB_SOURCE, }) _deploy_jar_test(rule_runner, "example_app_deploy_jar")
def test_deploy_jar_no_deps(rule_runner: RuleRunner) -> None: rule_runner.write_files( { "BUILD": dedent( """\ deploy_jar( name="example_app_deploy_jar", main="org.pantsbuild.example.Example", output_path="dave.jar", dependencies=[ ":example", ], ) java_sources( name="example", ) """ ), "3rdparty/jvm/default.lock": CoursierResolvedLockfile(()).to_serialized().decode(), "Example.java": JAVA_MAIN_SOURCE_NO_DEPS, } ) _deploy_jar_test(rule_runner, "example_app_deploy_jar")
def lockfile() -> CoursierResolvedLockfile: # Calculate transitive deps transitive_ = {(i, k) for i, j in direct.items() for k in j} while True: old_len = len(transitive_) transitive_ |= {(i, k) for i, j in transitive_ for k in direct[j]} if old_len == len(transitive_): break transitive = DefaultDict(set) for (i, j) in transitive_: transitive[i].add(j) entries = ( CoursierLockfileEntry( coord=coord, file_name=f"{coord.artifact}.jar", direct_dependencies=Coordinates(direct[coord]), dependencies=Coordinates(transitive[coord]), file_digest=mock.Mock(), ) for coord in direct ) return CoursierResolvedLockfile(entries=tuple(entries))
def test_compile_with_missing_maven_dep_fails(rule_runner: RuleRunner) -> None: rule_runner.write_files({ "BUILD": dedent("""\ java_sources( name = 'main', ) """), "coursier_resolve.lockfile": CoursierResolvedLockfile(entries=()).to_json().decode("utf-8"), "Example.java": dedent(""" package org.pantsbuild.example; import org.joda.time.DateTime; public class Example { public static void main(String[] args) { DateTime dt = new DateTime(); System.out.println(dt.getYear()); } } """), }) request = CompileJavaSourceRequest( component=expect_single_expanded_coarsened_target( rule_runner, Address(spec_path="", target_name="main")), resolve=make_resolve(rule_runner), ) fallible_result = rule_runner.request(FallibleClasspathEntry, [request]) assert fallible_result.result == CompileResult.FAILED and fallible_result.stderr assert "package org.joda.time does not exist" in fallible_result.stderr
def test_resolve_with_inexact_coord(rule_runner: RuleRunner) -> None: resolved_lockfile = rule_runner.request( CoursierResolvedLockfile, [ # Note the open-ended coordinate here. We will still resolve this for the user, but the result # will be exact and pinned. As noted above, this is an especially brittle unit test, but version # 4.8 was chosen because it has multiple patch versions and no new versions have been uploaded # to 4.8.x in over a decade. ArtifactRequirements( [Coordinate(group="junit", artifact="junit", version="4.8+")]), ], ) assert resolved_lockfile == CoursierResolvedLockfile( entries=(CoursierLockfileEntry( coord=Coordinate(group="junit", artifact="junit", version="4.8.2"), file_name="junit-4.8.2.jar", direct_dependencies=Coordinates([]), dependencies=Coordinates([]), file_digest=FileDigest( fingerprint= "a2aa2c3bb2b72da76c3e6a71531f1eefdc350494819baf2b1d80d7146e020f9e", serialized_bytes_length=237344, ), ), ))
def test_compile_of_package_info(rule_runner: RuleRunner) -> None: rule_runner.write_files({ "BUILD": dedent("""\ java_sources( name = 'main', ) """), "coursier_resolve.lockfile": CoursierResolvedLockfile(entries=()).to_json().decode("utf-8"), "package-info.java": dedent(""" package org.pantsbuild.example; /** * This is a package-info.java file which can have package-level annotations and * documentation comments. It does not generate any output. */ """), }) compiled_classfiles = rule_runner.request( ClasspathEntry, [ CompileJavaSourceRequest( component=expect_single_expanded_coarsened_target( rule_runner, Address(spec_path="", target_name="main")), resolve=make_resolve(rule_runner), ) ], ) classpath = rule_runner.request(RenderedClasspath, [compiled_classfiles.digest]) assert classpath.content == {}
def test_coursier_resolve_updates_bogus_lockfile( rule_runner: RuleRunner) -> None: rule_runner.write_files({ "BUILD": dedent("""\ java_sources( name = 'here_to_provide_dependencies', dependencies = [ ':org.hamcrest_hamcrest-core', ], sources = ["*.txt"], ) jvm_artifact( name = 'org.hamcrest_hamcrest-core', group = 'org.hamcrest', artifact = 'hamcrest-core', version = "1.3", ) coursier_lockfile( name = 'example-lockfile', ) """), "coursier_resolve.lockfile": "]bad json[", }) result = rule_runner.run_goal_rule(CoursierResolve, args=ARGS, env_inherit=PYTHON_BOOTSTRAP_ENV) assert result.exit_code == 0 assert result.stderr == "Updated lockfile at: coursier_resolve.lockfile\n" expected_lockfile = CoursierResolvedLockfile(entries=(CoursierLockfileEntry( coord=HAMCREST_COORD, file_name="hamcrest-core-1.3.jar", direct_dependencies=Coordinates([]), dependencies=Coordinates([]), file_digest=FileDigest( fingerprint= "66fdef91e9739348df7a096aa384a5685f4e875584cce89386a7a47251c4d8e9", serialized_bytes_length=45024, ), ), )) assert (Path(rule_runner.build_root, "coursier_resolve.lockfile").read_bytes() == expected_lockfile.to_json())
def test_resolve_with_a_jar(rule_runner: RuleRunner) -> None: rule_runner.write_files({ "BUILD": textwrap.dedent("""\ jvm_artifact( name="jeremy", group="jeremy", artifact="jeremy", version="4.13.2", jar="jeremy.jar", ) """), "jeremy.jar": "hello dave", }) targets = rule_runner.request(Targets, [ RawSpecs(recursive_globs=(RecursiveGlobSpec(""), ), description_of_origin="tests") ]) jeremy_target = targets[0] jar_field = jeremy_target[JvmArtifactJarSourceField] requirement = ArtifactRequirement( coordinate=Coordinate( group="jeremy", artifact="jeremy", version="4.13.2", ), jar=jar_field, ) resolved_lockfile = rule_runner.request( CoursierResolvedLockfile, [ArtifactRequirements([requirement])], ) coordinate = requirement.coordinate assert resolved_lockfile == CoursierResolvedLockfile( entries=(CoursierLockfileEntry( coord=Coordinate(group=coordinate.group, artifact=coordinate.artifact, version=coordinate.version), file_name= f"{coordinate.group}_{coordinate.artifact}_{coordinate.version}.jar", direct_dependencies=Coordinates([]), dependencies=Coordinates([]), file_digest=FileDigest( fingerprint= "55b9afa8d7776cd6c318eec51f506e9c7f66c247dcec343d4667f5f269714f86", serialized_bytes_length=10, ), pants_address=jar_field.address.spec, ), ))
def test_java_parser_fallible_error(rule_runner: RuleRunner) -> None: rule_runner.write_files({ "coursier_resolve.lockfile": CoursierResolvedLockfile(entries=()).to_json().decode("utf-8"), "BUILD": dedent("""\ coursier_lockfile( name = 'lockfile', requirements = [], sources = [ "coursier_resolve.lockfile", ], ) java_source( name='simple-source', sources=['SimpleSource.java'], dependencies= [':lockfile'], ) """), "SimpleSource.java": dedent(""" syntax error! """), }) target = rule_runner.get_target( address=Address(spec_path="", target_name="simple-source")) source_files = rule_runner.request( SourceFiles, [ SourceFilesRequest( (target.get(Sources), ), for_sources_types=(JavaSourceField, ), enable_codegen=True, ) ], ) fallible_result = rule_runner.request( FallibleJavaSourceDependencyAnalysisResult, [source_files], ) assert fallible_result.process_result.exit_code != 0 with pytest.raises(ExecutionError) as exc_info: rule_runner.request( JavaSourceDependencyAnalysis, [source_files], ) assert isinstance(exc_info.value.wrapped_exceptions[0], ProcessExecutionFailure)
def test_compile_with_deps(rule_runner: RuleRunner) -> None: rule_runner.write_files( { "BUILD": dedent( """\ coursier_lockfile( name = 'lockfile', requirements = [], sources = [ "coursier_resolve.lockfile", ], ) java_sources( name = 'main', dependencies = [ ':lockfile', 'lib:lib', ] ) """ ), "coursier_resolve.lockfile": CoursierResolvedLockfile(entries=()) .to_json() .decode("utf-8"), "Example.java": JAVA_LIB_MAIN_SOURCE, "lib/BUILD": dedent( """\ java_sources( name = 'lib', dependencies = [ '//:lockfile', ] ) """ ), "lib/ExampleLib.java": JAVA_LIB_SOURCE, } ) compiled_classfiles = rule_runner.request( CompiledClassfiles, [ CompileJavaSourceRequest( component=expect_single_expanded_coarsened_target( rule_runner, Address(spec_path="", target_name="main") ) ) ], ) classfile_digest_contents = rule_runner.request(DigestContents, [compiled_classfiles.digest]) assert len(classfile_digest_contents) == 1 assert classfile_digest_contents[0].path == "org/pantsbuild/example/Example.class"
def test_java_parser_unnamed_package(rule_runner: RuleRunner) -> None: rule_runner.write_files({ "coursier_resolve.lockfile": CoursierResolvedLockfile(entries=()).to_json().decode("utf-8"), "BUILD": dedent("""\ coursier_lockfile( name = 'lockfile', requirements = [], sources = [ "coursier_resolve.lockfile", ], ) java_source( name='simple-source', sources=['SimpleSource.java'], dependencies= [':lockfile'], ) """), "SimpleSource.java": dedent(""" public class SimpleSource { public void hello() { System.out.println("hello"); } } class Foo {} """), }) target = rule_runner.get_target( address=Address(spec_path="", target_name="simple-source")) source_files = rule_runner.request( SourceFiles, [ SourceFilesRequest( (target.get(Sources), ), for_sources_types=(JavaSourceField, ), enable_codegen=True, ) ], ) analysis = rule_runner.request(JavaSourceDependencyAnalysis, [source_files]) assert analysis.declared_package == "" assert analysis.imports == [] assert analysis.top_level_types == ["SimpleSource", "Foo"]
def test_compile_no_deps(rule_runner: RuleRunner) -> None: rule_runner.write_files( { "BUILD": dedent( """\ coursier_lockfile( name = 'lockfile', requirements = [], sources = [ "coursier_resolve.lockfile", ], ) java_sources( name = 'lib', dependencies = [ ':lockfile', ] ) """ ), "coursier_resolve.lockfile": CoursierResolvedLockfile(entries=()) .to_json() .decode("utf-8"), "ExampleLib.java": JAVA_LIB_SOURCE, } ) coarsened_target = expect_single_expanded_coarsened_target( rule_runner, Address(spec_path="", target_name="lib") ) compiled_classfiles = rule_runner.request( CompiledClassfiles, [CompileJavaSourceRequest(component=coarsened_target)], ) classfile_digest_contents = rule_runner.request(DigestContents, [compiled_classfiles.digest]) assert frozenset(content.path for content in classfile_digest_contents) == frozenset( ["org/pantsbuild/example/lib/ExampleLib.class"] ) # Additionally validate that `check` works. check_results = rule_runner.request( CheckResults, [JavacCheckRequest([JavacCheckRequest.field_set_type.create(coarsened_target.members[0])])], ) assert len(check_results.results) == 1 check_result = check_results.results[0] assert check_result.partition_description == str(coarsened_target)
def test_resolve_with_no_deps(rule_runner: RuleRunner) -> None: resolved_lockfile = rule_runner.request( CoursierResolvedLockfile, [ArtifactRequirements([HAMCREST_COORD])], ) assert resolved_lockfile == CoursierResolvedLockfile( entries=(CoursierLockfileEntry( coord=HAMCREST_COORD, file_name="hamcrest-core-1.3.jar", direct_dependencies=Coordinates([]), dependencies=Coordinates([]), file_digest=FileDigest( fingerprint= "66fdef91e9739348df7a096aa384a5685f4e875584cce89386a7a47251c4d8e9", serialized_bytes_length=45024, ), ), ))
def test_compile_no_deps(rule_runner: RuleRunner) -> None: rule_runner.write_files({ "BUILD": dedent("""\ scala_sources( name = 'lib', ) """), "coursier_resolve.lockfile": CoursierResolvedLockfile(entries=()).to_json().decode("utf-8"), "ExampleLib.scala": SCALA_LIB_SOURCE, }) coarsened_target = expect_single_expanded_coarsened_target( rule_runner, Address(spec_path="", target_name="lib")) print(coarsened_target) compiled_classfiles = rule_runner.request( ClasspathEntry, [ CompileScalaSourceRequest(component=coarsened_target, resolve=make_resolve(rule_runner)) ], ) classpath = rule_runner.request(RenderedClasspath, [compiled_classfiles.digest]) assert classpath.content == { ".ExampleLib.scala.lib.jar": {"META-INF/MANIFEST.MF", "org/pantsbuild/example/lib/C.class"} } # Additionally validate that `check` works. check_results = rule_runner.request( CheckResults, [ ScalacCheckRequest([ ScalacCheckRequest.field_set_type.create( coarsened_target.representative) ]) ], ) assert len(check_results.results) == 1 check_result = check_results.results[0] assert check_result.exit_code == 0
def test_compile_jdk_versions(rule_runner: RuleRunner) -> None: rule_runner.write_files({ "BUILD": dedent("""\ java_sources( name = 'lib', ) """), "coursier_resolve.lockfile": CoursierResolvedLockfile(entries=()).to_json().decode("utf-8"), "ExampleLib.java": JAVA_LIB_SOURCE, }) request = CompileJavaSourceRequest( component=expect_single_expanded_coarsened_target( rule_runner, Address(spec_path="", target_name="lib")), resolve=make_resolve(rule_runner), ) rule_runner.set_options( [ "--javac-jdk=zulu:8.0.312", NAMED_RESOLVE_OPTIONS, DEFAULT_RESOLVE_OPTION ], env_inherit=PYTHON_BOOTSTRAP_ENV, ) compiled_classfiles = rule_runner.request(ClasspathEntry, [request]) classpath = rule_runner.request(RenderedClasspath, [compiled_classfiles.digest]) assert classpath.content == { ".ExampleLib.java.lib.jar": {"org/pantsbuild/example/lib/ExampleLib.class"} } rule_runner.set_options( [ "--javac-jdk=bogusjdk:999", NAMED_RESOLVE_OPTIONS, DEFAULT_RESOLVE_OPTION ], env_inherit=PYTHON_BOOTSTRAP_ENV, ) expected_exception_msg = r".*?JVM bogusjdk:999 not found in index.*?" with pytest.raises(ExecutionError, match=expected_exception_msg): rule_runner.request(ClasspathEntry, [request])
def test_compile_jdk_versions(rule_runner: RuleRunner) -> None: rule_runner.write_files( { "BUILD": dedent( """\ coursier_lockfile( name = 'lockfile', requirements = [], sources = [ "coursier_resolve.lockfile", ], ) java_sources( name = 'lib', dependencies = [ ':lockfile', ] ) """ ), "coursier_resolve.lockfile": CoursierResolvedLockfile(entries=()) .to_json() .decode("utf-8"), "ExampleLib.java": JAVA_LIB_SOURCE, } ) request = CompileJavaSourceRequest( component=expect_single_expanded_coarsened_target( rule_runner, Address(spec_path="", target_name="lib") ) ) rule_runner.set_options(["--javac-jdk=zulu:1.6"]) assert { contents.path for contents in rule_runner.request( DigestContents, [rule_runner.request(CompiledClassfiles, [request]).digest] ) } == {"org/pantsbuild/example/lib/ExampleLib.class"} rule_runner.set_options(["--javac-jdk=bogusjdk:999"]) expected_exception_msg = r".*?JVM bogusjdk:999 not found in index.*?" with pytest.raises(ExecutionError, match=expected_exception_msg): rule_runner.request(CompiledClassfiles, [request])
def test_compile_with_deps(rule_runner: RuleRunner) -> None: rule_runner.write_files({ "BUILD": dedent("""\ scala_sources( name = 'main', dependencies = [ 'lib:lib', ] ) """), "coursier_resolve.lockfile": CoursierResolvedLockfile(entries=()).to_json().decode("utf-8"), "Example.scala": SCALA_LIB_MAIN_SOURCE, "lib/BUILD": dedent("""\ scala_sources( name = 'lib', ) """), "lib/ExampleLib.scala": SCALA_LIB_SOURCE, }) compiled_classfiles = rule_runner.request( ClasspathEntry, [ CompileScalaSourceRequest( component=expect_single_expanded_coarsened_target( rule_runner, Address(spec_path="", target_name="main")), resolve=make_resolve(rule_runner), ) ], ) classpath = rule_runner.request(RenderedClasspath, [compiled_classfiles.digest]) assert classpath.content == { ".Example.scala.main.jar": { "META-INF/MANIFEST.MF", "org/pantsbuild/example/Main$.class", "org/pantsbuild/example/Main.class", } }
def test_resolve_with_no_deps(rule_runner: RuleRunner) -> None: resolved_lockfile = rule_runner.request( CoursierResolvedLockfile, [ MavenRequirements.create_from_maven_coordinates_fields( fields=(), additional_requirements=["org.hamcrest:hamcrest-core:1.3"], ) ], ) assert resolved_lockfile == CoursierResolvedLockfile( entries=(CoursierLockfileEntry( coord=MavenCoord(coord="org.hamcrest:hamcrest-core:1.3"), file_name="hamcrest-core-1.3.jar", direct_dependencies=MavenCoordinates([]), dependencies=MavenCoordinates([]), file_digest=FileDigest( fingerprint= "66fdef91e9739348df7a096aa384a5685f4e875584cce89386a7a47251c4d8e9", serialized_bytes_length=45024, ), ), ))
def test_compile_with_missing_dep_fails(rule_runner: RuleRunner) -> None: rule_runner.write_files({ "BUILD": dedent("""\ scala_sources( name = 'main', ) """), "Example.scala": SCALA_LIB_MAIN_SOURCE, "coursier_resolve.lockfile": CoursierResolvedLockfile(entries=()).to_json().decode("utf-8"), }) request = CompileScalaSourceRequest( component=expect_single_expanded_coarsened_target( rule_runner, Address(spec_path="", target_name="main")), resolve=make_resolve(rule_runner), ) fallible_result = rule_runner.request(FallibleClasspathEntry, [request]) assert fallible_result.result == CompileResult.FAILED and fallible_result.stderr assert ( "error: object lib is not a member of package org.pantsbuild.example" in fallible_result.stderr)
def test_resolve_with_transitive_deps(rule_runner: RuleRunner) -> None: resolved_lockfile = rule_runner.request( CoursierResolvedLockfile, [ MavenRequirements.create_from_maven_coordinates_fields( fields=(), additional_requirements=["junit:junit:4.13.2"], ) ], ) assert resolved_lockfile == CoursierResolvedLockfile(entries=( CoursierLockfileEntry( coord=MavenCoord(coord="junit:junit:4.13.2"), file_name="junit-4.13.2.jar", direct_dependencies=MavenCoordinates( [MavenCoord(coord="org.hamcrest:hamcrest-core:1.3")]), dependencies=MavenCoordinates( [MavenCoord(coord="org.hamcrest:hamcrest-core:1.3")]), file_digest=FileDigest( fingerprint= "8e495b634469d64fb8acfa3495a065cbacc8a0fff55ce1e31007be4c16dc57d3", serialized_bytes_length=384581, ), ), CoursierLockfileEntry( coord=MavenCoord(coord="org.hamcrest:hamcrest-core:1.3"), file_name="hamcrest-core-1.3.jar", direct_dependencies=MavenCoordinates([]), dependencies=MavenCoordinates([]), file_digest=FileDigest( fingerprint= "66fdef91e9739348df7a096aa384a5685f4e875584cce89386a7a47251c4d8e9", serialized_bytes_length=45024, ), ), ))