Skip to content

Commit

Permalink
Rethinkig gateways:
Browse files Browse the repository at this point in the history
  • Loading branch information
Ivan Rep committed Aug 24, 2016
1 parent d36eff4 commit eaa7f47
Show file tree
Hide file tree
Showing 32 changed files with 1,029 additions and 1,060 deletions.
5 changes: 2 additions & 3 deletions Podfile
Original file line number Diff line number Diff line change
Expand Up @@ -8,9 +8,8 @@ target 'TransparentDataAccess' do
pod 'Alamofire', '~> 3.4'
pod 'Unbox'
pod 'RxSwift', '~> 2.0'
pod 'Moya'
pod 'Moya/RxSwift'
pod 'KeychainAccess'
pod 'RxAlamofire'
pod 'Simple-KeychainSwift'

target 'TransparentDataAccessTests' do
inherit! :search_paths
Expand Down
28 changes: 11 additions & 17 deletions Podfile.lock
Original file line number Diff line number Diff line change
@@ -1,40 +1,34 @@
PODS:
- Alamofire (3.4.1)
- KeychainAccess (2.3.6)
- Moya (7.0.0):
- Moya/Core (= 7.0.0)
- Moya/Core (7.0.0):
- Alamofire (~> 3.0)
- Result (~> 2.0)
- Moya/RxSwift (7.0.0):
- Moya/Core
- RxSwift (~> 2.0)
- Nimble (4.1.0)
- Quick (0.9.3)
- Result (2.1.3)
- RxAlamofire (2.5):
- RxAlamofire/Core (= 2.5)
- RxAlamofire/Core (2.5):
- Alamofire (~> 3.4)
- RxSwift (~> 2.5)
- RxSwift (2.6.0)
- Simple-KeychainSwift (1.1.6)
- Unbox (1.9)

DEPENDENCIES:
- Alamofire (~> 3.4)
- KeychainAccess
- Moya
- Moya/RxSwift
- Nimble
- Quick
- RxAlamofire
- RxSwift (~> 2.0)
- Simple-KeychainSwift
- Unbox

SPEC CHECKSUMS:
Alamofire: 01a82e2f6c0f860ade35534c8dd88be61bdef40c
KeychainAccess: 7f10e2ef998ddf954a64d5d608be08677774684d
Moya: f004b82418fb8165ee1fc9f86190db4b3611fda9
Nimble: 97a0a4cae5124c117115634b2d055d8c97d0af19
Quick: 13a2a2b19a5d8e3ed4fd0c36ee46597fd77ebf71
Result: 18e1a7597fbcca5923c565b40a25a98afafdee02
RxAlamofire: b4572a077b6b2410c8732a27266299df4c00736e
RxSwift: 77f3a0b15324baa7a1c9bfa9f199648a82424e26
Simple-KeychainSwift: 44af418ebc152af23c24880dddad9c742a83bec3
Unbox: a6f56a1682b5fd2ba6aea96d7b1ec17599db4f05

PODFILE CHECKSUM: 98f335c7a71ce4996b0b05d095c3680fa2e6dee4
PODFILE CHECKSUM: 2ae5b2e070693d1c5f33f1af776dc4fbe9baa032

COCOAPODS: 1.0.1
84 changes: 36 additions & 48 deletions TransparentDataAccess.xcodeproj/project.pbxproj

Large diffs are not rendered by default.

Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
{
"DVTSourceControlWorkspaceBlueprintPrimaryRemoteRepositoryKey" : "7B1022AC8DCBB9FC8C9CEB942D13A9C1584F4E55",
"DVTSourceControlWorkspaceBlueprintWorkingCopyRepositoryLocationsKey" : {

},
"DVTSourceControlWorkspaceBlueprintWorkingCopyStatesKey" : {
"7B1022AC8DCBB9FC8C9CEB942D13A9C1584F4E55" : 0,
"86F222E2E78505FCC1BDEB295F537874DCDE294B" : 0
},
"DVTSourceControlWorkspaceBlueprintIdentifierKey" : "D867FCB2-47F1-48FF-9E7C-BA09004736B8",
"DVTSourceControlWorkspaceBlueprintWorkingCopyPathsKey" : {
"7B1022AC8DCBB9FC8C9CEB942D13A9C1584F4E55" : "TransparentDataAccess\/",
"86F222E2E78505FCC1BDEB295F537874DCDE294B" : "EducationalProject\/"
},
"DVTSourceControlWorkspaceBlueprintNameKey" : "TransparentDataAccess",
"DVTSourceControlWorkspaceBlueprintVersion" : 204,
"DVTSourceControlWorkspaceBlueprintRelativePathToProjectKey" : "TransparentDataAccess.xcworkspace",
"DVTSourceControlWorkspaceBlueprintRemoteRepositoriesKey" : [
{
"DVTSourceControlWorkspaceBlueprintRemoteRepositoryURLKey" : "https:\/\/github.com\/Rep2\/TransparentDataAccess.git",
"DVTSourceControlWorkspaceBlueprintRemoteRepositorySystemKey" : "com.apple.dt.Xcode.sourcecontrol.Git",
"DVTSourceControlWorkspaceBlueprintRemoteRepositoryIdentifierKey" : "7B1022AC8DCBB9FC8C9CEB942D13A9C1584F4E55"
},
{
"DVTSourceControlWorkspaceBlueprintRemoteRepositoryURLKey" : "gitlab.trikoder.net:ivan.rep\/EducationalProject.git",
"DVTSourceControlWorkspaceBlueprintRemoteRepositorySystemKey" : "com.apple.dt.Xcode.sourcecontrol.Git",
"DVTSourceControlWorkspaceBlueprintRemoteRepositoryIdentifierKey" : "86F222E2E78505FCC1BDEB295F537874DCDE294B"
}
]
}
Binary file not shown.
Original file line number Diff line number Diff line change
Expand Up @@ -435,5 +435,37 @@
landmarkType = "5">
</BreakpointContent>
</BreakpointProxy>
<BreakpointProxy
BreakpointExtensionID = "Xcode.Breakpoint.FileBreakpoint">
<BreakpointContent
shouldBeEnabled = "No"
ignoreCount = "0"
continueAfterRunningActions = "No"
filePath = "TransparentDataAccess/TransparentDataAccess/Gateways/WebGateway.swift"
timestampString = "493649774.008191"
startingColumnNumber = "9223372036854775807"
endingColumnNumber = "9223372036854775807"
startingLineNumber = "15"
endingLineNumber = "15"
landmarkName = "getResource(_:)"
landmarkType = "5">
</BreakpointContent>
</BreakpointProxy>
<BreakpointProxy
BreakpointExtensionID = "Xcode.Breakpoint.FileBreakpoint">
<BreakpointContent
shouldBeEnabled = "No"
ignoreCount = "0"
continueAfterRunningActions = "No"
filePath = "TransparentDataAccessTests/GatewayTests/WebGatewayTest.swift"
timestampString = "493650165.903977"
startingColumnNumber = "9223372036854775807"
endingColumnNumber = "9223372036854775807"
startingLineNumber = "37"
endingLineNumber = "37"
landmarkName = "test_UserProfile_NoUserError()"
landmarkType = "5">
</BreakpointContent>
</BreakpointProxy>
</Breakpoints>
</Bucket>
41 changes: 17 additions & 24 deletions TransparentDataAccess/Model/GitHubTarget.swift
Original file line number Diff line number Diff line change
@@ -1,45 +1,38 @@
//
// GitHubTarget.swift
// TransparentDataAccess
//
// Created by Undabot Rep on 02/08/16.
// Copyright © 2016 Undabot. All rights reserved.
//

import RxSwift
import Moya
import Unbox
import Alamofire

public enum GitHub {
case UserProfile(String)
}

extension GitHub: TargetType, StorableType {
public var baseURL: NSURL { return NSURL(string: "https://api.github.com")! }
extension GitHub: WebTarget, StorableTarget {
static let baseURLString = "https://api.github.com"
static var OAuthToken: String?

public var path: String {
switch self {
case .UserProfile(let name):
return "/users/\(name.URLEscapedString)"
}
}
public var method: Moya.Method {

public var method: Alamofire.Method {
return .GET
}
public var parameters: [String: AnyObject]? {
switch self {
case .UserProfile:
return nil
}
}
public var multipartBody: [MultipartFormData]?{
return nil
}
public var sampleData: NSData {

public var URLRequest: NSMutableURLRequest {
print("reqeust")
let URL = NSURL(string: GitHub.baseURLString)!
let mutableURLRequest = NSMutableURLRequest(URL: URL.URLByAppendingPathComponent(path))
mutableURLRequest.HTTPMethod = method.rawValue

switch self {
case .UserProfile(let name):
return "{\"login\": \"\(name)\", \"id\": 100}".dataUsingEncoding(NSUTF8StringEncoding)!
case .UserProfile(_):
return Alamofire.ParameterEncoding.URL.encode(mutableURLRequest, parameters: nil).0
}
}

var key: String {
switch self {
case .UserProfile(let name):
Expand Down
14 changes: 2 additions & 12 deletions TransparentDataAccess/Model/ResourceTypeExample.swift
Original file line number Diff line number Diff line change
@@ -1,19 +1,9 @@
//
// ResourceTypeExample.swift
// TransparentDataAccess
//
// Created by Undabot Rep on 02/08/16.
// Copyright © 2016 Undabot. All rights reserved.
//

import Foundation

enum ResourceTypeExample{
enum ResourceTargetExample{
case EmptyTarget
case Token(key: String, secret: String)
}

extension ResourceTypeExample: StorableType{
extension ResourceTargetExample: StorableTarget{
var key: String{
switch self {
case .EmptyTarget:
Expand Down
11 changes: 0 additions & 11 deletions TransparentDataAccess/MoyaExtension.swift

This file was deleted.

24 changes: 12 additions & 12 deletions TransparentDataAccess/TestGateways/MockGetSetGateway.swift
Original file line number Diff line number Diff line change
@@ -1,12 +1,12 @@
import RxSwift

class MockGetSetGateway<R, T: StorableType>: GetSetGateway<R, T> {

override func getResource(resourceType: T, forceRefresh: Bool) -> Observable<R> {
return Observable.empty()
}

override func setResource(resourceType: T, resource: R) {
}

}
//import RxSwift
//
//class MockGetSetGateway<R, T: StorableType>: GetSetGateway<R, T> {
//
// override func getResource(resourceType: T, forceRefresh: Bool) -> Observable<R> {
// return Observable.empty()
// }
//
// override func setResource(resourceType: T, resource: R) {
// }
//
//}
37 changes: 18 additions & 19 deletions TransparentDataAccess/TestGateways/TracksInFlight.swift
Original file line number Diff line number Diff line change
@@ -1,20 +1,19 @@
import RxSwift
import Moya

class TracksInFlightGetGateway<R, T where T:TargetType, T:StorableType>: GetGateway<R, T> {

let gateway: GetGateway<R, T>

var numberOfGetRequests: Int = 0

init(gateway: GetGateway<R, T>) {
self.gateway = gateway
}

override func getResource(resourceType: T, forceRefresh: Bool) -> Observable<R> {
numberOfGetRequests += 1

return gateway.getResource(resourceType, forceRefresh: forceRefresh)
}

}
//
//class TracksInFlightGetGateway<R, T where T:TargetType, T:StorableType>: GetGateway<R, T> {
//
// let gateway: GetGateway<R, T>
//
// var numberOfGetRequests: Int = 0
//
// init(gateway: GetGateway<R, T>) {
// self.gateway = gateway
// }
//
// override func getResource(resourceType: T, forceRefresh: Bool) -> Observable<R> {
// numberOfGetRequests += 1
//
// return gateway.getResource(resourceType, forceRefresh: forceRefresh)
// }
//
//}
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@ enum GatewayError: ErrorType {
case .CodingFailed:
return "Resource coding failed"
}

}
}

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,58 @@
import RxSwift

struct CodingGateway {

func getResource<Resource, Target: StorableTarget>(resourceTarget: Target, forceRefresh: Bool = false) -> Observable<Resource> {

return Observable.create({ (observer) -> Disposable in
if let data = NSUserDefaults.standardUserDefaults().objectForKey(resourceTarget.key) as? NSData {
if let resource = NSKeyedUnarchiver.unarchiveObjectWithData(data) as? Resource {
observer.onNext(resource)
observer.onCompleted()
} else {
observer.onError(GatewayError.CodingFailed)
}
} else {
observer.onError(GatewayError.NoDataFor(key: resourceTarget.key))
}

return NopDisposable.instance
})
.observeOn(ConcurrentDispatchQueueScheduler(queue: dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0)))
}

func setResource<R: NSCoding, T: StorableTarget>(resourceType: T, resource: R) {
let data = NSKeyedArchiver.archivedDataWithRootObject(resource)
NSUserDefaults.standardUserDefaults().setObject(data, forKey: resourceType.key)
}
}


struct CodingGatewayWithCaching<Resource: NSCoding> {

var localGateway: LocalGateway<Resource>
let codingGateway: CodingGateway

init(localGateway: LocalGateway<Resource>, codingGateway: CodingGateway) {
self.localGateway = localGateway
self.codingGateway = codingGateway
}

mutating func getResource<Target: StorableTarget>(resourceTarget: Target) -> Observable<Resource> {
return Observable
.of(
localGateway.getResource(resourceTarget)
.catchError { error in
return .empty()
},
codingGateway.getResource(resourceTarget)
.doOnNext { self.localGateway.setResource(resourceTarget, resource: $0) }
)
.merge()
.take(1)
}

func setResource<Target: StorableTarget>(resourceType: Target, resource: Resource) {
codingGateway.setResource(resourceType, resource: resource)
}
}

This file was deleted.

Loading

0 comments on commit eaa7f47

Please sign in to comment.