Skip to content

Commit

Permalink
Allow definition of extras require
Browse files Browse the repository at this point in the history
  • Loading branch information
Florian Wilhelm authored and Florian Wilhelm committed Mar 20, 2015
1 parent 4002a8e commit 4105b14
Show file tree
Hide file tree
Showing 5 changed files with 74 additions and 41 deletions.
2 changes: 1 addition & 1 deletion CHANGES.rst
Original file line number Diff line number Diff line change
Expand Up @@ -6,8 +6,8 @@ Version 2.1, 2015-??-??
=======================

- Use alabaster as default Sphinx theme
- Automatically install Sphinx if necessary
- FIX: data_files are installed in share/PACKAGE instead of root
- Allow definition of extras_require in setup.cfg

Version 2.0.4, 2015-03-17
=========================
Expand Down
4 changes: 4 additions & 0 deletions pyscaffold/data/setup_cfg.template
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,10 @@ classifiers = ${classifiers}
# for example:
# hello_world = ${package}.skeleton:run
${console_scripts}
[extras_require]
# Add here additional requirements for extra features, like:
# PDF = ReportLab>=1.2, RXP

[test]
# html, xml or annotate
cov-report = html
Expand Down
52 changes: 32 additions & 20 deletions pyscaffold/data/setup_py.template
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,6 @@ from glob import glob
import setuptools
from setuptools import setup
from setuptools.command.test import test as TestCommand
from setuptools.dist import Distribution

# For Python 2/3 compatibility, pity we can't use six.moves here
try: # try Python 3 imports first
Expand Down Expand Up @@ -102,10 +101,29 @@ def read(fname):
return content


@contextmanager
def stash(filename):
with open(filename) as fh:
old_content = fh.read()
try:
yield
finally:
with open(filename, 'w') as fh:
fh.write(old_content)


def str2bool(val):
return val.lower() in ("yes", "true")


def prepare_console_scripts(dct):
return ['{cmd} = {func}'.format(cmd=k, func=v) for k, v in dct.items()]


def prepare_extras_require(dct):
return {k: [r.strip() for r in v.split(',')] for k, v in dct.items()}


def read_setup_cfg():
config = configparser.SafeConfigParser(allow_no_value=True)
config_file = StringIO(read(os.path.join(__location__, 'setup.cfg')))
Expand All @@ -115,30 +133,18 @@ def read_setup_cfg():
metadata['classifiers'] = [item.strip() for item in classifiers.split(',')]
console_scripts = dict(config.items('console_scripts'))
console_scripts = prepare_console_scripts(console_scripts)
extras_require = dict(config.items('extras_require'))
extras_require = prepare_extras_require(extras_require)
package_data = metadata.get('package_data', '')
package_data = [item.strip() for item in package_data.split(',') if item]
metadata['package_data'] = package_data
data_files = metadata.get('data_files', '')
data_files = [item.strip() for item in data_files.split(',')]
data_files = [item for pattern in data_files for item in glob(pattern)]
metadata['data_files'] = data_files
return metadata, console_scripts
return metadata, console_scripts, extras_require


def prepare_console_scripts(dct):
return ['{cmd} = {func}'.format(cmd=k, func=v) for k, v in dct.items()]


@contextmanager
def stash(filename):
with open(filename) as fh:
old_content = fh.read()
try:
yield
finally:
with open(filename, 'w') as fh:
fh.write(old_content)

###########################################
# Package versioning and git interaction #
###########################################
Expand Down Expand Up @@ -348,12 +354,17 @@ def get_versions(verbose=False):


def build_cmd_docs():
Distribution().fetch_build_eggs(['sphinx'])
try:
from sphinx.setup_command import BuildDoc
except ImportError:
raise RuntimeError("Sphinx documentation could not be installed, "
"run: pip install sphinx")
class NoSphinx(Command):
user_options = []

def initialize_options(self):
raise RuntimeError("Sphinx documentation is not installed, "
"run: pip install sphinx")

return NoSphinx

class cmd_docs(BuildDoc):
def run(self):
Expand Down Expand Up @@ -491,7 +502,7 @@ def setup_package():
data_file_path = os.path.join("share", package)
docs_build_path = os.path.join(docs_path, "_build")
install_reqs = get_install_requirements("requirements.txt")
metadata, console_scripts = read_setup_cfg()
metadata, console_scripts, extras_require = read_setup_cfg()

command_options = {
'docs': {'project': ('setup.py', package),
Expand Down Expand Up @@ -524,6 +535,7 @@ def setup_package():
namespace_packages=namespace,
install_requires=install_reqs,
setup_requires=['six'],
extras_require=extras_require,
cmdclass=cmdclass,
tests_require=['pytest-cov', 'pytest'],
package_data={package: metadata['package_data']},
Expand Down
5 changes: 5 additions & 0 deletions setup.cfg
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,11 @@ classifiers = Development Status :: 5 - Production/Stable,
# hello_world = pyscaffold.module:function
putup = pyscaffold.runner:run

[extras_require]
# Add here additional requirements for extra features, like:
# PDF = ReportLab>=1.2, RXP
ALL = django, cookiecutter

[test]
# html, xml or annotate
cov-report = html
Expand Down
52 changes: 32 additions & 20 deletions setup.py
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,6 @@
import setuptools
from setuptools import setup
from setuptools.command.test import test as TestCommand
from setuptools.dist import Distribution

# For Python 2/3 compatibility, pity we can't use six.moves here
try: # try Python 3 imports first
Expand Down Expand Up @@ -101,10 +100,29 @@ def read(fname):
return content


@contextmanager
def stash(filename):
with open(filename) as fh:
old_content = fh.read()
try:
yield
finally:
with open(filename, 'w') as fh:
fh.write(old_content)


def str2bool(val):
return val.lower() in ("yes", "true")


def prepare_console_scripts(dct):
return ['{cmd} = {func}'.format(cmd=k, func=v) for k, v in dct.items()]


def prepare_extras_require(dct):
return {k: [r.strip() for r in v.split(',')] for k, v in dct.items()}


def read_setup_cfg():
config = configparser.SafeConfigParser(allow_no_value=True)
config_file = StringIO(read(os.path.join(__location__, 'setup.cfg')))
Expand All @@ -114,30 +132,18 @@ def read_setup_cfg():
metadata['classifiers'] = [item.strip() for item in classifiers.split(',')]
console_scripts = dict(config.items('console_scripts'))
console_scripts = prepare_console_scripts(console_scripts)
extras_require = dict(config.items('extras_require'))
extras_require = prepare_extras_require(extras_require)
package_data = metadata.get('package_data', '')
package_data = [item.strip() for item in package_data.split(',') if item]
metadata['package_data'] = package_data
data_files = metadata.get('data_files', '')
data_files = [item.strip() for item in data_files.split(',')]
data_files = [item for pattern in data_files for item in glob(pattern)]
metadata['data_files'] = data_files
return metadata, console_scripts
return metadata, console_scripts, extras_require


def prepare_console_scripts(dct):
return ['{cmd} = {func}'.format(cmd=k, func=v) for k, v in dct.items()]


@contextmanager
def stash(filename):
with open(filename) as fh:
old_content = fh.read()
try:
yield
finally:
with open(filename, 'w') as fh:
fh.write(old_content)

###########################################
# Package versioning and git interaction #
###########################################
Expand Down Expand Up @@ -347,12 +353,17 @@ def get_versions(verbose=False):


def build_cmd_docs():
Distribution().fetch_build_eggs(['sphinx'])
try:
from sphinx.setup_command import BuildDoc
except ImportError:
raise RuntimeError("Sphinx documentation could not be installed, "
"run: pip install sphinx")
class NoSphinx(Command):
user_options = []

def initialize_options(self):
raise RuntimeError("Sphinx documentation is not installed, "
"run: pip install sphinx")

return NoSphinx

class cmd_docs(BuildDoc):
def run(self):
Expand Down Expand Up @@ -490,7 +501,7 @@ def setup_package():
data_file_path = os.path.join("share", package)
docs_build_path = os.path.join(docs_path, "_build")
install_reqs = get_install_requirements("requirements.txt")
metadata, console_scripts = read_setup_cfg()
metadata, console_scripts, extras_require = read_setup_cfg()

command_options = {
'docs': {'project': ('setup.py', package),
Expand Down Expand Up @@ -523,6 +534,7 @@ def setup_package():
namespace_packages=namespace,
install_requires=install_reqs,
setup_requires=['six'],
extras_require=extras_require,
cmdclass=cmdclass,
tests_require=['pytest-cov', 'pytest'],
package_data={package: metadata['package_data']},
Expand Down

0 comments on commit 4105b14

Please sign in to comment.