From 2ff5883f0493fb2a40d69e6d9a56845be6cd0a25 Mon Sep 17 00:00:00 2001 From: Tres Seaver Date: Mon, 10 Nov 2014 16:18:34 -0500 Subject: [PATCH 1/6] Avoid confusing pylint's 'missing-format-attribute'. --- gcloud/storage/key.py | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/gcloud/storage/key.py b/gcloud/storage/key.py index 958f2f844d9f..8104f5313953 100644 --- a/gcloud/storage/key.py +++ b/gcloud/storage/key.py @@ -126,9 +126,11 @@ def public_url(self): :rtype: `string` :returns: The public URL for this key. """ - return '{storage_base_url}/{self.bucket.name}/{self.name}'.format( + return '{storage_base_url}/{bucket_name}/{key_name}'.format( storage_base_url='http://commondatastorage.googleapis.com', - self=self) + key_name=self.name, + bucket_name=self.bucket.name, + ) def generate_signed_url(self, expiration, method='GET'): """Generates a signed URL for this key. @@ -151,7 +153,10 @@ def generate_signed_url(self, expiration, method='GET'): :returns: A signed URL you can use to access the resource until expiration. """ - resource = '/{self.bucket.name}/{self.name}'.format(self=self) + resource = '/{bucket_name}/{key_name}'.format( + key_name=self.name, + bucket_name=self.bucket.name, + ) return self.connection.generate_signed_url(resource=resource, expiration=expiration, method=method) From 982c51cd43002f1f7b4f5694488ea140d48be941 Mon Sep 17 00:00:00 2001 From: Tres Seaver Date: Mon, 10 Nov 2014 16:44:11 -0500 Subject: [PATCH 2/6] Rename '_get_protobuf_attribute_and_value'->'_pb_attr_value'. Helper, not API; unused outside 'gcloud.datastore.helpers'. Removes pylintrc wart. --- gcloud/datastore/helpers.py | 8 ++++---- gcloud/datastore/test_helpers.py | 6 +++--- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/gcloud/datastore/helpers.py b/gcloud/datastore/helpers.py index e6244d025bdc..66ef4567ad37 100644 --- a/gcloud/datastore/helpers.py +++ b/gcloud/datastore/helpers.py @@ -74,7 +74,7 @@ def key_from_protobuf(pb): return Key(path, namespace, dataset_id) -def _get_protobuf_attribute_and_value(val): +def _pb_attr_value(val): """Given a value, return the protobuf attribute name and proper value. The Protobuf API uses different attribute names @@ -96,9 +96,9 @@ def _get_protobuf_attribute_and_value(val): For example: - >>> _get_protobuf_attribute_and_value(1234) + >>> _pb_attr_value(1234) ('integer_value', 1234) - >>> _get_protobuf_attribute_and_value('my_string') + >>> _pb_attr_value('my_string') ('string_value', 'my_string') :type val: `datetime.datetime`, :class:`gcloud.datastore.key.Key`, @@ -230,7 +230,7 @@ def _set_protobuf_value(value_pb, val): value_pb.Clear() return - attr, val = _get_protobuf_attribute_and_value(val) + attr, val = _pb_attr_value(val) if attr == 'key_value': value_pb.key_value.CopyFrom(val) elif attr == 'entity_value': diff --git a/gcloud/datastore/test_helpers.py b/gcloud/datastore/test_helpers.py index a845c6c920f7..893ed2ccacb4 100644 --- a/gcloud/datastore/test_helpers.py +++ b/gcloud/datastore/test_helpers.py @@ -118,12 +118,12 @@ def test_w_path_in_pb(self): self.assertEqual(key.path(), _PATH) -class Test__get_protobuf_attribute_and_value(unittest2.TestCase): +class Test__pb_attr_value(unittest2.TestCase): def _callFUT(self, val): - from gcloud.datastore.helpers import _get_protobuf_attribute_and_value + from gcloud.datastore.helpers import _pb_attr_value - return _get_protobuf_attribute_and_value(val) + return _pb_attr_value(val) def test_datetime_naive(self): import calendar From e9e69f9cdab0b4f51658da9ed311069553f24e57 Mon Sep 17 00:00:00 2001 From: Tres Seaver Date: Mon, 10 Nov 2014 16:45:59 -0500 Subject: [PATCH 3/6] Annotate base pylintrc. Generated from 'pylint --generate-rcfile'. Defaults are commented out. Exceptions to defaults include a rationale. Note generation of 'pylintrc_reduced'. --- pylintrc_default | 402 ++++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 381 insertions(+), 21 deletions(-) diff --git a/pylintrc_default b/pylintrc_default index 1caa15be925c..94d34c18ed2e 100644 --- a/pylintrc_default +++ b/pylintrc_default @@ -1,33 +1,393 @@ -# This config is intended to be used for library -# and other production code. +# PyLint config for 'gcloud' *library* code. +# +# NOTES: +# +# - Rules for test / demo code are generated into 'pylintrc_reduced' +# as deltas from this configuration by the 'run_pylint.py' script. +# +# - 'RATIONALE: API mapping' as a defence for non-default settings is +# based on the fact that this library maps APIs which are outside our +# control, and adhereing to the out-of-the-box defaults would induce +# breakage / complexity in those mappings +# +[MASTER] -[BASIC] -good-names = i, j, k, ex, Run, _, pb, id, - _get_protobuf_attribute_and_value +# Specify a configuration file. +# DEFAULT: rcfile= -[DESIGN] -max-args = 10 +# Python code to execute, usually for sys.path manipulation such as +# pygtk.require(). +# DEFAULT: init-hook= -[FORMAT] -# NOTE: By default pylint ignores whitespace checks around the -# constructs "dict-separator" (cases like {1:2}) and "trailing-comma" -# (cases like {1: 2, }). By setting "no-space-check" to empty -# whitespace checks will be enforced around both constructs. -no-space-check = +# Profiled execution. +# DEFAULT: profile=no -[MASTER] +# Add files or directories to the blacklist. They should be base names, not +# paths. +# DEFAULT: ignore=CVS # NOTE: This path must be relative due to the use of # os.walk in astroid.modutils.get_module_files. -ignore = datastore_v1_pb2.py +# RATIONALE: +# datastore_v1_pb2.py: protobuf-generated code. +ignore = + datastore_v1_pb2.py + +# Pickle collected data for later comparisons. +# DEFAULT: persistent=yes + +# List of plugins (as comma separated values of python modules names) to load, +# usually to register additional checkers. +# DEFAULT: load-plugins= + +# DEPRECATED +# DEFAULT: include-ids=no + +# DEPRECATED +# DEFAULT: symbols=no + [MESSAGES CONTROL] -disable = I, protected-access, maybe-no-member, no-member, - redefined-builtin, star-args, missing-format-attribute, - similarities, arguments-differ, - too-many-public-methods, too-few-public-methods + +# Enable the message, report, category or checker with the given id(s). You can +# either give multiple identifier separated by comma (,) or put this option +# multiple time. See also the "--disable" option for examples. +# DEFAULT: enable= + +# 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" +# DEFAULT: disable= +# 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. +# - redefined-builtin: use of 'id', 'type', 'filter' args in API-bound funcs; +# use of 'NotImplemented' to map HTTP response code. +# - similarities: 'Bucket' and 'Key' define 'metageneration' and 'owner' with +# identical implementation but different docstrings. +# - star-args: standard Python idioms for varargs: +# ancestor = Key.from_path(*ancestor) +disable = + maybe-no-member, + no-member, + protected-access, + redefined-builtin, + similarities, + star-args, + [REPORTS] -reports = no + +# Set the output format. Available formats are text, parseable, colorized, msvs +# (visual studio) and html. You can also give a reporter class, eg +# mypackage.mymodule.MyReporterClass. +# DEFAULT: output-format=text + +# Put messages in a separate file for each module / package specified on the +# command line instead of printing them on stdout. Reports (if any) will be +# written in a file name "pylint_global.[txt|html]". +# DEFAULT: files-output=no + +# Tells whether to display a full report or only the messages +# DEFAULT: reports=yes +# RATIONALE: run from Travis / tox, and don't need / want to parse output. +reports=no + +# Python expression which should return a note less than 10 (10 is the highest +# note). You have access to the variables errors warning, statement which +# respectively contain the number of errors / warnings messages and the total +# number of statements analyzed. This is used by the global evaluation report +# (RP0004). +# DEFAULT: evaluation=10.0 - ((float(5 * error + warning + refactor + convention) / statement) * 10) + +# Add a comment according to your evaluation note. This is used by the global +# evaluation report (RP0004). +# DEFAULT: comment=no + +# Template used to display messages. This is a python new-style format string +# used to format the message information. See doc for all details +#msg-template= + + +[SIMILARITIES] + +# Minimum lines number of a similarity. +# DEFAULT: min-similarity-lines=4 + +# Ignore comments when computing similarities. +# DEFAULT: ignore-comments=yes + +# Ignore docstrings when computing similarities. +# DEFAULT: ignore-docstrings=yes + +# Ignore imports when computing similarities. +# DEFAULT: ignore-imports=no + [VARIABLES] -dummy-variables-rgx = _$|dummy|^unused_ + +# Tells whether we should check for unused import in __init__ files. +# DEFAULT: init-import=no + +# A regular expression matching the name of dummy variables (i.e. expectedly +# not used). +# DEFAULT: dummy-variables-rgx=_$|dummy + +# List of additional names supposed to be defined in builtins. Remember that +# you should avoid to define new builtins when possible. +# DEFAULT: additional-builtins= + + +[LOGGING] + +# Logging modules to check that the string format arguments are in logging +# function parameter format +# DEFAULT: logging-modules=logging + + +[FORMAT] + +# Maximum number of characters on a single line. +# DEFAULT: max-line-length=80 + +# Regexp for a line that is allowed to be longer than the limit. +# DEFAULT: ignore-long-lines=^\s*(# )??$ + +# Allow the body of an if to be on the same line as the test if there is no +# else. +# DEFAULT: single-line-if-stmt=no + +# List of optional constructs for which whitespace checking is disabled +# DEFAULT: no-space-check=trailing-comma,dict-separator +# RATIONALE: pylint ignores whitespace checks around the +# constructs "dict-separator" (cases like {1:2}) and +# "trailing-comma" (cases like {1: 2, }). +# By setting "no-space-check" to empty whitespace checks will be +# enforced around both constructs. +no-space-check = + +# Maximum number of lines in a module +# DEFAULT: max-module-lines=1000 +# RATIONALE: API-mapping +max-module-lines=1500 + +# String used as indentation unit. This is usually " " (4 spaces) or "\t" (1 +# tab). +# DEFAULT: indent-string=' ' + +# Number of spaces of indent required inside a hanging or continued line. +# DEFAULT: indent-after-paren=4 + + +[MISCELLANEOUS] + +# List of note tags to take in consideration, separated by a comma. +# DEFAULT: notes=FIXME,XXX,TODO + + +[BASIC] + +# Required attributes for module, separated by a comma +# DEFAULT: required-attributes= + +# List of builtins function names that should not be used, separated by a comma +# DEFAULT: bad-functions=map,filter,apply,input,file + +# Good variable names which should always be accepted, separated by a comma +# DEFAULT: good-names=i,j,k,ex,Run,_ +# RATIONALE: 'pb' adn 'id' have well-understood meainings in the code. +good-names = i, j, k, ex, Run, _, + pb, + id, + +# Bad variable names which should always be refused, separated by a comma +# DEFAULT: bad-names=foo,bar,baz,toto,tutu,tata + +# Colon-delimited sets of names that determine each other's naming style when +# the name regexes allow several styles. +# DEFAULT: name-group= + +# Include a hint for the correct naming format with invalid-name +# DEFAULT: include-naming-hint=no + +# Regular expression matching correct function names +# DEFAULT: function-rgx=[a-z_][a-z0-9_]{2,30}$ + +# Naming hint for function names +# DEFAULT: function-name-hint=[a-z_][a-z0-9_]{2,30}$ + +# Regular expression matching correct variable names +# DEFAULT: variable-rgx=[a-z_][a-z0-9_]{2,30}$ + +# Naming hint for variable names +# DEFAULT: variable-name-hint=[a-z_][a-z0-9_]{2,30}$ + +# Regular expression matching correct constant names +# DEFAULT: const-rgx=(([A-Z_][A-Z0-9_]*)|(__.*__))$ + +# Naming hint for constant names +# DEFAULT: const-name-hint=(([A-Z_][A-Z0-9_]*)|(__.*__))$ + +# Regular expression matching correct attribute names +# DEFAULT: attr-rgx=[a-z_][a-z0-9_]{2,30}$ + +# Naming hint for attribute names +# DEFAULT: attr-name-hint=[a-z_][a-z0-9_]{2,30}$ + +# Regular expression matching correct argument names +# DEFAULT: argument-rgx=[a-z_][a-z0-9_]{2,30}$ + +# Naming hint for argument names +# DEFAULT: argument-name-hint=[a-z_][a-z0-9_]{2,30}$ + +# Regular expression matching correct class attribute names +# DEFAULT: class-attribute-rgx=([A-Za-z_][A-Za-z0-9_]{2,30}|(__.*__))$ + +# Naming hint for class attribute names +# DEFAULT: class-attribute-name-hint=([A-Za-z_][A-Za-z0-9_]{2,30}|(__.*__))$ + +# Regular expression matching correct inline iteration names +# DEFAULT: inlinevar-rgx=[A-Za-z_][A-Za-z0-9_]*$ + +# Naming hint for inline iteration names +# DEFAULT: inlinevar-name-hint=[A-Za-z_][A-Za-z0-9_]*$ + +# Regular expression matching correct class names +# DEFAULT: class-rgx=[A-Z_][a-zA-Z0-9]+$ + +# Naming hint for class names +# DEFAULT: class-name-hint=[A-Z_][a-zA-Z0-9]+$ + +# Regular expression matching correct module names +# DEFAULT: module-rgx=(([a-z_][a-z0-9_]*)|([A-Z][a-zA-Z0-9]+))$ + +# Naming hint for module names +# DEFAULT: module-name-hint=(([a-z_][a-z0-9_]*)|([A-Z][a-zA-Z0-9]+))$ + +# Regular expression matching correct method names +# DEFAULT: method-rgx=[a-z_][a-z0-9_]{2,30}$ + +# Naming hint for method names +# DEFAULT: method-name-hint=[a-z_][a-z0-9_]{2,30}$ + +# Regular expression which should only match function or class names that do +# not require a docstring. +# DEFAULT: no-docstring-rgx=__.*__ + +# Minimum line length for functions/classes that require docstrings, shorter +# ones are exempt. +# DEFAULT: docstring-min-length=-1 + + +[TYPECHECK] + +# Tells whether missing members accessed in mixin class should be ignored. A +# mixin class is detected if its name ends with "mixin" (case insensitive). +# DEFAULT: ignore-mixin-members=yes + +# 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 +# DEFAULT: ignored-modules= + +# List of classes names for which member attributes should not be checked +# (useful for classes with attributes dynamically set). +# DEFAULT: ignored-classes=SQLObject + +# When zope mode is activated, add a predefined set of Zope acquired attributes +# to generated-members. +# DEFAULT: zope=no + +# List of members which are set dynamically and missed by pylint inference +# system, and so shouldn't trigger E0201 when accessed. Python regular +# expressions are accepted. +# DEFAULT: generated-members=REQUEST,acl_users,aq_parent + + +[IMPORTS] + +# Deprecated modules which should not be used, separated by a comma +# DEFAULT: deprecated-modules=regsub,TERMIOS,Bastion,rexec + +# Create a graph of every (i.e. internal and external) dependencies in the +# given file (report RP0402 must not be disabled) +# DEFAULT: import-graph= + +# Create a graph of external dependencies in the given file (report RP0402 must +# not be disabled) +# DEFAULT: ext-import-graph= + +# Create a graph of internal dependencies in the given file (report RP0402 must +# not be disabled) +# DEFAULT: int-import-graph= + + +[CLASSES] + +# List of interface methods to ignore, separated by a comma. This is used for +# instance to not check methods defines in Zope's Interface base class. +# DEFAULT: ignore-iface-methods=isImplementedBy,deferred,extends,names,namesAndDescriptions,queryDescriptionFor,getBases,getDescriptionFor,getDoc,getName,getTaggedValue,getTaggedValueTags,isEqualOrExtendedBy,setTaggedValue,isImplementedByInstancesOf,adaptWith,is_implemented_by + +# List of method names used to declare (i.e. assign) instance attributes. +# DEFAULT: defining-attr-methods=__init__,__new__,setUp + +# List of valid names for the first argument in a class method. +# DEFAULT: valid-classmethod-first-arg=cls + +# List of valid names for the first argument in a metaclass class method. +# DEFAULT: valid-metaclass-classmethod-first-arg=mcs + + +[DESIGN] + +# Maximum number of arguments for function / method +# DEFAULT: max-args=5 +# RATIONALE: API-mapping +max-args = 10 + +# Argument names that match this expression will be ignored. Default to name +# with leading underscore +# DEFAULT: ignored-argument-names=_.* + +# Maximum number of locals for function / method body +# DEFAULT: max-locals=15 + +# Maximum number of return / yield for function / method body +# DEFAULT: max-returns=6 + +# Maximum number of branch for function / method body +# DEFAULT: max-branches=12 + +# Maximum number of statements in function / method body +# DEFAULT: max-statements=50 + +# Maximum number of parents for a class (see R0901). +# DEFAULT: max-parents=7 + +# Maximum number of attributes for a class (see R0902). +# DEFAULT: max-attributes=7 +# RATIONALE: API mapping +max-attributes=15 + +# 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 public methods for a class (see R0904). +# DEFAULT: max-public-methods=20 +# RATIONALE: API mapping +max-public-methods=40 + + +[EXCEPTIONS] + +# Exceptions that will emit a warning when being caught. Defaults to +# "Exception" +# DEFAULT: overgeneral-exceptions=Exception From ecb5ded098dac9d00e7b742d56f1ddebbce05301 Mon Sep 17 00:00:00 2001 From: Tres Seaver Date: Mon, 10 Nov 2014 17:00:07 -0500 Subject: [PATCH 4/6] US speling. --- pylintrc_default | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pylintrc_default b/pylintrc_default index 94d34c18ed2e..cf2b2291749c 100644 --- a/pylintrc_default +++ b/pylintrc_default @@ -5,7 +5,7 @@ # - Rules for test / demo code are generated into 'pylintrc_reduced' # as deltas from this configuration by the 'run_pylint.py' script. # -# - 'RATIONALE: API mapping' as a defence for non-default settings is +# - 'RATIONALE: API mapping' as a defense for non-default settings is # based on the fact that this library maps APIs which are outside our # control, and adhereing to the out-of-the-box defaults would induce # breakage / complexity in those mappings From 5e0f5c34df901e57421c5eba4250f560d507a8a6 Mon Sep 17 00:00:00 2001 From: Tres Seaver Date: Mon, 10 Nov 2014 17:00:39 -0500 Subject: [PATCH 5/6] Moar speling. --- pylintrc_default | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pylintrc_default b/pylintrc_default index cf2b2291749c..871c9f6488c2 100644 --- a/pylintrc_default +++ b/pylintrc_default @@ -201,7 +201,7 @@ max-module-lines=1500 # Good variable names which should always be accepted, separated by a comma # DEFAULT: good-names=i,j,k,ex,Run,_ -# RATIONALE: 'pb' adn 'id' have well-understood meainings in the code. +# RATIONALE: 'pb' and 'id' have well-understood meainings in the code. good-names = i, j, k, ex, Run, _, pb, id, From 1a79f4cfc95de9ba788d654f414600596a33c5ef Mon Sep 17 00:00:00 2001 From: Tres Seaver Date: Tue, 11 Nov 2014 09:15:23 -0500 Subject: [PATCH 6/6] Update 'max-locals' as needed by #364. --- pylintrc_default | 1 + 1 file changed, 1 insertion(+) diff --git a/pylintrc_default b/pylintrc_default index 871c9f6488c2..12eb9eb058d2 100644 --- a/pylintrc_default +++ b/pylintrc_default @@ -357,6 +357,7 @@ max-args = 10 # Maximum number of locals for function / method body # DEFAULT: max-locals=15 +max-locals=20 # Maximum number of return / yield for function / method body # DEFAULT: max-returns=6