"""Regression coverage for primary series once named Workshop, with strict scope boundaries.""" from contextlib import closing import hashlib import json from pathlib import Path import sqlite3 import tempfile import unittest from paper_atlas.collectors.dblp_records import normalize_row from paper_atlas.collectors.dblp_scope import scope from paper_atlas.ingestion.records import ingest_file ICML_HISTORY = 'https://icml.cc/Conferences/2008/past_icmls.shtml.html' IROS_HISTORY = 'https://www.ieee-ras.org/conferences-workshops/financially-co-sponsored/iros/iros-past-and-future-venues/' class HistoricalPrimarySeriesTests(unittest.TestCase): def example(self, family, year, title, book=None, key=None): key = key or f'conf/{family}/{year}' book = book or ('ML' if family == 'icml' else 'IROS') row = {'record_type':'inproceedings', 'key':f'conf/{family}/Paper{year}', 'publtype':None, 'fields':{'title':['An independently identified historical research paper'], 'author':['Jane Doe'], 'booktitle':[book], 'year':[str(year)], 'crossref':[key], 'ee':[f'https://doi.org/10.1234/{family}.{year}']}} volume = {'record_type':'proceedings', 'key':key, 'fields':{'title':[title], 'year':[str(year)]}} return row, volume def test_icml_workshop_primary_editions_are_not_silently_filtered(self): examples = { 1989:'Proceedings of the Sixth International Workshop on Machine Learning (ML 1989), Cornell University, Ithaca, New York, USA, June 26-27, 1989', 1991:'Proceedings of the Eighth International Workshop (ML91), Northwestern University, Evanston, Illinois, USA', 1992:'Proceedings of the Ninth International Workshop on Machine Learning (ML 1992), Aberdeen, Scotland, UK, July 1-3, 1992', } for year, title in examples.items(): with self.subTest(year=year): row, volume = self.example('icml', year, title) record, reason = normalize_row(row, {volume['key']:volume}, {'ICML'}) self.assertIsNone(reason) self.assertEqual((record['venue'],record['year'],record['track'],record['status']), ('ICML',year,'main','accepted')) self.assertEqual(record['metadata']['proceedings_title'], title) self.assertEqual(record['metadata']['track_scope_evidence_url'], ICML_HISTORY) self.assertEqual(record['metadata']['bibliographic_year'], year) def test_iros_first_three_editions_are_primary_series(self): examples = { 1988:"IEEE International Workshop on Intelligent Robots and Systems '88, Proceedings. IROS 1988, Tokyo, Japan, October 31 - November 2, 1988", 1989:"IEEE International Workshop on Intelligent Robots and Systems '89, Proceedings. IROS 1989, September 4-6, 1989, Tsukuba, Japan", 1990:"IEEE International Workshop on Intelligent Robots and Systems '90, Towards a New Frontier of Applications, Proceedings. IROS 1990, July 3-6, 1990, Ibaraki, Japan", } for year, title in examples.items(): with self.subTest(year=year): row, volume = self.example('iros', year, title) record, reason = normalize_row(row, {volume['key']:volume}, {'IROS'}) self.assertIsNone(reason) self.assertEqual((record['venue'],record['year'],record['track']), ('IROS',year,'main')) self.assertEqual(record['metadata']['proceedings_title'], title) self.assertEqual(record['metadata']['track_scope_evidence_url'], IROS_HISTORY) def test_main_named_icml_predecessors_also_carry_primary_scope_provenance(self): examples = { 1988:'Machine Learning, Proceedings of the Fifth International Conference on Machine Learning, Ann Arbor, Michigan, USA, June 12-14, 1988', 1990:'Machine Learning, Proceedings of the Seventh International Conference on Machine Learning, Austin, Texas, USA, June 21-23, 1990', } for year, title in examples.items(): row, volume = self.example('icml', year, title) edition, reason = scope(row, volume) self.assertIsNone(reason) self.assertEqual(edition['track'], 'main') self.assertEqual(edition['track_scope_evidence_url'], ICML_HISTORY) def test_wrong_keys_titles_suffixes_and_unknown_years_keep_workshop_boundary(self): title = 'Proceedings of the Eighth International Workshop (ML91), Northwestern University, Evanston, Illinois, USA' for year, changed, book, key in [ (1991,title,'ML','conf/icml/1991w'), (1991,title,'ML (Workshops)','conf/icml/1991'), (1991,title.replace('Eighth','Ninth'),'ML','conf/icml/1991'), (1991,title + ', Affiliated Workshop','ML','conf/icml/1991'), (1987,'Machine Learning Workshop 1987, Irvine','ML','conf/icml/1987'), ]: with self.subTest(year=year, book=book, key=key, title=changed): row, volume = self.example('icml',year,changed,book,key) record, reason = normalize_row(row,{volume['key']:volume},{'ICML'}) self.assertIsNone(record) self.assertEqual(reason,'separate_workshop') self.assertNotIn('track_scope_evidence_url',scope(row,volume)[0]) title = "IEEE International Workshop on Intelligent Robots and Systems '88, Proceedings. IROS 1988, Tokyo, Japan, October 31 - November 2, 1988" for changed, book, key in [ (title,'IROS','conf/iros/1988w'), (title,'IROS (Workshops)','conf/iros/1988'), (title.replace('Tokyo','Another city'),'IROS','conf/iros/1988'), ]: row, volume = self.example('iros',1988,changed,book,key) self.assertEqual(normalize_row(row,{volume['key']:volume},{'IROS'})[1],'separate_workshop') def test_primary_scope_proof_survives_native_file_ingestion(self): title = 'Proceedings of the Eighth International Workshop (ML91), Northwestern University, Evanston, Illinois, USA' row, volume = self.example('icml',1991,title) record, reason = normalize_row(row,{volume['key']:volume},{'ICML'}) self.assertIsNone(reason) with tempfile.TemporaryDirectory() as temporary: root=Path(temporary);path=root/'records.jsonl';path.write_text(json.dumps(record)+'\n') path.with_suffix('.manifest.json').write_text(json.dumps({'source':'dblp','count':1,'list_url':ICML_HISTORY,'file_sha256':hashlib.sha256(path.read_bytes()).hexdigest()})) ingest_file(root/'test.sqlite',path) with closing(sqlite3.connect(root/'test.sqlite')) as connection: self.assertEqual(connection.execute('SELECT track FROM editions').fetchone()[0],'main') self.assertEqual(connection.execute('SELECT status FROM decisions').fetchone()[0],'accepted') metadata=json.loads(connection.execute('SELECT metadata_json FROM source_records').fetchone()[0]) self.assertEqual(metadata['proceedings_title'],title) self.assertEqual(metadata['track_scope_evidence_url'],ICML_HISTORY) if __name__ == '__main__': unittest.main()