Fork me on GitHub

Alex Rupérez

Link: http://j.mp/2SNoAEz
Published: 11 Jan 16:18
I starred danger/swift at GitHub.
⚠️ Stop saying "you forgot to …" in code review in Swift
View on GitHub


View README



Formalize your Pull Request etiquette.

Write your Dangerfiles in Swift.

Requirements

Latest version requires Swift 4.2

  • If you are using Swift 4.1 use v0.4.1
  • If you are using Swift 4.0, Use v0.3.6

What it looks like today

You can make a Dangerfile that looks through PR metadata, it's fully typed.

import Danger

let danger = Danger()
let allSourceFiles = danger.git.modifiedFiles + danger.git.createdFiles

let changelogChanged = allSourceFiles.contains("CHANGELOG.md")
let sourceChanges = allSourceFiles.first(where: { $0.hasPrefix("Sources") })

if !changelogChanged && sourceChanges != nil {
  warn("No CHANGELOG entry added.")
}

// You can use these functions to send feedback:
message("Highlight something in the table")
warn("Something pretty bad, but not important enough to fail the build")
fail("Something that must be changed")

markdown("Free-form markdown that goes under the table, so you can do whatever.")

Using Danger Swift

All of the docs are on the user-facing website: https://danger.systems/swift/

Commands

  • danger-swift ci - Use this on CI
  • danger-swift pr https://github.com/Moya/Harvey/pull/23 - Use this to build your Dangerfile
  • danger-swift local - Use this to run danger against your local changes from master
  • danger-swift edit - Creates a temporary Xcode project for working on a Dangerfile

Plugins

Infrastructure exists to support plugins, which can help you avoid repeating the same Danger rules across separate repos.

e.g. A plugin implemented with the following at https://github.com/username/DangerPlugin.git.

// DangerPlugin.swift
import Danger

public struct DangerPlugin {
    let danger = Danger()
    public static func doYourThing() {
        // Code goes here
    }
}

Swift Package Manager (More performant)

You can use Swift PM to install both danger-swift and your plugins:

  • Add to your Package.swift:

    let package = Package(
        ...
        products: [
            ...
            .library(name: "DangerDeps[Product name (optional)]", type: .dynamic, targets: ["DangerDependencies"]), // dev
            ...
        ],
        dependencies: [
            ...
            .package(url: "https://github.com/danger/swift.git", from: "1.0.0"), // dev
            // Danger Plugins
            .package(url: "https://github.com/username/DangerPlugin.git", from: "0.1.0") // dev
            ...
        ],
        targets: [
            .target(name: "DangerDependencies", dependencies: ["Danger", "DangerPlugin"]), // dev
            ...
        ]
    )
  • Add the correct import to your Dangerfile.swift:

    import DangerPlugin
    
    DangerPlugin.doYourThing()
  • Create a folder called DangerDependencies in Sources with an empty file inside like Fake.swift

  • To run Danger use swift run danger-swift command

  • (Recommended) If you are using Swift PM to distribute your framework, use Rocket, or a similar tool, to comment out all the dev dependencies from your Package.swift. This prevents these dev dependencies from being downloaded and compiled with your framework by consumers.

  • (Recommended) cache the .build folder on your repo

Marathon (Easy to use)

By suffixing package: [url] to an import, you can directly import Swift PM package as a dependency

For example, a plugin could be used by the following.

// Dangerfile.swift

import DangerPlugin // package: https://github.com/username/DangerPlugin.git

DangerPlugin.doYourThing()

You can see an example danger-swift plugin.

(Recommended) Cache the ~/.danger-swift folder

Setup

For a Mac:

# Install danger-swift, and a bundled danger-js locally
brew install danger/tap/danger-swift
 # Run danger
danger-swift ci

For Linux:

# Install danger-swift
git clone https://github.com/danger/danger-swift.git
cd danger-swift
make install

# Install danger-js
npm install -g danger

 # Run danger
danger-swift ci

With Docker support ready for GitHub Actions.

Local compiled danger-js

To use a local compiled copy of danger-js use the danger-js-path argument:

danger-swift command --danger-js-path path/to/danger-js

Dev

You need to be using Xcode 10.

git clone https://github.com/danger/danger-swift.git
cd danger-swift
swift build
swift run komondor install
swift package generate-xcodeproj
open Danger.xcodeproj

Then I tend to run danger-swift using swift run:

swift run danger-swift pr https://github.com/danger/swift/pull/95

If you want to emulate how DangerJS's process will work entirely, then use:

swift build && cat Fixtures/eidolon_609.json | ./.build/debug/danger-swift

Deploying

Run swift run rocket $VERSION on master e.g. swift run rocket 1.0.0

Long-term

I, orta, only plan on bootstrapping this project, as I won't be using this in production. I'm happy to help support others who want to own this idea and really make it shine though! So if you're interested in helping out, make a few PRs and I'll give you org access.