JohnCoates/Aerial

View on GitHub
Aerial/Source/Models/Cache/PoiStringProvider.swift

Summary

Maintainability
D
2 days
Test Coverage

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

    private func getCommunityPathForLocale() -> String {
        let locale: NSLocale = NSLocale(localeIdentifier: Locale.preferredLanguages[0])

        // Do we have a language override ?
        if PrefsAdvanced.ciOverrideLanguage != "" {
Severity: Minor
Found in Aerial/Source/Models/Cache/PoiStringProvider.swift - 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

File PoiStringProvider.swift has 262 lines of code (exceeds 250 allowed). Consider refactoring.
Open

import Foundation

final class CommunityStrings {
    let id: String
    let name: String
Severity: Minor
Found in Aerial/Source/Models/Cache/PoiStringProvider.swift - About 2 hrs to fix

    Function getCommunityPathForLocale has 45 lines of code (exceeds 25 allowed). Consider refactoring.
    Open

        private func getCommunityPathForLocale() -> String {
            let locale: NSLocale = NSLocale(localeIdentifier: Locale.preferredLanguages[0])
    
            // Do we have a language override ?
            if PrefsAdvanced.ciOverrideLanguage != "" {
    Severity: Minor
    Found in Aerial/Source/Models/Cache/PoiStringProvider.swift - About 1 hr to fix

      Function getLanguageStringFromPosition has 42 lines of code (exceeds 25 allowed). Consider refactoring.
      Open

          func getLanguageStringFromPosition(pos: Int) -> String {
              switch pos {
              case 1:
                  return "ar"
              case 2:
      Severity: Minor
      Found in Aerial/Source/Models/Cache/PoiStringProvider.swift - About 1 hr to fix

        Function getLanguagePosition has 42 lines of code (exceeds 25 allowed). Consider refactoring.
        Open

            func getLanguagePosition() -> Int {
                // The list is alphabetized based on their english name in the UI
                switch PrefsAdvanced.ciOverrideLanguage {
                case "ar":  // Arabic
                    return 1
        Severity: Minor
        Found in Aerial/Source/Models/Cache/PoiStringProvider.swift - About 1 hr to fix

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

              private func loadBundle() {
                  // Idle string bundle
                  var bundlePath = Cache.supportPath.appending("/macOS 14")
          
                  if PrefsAdvanced.ciOverrideLanguage == "" {
          Severity: Minor
          Found in Aerial/Source/Models/Cache/PoiStringProvider.swift - 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 loadBundle has 31 lines of code (exceeds 25 allowed). Consider refactoring.
          Open

              private func loadBundle() {
                  // Idle string bundle
                  var bundlePath = Cache.supportPath.appending("/macOS 14")
          
                  if PrefsAdvanced.ciOverrideLanguage == "" {
          Severity: Minor
          Found in Aerial/Source/Models/Cache/PoiStringProvider.swift - About 1 hr to fix

            Force casts should be avoided
            Open

                            let name = (item.value as! NSDictionary)["name"] as! String

            forced-type-cast

            Avoid using the forced form of the type cast operator (as!) because Swift is not able to determine at compile time if the type conversion will succeed. In the event of an unsuccessful conversion, a runtime error will be triggered. The conditional form of the type cast operator (as?) is safer and should be used when possible.

            Preferred

            if let movie = item as? Movie {
                print("Movie: '\(movie.name)', dir. \(movie.director)")
            }

            Not Preferred

            let movie = item as! Movie
            print("Movie: '\(movie.name)', dir. \(movie.director)")

            Force casts should be avoided
            Open

                            let id = item.key as! String

            forced-type-cast

            Avoid using the forced form of the type cast operator (as!) because Swift is not able to determine at compile time if the type conversion will succeed. In the event of an unsuccessful conversion, a runtime error will be triggered. The conditional form of the type cast operator (as?) is safer and should be used when possible.

            Preferred

            if let movie = item as? Movie {
                print("Movie: '\(movie.name)', dir. \(movie.director)")
            }

            Not Preferred

            let movie = item as! Movie
            print("Movie: '\(movie.name)', dir. \(movie.director)")

            Force casts should be avoided
            Open

                            let name = (item.value as! NSDictionary)["name"] as! String

            forced-type-cast

            Avoid using the forced form of the type cast operator (as!) because Swift is not able to determine at compile time if the type conversion will succeed. In the event of an unsuccessful conversion, a runtime error will be triggered. The conditional form of the type cast operator (as?) is safer and should be used when possible.

            Preferred

            if let movie = item as? Movie {
                print("Movie: '\(movie.name)', dir. \(movie.director)")
            }

            Not Preferred

            let movie = item as! Movie
            print("Movie: '\(movie.name)', dir. \(movie.director)")

            Force casts should be avoided
            Open

                            let poi = (item.value as! NSDictionary)["pointsOfInterest"] as? [String: String]

            forced-type-cast

            Avoid using the forced form of the type cast operator (as!) because Swift is not able to determine at compile time if the type conversion will succeed. In the event of an unsuccessful conversion, a runtime error will be triggered. The conditional form of the type cast operator (as?) is safer and should be used when possible.

            Preferred

            if let movie = item as? Movie {
                print("Movie: '\(movie.name)', dir. \(movie.director)")
            }

            Not Preferred

            let movie = item as! Movie
            print("Movie: '\(movie.name)', dir. \(movie.director)")

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

                    switch PrefsAdvanced.ciOverrideLanguage {
                    case "ar":  // Arabic
                        return 1
                    case "zh_CN":  // Chinese Simplified
                        return 2
            Severity: Major
            Found in Aerial/Source/Models/Cache/PoiStringProvider.swift and 1 other location - About 3 hrs to fix
            Aerial/Source/Models/Cache/PoiStringProvider.swift on lines 309..350

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

            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

                    switch pos {
                    case 1:
                        return "ar"
                    case 2:
                        return "zh_CN"
            Severity: Major
            Found in Aerial/Source/Models/Cache/PoiStringProvider.swift and 1 other location - About 3 hrs to fix
            Aerial/Source/Models/Cache/PoiStringProvider.swift on lines 263..304

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

            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

                        if let match = bestMatchedLanguage {
                            debugLog("Best matched language : \(match)")
                            bundlePath.append(contentsOf: "/TVIdleScreenStrings.bundle/" + match + ".lproj/")
                        } else {
                            debugLog("No match, reverting to english")
            Severity: Minor
            Found in Aerial/Source/Models/Cache/PoiStringProvider.swift and 1 other location - About 45 mins to fix
            Aerial/Source/Models/Cache/PoiStringProvider.swift on lines 69..78

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

            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

                        if let match = bestMatchedLanguage {
                            debugLog("Best matched language : \(match)")
                            bundlePath.append(contentsOf: "/TVIdleScreenStrings.bundle/" + match + ".lproj/")
                        } else {
                            debugLog("No match, reverting to english")
            Severity: Minor
            Found in Aerial/Source/Models/Cache/PoiStringProvider.swift and 1 other location - About 45 mins to fix
            Aerial/Source/Models/Cache/PoiStringProvider.swift on lines 56..65

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

            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 should not have any trailing whitespace
            Open

                        

            trailing-whitespace

            Flag whitespace after the last non-whitespace character on each line until the newline.

            Preferred

            let number = 42¬

            Not Preferred

            let number = 42••¬

            Multiline comment should start with whitespace
            Open

                    /*let preferences = Preferences.sharedInstance

            comment-whitespace

            Prefer at least one whitespace character after a comment opening symbol (//, ///, /*, or /**) and at least one whitespace character before a comment closing symbol (*/).

            Preferred

            // This is a comment
            
            /// This is a documentation comment
            
            /* This is a
            multi-line comment */
            
            /* This is a
            multi-line comment
            */
            
            /** This is a
            documentation multi-line
            comment
            */

            Not Preferred

            //This is a comment
            
            ///This is a documentation comment
            
            /*This is a
            multi-line comment*/
            
            /**This is a multi-line
            documentation comment */

            Line should not have any trailing whitespace
            Open

                // 

            trailing-whitespace

            Flag whitespace after the last non-whitespace character on each line until the newline.

            Preferred

            let number = 42¬

            Not Preferred

            let number = 42••¬

            Colon at column 111 should have exactly one space after it
            Open

                        let bestMatchedLanguage = Bundle.preferredLocalizations(from: getBundleLanguages(), forPreferences:  [PrefsAdvanced.ciOverrideLanguage]).first

            colon-whitespace

            There should be no whitespace preceding the colon, exactly one whitespace after the colon for: * var, class, struct, protocol, extension, func, and tuple declarations * dict literals and types * case statements

            However, for conditional expressions there should be a single whitespace before and after the colon.

            Variable declarations

            Preferred

            var x: Int = 2

            Not Preferred

            var x : Int
            var y:   String

            Dictionary literals and types

            Preferred

            var x = [ 'key1': 1, 'key2': 2 ]
            var y: [ Int: String ]

            Not Preferred

            var x = [ 'key1' : 1, 'key2':  3]
            var y: [ Int :    String ]

            Case statements

            Preferred

            switch character {
            case "a": doSomething(a);
            default: alert();
            }

            Not Preferred

            switch character {
            case "a" : doSomething(a);
            default:     alert();
            }

            Class, Struct, Protocol, and Extension declarations

            Preferred

            class ClassName: BaseClass {
            }
            
            struct StructName: BaseStruct {
            }
            
            protocol ProtocolName: AnotherProtocol {
            }
            
            extension TypeName: ProtocolName {
            }

            Not Preferred

            class ClassName : BaseClass {
            }
            
            struct StructName:  BaseStruct {
            }
            
            protocol ProtocolName:AnotherProtocol {
            }
            
            extension TypeName : ProtocolName {
            }

            Tuple declarations

            Preferred

            var y = (key: 1, value: 2)

            Not Preferred

            var y = (key:1, value : 2)

            Function declarations

            Preferred

            func someFunction<t: someclass u: someprotocol>(someT: T, someU: U) {
            }</t:>

            Not Preferred

            func someFunction<t : someclass u:someprotocol>(someT: T, someU: U) {
            }</t>

            Conditional expressions

            Preferred

            var x = condition ? a : b

            Not Preferred

            var x = condition ? a: b
            var x = condition ? a   : b

            Multiline comment should start with whitespace
            Open

                        /*debugLog("Language overriden to \(String(describing: bestMatchedLanguage))")

            comment-whitespace

            Prefer at least one whitespace character after a comment opening symbol (//, ///, /*, or /**) and at least one whitespace character before a comment closing symbol (*/).

            Preferred

            // This is a comment
            
            /// This is a documentation comment
            
            /* This is a
            multi-line comment */
            
            /* This is a
            multi-line comment
            */
            
            /** This is a
            documentation multi-line
            comment
            */

            Not Preferred

            //This is a comment
            
            ///This is a documentation comment
            
            /*This is a
            multi-line comment*/
            
            /**This is a multi-line
            documentation comment */

            Multiline comment should end with whitespace
            Open

                    }*/

            comment-whitespace

            Prefer at least one whitespace character after a comment opening symbol (//, ///, /*, or /**) and at least one whitespace character before a comment closing symbol (*/).

            Preferred

            // This is a comment
            
            /// This is a documentation comment
            
            /* This is a
            multi-line comment */
            
            /* This is a
            multi-line comment
            */
            
            /** This is a
            documentation multi-line
            comment
            */

            Not Preferred

            //This is a comment
            
            ///This is a documentation comment
            
            /*This is a
            multi-line comment*/
            
            /**This is a multi-line
            documentation comment */

            Multiline comment should end with whitespace
            Open

                        bundlePath.append(contentsOf: "/TVIdleScreenStrings.bundle/" + PrefsAdvanced.ciOverrideLanguage + ".lproj/")*/

            comment-whitespace

            Prefer at least one whitespace character after a comment opening symbol (//, ///, /*, or /**) and at least one whitespace character before a comment closing symbol (*/).

            Preferred

            // This is a comment
            
            /// This is a documentation comment
            
            /* This is a
            multi-line comment */
            
            /* This is a
            multi-line comment
            */
            
            /** This is a
            documentation multi-line
            comment
            */

            Not Preferred

            //This is a comment
            
            ///This is a documentation comment
            
            /*This is a
            multi-line comment*/
            
            /**This is a multi-line
            documentation comment */

            Line should not have any trailing whitespace
            Open

                    

            trailing-whitespace

            Flag whitespace after the last non-whitespace character on each line until the newline.

            Preferred

            let number = 42¬

            Not Preferred

            let number = 42••¬

            Line should not have any trailing whitespace
            Open

                

            trailing-whitespace

            Flag whitespace after the last non-whitespace character on each line until the newline.

            Preferred

            let number = 42¬

            Not Preferred

            let number = 42••¬

            Line should not have any trailing whitespace
            Open

                        

            trailing-whitespace

            Flag whitespace after the last non-whitespace character on each line until the newline.

            Preferred

            let number = 42¬

            Not Preferred

            let number = 42••¬

            Function should have at least one blank line after it
            Open

                }

            function-whitespace

            Every function and method declaration should have one blank line before and after itself. An exception to this rule are functions that are declared at the start of a file (only need one blank line after their declaration) or at the end of a file (only need one blank line before their declaration). Comments immediately before a function declaration (no blank lines between them and the function) are considered to be part of the declaration.

            Preferred

            func function1() {
              var text = 1
              var text = 2
            }
            
            function1()
            
            // a comment
            func function2() {
              // something goes here
            }
            
            struct SomeStruct {
            
              func function3() {
                // something goes here
              }
            
              func function4() {
                // something else goes here
              };
            
            }
            
            func function5() {
              // something goes here
            }

            Not Preferred

            func function1() {
              var text = 1
              var text = 2
            }
            function1()
            // a comment
            func function2() {
              // something goes here
            }
            
            struct SomeStruct {
              func function3() {
                // something goes here
              }
            
              func function4() {
                // something else goes here
              };
            }
            func function5() {
              // something goes here
            }

            There are no issues that match your filters.

            Category
            Status