Basic project setup (#4)
diff --git a/pylintrc b/pylintrc
new file mode 100644
index 0000000..1a47c02
--- /dev/null
+++ b/pylintrc
@@ -0,0 +1,164 @@
+[MASTER]
+# Add files or directories to the blacklist. They should be base names, not
+# paths.
+ignore=CVS,.git,.cache,.tox,.nox
+
+# List of plugins (as comma separated values of python modules names) to load,
+# usually to register additional checkers.
+# DEFAULT: load-plugins=
+# RATIONALE: We want to make sure our docstrings match the objects
+# they document.
+load-plugins=pylint.extensions.check_docs
+
+[MESSAGES CONTROL]
+# Disable the message, report, category or checker with the given id(s). You
+# can either give multiple identifiers separated by comma (,) or put this
+# option multiple times (only on the command line, not in the configuration
+# file where it should appear only once).You can also use "--disable=all" to
+# disable everything first and then reenable specific checks. For example, if
+# you want to run only the similarities checker, you can use "--disable=all
+# --enable=similarities". If you want to run only the classes checker, but have
+# no Warning level messages displayed, use"--disable=all --enable=classes
+# --disable=W"
+#
+# RATIONALE:
+# - maybe-no-member: bi-modal functions confuse pylint type inference.
+# - no-member: indirections in protobuf-generated code
+# - protected-access: helpers use '_foo' of classes from generated code.
+# - similarities: 'Bucket' and 'Blob' define 'metageneration' and 'owner' with
+# identical implementation but different docstrings.
+# - star-args: standard Python idioms for varargs:
+# ancestor = Query().filter(*order_props)
+# - redefined-variable-type: This error is overzealous and complains at e.g.
+# if some_prop:
+# return int(value)
+# else:
+# return float(value)
+# - import-error: imports are checked via tests.
+# - wrong-import-position: This error is overzealous. It assumes imports are
+# completed whenever something non-trivial is
+# defined, e.g.
+# try:
+# from foo import Bar
+# except ImportError:
+# class Bar(object):
+# """Hi everyone"""
+# and thus causes subsequent imports to be
+# diagnosed as out-of-order.
+# - no-name-in-module: Error gives a lot of false positives for names which
+# are defined dynamically. Also, any truly missing names
+# will be detected by our 100% code coverage.
+# - locally-disabled: Allow us to make exceptions in edge cases, notably where
+# pylint doesn't recognize inherited properties and methods
+# and gives unused-argument errors.
+# TEMPORARILY DISABLE AND SHOULD BE REMOVED:
+# - fixme: disabled until 1.0
+#
+disable =
+ import-star-module-level,
+ old-octal-literal,
+ oct-method,
+ print-statement,
+ unpacking-in-except,
+ parameter-unpacking,
+ backtick,
+ old-raise-syntax,
+ old-ne-operator,
+ long-suffix,
+ dict-view-method,
+ dict-iter-method,
+ metaclass-assignment,
+ next-method-called,
+ raising-string,
+ indexing-exception,
+ raw_input-builtin,
+ long-builtin,
+ file-builtin,
+ execfile-builtin,
+ coerce-builtin,
+ cmp-builtin,
+ buffer-builtin,
+ basestring-builtin,
+ apply-builtin,
+ filter-builtin-not-iterating,
+ using-cmp-argument,
+ useless-suppression,
+ range-builtin-not-iterating,
+ suppressed-message,
+ no-absolute-import,
+ old-division,
+ cmp-method,
+ reload-builtin,
+ zip-builtin-not-iterating,
+ intern-builtin,
+ unichr-builtin,
+ reduce-builtin,
+ standarderror-builtin,
+ unicode-builtin,
+ xrange-builtin,
+ coerce-method,
+ delslice-method,
+ getslice-method,
+ setslice-method,
+ input-builtin,
+ round-builtin,
+ hex-method,
+ nonzero-method,
+ map-builtin-not-iterating,
+ maybe-no-member,
+ no-member,
+ protected-access,
+ similarities,
+ star-args,
+ redefined-variable-type,
+ import-error,
+ wrong-import-position,
+ no-name-in-module,
+ locally-disabled,
+ fixme
+
+
+[REPORTS]
+# Tells whether to display a full report or only the messages
+# RATIONALE: noisy
+reports=no
+
+[BASIC]
+# Regular expression matching correct method names
+# DEFAULT: method-rgx=[a-z_][a-z0-9_]{2,30}$
+# RATIONALE: Some methods have longer names to be more descriptive or precise,
+# especially those that implemented wordy RFCs.
+method-rgx=[a-z_][a-z0-9_]{2,40}$
+
+# Regular expression matching correct function names
+# DEFAULT function-rgx=[a-z_][a-z0-9_]{2,30}$
+# RATIONALE: Some methods have longer names to be more descriptive or precise,
+# especially those that implemented wordy RFCs.
+function-rgx=[a-z_][a-z0-9_]{2,40}$
+
+[TYPECHECK]
+# List of module names for which member attributes should not be checked
+# (useful for modules/projects where namespaces are manipulated during runtime
+# and thus existing member attributes cannot be deduced by static analysis. It
+# supports qualified module names, as well as Unix pattern matching.
+# DEFAULT: ignored-modules=
+# RATIONALE: six aliases stuff for compatibility.
+# google.protobuf fixes up namespace package "late".
+ignored-modules = six, google.protobuf
+
+
+[DESIGN]
+# Minimum number of public methods for a class (see R0903).
+# DEFAULT: min-public-methods=2
+# RATIONALE: context mgrs may have *no* public methods
+min-public-methods=0
+
+# Maximum number of arguments for function / method
+# DEFAULT: max-args=5
+# RATIONALE: Many credentials classes take a lot of parameters.
+max-args = 10
+
+# Maximum number of attributes for a class (see R0902).
+# DEFAULT: max-attributes=7
+# RATIONALE: Many credentials need to track lots of properties.
+max-attributes=15