def serialize_numerical(self, subj, fe, url): """ Serializes a numerical FE found by the normalizer """ literal = fe['literal'] if fe['fe'] == 'Time': value = wikidata.format_date(**literal) yield wikidata.finalize_statement(subj, 'P585', value, self.language, url, resolve_property=False, resolve_value=False) elif fe['fe'] == 'Duration': if 'start' in literal: value = wikidata.format_date(**literal['start']) yield wikidata.finalize_statement(subj, 'P580', value, self.language, url, resolve_property=False, resolve_value=False) if 'end' in literal: value = wikidata.format_date(**literal['end']) yield wikidata.finalize_statement(subj, 'P580', value, self.language, url, resolve_property=False, resolve_value=False)
def find_qualifiers(self, fes): """ Finds all FEs that could serve as qualifiers instead of full statements """ qualifiers = defaultdict(list) for fe in fes: if fe['fe'] == 'Time': literal = fe['literal'] value = wikidata.format_date(**literal) qualifiers['P585'].append(value) elif fe['fe'] == 'Duration': literal = fe['literal'] if 'start' in literal: value = wikidata.format_date(**literal['start']) qualifiers['P580'].append(value) if 'end' in literal: value = wikidata.format_date(**literal['end']) qualifiers['P580'].append(value) elif fe['fe'] == 'Place': value = None if 'link' in fe: value = wikidata.wikidata_id_from_wikipedia_url(fe['link']['uri']) if not value: value = wikidata.resolve('P276', fe['chunk'], self.language) if value: qualifiers['P276'].append(value) return qualifiers
def find_qualifiers(self, fes): """ Finds all FEs that could serve as qualifiers instead of full statements """ qualifiers = defaultdict(list) for fe in fes: if fe["fe"] == "Time": literal = fe["literal"] value = wikidata.format_date(**literal) qualifiers["P585"].append(value) elif fe["fe"] == "Duration": literal = fe["literal"] if "start" in literal: value = wikidata.format_date(**literal["start"]) qualifiers["P580"].append(value) if "end" in literal: value = wikidata.format_date(**literal["end"]) qualifiers["P580"].append(value) elif fe["fe"] == "Place": value = None if "link" in fe: value = wikidata.wikidata_id_from_wikipedia_url(fe["link"]["uri"]) if not value: value = wikidata.resolve("P276", fe["chunk"], self.language) if value: qualifiers["P276"].append(value) return qualifiers
def test_missing(self): self.assertRaises(ValueError, wikidata.format_date, None, None, None) self.assertRaises(ValueError, wikidata.format_date, None, None, 1) self.assertRaises(ValueError, wikidata.format_date, None, 1, None) self.assertRaises(ValueError, wikidata.format_date, 1, None, 1) try: wikidata.format_date(1, 1, 1) wikidata.format_date(1, 1, None) wikidata.format_date(1, None, None) wikidata.format_date(None, 1, 1) except ValueError: self.fail('date should be accepted')
def serialize_numerical(self, subj, fe, data): """ Serializes a numerical FE found by the normalizer """ literal = fe["literal"] wikidata_property = self.lu_fe_map.get((data["lu"], fe["fe"]), {}).get("wid") if not wikidata_property: logger.debug('skipping *numerical* FE of type "%s" and lu "%s"', fe["fe"], data["lu"]) return if fe["fe"] == "Time": value = wikidata.format_date(**literal) yield wikidata.finalize_statement( subj, wikidata_property, value, self.language, data["url"], resolve_property=False, resolve_value=False ) elif fe["fe"] == "Duration": if "start" in literal: value = wikidata.format_date(**literal["start"]) yield wikidata.finalize_statement( subj, wikidata_property, value, self.language, data["url"], resolve_property=False, resolve_value=False, ) if "end" in literal: value = wikidata.format_date(**literal["end"]) yield wikidata.finalize_statement( subj, wikidata_property, value, self.language, data["url"], resolve_property=False, resolve_value=False, )
def serialize_numerical(self, subj, fe, data): """ Serializes a numerical FE found by the normalizer """ literal = fe['literal'] wikidata_property = self.lu_fe_map.get((data['lu'], fe['fe']), {}).get('wid') if not wikidata_property: logger.debug('skipping *numerical* FE of type "%s" and lu "%s"', fe['fe'], data['lu']) return if fe['fe'] == 'Time': value = wikidata.format_date(**literal) yield wikidata.finalize_statement(subj, wikidata_property, value, self.language, data['url'], resolve_property=False, resolve_value=False) elif fe['fe'] == 'Duration': if 'start' in literal: value = wikidata.format_date(**literal['start']) yield wikidata.finalize_statement(subj, wikidata_property, value, self.language, data['url'], resolve_property=False, resolve_value=False) if 'end' in literal: value = wikidata.format_date(**literal['end']) yield wikidata.finalize_statement(subj, wikidata_property, value, self.language, data['url'], resolve_property=False, resolve_value=False)
def test_negative_year(self): self.assertEqual(wikidata.format_date(-100, None, None), '-00000000100-01-01T00:00:00Z/9') self.assertRaises(ValueError, wikidata.format_date, 100, -1, 1) self.assertRaises(ValueError, wikidata.format_date, 100, 1, -1)
def test_date_width(self): self.assertEqual(wikidata.format_date(1967, 1, 17), '+00000001967-01-17T00:00:00Z/11')