# Coding style for autotest in Chrome OS / Android / Brillo
These rules elaborate on, but rarely deviate from PEP-8.  When in doubt, go
with PEP-8.


## Language
 * Use Python where possible
 * Prefer writing more Python to a smaller amount of shell script in host
   commands.  In practice, the Python tends to be easier to maintain.
 * Some tests use C/C++ in test dependencies, and this is also ok.


## Indentation & whitespace

Format your code for an 80 character wide screen.

Indentation is 4 spaces, as opposed to hard tabs (which it used to be).
This is the Python standard.

For hanging indentation, use 8 spaces plus all args should be on the new line.

```

     # Either of the following hanging indentation is considered acceptable.
YES: return 'class: %s, host: %s, args = %s' % (
             self.__class__.__name__, self.hostname, self.args)

YES: return 'class: %s, host: %s, args = %s' % (
             self.__class__.__name__,
             self.hostname,
             self.args)

     # Do not use 4 spaces for hanging indentation
NO:  return 'class: %s, host: %s, args = %s' % (
         self.__class__.__name__, self.hostname, self.args)

     # Do put all args on new line
NO:  return 'class: %s, host: %s, args = %s' % (self.__class__.__name__,
             self.hostname, self.args)
```

Don't leave trailing whitespace, or put whitespace on blank lines.


## Variable names and UpPeR cAsE
 * Use descriptive variable names where possible
 * Use `variable_names_like_this`
 * Use `method_and_function_names_like_this`
 * Use `UpperCamelCase` for class names


## Importing modules

The order of imports should be as follows:

 * Standard python modules
 * Non-standard python modules
 * Autotest modules

Within one of these three sections, all module imports using the from
keyword should appear after regular imports.
Each module should be imported on its own line.
Do not use Wildcard imports (`from x import *`) if possible.

Import modules, not classes.  For example:

```
from common_lib import error

def foo():
    raise error.AutoservError(...)
```

and not:

```
from common_lib.error import AutoservError
```

For example:

```
import os
import pickle
import random
import re
import select
import shutil
import signal
import subprocess

import common   # Magic autotest_lib module and sys.path setup code.
import MySQLdb  # After common so that we check our site-packages first.

from common_lib import error
```

## Testing None

Use `is None` rather than `== None` and `is not None` rather than `!= None`.
This way you'll never run into a case where someone's `__eq__` or `__ne__`
method does the wrong thing.


## Comments

Generally, you want your comments to tell WHAT your code does, not HOW.
We can figure out how from the code itself (or if not, your code needs fixing).

Try to describle the intent of a function and what it does in a triple-quoted
(multiline) string just after the def line. We've tried to do that in most
places, though undoubtedly we're not perfect. A high level overview is
incredibly helpful in understanding code.


## Hardcoded String Formatting

Strings should use only single quotes for hardcoded strings in the code.
Double quotes are acceptable when single quote is used as part of the string.
Multiline strings should not use '\' but wrap the string using parentheseses.

```
REALLY_LONG_STRING = ('This is supposed to be a really long string that is '
                      'over 80 characters and does not use a slash to '
                      'continue.')
```

## Docstrings

Docstrings are important to keep our code self documenting. While it's not
necessary to overdo documentation, we ask you to be sensible and document any
nontrivial function. When creating docstrings, please add a newline at the
beginning of your triple quoted string and another newline at the end of it. If
the docstring has multiple lines, please include a short summary line followed
by a blank line before continuing with the rest of the description. Please
capitalize and punctuate accordingly the sentences. If the description has
multiple lines, put two levels of indentation before proceeding with text. An
example docstring:

```python
def foo(param1, param2):
    """
    Summary line.

    Long description of method foo.

    @param param1: A Spam object that has methods bar() and baz()
            which raise SpamError if something goes awry.
    @type param1: Spam

    @return: a list of integers describing changes in a source tree
    @rtype: list

    @raise SpamError: when some stated condition occurs.

    """
```

The tags that you can put inside your docstring are tags recognized by systems
like epydoc. Not all places need all tags defined, so choose them wisely while
writing code. Generally always list any parameters, the return value (if there
is one), and exceptions that can be raised.

|   Tag    | Description
|----------|-------------------------------------------------------------------
| @author  | Code author
| @cvar    | Class variable (defined on `self.__class__.`)
| @ivar    | Instance variable for a class (defined on `self.`)
| @param   | Parameter description
| @raise   | Exception type the function can throw, and the conditions for it
| @return  | Return value description
| @rtype   | The type the method returns
| @see     | Reference to other parts of the codebase
| @type    | The type of a given parameter or variable
| @warning | Call attention to potential problems with the code
| @version | Version string

For additional information and fields, refer to the epydoc manual:
http://epydoc.sourceforge.net/manual-fields.html

## Simple code

Keep it simple; this is not the right place to show how smart you are. We
have plenty of system failures to deal with without having to spend ages
figuring out your code, thanks ;-) Readbility, readability, readability.
Strongly prefer readability and simplicity over compactness.

"Debugging is twice as hard as writing the code in the first place. Therefore,
if you write the code as cleverly as possible, you are, by definition, not
smart enough to debug it."  Brian Kernighan


## Function length

Please keep functions short, under 30 lines or so if possible. Even though
you are amazingly clever, and can cope with it, the rest of us are busy and
stupid, so be nice and help us out. To quote the Linux Kernel coding style:

Functions should be short and sweet, and do just one thing.  They should
fit on one or two screenfuls of text (the ISO/ANSI screen size is 80x24,
as we all know), and do one thing and do that well.


## Exceptions

When raising exceptions, the preferred syntax for it is:

```
raise FooException('Exception Message')
```

Please don't raise string exceptions, as they're deprecated and will be removed
from future versions of python. If you're in doubt about what type of exception
you will raise, please look at http://docs.python.org/lib/module-exceptions.html
and client/common\_lib/error.py, the former is a list of python built in
exceptions and the later is a list of autotest/autoserv internal exceptions. Of
course, if you really need to, you can extend the exception definitions on
client/common\_lib/error.py.


## Submitting patches

Submit changes through the Chrome OS gerrit instance.  This process is
documented on
[chromium.org](http://dev.chromium.org/developers/contributing-code).
