JohnCoates/Aerial

View on GitHub
Aerial/Source/Models/Music/Music.swift

Summary

Maintainability
C
7 hrs
Test Coverage

Function mediaRemoteCallback has a Cognitive Complexity of 34 (exceeds 5 allowed). Consider refactoring.
Open

    @objc func mediaRemoteCallback(_ aNotification: Notification?) {
        var album = ""
        var name = ""
        var artist = ""
        var artwork: NSImage?
Severity: Minor
Found in Aerial/Source/Models/Music/Music.swift - 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

Function mediaRemoteCallback has 36 lines of code (exceeds 25 allowed). Consider refactoring.
Open

    @objc func mediaRemoteCallback(_ aNotification: Notification?) {
        var album = ""
        var name = ""
        var artist = ""
        var artwork: NSImage?
Severity: Minor
Found in Aerial/Source/Models/Music/Music.swift - About 1 hr to fix

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

        @objc func mediaRemoteAppStateChange(_ aNotification: Notification) {
            debugLog("🎧 app state change")
            
            if let userInfo = aNotification.userInfo {
                if let rate = userInfo["kMRMediaRemoteNowPlayingApplicationIsPlayingUserInfoKey"] as? Double {
    Severity: Minor
    Found in Aerial/Source/Models/Music/Music.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

    Force casts should be avoided
    Open

                            if let _artwork = NSImage(data: information["kMRMediaRemoteNowPlayingInfoArtworkData"] as! Data) {

    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)")

    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••¬

    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••¬

    Closure is the function's final argument and may be passed as a trailing closure instead
    Open

            MRMediaRemoteGetNowPlayingInfo(DispatchQueue.main, { (information) in

    trailing-closure

    Closures that are the last argument of a function should be passed into the function using trailing closure syntax.

    Preferred

    reversed = names.sort { s1, s2 in return s1 > s2 }

    Not Preferred

    reversed = names.sort({ s1, s2 in return s1 > s2 })

    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••¬

    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 32 should have exactly one space after it
    Open

        func addCallback(_ callback:@escaping MusicCallback) {

    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

    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••¬

    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
    }

    Condition should not be enclosed within parentheses
    Open

                    if (info != 0.0) {

    redundant-parentheses

    Control flow constructs (if, else if, switch, for, while, repeat-while, and guard statements), Exception handling constructs (throw, and do/catch statements), and Initializers (array, dictionary, initializer patterns) should not be enclosed in parentheses.

    Additionally, method calls with no parameters and a trailing closure should not have empty parentheses following the method name.

    Control flow constructs

    • if, else if statement

    Preferred

    if SomeCondition {
    
    } else if SomeOtherCondition {
    }

    Not Preferred

    if (SomeCondition) {
    
    } else if (SomeOtherCondition) {
    }
    • switch statement

    Preferred

    switch SomeData {
        default:
            break
    }

    Not Preferred

    switch (SomeData) {
        default:
            break
    }
    • for loop

    Preferred

    for var i = 0; i < 10; i+=1 {
    
    }

    Not Preferred

    for (var i = 0; i < 10; i+=1) {
    
    }
    • while loop

    Preferred

    while SomeCondition {
    
    }

    Not Preferred

    while (SomeCondition) {
    
    }
    • repeat-while loop

    Preferred

    repeat {
    
    } while SomeCondition

    Not Preferred

    repeat {
    
    } while (SomeCondition)
    • guard clause

    Preferred

    guard true else {   }

    Not Preferred

    guard (true) else {   }

    Exception handling constructs

    • do/catch statement

    Preferred

    do  {
    
    } catch SomeException {
    
    }

    Not Preferred

    do  {
    
    } catch (SomeException) {
    
    }
    • throw statement

    Preferred

    throw SomeException

    Not Preferred

    throw (SomeException)

    Initializers

    • array items

    Preferred

    var shoppingList: [String] = ["Eggs", "Milk"]

    Not Preferred

    var shoppingList: [String] = [("Eggs"), ("Milk")]
    • dictionary items

    Preferred

    var airports: [String: String] = ["YYZ": "Toronto Pearson", "DUB": "Dublin"]

    Not Preferred

    var airports: [String: String] = [("YYZ"): ("Toronto Pearson"), ("DUB"): ("Dublin")]
    • initializer patterns

    Preferred

    var x: Int = 2
    var y: String = "Sleekbyte"
    var x = 2

    Not Preferred

    var x: Int = (2)
    var y: String = ("Sleekbyte")
    var x = (2)

    Method calls

    Preferred

    items.map {
      item in item.transform()
    }

    Not Preferred

    items.map() {
      item in item.transform()
    }

    Constant should be lowerCamelCase
    Open

                            if let _artwork = NSImage(data: information["kMRMediaRemoteNowPlayingInfoArtworkData"] as! Data) {

    constant-naming

    Global constants should follow either UpperCamelCase or lowerCamelCase naming conventions. Local constants should follow lowerCamelCase naming conventions.

    Preferred

    let MaxHeight = 42
    let maxHeight = 42

    Not Preferred

    let max_height = 42

    There are no issues that match your filters.

    Category
    Status