From 51641aacf62f90623305b2a148b05042c86de1c8 Mon Sep 17 00:00:00 2001 From: Alexey Stepanov Date: Fri, 7 Sep 2018 15:56:10 +0200 Subject: [PATCH] port CI and pylint rules from master Signed-off-by: Alexey Stepanov --- .pylintrc | 692 +++++++++++++++++++++++++---------------- .travis.yml | 109 +++++-- doc/source/logwrap.rst | 4 +- logwrap/_log_wrap.py | 26 +- logwrap/_repr_utils.py | 31 +- setup.cfg | 5 + tox.ini | 7 +- 7 files changed, 576 insertions(+), 298 deletions(-) diff --git a/.pylintrc b/.pylintrc index 9e6d02f..c502ae9 100644 --- a/.pylintrc +++ b/.pylintrc @@ -1,176 +1,190 @@ [MASTER] -# Specify a configuration file. -#rcfile= +# A comma-separated list of package or module names from where C extensions may +# be loaded. Extensions are loading into the active Python interpreter and may +# run arbitrary code. +extension-pkg-whitelist= + +# Add files or directories to the blacklist. They should be base names, not +# paths. +ignore=CVS, + .tox, + logs, + build + +# Add files or directories matching the regex patterns to the blacklist. The +# regex matches against base names, not paths. +ignore-patterns= # Python code to execute, usually for sys.path manipulation such as # pygtk.require(). #init-hook= -# Add files or directories to the blacklist. They should be base names, not -# paths. -ignore=CVS, tox, logs +# Use multiple processes to speed up Pylint. Specifying 0 will auto-detect the +# number of processors available to use. +jobs=1 -# Pickle collected data for later comparisons. -persistent=yes +# Control the amount of potential inferred values when inferring a single +# object. This can help the performance when dealing with large functions or +# complex, nested conditions. +limit-inference-results=100 # List of plugins (as comma separated values of python modules names) to load, # usually to register additional checkers. -load-plugins= +load-plugins=pylint.extensions.docparams, + pylint.extensions.docstyle, + pylint.extensions.overlapping_exceptions -# Use multiple processes to speed up Pylint. -jobs=1 +# Pickle collected data for later comparisons. +persistent=yes + +# Specify a configuration file. +#rcfile= + +# When enabled, pylint would attempt to guess common misconfiguration and emit +# user-friendly hints instead of false-positive error messages. +suggestion-mode=yes # Allow loading of arbitrary C extensions. Extensions are imported into the # active Python interpreter and may run arbitrary code. unsafe-load-any-extension=no -# A comma-separated list of package or module names from where C extensions may -# be loaded. Extensions are loading into the active Python interpreter and may -# run arbitrary code -extension-pkg-whitelist= - -# Allow optimization of some AST trees. This will activate a peephole AST -# optimizer, which will apply various small optimizations. For instance, it can -# be used to obtain the result of joining multiple strings with the addition -# operator. Joining a lot of strings can lead to a maximum recursion error in -# Pylint and this flag can prevent that. It has one side effect, the resulting -# AST will be different than the one from reality. -optimize-ast=no - [MESSAGES CONTROL] # Only show warnings with the listed confidence levels. Leave empty to show -# all. Valid levels: HIGH, INFERENCE, INFERENCE_FAILURE, UNDEFINED +# all. Valid levels: HIGH, INFERENCE, INFERENCE_FAILURE, UNDEFINED. confidence= -# 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. - -# old-style-class (C1001) -# return-arg-in-generator (E0106) -# slots-on-old-class (E1001) -# super-on-old-class (E1002) -# missing-super-argument (E1004) -# print-statement (E1601) -# parameter-unpacking (E1602) -# unpacking-in-except (E1603) -# old-raise-syntax (E1604) -# backtick (E1605) -# long-suffix (E1606) -# old-ne-operator (E1607) -# old-octal-literal (E1608) -# import-star-module-level (E1609) -# lowercase-l-suffix (W0332) -# deprecated-module (W0402) -# invalid-encoded-data (W0512) -# property-on-old-class (W1001) -# boolean-datetime (W1502) -# deprecated-method (W1505) -# apply-builtin (W1601) -# basestring-builtin (W1602) -# buffer-builtin (W1603) -# cmp-builtin (W1604) -# coerce-builtin (W1605) -# execfile-builtin (W1606) -# file-builtin (W1607) -# long-builtin (W1608) -# raw_input-builtin (W1609) -# reduce-builtin (W1610) -# standarderror-builtin (W1611) -# unicode-builtin (W1612) -# xrange-builtin (W1613) -# coerce-method (W1614) -# delslice-method (W1615) -# getslice-method (W1616) -# setslice-method (W1617) -# old-division (W1619) -# dict-iter-method (W1620) -# dict-view-method (W1621) -# next-method-called (W1622) -# metaclass-assignment (W1623) -# indexing-exception (W1624) -# raising-string (W1625) -# reload-builtin (W1626) -# oct-method (W1627) -# hex-method (W1628) -# nonzero-method (W1629) -# cmp-method (W1630) -# input-builtin (W1632) -# round-builtin (W1633) -# intern-builtin (W1634) -# unichr-builtin (W1635) -# map-builtin-not-iterating (W1636) -# zip-builtin-not-iterating (W1637) -# range-builtin-not-iterating (W1638) -# filter-builtin-not-iterating (W1639) -# filter-builtin-not-iterating (W1639) -# using-cmp-argument (W1640) - -enable = E0106,C1001,E1001,E1002,E1004,E1601,E1602,E1603,E1604,E1605,E1606,E1607,E1608,E1609,W0332,W0402,W0512,W1001,W1502,W1505,W1601,W1602,W1603,W1604,W1605,W1606,W1607,W1608,W1609,W1610,W1611,W1612,W1613,W1614,W1615,W1616,W1617,W1619,W1620,W1621,W1622,W1623,W1624,W1625,W1626,W1627,W1628,W1629,W1630,W1632,W1633,W1634,W1635,W1636,W1637,W1638,W1639,W1640, - # 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 +# 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" - -# Disabling pointless reports: -# RP0401: External dependencies -# RP0402: Modules dependencies graph -# RP0801: Duplication -# R0801: Duplication - -# Disabling messages: -# pointless-string-statement (W0105) -# bad-builtin (W0141) -# fixme (W0511) -# redefined-outer-name (W0621) -# cell-var-from-loop (W0640) -# bare-except (W0702) -# broad-except (W0703) -# logging-format-interpolation (W1202) -# anomalous-backslash-in-string (W1401) - DO NOT ENABLE, INCORRECTLY PARSES REGEX - -# invalid-name (C0103) -# misplaced-comparison-constant (C0122) -# bad-continuation (C0330) - -# too-many-ancestors (R0901) -# too-many-public-methods (R0904) -# too-few-public-methods (R0903) -# too-many-return-statements (R0911) -# too-many-branches (R0912) -# too-many-arguments (R0913) -# too-many-locals (R0914) -# too-many-statements (R0915) - -# locally-disabled (I0011) -# locally-enabled (I0012) - -disable=RP0401,RP0402,RP0801,R0801,W0141,W0621,W1202,W1401,W0703,W0702,W0640,C0122,W0511, C0103, R0903, C0330, R0915, R0914, R0912, W0105, R0904, R0911, R0913, R0901, I0011, I0012 - -[REPORTS] +# no Warning level messages displayed, use "--disable=all --enable=classes +# --disable=W". +disable=invalid-name, + misplaced-comparison-constant, + bad-continuation, + non-ascii-bytes-literal, + raw-checker-failed, + bad-inline-option, + locally-disabled, + locally-enabled, + file-ignored, + suppressed-message, + useless-suppression, + deprecated-pragma, + use-symbolic-message-instead, + duplicate-code, + too-many-ancestors, + too-few-public-methods, + too-many-public-methods, + too-many-return-statements, + too-many-branches, + too-many-arguments, + too-many-locals, + too-many-statements, + pointless-string-statement, + fixme, + redefined-outer-name, + cell-var-from-loop, + bare-except, + broad-except, + logging-format-interpolation, + anomalous-backslash-in-string, + no-absolute-import, + eq-without-hash, + div-method, + idiv-method, + rdiv-method, + exception-message-attribute, + invalid-str-codec, + sys-max-int, + bad-python3-import, + deprecated-string-function, + deprecated-str-translate-call, + deprecated-itertools-function, + deprecated-types-field, + next-method-defined, + dict-items-not-iterating, + dict-keys-not-iterating, + dict-values-not-iterating, + deprecated-operator-function, + deprecated-urllib-function, + xreadlines-attribute, + deprecated-sys-function, + exception-escape, + comprehension-escape -# 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. -output-format=colorized -#output-format=parseable +# 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 (only on the command line, not in the configuration file where +# it should appear only once). See also the "--disable" option for examples. +enable=old-style-class, + return-arg-in-generator, + slots-on-old-class, + super-on-old-class, + missing-super-argument, + print-statement, + parameter-unpacking, + unpacking-in-except, + old-raise-syntax, + backtick, + long-suffix, + old-ne-operator, + old-octal-literal, + import-star-module-level, + c-extension-no-member, + lowercase-l-suffix, + deprecated-module, + invalid-encoded-data, + property-on-old-class, + boolean-datetime, + deprecated-method, + apply-builtin, + basestring-builtin, + buffer-builtin, + cmp-builtin, + coerce-builtin, + execfile-builtin, + file-builtin, + long-builtin, + raw_input-builtin, + reduce-builtin, + standarderror-builtin, + unicode-builtin, + xrange-builtin, + coerce-method, + delslice-method, + getslice-method, + setslice-method, + old-division, + dict-iter-method, + dict-view-method, + next-method-called, + metaclass-assignment, + indexing-exception, + raising-string, + reload-builtin, + oct-method, + hex-method, + nonzero-method, + cmp-method, + input-builtin, + round-builtin, + intern-builtin, + unichr-builtin, + map-builtin-not-iterating, + zip-builtin-not-iterating, + range-builtin-not-iterating, + filter-builtin-not-iterating, + using-cmp-argument -# 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]". -files-output=no -# Tells whether to display a full report or only the messages -reports=yes +[REPORTS] # 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 @@ -180,55 +194,122 @@ reports=yes evaluation=10.0 - ((float(5 * error + warning + refactor + convention) / statement) * 10) # Template used to display messages. This is a python new-style format string -# used to format the message information. See doc for all details +# used to format the message information. See doc for all details. #msg-template= +# Set the output format. Available formats are text, parseable, colorized, json +# and msvs (visual studio). You can also give a reporter class, e.g. +# mypackage.mymodule.MyReporterClass. +output-format=colorized -[VARIABLES] +# Tells whether to display a full report or only the messages. +reports=yes -# Tells whether we should check for unused import in __init__ files. -init-import=no +# Activate the evaluation score. +score=yes -# A regular expression matching the name of dummy variables (i.e. expectedly -# not used). -dummy-variables-rgx=_$|dummy + +[REFACTORING] + +# Maximum number of nested blocks for function / method body +max-nested-blocks=5 + +# Complete name of functions that never returns. When checking for +# inconsistent-return-statements if a never returning function is called then +# it will be considered as an explicit return statement and no message will be +# printed. +never-returning-functions=sys.exit + + +[VARIABLES] # List of additional names supposed to be defined in builtins. Remember that # you should avoid to define new builtins when possible. additional-builtins= +# Tells whether unused global variables should be treated as a violation. +allow-global-unused-variables=yes + # List of strings which can identify a callback function by name. A callback # name must start or end with one of those strings. -callbacks=cb_,_cb +callbacks=cb_, + _cb + +# A regular expression matching the name of dummy variables (i.e. expected to +# not be used). +dummy-variables-rgx=_$|dummy + +# Argument names that match this expression will be ignored. Default to name +# with leading underscore. +ignored-argument-names=_.* + +# Tells whether we should check for unused import in __init__ files. +init-import=no + +# List of qualified module names which can have objects that can redefine +# builtins. +redefining-builtins-modules=six.moves,past.builtins,future.builtins,builtins,io [TYPECHECK] +# List of decorators that produce context managers, such as +# contextlib.contextmanager. Add to this list to register other decorators that +# produce valid context managers. +contextmanager-decorators=contextlib.contextmanager + +# List of members which are set dynamically and missed by pylint inference +# system, and so shouldn't trigger E1101 when accessed. Python regular +# expressions are accepted. +generated-members= + # Tells whether missing members accessed in mixin class should be ignored. A # mixin class is detected if its name ends with "mixin" (case insensitive). ignore-mixin-members=yes +# Tells whether to warn about missing members when the owner of the attribute +# is inferred to be None. +ignore-none=yes + +# This flag controls whether pylint should warn about no-member and similar +# checks whenever an opaque object is returned when inferring. The inference +# can return multiple potential results while evaluating a Python object, but +# some branches might not be evaluated, which results in partial inference. In +# that case, it might be useful to still emit no-member and other checks for +# the rest of the inferred objects. +ignore-on-opaque-inference=yes + +# List of class names for which member attributes should not be checked (useful +# for classes with dynamically set attributes). This supports the use of +# qualified names. +ignored-classes= + # 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. ignored-modules= -# List of classes names for which member attributes should not be checked -# (useful for classes with attributes dynamically set). This supports can work -# with qualified names. -ignored-classes= +# Show a hint with possible names when a member name was not found. The aspect +# of finding the hint is based on edit distance. +missing-member-hint=yes -# List of members which are set dynamically and missed by pylint inference -# system, and so shouldn't trigger E1101 when accessed. Python regular -# expressions are accepted. -generated-members= +# The minimum edit distance a name should have in order to be considered a +# similar match for a missing member name. +missing-member-hint-distance=1 + +# The total number of similar names that should be taken in consideration when +# showing a hint for a missing member. +missing-member-max-choices=1 [SPELLING] +# Limits count of emitted suggestions for spelling mistakes. +max-spelling-suggestions=4 + # Spelling dictionary name. Available dictionaries: none. To make it working -# install python-enchant package. +# install python-enchant package.. spelling-dict= # List of comma separated words that should not be checked. @@ -244,9 +325,6 @@ spelling-store-unknown-words=no [SIMILARITIES] -# Minimum lines number of a similarity. -min-similarity-lines=10 - # Ignore comments when computing similarities. ignore-comments=yes @@ -256,204 +334,257 @@ ignore-docstrings=yes # Ignore imports when computing similarities. ignore-imports=no +# Minimum lines number of a similarity. +min-similarity-lines=10 + [MISCELLANEOUS] # List of note tags to take in consideration, separated by a comma. -notes=FIXME,XXX,TODO +notes=FIXME, + XXX, + TODO [LOGGING] # Logging modules to check that the string format arguments are in logging -# function parameter format +# function parameter format. logging-modules=logging [FORMAT] -# Maximum number of characters on a single line. -max-line-length=120 +# Expected format of line ending, e.g. empty (any line ending), LF or CRLF. +expected-line-ending-format= # Regexp for a line that is allowed to be longer than the limit. ignore-long-lines=^\s*(# )??$ -# Allow the body of an if to be on the same line as the test if there is no -# else. -single-line-if-stmt=no +# Number of spaces of indent required inside a hanging or continued line. +indent-after-paren=4 + +# String used as indentation unit. This is usually " " (4 spaces) or "\t" (1 +# tab). +indent-string=' ' + +# Maximum number of characters on a single line. +max-line-length=120 + +# Maximum number of lines in a module. +max-module-lines=1500 # List of optional constructs for which whitespace checking is disabled. `dict- # separator` is used to allow tabulation in dicts, etc.: {1 : 1,\n222: 2}. # `trailing-comma` allows a space between comma and closing bracket: (a, ). # `empty-line` allows space-only lines. -no-space-check=trailing-comma,dict-separator - -# Maximum number of lines in a module -max-module-lines=1500 - -# String used as indentation unit. This is usually " " (4 spaces) or "\t" (1 -# tab). -indent-string=' ' +no-space-check=trailing-comma, + dict-separator -# Number of spaces of indent required inside a hanging or continued line. -indent-after-paren=4 +# Allow the body of a class to be on the same line as the declaration if body +# contains single statement. +single-line-class-stmt=no -# Expected format of line ending, e.g. empty (any line ending), LF or CRLF. -expected-line-ending-format= +# Allow the body of an if to be on the same line as the test if there is no +# else. +single-line-if-stmt=no [BASIC] -# List of builtins function names that should not be used, separated by a comma -bad-functions=map,filter,input +# Naming style matching correct argument names. +argument-naming-style=snake_case -# Good variable names which should always be accepted, separated by a comma -good-names=i,j,k,ex,Run,_,x,e,ip - -# Bad variable names which should always be refused, separated by a comma -bad-names=foo,bar,baz,toto,tutu,tata +# Regular expression matching correct argument names. Overrides argument- +# naming-style. +argument-rgx=[a-z_][a-z0-9_]{2,30}$ -# Colon-delimited sets of names that determine each other's naming style when -# the name regexes allow several styles. -name-group= +# Naming style matching correct attribute names. +attr-naming-style=snake_case -# Include a hint for the correct naming format with invalid-name -include-naming-hint=no +# Regular expression matching correct attribute names. Overrides attr-naming- +# style. +attr-rgx=[a-z_][a-z0-9_]{2,30}$ -# Regular expression matching correct function names -function-rgx=[a-z_][a-z0-9_]{2,30}$ +# Bad variable names which should always be refused, separated by a comma. +bad-names=foo, + bar, + baz, + toto, + tutu, + tata -# Naming hint for function names -function-name-hint=[a-z_][a-z0-9_]{2,30}$ +# Naming style matching correct class attribute names. +class-attribute-naming-style=any -# Regular expression matching correct variable names -variable-rgx=[a-z_][a-z0-9_]{2,30}$ +# Regular expression matching correct class attribute names. Overrides class- +# attribute-naming-style. +class-attribute-rgx=([A-Za-z_][A-Za-z0-9_]{2,30}|(__.*__))$ -# Naming hint for variable names -variable-name-hint=[a-z_][a-z0-9_]{2,30}$ +# Naming style matching correct class names. +class-naming-style=PascalCase -# Regular expression matching correct constant names -const-rgx=(([A-Z_][A-Z0-9_]*)|(__.*__))$ +# Regular expression matching correct class names. Overrides class-naming- +# style. +class-rgx=[A-Z_][a-zA-Z0-9]+$ -# Naming hint for constant names -const-name-hint=(([A-Z_][A-Z0-9_]*)|(__.*__))$ +# Naming style matching correct constant names. +const-naming-style=UPPER_CASE -# Regular expression matching correct attribute names -attr-rgx=[a-z_][a-z0-9_]{2,30}$ +# Regular expression matching correct constant names. Overrides const-naming- +# style. +const-rgx=(([A-Z_][A-Z0-9_]*)|(__.*__))$ -# Naming hint for attribute names -attr-name-hint=[a-z_][a-z0-9_]{2,30}$ +# Minimum line length for functions/classes that require docstrings, shorter +# ones are exempt. +docstring-min-length=-1 -# Regular expression matching correct argument names -argument-rgx=[a-z_][a-z0-9_]{2,30}$ +# Naming style matching correct function names. +function-naming-style=snake_case -# Naming hint for argument names -argument-name-hint=[a-z_][a-z0-9_]{2,30}$ +# Regular expression matching correct function names. Overrides function- +# naming-style. +function-rgx=[a-z_][a-z0-9_]{2,30}$ -# Regular expression matching correct class attribute names -class-attribute-rgx=([A-Za-z_][A-Za-z0-9_]{2,30}|(__.*__))$ +# Good variable names which should always be accepted, separated by a comma. +good-names=i, + j, + k, + ex, + Run, + _, + x, + e, + ip + +# Include a hint for the correct naming format with invalid-name. +include-naming-hint=no -# Naming hint for class attribute names -class-attribute-name-hint=([A-Za-z_][A-Za-z0-9_]{2,30}|(__.*__))$ +# Naming style matching correct inline iteration names. +inlinevar-naming-style=any -# Regular expression matching correct inline iteration names +# Regular expression matching correct inline iteration names. Overrides +# inlinevar-naming-style. inlinevar-rgx=[A-Za-z_][A-Za-z0-9_]*$ -# Naming hint for inline iteration names -inlinevar-name-hint=[A-Za-z_][A-Za-z0-9_]*$ +# Naming style matching correct method names. +method-naming-style=snake_case -# Regular expression matching correct class names -class-rgx=[A-Z_][a-zA-Z0-9]+$ +# Regular expression matching correct method names. Overrides method-naming- +# style. +method-rgx=[a-z_][a-z0-9_]{2,30}$ -# Naming hint for class names -class-name-hint=[A-Z_][a-zA-Z0-9]+$ +# Naming style matching correct module names. +module-naming-style=snake_case -# Regular expression matching correct module names +# Regular expression matching correct module names. Overrides module-naming- +# style. module-rgx=(([a-z_][a-z0-9_]*)|([A-Z][a-zA-Z0-9]+))$ -# Naming hint for module names -module-name-hint=(([a-z_][a-z0-9_]*)|([A-Z][a-zA-Z0-9]+))$ - -# Regular expression matching correct method names -method-rgx=[a-z_][a-z0-9_]{2,30}$ - -# Naming hint for method names -method-name-hint=[a-z_][a-z0-9_]{2,30}$ +# Colon-delimited sets of names that determine each other's naming style when +# the name regexes allow several styles. +name-group= # Regular expression which should only match function or class names that do # not require a docstring. no-docstring-rgx=^_ -# Minimum line length for functions/classes that require docstrings, shorter -# ones are exempt. -docstring-min-length=-1 - +# List of decorators that produce properties, such as abc.abstractproperty. Add +# to this list to register other decorators that produce valid properties. +# These decorators are taken in consideration only for invalid-name. +property-classes=abc.abstractproperty -[ELIF] +# Naming style matching correct variable names. +variable-naming-style=snake_case -# Maximum number of nested blocks for function / method body -max-nested-blocks=5 +# Regular expression matching correct variable names. Overrides variable- +# naming-style. +variable-rgx=[a-z_][a-z0-9_]{2,30}$ [IMPORTS] -# Deprecated modules which should not be used, separated by a comma -deprecated-modules=regsub,TERMIOS,Bastion,rexec +# Allow wildcard imports from modules that define __all__. +allow-wildcard-with-all=no -# Create a graph of every (i.e. internal and external) dependencies in the -# given file (report RP0402 must not be disabled) -import-graph= +# Analyse import fallback blocks. This can be used to support both Python 2 and +# 3 compatible code, which means that the block might have code that exists +# only in one or another interpreter, leading to false positives when analysed. +analyse-fallback-blocks=no + +# Deprecated modules which should not be used, separated by a comma. +deprecated-modules=regsub, + TERMIOS, + Bastion, + rexec # Create a graph of external dependencies in the given file (report RP0402 must -# not be disabled) +# not be disabled). ext-import-graph= +# Create a graph of every (i.e. internal and external) dependencies in the +# given file (report RP0402 must not be disabled). +import-graph= + # Create a graph of internal dependencies in the given file (report RP0402 must -# not be disabled) +# not be disabled). int-import-graph= +# Force import order to recognize a module as part of the standard +# compatibility libraries. +known-standard-library= + +# Force import order to recognize a module as part of a third party library. +known-third-party=enchant + [DESIGN] -# Maximum number of arguments for function / method +# Maximum number of arguments for function / method. max-args=10 -# Argument names that match this expression will be ignored. Default to name -# with leading underscore -ignored-argument-names=_.* - -# Maximum number of locals for function / method body -max-locals=15 +# Maximum number of attributes for a class (see R0902). +max-attributes=15 -# Maximum number of return / yield for function / method body -max-returns=6 +# Maximum number of boolean expressions in an if statement. +max-bool-expr=5 -# Maximum number of branch for function / method body +# Maximum number of branch for function / method body. max-branches=12 -# Maximum number of statements in function / method body -max-statements=50 +# Maximum number of locals for function / method body. +max-locals=15 # Maximum number of parents for a class (see R0901). max-parents=7 -# Maximum number of attributes for a class (see R0902). -max-attributes=15 - -# Minimum number of public methods for a class (see R0903). -min-public-methods=2 - # Maximum number of public methods for a class (see R0904). max-public-methods=20 -# Maximum number of boolean expressions in a if statement -max-bool-expr=5 +# Maximum number of return / yield for function / method body. +max-returns=6 + +# Maximum number of statements in function / method body. +max-statements=50 + +# Minimum number of public methods for a class (see R0903). +min-public-methods=2 [CLASSES] # List of method names used to declare (i.e. assign) instance attributes. -defining-attr-methods=__init__,__new__,setUp +defining-attr-methods=__init__, + __new__, + setUp + +# List of member names, which should be excluded from the protected access +# warning. +exclude-protected=_asdict, + _fields, + _replace, + _source, + _make # List of valid names for the first argument in a class method. valid-classmethod-first-arg=cls @@ -461,13 +592,32 @@ valid-classmethod-first-arg=cls # List of valid names for the first argument in a metaclass class method. valid-metaclass-classmethod-first-arg=mcs -# List of member names, which should be excluded from the protected access -# warning. -exclude-protected=_asdict,_fields,_replace,_source,_make + +[PARAMETER_DOCUMENTATION] + +# Whether to accept totally missing parameter documentation in the docstring of +# a function that has parameters. +accept-no-param-doc=yes + +# Whether to accept totally missing raises documentation in the docstring of a +# function that raises an exception. +accept-no-raise-doc=no + +# Whether to accept totally missing return documentation in the docstring of a +# function that returns a statement. +accept-no-return-doc=yes + +# Whether to accept totally missing yields documentation in the docstring of a +# generator. +accept-no-yields-doc=yes + +# If the docstring type cannot be guessed the specified docstring type will be +# used. +default-docstring-type=default [EXCEPTIONS] # Exceptions that will emit a warning when being caught. Defaults to -# "Exception" +# "Exception". overgeneral-exceptions=Exception diff --git a/.travis.yml b/.travis.yml index 2d742d4..e5b9196 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,43 +1,112 @@ sudo: false language: python os: linux -python: -- &mainstream_python 3.4 install: - &upgrade_python_toolset pip install --upgrade pip setuptools wheel -- pip install tox-travis -- pip install coveralls -script: tox +- &install_test_deps pip install --upgrade pytest pytest-sugar +- &install_deps pip install -r CI_REQUIREMENTS.txt +- pip install --upgrade pytest-cov coveralls + +_python: +- &python34 + name: "Python 3.4" + python: 3.4 +- &python37 + name: "Python 3.7" + python: 3.7 + dist: xenial + sudo: true + +_helpers: +- &install_cython pip install --upgrade Cython +- &build_package python setup.py bdist_wheel +- &install_built pip install logwrap --no-index -f dist +- &test_no_cov py.test -vv test +- &test_cythonized + stage: Test cythonized + install: + - *upgrade_python_toolset + - *install_test_deps + - *install_deps + - *install_cython + script: + - *build_package + - *install_built + - *test_no_cov + after_success: skip + +- &static_analysis + stage: Static analysis + <<: *python34 + after_success: skip + +- &code_style_check + stage: Code style check + <<: *python34 + after_success: skip + +script: +- pip install -e . +- py.test -vv --cov-config .coveragerc --cov-report= --cov=logwrap test +- coverage report -m --fail-under 87 after_success: - coveralls jobs: fast_finish: true include: - - stage: Static analisys - python: 3.6 - services: [] + - stage: test + <<: *python34 + + - <<: *static_analysis + name: "PyLint" + install: + - *upgrade_python_toolset + - *install_deps + - pip install --upgrade "pylint >= 2.1" + script: + - pylint logwrap + - <<: *static_analysis + name: "Bandit" + install: + - *upgrade_python_toolset + - pip install --upgrade bandit + script: + - bandit -r logwrap + - <<: *static_analysis + <<: *python37 + name: "MyPy" install: - *upgrade_python_toolset - - pip install tox + - *install_deps + - pip install --upgrade "mypy >= 0.620" script: - - tox -e pylint,bandit,mypy - after_success: skip + - mypy --strict logwrap - - stage: Code style check - python: *mainstream_python - services: [] + - <<: *test_cythonized + <<: *python34 + + - <<: *code_style_check + name: "PEP8" + install: + - *upgrade_python_toolset + - pip install --upgrade flake8 + script: + - flake8 + - <<: *code_style_check + name: "PEP257" install: - *upgrade_python_toolset - - pip install tox + - pip install --upgrade pydocstyle script: - - tox -e pep8,pep257 - after_success: skip + - pydocstyle logwrap - stage: deploy # This prevents job from appearing in test plan unless commit is tagged: if: tag IS present - python: *mainstream_python + # Run on pypy to build not cythonized wheel + <<: *python34 + name: Build universal and cythonized bdist_wheel. Deploy bdist and sdist. services: - docker install: @@ -45,8 +114,8 @@ jobs: script: - ./tools/run_docker.sh "logwrap" before_deploy: - - pip install -r requirements.txt - - python setup.py bdist_wheel + - pip install -r build_requirements.txt + - *build_package deploy: - provider: pypi # `skip_cleanup: true` is required to preserve binary wheels, built diff --git a/doc/source/logwrap.rst b/doc/source/logwrap.rst index 78e850a..d144a09 100644 --- a/doc/source/logwrap.rst +++ b/doc/source/logwrap.rst @@ -1,3 +1,5 @@ +.. logwrap function and LogWrap class description. + API: Decorators: `LogWrap` class and `logwrap` function. ======================================================== @@ -46,7 +48,7 @@ API: Decorators: `LogWrap` class and `logwrap` function. .. versionchanged:: 3.3.0 Extract func from log and do not use Union. .. versionchanged:: 3.3.0 Deprecation of `*args` - .. versionchanged:: 4.0.0 Drop of *args + .. versionchanged:: 4.0.0 Drop of `*args` .. py:method:: pre_process_param(self, arg) diff --git a/logwrap/_log_wrap.py b/logwrap/_log_wrap.py index 41bdad0..e831262 100644 --- a/logwrap/_log_wrap.py +++ b/logwrap/_log_wrap.py @@ -165,6 +165,10 @@ def bind_args_kwargs( :param sig: source signature :type sig: inspect.Signature + :param args: not keyworded arguments + :type args: typing.Any + :param kwargs: keyworded arguments + :type kwargs: typing.Any :return: Iterator for bound parameters with all information about it :rtype: typing.Iterator[BoundParameter] @@ -281,7 +285,9 @@ def log_level(self) -> int: def log_level(self, val: int) -> None: """Log level for normal behavior. + :param val: log level to use for calls and returns :type val: int + :raises TypeError: log level is not integer """ if not isinstance(val, int): raise TypeError( @@ -304,7 +310,9 @@ def exc_level(self) -> int: def exc_level(self, val: int) -> None: """Log level for exceptions. + :param val: log level to use for captured exceptions :type val: int + :raises TypeError: log level is not integer """ if not isinstance(val, int): raise TypeError( @@ -327,7 +335,9 @@ def max_indent(self) -> int: def max_indent(self, val: int) -> None: """Maximum indentation. + :param val: Maximal indentation before use of simple repr() :type val: int + :raises TypeError: indent is not integer """ if not isinstance(val, int): raise TypeError( @@ -366,7 +376,9 @@ def log_call_args(self) -> bool: def log_call_args(self, val: bool) -> None: """Flag: log call arguments before call. + :param val: Enable flag :type val: bool + :raises TypeError: Value is not bool """ if not isinstance(val, bool): raise TypeError( @@ -389,7 +401,9 @@ def log_call_args_on_exc(self) -> bool: def log_call_args_on_exc(self, val: bool) -> None: """Flag: log call arguments on exception. + :param val: Enable flag :type val: bool + :raises TypeError: Value is not bool """ if not isinstance(val, bool): raise TypeError( @@ -412,7 +426,9 @@ def log_result_obj(self) -> bool: def log_result_obj(self, val: bool) -> None: """Flag: log result object. + :param val: Enable flag :type val: bool + :raises TypeError: Value is not bool """ if not isinstance(val, bool): raise TypeError( @@ -425,7 +441,7 @@ def log_result_obj(self, val: bool) -> None: @property def _logger(self) -> logging.Logger: - """logger instance. + """Logger instance. :rtype: logging.Logger """ @@ -506,9 +522,13 @@ def _get_func_args_repr( ) -> str: """Internal helper for reducing complexity of decorator code. + :param sig: function signature :type sig: inspect.Signature - :type args: tuple - :type kwargs: dict + :param args: not keyworded arguments + :type args: typing.Tuple + :param kwargs: keyworded arguments + :type kwargs: typing.Dict[str, typing.Any] + :return: repr over function arguments :rtype: str .. versionchanged:: 3.3.0 Use pre- and post- processing of params during execution diff --git a/logwrap/_repr_utils.py b/logwrap/_repr_utils.py index ca66a3d..828f6cf 100644 --- a/logwrap/_repr_utils.py +++ b/logwrap/_repr_utils.py @@ -121,7 +121,9 @@ def _prepare_repr( ) -> typing.Iterator[ReprParameter]: """Get arguments lists with defaults. + :param func: Callable object to process :type func: typing.Union[types.FunctionType, types.MethodType] + :return: repr of callable parameter from signature :rtype: typing.Iterator[ReprParameter] """ isfunction = isinstance(func, types.FunctionType) @@ -192,6 +194,7 @@ def next_indent(self, indent: int, multiplier: int = 1) -> int: :type indent: int :param multiplier: step multiplier :type multiplier: int + :return: next indentation value :rtype: int """ return indent + multiplier * self.indent_step @@ -204,8 +207,11 @@ def _repr_callable( ) -> str: """Repr callable object (function or method). + :param src: Callable to process :type src: typing.Union[types.FunctionType, types.MethodType] + :param indent: start indentation :type indent: int + :return: Repr of function or method with signature. :rtype: str """ raise NotImplementedError() # pragma: no cover @@ -219,9 +225,13 @@ def _repr_simple( ) -> str: """Repr object without iteration. + :param src: Source object :type src: typing.Any + :param indent: start indentation :type indent: int + :param no_indent_start: ignore indent :type no_indent_start: bool + :return: simple repr() over object :rtype: str """ raise NotImplementedError() # pragma: no cover @@ -280,6 +290,7 @@ def _repr_iterable_items( :type src: typing.Iterable :param indent: start indentation :type indent: int + :return: repr of element in iterable item :rtype: typing.Iterator[str] """ for elem in src: @@ -427,9 +438,13 @@ def _repr_simple( ) -> str: """Repr object without iteration. + :param src: Source object :type src: typing.Any + :param indent: start indentation :type indent: int + :param no_indent_start: ignore indent :type no_indent_start: bool + :return: simple repr() over object, except strings (add prefix) and set (uniform py2/py3) :rtype: str """ indent = 0 if no_indent_start else indent @@ -458,6 +473,7 @@ def _repr_dict_items( :type src: dict :param indent: start indentation :type indent: int + :return: repr of key/value pair from dict :rtype: typing.Iterator[str] """ max_len = max((len(repr(key)) for key in src)) if src else 0 @@ -481,8 +497,11 @@ def _repr_callable( ) -> str: """Repr callable object (function or method). + :param src: Callable to process :type src: typing.Union[types.FunctionType, types.MethodType] + :param indent: start indentation :type indent: int + :return: Repr of function or method with signature. :rtype: str """ param_str = "" @@ -545,6 +564,7 @@ def _repr_iterable_item( :type result: str :param suffix: suffix :type suffix: str + :return: formatted repr of "result" with prefix and suffix to explain type. :rtype: str """ return ( @@ -600,9 +620,13 @@ def _repr_simple( ) -> str: """Repr object without iteration. + :param src: Source object :type src: typing.Any + :param indent: start indentation :type indent: int + :param no_indent_start: ignore indent :type no_indent_start: bool + :return: simple repr() over object, except strings (decode) and set (uniform py2/py3) :rtype: str """ indent = 0 if no_indent_start else indent @@ -631,7 +655,8 @@ def _repr_dict_items( :type src: dict :param indent: start indentation :type indent: int - :rtype: typing.Generator[str] + :return: repr of key/value pair from dict + :rtype: typing.Iterator[str] """ max_len = max((len(str(key)) for key in src)) if src else 0 for key, val in src.items(): @@ -654,8 +679,11 @@ def _repr_callable( ) -> str: """Repr callable object (function or method). + :param src: Callable to process :type src: typing.Union[types.FunctionType, types.MethodType] + :param indent: start indentation :type indent: int + :return: Repr of function or method with signature. :rtype: str """ param_str = "" @@ -718,6 +746,7 @@ def _repr_iterable_item( :type result: str :param suffix: suffix :type suffix: str + :return: formatted repr of "result" with prefix and suffix to explain type. :rtype: str """ return ( diff --git a/setup.cfg b/setup.cfg index 039d434..fb16d2d 100644 --- a/setup.cfg +++ b/setup.cfg @@ -40,8 +40,13 @@ exclude = __init__.py, docs ignore = +show-pep8 = True show-source = True count = True +max-line-length = 120 + +[pydocstyle] +ignore = D401, D203, D213 [aliases] test=pytest diff --git a/tox.ini b/tox.ini index be8740a..cb3919b 100644 --- a/tox.ini +++ b/tox.ini @@ -48,9 +48,9 @@ commands = flake8 [testenv:pep257] deps = - pep257 + pydocstyle usedevelop = False -commands = pep257 logwrap +commands = pydocstyle logwrap [testenv:install] deps = @@ -83,6 +83,9 @@ show-source = True count = True max-line-length = 120 +[pydocstyle] +ignore = D401, D203, D213 + [testenv:docs] usedevelop = False deps =