Write your Dangerfiles in Swift 4+.
You can make a Dangerfile that looks through PR metadata, it's fully typed.
import 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.")
In your CI:
# Setup
npm install -g danger # Get DangerJS
brew install danger/tap/danger-swift # Install danger-swift locally
# Script
danger process danger-swift # Run Danger
brew install danger/tap/danger-swift
git clone https://github.com/danger/danger-swift.git
cd danger-swift
make install
- Add tests
- Add an API client for GitHub
- Improve error handling
- Write docs for end-users with examples
- Look into the
Class SwiftObject is implemented in both [x], [y]
runtime error, probably this
Setting up:
- Install Danger Swift:
brew install danger/tap/danger-swift
. - Edit the dangerfile:
danger-swift edit
.
This will make a Dangerfile.swift
for you., then pop up a temporary Xcode project set up for editing a Swift Dangerfile.
Infrastructure exists to support plugins, which can help you avoid repeating the same Danger rules across separate repos. By
suffixing package: [url]
to an import, you can directly import Swift PM package as a dependency(through Marathon), which is basically how plugins work.
For example, a plugin could be used by the following.
// Dangerfile.swift
import DangerPlugin // package: https://github.com/username/DangerPlugin.git
DangerPlugin.doYourThing()
And could be implemented with the following.
// DangerPlugin.swift
import Danger
public struct DangerPlugin {
static let danger = Danger()
public static func doYourThing() {
// Code goes here
}
}
This project takes its ideas from how the Swift Package Manager handles package manifests. You can get the long story here, but the TLDR is that there is a runner project which compiles and executes a runtime lib which exports its data out into JSON when the libs process is over.
So this project will export a lib libDanger
and a CLI tool danger-swift
which is the runner. danger-swift
handles turning the Danger DSL JSON message from DangerJS and passing that into the eval'd Dangerfile.swift
. When that process is finished it's expected that the Swift Danger
object would post the results into a place where they can easily be passed back to DangerJS.
You need to be using Xcode 9.
git clone https://github.com/danger/danger-swift.git
cd danger-swift
swift build
swift package generate-xcodeproj
open Danger.xcodeproj
Then I tend to run it by eval the Dangerfile with:
swift build && swiftc --driver-mode=swift -L .build/debug -I .build/debug -lDanger Dangerfile.swift fixtures/eidolon_609.json fixtures/response_data.json
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
- Update the CHANGELOG entry
- Edit the makefile with the version
- Commit the changes
- Create a git tag for the version
- Wait a second, run
make get_sha
to grab the SHA - Edit the brew formula with the new SHA/version
- Announce
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.