diff --git a/README.md b/README.md index f1a5e84..22ac165 100644 --- a/README.md +++ b/README.md @@ -30,20 +30,24 @@ You can also use `swisspair` through a dockerized HTTP API. Refer to https://git ## Usage -The basic interface is as follows: +For the details of the algorithm, refer to https://github.com/karlosss/swisspair. + +A sample usage below. For all available parameters, please refer to [the interface file](https://github.com/karlosss/swisspair-python/blob/a6cc5011aea4942c7b5296947bbf64d317a3f75a/src/swisspair/interface.py). ```python from swisspair import Player, create_matches -players = [Player(id="P1", points=3, rank=1), Player(id="P2", points=0, rank=2)] +p1 = Player(id="P2", points=3, rank=1, can_get_bye=True, cannot_be_paired_against_ids={"P3"}) +p2 = Player(id="P1", points=3, rank=2, can_get_bye=False, cannot_be_paired_against_ids=set()) +p3 = Player(id="P3", points=0, rank=3, can_get_bye=True, cannot_be_paired_against_ids={"P3"}) + +players = [p1, p2, p3] matches = create_matches(players) print(matches) ``` -For all available parameters, please refer to [the interface file](https://github.com/karlosss/swisspair-python/blob/a6cc5011aea4942c7b5296947bbf64d317a3f75a/src/swisspair/interface.py). - ## License MIT, whatever it means. If you like this project, I would be happy for a star :) diff --git a/pyproject.toml b/pyproject.toml index a3bd780..8f8304d 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -13,7 +13,7 @@ author = "Karel Jilek" author_email = "los.karlosss@gmail.com" description = "Python bindings for Swiss pairing algorithm for (not only) Magic: The Gathering." readme = "README.md" -python_requires = ">=3.9" +requires-python = ">=3.9" requires=[] [tool.cibuildwheel.linux] diff --git a/setup.py b/setup.py deleted file mode 100644 index 2730cf3..0000000 --- a/setup.py +++ /dev/null @@ -1,154 +0,0 @@ -import os -import re -import subprocess -import sys -import shutil -from distutils.dir_util import copy_tree -from pathlib import Path - -from setuptools import Extension, setup -from setuptools.command.build_ext import build_ext - -# Convert distutils Windows platform specifiers to CMake -A arguments -PLAT_TO_CMAKE = { - "win32": "Win32", - "win-amd64": "x64", - "win-arm32": "ARM", - "win-arm64": "ARM64", -} - - -# A CMakeExtension needs a sourcedir instead of a file list. -# The name must be the _single_ output extension from the CMake build. -# If you need multiple extensions, see scikit-build. -class CMakeExtension(Extension): - def __init__(self, name: str, sourcedir: str = "") -> None: - super().__init__(name, sources=[]) - self.sourcedir = os.fspath(Path(sourcedir).resolve()) - - -class CMakeBuild(build_ext): - def build_extension(self, ext: CMakeExtension) -> None: - # Must be in this form due to bug in .resolve() only fixed in Python 3.10+ - ext_fullpath = Path.cwd() / self.get_ext_fullpath(ext.name) - extdir = ext_fullpath.parent.resolve() - - # Using this requires trailing slash for auto-detection & inclusion of - # auxiliary "native" libs - - debug = int(os.environ.get("DEBUG", 0)) if self.debug is None else self.debug - cfg = "Debug" if debug else "Release" - - # CMake lets you override the generator - we need to check this. - # Can be set with Conda-Build, for example. - cmake_generator = os.environ.get("CMAKE_GENERATOR", "") - - # Set Python_EXECUTABLE instead if you use PYBIND11_FINDPYTHON - # EXAMPLE_VERSION_INFO shows you how to pass a value into the C++ code - # from Python. - cmake_args = [ - f"-DCMAKE_LIBRARY_OUTPUT_DIRECTORY={extdir}{os.sep}", - f"-DPYTHON_EXECUTABLE={sys.executable}", - f"-DCMAKE_BUILD_TYPE={cfg}", # not used on MSVC, but no harm - ] - build_args = [] - # Adding CMake arguments set as environment variable - # (needed e.g. to build for ARM OSx on conda-forge) - if "CMAKE_ARGS" in os.environ: - cmake_args += [item for item in os.environ["CMAKE_ARGS"].split(" ") if item] - - # In this example, we pass in the version to C++. You might not need to. - cmake_args += [f"-DEXAMPLE_VERSION_INFO={self.distribution.get_version()}"] - - if self.compiler.compiler_type != "msvc": - # Using Ninja-build since it a) is available as a wheel and b) - # multithreads automatically. MSVC would require all variables be - # exported for Ninja to pick it up, which is a little tricky to do. - # Users can override the generator with CMAKE_GENERATOR in CMake - # 3.15+. - if not cmake_generator or cmake_generator == "Ninja": - try: - import ninja - - ninja_executable_path = Path(ninja.BIN_DIR) / "ninja" - cmake_args += [ - "-GNinja", - f"-DCMAKE_MAKE_PROGRAM:FILEPATH={ninja_executable_path}", - ] - except ImportError: - pass - - else: - # Single config generators are handled "normally" - single_config = any(x in cmake_generator for x in {"NMake", "Ninja"}) - - # CMake allows an arch-in-generator style for backward compatibility - contains_arch = any(x in cmake_generator for x in {"ARM", "Win64"}) - - # Specify the arch if using MSVC generator, but only if it doesn't - # contain a backward-compatibility arch spec already in the - # generator name. - if not single_config and not contains_arch: - cmake_args += ["-A", PLAT_TO_CMAKE[self.plat_name]] - - # Multi-config generators have a different way to specify configs - if not single_config: - cmake_args += [ - f"-DCMAKE_LIBRARY_OUTPUT_DIRECTORY_{cfg.upper()}={extdir}" - ] - build_args += ["--config", cfg] - - if sys.platform.startswith("darwin"): - # Cross-compile support for macOS - respect ARCHFLAGS if set - archs = re.findall(r"-arch (\S+)", os.environ.get("ARCHFLAGS", "")) - if archs: - cmake_args += ["-DCMAKE_OSX_ARCHITECTURES={}".format(";".join(archs))] - - # Set CMAKE_BUILD_PARALLEL_LEVEL to control the parallel build level - # across all generators. - if "CMAKE_BUILD_PARALLEL_LEVEL" not in os.environ: - # self.parallel is a Python 3 only way to set parallel jobs by hand - # using -j in the build_ext call, not supported by pip or PyPA-build. - if hasattr(self, "parallel") and self.parallel: - # CMake 3.12+ only. - build_args += [f"-j{self.parallel}"] - - build_temp = Path(self.build_temp) / ext.name - if not build_temp.exists(): - build_temp.mkdir(parents=True) - - build_dir_path = Path.cwd() / "_build" - shutil.rmtree(build_dir_path, ignore_errors=True) - build_dir_path.mkdir(parents=True) - - subprocess.run(["git", "clone", "--recurse-submodules", "https://github.com/karlosss/swisspair.git"], cwd=build_dir_path, check=True) - subprocess.run(["git", "clone", "https://github.com/karlosss/swisspair-python.git"], cwd=build_dir_path, check=True) - - shutil.copy(build_dir_path / "swisspair-python" / "CMakeLists.txt", build_dir_path) - - subprocess.run( - ["cmake", build_dir_path, *cmake_args], cwd=build_dir_path, check=True - ) - - subprocess.run( - ["cmake", "--build", ".", *build_args], cwd=build_dir_path, check=True - ) - - copy_tree(build_dir_path / "swisspair-python" / "src" / "swisspair", extdir / "swisspair") - -# The information here can also be placed in setup.cfg - better separation of -# logic and declaration, and simpler if you include description/version in a file. -setup( - name="swisspair", - version=open("VERSION").read().strip(), - author="Karel Jilek", - author_email="los.karlosss@gmail.com", - description="Python bindings for Swiss pairing algorithm for (not only) Magic: The Gathering.", - long_description=open("README.md").read(), - long_description_content_type="text/markdown", - ext_modules=[CMakeExtension("_swisspair")], - cmdclass={"build_ext": CMakeBuild}, - zip_safe=False, - python_requires=">=3.9", - requires=[] -)