5 changed files with 320 additions and 0 deletions
@ -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. |
@ -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 |
||||
|
@ -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=[]) |
Loading…
Reference in new issue