Source code for arxiv.taxonomy.category
"""Provides a convenience class for working with arXiv categories."""
from .definitions import CATEGORIES, ARCHIVES_SUBSUMED, CATEGORY_ALIASES, \
ARCHIVES, GROUPS
[docs]class Category(str):
"""Represents an arXiv category."""
lookup = CATEGORIES
@property
def id(self) -> str:
"""Short name for category ID."""
return self
@property
def name(self) -> str:
"""Get the full category name."""
if self in self.lookup:
return str(self.lookup[self]['name'])
raise ValueError('No such category')
@property
def canonical(self) -> 'Category':
"""Get the canonicalized category, if there is one."""
if self in CATEGORY_ALIASES:
return Category(CATEGORY_ALIASES[self])
if self in ARCHIVES_SUBSUMED:
return Category(ARCHIVES_SUBSUMED[self])
return self
@property
def display(self) -> str:
"""
String to use in display of a category.
Examples
--------
Earth and Planetary Astrophysics (astro-ph.EP)
"""
if self in self.lookup:
catname = self.lookup[self]['name']
return f'{catname} ({self})'
parts = self.split('.', 2)
if len(parts) == 2: # Has subject.
(archive, _) = parts
if archive in ARCHIVES:
archive_name = ARCHIVES[archive]['name']
return f'{archive_name} ({archive})'
return self
[docs] def unalias(self) -> 'Category':
"""Follow any EQUIV or SUBSUMED to get the current category."""
if self in CATEGORY_ALIASES:
return Category(CATEGORY_ALIASES[self])
if self in ARCHIVES_SUBSUMED:
return Category(ARCHIVES_SUBSUMED[self])
return self
class Archive(Category):
"""Represents an arXiv archive--the middle level of the taxonomy."""
lookup = ARCHIVES
class Group(Category):
"""Represents an arXiv group--the highest (most general) taxonomy level."""
lookup = GROUPS