From c84b047adcd3c583027ef253c1cbf610359e4c92 Mon Sep 17 00:00:00 2001 From: Gregory Oschwald Date: Wed, 22 Jan 2025 14:08:00 -0800 Subject: [PATCH] Require record arguments to be keyword arguments This makes it easier to maintain going forward. --- HISTORY.rst | 2 ++ geoip2/records.py | 32 ++++++++++++++++++++++---------- 2 files changed, 24 insertions(+), 10 deletions(-) diff --git a/HISTORY.rst b/HISTORY.rst index e83cd25..4d1e1ed 100644 --- a/HISTORY.rst +++ b/HISTORY.rst @@ -10,6 +10,8 @@ History * BREAKING: The ``raw`` attribute on the model classes has been replaced with a ``to_dict()`` method. This can be used to get a representation of the object that is suitable for serialization. +* BREAKING: The record classes now require all arguments other than ``locales`` + to be keyword arguments. * BREAKING: ``geoip2.mixins`` has been made internal. This normally would not have been used by external code. * IMPORTANT: Python 3.9 or greater is required. If you are using an older diff --git a/geoip2/records.py b/geoip2/records.py index 250f3b3..9f128d8 100644 --- a/geoip2/records.py +++ b/geoip2/records.py @@ -32,8 +32,8 @@ class PlaceRecord(Record, metaclass=ABCMeta): def __init__( self, - locales: Optional[Sequence[str]] = None, - names: Optional[Dict[str, str]] = None, + locales: Optional[Sequence[str]], + names: Optional[Dict[str, str]], ) -> None: if locales is None: locales = ["en"] @@ -93,7 +93,8 @@ class City(PlaceRecord): def __init__( self, - locales: Optional[Sequence[str]] = None, + locales: Optional[Sequence[str]], + *, confidence: Optional[int] = None, geoname_id: Optional[int] = None, names: Optional[Dict[str, str]] = None, @@ -147,7 +148,8 @@ class Continent(PlaceRecord): def __init__( self, - locales: Optional[Sequence[str]] = None, + locales: Optional[Sequence[str]], + *, code: Optional[str] = None, geoname_id: Optional[int] = None, names: Optional[Dict[str, str]] = None, @@ -217,7 +219,8 @@ class Country(PlaceRecord): def __init__( self, - locales: Optional[Sequence[str]] = None, + locales: Optional[Sequence[str]], + *, confidence: Optional[int] = None, geoname_id: Optional[int] = None, is_in_european_union: bool = False, @@ -298,7 +301,8 @@ class RepresentedCountry(Country): def __init__( self, - locales: Optional[Sequence[str]] = None, + locales: Optional[Sequence[str]], + *, confidence: Optional[int] = None, geoname_id: Optional[int] = None, is_in_european_union: bool = False, @@ -310,7 +314,12 @@ def __init__( ) -> None: self.type = type super().__init__( - locales, confidence, geoname_id, is_in_european_union, iso_code, names + locales, + confidence=confidence, + geoname_id=geoname_id, + is_in_european_union=is_in_european_union, + iso_code=iso_code, + names=names, ) @@ -391,6 +400,7 @@ class Location(Record): def __init__( self, + *, average_income: Optional[int] = None, accuracy_radius: Optional[int] = None, latitude: Optional[float] = None, @@ -425,7 +435,7 @@ class MaxMind(Record): queries_remaining: Optional[int] - def __init__(self, queries_remaining: Optional[int] = None, **_) -> None: + def __init__(self, *, queries_remaining: Optional[int] = None, **_) -> None: self.queries_remaining = queries_remaining @@ -460,7 +470,7 @@ class Postal(Record): confidence: Optional[int] def __init__( - self, code: Optional[str] = None, confidence: Optional[int] = None, **_ + self, *, code: Optional[str] = None, confidence: Optional[int] = None, **_ ) -> None: self.code = code self.confidence = confidence @@ -519,7 +529,8 @@ class Subdivision(PlaceRecord): def __init__( self, - locales: Optional[Sequence[str]] = None, + locales: Optional[Sequence[str]], + *, confidence: Optional[int] = None, geoname_id: Optional[int] = None, iso_code: Optional[str] = None, @@ -850,6 +861,7 @@ class Traits(Record): def __init__( self, + *, autonomous_system_number: Optional[int] = None, autonomous_system_organization: Optional[str] = None, connection_type: Optional[str] = None,