diff --git a/.github/workflows/lint.yml b/.github/workflows/lint.yml new file mode 100644 index 0000000..6fbb9be --- /dev/null +++ b/.github/workflows/lint.yml @@ -0,0 +1,15 @@ +name: Lint with ruff + +on: + push: + branches: [ master ] + pull_request: + branches: [ master ] + +jobs: + build: + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@v6 + - uses: astral-sh/ruff-action@v3 diff --git a/.pylintrc b/.pylintrc deleted file mode 100644 index fa09ec0..0000000 --- a/.pylintrc +++ /dev/null @@ -1,407 +0,0 @@ -[MASTER] - -# Specify a configuration file. -#rcfile= - -# 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 - -# Add files or directories matching the regex patterns to the blacklist. The -# regex matches against base names, not paths. -ignore-patterns= - -# Pickle collected data for later comparisons. -persistent=yes - -# List of plugins (as comma separated values of python modules names) to load, -# usually to register additional checkers. -load-plugins= - -# Use multiple processes to speed up Pylint. -jobs=1 - -# 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=numpy - -# 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. This option is deprecated -# and it will be removed in Pylint 2.0. -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 -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 (only on the command line, not in the configuration file where -# it should appear only once). See also the "--disable" option for examples. -#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" -disable=long-suffix,standarderror-builtin,indexing-exception,delslice-method,unichr-builtin,dict-view-method,parameter-unpacking,unicode-builtin,cmp-builtin,intern-builtin,round-builtin,backtick,nonzero-method,xrange-builtin,coerce-method,raw_input-builtin,old-division,filter-builtin-not-iterating,old-octal-literal,input-builtin,map-builtin-not-iterating,buffer-builtin,basestring-builtin,zip-builtin-not-iterating,using-cmp-argument,unpacking-in-except,old-raise-syntax,coerce-builtin,dict-iter-method,hex-method,range-builtin-not-iterating,useless-suppression,cmp-method,print-statement,reduce-builtin,file-builtin,long-builtin,getslice-method,execfile-builtin,no-absolute-import,metaclass-assignment,oct-method,reload-builtin,import-star-module-level,suppressed-message,apply-builtin,raising-string,next-method-called,setslice-method,old-ne-operator,arguments-differ,wildcard-import,locally-disabled,wrong-import-order,missing-module-docstring,missing-class-docstring,missing-function-docstring,wrong-import-position - - -[REPORTS] - -# 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=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]". This option is deprecated -# and it will be removed in Pylint 2.0. -files-output=no - -# Tells whether to display a full report or only the messages -reports=yes - -# 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). -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 -#msg-template= - - -[BASIC] - -# Good variable names which should always be accepted, separated by a comma -good-names=i,j,k,ex,Run,_,f - -# Bad variable names which should always be refused, separated by a comma -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. -name-group= - -# Include a hint for the correct naming format with invalid-name -include-naming-hint=no - -# List of decorators that produce properties, such as abc.abstractproperty. Add -# to this list to register other decorators that produce valid properties. -property-classes=abc.abstractproperty - -# Regular expression matching correct variable names -variable-rgx=[a-z_][a-z0-9_]{2,30}$ - -# Naming hint for variable names -variable-name-hint=[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}|(__.*__))$ - -# Naming hint for class attribute names -class-attribute-name-hint=([A-Za-z_][A-Za-z0-9_]{2,30}|(__.*__))$ - -# Regular expression matching correct argument names -argument-rgx=[a-z_][a-z0-9_]{2,30}$ - -# Naming hint for argument names -argument-name-hint=[a-z_][a-z0-9_]{2,30}$ - -# Regular expression matching correct module names -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 constant names -const-rgx=(([A-Z_][A-Z0-9_]*)|(__.*__))$ - -# Naming hint for constant names -const-name-hint=(([A-Z_][A-Z0-9_]*)|(__.*__))$ - -# Regular expression matching correct inline iteration names -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_]*$ - -# 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}$ - -# Regular expression matching correct function names -function-rgx=[a-z_][a-z0-9_]{2,30}$ - -# Naming hint for function names -function-name-hint=[a-z_][a-z0-9_]{2,30}$ - -# Regular expression matching correct attribute names -attr-rgx=[a-z_][a-z0-9_]{2,30}$ - -# Naming hint for attribute names -attr-name-hint=[a-z_][a-z0-9_]{2,30}$ - -# Regular expression matching correct class names -class-rgx=[A-Z_][a-zA-Z0-9]+$ - -# Naming hint for class names -class-name-hint=[A-Z_][a-zA-Z0-9]+$ - -# Regular expression which should only match function or class names that do -# not require a docstring. -no-docstring-rgx=^test_ - -# Minimum line length for functions/classes that require docstrings, shorter -# ones are exempt. -docstring-min-length=-1 - - -[ELIF] - -# Maximum number of nested blocks for function / method body -max-nested-blocks=5 - - -[FORMAT] - -# Maximum number of characters on a single line. -max-line-length=80 - -# 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=y - -# 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=1000 - -# String used as indentation unit. This is usually " " (4 spaces) or "\t" (1 -# tab). -indent-string=' ' - -# Number of spaces of indent required inside a hanging or continued line. -indent-after-paren=4 - -# Expected format of line ending, e.g. empty (any line ending), LF or CRLF. -expected-line-ending-format= - - -[LOGGING] - -# Logging modules to check that the string format arguments are in logging -# function parameter format -logging-modules=logging - - -[MISCELLANEOUS] - -# List of note tags to take in consideration, separated by a comma. -notes=FIXME,XXX,TODO - - -[SIMILARITIES] - -# Minimum lines number of a similarity. -min-similarity-lines=10 - -# Ignore comments when computing similarities. -ignore-comments=yes - -# Ignore docstrings when computing similarities. -ignore-docstrings=yes - -# Ignore imports when computing similarities. -ignore-imports=no - - -[SPELLING] - -# Spelling dictionary name. Available dictionaries: none. To make it working -# install python-enchant package. -spelling-dict= - -# List of comma separated words that should not be checked. -spelling-ignore-words= - -# A path to a file that contains private dictionary; one word per line. -spelling-private-dict-file= - -# Tells whether to store unknown words to indicated private dictionary in -# --spelling-private-dict-file option instead of raising a message. -spelling-store-unknown-words=no - - -[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). -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. It -# supports qualified module names, as well as Unix pattern matching. -ignored-modules= - -# 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=optparse.Values,thread._local,_thread._local,matplotlib.cm,tensorflow.python,tensorflow,tensorflow.train.Example,RunOptions - -# 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=set_shape,np.float32 - -# 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 - - -[VARIABLES] - -# Tells whether we should check for unused import in __init__ files. -init-import=no - -# A regular expression matching the name of dummy variables (i.e. expectedly -# not used). -dummy-variables-rgx=(_+[a-zA-Z0-9_]*?$)|dummy - -# List of additional names supposed to be defined in builtins. Remember that -# you should avoid to define new builtins when possible. -additional-builtins= - -# 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 - -# List of qualified module names which can have objects that can redefine -# builtins. -redefining-builtins-modules=six.moves,future.builtins - - -[CLASSES] - -# List of method names used to declare (i.e. assign) instance attributes. -defining-attr-methods=__init__,__new__,setUp - -# List of valid names for the first argument in a class method. -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 - - -[DESIGN] - -# 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=30 - -# Maximum number of return / yield for function / method body -max-returns=6 - -# Maximum number of branch for function / method body -max-branches=12 - -# Maximum number of statements in function / method body -max-statements=100 - -# Maximum number of parents for a class (see R0901). -max-parents=7 - -# Maximum number of attributes for a class (see R0902). -max-attributes=10 - -# Minimum number of public methods for a class (see R0903). -min-public-methods=0 - -# 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 - - -[IMPORTS] - -# Deprecated modules which should not be used, separated by a comma -deprecated-modules=optparse - -# 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 external dependencies in the given file (report RP0402 must -# not be disabled) -ext-import-graph= - -# Create a graph of internal dependencies in the given file (report RP0402 must -# 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 - -# 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 - - -[EXCEPTIONS] - -# Exceptions that will emit a warning when being caught. Defaults to -# "Exception" -overgeneral-exceptions=Exception diff --git a/gitprivacy/cli/email.py b/gitprivacy/cli/email.py index ec57234..4bbca3e 100644 --- a/gitprivacy/cli/email.py +++ b/gitprivacy/cli/email.py @@ -91,7 +91,8 @@ def list_email(ctx: click.Context, check_all: bool, email_only: bool) -> None: authors: Counter[str] = Counter() committers: Counter[str] = Counter() if email_only: - to_str = lambda a: a.email + def to_str(a): + return a.email else: to_str = _actor_to_str for commit in commits: diff --git a/gitprivacy/cli/keys.py b/gitprivacy/cli/keys.py index fdc6e51..c28a879 100644 --- a/gitprivacy/cli/keys.py +++ b/gitprivacy/cli/keys.py @@ -30,7 +30,6 @@ @click.pass_context def manage_keys(ctx: click.Context, mode: str, archive: bool) -> None: """Create and manage encryption keys.""" - # pylint: disable=too-many-branches ctx.obj.assert_repo() repo: git.Repo = ctx.obj.repo gpm._create_git_subdir(repo) diff --git a/gitprivacy/crypto/__init__.py b/gitprivacy/crypto/__init__.py index 12cc620..42ae717 100644 --- a/gitprivacy/crypto/__init__.py +++ b/gitprivacy/crypto/__init__.py @@ -16,7 +16,7 @@ def encrypt(self, data: str) -> str: """Encrypts data and returns an Base64-encoded string""" -from .secretbox import SecretBox -from .secretbox import MultiSecretBox -from .secretbox import MultiSecretDecryptor -from .passwordsecretbox import PasswordSecretBox +from .secretbox import SecretBox as SecretBox # noqa: E402 +from .secretbox import MultiSecretBox as MultiSecretBox # noqa: E402 +from .secretbox import MultiSecretDecryptor as MultiSecretDecryptor # noqa: E402 +from .passwordsecretbox import PasswordSecretBox as PasswordSecretBox # noqa: E402 diff --git a/gitprivacy/crypto/passwordsecretbox.py b/gitprivacy/crypto/passwordsecretbox.py index b59dd27..9233ee1 100644 --- a/gitprivacy/crypto/passwordsecretbox.py +++ b/gitprivacy/crypto/passwordsecretbox.py @@ -8,7 +8,6 @@ class PasswordSecretBox(SecretBox): """NaCl SecretBox with secret derived from password.""" def __init__(self, salt: str, password: str) -> None: - # pylint: disable=super-init-not-called enckey = self.derive_key(password, salt) self._box = secret.SecretBox(enckey) diff --git a/gitprivacy/dateredacter/__init__.py b/gitprivacy/dateredacter/__init__.py index b26837a..7040cb4 100644 --- a/gitprivacy/dateredacter/__init__.py +++ b/gitprivacy/dateredacter/__init__.py @@ -10,4 +10,4 @@ def redact(self, timestamp: datetime) -> datetime: """Redact timestamp.""" -from .reduce import ResolutionDateRedacter +from .reduce import ResolutionDateRedacter as ResolutionDateRedacter # noqa: E402 diff --git a/gitprivacy/encoder/__init__.py b/gitprivacy/encoder/__init__.py index 446f851..f1a0c3e 100644 --- a/gitprivacy/encoder/__init__.py +++ b/gitprivacy/encoder/__init__.py @@ -47,7 +47,7 @@ def encode(self, commit: git.Commit) -> Tuple[datetime, datetime, str]: sep = linesep * 2 new_msg = commit.message + sep + msg_extra elif callable(msg_extra): - rpl_msg = msg_extra(commit.message) # pylint: disable=not-callable + rpl_msg = msg_extra(commit.message) if rpl_msg != commit.message: new_msg = rpl_msg else: @@ -58,7 +58,6 @@ def get_message_extra(self, commit: git.Commit) -> Union[ str, Callable[[str], str] ]: - # pylint: disable=no-self-use,unused-argument return "" @@ -70,4 +69,5 @@ def decode(self, commit: git.Commit) -> Tuple[Optional[datetime], commit.committed_datetime) -from .msgembed import MessageEmbeddingEncoder, MessageEmbeddingDecoder +from .msgembed import MessageEmbeddingEncoder as MessageEmbeddingEncoder # noqa: E402 +from .msgembed import MessageEmbeddingDecoder as MessageEmbeddingDecoder # noqa: E402 diff --git a/gitprivacy/gitprivacy.py b/gitprivacy/gitprivacy.py index 64b0efa..d926aad 100755 --- a/gitprivacy/gitprivacy.py +++ b/gitprivacy/gitprivacy.py @@ -36,7 +36,7 @@ def __init__(self, gitdir: str) -> None: self.gitdir = gitdir try: self.repo = git.Repo(gitdir, search_parent_directories=True) - except git.InvalidGitRepositoryError as e: + except git.InvalidGitRepositoryError: self.repo = None else: self.read_config() @@ -226,7 +226,7 @@ def do_log(ctx: click.Context, revision_range: str, paths: click.Path): a_date, c_date = decoder.decode(commit) if a_date: buf.append(f"Author: {commit.author.name} <{commit.author.email}>") # noqa: E501 - buf.append(click.style(f"Date: {fmtdate(commit.authored_datetime)}", # noqa: E501) + buf.append(click.style(f"Date: {fmtdate(commit.authored_datetime)}", # noqa: E501 fg='red')) buf.append(click.style(f"RealDate: {fmtdate(a_date)}", fg='green')) else: @@ -234,7 +234,7 @@ def do_log(ctx: click.Context, revision_range: str, paths: click.Path): buf.append(f"Date: {fmtdate(commit.authored_datetime)}") if c_date: buf.append(f"Commit: {commit.committer.name} <{commit.committer.email}>") # noqa: E501 - buf.append(click.style(f"Date: {fmtdate(commit.committed_datetime)}", # noqa: E501) + buf.append(click.style(f"Date: {fmtdate(commit.committed_datetime)}", # noqa: E501 fg='red')) buf.append(click.style(f"RealDate: {fmtdate(c_date)}", fg='green')) else: @@ -291,7 +291,7 @@ def do_redate(ctx: click.Context, startpoint: str, return if repo.is_dirty(): - click.echo(f"Cannot redate: You have unstaged changes.", err=True) + click.echo("Cannot redate: You have unstaged changes.", err=True) ctx.exit(1) rewriter = FilterRepoRewriter(repo, encoder, ctx.obj.replace) single_commit = next(repo.head.commit.iter_parents(), None) is None @@ -340,7 +340,7 @@ def redate_rewrites(ctx: click.Context): click.echo("No pending rewrites to redact") ctx.exit(0) if repo.is_dirty(): - click.echo(f"Cannot redate: You have unstaged changes.", err=True) + click.echo("Cannot redate: You have unstaged changes.", err=True) ctx.exit(1) # determine commits to redate diff --git a/gitprivacy/rewriter/__init__.py b/gitprivacy/rewriter/__init__.py index aec7e2c..cabcbcf 100644 --- a/gitprivacy/rewriter/__init__.py +++ b/gitprivacy/rewriter/__init__.py @@ -14,5 +14,5 @@ def __init__(self, repo: git.Repo, encoder: Encoder, self.replace = replace -from .amendrewriter import AmendRewriter -from .filterrewriter import FilterRepoRewriter +from .amendrewriter import AmendRewriter as AmendRewriter # noqa: E402 +from .filterrewriter import FilterRepoRewriter as FilterRepoRewriter # noqa: E402 diff --git a/requirements-dev.txt b/requirements-dev.txt index f83eab7..faf7d5d 100644 --- a/requirements-dev.txt +++ b/requirements-dev.txt @@ -2,9 +2,6 @@ pytest pytest-cov -# Linter, etc -pylint - # Building releases setuptools wheel diff --git a/tests/test_crypto.py b/tests/test_crypto.py index e156583..89cc4c3 100644 --- a/tests/test_crypto.py +++ b/tests/test_crypto.py @@ -1,5 +1,4 @@ import unittest -from nacl.exceptions import CryptoError from gitprivacy.crypto import (PasswordSecretBox, SecretBox, MultiSecretBox, MultiSecretDecryptor) diff --git a/tests/test_gitprivacy.py b/tests/test_gitprivacy.py index bfc2d62..2f6ae60 100644 --- a/tests/test_gitprivacy.py +++ b/tests/test_gitprivacy.py @@ -1,4 +1,3 @@ -# pylint: disable=invalid-name,too-many-public-methods,line-too-long import copy import git # type: ignore import locale @@ -240,7 +239,7 @@ def test_redatewrongstartpoint(self): with self.runner.isolated_filesystem(): self.setUpRepo() self.setConfig() - a = self.addCommit("a") + self.addCommit("a") result = self.invoke('redate abc') self.assertEqual(result.exit_code, 128) @@ -248,8 +247,8 @@ def test_redatestartpointhead(self): with self.runner.isolated_filesystem(): self.setUpRepo() self.setConfig() - a = self.addCommit("a") - b = self.addCommit("b") + self.addCommit("a") + self.addCommit("b") result = self.invoke('redate HEAD') self.assertEqual(result.exit_code, 128) @@ -258,15 +257,15 @@ def test_redatewithremote(self): self.setUpRepo() remote = self.setUpRemote() self.setConfig() - a = self.addCommit("a") + self.addCommit("a") remote.push(self.repo.active_branch, set_upstream=True) result = self.invoke('redate') self.assertEqual(result.exit_code, 3) result = self.invoke('redate -f') self.assertEqual(result.exit_code, 0) remote.push(force=True) - b = self.addCommit("b") - c = self.addCommit("c") + self.addCommit("b") + self.addCommit("c") result = self.invoke('redate') self.assertEqual(result.exit_code, 3) result = self.invoke('redate HEAD~2') @@ -318,7 +317,7 @@ def test_checkone(self): with self.runner.isolated_filesystem(): self.setUpRepo() self.setConfig() - a = self.addCommit("a") + self.addCommit("a") result = self.invoke('check') self.assertEqual(result.exit_code, 0) self.assertEqual(result.output, "") @@ -330,7 +329,7 @@ def test_checkchange(self): self.git.config(["privacy.ignoreTimezone", "false"]) # default is ignore os.environ['TZ'] = 'Europe/London' time.tzset() - a = self.addCommit("a") + self.addCommit("a") os.environ['TZ'] = 'Europe/Berlin' time.tzset() result = self.invoke('check') @@ -365,7 +364,7 @@ def test_checkchangeignore(self): self.git.config(["privacy.ignoreTimezone", "true"]) os.environ['TZ'] = 'Europe/London' time.tzset() - a = self.addCommit("a") + self.addCommit("a") os.environ['TZ'] = 'Europe/Berlin' time.tzset() result = self.invoke('check') @@ -381,7 +380,7 @@ def test_checkwithhook(self): self.assertEqual(result.exit_code, 0) os.environ['TZ'] = 'Europe/London' time.tzset() - a = self.addCommit("a") + self.addCommit("a") os.environ['TZ'] = 'Europe/Berlin' time.tzset() self.addCommit("b") # should not fail @@ -392,7 +391,7 @@ def test_checkwithhook(self): self.assertEqual(result.exit_code, 0) os.environ['TZ'] = 'Europe/London' time.tzset() - a = self.addCommit("a") + self.addCommit("a") os.environ['TZ'] = 'Europe/Berlin' time.tzset() with self.assertRaises(git.GitCommandError): @@ -406,7 +405,7 @@ def test_checkdifferentusers(self): os.environ['TZ'] = 'Europe/London' time.tzset() self.git.config(["user.email", "doe@example.com"]) - a = self.addCommit("a") + self.addCommit("a") os.environ['TZ'] = 'Europe/Berlin' time.tzset() result = self.invoke('check') @@ -519,7 +518,7 @@ def test_pwdmismatch(self): self.git.config(["privacy.password", "passw0ord"]) result = self.invoke('init') self.assertEqual(result.exit_code, 0) - a = self.addCommit("a") + self.addCommit("a") self.git.config(["privacy.password", "geheim"]) result = self.invoke('log') self.assertEqual(result.exit_code, 0) @@ -547,8 +546,6 @@ def test_redatestability(self): def test_commitdateupdate(self): - import gitprivacy.encoder.msgembed as msgenc - from gitprivacy import utils with self.runner.isolated_filesystem(): self.setUpRepo() self.setConfig() @@ -650,7 +647,7 @@ def test_redactemail(self): self.git.config(["user.email", email]) a = self.addCommit("a") self.assertEqual(a.author.email, email) - result = self.invoke(f'redact-email') + result = self.invoke('redact-email') self.assertEqual(result.exit_code, 0) result = self.invoke(f'redact-email {email}') self.assertEqual(result.exit_code, 0) @@ -736,7 +733,7 @@ def test_globaltemplate(self): def test_globaltemplate_init_outside_repo(self): home = ".home" - templdir = os.path.join(home, ".git_template") + os.path.join(home, ".git_template") with self.runner.isolated_filesystem(), \ self.runner.isolation(env=dict(HOME=home)): os.mkdir(home) @@ -755,7 +752,7 @@ def does_cherrypick_run_postcommit(self) -> bool: with open(hookpath, "w") as f: f.write("/bin/sh\n\necho DEADBEEF") os.chmod(hookpath, 0o755) - a = self.addCommit("a") + self.addCommit("a") res, stdout, stderr = self.git.execute( ["git", "cherry-pick", "--keep-redundant-commits", "HEAD"], with_extended_output=True, @@ -769,7 +766,7 @@ def test_rebase(self): with self.runner.isolated_filesystem(): self.setUpRepo() self.setConfig() - a = self.addCommit("a") + self.addCommit("a") c = self.addCommit("c") b = self.addCommit("b") def _log(): @@ -830,7 +827,7 @@ def test_rewritelog(self): result = self.invoke('redate-rewrites') self.assertEqual(result.exit_code, 128) # check redate without pending rewrites - a = self.addCommit("a") + self.addCommit("a") result = self.invoke('redate-rewrites') self.assertEqual(result.exit_code, 0) self.assertEqual(result.output, "No pending rewrites to redact\n") @@ -843,8 +840,8 @@ def test_rewritelog(self): self.assertEqual(res, 0) self.assertNotIn("redate-rewrites", stderr) # add two more commits and do some rebasing - b = self.addCommit("b") - c = self.addCommit("c") + self.addCommit("b") + self.addCommit("c") # swap last two commits def _rebase_cmds(): return ( diff --git a/tests/test_timestamp.py b/tests/test_timestamp.py index 1483e7e..ad959df 100644 --- a/tests/test_timestamp.py +++ b/tests/test_timestamp.py @@ -1,5 +1,5 @@ import unittest -from datetime import datetime, timedelta +from datetime import datetime from gitprivacy.dateredacter import ResolutionDateRedacter