Skip to content

Commit

Permalink
update xcookie
Browse files Browse the repository at this point in the history
  • Loading branch information
Erotemic committed Jan 29, 2025
1 parent 3bdf633 commit 3efbfb2
Showing 1 changed file with 119 additions and 88 deletions.
207 changes: 119 additions & 88 deletions setup.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,8 @@
# Generated by ~/code/xcookie/xcookie/builders/setup.py
# based on part ~/code/xcookie/xcookie/rc/setup.py.in
import sys
from os.path import exists
import re
from os.path import exists, dirname, join
from setuptools import find_packages
from setuptools import setup

Expand All @@ -11,7 +12,7 @@ def parse_version(fpath):
"""
Statically parse the version number from a python file
"""
value = static_parse('__version__', fpath)
value = static_parse("__version__", fpath)
return value


Expand All @@ -22,16 +23,19 @@ def static_parse(varname, fpath):
import ast

if not exists(fpath):
raise ValueError('fpath={!r} does not exist'.format(fpath))
with open(fpath, 'r') as file_:
raise ValueError("fpath={!r} does not exist".format(fpath))
with open(fpath, "r") as file_:
sourcecode = file_.read()
pt = ast.parse(sourcecode)

class StaticVisitor(ast.NodeVisitor):
def visit_Assign(self, node):
for target in node.targets:
if getattr(target, 'id', None) == varname:
self.static_value = node.value.s
if getattr(target, "id", None) == varname:
try:
self.static_value = node.value.value
except AttributeError:
self.static_value = node.value.s

visitor = StaticVisitor()
visitor.visit(pt)
Expand All @@ -40,7 +44,7 @@ def visit_Assign(self, node):
except AttributeError:
import warnings

value = 'Unknown {}'.format(varname)
value = "Unknown {}".format(varname)
warnings.warn(value)
return value

Expand All @@ -53,114 +57,113 @@ def parse_description():
pandoc --from=markdown --to=rst --output=README.rst README.md
python -c "import setup; print(setup.parse_description())"
"""
from os.path import dirname, join, exists

readme_fpath = join(dirname(__file__), 'README.rst')
readme_fpath = join(dirname(__file__), "README.rst")
# This breaks on pip install, so check that it exists.
if exists(readme_fpath):
with open(readme_fpath, 'r') as f:
with open(readme_fpath, "r") as f:
text = f.read()
return text
return ''
return ""


def parse_requirements(fname='requirements.txt', versions='loose'):
def parse_requirements(fname="requirements.txt", versions=False):
"""
Parse the package dependencies listed in a requirements file but strips
specific versioning information.
Args:
fname (str): path to requirements file
versions (bool | str, default=False):
versions (bool | str):
If true include version specs.
If strict, then pin to the minimum version.
Returns:
List[str]: list of requirements items
"""
from os.path import exists, dirname, join
import re
CommandLine:
python -c "import setup, ubelt; print(ubelt.urepr(setup.parse_requirements()))"
"""
require_fpath = fname

def parse_line(line, dpath=''):
def parse_line(line, dpath=""):
"""
Parse information from a line in a requirements text file
line = 'git+https://a.com/somedep@sometag#egg=SomeDep'
line = '-e git+https://a.com/somedep@sometag#egg=SomeDep'
"""
# Remove inline comments
comment_pos = line.find(' #')
comment_pos = line.find(" #")
if comment_pos > -1:
line = line[:comment_pos]

if line.startswith('-r '):
if line.startswith("-r "):
# Allow specifying requirements in other files
target = join(dpath, line.split(' ')[1])
target = join(dpath, line.split(" ")[1])
for info in parse_require_file(target):
yield info
else:
# See: https://www.python.org/dev/peps/pep-0508/
info = {'line': line}
if line.startswith('-e '):
info['package'] = line.split('#egg=')[1]
info = {"line": line}
if line.startswith("-e "):
info["package"] = line.split("#egg=")[1]
else:
if '--find-links' in line:
if "--find-links" in line:
# setuptools does not seem to handle find links
line = line.split('--find-links')[0]
if ';' in line:
pkgpart, platpart = line.split(';')
line = line.split("--find-links")[0]
if ";" in line:
pkgpart, platpart = line.split(";")
# Handle platform specific dependencies
# setuptools.readthedocs.io/en/latest/setuptools.html
# #declaring-platform-specific-dependencies
plat_deps = platpart.strip()
info['platform_deps'] = plat_deps
info["platform_deps"] = plat_deps
else:
pkgpart = line
platpart = None

# Remove versioning from the package
pat = '(' + '|'.join(['>=', '==', '>']) + ')'
pat = "(" + "|".join([">=", "==", ">"]) + ")"
parts = re.split(pat, pkgpart, maxsplit=1)
parts = [p.strip() for p in parts]

info['package'] = parts[0]
info["package"] = parts[0]
if len(parts) > 1:
op, rest = parts[1:]
version = rest # NOQA
info['version'] = (op, version)
info["version"] = (op, version)
yield info

def parse_require_file(fpath):
dpath = dirname(fpath)
with open(fpath, 'r') as f:
with open(fpath, "r") as f:
for line in f.readlines():
line = line.strip()
if line and not line.startswith('#'):
if line and not line.startswith("#"):
for info in parse_line(line, dpath=dpath):
yield info

def gen_packages_items():
if exists(require_fpath):
for info in parse_require_file(require_fpath):
parts = [info['package']]
if versions and 'version' in info:
if versions == 'strict':
parts = [info["package"]]
if versions and "version" in info:
if versions == "strict":
# In strict mode, we pin to the minimum version
if info['version']:
if info["version"]:
# Only replace the first >= instance
verstr = ''.join(info['version']).replace('>=', '==', 1)
verstr = "".join(info["version"]).replace(">=", "==", 1)
parts.append(verstr)
else:
parts.extend(info['version'])
if not sys.version.startswith('3.4'):
parts.extend(info["version"])
if not sys.version.startswith("3.4"):
# apparently package_deps are broken in 3.4
plat_deps = info.get('platform_deps')
plat_deps = info.get("platform_deps")
if plat_deps is not None:
parts.append(';' + plat_deps)
item = ''.join(parts)
yield item
parts.append(";" + plat_deps)
item = "".join(parts)
if item:
yield item

packages = list(gen_packages_items())
return packages
Expand Down Expand Up @@ -196,55 +199,83 @@ def gen_packages_items():
# return requirements


NAME = 'xcookie'
INIT_PATH = 'xcookie/__init__.py'
VERSION = parse_version('xcookie/__init__.py')

if __name__ == '__main__':
NAME = "xcookie"
INIT_PATH = "xcookie/__init__.py"
VERSION = parse_version(INIT_PATH)
if __name__ == "__main__":
setupkw = {}

setupkw['install_requires'] = parse_requirements('requirements/runtime.txt')
setupkw['extras_require'] = {
'all': parse_requirements('requirements.txt'),
'tests': parse_requirements('requirements/tests.txt'),
'optional': parse_requirements('requirements/optional.txt'),
'all-strict': parse_requirements('requirements.txt', versions='strict'),
'runtime-strict': parse_requirements(
'requirements/runtime.txt', versions='strict'
setupkw["install_requires"] = parse_requirements(
"requirements/runtime.txt", versions="loose"
)
setupkw["extras_require"] = {
"all": parse_requirements("requirements.txt", versions="loose"),
"runtime": parse_requirements("requirements/runtime.txt", versions="loose"),
"tests": parse_requirements("requirements/tests.txt", versions="loose"),
"optional": parse_requirements("requirements/optional.txt", versions="loose"),
"docs": parse_requirements("requirements/docs.txt", versions="loose"),
"gdal-strict": parse_requirements("requirements/gdal.txt", versions="strict"),
"gdal": parse_requirements("requirements/gdal.txt", versions="loose"),
"graphics": parse_requirements("requirements/graphics.txt", versions="loose"),
"headless": parse_requirements("requirements/headless.txt", versions="loose"),
"postgresql": parse_requirements(
"requirements/postgresql.txt", versions="loose"
),
"all-strict": parse_requirements("requirements.txt", versions="strict"),
"runtime-strict": parse_requirements(
"requirements/runtime.txt", versions="strict"
),
'tests-strict': parse_requirements('requirements/tests.txt', versions='strict'),
'optional-strict': parse_requirements(
'requirements/optional.txt', versions='strict'
"tests-strict": parse_requirements("requirements/tests.txt", versions="strict"),
"optional-strict": parse_requirements(
"requirements/optional.txt", versions="strict"
),
"docs-strict": parse_requirements("requirements/docs.txt", versions="strict"),
"gdal-strict-strict": parse_requirements(
"requirements/gdal-strict.txt", versions="strict"
),
"graphics-strict": parse_requirements(
"requirements/graphics.txt", versions="strict"
),
"headless-strict": parse_requirements(
"requirements/headless.txt", versions="strict"
),
"postgresql-strict": parse_requirements(
"requirements/postgresql.txt", versions="strict"
),
}

setupkw['name'] = NAME
setupkw['version'] = VERSION
setupkw['author'] = 'Jon Crall'
setupkw['author_email'] = '[email protected]'
setupkw['url'] = 'https://github.com/Erotemic/xcookie'
setupkw['description'] = 'The xcookie cookie-cutter Module'
setupkw['long_description'] = parse_description()
setupkw['long_description_content_type'] = 'text/x-rst'
setupkw['license'] = 'Apache 2'
setupkw['packages'] = find_packages('.')
setupkw['python_requires'] = '>=3.7'
setupkw['classifiers'] = [
'Development Status :: 1 - Planning',
'Intended Audience :: Developers',
'Topic :: Software Development :: Libraries :: Python Modules',
'Topic :: Utilities',
'License :: OSI Approved :: Apache Software License',
'Programming Language :: Python :: 3.7',
'Programming Language :: Python :: 3.8',
'Programming Language :: Python :: 3.9',
'Programming Language :: Python :: 3.10',
'Programming Language :: Python :: 3.11',
setupkw["name"] = NAME
setupkw["version"] = VERSION
setupkw["author"] = "Jon Crall"
setupkw["author_email"] = "[email protected]"
setupkw["url"] = "https://github.com/Erotemic/xcookie"
setupkw["description"] = "The xcookie cookie-cutter Module"
setupkw["long_description"] = parse_description()
setupkw["long_description_content_type"] = "text/x-rst"
setupkw["license"] = "Apache 2"
setupkw["packages"] = find_packages(".")
setupkw["python_requires"] = ">=3.7"
setupkw["classifiers"] = [
"Development Status :: 1 - Planning",
"Intended Audience :: Developers",
"Topic :: Software Development :: Libraries :: Python Modules",
"Topic :: Utilities",
"License :: OSI Approved :: Apache Software License",
"Programming Language :: Python :: 3.7",
"Programming Language :: Python :: 3.8",
"Programming Language :: Python :: 3.9",
"Programming Language :: Python :: 3.10",
"Programming Language :: Python :: 3.11",
"Programming Language :: Python :: 3.12",
"Programming Language :: Python :: 3.13",
]
setupkw['package_data'] = {'xcookie': ['py.typed', '*.pyi'], 'xcookie.rc': ['*.in']}
setupkw['entry_points'] = {
'console_scripts': [
'xcookie=xcookie.__main__:main',
setupkw["package_data"] = {
"": ["requirements/*.txt"],
"xcookie": ["py.typed", "*.pyi"],
"xcookie.rc": ["*.in"],
}
setupkw["entry_points"] = {
"console_scripts": [
"xcookie=xcookie.__main__:main",
],
}
setup(**setupkw)

0 comments on commit 3efbfb2

Please sign in to comment.