def update_dates(self, service_id: int, end_date: date, start_date: date = None) -> bool: """ update the field start_date of Service table based on the first commit date of any of the service's dependencies Parameters ---------- service_id: int service ID end_date: date end date start_date: date Returns ------- bool """ service_conn = ServiceConn(path_to_db=self.db_path) updated = False if start_date is None: start_date = self._get_first_commit_date_associated_with_service( service_id) if start_date is not None: updated = service_conn.update_service(service_id=service_id, start_date=start_date, end_date=end_date) return updated
def insert_service_repository(self, service_name: str, repository_id: int, start_date: str = None, end_date: str = None, initial_loc: int = None): """ Parameters ---------- service_name: str repository_id: int start_date: str the date that this repo started being used for the specified service end_date: str the date that this repo stop being used for the specified service initial_loc: int Returns ------- """ service_conn = ServiceConn(path_to_db=self.db_path) service = service_conn.get_service(name=service_name) repo_mgr = RepositoryMgr(path_to_db=self.db_path) repo = repo_mgr.get_repository(repository_id=repository_id, service_id=service.service_id) service_repo_conn = ServiceRepositoryConn(self.db_path) # check if start_date is valid try: if start_date is not None: start_date_dt = datetime.strptime(start_date, '%Y-%m-%d').date() assert service.start_date <= start_date_dt, \ "Error! service={} repo={} {} > {}".format(service.name, repo.name, service.start_date, start_date_dt) except ValueError as e: logging.critical('Error! Invalid start_date: {} msg={}'.format( start_date, e)) raise e # check if end_date is valid try: if end_date is not None: end_date_dt = datetime.strptime(end_date, '%Y-%m-%d') assert service.end_date >= end_date_dt except ValueError as e: logging.critical('Error! Invalid end_date: {} msg={}'.format( end_date, e)) raise e service_repo_conn.insert_service_repo(service_id=service.service_id, repository_id=repo.repository_id, start_date=start_date, end_date=end_date, initial_loc=initial_loc)
def list_all_service_names(self): """ Returns ------- """ service_conn = ServiceConn(path_to_db=self.db_path) names = service_conn.list_all_service_names() return names
def get_service(self, service_id=None, service_name=None) -> Service: """ Parameters ---------- service_id: int service_name: str Returns ------- Service """ repo_mgr = RepositoryMgr(path_to_db=self.db_path) service_conn = ServiceConn(path_to_db=self.db_path) service = service_conn.get_service(service_id=service_id, name=service_name) # type: Service service_repo_conn = ServiceRepositoryConn(path_to_db=self.db_path) if service is not None: service_repo_list = service_repo_conn.get_service_repository( service_name=service.name) for sr in service_repo_list: start_date = sr.get('start_date') try: st = datetime.strptime(start_date, '%Y-%m-%d').date() except (TypeError, ValueError) as e: st = datetime(year=1000, month=1, day=1).date() end_date = sr.get('end_date') try: ed = datetime.strptime(end_date, '%Y-%m-%d').date() except (TypeError, ValueError) as e: ed = datetime(year=9999, month=12, day=30).date() repository_id = sr.get('repository_id') initial_loc = sr.get('initial_loc') repo = repo_mgr.get_repository(repository_id=repository_id, start_date=st.isoformat(), end_date=ed.isoformat(), service_id=service.service_id) assert repo is not None, "Error: Repository is None: repository_id={} service_id={}" \ .format(repository_id, service.service_id) service.add_repository(repository=repo, start_date=start_date, end_date=end_date, initial_loc=initial_loc) return service
def insert_service(self, name: str, start_date_str: str): """ Parameters ---------- name: str start_date_str: str Returns ------- int """ service_conn = ServiceConn(path_to_db=self.db_path) try: start_date = datetime.strptime(start_date_str, '%Y-%m-%d').date() except ValueError as e: logging.error(e) raise e service_id = service_conn.insert_service(name=name, start_date=start_date) return service_id
def delete_service(self, service_name): """ delete service and its repositories :param service_name: str :return: bool """ repo_mgr = RepositoryMgr(path_to_db=self.db_path) service = self.get_service(service_name=service_name) if service is None: return True else: for repo_data in service.list_repository_data(): repository = repo_data.get('repository') # type: Repository repo_mgr.delete_repository( repository_id=repository.repository_id) service_conn = ServiceConn(path_to_db=self.db_path) service_id = service_conn.delete_service( service_id=service.service_id) if isinstance(service_id, int): return True else: return False
def setUp(self) -> None: self.db_path = os.getenv('DB_PATH') self.conn = ServiceConn(path_to_db=self.db_path)
class TestServiceConn(TestCase): def setUp(self) -> None: self.db_path = os.getenv('DB_PATH') self.conn = ServiceConn(path_to_db=self.db_path) def test_get_service(self): cursor = self.conn.conn.cursor() sql = 'select name, ID from {};'.format(ServiceConn.TABLE_NAME) rows = cursor.execute(sql) for row in rows: name = row[0] sid = row[1] s = self.conn.get_service(name=name) self.assertIsInstance(s, Service) self.assertEqual(s.service_id, sid) self.assertEqual(s.name, name) def test_get_service_invalid_parameters(self): name = 'fdsfdsfd' s = self.conn.get_service(name=name) self.assertIsNone(s) def test_insert(self): start_date = date(year=2010, month=1, day=1) sid = self.conn.insert_service(name='test_service_name', start_date=start_date) self.assertIsInstance(sid, int) self.assertGreater(sid, 0) self.conn.delete_service(sid) def test_insert_existing_service(self): service_names = self.conn.list_all_service_names() name = random.choice(service_names) s = self.conn.get_service(name=name) self.assertIsInstance(s, Service) sid = self.conn.insert_service(name=s.name, start_date=s.start_date) self.assertEqual(s.service_id, sid) def test_insert_invalid_parameters(self): start_date = date(year=2010, month=1, day=1) with pytest.raises(Exception) as e_info: self.conn.insert_service(name=None, start_date=start_date) self.assertIn('AssertionError', e_info.typename) with pytest.raises(Exception) as e_info: self.conn.insert_service(name='test', start_date=None) self.assertIn('AssertionError', e_info.typename) def test_delete(self): test_name = 'test_service_name' start_date = date(year=2010, month=1, day=1) s = self.conn.get_service(test_name) self.assertIsNone(s) sid = self.conn.insert_service(name=test_name, start_date=start_date) self.assertIsInstance(sid, int) self.assertGreater(sid, 0) s = self.conn.get_service(test_name) self.conn.delete_service(s.service_id) s = self.conn.get_service(test_name) self.assertIsNone(s) def test_update_service(self): service_names = self.conn.list_all_service_names() name = random.choice(service_names) s = self.conn.get_service(name=name) self.assertIsNotNone(s) self.assertIsInstance(s, Service) resp = self.conn.update_service(start_date=s.start_date, service_id=s.service_id, end_date=s.end_date) self.assertTrue(resp)