def make_tests_delta(self): """Add tests delta between two latest test rounds to json_stats.""" logger.info(f'Generating tests delta for {self.model_name}.') date = self.latest_round.date_str[:10] test_name = None test_data = self.latest_round.json_results[0].get('test_data') if test_data: test_name = test_data.get('name') if not self.previous_round: tests_delta = { 'applied_hashes_delta': { 'added': [], 'removed': [] } } else: applied_delta = self.latest_round.find_delta_hashes( self.previous_round, 'applied_tests') tests_delta = {'applied_hashes_delta': applied_delta} msg = _make_delta_msg(self.model_name, 'applied_tests', applied_delta, date, test_corpus=self.test_corpus, test_name=test_name) if msg: logger.info(msg['message']) for mc_type in self.latest_round.mc_types_results: if not self.previous_round or mc_type not in \ self.previous_round.mc_types_results: tests_delta[mc_type] = { 'passed_hashes_delta': { 'added': [], 'removed': [] } } else: passed_delta = self.latest_round.find_delta_hashes( self.previous_round, 'passed_tests', mc_type=mc_type) tests_delta[mc_type] = {'passed_hashes_delta': passed_delta} msg = _make_delta_msg(self.model_name, 'passed_tests', passed_delta, date, mc_type, test_corpus=self.test_corpus, test_name=test_name) if msg: logger.info(msg['message']) self.json_stats['tests_delta'] = tests_delta
def test_delta_msg(): # No message when no delta msg = _make_delta_msg('test', 'stmts', {'added': []}, '2020-01-01', new_papers=2) assert not msg # No message with no new papers msg = _make_delta_msg('test', 'stmts', {'added': [1234, 2345]}, '2020-01-01', new_papers=None) assert not msg, msg # New statements with new papers message msg = _make_delta_msg('test', 'stmts', {'added': [1234, 2345]}, '2020-01-01', new_papers=5) assert set(msg.keys()) == { 'message', 'start', 'middle', 'delta_part', 'url'} assert msg['message'] == ( 'Today I read 5 new publications and learned 2 new mechanisms. See ' 'https://emmaa.indra.bio/dashboard/test?tab=model&date=' '2020-01-01#addedStmts for more details.'), msg['message'] # New applied tests message msg = _make_delta_msg('test', 'applied_tests', {'added': [1234, 2345]}, '2020-01-01', test_corpus='simple_tests', test_name='Simple tests corpus') assert set(msg.keys()) == { 'message', 'start', 'middle', 'delta_part', 'url'} assert msg['message'] == ( 'Today I applied 2 new tests in the Simple tests corpus. ' 'See https://emmaa.indra.bio/dashboard/test?' 'tab=tests&test_corpus=simple_tests&date=2020-01-01' '#newAppliedTests for more details.'), msg['message'] # New passed tests message msg = _make_delta_msg('test', 'passed_tests', {'added': [1234, 2345]}, '2020-01-01', 'pysb', test_corpus='simple_tests', test_name='Simple tests corpus', is_tweet=True) assert set(msg.keys()) == { 'message', 'start', 'middle', 'delta_part', 'url'} assert msg['message'] == ( 'Today I explained 2 new observations in the Simple tests ' 'corpus with my @PySysBio model. See ' 'https://emmaa.indra.bio/dashboard/test?tab=tests' '&test_corpus=simple_tests&date=2020-01-01#newPassedTests ' 'for more details.'), msg['message']
def make_model_delta(self): """Add model delta between two latest model states to json_stats.""" logger.info(f'Generating model delta for {self.model_name}.') if not self.previous_round: self.json_stats['model_delta'] = { 'statements_hashes_delta': { 'added': [], 'removed': [] } } else: stmts_delta = self.latest_round.find_delta_hashes( self.previous_round, 'statements') self.json_stats['model_delta'] = { 'statements_hashes_delta': stmts_delta } msg = _make_delta_msg(self.model_name, 'stmts', stmts_delta, self.latest_round.date_str[:10]) if msg: logger.info(msg['message'])
def get_all_update_messages(deltas, is_tweet=False): """Get all messages for model deltas that can be further used in tweets and email notifications. Parameters ---------- deltas : dict A dictionary containing deltas for a model and its test results returned by get_model_deltas function. is_tweet : bool Whether messages are generated for Twitter (used to determine the formatting of model types). Returns ------- msg_dicts : list[dict] A list of individual message dictionaries that can be used for tweets or email notifications. """ msg_dicts = [] model_name = deltas['model_name'] date = deltas['date'] # Model message stmts_delta = deltas.get('stmts_delta') new_papers = deltas.get('new_papers') stmts_msg = _make_delta_msg(model_name, 'stmts', stmts_delta, date, new_papers=new_papers, is_tweet=is_tweet) if stmts_msg: logger.info(stmts_msg['message']) msg_dicts.append(stmts_msg) # Tests messages for test_corpus, test_delta in deltas['tests'].items(): applied_delta = test_delta.get('applied_tests') test_name = test_delta.get('name') applied_msg = _make_delta_msg(model_name, 'applied_tests', applied_delta, date, test_corpus=test_corpus, test_name=test_name, is_tweet=is_tweet) if applied_msg: logger.info(applied_msg['message']) msg_dicts.append(applied_msg) for mc_type in test_delta.get('passed', {}): passed_delta = test_delta['passed'][mc_type] passed_msg = _make_delta_msg(model_name, 'passed_tests', passed_delta, date, mc_type, test_corpus=test_corpus, test_name=test_name, is_tweet=is_tweet) if passed_msg: logger.info(passed_msg['message']) msg_dicts.append(passed_msg) return msg_dicts