Repository: getnikola/nikola

Issue:
Modernize setup.py
We are not using setuptools, which has made our setup.py much larger and cruftier than necessary.

Perhaps it's time to reconsider that and streamline it using something like this:

http://hynek.me/articles/sharing-your-labor-of-love-pypi-quick-and-dirty/



Discussion:

Resolving patch:
diff --git a/nikola/plugins/task/mustache/__init__.py b/nikola/plugins/task/mustache/__init__.py
--- a/nikola/plugins/task/mustache/__init__.py
+++ b/nikola/plugins/task/mustache/__init__.py
@@ -31,7 +31,9 @@
 import os
 
 from nikola.plugin_categories import Task
-from nikola.utils import config_changed, copy_file, unicode_str, makedirs
+from nikola.utils import (
+    config_changed, copy_file, LocaleBorg, makedirs, unicode_str,
+)
 
 
 class Mustache(Task):
@@ -106,7 +108,7 @@ def write_file(path, post, lang):
             })
 
             # Comments
-            context = dict(post=post, lang=self.site.current_lang())
+            context = dict(post=post, lang=LocaleBorg().current_lang)
             context.update(self.site.GLOBAL_CONTEXT)
             data["comment_html"] = self.site.template_system.render_template(
                 'mustache-comment-form.tmpl', None, context).strip()
diff --git a/setup.py b/setup.py
--- a/setup.py
+++ b/setup.py
@@ -12,23 +12,9 @@
 import subprocess
 import sys
 import shutil
-from fnmatch import fnmatchcase
 
-
-try:
-    # Prefer setuptools for the installation to have no problem with the
-    # "--single-version-externally-managed" option that pip uses when
-    # installing packages.
-    from setuptools import setup
-    from setuptools import convert_path
-
-    from setuptools.command.install import install
-except ImportError:
-    print('\n*** setuptools not found! Falling back to distutils\n\n')
-    from distutils.core import setup  # NOQA
-
-    from distutils.command.install import install
-    from distutils.util import convert_path  # NOQA
+from setuptools import setup
+from setuptools.command.install import install
 
 with open('requirements.txt', 'r') as fh:
     dependencies = [l.strip() for l in fh]
@@ -148,86 +134,6 @@ def run(self):
         install_manpages(self.root, self.prefix)
 
 
-def find_package_data(
-    where='.', package='',
-    exclude=standard_exclude,
-    exclude_directories=standard_exclude_directories,
-    only_in_packages=True,
-        show_ignored=False):
-    """
-    Return a dictionary suitable for use in ``package_data``
-    in a distutils ``setup.py`` file.
-
-    The dictionary looks like::
-
-        {'package': [files]}
-
-    Where ``files`` is a list of all the files in that package that
-    don't match anything in ``exclude``.
-
-    If ``only_in_packages`` is true, then top-level directories that
-    are not packages won't be included (but directories under packages
-    will).
-
-    Directories matching any pattern in ``exclude_directories`` will
-    be ignored; by default directories with leading ``.``, ``CVS``,
-    and ``_darcs`` will be ignored.
-
-    If ``show_ignored`` is true, then all the files that aren't
-    included in package data are shown on stderr (for debugging
-    purposes).
-
-    Note patterns use wildcards, or can be exact paths (including
-    leading ``./``), and all searching is case-insensitive.
-    """
-
-    out = {}
-    stack = [(convert_path(where), '', package, only_in_packages)]
-    while stack:
-        where, prefix, package, only_in_packages = stack.pop(0)
-        for name in os.listdir(where):
-            fn = os.path.join(where, name)
-            if os.path.isdir(fn):
-                bad_name = False
-                for pattern in exclude_directories:
-                    if (fnmatchcase(name, pattern)
-                            or fn.lower() == pattern.lower()):
-                        bad_name = True
-                        if show_ignored:
-                            print >> sys.stderr, (
-                                "Directory %s ignored by pattern %s"
-                                % (fn, pattern))
-                        break
-                if bad_name:
-                    continue
-                if (os.path.isfile(os.path.join(fn, '__init__.py'))
-                        and not prefix):
-                    if not package:
-                        new_package = name
-                    else:
-                        new_package = package + '.' + name
-                    stack.append((fn, '', new_package, False))
-                else:
-                    stack.append((fn, prefix + name + '/',
-                                  package, only_in_packages))
-            elif package or not only_in_packages:
-                # is a file
-                bad_name = False
-                for pattern in exclude:
-                    if (fnmatchcase(name, pattern)
-                            or fn.lower() == pattern.lower()):
-                        bad_name = True
-                        if show_ignored:
-                            print >> sys.stderr, (
-                                "File %s ignored by pattern %s"
-                                % (fn, pattern))
-                        break
-                if bad_name:
-                    continue
-                out.setdefault(package, []).append(prefix + name)
-    return out
-
-
 setup(name='Nikola',
       version='6.2.1',
       description='A modular, fast, simple, static website generator',
@@ -271,7 +177,7 @@ def find_package_data(
                    'Topic :: Internet :: WWW/HTTP',
                    'Topic :: Text Processing :: Markup'),
       install_requires=dependencies,
-      package_data=find_package_data(),
+      include_package_data=True,
       cmdclass={'install': nikola_install},
       data_files=[
               ('share/doc/nikola', [


Test patch: