xybu/onedrived-dev

View on GitHub
onedrived/od_tasks/merge_dir.py

Summary

Maintainability
F
5 days
Test Coverage

File merge_dir.py has 467 lines of code (exceeds 250 allowed). Consider refactoring.
Open

import itertools
import logging
import os
import shutil

Severity: Minor
Found in onedrived/od_tasks/merge_dir.py - About 7 hrs to fix

    Function _handle_remote_file_with_record has a Cognitive Complexity of 42 (exceeds 5 allowed). Consider refactoring.
    Open

        def _handle_remote_file_with_record(self, remote_item, item_record, item_stat, item_local_abspath, all_local_items):
            """
            :param onedrivesdk.model.item.Item remote_item:
            :param onedrived.od_repo.ItemRecord item_record:
            :param posix.stat_result | None item_stat:
    Severity: Minor
    Found in onedrived/od_tasks/merge_dir.py - About 6 hrs to fix

    Cognitive Complexity

    Cognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.

    A method's cognitive complexity is based on a few simple rules:

    • Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one
    • Code is considered more complex for each "break in the linear flow of the code"
    • Code is considered more complex when "flow breaking structures are nested"

    Further reading

    Cyclomatic complexity is too high in method _handle_remote_file_with_record. (27)
    Open

        def _handle_remote_file_with_record(self, remote_item, item_record, item_stat, item_local_abspath, all_local_items):
            """
            :param onedrivesdk.model.item.Item remote_item:
            :param onedrived.od_repo.ItemRecord item_record:
            :param posix.stat_result | None item_stat:
    Severity: Minor
    Found in onedrived/od_tasks/merge_dir.py by radon

    Cyclomatic Complexity

    Cyclomatic Complexity corresponds to the number of decisions a block of code contains plus 1. This number (also called McCabe number) is equal to the number of linearly independent paths through the code. This number can be used as a guide when testing conditional logic in blocks.

    Radon analyzes the AST tree of a Python program to compute Cyclomatic Complexity. Statements have the following effects on Cyclomatic Complexity:

    Construct Effect on CC Reasoning
    if +1 An if statement is a single decision.
    elif +1 The elif statement adds another decision.
    else +0 The else statement does not cause a new decision. The decision is at the if.
    for +1 There is a decision at the start of the loop.
    while +1 There is a decision at the while statement.
    except +1 Each except branch adds a new conditional path of execution.
    finally +0 The finally block is unconditionally executed.
    with +1 The with statement roughly corresponds to a try/except block (see PEP 343 for details).
    assert +1 The assert statement internally roughly equals a conditional statement.
    Comprehension +1 A list/set/dict comprehension of generator expression is equivalent to a for loop.
    Boolean Operator +1 Every boolean operator (and, or) adds a decision point.

    Source: http://radon.readthedocs.org/en/latest/intro.html

    Function _handle_local_file has a Cognitive Complexity of 26 (exceeds 5 allowed). Consider refactoring.
    Open

        def _handle_local_file(self, item_name, item_record, item_stat, item_local_abspath):
            """
            :param str item_name:
            :param onedrived.od_repo.ItemRecord | None item_record:
            :param posix.stat_result | None item_stat:
    Severity: Minor
    Found in onedrived/od_tasks/merge_dir.py - About 3 hrs to fix

    Cognitive Complexity

    Cognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.

    A method's cognitive complexity is based on a few simple rules:

    • Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one
    • Code is considered more complex for each "break in the linear flow of the code"
    • Code is considered more complex when "flow breaking structures are nested"

    Further reading

    Cyclomatic complexity is too high in method _handle_local_file. (16)
    Open

        def _handle_local_file(self, item_name, item_record, item_stat, item_local_abspath):
            """
            :param str item_name:
            :param onedrived.od_repo.ItemRecord | None item_record:
            :param posix.stat_result | None item_stat:
    Severity: Minor
    Found in onedrived/od_tasks/merge_dir.py by radon

    Cyclomatic Complexity

    Cyclomatic Complexity corresponds to the number of decisions a block of code contains plus 1. This number (also called McCabe number) is equal to the number of linearly independent paths through the code. This number can be used as a guide when testing conditional logic in blocks.

    Radon analyzes the AST tree of a Python program to compute Cyclomatic Complexity. Statements have the following effects on Cyclomatic Complexity:

    Construct Effect on CC Reasoning
    if +1 An if statement is a single decision.
    elif +1 The elif statement adds another decision.
    else +0 The else statement does not cause a new decision. The decision is at the if.
    for +1 There is a decision at the start of the loop.
    while +1 There is a decision at the while statement.
    except +1 Each except branch adds a new conditional path of execution.
    finally +0 The finally block is unconditionally executed.
    with +1 The with statement roughly corresponds to a try/except block (see PEP 343 for details).
    assert +1 The assert statement internally roughly equals a conditional statement.
    Comprehension +1 A list/set/dict comprehension of generator expression is equivalent to a for loop.
    Boolean Operator +1 Every boolean operator (and, or) adds a decision point.

    Source: http://radon.readthedocs.org/en/latest/intro.html

    Cyclomatic complexity is too high in method handle. (12)
    Open

        def handle(self):
            if not os.path.isdir(self.local_abspath):
                logging.error('Error: Local path "%s" is not a directory.' % self.local_abspath)
                return
    
    
    Severity: Minor
    Found in onedrived/od_tasks/merge_dir.py by radon

    Cyclomatic Complexity

    Cyclomatic Complexity corresponds to the number of decisions a block of code contains plus 1. This number (also called McCabe number) is equal to the number of linearly independent paths through the code. This number can be used as a guide when testing conditional logic in blocks.

    Radon analyzes the AST tree of a Python program to compute Cyclomatic Complexity. Statements have the following effects on Cyclomatic Complexity:

    Construct Effect on CC Reasoning
    if +1 An if statement is a single decision.
    elif +1 The elif statement adds another decision.
    else +0 The else statement does not cause a new decision. The decision is at the if.
    for +1 There is a decision at the start of the loop.
    while +1 There is a decision at the while statement.
    except +1 Each except branch adds a new conditional path of execution.
    finally +0 The finally block is unconditionally executed.
    with +1 The with statement roughly corresponds to a try/except block (see PEP 343 for details).
    assert +1 The assert statement internally roughly equals a conditional statement.
    Comprehension +1 A list/set/dict comprehension of generator expression is equivalent to a for loop.
    Boolean Operator +1 Every boolean operator (and, or) adds a decision point.

    Source: http://radon.readthedocs.org/en/latest/intro.html

    Function handle has a Cognitive Complexity of 18 (exceeds 5 allowed). Consider refactoring.
    Open

        def handle(self):
            if not os.path.isdir(self.local_abspath):
                logging.error('Error: Local path "%s" is not a directory.' % self.local_abspath)
                return
    
    
    Severity: Minor
    Found in onedrived/od_tasks/merge_dir.py - About 2 hrs to fix

    Cognitive Complexity

    Cognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.

    A method's cognitive complexity is based on a few simple rules:

    • Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one
    • Code is considered more complex for each "break in the linear flow of the code"
    • Code is considered more complex when "flow breaking structures are nested"

    Further reading

    Cyclomatic complexity is too high in method _handle_local_folder. (9)
    Open

        def _handle_local_folder(self, item_name, item_record, item_local_abspath):
            """
            :param str item_name:
            :param onedrived.od_repo.ItemRecord | None item_record:
            :param str item_local_abspath:
    Severity: Minor
    Found in onedrived/od_tasks/merge_dir.py by radon

    Cyclomatic Complexity

    Cyclomatic Complexity corresponds to the number of decisions a block of code contains plus 1. This number (also called McCabe number) is equal to the number of linearly independent paths through the code. This number can be used as a guide when testing conditional logic in blocks.

    Radon analyzes the AST tree of a Python program to compute Cyclomatic Complexity. Statements have the following effects on Cyclomatic Complexity:

    Construct Effect on CC Reasoning
    if +1 An if statement is a single decision.
    elif +1 The elif statement adds another decision.
    else +0 The else statement does not cause a new decision. The decision is at the if.
    for +1 There is a decision at the start of the loop.
    while +1 There is a decision at the while statement.
    except +1 Each except branch adds a new conditional path of execution.
    finally +0 The finally block is unconditionally executed.
    with +1 The with statement roughly corresponds to a try/except block (see PEP 343 for details).
    assert +1 The assert statement internally roughly equals a conditional statement.
    Comprehension +1 A list/set/dict comprehension of generator expression is equivalent to a for loop.
    Boolean Operator +1 Every boolean operator (and, or) adds a decision point.

    Source: http://radon.readthedocs.org/en/latest/intro.html

    Cyclomatic complexity is too high in class MergeDirectoryTask. (8)
    Open

    class MergeDirectoryTask(base.TaskBase):
    
        def __init__(self, repo, task_pool, rel_path, item_request, deep_merge=True,
                     assume_remote_unchanged=False, parent_remote_unchanged=False):
            """
    Severity: Minor
    Found in onedrived/od_tasks/merge_dir.py by radon

    Cyclomatic Complexity

    Cyclomatic Complexity corresponds to the number of decisions a block of code contains plus 1. This number (also called McCabe number) is equal to the number of linearly independent paths through the code. This number can be used as a guide when testing conditional logic in blocks.

    Radon analyzes the AST tree of a Python program to compute Cyclomatic Complexity. Statements have the following effects on Cyclomatic Complexity:

    Construct Effect on CC Reasoning
    if +1 An if statement is a single decision.
    elif +1 The elif statement adds another decision.
    else +0 The else statement does not cause a new decision. The decision is at the if.
    for +1 There is a decision at the start of the loop.
    while +1 There is a decision at the while statement.
    except +1 Each except branch adds a new conditional path of execution.
    finally +0 The finally block is unconditionally executed.
    with +1 The with statement roughly corresponds to a try/except block (see PEP 343 for details).
    assert +1 The assert statement internally roughly equals a conditional statement.
    Comprehension +1 A list/set/dict comprehension of generator expression is equivalent to a for loop.
    Boolean Operator +1 Every boolean operator (and, or) adds a decision point.

    Source: http://radon.readthedocs.org/en/latest/intro.html

    Cyclomatic complexity is too high in method list_local_names. (8)
    Open

        def list_local_names(self):
            """
            List all names under the task local directory.
            Try resolving naming conflict (same name case-INsensitive) as it goes.
            :return [str]: A list of entry names.
    Severity: Minor
    Found in onedrived/od_tasks/merge_dir.py by radon

    Cyclomatic Complexity

    Cyclomatic Complexity corresponds to the number of decisions a block of code contains plus 1. This number (also called McCabe number) is equal to the number of linearly independent paths through the code. This number can be used as a guide when testing conditional logic in blocks.

    Radon analyzes the AST tree of a Python program to compute Cyclomatic Complexity. Statements have the following effects on Cyclomatic Complexity:

    Construct Effect on CC Reasoning
    if +1 An if statement is a single decision.
    elif +1 The elif statement adds another decision.
    else +0 The else statement does not cause a new decision. The decision is at the if.
    for +1 There is a decision at the start of the loop.
    while +1 There is a decision at the while statement.
    except +1 Each except branch adds a new conditional path of execution.
    finally +0 The finally block is unconditionally executed.
    with +1 The with statement roughly corresponds to a try/except block (see PEP 343 for details).
    assert +1 The assert statement internally roughly equals a conditional statement.
    Comprehension +1 A list/set/dict comprehension of generator expression is equivalent to a for loop.
    Boolean Operator +1 Every boolean operator (and, or) adds a decision point.

    Source: http://radon.readthedocs.org/en/latest/intro.html

    Cyclomatic complexity is too high in method _handle_remote_item. (7)
    Open

        def _handle_remote_item(self, remote_item, all_local_items, all_records):
            """
            :param onedrivesdk.model.item.Item remote_item:
            :param [str] all_local_items:
            :param dict(str, onedrived.od_repo.ItemRecord) all_records:
    Severity: Minor
    Found in onedrived/od_tasks/merge_dir.py by radon

    Cyclomatic Complexity

    Cyclomatic Complexity corresponds to the number of decisions a block of code contains plus 1. This number (also called McCabe number) is equal to the number of linearly independent paths through the code. This number can be used as a guide when testing conditional logic in blocks.

    Radon analyzes the AST tree of a Python program to compute Cyclomatic Complexity. Statements have the following effects on Cyclomatic Complexity:

    Construct Effect on CC Reasoning
    if +1 An if statement is a single decision.
    elif +1 The elif statement adds another decision.
    else +0 The else statement does not cause a new decision. The decision is at the if.
    for +1 There is a decision at the start of the loop.
    while +1 There is a decision at the while statement.
    except +1 Each except branch adds a new conditional path of execution.
    finally +0 The finally block is unconditionally executed.
    with +1 The with statement roughly corresponds to a try/except block (see PEP 343 for details).
    assert +1 The assert statement internally roughly equals a conditional statement.
    Comprehension +1 A list/set/dict comprehension of generator expression is equivalent to a for loop.
    Boolean Operator +1 Every boolean operator (and, or) adds a decision point.

    Source: http://radon.readthedocs.org/en/latest/intro.html

    Cyclomatic complexity is too high in method _handle_remote_file_without_record. (7)
    Open

        def _handle_remote_file_without_record(self, remote_item, item_stat, item_local_abspath, all_local_items):
            """
            Handle the case in which a remote item is not found in the database. The local item may or may not exist.
            :param onedrivesdk.model.item.Item remote_item:
            :param posix.stat_result | None item_stat:
    Severity: Minor
    Found in onedrived/od_tasks/merge_dir.py by radon

    Cyclomatic Complexity

    Cyclomatic Complexity corresponds to the number of decisions a block of code contains plus 1. This number (also called McCabe number) is equal to the number of linearly independent paths through the code. This number can be used as a guide when testing conditional logic in blocks.

    Radon analyzes the AST tree of a Python program to compute Cyclomatic Complexity. Statements have the following effects on Cyclomatic Complexity:

    Construct Effect on CC Reasoning
    if +1 An if statement is a single decision.
    elif +1 The elif statement adds another decision.
    else +0 The else statement does not cause a new decision. The decision is at the if.
    for +1 There is a decision at the start of the loop.
    while +1 There is a decision at the while statement.
    except +1 Each except branch adds a new conditional path of execution.
    finally +0 The finally block is unconditionally executed.
    with +1 The with statement roughly corresponds to a try/except block (see PEP 343 for details).
    assert +1 The assert statement internally roughly equals a conditional statement.
    Comprehension +1 A list/set/dict comprehension of generator expression is equivalent to a for loop.
    Boolean Operator +1 Every boolean operator (and, or) adds a decision point.

    Source: http://radon.readthedocs.org/en/latest/intro.html

    Cyclomatic complexity is too high in method _handle_remote_folder. (7)
    Open

        def _handle_remote_folder(self, remote_item, item_local_abspath, record, all_local_items):
            if not self.deep_merge:
                return
            try:
                remote_dir_matches_record = self._remote_dir_matches_record(remote_item, record)
    Severity: Minor
    Found in onedrived/od_tasks/merge_dir.py by radon

    Cyclomatic Complexity

    Cyclomatic Complexity corresponds to the number of decisions a block of code contains plus 1. This number (also called McCabe number) is equal to the number of linearly independent paths through the code. This number can be used as a guide when testing conditional logic in blocks.

    Radon analyzes the AST tree of a Python program to compute Cyclomatic Complexity. Statements have the following effects on Cyclomatic Complexity:

    Construct Effect on CC Reasoning
    if +1 An if statement is a single decision.
    elif +1 The elif statement adds another decision.
    else +0 The else statement does not cause a new decision. The decision is at the if.
    for +1 There is a decision at the start of the loop.
    while +1 There is a decision at the while statement.
    except +1 Each except branch adds a new conditional path of execution.
    finally +0 The finally block is unconditionally executed.
    with +1 The with statement roughly corresponds to a try/except block (see PEP 343 for details).
    assert +1 The assert statement internally roughly equals a conditional statement.
    Comprehension +1 A list/set/dict comprehension of generator expression is equivalent to a for loop.
    Boolean Operator +1 Every boolean operator (and, or) adds a decision point.

    Source: http://radon.readthedocs.org/en/latest/intro.html

    Cyclomatic complexity is too high in function rename_with_suffix. (7)
    Open

    def rename_with_suffix(parent_abspath, name, host_name):
        suffix = ' (' + host_name + ')'
        parent_abspath = parent_abspath + '/'
    
        # Calculate the file name without suffix.
    Severity: Minor
    Found in onedrived/od_tasks/merge_dir.py by radon

    Cyclomatic Complexity

    Cyclomatic Complexity corresponds to the number of decisions a block of code contains plus 1. This number (also called McCabe number) is equal to the number of linearly independent paths through the code. This number can be used as a guide when testing conditional logic in blocks.

    Radon analyzes the AST tree of a Python program to compute Cyclomatic Complexity. Statements have the following effects on Cyclomatic Complexity:

    Construct Effect on CC Reasoning
    if +1 An if statement is a single decision.
    elif +1 The elif statement adds another decision.
    else +0 The else statement does not cause a new decision. The decision is at the if.
    for +1 There is a decision at the start of the loop.
    while +1 There is a decision at the while statement.
    except +1 Each except branch adds a new conditional path of execution.
    finally +0 The finally block is unconditionally executed.
    with +1 The with statement roughly corresponds to a try/except block (see PEP 343 for details).
    assert +1 The assert statement internally roughly equals a conditional statement.
    Comprehension +1 A list/set/dict comprehension of generator expression is equivalent to a for loop.
    Boolean Operator +1 Every boolean operator (and, or) adds a decision point.

    Source: http://radon.readthedocs.org/en/latest/intro.html

    Function _handle_local_folder has a Cognitive Complexity of 12 (exceeds 5 allowed). Consider refactoring.
    Open

        def _handle_local_folder(self, item_name, item_record, item_local_abspath):
            """
            :param str item_name:
            :param onedrived.od_repo.ItemRecord | None item_record:
            :param str item_local_abspath:
    Severity: Minor
    Found in onedrived/od_tasks/merge_dir.py - About 1 hr to fix

    Cognitive Complexity

    Cognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.

    A method's cognitive complexity is based on a few simple rules:

    • Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one
    • Code is considered more complex for each "break in the linear flow of the code"
    • Code is considered more complex when "flow breaking structures are nested"

    Further reading

    Function list_local_names has a Cognitive Complexity of 12 (exceeds 5 allowed). Consider refactoring.
    Open

        def list_local_names(self):
            """
            List all names under the task local directory.
            Try resolving naming conflict (same name case-INsensitive) as it goes.
            :return [str]: A list of entry names.
    Severity: Minor
    Found in onedrived/od_tasks/merge_dir.py - About 1 hr to fix

    Cognitive Complexity

    Cognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.

    A method's cognitive complexity is based on a few simple rules:

    • Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one
    • Code is considered more complex for each "break in the linear flow of the code"
    • Code is considered more complex when "flow breaking structures are nested"

    Further reading

    Function _handle_remote_item has a Cognitive Complexity of 11 (exceeds 5 allowed). Consider refactoring.
    Open

        def _handle_remote_item(self, remote_item, all_local_items, all_records):
            """
            :param onedrivesdk.model.item.Item remote_item:
            :param [str] all_local_items:
            :param dict(str, onedrived.od_repo.ItemRecord) all_records:
    Severity: Minor
    Found in onedrived/od_tasks/merge_dir.py - About 1 hr to fix

    Cognitive Complexity

    Cognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.

    A method's cognitive complexity is based on a few simple rules:

    • Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one
    • Code is considered more complex for each "break in the linear flow of the code"
    • Code is considered more complex when "flow breaking structures are nested"

    Further reading

    Function _handle_remote_file_without_record has a Cognitive Complexity of 10 (exceeds 5 allowed). Consider refactoring.
    Open

        def _handle_remote_file_without_record(self, remote_item, item_stat, item_local_abspath, all_local_items):
            """
            Handle the case in which a remote item is not found in the database. The local item may or may not exist.
            :param onedrivesdk.model.item.Item remote_item:
            :param posix.stat_result | None item_stat:
    Severity: Minor
    Found in onedrived/od_tasks/merge_dir.py - About 1 hr to fix

    Cognitive Complexity

    Cognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.

    A method's cognitive complexity is based on a few simple rules:

    • Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one
    • Code is considered more complex for each "break in the linear flow of the code"
    • Code is considered more complex when "flow breaking structures are nested"

    Further reading

    Function rename_with_suffix has a Cognitive Complexity of 10 (exceeds 5 allowed). Consider refactoring.
    Open

    def rename_with_suffix(parent_abspath, name, host_name):
        suffix = ' (' + host_name + ')'
        parent_abspath = parent_abspath + '/'
    
        # Calculate the file name without suffix.
    Severity: Minor
    Found in onedrived/od_tasks/merge_dir.py - About 1 hr to fix

    Cognitive Complexity

    Cognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.

    A method's cognitive complexity is based on a few simple rules:

    • Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one
    • Code is considered more complex for each "break in the linear flow of the code"
    • Code is considered more complex when "flow breaking structures are nested"

    Further reading

    Function __init__ has 7 arguments (exceeds 4 allowed). Consider refactoring.
    Open

        def __init__(self, repo, task_pool, rel_path, item_request, deep_merge=True,
    Severity: Major
    Found in onedrived/od_tasks/merge_dir.py - About 50 mins to fix

      Function __init__ has 6 arguments (exceeds 4 allowed). Consider refactoring.
      Open

          def __init__(self, repo, task_pool, item_name, parent_relpath, upload_if_success=True, abort_if_local_gone=True):
      Severity: Minor
      Found in onedrived/od_tasks/merge_dir.py - About 45 mins to fix

        Function _handle_remote_folder has a Cognitive Complexity of 8 (exceeds 5 allowed). Consider refactoring.
        Open

            def _handle_remote_folder(self, remote_item, item_local_abspath, record, all_local_items):
                if not self.deep_merge:
                    return
                try:
                    remote_dir_matches_record = self._remote_dir_matches_record(remote_item, record)
        Severity: Minor
        Found in onedrived/od_tasks/merge_dir.py - About 45 mins to fix

        Cognitive Complexity

        Cognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.

        A method's cognitive complexity is based on a few simple rules:

        • Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one
        • Code is considered more complex for each "break in the linear flow of the code"
        • Code is considered more complex when "flow breaking structures are nested"

        Further reading

        Function _handle_remote_file_with_record has 5 arguments (exceeds 4 allowed). Consider refactoring.
        Open

            def _handle_remote_file_with_record(self, remote_item, item_record, item_stat, item_local_abspath, all_local_items):
        Severity: Minor
        Found in onedrived/od_tasks/merge_dir.py - About 35 mins to fix

          Function _handle_local_item has a Cognitive Complexity of 6 (exceeds 5 allowed). Consider refactoring.
          Open

              def _handle_local_item(self, item_name, all_records):
                  """
                  :param str item_name:
                  :param dict(str, onedrived.od_repo.ItemRecord) all_records:
                  :return:
          Severity: Minor
          Found in onedrived/od_tasks/merge_dir.py - About 25 mins to fix

          Cognitive Complexity

          Cognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.

          A method's cognitive complexity is based on a few simple rules:

          • Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one
          • Code is considered more complex for each "break in the linear flow of the code"
          • Code is considered more complex when "flow breaking structures are nested"

          Further reading

          TODO found
          Open

                      #     # TODO: A second best timestamp is the latest timestamp of any children item under this dir.
          Severity: Minor
          Found in onedrived/od_tasks/merge_dir.py by fixme

          TODO found
          Open

                          # TODO: Use the logic in handle_local_folder to solve this.
          Severity: Minor
          Found in onedrived/od_tasks/merge_dir.py by fixme

          TODO found
          Open

                  # TODO: This logic can be improved if remote info is provided.
          Severity: Minor
          Found in onedrived/od_tasks/merge_dir.py by fixme

          HACK found
          Open

                              # HACK: ChildrenCollectionPage is not guaranteed to have
          Severity: Minor
          Found in onedrived/od_tasks/merge_dir.py by fixme

          Similar blocks of code found in 2 locations. Consider refactoring.
          Open

                  elif item_record is not None:
                      if self.assume_remote_unchanged:
                          logging.info('Remote item for local dir "%s" is a file that has been deleted locally. '
                                       'Delete the remote item and upload the file.', item_local_abspath)
                          if not delete_item.DeleteRemoteItemTask(
          Severity: Major
          Found in onedrived/od_tasks/merge_dir.py and 1 other location - About 4 hrs to fix
          onedrived/od_tasks/merge_dir.py on lines 508..517

          Duplicated Code

          Duplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:

          Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.

          When you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).

          Tuning

          This issue has a mass of 80.

          We set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.

          The threshold configuration represents the minimum mass a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.

          If the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.

          See codeclimate-duplication's documentation for more information about tuning the mass threshold in your .codeclimate.yml.

          Refactorings

          Further Reading

          Similar blocks of code found in 2 locations. Consider refactoring.
          Open

                      if self.assume_remote_unchanged:
                          logging.info('Remote item for local file "%s" is a directory that has been deleted locally. '
                                       'Delete the remote item and upload the file.', item_local_abspath)
                          if not delete_item.DeleteRemoteItemTask(
                                  repo=self.repo, task_pool=self.task_pool, parent_relpath=self.rel_path,
          Severity: Major
          Found in onedrived/od_tasks/merge_dir.py and 1 other location - About 4 hrs to fix
          onedrived/od_tasks/merge_dir.py on lines 451..461

          Duplicated Code

          Duplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:

          Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.

          When you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).

          Tuning

          This issue has a mass of 80.

          We set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.

          The threshold configuration represents the minimum mass a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.

          If the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.

          See codeclimate-duplication's documentation for more information about tuning the mass threshold in your .codeclimate.yml.

          Refactorings

          Further Reading

          Similar blocks of code found in 2 locations. Consider refactoring.
          Open

                  if self.repo.path_filter.should_ignore(self.rel_path + '/' + item_name, True):
                      logging.debug('Ignored local directory "%s/%s".', self.rel_path, item_name)
                      return
          Severity: Major
          Found in onedrived/od_tasks/merge_dir.py and 1 other location - About 1 hr to fix
          onedrived/od_tasks/merge_dir.py on lines 476..478

          Duplicated Code

          Duplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:

          Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.

          When you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).

          Tuning

          This issue has a mass of 43.

          We set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.

          The threshold configuration represents the minimum mass a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.

          If the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.

          See codeclimate-duplication's documentation for more information about tuning the mass threshold in your .codeclimate.yml.

          Refactorings

          Further Reading

          Similar blocks of code found in 2 locations. Consider refactoring.
          Open

                  if self.repo.path_filter.should_ignore(self.rel_path + '/' + item_name, False):
                      logging.debug('Ignored local file "%s/%s".', self.rel_path, item_name)
                      return
          Severity: Major
          Found in onedrived/od_tasks/merge_dir.py and 1 other location - About 1 hr to fix
          onedrived/od_tasks/merge_dir.py on lines 414..416

          Duplicated Code

          Duplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:

          Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.

          When you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).

          Tuning

          This issue has a mass of 43.

          We set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.

          The threshold configuration represents the minimum mass a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.

          If the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.

          See codeclimate-duplication's documentation for more information about tuning the mass threshold in your .codeclimate.yml.

          Refactorings

          Further Reading

          Similar blocks of code found in 2 locations. Consider refactoring.
          Open

                      if item_stat is None:
                          # If the remote file is the one on record, then the remote one is newer than the deleted local file
                          # so it should be downloaded. If they are not the same, then the remote one should definitely
                          # be kept. So the remote file needs to be kept and downloaded anyway.
                          logging.debug('Local file "%s" is gone but remote item disagrees with db record. Download it.',
          Severity: Minor
          Found in onedrived/od_tasks/merge_dir.py and 1 other location - About 55 mins to fix
          onedrived/od_tasks/merge_dir.py on lines 248..256

          Duplicated Code

          Duplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:

          Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.

          When you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).

          Tuning

          This issue has a mass of 37.

          We set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.

          The threshold configuration represents the minimum mass a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.

          If the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.

          See codeclimate-duplication's documentation for more information about tuning the mass threshold in your .codeclimate.yml.

          Refactorings

          Further Reading

          Similar blocks of code found in 2 locations. Consider refactoring.
          Open

                      elif item_stat.st_size == item_record.size_local and \
                              (diff_timestamps(local_mtime_ts, record_mtime_ts) == 0 or
                               item_record.sha1_hash and item_record.sha1_hash == sha1_value(item_local_abspath)):
                          # Local file agrees with database record. This means that the remote file is strictly newer.
                          # The local file can be safely overwritten.
          Severity: Minor
          Found in onedrived/od_tasks/merge_dir.py and 1 other location - About 55 mins to fix
          onedrived/od_tasks/merge_dir.py on lines 240..247

          Duplicated Code

          Duplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:

          Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.

          When you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).

          Tuning

          This issue has a mass of 37.

          We set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.

          The threshold configuration represents the minimum mass a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.

          If the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.

          See codeclimate-duplication's documentation for more information about tuning the mass threshold in your .codeclimate.yml.

          Refactorings

          Further Reading

          Similar blocks of code found in 2 locations. Consider refactoring.
          Open

              def __repr__(self):
                  return type(self).__name__ + '(%s, upload=%s)' % (self.local_abspath, self.upload_if_success)
          Severity: Minor
          Found in onedrived/od_tasks/merge_dir.py and 1 other location - About 40 mins to fix
          onedrived/od_tasks/delete_item.py on lines 23..24

          Duplicated Code

          Duplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:

          Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.

          When you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).

          Tuning

          This issue has a mass of 34.

          We set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.

          The threshold configuration represents the minimum mass a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.

          If the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.

          See codeclimate-duplication's documentation for more information about tuning the mass threshold in your .codeclimate.yml.

          Refactorings

          Further Reading

          Identical blocks of code found in 2 locations. Consider refactoring.
          Open

                      new_name = ent_name + ' ' + str(count) + suffix + ent_ext
          Severity: Minor
          Found in onedrived/od_tasks/merge_dir.py and 1 other location - About 35 mins to fix
          onedrived/od_tasks/merge_dir.py on lines 35..35

          Duplicated Code

          Duplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:

          Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.

          When you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).

          Tuning

          This issue has a mass of 33.

          We set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.

          The threshold configuration represents the minimum mass a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.

          If the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.

          See codeclimate-duplication's documentation for more information about tuning the mass threshold in your .codeclimate.yml.

          Refactorings

          Further Reading

          Identical blocks of code found in 2 locations. Consider refactoring.
          Open

                  new_name = ent_name + ' ' + str(count) + suffix + ent_ext
          Severity: Minor
          Found in onedrived/od_tasks/merge_dir.py and 1 other location - About 35 mins to fix
          onedrived/od_tasks/merge_dir.py on lines 38..38

          Duplicated Code

          Duplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:

          Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.

          When you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).

          Tuning

          This issue has a mass of 33.

          We set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.

          The threshold configuration represents the minimum mass a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.

          If the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.

          See codeclimate-duplication's documentation for more information about tuning the mass threshold in your .codeclimate.yml.

          Refactorings

          Further Reading

          Similar blocks of code found in 2 locations. Consider refactoring.
          Open

                          self.task_pool.add_task(delete_item.DeleteRemoteItemTask(
                              self.repo, self.task_pool, self.rel_path, remote_item.name, remote_item.id, False))
          Severity: Minor
          Found in onedrived/od_tasks/merge_dir.py and 1 other location - About 30 mins to fix
          onedrived/od_tasks/merge_dir.py on lines 348..349

          Duplicated Code

          Duplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:

          Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.

          When you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).

          Tuning

          This issue has a mass of 32.

          We set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.

          The threshold configuration represents the minimum mass a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.

          If the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.

          See codeclimate-duplication's documentation for more information about tuning the mass threshold in your .codeclimate.yml.

          Refactorings

          Further Reading

          Similar blocks of code found in 2 locations. Consider refactoring.
          Open

                              self.task_pool.add_task(delete_item.DeleteRemoteItemTask(
                                  self.repo, self.task_pool, self.rel_path, remote_item.name, remote_item.id, True))
          Severity: Minor
          Found in onedrived/od_tasks/merge_dir.py and 1 other location - About 30 mins to fix
          onedrived/od_tasks/merge_dir.py on lines 216..217

          Duplicated Code

          Duplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:

          Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.

          When you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).

          Tuning

          This issue has a mass of 32.

          We set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.

          The threshold configuration represents the minimum mass a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.

          If the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.

          See codeclimate-duplication's documentation for more information about tuning the mass threshold in your .codeclimate.yml.

          Refactorings

          Further Reading

          Line break after binary operator
          Open

                      remote_item.size == item_record.size and
          Severity: Minor
          Found in onedrived/od_tasks/merge_dir.py by pep8

          Avoid breaks after binary operators.

          The preferred place to break around a binary operator is before the
          operator, not after it.
          
          W504: (width == 0 +\n height == 0)
          W504: (width == 0 and\n height == 0)
          W504: var = (1 &\n       ~2)
          
          Okay: foo(\n    -x)
          Okay: foo(x\n    [])
          Okay: x = '''\n''' + ''
          Okay: x = '' + '''\n'''
          Okay: foo(x,\n    -y)
          Okay: foo(x,  # comment\n    -y)
          
          The following should be W504 but unary_context is tricky with these
          Okay: var = (1 /\n       -2)
          Okay: var = (1 +\n       -1 +\n       -2)

          Line break after binary operator
          Open

                            (diff_timestamps(local_mtime_ts, record_mtime_ts) == 0 or
          Severity: Minor
          Found in onedrived/od_tasks/merge_dir.py by pep8

          Avoid breaks after binary operators.

          The preferred place to break around a binary operator is before the
          operator, not after it.
          
          W504: (width == 0 +\n height == 0)
          W504: (width == 0 and\n height == 0)
          W504: var = (1 &\n       ~2)
          
          Okay: foo(\n    -x)
          Okay: foo(x\n    [])
          Okay: x = '''\n''' + ''
          Okay: x = '' + '''\n'''
          Okay: foo(x,\n    -y)
          Okay: foo(x,  # comment\n    -y)
          
          The following should be W504 but unary_context is tricky with these
          Okay: var = (1 /\n       -2)
          Okay: var = (1 +\n       -1 +\n       -2)

          Line break after binary operator
          Open

                      elif (item_stat.st_size == item_record.size_local and
          Severity: Minor
          Found in onedrived/od_tasks/merge_dir.py by pep8

          Avoid breaks after binary operators.

          The preferred place to break around a binary operator is before the
          operator, not after it.
          
          W504: (width == 0 +\n height == 0)
          W504: (width == 0 and\n height == 0)
          W504: var = (1 &\n       ~2)
          
          Okay: foo(\n    -x)
          Okay: foo(x\n    [])
          Okay: x = '''\n''' + ''
          Okay: x = '' + '''\n'''
          Okay: foo(x,\n    -y)
          Okay: foo(x,  # comment\n    -y)
          
          The following should be W504 but unary_context is tricky with these
          Okay: var = (1 /\n       -2)
          Okay: var = (1 +\n       -1 +\n       -2)

          Line break after binary operator
          Open

                              (diff_timestamps(local_mtime_ts, record_mtime_ts) == 0 or
          Severity: Minor
          Found in onedrived/od_tasks/merge_dir.py by pep8

          Avoid breaks after binary operators.

          The preferred place to break around a binary operator is before the
          operator, not after it.
          
          W504: (width == 0 +\n height == 0)
          W504: (width == 0 and\n height == 0)
          W504: var = (1 &\n       ~2)
          
          Okay: foo(\n    -x)
          Okay: foo(x\n    [])
          Okay: x = '''\n''' + ''
          Okay: x = '' + '''\n'''
          Okay: foo(x,\n    -y)
          Okay: foo(x,  # comment\n    -y)
          
          The following should be W504 but unary_context is tricky with these
          Okay: var = (1 /\n       -2)
          Okay: var = (1 +\n       -1 +\n       -2)

          Line break after binary operator
          Open

                  if (remote_item.id == item_record.item_id and remote_item.c_tag == item_record.c_tag or
          Severity: Minor
          Found in onedrived/od_tasks/merge_dir.py by pep8

          Avoid breaks after binary operators.

          The preferred place to break around a binary operator is before the
          operator, not after it.
          
          W504: (width == 0 +\n height == 0)
          W504: (width == 0 and\n height == 0)
          W504: var = (1 &\n       ~2)
          
          Okay: foo(\n    -x)
          Okay: foo(x\n    [])
          Okay: x = '''\n''' + ''
          Okay: x = '' + '''\n'''
          Okay: foo(x,\n    -y)
          Okay: foo(x,  # comment\n    -y)
          
          The following should be W504 but unary_context is tricky with these
          Okay: var = (1 /\n       -2)
          Okay: var = (1 +\n       -1 +\n       -2)

          There are no issues that match your filters.

          Category
          Status