emory-libraries/eulfedora

View on GitHub

Showing 182 of 182 total issues

File models.py has 1524 lines of code (exceeds 250 allowed). Consider refactoring.
Open

# file eulfedora/models.py
#
#   Copyright 2010,2011 Emory University Libraries
#
#   Licensed under the Apache License, Version 2.0 (the "License");
Severity: Major
Found in eulfedora/models.py - About 4 days to fix

    File api.py has 766 lines of code (exceeds 250 allowed). Consider refactoring.
    Open

    # file eulfedora/api.py
    #
    #   Copyright 2010,2011 Emory University Libraries
    #
    #   Licensed under the Apache License, Version 2.0 (the "License");
    Severity: Major
    Found in eulfedora/api.py - About 1 day to fix

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

          def purge_relationship(self, rel_uri, obj):
              """
              Purge a relationship from RELS-EXT for this object.
              Calls :meth:`API_M.purgeRelationship`.
      
      
      Severity: Major
      Found in eulfedora/models.py and 1 other location - About 1 day to fix
      eulfedora/models.py on lines 1891..1925

      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 142.

      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 add_relationship(self, rel_uri, obj):
              """
              Add a new relationship to the RELS-EXT for this object.
              Calls :meth:`API_M.addRelationship`.
      
      
      Severity: Major
      Found in eulfedora/models.py and 1 other location - About 1 day to fix
      eulfedora/models.py on lines 1927..1961

      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 142.

      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

      Function raw_datastream_old has a Cognitive Complexity of 55 (exceeds 5 allowed). Consider refactoring.
      Open

      def raw_datastream_old(request, pid, dsid, type=None, repo=None,
                             headers=None, accept_range_request=False,
                             as_of_date=None, streaming=False):
          '''
          .. NOTE::
      Severity: Minor
      Found in eulfedora/views.py - About 1 day 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

      DigitalObject has 57 functions (exceeds 20 allowed). Consider refactoring.
      Open

      class DigitalObject(six.with_metaclass(DigitalObjectType, object)):
          """
          A single digital object in a Fedora respository, with methods and
          properties to easy creating, accessing, and updating a Fedora
          object or any of its component parts, with pre-defined datastream
      Severity: Major
      Found in eulfedora/models.py - About 1 day to fix

        Cyclomatic complexity is too high in function raw_datastream_old. (37)
        Open

        @condition(etag_func=datastream_etag)
        @require_http_methods(['GET', 'HEAD'])
        def raw_datastream_old(request, pid, dsid, type=None, repo=None,
                               headers=None, accept_range_request=False,
                               as_of_date=None, streaming=False):
        Severity: Minor
        Found in eulfedora/views.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

        File views.py has 449 lines of code (exceeds 250 allowed). Consider refactoring.
        Open

        # file eulfedora/views.py
        #
        #   Copyright 2010,2011 Emory University Libraries
        #
        #   Licensed under the Apache License, Version 2.0 (the "License");
        Severity: Minor
        Found in eulfedora/views.py - About 6 hrs to fix

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

              def load_initial_objects(self):
                  # look for any .xml files in apps under fixtures/initial_objects
                  # and attempt to load them as Fedora objects
                  # NOTE! any fixtures should have pids specified, or new versions of the
                  # fixture will be created every time syncrepo runs
          Severity: Minor
          Found in eulfedora/management/commands/syncrepo.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

          Function save has a Cognitive Complexity of 36 (exceeds 5 allowed). Consider refactoring.
          Open

              def save(self, logmessage=None):
                  """Save datastream content and any changed datastream profile
                  information to Fedora.
          
                  :rtype: boolean for success
          Severity: Minor
          Found in eulfedora/models.py - About 5 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

          DatastreamObject has 36 functions (exceeds 20 allowed). Consider refactoring.
          Open

          class DatastreamObject(object):
              """Object to ease accessing and updating a datastream belonging to a Fedora
              object.  Handles datastream content as well as datastream profile information.
              Content and datastream info are only pulled from Fedora when content and info
              fields are accessed.
          Severity: Minor
          Found in eulfedora/models.py - About 4 hrs to fix

            File syncutil.py has 358 lines of code (exceeds 250 allowed). Consider refactoring.
            Open

            # file eulfedora/syncutil.py
            #
            #   Copyright 2016 Emory University Libraries & IT Services
            #
            #   Licensed under the Apache License, Version 2.0 (the "License");
            Severity: Minor
            Found in eulfedora/syncutil.py - About 4 hrs to fix

              Function object_data has a Cognitive Complexity of 30 (exceeds 5 allowed). Consider refactoring.
              Open

                  def object_data(self):
                      '''Process the archival export and return a buffer with foxml
                      content for ingest into the destination repository.
              
                      :returns: :class:`io.BytesIO` for ingest, with references
              Severity: Minor
              Found in eulfedora/syncutil.py - About 4 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

              File server.py has 343 lines of code (exceeds 250 allowed). Consider refactoring.
              Open

              # file eulfedora/server.py
              #
              #   Copyright 2010,2011 Emory University Libraries
              #
              #   Licensed under the Apache License, Version 2.0 (the "License");
              Severity: Minor
              Found in eulfedora/server.py - About 4 hrs to fix

                Cyclomatic complexity is too high in method save. (20)
                Open

                    def save(self, logmessage=None):
                        """Save datastream content and any changed datastream profile
                        information to Fedora.
                
                        :rtype: boolean for success
                Severity: Minor
                Found in eulfedora/models.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

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

                    @classmethod
                    def last_modified(cls, request, *args, **kwargs):
                        '''Class method to generate last-modified header for use with
                        conditional processing; calls :meth:`datastream_lastmodified` with
                        class configuration.'''
                Severity: Major
                Found in eulfedora/views.py and 1 other location - About 4 hrs to fix
                eulfedora/views.py on lines 542..552

                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 75.

                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

                    @classmethod
                    def etag(cls, request, *args, **kwargs):
                        '''Class method to generate an ETag for use with
                        conditional processing; calls :meth:`datastream_etag` with
                        class configuration.'''
                Severity: Major
                Found in eulfedora/views.py and 1 other location - About 4 hrs to fix
                eulfedora/views.py on lines 554..564

                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 75.

                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

                Cyclomatic complexity is too high in method load_initial_objects. (19)
                Open

                    def load_initial_objects(self):
                        # look for any .xml files in apps under fixtures/initial_objects
                        # and attempt to load them as Fedora objects
                        # NOTE! any fixtures should have pids specified, or new versions of the
                        # fixture will be created every time syncrepo runs

                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 find_objects has a Cognitive Complexity of 27 (exceeds 5 allowed). Consider refactoring.
                Open

                    def find_objects(self, terms=None, type=None, chunksize=None, **kwargs):
                        """
                        Find objects in Fedora.  Find query should be generated via keyword
                        args, based on the fields in Fedora documentation.  By default, the
                        query uses a contains (~) search for all search terms.  Calls
                Severity: Minor
                Found in eulfedora/server.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 __init__. (18)
                Open

                    def __init__(self, root=None, username=None, password=None, request=None,
                                 retries=default_retry_option):
                
                        # when initialized via django, settings should be pulled from django conf
                        if root is None:
                Severity: Minor
                Found in eulfedora/server.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

                Severity
                Category
                Status
                Source
                Language