1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337
|
# (C) Copyright 2008-2025 Enthought, Inc., Austin, TX
# All rights reserved.
#
# This software is provided without warranty under the terms of the BSD
# license included in LICENSE.txt and may be redistributed only under
# the conditions described in the aforementioned license. The license
# is also available online at http://www.enthought.com/licenses/BSD.txt
#
# Thanks for using Enthought open source!
import os
import runpy
import subprocess
from setuptools import setup, find_packages
# Version information; update this by hand when making a new bugfix or feature
# release. The actual package version is autogenerated from this information
# together with information from the version control system, and then injected
# into the package source.
MAJOR = 5
MINOR = 3
MICRO = 1
PRERELEASE = ""
IS_RELEASED = True
# If this file is part of a Git export (for example created with "git archive",
# or downloaded from GitHub), ARCHIVE_COMMIT_HASH gives the full hash of the
# commit that was exported.
ARCHIVE_COMMIT_HASH = "$Format:%H$"
# Templates for version strings.
RELEASED_VERSION = "{major}.{minor}.{micro}{prerelease}"
UNRELEASED_VERSION = "{major}.{minor}.{micro}{prerelease}.dev{dev}"
# Paths to the autogenerated version file and the Git directory.
HERE = os.path.abspath(os.path.dirname(__file__))
VERSION_FILE = os.path.join(HERE, "apptools", "version.py")
GIT_DIRECTORY = os.path.join(HERE, ".git")
# Template for the autogenerated version file.
VERSION_FILE_TEMPLATE = '''\
# (C) Copyright 2008-2025 Enthought, Inc., Austin, TX
# All rights reserved.
#
# This software is provided without warranty under the terms of the BSD
# license included in LICENSE.txt and may be redistributed only under
# the conditions described in the aforementioned license. The license
# is also available online at http://www.enthought.com/licenses/BSD.txt
#
# Thanks for using Enthought open source!
"""
Version information for this Apptools distribution.
This file is autogenerated by the Apptools setup.py script.
"""
#: The full version of the package, including a development suffix
#: for unreleased versions of the package.
version = "{version}"
#: The Git revision from which this release was made.
git_revision = "{git_revision}"
#: Flag whether this is a final release
is_released = {is_released}
'''
# Git executable to use to get revision information.
GIT = "git"
def _git_output(args):
"""
Call Git with the given arguments and return the output as (Unicode) text.
"""
return subprocess.check_output([GIT] + args).decode("utf-8")
def _git_info(commit="HEAD"):
"""
Get information about the given commit from Git.
Parameters
----------
commit : str, optional
Commit to provide information for. Defaults to "HEAD".
Returns
-------
git_count : int
Number of revisions from this commit to the initial commit.
git_revision : unicode
Commit hash for HEAD.
Raises
------
EnvironmentError
If Git is not available.
subprocess.CalledProcessError
If Git is available, but the version command fails (most likely
because there's no Git repository here).
"""
count_args = ["rev-list", "--count", "--first-parent", commit]
git_count = int(_git_output(count_args))
revision_args = ["rev-list", "--max-count", "1", commit]
git_revision = _git_output(revision_args).rstrip()
return git_count, git_revision
def write_version_file(version, git_revision):
"""
Write version information to the version file.
Overwrites any existing version file.
Parameters
----------
version : unicode
Package version.
git_revision : unicode
The full commit hash for the current Git revision.
"""
with open(VERSION_FILE, "w", encoding="ascii") as version_file:
version_file.write(
VERSION_FILE_TEMPLATE.format(
version=version,
git_revision=git_revision,
is_released=IS_RELEASED,
)
)
def read_version_file():
"""
Read version information from the version file, if it exists.
Returns
-------
version : unicode
The full version, including any development suffix.
git_revision : unicode
The full commit hash for the current Git revision.
Raises
------
EnvironmentError
If the version file does not exist.
"""
version_info = runpy.run_path(VERSION_FILE)
return (version_info["version"], version_info["git_revision"])
def git_version():
"""
Construct version information from local variables and Git.
Returns
-------
version : unicode
Package version.
git_revision : unicode
The full commit hash for the current Git revision.
Raises
------
EnvironmentError
If Git is not available.
subprocess.CalledProcessError
If Git is available, but the version command fails (most likely
because there's no Git repository here).
"""
git_count, git_revision = _git_info()
version_template = RELEASED_VERSION if IS_RELEASED else UNRELEASED_VERSION
version = version_template.format(
major=MAJOR,
minor=MINOR,
micro=MICRO,
prerelease=PRERELEASE,
dev=git_count,
)
return version, git_revision
def archive_version():
"""
Construct version information for an archive.
Returns
-------
version : str
Package version.
git_revision : str
The full commit hash for the current Git revision.
Raises
------
ValueError
If this does not appear to be an archive.
"""
if "$" in ARCHIVE_COMMIT_HASH:
raise ValueError("This does not appear to be an archive.")
version_template = RELEASED_VERSION if IS_RELEASED else UNRELEASED_VERSION
version = version_template.format(
major=MAJOR,
minor=MINOR,
micro=MICRO,
prerelease=PRERELEASE,
dev="-unknown",
)
return version, ARCHIVE_COMMIT_HASH
def resolve_version():
"""
Process version information and write a version file if necessary.
Returns the current version information.
Returns
-------
version : unicode
Package version.
git_revision : unicode
The full commit hash for the current Git revision.
"""
if os.path.isdir(GIT_DIRECTORY):
# This is a local clone; compute version information and write
# it to the version file, overwriting any existing information.
version = git_version()
print("Computed package version: {}".format(version))
print("Writing version to version file {}.".format(VERSION_FILE))
write_version_file(*version)
elif "$" not in ARCHIVE_COMMIT_HASH:
# This is a source archive.
version = archive_version()
print("Archive package version: {}".format(version))
print("Writing version to version file {}.".format(VERSION_FILE))
write_version_file(*version)
elif os.path.isfile(VERSION_FILE):
# This is a source distribution. Read the version information.
print("Reading version file {}".format(VERSION_FILE))
version = read_version_file()
print("Package version from version file: {}".format(version))
else:
# This is a source archive for an unreleased version.
raise RuntimeError(
"Unable to determine package version. No local Git clone "
"detected, and no version file found at {}."
"Please use a source dist or a git clone.".format(VERSION_FILE)
)
return version
def get_long_description():
""" Read long description from README.txt. """
with open("README.rst", "r", encoding="utf-8") as readme:
return readme.read()
if __name__ == "__main__":
version, git_revision = resolve_version()
setup(
name='apptools',
version=version,
author='Enthought, Inc.',
author_email='info@enthought.com',
maintainer='ETS Developers',
maintainer_email='enthought-dev@enthought.com',
url='https://docs.enthought.com/apptools',
download_url=('https://www.github.com/enthought/apptools'),
classifiers=[
c.strip() for c in """\
Development Status :: 5 - Production/Stable
Intended Audience :: Developers
Intended Audience :: Science/Research
License :: OSI Approved :: BSD License
Operating System :: MacOS
Operating System :: Microsoft :: Windows
Operating System :: OS Independent
Operating System :: POSIX
Operating System :: Unix
Programming Language :: Python
Topic :: Scientific/Engineering
Topic :: Software Development
Topic :: Software Development :: Libraries
""".splitlines() if len(c.strip()) > 0],
description='application tools',
long_description=get_long_description(),
long_description_content_type="text/x-rst",
include_package_data=True,
package_data={
'apptools': [
'logger/plugin/*.ini',
'logger/plugin/view/images/*.png',
'preferences/tests/*.ini'
]
},
install_requires=['traits>=6.2.0'],
extras_require={
"docs": ["enthought-sphinx-theme", "sphinx"],
"test": [
"importlib-resources>=1.1.0; python_version<'3.9'",
],
"gui": [
"pyface",
"traitsui",
],
"h5": [
# For Python earlier than 3.10, the most recent version of
# PyTables is incompatible with NumPy 2.x.
# xref: https://github.com/enthought/apptools/issues/345
"numpy < 2.0; python_version<'3.10'",
"numpy; python_version>='3.10'",
"pandas",
"tables",
],
"persistence": [
"numpy < 2.0; python_version<'3.10'",
"numpy; python_version>='3.10'",
],
"preferences": [
"configobj",
],
},
license='BSD',
packages=find_packages(),
platforms=["Windows", "Linux", "Mac OS-X", "Unix", "Solaris"],
zip_safe=False,
python_requires=">=3.8",
)
|