116 lines
7.2 KiB
Python
116 lines
7.2 KiB
Python
"""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()
|