Skip to content

Commit

Permalink
Finish src reorganization
Browse files Browse the repository at this point in the history
  • Loading branch information
Erotemic committed Jul 10, 2022
1 parent f66ea6c commit 74a3eee
Show file tree
Hide file tree
Showing 6 changed files with 60 additions and 58 deletions.
2 changes: 2 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,8 @@ This project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.htm
args blocks. This has also moved to the standalone package `googledoc`
* Overhaul of repo structure in an effort to modernize and to agree with
templates defined by xcookie
* Module code now lives in the "src" directory to remove install vs develop
ambiguity.



Expand Down
1 change: 1 addition & 0 deletions pyproject.toml
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
[build-system]
requires = [ "setuptools>=41.0.1",]
build-backend = "setuptools.build_meta"

[tool.mypy]
ignore_missing_imports = true
Expand Down
2 changes: 1 addition & 1 deletion run_doctests.sh
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
#!/bin/bash
xdoctest xdoctest --style=google all "$@"
xdoctest ./src/xdoctest --style=google all "$@"
2 changes: 1 addition & 1 deletion run_linter.sh
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
#!/bin/bash
flake8 ./xdoctest --count --select=E9,F63,F7,F82 --show-source --statistics
flake8 ./src/xdoctest --count --select=E9,F63,F7,F82 --show-source --statistics
2 changes: 1 addition & 1 deletion run_tests.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
import pytest
import sys
package_name = 'xdoctest'
mod_dpath = package_name
mod_dpath = './src/' + package_name
test_dpath = 'tests'
pytest_args = [
'-p', 'pytester',
Expand Down
109 changes: 54 additions & 55 deletions setup.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,13 +7,14 @@
from setuptools import setup
import sys
from os.path import exists
from setuptools import find_packages


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 @@ -24,15 +25,15 @@ 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:
if getattr(target, 'id', None) == varname:
self.static_value = node.value.s

visitor = StaticVisitor()
Expand All @@ -42,7 +43,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 @@ -57,16 +58,16 @@ def 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=False):
def parse_requirements(fname='requirements.txt', versions=False):
"""
Parse the package dependencies listed in a requirements file but strips
specific versioning information.
Expand All @@ -85,112 +86,103 @@ def parse_requirements(fname="requirements.txt", versions=False):

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 ";" in line:
pkgpart, platpart = line.split(";")
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)
parts.append(';' + plat_deps)
item = ''.join(parts)
yield item

packages = list(gen_packages_items())
return packages


NAME = 'xdoctest'
try:
VERSION = parse_version('xdoctest/__init__.py')
except Exception:
raise
print('failed to parse values in setup.py')
VERSION = '???'


from setuptools import find_packages # NOQA

VERSION = parse_version('src/xdoctest/__init__.py')

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"
'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'
),
"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'
),
'colors': parse_requirements('requirements/colors.txt'),
'jupyter': parse_requirements('requirements/jupyter.txt'),
Expand All @@ -205,7 +197,6 @@ def gen_packages_items():
setupkw['long_description'] = parse_description()
setupkw['long_description_content_type'] = 'text/x-rst'
setupkw['license'] = 'Apache 2'
setupkw['packages'] = find_packages('.')
setupkw['python_requires'] = '>=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*'
setupkw['classifiers'] = [
'Development Status :: 5 - Production/Stable',
Expand All @@ -229,8 +220,16 @@ def gen_packages_items():
'Programming Language :: Python :: Implementation :: PyPy',
'Programming Language :: Python :: Implementation :: CPython',
]
# https://codefellows.github.io/sea-python-401d4/lectures/python_packaging_1.html
# We use a key of an empty string to indicate that the directory we are
# pointing to should be considered the root. Then the value is src, telling
# setuptools to use that directory as the root of our source.
setupkw['package_dir'] = {
'': './src',
'': 'src',
}
setupkw['packages'] = find_packages('src')
setupkw['package_data'] = {
'xdoctest': ['py.typed', '*.pyi'],
}
setupkw['entry_points'] = {
'console_scripts': [
Expand Down

0 comments on commit 74a3eee

Please sign in to comment.