class ProcessorTest(object): def __init__(self, filename): with open(filename, encoding='UTF-8') as f: self.json_data = json.load(f) csl_io = io.BytesIO(utf_8_encode(self.json_data['csl'])[0]) self.style = CitationStylesStyle(csl_io) self._fix_input(self.json_data['input']) self.references = [item['id'] for item in self.json_data['input']] self.references_dict = CiteProcJSON(self.json_data['input']) self.bibliography = CitationStylesBibliography(self.style, self.references_dict) self.expected = self.json_data['result'].splitlines() @staticmethod def _fix_input(input_data): for i, ref in enumerate(input_data): if 'id' not in ref: ref['id'] = i if 'type' not in ref: ref['type'] = 'book' def execute(self): if self.json_data['citation_items']: citations = [self.parse_citation(item) for item in self.json_data['citation_items']] elif self.json_data['citations']: citations = [] for cit in self.json_data['citations']: cit = cit[0] citation_items = [self.parse_citation_item(cititem) for cititem in cit['citationItems']] citation = Citation(citation_items) citation.key = cit['citationID'] citation.note_index = cit['properties']['noteIndex'] citations.append(citation) elif self.json_data['bibentries']: citation_items = [self.parse_citation_item({'id': entry}) for entry in self.json_data['bibentries'][-1]] citations = [Citation(citation_items)] else: citation_items = [self.parse_citation_item({'id': ref}) for ref in self.references] citations = [Citation(citation_items)] for citation in citations: self.bibliography.register(citation) if self.style.has_bibliography(): self.bibliography.sort() results = [] do_nothing = lambda x: None # callback passed to cite() if self.json_data['mode'] == 'citation': if self.json_data['citations']: for i, citation in enumerate(citations): if i == len(citations) - 1: dots_or_other = '>>' else: dots_or_other = '..' results.append('{}[{}] '.format(dots_or_other, i) + self.bibliography.cite(citation, do_nothing)) else: for citation in citations: results.append(self.bibliography.cite(citation, do_nothing)) elif self.json_data['mode'] in ('bibliography', 'bibliography-nosort'): results.append(self.bibliography.bibliography()) return results def parse_citation(self, citation_data): citation_items = [] for item in citation_data: citation_item = self.parse_citation_item(item) citation_items.append(citation_item) return Citation(citation_items) def parse_citation_item(self, citation_item_data): options = {} for key, value in citation_item_data.items(): python_key = key.replace('-', '_') if python_key == 'id': reference_key = str(value) continue elif python_key == 'locator': try: options['locator'] = Locator(citation_item_data['label'], value) except KeyError: # some tests don't specify the label options['locator'] = Locator('page', value) elif python_key == 'label': pass else: options[python_key] = value return CitationItem(reference_key, **options)
class ProcessorTest(object): """Parses atest fixture and provides a method for processing the tests defined in it.""" bib_prefix = '<div class="csl-bib-body">' bib_suffix = '</div>' item_prefix = ' <div class="csl-entry">' item_suffix = '</div>' def __init__(self, filename): self.csl_test = CslTest({}, None, (filename, ), os.path.basename(filename)) self.csl_test.parse() csl_io = io.BytesIO(utf_8_encode(self.data['csl'])[0]) self.style = CitationStylesStyle(csl_io) self._fix_input(self.data['input']) self.references = [item['id'] for item in self.data['input']] self.references_dict = CiteProcJSON(self.data['input']) self.bibliography = CitationStylesBibliography(self.style, self.references_dict) self.expected = self.data['result'].splitlines() @property def data(self): return self.csl_test.data @staticmethod def _fix_input(input_data): for i, ref in enumerate(input_data): if 'id' not in ref: ref['id'] = i if 'type' not in ref: ref['type'] = 'book' def execute(self): if self.data['citation_items']: citations = [ self.parse_citation(item) for item in self.data['citation_items'] ] elif self.data['citations']: citations = [] for cit in self.data['citations']: cit = cit[0] citation_items = [ self.parse_citation_item(cititem) for cititem in cit['citationItems'] ] citation = Citation(citation_items) if 'citationID' in cit: citation.key = cit['citationID'] citation.note_index = cit['properties']['noteIndex'] citations.append(citation) elif self.data['bibentries']: citation_items = [ self.parse_citation_item({'id': entry}) for entry in self.data['bibentries'][-1] ] citations = [Citation(citation_items)] else: citation_items = [ self.parse_citation_item({'id': ref}) for ref in self.references ] citations = [Citation(citation_items)] for citation in citations: self.bibliography.register(citation) if self.style.has_bibliography(): self.bibliography.sort() results = [] do_nothing = lambda x: None # callback passed to cite() if self.data['mode'] == 'citation': if self.data['citations']: for i, citation in enumerate(citations): if i == len(citations) - 1: dots_or_other = '>>' else: dots_or_other = '..' results.append( '{}[{}] '.format(dots_or_other, i) + self.bibliography.cite(citation, do_nothing)) else: for citation in citations: results.append(self.bibliography.cite( citation, do_nothing)) elif self.data['mode'] in ('bibliography', 'bibliography-nosort'): results.append(self.bib_prefix) for entry in self.bibliography.bibliography(): text = self.item_prefix + str(entry) + self.item_suffix results.append(text) results.append(self.bib_suffix) return results def parse_citation(self, citation_data): citation_items = [] for item in citation_data: citation_item = self.parse_citation_item(item) citation_items.append(citation_item) return Citation(citation_items) def parse_citation_item(self, citation_item_data): options = {} for key, value in citation_item_data.items(): python_key = key.replace('-', '_') if python_key == 'id': reference_key = str(value) continue elif python_key == 'locator': try: options['locator'] = Locator(citation_item_data['label'], value) except KeyError: # some tests don't specify the label options['locator'] = Locator('page', value) elif python_key == 'label': pass else: options[python_key] = value return CitationItem(reference_key, **options)
class ProcessorTest(object): def __init__(self, filename): with open(filename, encoding='UTF-8') as f: self.json_data = json.load(f) csl_io = io.BytesIO(utf_8_encode(self.json_data['csl'])[0]) self.style = CitationStylesStyle(csl_io) self._fix_input(self.json_data['input']) self.references = [item['id'] for item in self.json_data['input']] self.references_dict = CiteProcJSON(self.json_data['input']) self.bibliography = CitationStylesBibliography(self.style, self.references_dict) self.expected = self.json_data['result'].splitlines() @staticmethod def _fix_input(input_data): for i, ref in enumerate(input_data): if 'id' not in ref: ref['id'] = i if 'type' not in ref: ref['type'] = 'book' def execute(self): if self.json_data['citation_items']: citations = [ self.parse_citation(item) for item in self.json_data['citation_items'] ] elif self.json_data['citations']: citations = [] for cit in self.json_data['citations']: cit = cit[0] citation_items = [ self.parse_citation_item(cititem) for cititem in cit['citationItems'] ] citation = Citation(citation_items) citation.key = cit['citationID'] citation.note_index = cit['properties']['noteIndex'] citations.append(citation) elif self.json_data['bibentries']: citation_items = [ self.parse_citation_item({'id': entry}) for entry in self.json_data['bibentries'][-1] ] citations = [Citation(citation_items)] else: citation_items = [ self.parse_citation_item({'id': ref}) for ref in self.references ] citations = [Citation(citation_items)] for citation in citations: self.bibliography.register(citation) if self.style.has_bibliography(): self.bibliography.sort() results = [] do_nothing = lambda x: None # callback passed to cite() if self.json_data['mode'] == 'citation': if self.json_data['citations']: for i, citation in enumerate(citations): if i == len(citations) - 1: dots_or_other = '>>' else: dots_or_other = '..' results.append( '{}[{}] '.format(dots_or_other, i) + self.bibliography.cite(citation, do_nothing)) else: for citation in citations: results.append(self.bibliography.cite( citation, do_nothing)) elif self.json_data['mode'] in ('bibliography', 'bibliography-nosort'): results.append(self.bibliography.bibliography()) return results def parse_citation(self, citation_data): citation_items = [] for item in citation_data: citation_item = self.parse_citation_item(item) citation_items.append(citation_item) return Citation(citation_items) def parse_citation_item(self, citation_item_data): options = {} for key, value in citation_item_data.items(): python_key = key.replace('-', '_') if python_key == 'id': reference_key = str(value) continue elif python_key == 'locator': try: options['locator'] = Locator(citation_item_data['label'], value) except KeyError: # some tests don't specify the label options['locator'] = Locator('page', value) elif python_key == 'label': pass else: options[python_key] = value return CitationItem(reference_key, **options)