]> review.fuel-infra Code Review - openstack-build/heat-build.git/commitdiff
Add setup.py and friends
authorAngus Salkeld <asalkeld@redhat.com>
Tue, 13 Mar 2012 22:25:54 +0000 (09:25 +1100)
committerAngus Salkeld <asalkeld@redhat.com>
Tue, 13 Mar 2012 22:25:54 +0000 (09:25 +1100)
Signed-off-by: Angus Salkeld <asalkeld@redhat.com>
.gitignore
HACKING.rst [new file with mode: 0644]
babel.cfg [new file with mode: 0644]
setup.cfg [new file with mode: 0644]
setup.py [new file with mode: 0755]

index 89c25d9f3e4ac9c15f860fa417e224290e2e77e8..2ba603829040e71aa5819c1b1d3b0f9cc2dbdc45 100644 (file)
@@ -3,4 +3,5 @@
 *.log
 build
 dist
+heat.egg-info
 heat/vcsversion.py
diff --git a/HACKING.rst b/HACKING.rst
new file mode 100644 (file)
index 0000000..c6c39ec
--- /dev/null
@@ -0,0 +1,186 @@
+Glance Style Commandments
+=======================
+
+- Step 1: Read http://www.python.org/dev/peps/pep-0008/
+- Step 2: Read http://www.python.org/dev/peps/pep-0008/ again
+- Step 3: Read on
+
+
+General
+-------
+- Put two newlines between top-level code (funcs, classes, etc)
+- Put one newline between methods in classes and anywhere else
+- Do not write "except:", use "except Exception:" at the very least
+- Include your name with TODOs as in "#TODO(termie)"
+- Do not name anything the same name as a built-in or reserved word
+
+
+Imports
+-------
+- Do not make relative imports
+- Order your imports by the full module path
+- Organize your imports according to the following template
+
+Example::
+
+  # vim: tabstop=4 shiftwidth=4 softtabstop=4
+  {{stdlib imports in human alphabetical order}}
+  \n
+  {{third-party lib imports in human alphabetical order}}
+  \n
+  {{glance imports in human alphabetical order}}
+  \n
+  \n
+  {{begin your code}}
+
+
+Human Alphabetical Order Examples
+---------------------------------
+Example::
+
+  import httplib
+  import logging
+  import random
+  import StringIO
+  import time
+  import unittest
+
+  import eventlet
+  import webob.exc
+
+  import glance.api.middleware
+  from glance.api import images
+  from glance.auth import users
+  import glance.common
+  from glance.endpoint import cloud
+  from glance import test
+
+
+Docstrings
+----------
+
+Docstrings are required for all functions and methods.
+
+Docstrings should ONLY use triple-double-quotes (``"""``)
+
+Single-line docstrings should NEVER have extraneous whitespace
+between enclosing triple-double-quotes.
+
+**INCORRECT** ::
+
+  """ There is some whitespace between the enclosing quotes :( """
+
+**CORRECT** ::
+
+  """There is no whitespace between the enclosing quotes :)"""
+
+Docstrings that span more than one line should look like this:
+
+Example::
+
+  """
+  Start the docstring on the line following the opening triple-double-quote
+
+  If you are going to describe parameters and return values, use Sphinx, the
+  appropriate syntax is as follows.
+
+  :param foo: the foo parameter
+  :param bar: the bar parameter
+  :returns: return_type -- description of the return value
+  :returns: description of the return value
+  :raises: AttributeError, KeyError
+  """
+
+**DO NOT** leave an extra newline before the closing triple-double-quote.
+
+
+Dictionaries/Lists
+------------------
+If a dictionary (dict) or list object is longer than 80 characters, its items
+should be split with newlines. Embedded iterables should have their items
+indented. Additionally, the last item in the dictionary should have a trailing
+comma. This increases readability and simplifies future diffs.
+
+Example::
+
+  my_dictionary = {
+      "image": {
+          "name": "Just a Snapshot",
+          "size": 2749573,
+          "properties": {
+               "user_id": 12,
+               "arch": "x86_64",
+          },
+          "things": [
+              "thing_one",
+              "thing_two",
+          ],
+          "status": "ACTIVE",
+      },
+  }
+
+
+Calling Methods
+---------------
+Calls to methods 80 characters or longer should format each argument with
+newlines. This is not a requirement, but a guideline::
+
+    unnecessarily_long_function_name('string one',
+                                     'string two',
+                                     kwarg1=constants.ACTIVE,
+                                     kwarg2=['a', 'b', 'c'])
+
+
+Rather than constructing parameters inline, it is better to break things up::
+
+    list_of_strings = [
+        'what_a_long_string',
+        'not as long',
+    ]
+
+    dict_of_numbers = {
+        'one': 1,
+        'two': 2,
+        'twenty four': 24,
+    }
+
+    object_one.call_a_method('string three',
+                             'string four',
+                             kwarg1=list_of_strings,
+                             kwarg2=dict_of_numbers)
+
+
+Internationalization (i18n) Strings
+-----------------------------------
+In order to support multiple languages, we have a mechanism to support
+automatic translations of exception and log strings.
+
+Example::
+
+    msg = _("An error occurred")
+    raise HTTPBadRequest(explanation=msg)
+
+If you have a variable to place within the string, first internationalize the
+template string then do the replacement.
+
+Example::
+
+    msg = _("Missing parameter: %s") % ("flavor",)
+    LOG.error(msg)
+
+If you have multiple variables to place in the string, use keyword parameters.
+This helps our translators reorder parameters when needed.
+
+Example::
+
+    msg = _("The server with id %(s_id)s has no key %(m_key)s")
+    LOG.error(msg % {"s_id": "1234", "m_key": "imageId"})
+
+
+Creating Unit Tests
+-------------------
+For every new feature, unit tests should be created that both test and
+(implicitly) document the usage of said feature. If submitting a patch for a
+bug that had no unit test, a new passing unit test should be added. If a
+submitted bug fix does have a unit test, be sure to add a new one that fails
+without the patch and passes with the patch.
diff --git a/babel.cfg b/babel.cfg
new file mode 100644 (file)
index 0000000..efceab8
--- /dev/null
+++ b/babel.cfg
@@ -0,0 +1 @@
+[python: **.py]
diff --git a/setup.cfg b/setup.cfg
new file mode 100644 (file)
index 0000000..6a7725f
--- /dev/null
+++ b/setup.cfg
@@ -0,0 +1,24 @@
+[build_sphinx]
+all_files = 1
+build-dir = doc/build
+source-dir = doc/source
+
+[egg_info]
+tag_build = 
+tag_date = 0
+tag_svn_revision = 0
+
+[compile_catalog]
+directory = heat/locale
+domain = heat
+
+[update_catalog]
+domain = heat
+output_dir = heat/locale
+input_file = heat/locale/heat.pot
+
+[extract_messages]
+keywords = _ gettext ngettext l_ lazy_gettext
+mapping_file = babel.cfg
+output_file = heat/locale/heat.pot
+
diff --git a/setup.py b/setup.py
new file mode 100755 (executable)
index 0000000..5433d4e
--- /dev/null
+++ b/setup.py
@@ -0,0 +1,108 @@
+#!/usr/bin/python
+# Copyright (c) 2010 OpenStack, LLC.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#    http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+# implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+import gettext
+import os
+import subprocess
+
+from setuptools import setup, find_packages
+from setuptools.command.sdist import sdist
+
+gettext.install('heat', unicode=1)
+
+from heat import version
+
+
+def run_git_command(cmd):
+    output = subprocess.Popen(["/bin/sh", "-c", cmd],
+                              stdout=subprocess.PIPE)
+    return output.communicate()[0].strip()
+
+
+if os.path.isdir('.git'):
+    branch_nick_cmd = 'git branch | grep -Ei "\* (.*)" | cut -f2 -d" "'
+    branch_nick = run_git_command(branch_nick_cmd)
+    revid_cmd = "git --no-pager log --max-count=1 | cut -f2 -d' ' | head -1"
+    revid = run_git_command(revid_cmd)
+    revno_cmd = "git --no-pager log --oneline | wc -l"
+    revno = run_git_command(revno_cmd)
+    with open("heat/vcsversion.py", 'w') as version_file:
+        version_file.write("""
+# This file is automatically generated by setup.py, So don't edit it. :)
+version_info = {
+    'branch_nick': '%s',
+    'revision_id': '%s',
+    'revno': %s
+}
+""" % (branch_nick, revid, revno))
+
+
+class local_sdist(sdist):
+    """Customized sdist hook - builds the ChangeLog file from VC first"""
+
+    def run(self):
+        if os.path.isdir('.bzr'):
+            # We're in a bzr branch
+
+            log_cmd = subprocess.Popen(["bzr", "log", "--gnu"],
+                                       stdout=subprocess.PIPE)
+            changelog = log_cmd.communicate()[0]
+            with open("ChangeLog", "w") as changelog_file:
+                changelog_file.write(changelog)
+        sdist.run(self)
+
+cmdclass = {'sdist': local_sdist}
+
+# If Sphinx is installed on the box running setup.py,
+# enable setup.py to build the documentation, otherwise,
+# just ignore it
+try:
+    from sphinx.setup_command import BuildDoc
+
+    class local_BuildDoc(BuildDoc):
+        def run(self):
+            for builder in ['html', 'man']:
+                self.builder = builder
+                self.finalize_options()
+                BuildDoc.run(self)
+    cmdclass['build_sphinx'] = local_BuildDoc
+
+except:
+    pass
+
+
+setup(
+    name='heat',
+    version=version.canonical_version_string(),
+    description='The heat project provides services for provisioning '
+                'virtual machines',
+    license='Apache License (2.0)',
+    author='OpenStack',
+    author_email='openstack@lists.launchpad.net',
+    url='http://heat.openstack.org/',
+    packages=find_packages(exclude=['bin']),
+    cmdclass=cmdclass,
+    include_package_data=True,
+    classifiers=[
+        'Development Status :: 4 - Beta',
+        'License :: OSI Approved :: Apache Software License',
+        'Operating System :: POSIX :: Linux',
+        'Programming Language :: Python :: 2.6',
+        'Environment :: No Input/Output (Daemon)',
+    ],
+    scripts=['bin/heat',
+             'bin/heat-api'],
+    py_modules=[])