def create_build_graph(self, target_roots, build_root=None, include_trace_on_error=True): """Construct and return a `BuildGraph` given a set of input specs. :param TargetRoots target_roots: The targets root of the request. :param string build_root: The build root. :returns: A tuple of (BuildGraph, AddressMapper). """ logger.debug('target_roots are: %r', target_roots) graph = LegacyBuildGraph.create( self.scheduler, self.engine, self.symbol_table_cls, include_trace_on_error=include_trace_on_error) logger.debug('build_graph is: %s', graph) with self.scheduler.locked(): # Ensure the entire generator is unrolled. for _ in graph.inject_specs_closure(target_roots.as_specs()): pass logger.debug('engine cache stats: %s', self.engine.cache_stats()) address_mapper = LegacyAddressMapper(self.scheduler, self.engine, build_root or get_buildroot()) logger.debug('address_mapper is: %s', address_mapper) return graph, address_mapper
def test_is_declaring_file(self): scheduler = mock.Mock() mapper = LegacyAddressMapper(scheduler, None, '') self.assertTrue(mapper.is_declaring_file(Address('path', 'name'), 'path/BUILD')) self.assertTrue(mapper.is_declaring_file(Address('path', 'name'), 'path/BUILD.suffix')) self.assertFalse(mapper.is_declaring_file(Address('path', 'name'), 'path/not_a_build_file')) self.assertFalse(mapper.is_declaring_file(Address('path', 'name'), 'differing-path/BUILD'))
def create_address_mapper(self, build_root): work_dir = os.path.join(build_root, '.pants.d') scheduler = EngineInitializer.setup_legacy_graph( [], work_dir, build_file_imports_behavior='allow', build_root=build_root, native=self._native).scheduler return LegacyAddressMapper(scheduler.new_session(), build_root)
def test_resolve_without_a_matching_target(self): graph_mock = mock.Mock() graph_mock.get_target = mock.Mock(return_value=None) graph_mock.inject_specs_closure = mock.Mock( return_value=[Address('a', 'different')]) mapper = LegacyAddressMapper(graph_mock, '') with self.assertRaises(AddressMapper.BuildFileScanError): mapper.resolve(Address('a', 'address'))
def test_resolve_with_a_target(self): target = LegacyTarget(None, None) address = Address('a', 'a') graph_mock = mock.Mock() graph_mock.get_target = mock.Mock(return_value=target) mapper = LegacyAddressMapper(graph_mock, '') self.assertEqual((address, target), mapper.resolve(address))
def test_scan_specs_returns_ordered_set(self): address = Address('a', 'b') graph_mock = mock.Mock() graph_mock.inject_specs_closure = mock.Mock( return_value=[address, address]) mapper = LegacyAddressMapper(graph_mock, '') self.assertEqual(OrderedSet([address]), mapper.scan_specs([SiblingAddresses('any')]))
def test_addresses_in_spec_path_wraps_error_in_buildfile_scan_error(self): graph_mock = mock.Mock() graph_mock.inject_specs_closure = mock.Mock( side_effect=LegacyBuildGraph.InvalidCommandLineSpecError( 'some msg')) mapper = LegacyAddressMapper(graph_mock, '') with self.assertRaises(AddressMapper.BuildFileScanError) as cm: mapper.addresses_in_spec_path('some/path') self.assertEqual('some msg', str(cm.exception))
def test_scan_addresses_with_root_specified(self): address = Address('a', 'b') graph_mock = mock.Mock() graph_mock.inject_specs_closure = mock.Mock(return_value=[address]) mapper = LegacyAddressMapper(graph_mock, '/some/build/root') absolute_root_path = '/some/build/root/a' mapper.scan_addresses(absolute_root_path) graph_mock.inject_specs_closure.assert_called_with( [DescendantAddresses('a')])
def test_is_declaring_file(self): scheduler = mock.Mock() mapper = LegacyAddressMapper(scheduler, '') self.assertTrue(mapper.is_declaring_file(Address('path', 'name'), 'path/BUILD')) self.assertTrue(mapper.is_declaring_file(Address('path', 'name'), 'path/BUILD.suffix')) self.assertFalse(mapper.is_declaring_file(Address('path', 'name'), 'path/not_a_build_file')) self.assertFalse(mapper.is_declaring_file(Address('path', 'name'), 'differing-path/BUILD')) self.assertFalse(mapper.is_declaring_file( BuildFileAddress(target_name='name', rel_path='path/BUILD.new'), 'path/BUILD')) self.assertTrue(mapper.is_declaring_file( BuildFileAddress(target_name='name', rel_path='path/BUILD'), 'path/BUILD'))
def create_build_graph( self, specs: Specs, build_root: Optional[str] = None, ) -> Tuple[LegacyBuildGraph, LegacyAddressMapper]: """Construct and return a `BuildGraph` given a set of input specs.""" logger.debug("specs are: %r", specs) graph = LegacyBuildGraph.create(self.scheduler_session, self.build_file_aliases) logger.debug("build_graph is: %s", graph) # Ensure the entire generator is unrolled. for _ in graph.inject_roots_closure(specs.address_specs): pass address_mapper = LegacyAddressMapper(self.scheduler_session, build_root or get_buildroot()) logger.debug("address_mapper is: %s", address_mapper) return graph, address_mapper
def test_other_throw_is_fail(self): # scan_addresses() should raise an error if the scheduler returns an error it can't ignore. class ThrowReturningScheduler(object): def execution_request(self, *args): pass def execute(self, *args): return ExecutionResult(None, [(('some-thing', None), Throw(Exception('just an exception')))]) with temporary_dir() as build_root: mapper = LegacyAddressMapper(ThrowReturningScheduler(), build_root) with self.assertRaises(LegacyAddressMapper.BuildFileScanError) as cm: mapper.scan_addresses(os.path.join(build_root, 'foo')) self.assertIn('just an exception', str(cm.exception))
def test_other_throw_is_fail(self) -> None: # scan_addresses() should raise an error if the scheduler returns an error it can't ignore. class ThrowReturningScheduler: def execution_request(self, *args): pass def execute(self, *args): return [], [(("some-thing", None), Throw(Exception("just an exception")))] with temporary_dir() as build_root: mapper = LegacyAddressMapper(ThrowReturningScheduler(), build_root) with self.assertRaises(LegacyAddressMapper.BuildFileScanError) as cm: mapper.scan_addresses(os.path.join(build_root, "foo")) self.assertIn("just an exception", str(cm.exception))
def create_build_graph(self, target_roots, build_root=None): """Construct and return a `BuildGraph` given a set of input specs. :param TargetRoots target_roots: The targets root of the request. :param string build_root: The build root. :returns: A tuple of (BuildGraph, AddressMapper). """ logger.debug('target_roots are: %r', target_roots) graph = LegacyBuildGraph.create(self.scheduler_session, self.build_file_aliases) logger.debug('build_graph is: %s', graph) # Ensure the entire generator is unrolled. for _ in graph.inject_roots_closure(target_roots): pass address_mapper = LegacyAddressMapper(self.scheduler_session, build_root or get_buildroot()) logger.debug('address_mapper is: %s', address_mapper) return graph, address_mapper
def test_is_declaring_file(self) -> None: scheduler = unittest.mock.Mock() mapper = LegacyAddressMapper(scheduler, "") self.assertTrue(mapper.is_declaring_file(Address("path", "name"), "path/BUILD")) self.assertTrue(mapper.is_declaring_file(Address("path", "name"), "path/BUILD.suffix")) self.assertFalse(mapper.is_declaring_file(Address("path", "name"), "path/not_a_build_file")) self.assertFalse(mapper.is_declaring_file(Address("path", "name"), "differing-path/BUILD")) self.assertFalse( mapper.is_declaring_file( BuildFileAddress(target_name="name", rel_path="path/BUILD.new"), "path/BUILD" ) ) self.assertTrue( mapper.is_declaring_file( BuildFileAddress(target_name="name", rel_path="path/BUILD"), "path/BUILD" ) )
def create_address_mapper(self, build_root): scheduler, engine, _, _ = EngineInitializer.setup_legacy_graph([], build_root=build_root, native=self._native) return LegacyAddressMapper(scheduler, engine, build_root)
def create_address_mapper(self, build_root): work_dir = os.path.join(build_root, '.pants.d') scheduler, engine, _, _ = EngineInitializer.setup_legacy_graph( [], work_dir, build_root=build_root, native=self._native) return LegacyAddressMapper(scheduler, engine, build_root)