Use pyproject.toml (#598)

This commit is contained in:
Inada Naoki
2023-05-15 13:22:35 +09:00
committed by GitHub
parent cbd894c3b1
commit 89c1e0f3c6
11 changed files with 223 additions and 261 deletions

1
.gitignore vendored
View File

@@ -10,5 +10,4 @@
.tox/
build/
dist/
MySQLdb/release.py
.coverage

View File

@@ -1,12 +1,7 @@
recursive-include doc *.rst
recursive-include tests *.py
include doc/conf.py
include MANIFEST.in
include HISTORY.rst
include README.md
include LICENSE
include metadata.cfg
include site.cfg
include setup_common.py
include setup_posix.py
include setup_windows.py

View File

@@ -14,3 +14,8 @@ clean:
find . -name '*.pyc' -delete
find . -name '__pycache__' -delete
rm -rf build
.PHONY: check
check:
ruff .
black *.py MySQLdb

View File

@@ -13,15 +13,14 @@ For information on how MySQLdb handles type conversion, see the
MySQLdb.converters module.
"""
# Check if the version of _mysql matches the version of MySQLdb.
from MySQLdb.release import version_info
from .release import version_info
from . import _mysql
if version_info != _mysql.version_info:
raise ImportError(
"this is MySQLdb version {}, but _mysql is version {!r}\n_mysql: {!r}".format(
version_info, _mysql.version_info, _mysql.__file__
)
f"this is MySQLdb version {version_info}, "
f"but _mysql is version {_mysql.version_info!r}\n"
f"_mysql: {_mysql.__file__!r}"
)

3
MySQLdb/release.py Normal file
View File

@@ -0,0 +1,3 @@
__author__ = "Inada Naoki <songofacandy@gmail.com>"
version_info = (2, 2, 0, "dev", 0)
__version__ = "2.2.0.dev0"

View File

@@ -1,41 +0,0 @@
[metadata]
name: mysqlclient
version: 2.2.0dev0
version_info: (2,2,0,'dev',0)
description: Python interface to MySQL
author: Inada Naoki
author_email: songofacandy@gmail.com
license: GPL
platforms: ALL
url: https://github.com/PyMySQL/mysqlclient
classifiers:
Development Status :: 5 - Production/Stable
Environment :: Other Environment
License :: OSI Approved :: GNU General Public License (GPL)
Operating System :: MacOS :: MacOS X
Operating System :: Microsoft :: Windows :: Windows NT/2000
Operating System :: OS Independent
Operating System :: POSIX
Operating System :: POSIX :: Linux
Operating System :: Unix
Programming Language :: C
Programming Language :: Python
Programming Language :: Python :: 3
Programming Language :: Python :: 3.8
Programming Language :: Python :: 3.9
Programming Language :: Python :: 3.10
Programming Language :: Python :: 3.11
Topic :: Database
Topic :: Database :: Database Engines/Servers
py_modules:
MySQLdb._exceptions
MySQLdb.connections
MySQLdb.converters
MySQLdb.cursors
MySQLdb.release
MySQLdb.times
MySQLdb.constants.CLIENT
MySQLdb.constants.CR
MySQLdb.constants.ER
MySQLdb.constants.FIELD_TYPE
MySQLdb.constants.FLAG

48
pyproject.toml Normal file
View File

@@ -0,0 +1,48 @@
[project]
name = "mysqlclient"
# version = "2.2.0dev0"
description = "Python interface to MySQL"
readme = "README.md"
requires-python = ">=3.8"
authors = [
{name = "Inada Naoki", email = "songofacandy@gmail.com"}
]
license = {text = "GNU General Public License v2 (GPLv2)"}
keywords = ["MySQL"]
classifiers = [
"Development Status :: 5 - Production/Stable",
"Environment :: Other Environment",
"License :: OSI Approved :: GNU General Public License (GPL)",
"Operating System :: MacOS :: MacOS X",
"Operating System :: Microsoft :: Windows :: Windows NT/2000",
"Operating System :: OS Independent",
"Operating System :: POSIX",
"Operating System :: POSIX :: Linux",
"Operating System :: Unix",
"Programming Language :: C",
"Programming Language :: Python",
"Programming Language :: Python :: 3",
"Programming Language :: Python :: 3.8",
"Programming Language :: Python :: 3.9",
"Programming Language :: Python :: 3.10",
"Programming Language :: Python :: 3.11",
"Topic :: Database",
"Topic :: Database :: Database Engines/Servers",
]
dynamic = ["version"]
[project.urls]
Project = "https://github.com/PyMySQL/mysqlclient"
Documentation = "https://mysqlclient.readthedocs.io/"
[build-system]
requires = ["setuptools>=61"]
build-backend = "setuptools.build_meta"
[tool.setuptools.packages.find]
namespaces = false
include = ["MySQLdb*"]
exclude = ["tests*", "pymysql.tests*"]
[tool.setuptools.dynamic]
version = {attr = "MySQLdb.release.__version__"}

177
setup.py
View File

@@ -1,22 +1,171 @@
#!/usr/bin/env python
import os
import subprocess
import sys
import setuptools
from configparser import ConfigParser
if os.name == "posix":
from setup_posix import get_config
else: # assume windows
from setup_windows import get_config
with open("README.md", encoding="utf-8") as f:
readme = f.read()
release_info = {}
with open("MySQLdb/release.py", encoding="utf-8") as f:
exec(f.read(), None, release_info)
metadata, options = get_config()
metadata["ext_modules"] = [
setuptools.Extension("MySQLdb._mysql", sources=["MySQLdb/_mysql.c"], **options)
def find_package_name():
"""Get available pkg-config package name"""
packages = ["mysqlclient", "mariadb"]
for pkg in packages:
try:
cmd = f"pkg-config --exists {pkg}"
print(f"Trying {cmd}")
subprocess.check_call(cmd, shell=True)
except subprocess.CalledProcessError as err:
print(err)
else:
return pkg
raise Exception(
"Can not find valid pkg-config name.\n"
"Specify MYSQLCLIENT_CFLAGS and MYSQLCLIENT_LDFLAGS env vars manually"
)
def get_config_posix(options=None):
# allow a command-line option to override the base config file to permit
# a static build to be created via requirements.txt
# TODO: find a better way for
static = False
if "--static" in sys.argv:
static = True
sys.argv.remove("--static")
ldflags = os.environ.get("MYSQLCLIENT_LDFLAGS")
cflags = os.environ.get("MYSQLCLIENT_CFLAGS")
pkg_name = None
static_opt = " --static" if static else ""
if not (cflags and ldflags):
pkg_name = find_package_name()
if not cflags:
cflags = subprocess.check_output(
f"pkg-config{static_opt} --cflags {pkg_name}", encoding="utf-8", shell=True
)
if not ldflags:
ldflags = subprocess.check_output(
f"pkg-config{static_opt} --libs {pkg_name}", encoding="utf-8", shell=True
)
cflags = cflags.split()
for f in cflags:
if f.startswith("-std="):
break
else:
cflags += ["-std=c99"]
ldflags = ldflags.split()
define_macros = [
("version_info", release_info["version_info"]),
("__version__", release_info["__version__"]),
]
ext_options = dict(
extra_compile_args=cflags,
extra_link_args=ldflags,
define_macros=define_macros,
)
# newer versions of gcc require libstdc++ if doing a static build
if static:
ext_options["language"] = "c++"
print("Options for building extention module:")
for k, v in ext_options.items():
print(f" {k}: {v}")
return ext_options
def get_config_win32(options):
client = "mariadbclient"
connector = os.environ.get("MYSQLCLIENT_CONNECTOR", options.get("connector"))
if not connector:
connector = os.path.join(
os.environ["ProgramFiles"], "MariaDB", "MariaDB Connector C"
)
extra_objects = []
library_dirs = [
os.path.join(connector, "lib", "mariadb"),
os.path.join(connector, "lib"),
]
libraries = [
"kernel32",
"advapi32",
"wsock32",
"shlwapi",
"Ws2_32",
"crypt32",
"secur32",
"bcrypt",
client,
]
include_dirs = [
os.path.join(connector, "include", "mariadb"),
os.path.join(connector, "include"),
]
extra_link_args = ["/MANIFEST"]
define_macros = [
("version_info", release_info["version_info"]),
("__version__", release_info["__version__"]),
]
ext_options = dict(
library_dirs=library_dirs,
libraries=libraries,
extra_link_args=extra_link_args,
include_dirs=include_dirs,
extra_objects=extra_objects,
define_macros=define_macros,
)
return ext_options
def enabled(options, option):
value = options[option]
s = value.lower()
if s in ("yes", "true", "1", "y"):
return True
elif s in ("no", "false", "0", "n"):
return False
else:
raise ValueError(f"Unknown value {value} for option {option}")
def get_options():
config = ConfigParser()
config.read(["site.cfg"])
options = dict(config.items("options"))
options["static"] = enabled(options, "static")
return options
if sys.platform == "win32":
ext_options = get_config_win32(get_options())
else:
ext_options = get_config_posix(get_options())
print("# Extention options")
for k, v in ext_options.items():
print(f" {k}: {v}")
ext_modules = [
setuptools.Extension(
"MySQLdb._mysql",
sources=["MySQLdb/_mysql.c"],
**ext_options,
)
]
metadata["long_description"] = readme
metadata["long_description_content_type"] = "text/markdown"
metadata["python_requires"] = ">=3.7"
setuptools.setup(**metadata)
setuptools.setup(ext_modules=ext_modules)

View File

@@ -1,37 +0,0 @@
from configparser import ConfigParser
def get_metadata_and_options():
config = ConfigParser()
config.read(["metadata.cfg", "site.cfg"])
metadata = dict(config.items("metadata"))
options = dict(config.items("options"))
metadata["py_modules"] = list(filter(None, metadata["py_modules"].split("\n")))
metadata["classifiers"] = list(filter(None, metadata["classifiers"].split("\n")))
return metadata, options
def enabled(options, option):
value = options[option]
s = value.lower()
if s in ("yes", "true", "1", "y"):
return True
elif s in ("no", "false", "0", "n"):
return False
else:
raise ValueError(f"Unknown value {value} for option {option}")
def create_release_file(metadata):
with open("MySQLdb/release.py", "w", encoding="utf-8") as rel:
rel.write(
"""
__author__ = "%(author)s <%(author_email)s>"
version_info = %(version_info)s
__version__ = "%(version)s"
"""
% metadata
)

View File

@@ -1,94 +0,0 @@
import os
import sys
import subprocess
def find_package_name():
"""Get available pkg-config package name"""
packages = ["mysqlclient", "mariadb"]
for pkg in packages:
try:
cmd = f"pkg-config --exists {pkg}"
print(f"Trying {cmd}")
subprocess.check_call(cmd, shell=True)
except subprocess.CalledProcessError as err:
print(err)
else:
return pkg
raise Exception("Can not find valid pkg-config")
def get_config():
from setup_common import get_metadata_and_options, enabled, create_release_file
metadata, options = get_metadata_and_options()
static = enabled(options, "static")
# allow a command-line option to override the base config file to permit
# a static build to be created via requirements.txt
#
if "--static" in sys.argv:
static = True
sys.argv.remove("--static")
ldflags = os.environ.get("MYSQLCLIENT_LDFLAGS")
cflags = os.environ.get("MYSQLCLIENT_CFLAGS")
pkg_name = None
static_opt = " --static" if static else ""
if not (cflags and ldflags):
pkg_name = find_package_name()
if not cflags:
cflags = subprocess.check_output(
f"pkg-config{static_opt} --cflags {pkg_name}", encoding="utf-8", shell=True
)
if not ldflags:
ldflags = subprocess.check_output(
f"pkg-config{static_opt} --libs {pkg_name}", encoding="utf-8", shell=True
)
cflags = cflags.split()
for f in cflags:
if f.startswith("-std="):
break
else:
cflags += ["-std=c99"]
ldflags = ldflags.split()
define_macros = [
("version_info", metadata["version_info"]),
("__version__", metadata["version"]),
]
# print(f"{cflags = }")
# print(f"{ldflags = }")
# print(f"{define_macros = }")
ext_options = dict(
extra_compile_args=cflags,
extra_link_args=ldflags,
define_macros=define_macros,
)
# newer versions of gcc require libstdc++ if doing a static build
if static:
ext_options["language"] = "c++"
print("Options for building extention module:")
for k, v in ext_options.items():
print(f" {k}: {v}")
create_release_file(metadata)
del metadata["version_info"]
return metadata, ext_options
if __name__ == "__main__":
from pprint import pprint
metadata, config = get_config()
print("# Metadata")
pprint(metadata, sort_dicts=False, compact=True)
print("\n# Extention options")
pprint(config, sort_dicts=False, compact=True)

View File

@@ -1,64 +0,0 @@
import os
def get_config():
from setup_common import get_metadata_and_options, create_release_file
metadata, options = get_metadata_and_options()
client = "mariadbclient"
connector = os.environ.get("MYSQLCLIENT_CONNECTOR", options.get("connector"))
if not connector:
connector = os.path.join(
os.environ["ProgramFiles"], "MariaDB", "MariaDB Connector C"
)
extra_objects = []
library_dirs = [
os.path.join(connector, "lib", "mariadb"),
os.path.join(connector, "lib"),
]
libraries = [
"kernel32",
"advapi32",
"wsock32",
"shlwapi",
"Ws2_32",
"crypt32",
"secur32",
"bcrypt",
client,
]
include_dirs = [
os.path.join(connector, "include", "mariadb"),
os.path.join(connector, "include"),
]
extra_link_args = ["/MANIFEST"]
define_macros = [
("version_info", metadata["version_info"]),
("__version__", metadata["version"]),
]
create_release_file(metadata)
del metadata["version_info"]
ext_options = dict(
library_dirs=library_dirs,
libraries=libraries,
extra_link_args=extra_link_args,
include_dirs=include_dirs,
extra_objects=extra_objects,
define_macros=define_macros,
)
return metadata, ext_options
if __name__ == "__main__":
from pprint import pprint
metadata, config = get_config()
print("# Metadata")
pprint(metadata)
print("\n# Extention options")
pprint(config)