From acb4322a5f1010170eeb5a09c1bf9b380e16b4c1 Mon Sep 17 00:00:00 2001 From: tanzhijian Date: Wed, 7 Feb 2024 20:31:40 +0800 Subject: [PATCH] singleton --- fifacodes/__init__.py | 18 ++++++++++++++++-- pyproject.toml | 2 +- tests/test_fifacodes.py | 6 ++++++ 3 files changed, 23 insertions(+), 3 deletions(-) diff --git a/fifacodes/__init__.py b/fifacodes/__init__.py index 2701475..728eaec 100644 --- a/fifacodes/__init__.py +++ b/fifacodes/__init__.py @@ -1,11 +1,12 @@ import csv +from abc import ABCMeta from collections.abc import Mapping from pathlib import Path from typing import Any, Callable, Generator, Iterator, NamedTuple from rapidfuzz import process -__version__ = "0.1.2" +__version__ = "0.1.3" _DATA_PATH = Path(__file__).parent _DEFAULT_DATA_PATH = _DATA_PATH / "default.csv" @@ -20,7 +21,20 @@ class Member(NamedTuple): _DataTypes = dict[str, Member] -class Members(Mapping[str, Member]): +class Singleton(ABCMeta): + """ + A metaclass for creating singletons. + """ + + _instances: dict[type, Any] = {} + + def __call__(cls, *args: Any, **kwargs: Any) -> Any: + if cls not in cls._instances: + cls._instances[cls] = super().__call__(*args, **kwargs) + return cls._instances[cls] + + +class Members(Mapping[str, Member], metaclass=Singleton): """ A mapping of FIFA member codes to member names. diff --git a/pyproject.toml b/pyproject.toml index bbdbaed..3267aa8 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "fifacodes" -version = "0.1.2" +version = "0.1.3" description = "FIFA member associations codes query and search." authors = ["tanzhijian "] license = "MIT" diff --git a/tests/test_fifacodes.py b/tests/test_fifacodes.py index 4dbf3fa..87774c2 100644 --- a/tests/test_fifacodes.py +++ b/tests/test_fifacodes.py @@ -3,6 +3,12 @@ from fifacodes import Members +def test_singleton() -> None: + s1 = Members() + s2 = Members() + assert s1 is s2 + + class TestMembers: @pytest.fixture(scope="class") def members(self) -> Members: