Skip to content

Instantly share code, notes, and snippets.

Jeff Johnston hishma

Block or report user

Report or block hishma

Hide content and notifications from this user.

Learn more about blocking users

Contact Support about this user’s behavior.

Learn more about reporting abuse

Report abuse
View GitHub Profile
@hishma
hishma / String+RFC3986.swift
Created Oct 23, 2019
Percent encode a URL String
View String+RFC3986.swift
import Foundation
extension String {
public func addingPercentEncodingForRFC3986() -> String? {
let unreserved = "-._~/?"
let allowed = NSMutableCharacterSet.alphanumeric()
allowed.addCharacters(in: unreserved)
return self.addingPercentEncoding(withAllowedCharacters: allowed as CharacterSet)
}
@hishma
hishma / VariantHandlingErrorMiddleware.swift
Last active Sep 15, 2019
Vapor 3 middleware to respond with errors based on the requested media type
View VariantHandlingErrorMiddleware.swift
import Vapor
import LeafErrorMiddleware
import APIErrorMiddleware
/// Respond with errors based on the requested media type
public final class VariantHandlingErrorMiddleware: Middleware, ServiceType {
public static func makeService(for container: Container) throws -> Self {
return self.init(environment: container.environment)
}
@hishma
hishma / measure.swift
Created Sep 3, 2019
Prints the time taken to execute a closure.
View measure.swift
/// Prints the time taken to execute a closure.
///
/// Note: Only for debugging purposes.
public func measure<T>(_ label: String = "", _ f: () throws -> (T)) rethrows -> T {
let startTime = Date()
let result = try f()
let endTime = Date().timeIntervalSince(startTime)
print("\(label): Time taken", endTime)
return result
}
@hishma
hishma / open-hidden-files-on-macos.md
Last active Aug 30, 2019
Open hidden files on Mac OS
View open-hidden-files-on-macos.md

When the open panel is showing, press Command-Shift-. and the hidden files will appear.

View dateEncodingStrategy.md

TL;DR

If you are using the iso8601 strategy, you may not want to rely on the default Equatable implementation for Date (==) when comparing dates. You can use a good old fashion calendar comparison instead.

Strategies

JSONEncoder and JSONDecoder can both be configured with a strategy (dateEncodingStrategy and dateDecodingStrategy) for encoding and decoding dates. There are four named types in addition to allowing you to provide custom options.

| Strategy | Comment |

View XCTestCase+Error.swift
import XCTest
extension XCTestCase {
/// Asserts that an expression throws a specific error.
///
/// - Parameters:
/// - expression: An expression that can throw an error.
/// - throws: The expected `Error`. Must conform to the `Equatable` protocol.
/// - file: The file in which failure occurred. Defaults to the file name of the test case in which this function was called.
/// - line: The line number on which failure occurred. Defaults to the line number on which this function was called.
View CoreDataErrors.h
/*
CoreDataErrors.h
Core Data
Copyright (c) 2004-2012 Apple Inc.
All rights reserved.
*/
#import <Foundation/NSObject.h>
/* NSError codes for Core Data added errors in NSCocoaErrorDomain. Foundation error codes can be found in <Foundation/FoundationErrors.h>. AppKit error codes can be found in <AppKit/AppKitErrors.h>.
@hishma
hishma / measure.swift
Last active Apr 5, 2019
Time a function in swift
View measure.swift
@discardableResult
static func measure<T>(name: String = "", _ block: () -> T) -> T {
let startTime = CFAbsoluteTimeGetCurrent()
let result = block()
let timeElapsed = CFAbsoluteTimeGetCurrent() - startTime
print("Time: \(name) - \(timeElapsed)")
return result
}
@hishma
hishma / updateBuildNumber.sh
Last active Apr 2, 2019
Shell script to update the build number (CFBundleVersion) of the info.plist in the build folder.
View updateBuildNumber.sh
# Shamelessly ripped of from https://blog.curtisherbert.com/automated-xcode-build-numbers-early-2019-edition/
#
git=`sh /etc/profile; which git`
bundleVersion=`"$git" rev-list --all | wc -l | tr -d '[:space:]'`
/usr/libexec/PlistBuddy -c "Set :CFBundleVersion $bundleVersion" "${TARGET_BUILD_DIR}/${INFOPLIST_PATH}"
echo "☛ BUILD NUMBER: ${bundleVersion}"
View AsynchronousOperation.swift
public class AsynchronousOperation: Operation {
@objc private enum State: Int {
case ready, executing, finished
}
private var _state = State.ready
private let stateQueue = DispatchQueue(label: Bundle.main.bundleIdentifier! + ".op.state", attributes: .concurrent)
@objc private dynamic var state: State {
get { return stateQueue.sync { _state } }
You can’t perform that action at this time.