Skip to content

Commit

Permalink
Add Swift Package Manager support.
Browse files Browse the repository at this point in the history
  • Loading branch information
jkolb committed Sep 17, 2016
1 parent 8c4d7eb commit a62daa7
Show file tree
Hide file tree
Showing 18 changed files with 107 additions and 56 deletions.
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -1,2 +1,3 @@
.DS_Store
xcuserdata
.build/
119 changes: 67 additions & 52 deletions FranticApparatus.xcodeproj/project.pbxproj
Original file line number Diff line number Diff line change
Expand Up @@ -7,20 +7,21 @@
objects = {

/* Begin PBXBuildFile section */
E54661CA19CDE777007488CA /* Promise.swift in Sources */ = {isa = PBXBuildFile; fileRef = E54661C919CDE777007488CA /* Promise.swift */; };
E55CA21719C676DC00E66980 /* FranticApparatus.h in Headers */ = {isa = PBXBuildFile; fileRef = E55CA21619C676DC00E66980 /* FranticApparatus.h */; settings = {ATTRIBUTES = (Public, ); }; };
E55CA21D19C676DC00E66980 /* FranticApparatus.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E55CA21119C676DC00E66980 /* FranticApparatus.framework */; };
E55CA22419C676DC00E66980 /* PromiseTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = E55CA22319C676DC00E66980 /* PromiseTests.swift */; };
E5D7DF011D865C02008F6B72 /* PromiseMaker.swift in Sources */ = {isa = PBXBuildFile; fileRef = E5D7DF001D865C02008F6B72 /* PromiseMaker.swift */; };
E5DDB9971CDE4A2E0058FADE /* Dispatcher.swift in Sources */ = {isa = PBXBuildFile; fileRef = E5DDB9961CDE4A2E0058FADE /* Dispatcher.swift */; };
E5DDB9A31CDFDE1E0058FADE /* PromiseError.swift in Sources */ = {isa = PBXBuildFile; fileRef = E5DDB9A21CDFDE1E0058FADE /* PromiseError.swift */; };
E5DDB9A51CDFDE4A0058FADE /* Result.swift in Sources */ = {isa = PBXBuildFile; fileRef = E5DDB9A41CDFDE4A0058FADE /* Result.swift */; };
E5DDB9AA1CDFE1E80058FADE /* Lock.swift in Sources */ = {isa = PBXBuildFile; fileRef = E5DDB9A71CDFE1E80058FADE /* Lock.swift */; };
E5DDB9AB1CDFE1E80058FADE /* Deferred.swift in Sources */ = {isa = PBXBuildFile; fileRef = E5DDB9A81CDFE1E80058FADE /* Deferred.swift */; };
E5DDB9AC1CDFE1E80058FADE /* State.swift in Sources */ = {isa = PBXBuildFile; fileRef = E5DDB9A91CDFE1E80058FADE /* State.swift */; };
E5DDB9AE1CDFED430058FADE /* GCDDispatcher.swift in Sources */ = {isa = PBXBuildFile; fileRef = E5DDB9AD1CDFED430058FADE /* GCDDispatcher.swift */; };
E5DDB9B01CDFEDE40058FADE /* OperationDispatcher.swift in Sources */ = {isa = PBXBuildFile; fileRef = E5DDB9AF1CDFEDE40058FADE /* OperationDispatcher.swift */; };
E5EA67A21D85BF69001ABD1D /* Thenable.swift in Sources */ = {isa = PBXBuildFile; fileRef = E5608B8F1CE76D380040E140 /* Thenable.swift */; };
E57F6CE41D8DDA49006807C4 /* Deferred.swift in Sources */ = {isa = PBXBuildFile; fileRef = E57F6CD81D8DDA49006807C4 /* Deferred.swift */; };
E57F6CE51D8DDA49006807C4 /* Dispatcher.swift in Sources */ = {isa = PBXBuildFile; fileRef = E57F6CD91D8DDA49006807C4 /* Dispatcher.swift */; };
E57F6CE61D8DDA49006807C4 /* FranticApparatus.swift in Sources */ = {isa = PBXBuildFile; fileRef = E57F6CDA1D8DDA49006807C4 /* FranticApparatus.swift */; };
E57F6CE71D8DDA49006807C4 /* GCDDispatcher.swift in Sources */ = {isa = PBXBuildFile; fileRef = E57F6CDB1D8DDA49006807C4 /* GCDDispatcher.swift */; };
E57F6CE81D8DDA49006807C4 /* Lock.swift in Sources */ = {isa = PBXBuildFile; fileRef = E57F6CDC1D8DDA49006807C4 /* Lock.swift */; };
E57F6CE91D8DDA49006807C4 /* OperationDispatcher.swift in Sources */ = {isa = PBXBuildFile; fileRef = E57F6CDD1D8DDA49006807C4 /* OperationDispatcher.swift */; };
E57F6CEA1D8DDA49006807C4 /* Promise.swift in Sources */ = {isa = PBXBuildFile; fileRef = E57F6CDE1D8DDA49006807C4 /* Promise.swift */; };
E57F6CEB1D8DDA49006807C4 /* PromiseError.swift in Sources */ = {isa = PBXBuildFile; fileRef = E57F6CDF1D8DDA49006807C4 /* PromiseError.swift */; };
E57F6CEC1D8DDA49006807C4 /* PromiseMaker.swift in Sources */ = {isa = PBXBuildFile; fileRef = E57F6CE01D8DDA49006807C4 /* PromiseMaker.swift */; };
E57F6CED1D8DDA49006807C4 /* Result.swift in Sources */ = {isa = PBXBuildFile; fileRef = E57F6CE11D8DDA49006807C4 /* Result.swift */; };
E57F6CEE1D8DDA49006807C4 /* State.swift in Sources */ = {isa = PBXBuildFile; fileRef = E57F6CE21D8DDA49006807C4 /* State.swift */; };
E57F6CEF1D8DDA49006807C4 /* Thenable.swift in Sources */ = {isa = PBXBuildFile; fileRef = E57F6CE31D8DDA49006807C4 /* Thenable.swift */; };
E57F6CF21D8DDA68006807C4 /* PromiseTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = E57F6CF11D8DDA68006807C4 /* PromiseTests.swift */; };
/* End PBXBuildFile section */

/* Begin PBXContainerItemProxy section */
Expand All @@ -34,25 +35,26 @@
/* End PBXContainerItemProxy section */

/* Begin PBXFileReference section */
E54661C919CDE777007488CA /* Promise.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Promise.swift; sourceTree = "<group>"; };
E55CA21119C676DC00E66980 /* FranticApparatus.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = FranticApparatus.framework; sourceTree = BUILT_PRODUCTS_DIR; };
E55CA21519C676DC00E66980 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
E55CA21619C676DC00E66980 /* FranticApparatus.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = FranticApparatus.h; sourceTree = "<group>"; };
E55CA21C19C676DC00E66980 /* FranticApparatusTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = FranticApparatusTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; };
E55CA22219C676DC00E66980 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
E55CA22319C676DC00E66980 /* PromiseTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PromiseTests.swift; sourceTree = "<group>"; };
E5608B8F1CE76D380040E140 /* Thenable.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Thenable.swift; sourceTree = "<group>"; };
E57F6CD81D8DDA49006807C4 /* Deferred.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Deferred.swift; sourceTree = "<group>"; };
E57F6CD91D8DDA49006807C4 /* Dispatcher.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Dispatcher.swift; sourceTree = "<group>"; };
E57F6CDA1D8DDA49006807C4 /* FranticApparatus.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = FranticApparatus.swift; sourceTree = "<group>"; };
E57F6CDB1D8DDA49006807C4 /* GCDDispatcher.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = GCDDispatcher.swift; sourceTree = "<group>"; };
E57F6CDC1D8DDA49006807C4 /* Lock.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Lock.swift; sourceTree = "<group>"; };
E57F6CDD1D8DDA49006807C4 /* OperationDispatcher.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = OperationDispatcher.swift; sourceTree = "<group>"; };
E57F6CDE1D8DDA49006807C4 /* Promise.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Promise.swift; sourceTree = "<group>"; };
E57F6CDF1D8DDA49006807C4 /* PromiseError.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PromiseError.swift; sourceTree = "<group>"; };
E57F6CE01D8DDA49006807C4 /* PromiseMaker.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PromiseMaker.swift; sourceTree = "<group>"; };
E57F6CE11D8DDA49006807C4 /* Result.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Result.swift; sourceTree = "<group>"; };
E57F6CE21D8DDA49006807C4 /* State.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = State.swift; sourceTree = "<group>"; };
E57F6CE31D8DDA49006807C4 /* Thenable.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Thenable.swift; sourceTree = "<group>"; };
E57F6CF11D8DDA68006807C4 /* PromiseTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PromiseTests.swift; sourceTree = "<group>"; };
E5C64A9B1C35E1DA00A3402D /* LICENSE */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = LICENSE; sourceTree = SOURCE_ROOT; };
E5C64A9C1C35E1DA00A3402D /* README.md */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = net.daringfireball.markdown; path = README.md; sourceTree = SOURCE_ROOT; };
E5D7DF001D865C02008F6B72 /* PromiseMaker.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PromiseMaker.swift; sourceTree = "<group>"; };
E5DDB9961CDE4A2E0058FADE /* Dispatcher.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Dispatcher.swift; sourceTree = "<group>"; };
E5DDB9A21CDFDE1E0058FADE /* PromiseError.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PromiseError.swift; sourceTree = "<group>"; };
E5DDB9A41CDFDE4A0058FADE /* Result.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Result.swift; sourceTree = "<group>"; };
E5DDB9A71CDFE1E80058FADE /* Lock.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Lock.swift; sourceTree = "<group>"; };
E5DDB9A81CDFE1E80058FADE /* Deferred.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Deferred.swift; sourceTree = "<group>"; };
E5DDB9A91CDFE1E80058FADE /* State.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = State.swift; sourceTree = "<group>"; };
E5DDB9AD1CDFED430058FADE /* GCDDispatcher.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = GCDDispatcher.swift; sourceTree = "<group>"; };
E5DDB9AF1CDFEDE40058FADE /* OperationDispatcher.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = OperationDispatcher.swift; sourceTree = "<group>"; };
/* End PBXFileReference section */

/* Begin PBXFrameworksBuildPhase section */
Expand Down Expand Up @@ -95,19 +97,11 @@
E55CA21319C676DC00E66980 /* FranticApparatus */ = {
isa = PBXGroup;
children = (
E5DDB9A61CDFE1E80058FADE /* Internal */,
E57F6CD71D8DDA49006807C4 /* Sources */,
E5C64A9C1C35E1DA00A3402D /* README.md */,
E5C64A9B1C35E1DA00A3402D /* LICENSE */,
E55CA21619C676DC00E66980 /* FranticApparatus.h */,
E5DDB9961CDE4A2E0058FADE /* Dispatcher.swift */,
E54661C919CDE777007488CA /* Promise.swift */,
E55CA21419C676DC00E66980 /* Supporting Files */,
E5DDB9A21CDFDE1E0058FADE /* PromiseError.swift */,
E5DDB9A41CDFDE4A0058FADE /* Result.swift */,
E5DDB9AD1CDFED430058FADE /* GCDDispatcher.swift */,
E5DDB9AF1CDFEDE40058FADE /* OperationDispatcher.swift */,
E5608B8F1CE76D380040E140 /* Thenable.swift */,
E5D7DF001D865C02008F6B72 /* PromiseMaker.swift */,
);
path = FranticApparatus;
sourceTree = "<group>";
Expand All @@ -123,7 +117,7 @@
E55CA22019C676DC00E66980 /* FranticApparatusTests */ = {
isa = PBXGroup;
children = (
E55CA22319C676DC00E66980 /* PromiseTests.swift */,
E57F6CF01D8DDA68006807C4 /* FranticApparatusTests */,
E55CA22119C676DC00E66980 /* Supporting Files */,
);
path = FranticApparatusTests;
Expand All @@ -137,15 +131,33 @@
name = "Supporting Files";
sourceTree = "<group>";
};
E5DDB9A61CDFE1E80058FADE /* Internal */ = {
E57F6CD71D8DDA49006807C4 /* Sources */ = {
isa = PBXGroup;
children = (
E5DDB9A71CDFE1E80058FADE /* Lock.swift */,
E5DDB9A81CDFE1E80058FADE /* Deferred.swift */,
E5DDB9A91CDFE1E80058FADE /* State.swift */,
E57F6CD81D8DDA49006807C4 /* Deferred.swift */,
E57F6CD91D8DDA49006807C4 /* Dispatcher.swift */,
E57F6CDA1D8DDA49006807C4 /* FranticApparatus.swift */,
E57F6CDB1D8DDA49006807C4 /* GCDDispatcher.swift */,
E57F6CDC1D8DDA49006807C4 /* Lock.swift */,
E57F6CDD1D8DDA49006807C4 /* OperationDispatcher.swift */,
E57F6CDE1D8DDA49006807C4 /* Promise.swift */,
E57F6CDF1D8DDA49006807C4 /* PromiseError.swift */,
E57F6CE01D8DDA49006807C4 /* PromiseMaker.swift */,
E57F6CE11D8DDA49006807C4 /* Result.swift */,
E57F6CE21D8DDA49006807C4 /* State.swift */,
E57F6CE31D8DDA49006807C4 /* Thenable.swift */,
);
path = Internal;
sourceTree = "<group>";
path = Sources;
sourceTree = SOURCE_ROOT;
};
E57F6CF01D8DDA68006807C4 /* FranticApparatusTests */ = {
isa = PBXGroup;
children = (
E57F6CF11D8DDA68006807C4 /* PromiseTests.swift */,
);
name = FranticApparatusTests;
path = Tests/FranticApparatusTests;
sourceTree = SOURCE_ROOT;
};
/* End PBXGroup section */

Expand Down Expand Up @@ -257,25 +269,26 @@
isa = PBXSourcesBuildPhase;
buildActionMask = 2147483647;
files = (
E54661CA19CDE777007488CA /* Promise.swift in Sources */,
E5EA67A21D85BF69001ABD1D /* Thenable.swift in Sources */,
E5DDB9A31CDFDE1E0058FADE /* PromiseError.swift in Sources */,
E5DDB9971CDE4A2E0058FADE /* Dispatcher.swift in Sources */,
E5DDB9AB1CDFE1E80058FADE /* Deferred.swift in Sources */,
E5DDB9AA1CDFE1E80058FADE /* Lock.swift in Sources */,
E5DDB9B01CDFEDE40058FADE /* OperationDispatcher.swift in Sources */,
E5DDB9A51CDFDE4A0058FADE /* Result.swift in Sources */,
E5D7DF011D865C02008F6B72 /* PromiseMaker.swift in Sources */,
E5DDB9AC1CDFE1E80058FADE /* State.swift in Sources */,
E5DDB9AE1CDFED430058FADE /* GCDDispatcher.swift in Sources */,
E57F6CEF1D8DDA49006807C4 /* Thenable.swift in Sources */,
E57F6CE61D8DDA49006807C4 /* FranticApparatus.swift in Sources */,
E57F6CE81D8DDA49006807C4 /* Lock.swift in Sources */,
E57F6CEA1D8DDA49006807C4 /* Promise.swift in Sources */,
E57F6CEE1D8DDA49006807C4 /* State.swift in Sources */,
E57F6CE91D8DDA49006807C4 /* OperationDispatcher.swift in Sources */,
E57F6CE51D8DDA49006807C4 /* Dispatcher.swift in Sources */,
E57F6CE41D8DDA49006807C4 /* Deferred.swift in Sources */,
E57F6CED1D8DDA49006807C4 /* Result.swift in Sources */,
E57F6CEB1D8DDA49006807C4 /* PromiseError.swift in Sources */,
E57F6CE71D8DDA49006807C4 /* GCDDispatcher.swift in Sources */,
E57F6CEC1D8DDA49006807C4 /* PromiseMaker.swift in Sources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
E55CA21819C676DC00E66980 /* Sources */ = {
isa = PBXSourcesBuildPhase;
buildActionMask = 2147483647;
files = (
E55CA22419C676DC00E66980 /* PromiseTests.swift in Sources */,
E57F6CF21D8DDA68006807C4 /* PromiseTests.swift in Sources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
Expand Down Expand Up @@ -425,6 +438,7 @@
E55CA22B19C676DC00E66980 /* Debug */ = {
isa = XCBuildConfiguration;
buildSettings = {
ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES;
GCC_PREPROCESSOR_DEFINITIONS = (
"DEBUG=1",
"$(inherited)",
Expand All @@ -440,6 +454,7 @@
E55CA22C19C676DC00E66980 /* Release */ = {
isa = XCBuildConfiguration;
buildSettings = {
ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES;
INFOPLIST_FILE = FranticApparatusTests/Info.plist;
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks";
PRODUCT_BUNDLE_IDENTIFIER = "com.franticapparatus.$(PRODUCT_NAME:rfc1034identifier)";
Expand Down
5 changes: 5 additions & 0 deletions Package.swift
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
import PackageDescription

let package = Package(
name: "FranticApparatus"
)
28 changes: 24 additions & 4 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,12 +1,32 @@
# FranticApparatus 5.0.0
# FranticApparatus 6.0.0
[![Carthage compatible](https://img.shields.io/badge/Carthage-compatible-4BC51D.svg?style=flat)](https://github.com/Carthage/Carthage)

#### A thread safe, type safe, and memory safe [Promises/A+](https://promisesaplus.com) implementation for Swift 2.2
#### A thread safe, type safe, and memory safe [Promises/A+](https://promisesaplus.com) implementation for Swift 3

[![Carthage compatible](https://img.shields.io/badge/Carthage-compatible-4BC51D.svg?style=flat)](https://github.com/Carthage/Carthage)
Promises provide a way to make it easier to read and write chains of dependent asynchronous code. Here is a simple example of how much better asynchronous code looks using FranticApparatus:

let url = NSURL(string: "http://example.com/image.png")!

self.promise = PromiseMaker.makeUsing(context: self) { (makePromise) in
makePromise { (context) in
context.showActivityIndicator()
return context.fetchImage(url: url)
}.whenFulfilled { (context, image) in
context.showImage(image)
}.whenRejected { (context, reason) in
context.showPlaceholderImage()
}.whenComplete { (context) in
context.hideActivityIndicator()
context.promise = nil
}
}

See the Demo for examples of how to make promises to fetch a set of images over the network using promises and display them in a `UICollectionView`.

## Changes for 6.0.0

* Syntax updated for Swift 3.
* Initial Swift Package Manager support.
* Replaced `PromiseDispatchContext` with `PromiseMaker`.
* Renamed all of the promise helper methods. This was done partly to appease the Swift compiler and partly to make creating promises easier to read.
* Updated the demo to load multiple images into a collection view using promises.
Expand Down Expand Up @@ -156,7 +176,7 @@ And again how it would be used:
}
}

Note the missing rightward drift of the nested callbacks and also the small amount of error handling code. Also as a convenience to aid in thread safety PromiseMaker takes a context parameter, turns it into a weak reference, and then when the blocks are executed a strong reference is passed into them as the first paramter. If the context reference becomes nil the body of the closure will not execute preventing a common source of bugs. Additionally this saves you from writing extra boiler plate memory management code in all of your closures.
Note the missing rightward drift of the nested callbacks and also the small amount of error handling code. Also as a convenience to aid in thread safety `PromiseMaker` takes a context parameter, turns it into a weak reference, and then when the blocks are executed a strong reference is passed into them as the first paramter. If the context reference becomes nil the body of the closure will not execute preventing a common source of bugs. Additionally this saves you from writing extra boiler plate memory management code in all of your closures.

## What is going on here?

Expand Down
File renamed without changes.
File renamed without changes.
4 changes: 4 additions & 0 deletions Sources/FranticApparatus.swift
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
struct FranticApparatus {

var text = "Hello, World!"
}
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
6 changes: 6 additions & 0 deletions Tests/LinuxMain.swift
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
import XCTest
@testable import FranticApparatusTests

XCTMain([
testCase(FranticApparatusTests.allTests),
])

0 comments on commit a62daa7

Please sign in to comment.