Showing preview only (4,263K chars total). Download the full file or copy to clipboard to get everything.
Repository: brewfactory/BrewMobile
Branch: master
Commit: 0b8e359d7866
Files: 926
Total size: 3.8 MB
Directory structure:
gitextract_trattway/
├── .gitignore
├── BrewMobile/
│ ├── AppDelegate.swift
│ ├── BrewManager.swift
│ ├── ContentParser.swift
│ ├── Images.xcassets/
│ │ ├── AppIcon.appiconset/
│ │ │ └── Contents.json
│ │ ├── DesignerIcon.imageset/
│ │ │ └── Contents.json
│ │ ├── HopIcon.imageset/
│ │ │ └── Contents.json
│ │ └── LaunchImage.launchimage/
│ │ └── Contents.json
│ ├── Info.plist
│ ├── Model/
│ │ ├── BrewPhase.swift
│ │ └── BrewState.swift
│ ├── RACUtils/
│ │ └── RAC.swift
│ ├── View/
│ │ ├── BrewCell.swift
│ │ ├── BrewCell.xib
│ │ ├── BrewDesignerViewController.swift
│ │ ├── BrewDesignerViewController.xib
│ │ ├── BrewNewPhaseViewController.swift
│ │ ├── BrewNewPhaseViewController.xib
│ │ ├── BrewViewController.swift
│ │ ├── BrewViewController.xib
│ │ ├── PhaseCell.swift
│ │ └── PhaseCell.xib
│ └── ViewModel/
│ ├── BrewDesignerViewModel.swift
│ └── BrewViewModel.swift
├── BrewMobile.xcodeproj/
│ ├── project.pbxproj
│ ├── project.xcworkspace/
│ │ └── contents.xcworkspacedata
│ └── xcshareddata/
│ └── xcschemes/
│ └── BrewMobile.xcscheme
├── BrewMobile.xcworkspace/
│ └── contents.xcworkspacedata
├── BrewMobileTests/
│ ├── BrewPhaseTestCase.swift
│ ├── BrewStateTestCase.swift
│ ├── ContentParserTestCase.swift
│ └── Info.plist
├── Cartfile
├── Cartfile.resolved
├── Carthage/
│ └── Checkouts/
│ ├── ReactiveCocoa/
│ │ ├── .gitignore
│ │ ├── .gitmodules
│ │ ├── .travis.yml
│ │ ├── CHANGELOG.md
│ │ ├── CONTRIBUTING.md
│ │ ├── Cartfile
│ │ ├── Cartfile.private
│ │ ├── Cartfile.resolved
│ │ ├── Carthage/
│ │ │ └── Checkouts/
│ │ │ ├── Nimble/
│ │ │ │ ├── .gitignore
│ │ │ │ ├── .travis.yml
│ │ │ │ ├── CONTRIBUTING.md
│ │ │ │ ├── LICENSE.md
│ │ │ │ ├── Nimble/
│ │ │ │ │ ├── Adapters/
│ │ │ │ │ │ ├── AdapterProtocols.swift
│ │ │ │ │ │ ├── AssertionDispatcher.swift
│ │ │ │ │ │ ├── AssertionRecorder.swift
│ │ │ │ │ │ ├── NimbleEnvironment.swift
│ │ │ │ │ │ └── NimbleXCTestHandler.swift
│ │ │ │ │ ├── DSL+Wait.swift
│ │ │ │ │ ├── DSL.swift
│ │ │ │ │ ├── Expectation.swift
│ │ │ │ │ ├── Expression.swift
│ │ │ │ │ ├── FailureMessage.swift
│ │ │ │ │ ├── Info.plist
│ │ │ │ │ ├── Matchers/
│ │ │ │ │ │ ├── AllPass.swift
│ │ │ │ │ │ ├── BeAKindOf.swift
│ │ │ │ │ │ ├── BeAnInstanceOf.swift
│ │ │ │ │ │ ├── BeCloseTo.swift
│ │ │ │ │ │ ├── BeEmpty.swift
│ │ │ │ │ │ ├── BeGreaterThan.swift
│ │ │ │ │ │ ├── BeGreaterThanOrEqualTo.swift
│ │ │ │ │ │ ├── BeIdenticalTo.swift
│ │ │ │ │ │ ├── BeLessThan.swift
│ │ │ │ │ │ ├── BeLessThanOrEqual.swift
│ │ │ │ │ │ ├── BeLogical.swift
│ │ │ │ │ │ ├── BeNil.swift
│ │ │ │ │ │ ├── BeginWith.swift
│ │ │ │ │ │ ├── Contain.swift
│ │ │ │ │ │ ├── EndWith.swift
│ │ │ │ │ │ ├── Equal.swift
│ │ │ │ │ │ ├── HaveCount.swift
│ │ │ │ │ │ ├── Match.swift
│ │ │ │ │ │ ├── MatcherProtocols.swift
│ │ │ │ │ │ ├── RaisesException.swift
│ │ │ │ │ │ ├── SatisfyAnyOf.swift
│ │ │ │ │ │ └── ThrowError.swift
│ │ │ │ │ ├── Nimble.h
│ │ │ │ │ ├── ObjCExpectation.swift
│ │ │ │ │ ├── Utils/
│ │ │ │ │ │ ├── Async.swift
│ │ │ │ │ │ ├── Functional.swift
│ │ │ │ │ │ ├── SourceLocation.swift
│ │ │ │ │ │ └── Stringers.swift
│ │ │ │ │ ├── Wrappers/
│ │ │ │ │ │ ├── AsyncMatcherWrapper.swift
│ │ │ │ │ │ ├── MatcherFunc.swift
│ │ │ │ │ │ └── ObjCMatcher.swift
│ │ │ │ │ └── objc/
│ │ │ │ │ ├── DSL.h
│ │ │ │ │ ├── DSL.m
│ │ │ │ │ ├── NMBExceptionCapture.h
│ │ │ │ │ └── NMBExceptionCapture.m
│ │ │ │ ├── Nimble.podspec
│ │ │ │ ├── Nimble.xcodeproj/
│ │ │ │ │ ├── project.pbxproj
│ │ │ │ │ └── xcshareddata/
│ │ │ │ │ └── xcschemes/
│ │ │ │ │ ├── Nimble-OSX.xcscheme
│ │ │ │ │ ├── Nimble-iOS.xcscheme
│ │ │ │ │ └── Nimble-tvOS.xcscheme
│ │ │ │ ├── NimbleTests/
│ │ │ │ │ ├── AsynchronousTest.swift
│ │ │ │ │ ├── Helpers/
│ │ │ │ │ │ ├── ObjectWithLazyProperty.swift
│ │ │ │ │ │ └── utils.swift
│ │ │ │ │ ├── Info.plist
│ │ │ │ │ ├── Matchers/
│ │ │ │ │ │ ├── AllPassTest.swift
│ │ │ │ │ │ ├── BeAKindOfTest.swift
│ │ │ │ │ │ ├── BeAnInstanceOfTest.swift
│ │ │ │ │ │ ├── BeCloseToTest.swift
│ │ │ │ │ │ ├── BeEmptyTest.swift
│ │ │ │ │ │ ├── BeGreaterThanOrEqualToTest.swift
│ │ │ │ │ │ ├── BeGreaterThanTest.swift
│ │ │ │ │ │ ├── BeIdenticalToObjectTest.swift
│ │ │ │ │ │ ├── BeIdenticalToTest.swift
│ │ │ │ │ │ ├── BeLessThanOrEqualToTest.swift
│ │ │ │ │ │ ├── BeLessThanTest.swift
│ │ │ │ │ │ ├── BeLogicalTest.swift
│ │ │ │ │ │ ├── BeNilTest.swift
│ │ │ │ │ │ ├── BeginWithTest.swift
│ │ │ │ │ │ ├── ContainTest.swift
│ │ │ │ │ │ ├── EndWithTest.swift
│ │ │ │ │ │ ├── EqualTest.swift
│ │ │ │ │ │ ├── HaveCountTest.swift
│ │ │ │ │ │ ├── MatchTest.swift
│ │ │ │ │ │ ├── RaisesExceptionTest.swift
│ │ │ │ │ │ ├── SatisfyAnyOfTest.swift
│ │ │ │ │ │ └── ThrowErrorTest.swift
│ │ │ │ │ ├── SynchronousTests.swift
│ │ │ │ │ ├── UserDescriptionTest.swift
│ │ │ │ │ └── objc/
│ │ │ │ │ ├── Nimble-OSXTests-Bridging-Header.h
│ │ │ │ │ ├── NimbleSpecHelper.h
│ │ │ │ │ ├── NimbleTests-Bridging-Header.h
│ │ │ │ │ ├── ObjCAllPassTest.m
│ │ │ │ │ ├── ObjCAsyncTest.m
│ │ │ │ │ ├── ObjCBeAnInstanceOfTest.m
│ │ │ │ │ ├── ObjCBeCloseToTest.m
│ │ │ │ │ ├── ObjCBeEmptyTest.m
│ │ │ │ │ ├── ObjCBeFalseTest.m
│ │ │ │ │ ├── ObjCBeFalsyTest.m
│ │ │ │ │ ├── ObjCBeGreaterThanOrEqualToTest.m
│ │ │ │ │ ├── ObjCBeGreaterThanTest.m
│ │ │ │ │ ├── ObjCBeIdenticalToTest.m
│ │ │ │ │ ├── ObjCBeKindOfTest.m
│ │ │ │ │ ├── ObjCBeLessThanOrEqualToTest.m
│ │ │ │ │ ├── ObjCBeLessThanTest.m
│ │ │ │ │ ├── ObjCBeNilTest.m
│ │ │ │ │ ├── ObjCBeTrueTest.m
│ │ │ │ │ ├── ObjCBeTruthyTest.m
│ │ │ │ │ ├── ObjCBeginWithTest.m
│ │ │ │ │ ├── ObjCContainTest.m
│ │ │ │ │ ├── ObjCEndWithTest.m
│ │ │ │ │ ├── ObjCEqualTest.m
│ │ │ │ │ ├── ObjCHaveCount.m
│ │ │ │ │ ├── ObjCMatchTest.m
│ │ │ │ │ ├── ObjCRaiseExceptionTest.m
│ │ │ │ │ ├── ObjCSatisfyAnyOfTest.m
│ │ │ │ │ ├── ObjCSyncTest.m
│ │ │ │ │ └── ObjCUserDescriptionTest.m
│ │ │ │ ├── README.md
│ │ │ │ ├── circle.yml
│ │ │ │ ├── script/
│ │ │ │ │ └── release
│ │ │ │ └── test
│ │ │ ├── Quick/
│ │ │ │ ├── .gitignore
│ │ │ │ ├── .gitmodules
│ │ │ │ ├── .travis.yml
│ │ │ │ ├── CONTRIBUTING.md
│ │ │ │ ├── Documentation/
│ │ │ │ │ ├── ArrangeActAssert.md
│ │ │ │ │ ├── BehavioralTesting.md
│ │ │ │ │ ├── ConfiguringQuick.md
│ │ │ │ │ ├── InstallingFileTemplates.md
│ │ │ │ │ ├── InstallingQuick.md
│ │ │ │ │ ├── MoreResources.md
│ │ │ │ │ ├── NimbleAssertions.md
│ │ │ │ │ ├── QuickExamplesAndGroups.md
│ │ │ │ │ ├── QuickInObjectiveC.md
│ │ │ │ │ ├── README.md
│ │ │ │ │ ├── SettingUpYourXcodeProject.md
│ │ │ │ │ ├── SharedExamples.md
│ │ │ │ │ └── TestingApps.md
│ │ │ │ ├── Externals/
│ │ │ │ │ └── Nimble/
│ │ │ │ │ ├── .gitignore
│ │ │ │ │ ├── .travis.yml
│ │ │ │ │ ├── CONTRIBUTING.md
│ │ │ │ │ ├── LICENSE.md
│ │ │ │ │ ├── Nimble/
│ │ │ │ │ │ ├── Adapters/
│ │ │ │ │ │ │ ├── AdapterProtocols.swift
│ │ │ │ │ │ │ ├── AssertionDispatcher.swift
│ │ │ │ │ │ │ ├── AssertionRecorder.swift
│ │ │ │ │ │ │ └── NimbleXCTestHandler.swift
│ │ │ │ │ │ ├── DSL+Wait.swift
│ │ │ │ │ │ ├── DSL.swift
│ │ │ │ │ │ ├── Expectation.swift
│ │ │ │ │ │ ├── Expression.swift
│ │ │ │ │ │ ├── FailureMessage.swift
│ │ │ │ │ │ ├── Info.plist
│ │ │ │ │ │ ├── Matchers/
│ │ │ │ │ │ │ ├── AllPass.swift
│ │ │ │ │ │ │ ├── BeAKindOf.swift
│ │ │ │ │ │ │ ├── BeAnInstanceOf.swift
│ │ │ │ │ │ │ ├── BeCloseTo.swift
│ │ │ │ │ │ │ ├── BeEmpty.swift
│ │ │ │ │ │ │ ├── BeGreaterThan.swift
│ │ │ │ │ │ │ ├── BeGreaterThanOrEqualTo.swift
│ │ │ │ │ │ │ ├── BeIdenticalTo.swift
│ │ │ │ │ │ │ ├── BeLessThan.swift
│ │ │ │ │ │ │ ├── BeLessThanOrEqual.swift
│ │ │ │ │ │ │ ├── BeLogical.swift
│ │ │ │ │ │ │ ├── BeNil.swift
│ │ │ │ │ │ │ ├── BeginWith.swift
│ │ │ │ │ │ │ ├── Contain.swift
│ │ │ │ │ │ │ ├── EndWith.swift
│ │ │ │ │ │ │ ├── Equal.swift
│ │ │ │ │ │ │ ├── HaveCount.swift
│ │ │ │ │ │ │ ├── Match.swift
│ │ │ │ │ │ │ ├── MatcherProtocols.swift
│ │ │ │ │ │ │ ├── RaisesException.swift
│ │ │ │ │ │ │ └── ThrowError.swift
│ │ │ │ │ │ ├── Nimble.h
│ │ │ │ │ │ ├── ObjCExpectation.swift
│ │ │ │ │ │ ├── Utils/
│ │ │ │ │ │ │ ├── Functional.swift
│ │ │ │ │ │ │ ├── Poll.swift
│ │ │ │ │ │ │ ├── SourceLocation.swift
│ │ │ │ │ │ │ └── Stringers.swift
│ │ │ │ │ │ ├── Wrappers/
│ │ │ │ │ │ │ ├── AsyncMatcherWrapper.swift
│ │ │ │ │ │ │ ├── MatcherFunc.swift
│ │ │ │ │ │ │ └── ObjCMatcher.swift
│ │ │ │ │ │ └── objc/
│ │ │ │ │ │ ├── DSL.h
│ │ │ │ │ │ ├── DSL.m
│ │ │ │ │ │ ├── NMBExceptionCapture.h
│ │ │ │ │ │ └── NMBExceptionCapture.m
│ │ │ │ │ ├── Nimble.podspec
│ │ │ │ │ ├── Nimble.xcodeproj/
│ │ │ │ │ │ ├── project.pbxproj
│ │ │ │ │ │ └── xcshareddata/
│ │ │ │ │ │ └── xcschemes/
│ │ │ │ │ │ ├── Nimble-OSX.xcscheme
│ │ │ │ │ │ ├── Nimble-iOS.xcscheme
│ │ │ │ │ │ └── Nimble-tvOS.xcscheme
│ │ │ │ │ ├── NimbleTests/
│ │ │ │ │ │ ├── AsynchronousTest.swift
│ │ │ │ │ │ ├── Helpers/
│ │ │ │ │ │ │ ├── ObjectWithLazyProperty.swift
│ │ │ │ │ │ │ └── utils.swift
│ │ │ │ │ │ ├── Info.plist
│ │ │ │ │ │ ├── Matchers/
│ │ │ │ │ │ │ ├── AllPassTest.swift
│ │ │ │ │ │ │ ├── BeAKindOfTest.swift
│ │ │ │ │ │ │ ├── BeAnInstanceOfTest.swift
│ │ │ │ │ │ │ ├── BeCloseToTest.swift
│ │ │ │ │ │ │ ├── BeEmptyTest.swift
│ │ │ │ │ │ │ ├── BeGreaterThanOrEqualToTest.swift
│ │ │ │ │ │ │ ├── BeGreaterThanTest.swift
│ │ │ │ │ │ │ ├── BeIdenticalToObjectTest.swift
│ │ │ │ │ │ │ ├── BeIdenticalToTest.swift
│ │ │ │ │ │ │ ├── BeLessThanOrEqualToTest.swift
│ │ │ │ │ │ │ ├── BeLessThanTest.swift
│ │ │ │ │ │ │ ├── BeLogicalTest.swift
│ │ │ │ │ │ │ ├── BeNilTest.swift
│ │ │ │ │ │ │ ├── BeginWithTest.swift
│ │ │ │ │ │ │ ├── ContainTest.swift
│ │ │ │ │ │ │ ├── EndWithTest.swift
│ │ │ │ │ │ │ ├── EqualTest.swift
│ │ │ │ │ │ │ ├── HaveCountTest.swift
│ │ │ │ │ │ │ ├── MatchTest.swift
│ │ │ │ │ │ │ ├── RaisesExceptionTest.swift
│ │ │ │ │ │ │ └── ThrowErrorTest.swift
│ │ │ │ │ │ ├── SynchronousTests.swift
│ │ │ │ │ │ ├── UserDescriptionTest.swift
│ │ │ │ │ │ └── objc/
│ │ │ │ │ │ ├── Nimble-OSXTests-Bridging-Header.h
│ │ │ │ │ │ ├── NimbleSpecHelper.h
│ │ │ │ │ │ ├── NimbleTests-Bridging-Header.h
│ │ │ │ │ │ ├── ObjCAllPassTest.m
│ │ │ │ │ │ ├── ObjCAsyncTest.m
│ │ │ │ │ │ ├── ObjCBeAnInstanceOfTest.m
│ │ │ │ │ │ ├── ObjCBeCloseToTest.m
│ │ │ │ │ │ ├── ObjCBeEmptyTest.m
│ │ │ │ │ │ ├── ObjCBeFalseTest.m
│ │ │ │ │ │ ├── ObjCBeFalsyTest.m
│ │ │ │ │ │ ├── ObjCBeGreaterThanOrEqualToTest.m
│ │ │ │ │ │ ├── ObjCBeGreaterThanTest.m
│ │ │ │ │ │ ├── ObjCBeIdenticalToTest.m
│ │ │ │ │ │ ├── ObjCBeKindOfTest.m
│ │ │ │ │ │ ├── ObjCBeLessThanOrEqualToTest.m
│ │ │ │ │ │ ├── ObjCBeLessThanTest.m
│ │ │ │ │ │ ├── ObjCBeNilTest.m
│ │ │ │ │ │ ├── ObjCBeTrueTest.m
│ │ │ │ │ │ ├── ObjCBeTruthyTest.m
│ │ │ │ │ │ ├── ObjCBeginWithTest.m
│ │ │ │ │ │ ├── ObjCContainTest.m
│ │ │ │ │ │ ├── ObjCEndWithTest.m
│ │ │ │ │ │ ├── ObjCEqualTest.m
│ │ │ │ │ │ ├── ObjCHaveCount.m
│ │ │ │ │ │ ├── ObjCMatchTest.m
│ │ │ │ │ │ ├── ObjCRaiseExceptionTest.m
│ │ │ │ │ │ ├── ObjCSyncTest.m
│ │ │ │ │ │ └── ObjCUserDescriptionTest.m
│ │ │ │ │ ├── README.md
│ │ │ │ │ ├── circle.yml
│ │ │ │ │ ├── script/
│ │ │ │ │ │ └── release
│ │ │ │ │ └── test
│ │ │ │ ├── LICENSE
│ │ │ │ ├── Quick/
│ │ │ │ │ ├── Callsite.swift
│ │ │ │ │ ├── Configuration/
│ │ │ │ │ │ ├── Configuration.swift
│ │ │ │ │ │ ├── QuickConfiguration.h
│ │ │ │ │ │ └── QuickConfiguration.m
│ │ │ │ │ ├── DSL/
│ │ │ │ │ │ ├── DSL.swift
│ │ │ │ │ │ ├── QCKDSL.h
│ │ │ │ │ │ ├── QCKDSL.m
│ │ │ │ │ │ ├── World+DSL.h
│ │ │ │ │ │ └── World+DSL.swift
│ │ │ │ │ ├── Example.swift
│ │ │ │ │ ├── ExampleGroup.swift
│ │ │ │ │ ├── ExampleMetadata.swift
│ │ │ │ │ ├── Filter.swift
│ │ │ │ │ ├── Hooks/
│ │ │ │ │ │ ├── Closures.swift
│ │ │ │ │ │ ├── ExampleHooks.swift
│ │ │ │ │ │ └── SuiteHooks.swift
│ │ │ │ │ ├── Info.plist
│ │ │ │ │ ├── NSString+QCKSelectorName.h
│ │ │ │ │ ├── NSString+QCKSelectorName.m
│ │ │ │ │ ├── Quick.h
│ │ │ │ │ ├── QuickSpec.h
│ │ │ │ │ ├── QuickSpec.m
│ │ │ │ │ ├── World.h
│ │ │ │ │ └── World.swift
│ │ │ │ ├── Quick Templates/
│ │ │ │ │ ├── Quick Configuration Class.xctemplate/
│ │ │ │ │ │ ├── Objective-C/
│ │ │ │ │ │ │ ├── ___FILEBASENAME___.h
│ │ │ │ │ │ │ └── ___FILEBASENAME___.m
│ │ │ │ │ │ ├── Swift/
│ │ │ │ │ │ │ └── ___FILEBASENAME___.swift
│ │ │ │ │ │ ├── TemplateIcon.icns
│ │ │ │ │ │ └── TemplateInfo.plist
│ │ │ │ │ └── Quick Spec Class.xctemplate/
│ │ │ │ │ ├── Objective-C/
│ │ │ │ │ │ └── ___FILEBASENAME___.m
│ │ │ │ │ ├── Swift/
│ │ │ │ │ │ └── ___FILEBASENAME___.swift
│ │ │ │ │ ├── TemplateIcon.icns
│ │ │ │ │ └── TemplateInfo.plist
│ │ │ │ ├── Quick.podspec
│ │ │ │ ├── Quick.xcodeproj/
│ │ │ │ │ ├── project.pbxproj
│ │ │ │ │ └── xcshareddata/
│ │ │ │ │ └── xcschemes/
│ │ │ │ │ ├── Quick-OSX.xcscheme
│ │ │ │ │ ├── Quick-iOS.xcscheme
│ │ │ │ │ └── Quick-tvOS.xcscheme
│ │ │ │ ├── QuickFocusedTests/
│ │ │ │ │ ├── FocusedTests+ObjC.m
│ │ │ │ │ ├── FocusedTests.swift
│ │ │ │ │ └── Info.plist
│ │ │ │ ├── QuickTests/
│ │ │ │ │ ├── Fixtures/
│ │ │ │ │ │ └── FunctionalTests_SharedExamplesTests_SharedExamples.swift
│ │ │ │ │ ├── FunctionalTests/
│ │ │ │ │ │ ├── AfterEachTests+ObjC.m
│ │ │ │ │ │ ├── AfterEachTests.swift
│ │ │ │ │ │ ├── AfterSuiteTests+ObjC.m
│ │ │ │ │ │ ├── AfterSuiteTests.swift
│ │ │ │ │ │ ├── BeforeEachTests+ObjC.m
│ │ │ │ │ │ ├── BeforeEachTests.swift
│ │ │ │ │ │ ├── BeforeSuiteTests+ObjC.m
│ │ │ │ │ │ ├── BeforeSuiteTests.swift
│ │ │ │ │ │ ├── Configuration/
│ │ │ │ │ │ │ ├── AfterEach/
│ │ │ │ │ │ │ │ ├── Configuration+AfterEach.swift
│ │ │ │ │ │ │ │ └── Configuration+AfterEachTests.swift
│ │ │ │ │ │ │ └── BeforeEach/
│ │ │ │ │ │ │ ├── Configuration+BeforeEach.swift
│ │ │ │ │ │ │ └── Configuration+BeforeEachTests.swift
│ │ │ │ │ │ ├── FailureTests+ObjC.m
│ │ │ │ │ │ ├── FailureUsingXCTAssertTests+ObjC.m
│ │ │ │ │ │ ├── ItTests+ObjC.m
│ │ │ │ │ │ ├── ItTests.swift
│ │ │ │ │ │ ├── PendingTests+ObjC.m
│ │ │ │ │ │ ├── PendingTests.swift
│ │ │ │ │ │ ├── SharedExamples+BeforeEachTests+ObjC.m
│ │ │ │ │ │ ├── SharedExamples+BeforeEachTests.swift
│ │ │ │ │ │ ├── SharedExamplesTests+ObjC.m
│ │ │ │ │ │ └── SharedExamplesTests.swift
│ │ │ │ │ ├── Helpers/
│ │ │ │ │ │ ├── QCKSpecRunner.h
│ │ │ │ │ │ ├── QCKSpecRunner.m
│ │ │ │ │ │ ├── QuickTestsBridgingHeader.h
│ │ │ │ │ │ └── XCTestObservationCenter+QCKSuspendObservation.h
│ │ │ │ │ ├── Info.plist
│ │ │ │ │ └── QuickConfigurationTests.m
│ │ │ │ ├── README.md
│ │ │ │ ├── Rakefile
│ │ │ │ ├── circle.yml
│ │ │ │ └── script/
│ │ │ │ └── release
│ │ │ ├── Result/
│ │ │ │ ├── .gitignore
│ │ │ │ ├── .travis.yml
│ │ │ │ ├── CONTRIBUTING.md
│ │ │ │ ├── LICENSE
│ │ │ │ ├── Package.swift
│ │ │ │ ├── README.md
│ │ │ │ ├── Result/
│ │ │ │ │ ├── Info.plist
│ │ │ │ │ ├── Result.h
│ │ │ │ │ ├── Result.swift
│ │ │ │ │ └── ResultType.swift
│ │ │ │ ├── Result.podspec
│ │ │ │ ├── Result.xcodeproj/
│ │ │ │ │ ├── project.pbxproj
│ │ │ │ │ └── xcshareddata/
│ │ │ │ │ └── xcschemes/
│ │ │ │ │ ├── Result-Mac.xcscheme
│ │ │ │ │ ├── Result-iOS.xcscheme
│ │ │ │ │ ├── Result-tvOS.xcscheme
│ │ │ │ │ └── Result-watchOS.xcscheme
│ │ │ │ └── Tests/
│ │ │ │ ├── Info.plist
│ │ │ │ └── ResultTests.swift
│ │ │ └── xcconfigs/
│ │ │ ├── .gitignore
│ │ │ ├── Base/
│ │ │ │ ├── Common.xcconfig
│ │ │ │ ├── Configurations/
│ │ │ │ │ ├── Debug.xcconfig
│ │ │ │ │ ├── Profile.xcconfig
│ │ │ │ │ ├── Release.xcconfig
│ │ │ │ │ └── Test.xcconfig
│ │ │ │ └── Targets/
│ │ │ │ ├── Application.xcconfig
│ │ │ │ ├── Framework.xcconfig
│ │ │ │ └── StaticLibrary.xcconfig
│ │ │ ├── Mac OS X/
│ │ │ │ ├── Mac-Application.xcconfig
│ │ │ │ ├── Mac-Base.xcconfig
│ │ │ │ ├── Mac-DynamicLibrary.xcconfig
│ │ │ │ ├── Mac-Framework.xcconfig
│ │ │ │ └── Mac-StaticLibrary.xcconfig
│ │ │ ├── README.md
│ │ │ ├── iOS/
│ │ │ │ ├── iOS-Application.xcconfig
│ │ │ │ ├── iOS-Base.xcconfig
│ │ │ │ ├── iOS-Framework.xcconfig
│ │ │ │ └── iOS-StaticLibrary.xcconfig
│ │ │ ├── tvOS/
│ │ │ │ ├── tvOS-Application.xcconfig
│ │ │ │ ├── tvOS-Base.xcconfig
│ │ │ │ ├── tvOS-Framework.xcconfig
│ │ │ │ └── tvOS-StaticLibrary.xcconfig
│ │ │ └── watchOS/
│ │ │ ├── watchOS-Application.xcconfig
│ │ │ ├── watchOS-Base.xcconfig
│ │ │ ├── watchOS-Framework.xcconfig
│ │ │ └── watchOS-StaticLibrary.xcconfig
│ │ ├── Documentation/
│ │ │ ├── BasicOperators.md
│ │ │ ├── DebuggingTechniques.md
│ │ │ ├── DesignGuidelines.md
│ │ │ ├── FrameworkOverview.md
│ │ │ ├── Legacy/
│ │ │ │ ├── BasicOperators.md
│ │ │ │ ├── DesignGuidelines.md
│ │ │ │ ├── FrameworkOverview.md
│ │ │ │ ├── MemoryManagement.md
│ │ │ │ └── README.md
│ │ │ ├── ObjectiveCBridging.md
│ │ │ └── README.md
│ │ ├── Instruments/
│ │ │ ├── Disposable Growth.tracetemplate
│ │ │ ├── README.md
│ │ │ └── Signal Events.tracetemplate
│ │ ├── LICENSE.md
│ │ ├── Logo/
│ │ │ └── README.md
│ │ ├── README.md
│ │ ├── ReactiveCocoa/
│ │ │ ├── Info.plist
│ │ │ ├── Objective-C/
│ │ │ │ ├── MKAnnotationView+RACSignalSupport.h
│ │ │ │ ├── MKAnnotationView+RACSignalSupport.m
│ │ │ │ ├── NSArray+RACSequenceAdditions.h
│ │ │ │ ├── NSArray+RACSequenceAdditions.m
│ │ │ │ ├── NSControl+RACCommandSupport.h
│ │ │ │ ├── NSControl+RACCommandSupport.m
│ │ │ │ ├── NSControl+RACTextSignalSupport.h
│ │ │ │ ├── NSControl+RACTextSignalSupport.m
│ │ │ │ ├── NSData+RACSupport.h
│ │ │ │ ├── NSData+RACSupport.m
│ │ │ │ ├── NSDictionary+RACSequenceAdditions.h
│ │ │ │ ├── NSDictionary+RACSequenceAdditions.m
│ │ │ │ ├── NSEnumerator+RACSequenceAdditions.h
│ │ │ │ ├── NSEnumerator+RACSequenceAdditions.m
│ │ │ │ ├── NSFileHandle+RACSupport.h
│ │ │ │ ├── NSFileHandle+RACSupport.m
│ │ │ │ ├── NSIndexSet+RACSequenceAdditions.h
│ │ │ │ ├── NSIndexSet+RACSequenceAdditions.m
│ │ │ │ ├── NSInvocation+RACTypeParsing.h
│ │ │ │ ├── NSInvocation+RACTypeParsing.m
│ │ │ │ ├── NSNotificationCenter+RACSupport.h
│ │ │ │ ├── NSNotificationCenter+RACSupport.m
│ │ │ │ ├── NSObject+RACAppKitBindings.h
│ │ │ │ ├── NSObject+RACAppKitBindings.m
│ │ │ │ ├── NSObject+RACDeallocating.h
│ │ │ │ ├── NSObject+RACDeallocating.m
│ │ │ │ ├── NSObject+RACDescription.h
│ │ │ │ ├── NSObject+RACDescription.m
│ │ │ │ ├── NSObject+RACKVOWrapper.h
│ │ │ │ ├── NSObject+RACKVOWrapper.m
│ │ │ │ ├── NSObject+RACLifting.h
│ │ │ │ ├── NSObject+RACLifting.m
│ │ │ │ ├── NSObject+RACPropertySubscribing.h
│ │ │ │ ├── NSObject+RACPropertySubscribing.m
│ │ │ │ ├── NSObject+RACSelectorSignal.h
│ │ │ │ ├── NSObject+RACSelectorSignal.m
│ │ │ │ ├── NSOrderedSet+RACSequenceAdditions.h
│ │ │ │ ├── NSOrderedSet+RACSequenceAdditions.m
│ │ │ │ ├── NSSet+RACSequenceAdditions.h
│ │ │ │ ├── NSSet+RACSequenceAdditions.m
│ │ │ │ ├── NSString+RACKeyPathUtilities.h
│ │ │ │ ├── NSString+RACKeyPathUtilities.m
│ │ │ │ ├── NSString+RACSequenceAdditions.h
│ │ │ │ ├── NSString+RACSequenceAdditions.m
│ │ │ │ ├── NSString+RACSupport.h
│ │ │ │ ├── NSString+RACSupport.m
│ │ │ │ ├── NSText+RACSignalSupport.h
│ │ │ │ ├── NSText+RACSignalSupport.m
│ │ │ │ ├── NSURLConnection+RACSupport.h
│ │ │ │ ├── NSURLConnection+RACSupport.m
│ │ │ │ ├── NSUserDefaults+RACSupport.h
│ │ │ │ ├── NSUserDefaults+RACSupport.m
│ │ │ │ ├── RACArraySequence.h
│ │ │ │ ├── RACArraySequence.m
│ │ │ │ ├── RACBehaviorSubject.h
│ │ │ │ ├── RACBehaviorSubject.m
│ │ │ │ ├── RACBlockTrampoline.h
│ │ │ │ ├── RACBlockTrampoline.m
│ │ │ │ ├── RACChannel.h
│ │ │ │ ├── RACChannel.m
│ │ │ │ ├── RACCommand.h
│ │ │ │ ├── RACCommand.m
│ │ │ │ ├── RACCompoundDisposable.h
│ │ │ │ ├── RACCompoundDisposable.m
│ │ │ │ ├── RACCompoundDisposableProvider.d
│ │ │ │ ├── RACDelegateProxy.h
│ │ │ │ ├── RACDelegateProxy.m
│ │ │ │ ├── RACDisposable.h
│ │ │ │ ├── RACDisposable.m
│ │ │ │ ├── RACDynamicPropertySuperclass.h
│ │ │ │ ├── RACDynamicPropertySuperclass.m
│ │ │ │ ├── RACDynamicSequence.h
│ │ │ │ ├── RACDynamicSequence.m
│ │ │ │ ├── RACDynamicSignal.h
│ │ │ │ ├── RACDynamicSignal.m
│ │ │ │ ├── RACEagerSequence.h
│ │ │ │ ├── RACEagerSequence.m
│ │ │ │ ├── RACEmptySequence.h
│ │ │ │ ├── RACEmptySequence.m
│ │ │ │ ├── RACEmptySignal.h
│ │ │ │ ├── RACEmptySignal.m
│ │ │ │ ├── RACErrorSignal.h
│ │ │ │ ├── RACErrorSignal.m
│ │ │ │ ├── RACEvent.h
│ │ │ │ ├── RACEvent.m
│ │ │ │ ├── RACGroupedSignal.h
│ │ │ │ ├── RACGroupedSignal.m
│ │ │ │ ├── RACImmediateScheduler.h
│ │ │ │ ├── RACImmediateScheduler.m
│ │ │ │ ├── RACIndexSetSequence.h
│ │ │ │ ├── RACIndexSetSequence.m
│ │ │ │ ├── RACKVOChannel.h
│ │ │ │ ├── RACKVOChannel.m
│ │ │ │ ├── RACKVOProxy.h
│ │ │ │ ├── RACKVOProxy.m
│ │ │ │ ├── RACKVOTrampoline.h
│ │ │ │ ├── RACKVOTrampoline.m
│ │ │ │ ├── RACMulticastConnection+Private.h
│ │ │ │ ├── RACMulticastConnection.h
│ │ │ │ ├── RACMulticastConnection.m
│ │ │ │ ├── RACObjCRuntime.h
│ │ │ │ ├── RACObjCRuntime.m
│ │ │ │ ├── RACPassthroughSubscriber.h
│ │ │ │ ├── RACPassthroughSubscriber.m
│ │ │ │ ├── RACQueueScheduler+Subclass.h
│ │ │ │ ├── RACQueueScheduler.h
│ │ │ │ ├── RACQueueScheduler.m
│ │ │ │ ├── RACReplaySubject.h
│ │ │ │ ├── RACReplaySubject.m
│ │ │ │ ├── RACReturnSignal.h
│ │ │ │ ├── RACReturnSignal.m
│ │ │ │ ├── RACScheduler+Private.h
│ │ │ │ ├── RACScheduler+Subclass.h
│ │ │ │ ├── RACScheduler.h
│ │ │ │ ├── RACScheduler.m
│ │ │ │ ├── RACScopedDisposable.h
│ │ │ │ ├── RACScopedDisposable.m
│ │ │ │ ├── RACSequence.h
│ │ │ │ ├── RACSequence.m
│ │ │ │ ├── RACSerialDisposable.h
│ │ │ │ ├── RACSerialDisposable.m
│ │ │ │ ├── RACSignal+Operations.h
│ │ │ │ ├── RACSignal+Operations.m
│ │ │ │ ├── RACSignal.h
│ │ │ │ ├── RACSignal.m
│ │ │ │ ├── RACSignalProvider.d
│ │ │ │ ├── RACSignalSequence.h
│ │ │ │ ├── RACSignalSequence.m
│ │ │ │ ├── RACStream+Private.h
│ │ │ │ ├── RACStream.h
│ │ │ │ ├── RACStream.m
│ │ │ │ ├── RACStringSequence.h
│ │ │ │ ├── RACStringSequence.m
│ │ │ │ ├── RACSubject.h
│ │ │ │ ├── RACSubject.m
│ │ │ │ ├── RACSubscriber+Private.h
│ │ │ │ ├── RACSubscriber.h
│ │ │ │ ├── RACSubscriber.m
│ │ │ │ ├── RACSubscriptingAssignmentTrampoline.h
│ │ │ │ ├── RACSubscriptingAssignmentTrampoline.m
│ │ │ │ ├── RACSubscriptionScheduler.h
│ │ │ │ ├── RACSubscriptionScheduler.m
│ │ │ │ ├── RACTargetQueueScheduler.h
│ │ │ │ ├── RACTargetQueueScheduler.m
│ │ │ │ ├── RACTestScheduler.h
│ │ │ │ ├── RACTestScheduler.m
│ │ │ │ ├── RACTuple.h
│ │ │ │ ├── RACTuple.m
│ │ │ │ ├── RACTupleSequence.h
│ │ │ │ ├── RACTupleSequence.m
│ │ │ │ ├── RACUnarySequence.h
│ │ │ │ ├── RACUnarySequence.m
│ │ │ │ ├── RACUnit.h
│ │ │ │ ├── RACUnit.m
│ │ │ │ ├── RACValueTransformer.h
│ │ │ │ ├── RACValueTransformer.m
│ │ │ │ ├── ReactiveCocoa-Bridging-Header.h
│ │ │ │ ├── UIActionSheet+RACSignalSupport.h
│ │ │ │ ├── UIActionSheet+RACSignalSupport.m
│ │ │ │ ├── UIAlertView+RACSignalSupport.h
│ │ │ │ ├── UIAlertView+RACSignalSupport.m
│ │ │ │ ├── UIBarButtonItem+RACCommandSupport.h
│ │ │ │ ├── UIBarButtonItem+RACCommandSupport.m
│ │ │ │ ├── UIButton+RACCommandSupport.h
│ │ │ │ ├── UIButton+RACCommandSupport.m
│ │ │ │ ├── UICollectionReusableView+RACSignalSupport.h
│ │ │ │ ├── UICollectionReusableView+RACSignalSupport.m
│ │ │ │ ├── UIControl+RACSignalSupport.h
│ │ │ │ ├── UIControl+RACSignalSupport.m
│ │ │ │ ├── UIControl+RACSignalSupportPrivate.h
│ │ │ │ ├── UIControl+RACSignalSupportPrivate.m
│ │ │ │ ├── UIDatePicker+RACSignalSupport.h
│ │ │ │ ├── UIDatePicker+RACSignalSupport.m
│ │ │ │ ├── UIGestureRecognizer+RACSignalSupport.h
│ │ │ │ ├── UIGestureRecognizer+RACSignalSupport.m
│ │ │ │ ├── UIImagePickerController+RACSignalSupport.h
│ │ │ │ ├── UIImagePickerController+RACSignalSupport.m
│ │ │ │ ├── UIRefreshControl+RACCommandSupport.h
│ │ │ │ ├── UIRefreshControl+RACCommandSupport.m
│ │ │ │ ├── UISegmentedControl+RACSignalSupport.h
│ │ │ │ ├── UISegmentedControl+RACSignalSupport.m
│ │ │ │ ├── UISlider+RACSignalSupport.h
│ │ │ │ ├── UISlider+RACSignalSupport.m
│ │ │ │ ├── UIStepper+RACSignalSupport.h
│ │ │ │ ├── UIStepper+RACSignalSupport.m
│ │ │ │ ├── UISwitch+RACSignalSupport.h
│ │ │ │ ├── UISwitch+RACSignalSupport.m
│ │ │ │ ├── UITableViewCell+RACSignalSupport.h
│ │ │ │ ├── UITableViewCell+RACSignalSupport.m
│ │ │ │ ├── UITableViewHeaderFooterView+RACSignalSupport.h
│ │ │ │ ├── UITableViewHeaderFooterView+RACSignalSupport.m
│ │ │ │ ├── UITextField+RACSignalSupport.h
│ │ │ │ ├── UITextField+RACSignalSupport.m
│ │ │ │ ├── UITextView+RACSignalSupport.h
│ │ │ │ ├── UITextView+RACSignalSupport.m
│ │ │ │ └── extobjc/
│ │ │ │ ├── EXTKeyPathCoding.h
│ │ │ │ ├── EXTRuntimeExtensions.h
│ │ │ │ ├── EXTRuntimeExtensions.m
│ │ │ │ ├── EXTScope.h
│ │ │ │ └── metamacros.h
│ │ │ ├── ReactiveCocoa.h
│ │ │ └── Swift/
│ │ │ ├── Action.swift
│ │ │ ├── Atomic.swift
│ │ │ ├── Bag.swift
│ │ │ ├── Disposable.swift
│ │ │ ├── Event.swift
│ │ │ ├── Flatten.swift
│ │ │ ├── FoundationExtensions.swift
│ │ │ ├── ObjectiveCBridging.swift
│ │ │ ├── Observer.swift
│ │ │ ├── Optional.swift
│ │ │ ├── Property.swift
│ │ │ ├── Scheduler.swift
│ │ │ ├── Signal.swift
│ │ │ ├── SignalProducer.swift
│ │ │ └── TupleExtensions.swift
│ │ ├── ReactiveCocoa.xcodeproj/
│ │ │ ├── project.pbxproj
│ │ │ └── xcshareddata/
│ │ │ └── xcschemes/
│ │ │ ├── ReactiveCocoa-Mac.xcscheme
│ │ │ ├── ReactiveCocoa-iOS.xcscheme
│ │ │ ├── ReactiveCocoa-tvOS.xcscheme
│ │ │ └── ReactiveCocoa-watchOS.xcscheme
│ │ ├── ReactiveCocoaTests/
│ │ │ ├── Info.plist
│ │ │ ├── Objective-C/
│ │ │ │ ├── NSControllerRACSupportSpec.m
│ │ │ │ ├── NSEnumeratorRACSequenceAdditionsSpec.m
│ │ │ │ ├── NSNotificationCenterRACSupportSpec.m
│ │ │ │ ├── NSObjectRACAppKitBindingsSpec.m
│ │ │ │ ├── NSObjectRACDeallocatingSpec.m
│ │ │ │ ├── NSObjectRACLiftingSpec.m
│ │ │ │ ├── NSObjectRACPropertySubscribingExamples.h
│ │ │ │ ├── NSObjectRACPropertySubscribingExamples.m
│ │ │ │ ├── NSObjectRACPropertySubscribingSpec.m
│ │ │ │ ├── NSObjectRACSelectorSignalSpec.m
│ │ │ │ ├── NSStringRACKeyPathUtilitiesSpec.m
│ │ │ │ ├── NSURLConnectionRACSupportSpec.m
│ │ │ │ ├── NSUserDefaultsRACSupportSpec.m
│ │ │ │ ├── RACBlockTrampolineSpec.m
│ │ │ │ ├── RACChannelExamples.h
│ │ │ │ ├── RACChannelExamples.m
│ │ │ │ ├── RACChannelSpec.m
│ │ │ │ ├── RACCommandSpec.m
│ │ │ │ ├── RACCompoundDisposableSpec.m
│ │ │ │ ├── RACControlCommandExamples.h
│ │ │ │ ├── RACControlCommandExamples.m
│ │ │ │ ├── RACDelegateProxySpec.m
│ │ │ │ ├── RACDisposableSpec.m
│ │ │ │ ├── RACEventSpec.m
│ │ │ │ ├── RACKVOChannelSpec.m
│ │ │ │ ├── RACKVOProxySpec.m
│ │ │ │ ├── RACKVOWrapperSpec.m
│ │ │ │ ├── RACMulticastConnectionSpec.m
│ │ │ │ ├── RACPropertySignalExamples.h
│ │ │ │ ├── RACPropertySignalExamples.m
│ │ │ │ ├── RACSchedulerSpec.m
│ │ │ │ ├── RACSequenceAdditionsSpec.m
│ │ │ │ ├── RACSequenceExamples.h
│ │ │ │ ├── RACSequenceExamples.m
│ │ │ │ ├── RACSequenceSpec.m
│ │ │ │ ├── RACSerialDisposableSpec.m
│ │ │ │ ├── RACSignalSpec.m
│ │ │ │ ├── RACStreamExamples.h
│ │ │ │ ├── RACStreamExamples.m
│ │ │ │ ├── RACSubclassObject.h
│ │ │ │ ├── RACSubclassObject.m
│ │ │ │ ├── RACSubjectSpec.m
│ │ │ │ ├── RACSubscriberExamples.h
│ │ │ │ ├── RACSubscriberExamples.m
│ │ │ │ ├── RACSubscriberSpec.m
│ │ │ │ ├── RACSubscriptingAssignmentTrampolineSpec.m
│ │ │ │ ├── RACTargetQueueSchedulerSpec.m
│ │ │ │ ├── RACTestExampleScheduler.h
│ │ │ │ ├── RACTestExampleScheduler.m
│ │ │ │ ├── RACTestObject.h
│ │ │ │ ├── RACTestObject.m
│ │ │ │ ├── RACTestSchedulerSpec.m
│ │ │ │ ├── RACTestUIButton.h
│ │ │ │ ├── RACTestUIButton.m
│ │ │ │ ├── RACTupleSpec.m
│ │ │ │ ├── UIActionSheetRACSupportSpec.m
│ │ │ │ ├── UIAlertViewRACSupportSpec.m
│ │ │ │ ├── UIBarButtonItemRACSupportSpec.m
│ │ │ │ ├── UIButtonRACSupportSpec.m
│ │ │ │ └── UIImagePickerControllerRACSupportSpec.m
│ │ │ ├── Swift/
│ │ │ │ ├── ActionSpec.swift
│ │ │ │ ├── AtomicSpec.swift
│ │ │ │ ├── BagSpec.swift
│ │ │ │ ├── DisposableSpec.swift
│ │ │ │ ├── FlattenSpec.swift
│ │ │ │ ├── FoundationExtensionsSpec.swift
│ │ │ │ ├── ObjectiveCBridgingSpec.swift
│ │ │ │ ├── PropertySpec.swift
│ │ │ │ ├── SchedulerSpec.swift
│ │ │ │ ├── SignalLifetimeSpec.swift
│ │ │ │ ├── SignalProducerLiftingSpec.swift
│ │ │ │ ├── SignalProducerNimbleMatchers.swift
│ │ │ │ ├── SignalProducerSpec.swift
│ │ │ │ ├── SignalSpec.swift
│ │ │ │ └── TestError.swift
│ │ │ └── test-data.json
│ │ └── script/
│ │ ├── LICENSE.md
│ │ ├── README.md
│ │ ├── bootstrap
│ │ ├── cibuild
│ │ ├── schemes.awk
│ │ ├── targets.awk
│ │ ├── xcodebuild.awk
│ │ └── xctool.awk
│ ├── Result/
│ │ ├── .gitignore
│ │ ├── .travis.yml
│ │ ├── CONTRIBUTING.md
│ │ ├── LICENSE
│ │ ├── Package.swift
│ │ ├── README.md
│ │ ├── Result/
│ │ │ ├── Info.plist
│ │ │ ├── Result.h
│ │ │ ├── Result.swift
│ │ │ └── ResultType.swift
│ │ ├── Result.podspec
│ │ ├── Result.xcodeproj/
│ │ │ ├── project.pbxproj
│ │ │ ├── project.xcworkspace/
│ │ │ │ └── contents.xcworkspacedata
│ │ │ └── xcshareddata/
│ │ │ └── xcschemes/
│ │ │ ├── Result-Mac.xcscheme
│ │ │ ├── Result-iOS.xcscheme
│ │ │ ├── Result-tvOS.xcscheme
│ │ │ └── Result-watchOS.xcscheme
│ │ └── Tests/
│ │ ├── Info.plist
│ │ └── ResultTests.swift
│ ├── SIOSocket/
│ │ ├── .gitignore
│ │ ├── LICENSE
│ │ ├── README.md
│ │ ├── SIOSocket.podspec
│ │ ├── SocketIO/
│ │ │ ├── Info.plist
│ │ │ ├── SocketIO.m
│ │ │ └── Source/
│ │ │ ├── SIOSocket.h
│ │ │ ├── SIOSocket.m
│ │ │ └── socket.io.js.h
│ │ ├── SocketIO.xcodeproj/
│ │ │ ├── project.pbxproj
│ │ │ ├── project.xcworkspace/
│ │ │ │ └── contents.xcworkspacedata
│ │ │ └── xcshareddata/
│ │ │ └── xcschemes/
│ │ │ ├── SocketIOFramework.xcscheme
│ │ │ └── SocketIOHost.xcscheme
│ │ ├── SocketIOFramework/
│ │ │ ├── Info.plist
│ │ │ └── SocketIOFramework.h
│ │ ├── SocketIOHost/
│ │ │ ├── AppDelegate.h
│ │ │ ├── AppDelegate.m
│ │ │ ├── Base.lproj/
│ │ │ │ └── Main.storyboard
│ │ │ ├── Images.xcassets/
│ │ │ │ ├── AppIcon.appiconset/
│ │ │ │ │ └── Contents.json
│ │ │ │ └── LaunchImage.launchimage/
│ │ │ │ └── Contents.json
│ │ │ ├── Info.plist
│ │ │ ├── ViewController.h
│ │ │ ├── ViewController.m
│ │ │ └── main.m
│ │ └── socket_tester/
│ │ └── app.js
│ ├── SwiftyJSON/
│ │ ├── .gitignore
│ │ ├── .travis.yml
│ │ ├── CHANGELOG.md
│ │ ├── Example/
│ │ │ ├── Example/
│ │ │ │ ├── AppDelegate.swift
│ │ │ │ ├── Base.lproj/
│ │ │ │ │ ├── LaunchScreen.xib
│ │ │ │ │ └── Main.storyboard
│ │ │ │ ├── Images.xcassets/
│ │ │ │ │ ├── AppIcon.appiconset/
│ │ │ │ │ │ └── Contents.json
│ │ │ │ │ └── LaunchImage.launchimage/
│ │ │ │ │ └── Contents.json
│ │ │ │ ├── Info.plist
│ │ │ │ ├── SwiftyJSONTests.json
│ │ │ │ └── ViewController.swift
│ │ │ ├── Example.xcodeproj/
│ │ │ │ ├── project.pbxproj
│ │ │ │ └── project.xcworkspace/
│ │ │ │ └── contents.xcworkspacedata
│ │ │ └── Playground.playground/
│ │ │ ├── Contents.swift
│ │ │ ├── contents.xcplayground
│ │ │ └── timeline.xctimeline
│ │ ├── LICENSE
│ │ ├── Package.swift
│ │ ├── README.md
│ │ ├── Source/
│ │ │ ├── Info-OSX.plist
│ │ │ ├── Info-iOS.plist
│ │ │ ├── Info-tvOS.plist
│ │ │ ├── Info-watchOS.plist
│ │ │ ├── SwiftyJSON.h
│ │ │ └── SwiftyJSON.swift
│ │ ├── SwiftyJSON.podspec
│ │ ├── SwiftyJSON.xcodeproj/
│ │ │ ├── project.pbxproj
│ │ │ ├── project.xcworkspace/
│ │ │ │ └── contents.xcworkspacedata
│ │ │ └── xcshareddata/
│ │ │ └── xcschemes/
│ │ │ ├── SwiftyJSON OSX.xcscheme
│ │ │ ├── SwiftyJSON iOS.xcscheme
│ │ │ ├── SwiftyJSON tvOS.xcscheme
│ │ │ └── SwiftyJSON watchOS.xcscheme
│ │ ├── SwiftyJSON.xcworkspace/
│ │ │ ├── contents.xcworkspacedata
│ │ │ └── xcshareddata/
│ │ │ └── WorkspaceSettings.xcsettings
│ │ ├── Tests/
│ │ │ ├── ArrayTests.swift
│ │ │ ├── BaseTests.swift
│ │ │ ├── ComparableTests.swift
│ │ │ ├── DictionaryTests.swift
│ │ │ ├── Info-OSX.plist
│ │ │ ├── Info-iOS.plist
│ │ │ ├── Info-tvOS.plist
│ │ │ ├── LiteralConvertibleTests.swift
│ │ │ ├── NumberTests.swift
│ │ │ ├── PerformanceTests.swift
│ │ │ ├── PrintableTests.swift
│ │ │ ├── RawRepresentableTests.swift
│ │ │ ├── RawTests.swift
│ │ │ ├── SequenceTypeTests.swift
│ │ │ ├── StringTests.swift
│ │ │ ├── SubscriptTests.swift
│ │ │ └── Tests.json
│ │ └── scripts/
│ │ └── ci.sh
│ ├── iso-8601-date-formatter/
│ │ ├── .gitignore
│ │ ├── .hgtags
│ │ ├── .travis.yml
│ │ ├── AppledocSettings.plist
│ │ ├── ISO8601DateFormatter.h
│ │ ├── ISO8601DateFormatter.m
│ │ ├── ISO8601ForCocoa/
│ │ │ ├── ISO8601DateFormatter/
│ │ │ │ ├── ISO8601.h
│ │ │ │ └── Info.plist
│ │ │ ├── ISO8601ForCocoa/
│ │ │ │ └── ISO8601ForCocoa-Prefix.pch
│ │ │ ├── ISO8601ForCocoa.xcodeproj/
│ │ │ │ ├── project.pbxproj
│ │ │ │ ├── project.xcworkspace/
│ │ │ │ │ └── contents.xcworkspacedata
│ │ │ │ └── xcshareddata/
│ │ │ │ └── xcschemes/
│ │ │ │ ├── ISO8601DateFormatter.xcscheme
│ │ │ │ ├── ISO8601ForCocoa.xcscheme
│ │ │ │ └── ISO8601ForCocoaTouch.xcscheme
│ │ │ ├── ISO8601ForCocoaTests/
│ │ │ │ ├── ISO8601ForCocoaCalendarDateTests.h
│ │ │ │ ├── ISO8601ForCocoaCalendarDateTests.m
│ │ │ │ ├── ISO8601ForCocoaTests-Info.plist
│ │ │ │ ├── ISO8601ForCocoaTimeOnlyTests.h
│ │ │ │ ├── ISO8601ForCocoaTimeOnlyTests.m
│ │ │ │ ├── ISO8601ForCocoaWeekDateTests.h
│ │ │ │ ├── ISO8601ForCocoaWeekDateTests.m
│ │ │ │ ├── ISO8601Testing.h
│ │ │ │ ├── ISO8601Testing.m
│ │ │ │ ├── MBMockLocale.h
│ │ │ │ ├── MBMockLocale.m
│ │ │ │ ├── NSLocale+UnitTestSwizzling.h
│ │ │ │ ├── NSLocale+UnitTestSwizzling.m
│ │ │ │ ├── PRHNamedCharacter.h
│ │ │ │ └── en.lproj/
│ │ │ │ └── InfoPlist.strings
│ │ │ ├── ISO8601ForCocoaTouch/
│ │ │ │ └── ISO8601ForCocoaTouch-Prefix.pch
│ │ │ └── ISO8601ForCocoaTouchTests/
│ │ │ ├── ISO8601ForCocoaTouchTests-Info.plist
│ │ │ ├── ISO8601MemoryWarningTests.h
│ │ │ ├── ISO8601MemoryWarningTests.m
│ │ │ └── en.lproj/
│ │ │ └── InfoPlist.strings
│ │ ├── LICENSE.txt
│ │ ├── Makefile
│ │ ├── README.md
│ │ ├── test_files/
│ │ │ ├── 2005-2006.txt
│ │ │ ├── 2005.txt
│ │ │ ├── 2006.txt
│ │ │ ├── 2009-2010.txt
│ │ │ ├── januaries.txt
│ │ │ └── januaries3.txt
│ │ ├── testparser.m
│ │ ├── testparser.sh.in
│ │ ├── testparser.sh.py
│ │ ├── testunparser.sh
│ │ ├── testunparsewithtime.m
│ │ ├── timetrial.m
│ │ ├── unparse-date.m
│ │ ├── unparse-ordinaldate.m
│ │ └── unparse-weekdate.m
│ └── socket.io-client-swift/
│ ├── .gitignore
│ ├── .travis.yml
│ ├── LICENSE
│ ├── Package.swift
│ ├── README.md
│ ├── Socket.IO-Client-Swift.podspec
│ ├── Socket.IO-Test-Server/
│ │ ├── TestCases.js
│ │ ├── acknowledgementEvents.js
│ │ ├── emitEvents.js
│ │ ├── main.js
│ │ ├── package.json
│ │ └── socketEventRegister.js
│ ├── SocketIO-Mac/
│ │ ├── Info.plist
│ │ └── SocketIO-Mac.h
│ ├── SocketIO-MacTests/
│ │ ├── Info.plist
│ │ ├── SocketAckManagerTest.swift
│ │ ├── SocketBasicPacketTest.swift
│ │ ├── SocketEngineTest.swift
│ │ ├── SocketNamespacePacketTest.swift
│ │ ├── SocketParserTest.swift
│ │ └── SocketSideEffectTest.swift
│ ├── SocketIO-iOS/
│ │ ├── Info.plist
│ │ └── SocketIO-iOS.h
│ ├── SocketIO-iOSTests/
│ │ └── Info.plist
│ └── Source/
│ ├── SocketAckEmitter.swift
│ ├── SocketAckManager.swift
│ ├── SocketAnyEvent.swift
│ ├── SocketClientSpec.swift
│ ├── SocketEngine.swift
│ ├── SocketEngineClient.swift
│ ├── SocketEnginePacketType.swift
│ ├── SocketEnginePollable.swift
│ ├── SocketEngineSpec.swift
│ ├── SocketEngineWebsocket.swift
│ ├── SocketEventHandler.swift
│ ├── SocketFixUTF8.swift
│ ├── SocketIOClient.swift
│ ├── SocketIOClientOption.swift
│ ├── SocketIOClientStatus.swift
│ ├── SocketLogger.swift
│ ├── SocketPacket.swift
│ ├── SocketParsable.swift
│ ├── SocketStringReader.swift
│ ├── SocketTypes.swift
│ ├── SwiftRegex.swift
│ └── WebSocket.swift
└── README.md
================================================
FILE CONTENTS
================================================
================================================
FILE: .gitignore
================================================
## Build generated
build/
DerivedData
## Various settings
*.pbxuser
!default.pbxuser
*.mode1v3
!default.mode1v3
*.mode2v3
!default.mode2v3
*.perspectivev3
!default.perspectivev3
xcuserdata
## Other
*.xccheckout
*.moved-aside
*.xcuserstate
*.xcscmblueprint
## Obj-C/Swift specific
*.hmap
*.ipa
# Carthage
Carthage/Build
================================================
FILE: BrewMobile/AppDelegate.swift
================================================
//
// AppDelegate.swift
// BrewMobile
//
// Created by Ágnes Vásárhelyi on 19/08/14.
// Copyright (c) 2014 Ágnes Vásárhelyi. All rights reserved.
//
import UIKit
@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {
var window: UIWindow?
var brewDesignerNavigationController: UINavigationController!
var brewTabBarController: UITabBarController!
func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject : AnyObject]?) -> Bool {
brewTabBarController = UITabBarController()
brewDesignerNavigationController = UINavigationController()
let brewManager = BrewManager()
let brewViewModel = BrewViewModel(brewManager: brewManager)
let brewDesignerViewModel = BrewDesignerViewModel(brewManager: brewManager)
let brewViewController = BrewViewController(brewViewModel: brewViewModel)
let brewDesignerViewController = BrewDesignerViewController(brewDesignerViewModel: brewDesignerViewModel)
brewDesignerNavigationController.pushViewController(brewDesignerViewController, animated: false)
brewTabBarController.setViewControllers([brewViewController, brewDesignerNavigationController], animated: false)
window = UIWindow(frame: UIScreen.mainScreen().bounds)
window!.rootViewController = brewTabBarController
window!.makeKeyAndVisible()
return true
}
func applicationWillResignActive(application: UIApplication) {
// Sent when the application is about to move from active to inactive state. This can occur for certain types of temporary interruptions (such as an incoming phone call or SMS message) or when the user quits the application and it begins the transition to the background state.
// Use this method to pause ongoing tasks, disable timers, and throttle down OpenGL ES frame rates. Games should use this method to pause the game.
}
func applicationDidEnterBackground(application: UIApplication) {
// Use this method to release shared resources, save user data, invalidate timers, and store enough application state information to restore your application to its current state in case it is terminated later.
// If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits.
}
func applicationWillEnterForeground(application: UIApplication) {
// Called as part of the transition from the background to the inactive state; here you can undo many of the changes made on entering the background.
}
func applicationDidBecomeActive(application: UIApplication) {
// Restart any tasks that were paused (or not yet started) while the application was inactive. If the application was previously in the background, optionally refresh the user interface.
}
func applicationWillTerminate(application: UIApplication) {
// Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:.
}
}
================================================
FILE: BrewMobile/BrewManager.swift
================================================
//
// BrewManager.swift
// BrewMobile
//
// Created by Agnes Vasarhelyi on 03/01/15.
// Copyright (c) 2015 Ágnes Vásárhelyi. All rights reserved.
//
import Foundation
import SwiftyJSON
import ReactiveCocoa
import Result
import SocketIOClientSwift
let tempChangedEvent = "temperature_changed"
let brewChangedEvent = "brew_changed"
let pwmChangedEvent = "pwm_changed"
let host = "https://brewcore-demo.herokuapp.com/"
class BrewManager : NSObject {
var syncBrewAction: Action<BrewState, NSData, NSError>!
var stopBrewAction: Action<Void, NSData, NSError>!
var socket: SocketIOClient
let temp = MutableProperty<Float>(0.0)
let brew = MutableProperty(BrewState())
let pwm = MutableProperty<Float>(0.0)
override init() {
socket = SocketIOClient(socketURL:NSURL(string: host)!)
super.init()
syncBrewAction = Action { brewState in
if let jsonData:AnyObject = BrewState.encode(brewState).value {
let requestResult = self.requestWithBody("api/brew", method: "POST", body: JSON(jsonData))
if let requestResultValue = requestResult.value {
return NSURLSession.sharedSession().rac_dataWithRequest(requestResultValue)
.map { data, URLResponse in
return data
}
}
}
fatalError("jsonData is nil")
}
stopBrewAction = Action { brewState in
if let request = self.requestWithBody("api/brew/stop", method: "PATCH", body: "").value {
return NSURLSession.sharedSession().rac_dataWithRequest(request)
.map { data, URLResponse in
return data
}
}
fatalError("request is nil")
}
}
//Mark: HTTP
private func requestWithBody(path: String, method: String, body: JSON) -> Result<NSMutableURLRequest, NSError> {
let request : NSMutableURLRequest = NSMutableURLRequest()
request.URL = NSURL(string: host + path)
request.HTTPMethod = method
if method == "POST" {
do {
request.HTTPBody = try body.rawData(options: .PrettyPrinted)
} catch let error as NSError {
return Result(error: error)
}
}
return Result(request)
}
// MARK: WebSocket
func connectToHost() {
socket.connect()
socket.on(tempChangedEvent) { data, ack in
if (data.count > 0) {
if let temp = data[0] as? NSNumber {
self.temp.value = temp.floatValue
}
}
}
socket.on(brewChangedEvent) { data, ack in
if (data.count > 0) {
self.brew.value = ContentParser.parseBrewState(JSON(data[0]))
}
}
socket.on(pwmChangedEvent) { data, ack in
if (data.count > 0) {
if let pwm = data[0] as? NSNumber {
self.pwm.value = pwm.floatValue
}
}
}
socket.on("connect") { data, ack in
print("Connected to \(host)")
}
socket.on("disconnect") { data, ack in
print("Disconnected from \(host)")
}
}
}
================================================
FILE: BrewMobile/ContentParser.swift
================================================
//
// ContentParser.swift
// BrewMobile
//
// Created by Ágnes Vásárhelyi on 19/08/14.
// Copyright (c) 2014 Ágnes Vásárhelyi. All rights reserved.
//
import Foundation
import ISO8601
import SwiftyJSON
import Result
// MARK: JSONDecodable
protocol JSONDecodable {
static func decode(json: JSON) -> Result<Self, NSError>
}
// MARK: JSONEncodable
protocol JSONEncodable {
static func encode(object: Self) -> Result<AnyObject, NSError>
}
typealias PhaseArray = [BrewPhase]
class ContentParser {
class func parseBrewState(brewJSON: JSON) -> BrewState {
return BrewState.decode(brewJSON).value!
}
class func parseBrewPhase(brewPhaseJSON: JSON) -> BrewPhase {
return BrewPhase.decode(brewPhaseJSON).value!
}
class func formatDate(dateString: String) -> String {
if dateString.characters.count > 0 {
let isoDateFormatter = ISO8601DateFormatter()
let formattedDate = isoDateFormatter.dateFromString(dateString)
let dateStringFormatter = NSDateFormatter()
dateStringFormatter.dateFormat = "HH:mm"
let formattedDateString = dateStringFormatter.stringFromDate(formattedDate!)
return formattedDateString
}
return ""
}
}
================================================
FILE: BrewMobile/Images.xcassets/AppIcon.appiconset/Contents.json
================================================
{
"images" : [
{
"size" : "29x29",
"idiom" : "iphone",
"filename" : "icon58.png",
"scale" : "2x"
},
{
"size" : "40x40",
"idiom" : "iphone",
"filename" : "iphone_spotlight@2x.png",
"scale" : "2x"
},
{
"size" : "60x60",
"idiom" : "iphone",
"filename" : "iphone_app_icon@2x.png",
"scale" : "2x"
},
{
"size" : "60x60",
"idiom" : "iphone",
"filename" : "icon180.png",
"scale" : "3x"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
}
}
================================================
FILE: BrewMobile/Images.xcassets/DesignerIcon.imageset/Contents.json
================================================
{
"images" : [
{
"idiom" : "universal",
"scale" : "1x",
"filename" : "edit-disabled-2.png"
},
{
"idiom" : "universal",
"scale" : "2x",
"filename" : "edit-disabled-1.png"
},
{
"idiom" : "universal",
"scale" : "3x",
"filename" : "edit-disabled.png"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
}
}
================================================
FILE: BrewMobile/Images.xcassets/HopIcon.imageset/Contents.json
================================================
{
"images" : [
{
"idiom" : "universal",
"scale" : "1x",
"filename" : "hops-disabled2-2.png"
},
{
"idiom" : "universal",
"scale" : "2x",
"filename" : "hops-disabled2-1.png"
},
{
"idiom" : "universal",
"scale" : "3x",
"filename" : "hops-disabled2.png"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
}
}
================================================
FILE: BrewMobile/Images.xcassets/LaunchImage.launchimage/Contents.json
================================================
{
"images" : [
{
"orientation" : "portrait",
"idiom" : "iphone",
"extent" : "full-screen",
"minimum-system-version" : "7.0",
"filename" : "splash@2x.png",
"scale" : "2x"
},
{
"extent" : "full-screen",
"idiom" : "iphone",
"subtype" : "retina4",
"filename" : "splash-568h@2x.png",
"minimum-system-version" : "7.0",
"orientation" : "portrait",
"scale" : "2x"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
}
}
================================================
FILE: BrewMobile/Info.plist
================================================
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>CFBundleDevelopmentRegion</key>
<string>en</string>
<key>CFBundleExecutable</key>
<string>${EXECUTABLE_NAME}</string>
<key>CFBundleIdentifier</key>
<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>
<key>CFBundleInfoDictionaryVersion</key>
<string>6.0</string>
<key>CFBundleName</key>
<string>brewfactory</string>
<key>CFBundlePackageType</key>
<string>APPL</string>
<key>CFBundleShortVersionString</key>
<string>2.0.0</string>
<key>CFBundleSignature</key>
<string>????</string>
<key>CFBundleVersion</key>
<string>1</string>
<key>LSRequiresIPhoneOS</key>
<true/>
<key>UIRequiredDeviceCapabilities</key>
<array>
<string>armv7</string>
</array>
<key>UISupportedInterfaceOrientations</key>
<array>
<string>UIInterfaceOrientationPortrait</string>
<string>UIInterfaceOrientationLandscapeLeft</string>
<string>UIInterfaceOrientationLandscapeRight</string>
</array>
</dict>
</plist>
================================================
FILE: BrewMobile/Model/BrewPhase.swift
================================================
//
// BrewPhase.swift
// BrewMobile
//
// Created by Ágnes Vásárhelyi on 14/09/14.
// Copyright (c) 2014 Ágnes Vásárhelyi. All rights reserved.
//
import Foundation
import UIKit
import Result
import SwiftyJSON
enum State: Int {
case INACTIVE = 0
case HEATING
case ACTIVE
case FINISHED
func stateDescription() -> String {
switch self {
case .INACTIVE:
return ""
case .HEATING:
return "heating"
case .ACTIVE:
return "active"
case .FINISHED:
return "finished"
}
}
func bgColor() -> UIColor {
switch self {
case .INACTIVE:
return UIColor(red: 245.0 / 255.0, green:245.0 / 255.0, blue:245.0 / 255.0, alpha: 1.0)
case .HEATING:
return UIColor(red: 240.0 / 255.0, green:173.0 / 255.0, blue:78.0 / 255.0, alpha: 1.0)
case .ACTIVE:
return UIColor(red: 66.0 / 255.0, green:139.0 / 255.0, blue:202.0 / 255.0, alpha: 1.0)
case .FINISHED:
return UIColor(red: 92.0 / 255.0, green:184.0 / 255.0, blue:92.0 / 255.0, alpha: 1.0)
}
}
}
// MARK: Equatable
func == (left: BrewPhase, right: BrewPhase) -> Bool {
return (left.jobEnd == right.jobEnd) && (left.min == right.min) && (left.temp == right.temp) && (left.tempReached == right.tempReached) && (left.inProgress == right.inProgress)
}
final class BrewPhase: Equatable, JSONDecodable, JSONEncodable {
var jobEnd: String
var min: Int
var temp: Float
var tempReached: Bool
var state: State
var inProgress: Bool
init() {
jobEnd = ""
min = 0
temp = 0
tempReached = false
state = State.INACTIVE
inProgress = false
}
init(jobEnd: String, min: Int, temp: Float, tempReached: Bool, inProgress: Bool) {
self.jobEnd = jobEnd
self.min = min
self.temp = temp
self.tempReached = tempReached
self.state = { () -> State in
switch (inProgress, tempReached) {
case (true, false):
return State.HEATING
case (true, true):
return State.ACTIVE
case (false, true):
return State.FINISHED
case (false, false):
fallthrough
default:
return State.INACTIVE
}
} ()
self.inProgress = inProgress
}
// MARK: JSONDecodable
class func decode(json: JSON) -> Result<BrewPhase, NSError> {
return Result(BrewPhase(
jobEnd: ContentParser.formatDate(json["jobEnd"].stringValue),
min: json["min"].intValue,
temp: json["temp"].floatValue,
tempReached: json["tempReached"].boolValue,
inProgress: json["inProgress"].boolValue)
)
}
// MARK: JSONEncodable
class func encode(object: BrewPhase) -> Result<AnyObject, NSError> {
var phase = [String: AnyObject]()
phase["min"] = Int(object.min)
phase["temp"] = Float(object.temp)
return Result(phase)
}
}
================================================
FILE: BrewMobile/Model/BrewState.swift
================================================
//
// BrewState.swift
// BrewMobile
//
// Created by Ágnes Vásárhelyi on 14/09/14.
// Copyright (c) 2014 Ágnes Vásárhelyi. All rights reserved.
//
import Foundation
import ReactiveCocoa
import Result
import SwiftyJSON
// MARK: Equatable
func == (left: BrewState, right: BrewState) -> Bool {
let phasesAreIdentical = { () -> Bool in
for i in 0...left.phases.value.count - 1 {
if left.phases.value[i] != right.phases.value[i] {
return false
}
}
return true
}()
return (left.name.value == right.name.value) &&
(left.startTime.value == right.startTime.value) &&
phasesAreIdentical &&
(left.paused.value == right.paused.value) &&
(left.inProgress.value == right.inProgress.value)
}
final class BrewState: Equatable, JSONDecodable, JSONEncodable {
var name: MutableProperty<String>
var startTime: MutableProperty<String>
var phases: MutableProperty<PhaseArray>
var paused: MutableProperty<Bool>
var inProgress: MutableProperty<Bool>
init() {
name = MutableProperty("")
startTime = MutableProperty("")
phases = MutableProperty(PhaseArray())
paused = MutableProperty(false)
inProgress = MutableProperty(false)
}
init(name: String, startTime: String, phases: PhaseArray, paused: Bool, inProgress: Bool) {
self.name = MutableProperty(name)
self.startTime = MutableProperty(startTime)
self.phases = MutableProperty(phases)
self.paused = MutableProperty(paused)
self.inProgress = MutableProperty(inProgress)
}
init(name: MutableProperty<String>,
startTime: MutableProperty<String>,
phases: MutableProperty<PhaseArray>,
paused: Bool, inProgress: Bool) {
self.name = name
self.startTime = startTime
self.phases = phases
self.paused = MutableProperty(paused)
self.inProgress = MutableProperty(inProgress)
}
// MARK: JSONDecodable
class func decode(json: JSON) -> Result<BrewState, NSError> {
return Result(BrewState(
name: json["name"].stringValue,
startTime: ContentParser.formatDate(json["startTime"].stringValue),
phases: json["phases"].arrayValue.map { (JSON rawPhase) -> BrewPhase in
return ContentParser.parseBrewPhase(rawPhase)
},
paused: json["paused"].boolValue,
inProgress: json["inProgress"].boolValue)
)
}
// MARK: JSONEncodable
class func encode(object: BrewState) -> Result<AnyObject, NSError> {
var brew = [String: AnyObject]()
brew["name"] = object.name.value
brew["startTime"] = object.startTime.value
brew["phases"] = object.phases.value.map { (BrewPhase phase) -> AnyObject in
return BrewPhase.encode(phase).value!
}
return Result(brew)
}
}
================================================
FILE: BrewMobile/RACUtils/RAC.swift
================================================
//
// RAC.swift
//
// Created by Colin Eberhardt on 15/07/2014.
// Copyright (c) 2014 Colin Eberhardt. All rights reserved.
//
// Original source can be found at:
// https://github.com/ColinEberhardt/ReactiveTwitterSearch/blob/master/ReactiveTwitterSearch/Util/UIKitExtensions.swift
//
import Foundation
import ReactiveCocoa
import UIKit
// see https://github.com/ReactiveCocoa/ReactiveCocoa/issues/2704
import enum Result.NoError
public typealias NoError = Result.NoError
struct AssociationKey {
static var hidden: UInt8 = 1
static var date: UInt8 = 2
static var text: UInt8 = 3
}
func lazyAssociatedProperty<T: AnyObject>(host: AnyObject, key: UnsafePointer<Void>, factory: ()->T) -> T {
return objc_getAssociatedObject(host, key) as? T ?? {
let associatedProperty = factory()
objc_setAssociatedObject(host, key, associatedProperty, .OBJC_ASSOCIATION_RETAIN)
return associatedProperty
}()
}
func lazyMutableProperty<T>(host: AnyObject, key: UnsafePointer<Void>, setter: T -> (), getter: () -> T) -> MutableProperty<T> {
return lazyAssociatedProperty(host, key: key) {
let property = MutableProperty<T>(getter())
property.producer
.startWithNext {
newValue in
setter(newValue)
}
return property
}
}
extension UIView {
public var rac_hidden: MutableProperty<Bool> {
return lazyMutableProperty(self, key: &AssociationKey.hidden, setter: { self.hidden = $0 }, getter: { self.hidden })
}
}
extension UILabel {
public var rac_text: MutableProperty<String> {
return lazyMutableProperty(self, key: &AssociationKey.text, setter: { self.text = $0 }, getter: { self.text ?? "" })
}
}
extension UITextField {
func rac_textSignalProducer() -> SignalProducer<String, NoError> {
return self.rac_textSignal().toSignalProducer()
.map { $0 as! String }
.flatMapError { _ in SignalProducer<String, NoError>.empty }
}
}
extension UITextField {
public var rac_text: MutableProperty<String> {
return lazyAssociatedProperty(self, key: &AssociationKey.text) {
self.addTarget(self, action: "changed", forControlEvents: UIControlEvents.EditingChanged)
let property = MutableProperty<String>(self.text ?? "")
property.producer
.startWithNext { newValue in
self.text = newValue
}
return property
}
}
func changed() {
rac_text.value = self.text!
}
}
================================================
FILE: BrewMobile/View/BrewCell.swift
================================================
//
// BrewCell.swift
// BrewMobile
//
// Created by Agnes Vasarhelyi on 04/01/15.
// Copyright (c) 2015 Ágnes Vásárhelyi. All rights reserved.
//
import UIKit
class BrewCell: UITableViewCell {
@IBOutlet weak var minLabel: UILabel!
@IBOutlet weak var statusLabel: UILabel!
func setTextColorForAllLabels(color: UIColor) {
minLabel.textColor = color
statusLabel.textColor = color
}
}
================================================
FILE: BrewMobile/View/BrewCell.xib
================================================
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<document type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="3.0" toolsVersion="6724" systemVersion="14B25" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES">
<dependencies>
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="6711"/>
</dependencies>
<objects>
<placeholder placeholderIdentifier="IBFilesOwner" id="-1" userLabel="File's Owner"/>
<placeholder placeholderIdentifier="IBFirstResponder" id="-2" customClass="UIResponder"/>
<tableViewCell contentMode="scaleToFill" selectionStyle="blue" hidesAccessoryWhenEditing="NO" indentationLevel="1" indentationWidth="0.0" reuseIdentifier="BrewCell" rowHeight="78" id="b8g-7p-itd" customClass="BrewCell" customModule="BrewMobile" customModuleProvider="target">
<rect key="frame" x="0.0" y="0.0" width="320" height="78"/>
<autoresizingMask key="autoresizingMask"/>
<tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" tableViewCell="b8g-7p-itd" id="wqs-6J-HDc">
<autoresizingMask key="autoresizingMask"/>
<subviews>
<label opaque="NO" clipsSubviews="YES" userInteractionEnabled="NO" contentMode="left" verticalHuggingPriority="251" misplaced="YES" text="" textAlignment="right" lineBreakMode="tailTruncation" numberOfLines="2" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" preferredMaxLayoutWidth="291" translatesAutoresizingMaskIntoConstraints="NO" id="hVV-Lx-i2u" userLabel="statusLabel">
<fontDescription key="fontDescription" name="HelveticaNeue-Light" family="Helvetica Neue" pointSize="17"/>
<color key="textColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
<nil key="highlightedColor"/>
</label>
<label opaque="NO" clipsSubviews="YES" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" misplaced="YES" text="" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" preferredMaxLayoutWidth="0.0" translatesAutoresizingMaskIntoConstraints="NO" id="bOB-df-e3t" userLabel="minLabel">
<fontDescription key="fontDescription" name="HelveticaNeue-Light" family="Helvetica Neue" pointSize="17"/>
<color key="textColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
<nil key="highlightedColor"/>
</label>
</subviews>
<constraints>
<constraint firstItem="hVV-Lx-i2u" firstAttribute="leading" secondItem="bOB-df-e3t" secondAttribute="trailing" constant="5" id="4b2-Ha-rDO"/>
<constraint firstItem="bOB-df-e3t" firstAttribute="top" secondItem="wqs-6J-HDc" secondAttribute="top" constant="28" id="CTE-bi-sMy"/>
<constraint firstItem="hVV-Lx-i2u" firstAttribute="top" secondItem="wqs-6J-HDc" secondAttribute="top" constant="28" id="Kr3-nb-dLO"/>
<constraint firstAttribute="trailing" secondItem="hVV-Lx-i2u" secondAttribute="trailing" constant="8" id="f0A-rt-cnw"/>
<constraint firstItem="bOB-df-e3t" firstAttribute="leading" secondItem="wqs-6J-HDc" secondAttribute="leading" constant="16" id="lcN-dt-6Z9"/>
</constraints>
</tableViewCellContentView>
<connections>
<outlet property="minLabel" destination="bOB-df-e3t" id="wtC-sI-XDG"/>
<outlet property="statusLabel" destination="hVV-Lx-i2u" id="PZI-qE-Lhb"/>
</connections>
</tableViewCell>
</objects>
</document>
================================================
FILE: BrewMobile/View/BrewDesignerViewController.swift
================================================
//
// BrewDesignerViewController.swift
// BrewMobile
//
// Created by Ágnes Vásárhelyi on 07/11/14.
// Copyright (c) 2014 Ágnes Vásárhelyi. All rights reserved.
//
import UIKit
import ISO8601
import ReactiveCocoa
class BrewDesignerViewController : UIViewController, UITableViewDataSource, UITableViewDelegate, UIGestureRecognizerDelegate {
@IBOutlet weak var nameTextField: UITextField!
@IBOutlet weak var startTimeTextField: UITextField!
@IBOutlet weak var phasesTableView: UITableView!
@IBOutlet weak var startTimePicker: UIDatePicker!
@IBOutlet weak var pickerBgView: UIView!
@IBOutlet weak var editButton: UIButton!
@IBOutlet weak var syncButton: UIButton!
@IBOutlet weak var trashButton: UIButton!
@IBOutlet weak var addButton: UIButton!
@IBOutlet weak var tapGestureRecognizer: UITapGestureRecognizer!
let brewDesignerViewModel: BrewDesignerViewModel
let brewManager: BrewManager
var cocoaActionTrash: CocoaAction!
var cocoaActionEdit: CocoaAction!
var cocoaActionAdd: CocoaAction!
let tableViewEditing = MutableProperty(false)
init(brewDesignerViewModel: BrewDesignerViewModel) {
self.brewDesignerViewModel = brewDesignerViewModel
self.brewManager = brewDesignerViewModel.brewManager
super.init(nibName:"BrewDesignerViewController", bundle: nil)
self.tabBarItem = UITabBarItem(title: "Designer", image: UIImage(named: "DesignerIcon"), tag: 0)
}
required init?(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
override func viewDidLoad() {
super.viewDidLoad()
let nib = UINib(nibName: "PhaseCell", bundle: nil)
phasesTableView.registerNib(nib, forCellReuseIdentifier: "PhaseCell")
let addAction = Action<Void, Void, NSError> {
if let navigationController = self.navigationController {
navigationController.pushViewController(BrewNewPhaseViewController(brewDesignerViewModel: self.brewDesignerViewModel), animated: true)
}
return SignalProducer.empty
}
let editAction = Action<Void, Void, NSError>(enabledIf: self.brewDesignerViewModel.hasPhases, {
self.phasesTableView.editing = !self.phasesTableView.editing
self.editButton.setTitle(self.phasesTableView.editing ? "Done" : "Edit", forState: .Normal)
return SignalProducer.empty
})
let trashAction = Action<Void, Void, NSError>(enabledIf: self.brewDesignerViewModel.hasPhases, {
self.brewDesignerViewModel.phases.value = PhaseArray()
self.nameTextField.text = ""
self.phasesTableView.reloadData()
return SignalProducer.empty
})
cocoaActionTrash = CocoaAction(trashAction, input: ())
cocoaActionEdit = CocoaAction(editAction, input: ())
cocoaActionAdd = CocoaAction(addAction, input: ())
syncButton.addTarget(self.brewDesignerViewModel.cocoaActionSync, action: CocoaAction.selector, forControlEvents: .TouchUpInside)
trashButton.addTarget(cocoaActionTrash, action: CocoaAction.selector, forControlEvents: .TouchUpInside)
editButton.addTarget(cocoaActionEdit, action: CocoaAction.selector, forControlEvents: .TouchUpInside)
addButton.addTarget(cocoaActionAdd, action: CocoaAction.selector, forControlEvents: .TouchUpInside)
self.brewManager.syncBrewAction.errors
.observeOn(UIScheduler())
.observeNext { error in
UIAlertView(title: "Error creating brew", message: error.localizedDescription, delegate: nil, cancelButtonTitle: "OK").show()
}
self.brewDesignerViewModel.hasPhases.producer
.observeOn(UIScheduler())
.startWithNext { hasPhases in
if !self.phasesTableView.editing {
self.phasesTableView.reloadData()
}
if !(hasPhases as Bool) {
self.phasesTableView.editing = false
}
}
self.brewDesignerViewModel.name <~ self.nameTextField.rac_textSignalProducer()
let startTimeTextFieldSignalProducer = self.startTimeTextField.rac_signalForControlEvents(.EditingDidBegin).toSignalProducer()
startTimeTextFieldSignalProducer
.startWithNext { _ in
self.dismissKeyboards()
}
self.pickerBgView.rac_hidden <~ startTimeTextFieldSignalProducer
.map { _ in false }
.flatMapError { _ in SignalProducer<Bool, NoError>.empty }
let pickerDateSignalProducer = self.startTimePicker.rac_signalForControlEvents(.ValueChanged).toSignalProducer()
.map { picker in
if let datePicker = picker as? UIDatePicker {
return datePicker.date
}
fatalError("this should not happen")
}
.flatMapError { _ in SignalProducer<NSDate, NoError>.empty }
let nowDate = NSDate()
self.startTimeTextField.rac_text.value = self.formatDateToShow(nowDate)
self.brewDesignerViewModel.startTime.value = self.formatDateToUpdate(nowDate)
self.startTimeTextField.rac_text <~ pickerDateSignalProducer
.map { self.formatDateToShow($0) }
.flatMapError { _ in SignalProducer<String, NoError>.empty }
self.brewDesignerViewModel.startTime <~ pickerDateSignalProducer
.map { date in
return self.formatDateToUpdate(date)
}
.flatMapError { _ in SignalProducer<String, NoError>.empty }
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
}
func dismissKeyboards() {
self.view.endEditing(true)
self.pickerBgView.hidden = true
}
func formatDateToShow(date: NSDate) -> String {
let dateFormatter = NSDateFormatter()
dateFormatter.dateFormat = "YYYY.MM.dd. HH:mm"
return dateFormatter.stringFromDate(date as NSDate)
}
func formatDateToUpdate(date: NSDate) -> String {
let isoDateFormatter = ISO8601DateFormatter()
isoDateFormatter.defaultTimeZone = NSTimeZone.defaultTimeZone()
isoDateFormatter.includeTime = true
return isoDateFormatter.stringFromDate(date)
}
// MARK: UITableViewDataSource
func numberOfSectionsInTableView(tableView: UITableView) -> Int {
return 1
}
func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return self.brewDesignerViewModel.phases.value.count
}
func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
if let cell = tableView.dequeueReusableCellWithIdentifier("PhaseCell", forIndexPath: indexPath) as? PhaseCell {
if self.brewDesignerViewModel.phases.value.count > indexPath.row {
let phase = self.brewDesignerViewModel.phases.value[indexPath.row]
cell.phaseLabel.text = "\(indexPath.row + 1). \(phase.min) min \(phase.temp) ˚C"
}
return cell
}
fatalError("every cell must be a PhaseCell")
}
func tableView(tableView: UITableView, titleForHeaderInSection section: Int) -> String? {
return "Phases"
}
func tableView(tableView: UITableView, canEditRowAtIndexPath indexPath: NSIndexPath) -> Bool {
return true
}
func tableView(tableView: UITableView, canMoveRowAtIndexPath indexPath: NSIndexPath) -> Bool {
return true
}
func tableView(tableView: UITableView, commitEditingStyle editingStyle: UITableViewCellEditingStyle, forRowAtIndexPath indexPath: NSIndexPath) {
if editingStyle == UITableViewCellEditingStyle.Delete {
if self.brewDesignerViewModel.phases.value.count > indexPath.row {
var newPhases = self.brewDesignerViewModel.phases.value
newPhases.removeAtIndex(indexPath.row)
self.brewDesignerViewModel.phases.value = newPhases
tableView.deleteRowsAtIndexPaths([indexPath], withRowAnimation: UITableViewRowAnimation.Automatic)
}
}
}
func tableView(tableView: UITableView, moveRowAtIndexPath sourceIndexPath: NSIndexPath, toIndexPath destinationIndexPath: NSIndexPath) {
let destinationPhase = self.brewDesignerViewModel.phases.value[destinationIndexPath.row]
var newPhases = self.brewDesignerViewModel.phases.value
newPhases[destinationIndexPath.row] = newPhases[sourceIndexPath.row]
newPhases[sourceIndexPath.row] = destinationPhase
self.brewDesignerViewModel.phases.value = newPhases
tableView.reloadData()
}
//MARK: UIGestureRecognizerDelegate
func gestureRecognizer(gestureRecognizer: UIGestureRecognizer, shouldReceiveTouch touch: UITouch) -> Bool {
if !touch.view!.isDescendantOfView(nameTextField) && !touch.view!.isDescendantOfView(pickerBgView) {
dismissKeyboards()
return false
}
return true
}
}
================================================
FILE: BrewMobile/View/BrewDesignerViewController.xib
================================================
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<document type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="3.0" toolsVersion="7706" systemVersion="14E46" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES">
<dependencies>
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="7703"/>
</dependencies>
<objects>
<placeholder placeholderIdentifier="IBFilesOwner" id="-1" userLabel="File's Owner" customClass="BrewDesignerViewController" customModule="BrewMobile" customModuleProvider="target">
<connections>
<outlet property="addButton" destination="CaM-o5-SSY" id="Bbm-Lm-NTW"/>
<outlet property="editButton" destination="68X-OV-UbA" id="qCX-14-j5q"/>
<outlet property="nameTextField" destination="f8R-9A-fPl" id="Kk1-HL-uc0"/>
<outlet property="phasesTableView" destination="UXe-dM-kaf" id="Tko-l3-4jh"/>
<outlet property="pickerBgView" destination="tcU-YS-7RG" id="Bo8-J4-GIm"/>
<outlet property="startTimePicker" destination="fxA-u9-6nI" id="eES-bj-56M"/>
<outlet property="startTimeTextField" destination="bis-dx-s8B" id="04h-QC-sKW"/>
<outlet property="syncButton" destination="KaG-Z3-g4V" id="kXG-dc-Mfp"/>
<outlet property="tapGestureRecognizer" destination="jwt-nf-kvG" id="CxT-hI-u1X"/>
<outlet property="trashButton" destination="Nxx-XB-evf" id="Nln-H0-xZT"/>
<outlet property="view" destination="ZQC-xj-gZE" id="LP0-VA-bNp"/>
</connections>
</placeholder>
<placeholder placeholderIdentifier="IBFirstResponder" id="-2" customClass="UIResponder"/>
<view contentMode="scaleToFill" id="ZQC-xj-gZE">
<rect key="frame" x="0.0" y="0.0" width="320" height="504"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<subviews>
<scrollView clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="scaleToFill" misplaced="YES" scrollEnabled="NO" translatesAutoresizingMaskIntoConstraints="NO" id="DqD-XB-qDa">
<rect key="frame" x="0.0" y="2" width="320" height="456"/>
<subviews>
<view contentMode="scaleToFill" misplaced="YES" translatesAutoresizingMaskIntoConstraints="NO" id="yCN-V7-n4t" userLabel="separator">
<rect key="frame" x="0.0" y="191" width="320" height="1"/>
<color key="backgroundColor" red="0.75686274509999996" green="0.75686274509999996" blue="0.75686274509999996" alpha="0.40000000000000002" colorSpace="calibratedRGB"/>
<constraints>
<constraint firstAttribute="height" constant="1" id="Mej-T1-nnG"/>
</constraints>
</view>
</subviews>
<gestureRecognizers/>
<constraints>
<constraint firstItem="yCN-V7-n4t" firstAttribute="leading" secondItem="DqD-XB-qDa" secondAttribute="leading" id="SlQ-ek-MX1"/>
<constraint firstAttribute="trailing" secondItem="yCN-V7-n4t" secondAttribute="trailing" id="T6V-Ct-Qqf"/>
<constraint firstItem="yCN-V7-n4t" firstAttribute="top" secondItem="DqD-XB-qDa" secondAttribute="top" constant="129" id="laV-Ag-WY3"/>
<constraint firstItem="yCN-V7-n4t" firstAttribute="centerX" secondItem="DqD-XB-qDa" secondAttribute="centerX" id="oBN-kh-LHx"/>
<constraint firstAttribute="bottom" secondItem="yCN-V7-n4t" secondAttribute="bottom" constant="264" id="sbZ-pM-SEq"/>
</constraints>
</scrollView>
<view contentMode="scaleToFill" misplaced="YES" translatesAutoresizingMaskIntoConstraints="NO" id="Dh1-ev-PAu">
<rect key="frame" x="0.0" y="2" width="320" height="456"/>
<subviews>
<view contentMode="scaleToFill" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="AxG-qN-0ml">
<rect key="frame" x="0.0" y="23" width="320" height="85"/>
<subviews>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" fixedFrame="YES" text="Name" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="K3A-HV-zvz">
<rect key="frame" x="31" y="10" width="49" height="21"/>
<fontDescription key="fontDescription" name="HelveticaNeue-Light" family="Helvetica Neue" pointSize="17"/>
<color key="textColor" red="0.0" green="0.0" blue="0.0" alpha="1" colorSpace="calibratedRGB"/>
<nil key="highlightedColor"/>
</label>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" fixedFrame="YES" text="Start" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="LOT-q8-bjg">
<rect key="frame" x="31" y="54" width="40" height="21"/>
<fontDescription key="fontDescription" name="HelveticaNeue-Light" family="Helvetica Neue" pointSize="17"/>
<color key="textColor" red="0.0" green="0.0" blue="0.0" alpha="1" colorSpace="calibratedRGB"/>
<nil key="highlightedColor"/>
</label>
<textField opaque="NO" clipsSubviews="YES" contentMode="scaleToFill" fixedFrame="YES" contentHorizontalAlignment="left" contentVerticalAlignment="center" minimumFontSize="17" translatesAutoresizingMaskIntoConstraints="NO" id="bis-dx-s8B" userLabel="startTime">
<rect key="frame" x="110" y="50" width="202" height="30"/>
<fontDescription key="fontDescription" type="system" pointSize="14"/>
<textInputTraits key="textInputTraits"/>
</textField>
<textField opaque="NO" clipsSubviews="YES" contentMode="scaleToFill" fixedFrame="YES" contentHorizontalAlignment="left" contentVerticalAlignment="center" minimumFontSize="17" translatesAutoresizingMaskIntoConstraints="NO" id="f8R-9A-fPl" userLabel="nameText">
<rect key="frame" x="110" y="6" width="202" height="30"/>
<fontDescription key="fontDescription" type="system" pointSize="14"/>
<textInputTraits key="textInputTraits"/>
</textField>
<view contentMode="scaleToFill" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="vt5-oG-P3B" userLabel="separator">
<rect key="frame" x="29" y="42" width="290" height="1"/>
<color key="backgroundColor" red="0.75686274509999996" green="0.75686274509999996" blue="0.75686274509999996" alpha="0.40000000000000002" colorSpace="calibratedRGB"/>
</view>
<view contentMode="scaleToFill" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="Z1k-br-eu8" userLabel="separator">
<rect key="frame" x="0.0" y="0.0" width="320" height="1"/>
<color key="backgroundColor" red="0.75686274509999996" green="0.75686274509999996" blue="0.75686274509999996" alpha="0.40000000000000002" colorSpace="calibratedRGB"/>
</view>
<view contentMode="scaleToFill" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="Kwn-Kv-JBi" userLabel="separator">
<rect key="frame" x="0.0" y="84" width="320" height="1"/>
<color key="backgroundColor" red="0.75686274509999996" green="0.75686274509999996" blue="0.75686274509999996" alpha="0.40000000000000002" colorSpace="calibratedRGB"/>
</view>
</subviews>
<color key="backgroundColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
</view>
<tableView clipsSubviews="YES" contentMode="scaleToFill" fixedFrame="YES" alwaysBounceVertical="YES" showsHorizontalScrollIndicator="NO" dataMode="prototypes" style="plain" separatorStyle="default" allowsSelection="NO" rowHeight="60" sectionHeaderHeight="22" sectionFooterHeight="22" translatesAutoresizingMaskIntoConstraints="NO" id="UXe-dM-kaf" userLabel="phasesTableView">
<rect key="frame" x="0.0" y="131" width="320" height="275"/>
<color key="backgroundColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
<sections/>
<connections>
<outlet property="dataSource" destination="-1" id="OOx-fJ-lLE"/>
<outlet property="delegate" destination="-1" id="9vh-cm-x3z"/>
</connections>
</tableView>
</subviews>
<color key="backgroundColor" red="0.98912292820000003" green="0.98912292820000003" blue="0.98912292820000003" alpha="1" colorSpace="calibratedRGB"/>
<constraints>
<constraint firstAttribute="height" constant="410" id="y6X-KX-B6k"/>
</constraints>
</view>
<view hidden="YES" contentMode="scaleToFill" misplaced="YES" translatesAutoresizingMaskIntoConstraints="NO" id="tcU-YS-7RG">
<rect key="frame" x="0.0" y="295" width="320" height="162"/>
<subviews>
<datePicker contentMode="scaleToFill" fixedFrame="YES" contentHorizontalAlignment="center" contentVerticalAlignment="center" datePickerMode="dateAndTime" minuteInterval="1" translatesAutoresizingMaskIntoConstraints="NO" id="fxA-u9-6nI">
<rect key="frame" x="0.0" y="-5" width="320" height="162"/>
<date key="date" timeIntervalSinceReferenceDate="437082403.12645298">
<!--2014-11-07 19:46:43 +0000-->
</date>
</datePicker>
</subviews>
<color key="backgroundColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
<constraints>
<constraint firstAttribute="height" constant="162" id="l6S-ST-Qrw"/>
</constraints>
</view>
<view contentMode="scaleToFill" misplaced="YES" translatesAutoresizingMaskIntoConstraints="NO" id="Rdr-iN-Ybe">
<rect key="frame" x="0.0" y="461" width="320" height="42"/>
<subviews>
<button opaque="NO" contentMode="scaleToFill" fixedFrame="YES" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="contactAdd" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="CaM-o5-SSY">
<rect key="frame" x="15" y="10" width="22" height="22"/>
<state key="normal">
<color key="titleShadowColor" white="0.5" alpha="1" colorSpace="calibratedWhite"/>
</state>
</button>
<button opaque="NO" contentMode="scaleToFill" fixedFrame="YES" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="roundedRect" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="68X-OV-UbA">
<rect key="frame" x="90" y="6" width="37" height="30"/>
<state key="normal" title="Edit">
<color key="titleShadowColor" white="0.5" alpha="1" colorSpace="calibratedWhite"/>
</state>
</button>
<button opaque="NO" contentMode="scaleToFill" fixedFrame="YES" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="roundedRect" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="Nxx-XB-evf">
<rect key="frame" x="270" y="6" width="37" height="30"/>
<state key="normal" title="Trash"/>
</button>
<button opaque="NO" contentMode="scaleToFill" fixedFrame="YES" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="roundedRect" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="KaG-Z3-g4V">
<rect key="frame" x="183" y="6" width="35" height="30"/>
<state key="normal" title="Sync">
<color key="titleShadowColor" white="0.5" alpha="1" colorSpace="calibratedWhite"/>
</state>
</button>
</subviews>
<color key="backgroundColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
</view>
</subviews>
<color key="backgroundColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
<gestureRecognizers/>
<constraints>
<constraint firstItem="Rdr-iN-Ybe" firstAttribute="top" secondItem="tcU-YS-7RG" secondAttribute="bottom" constant="4" id="6E5-xg-Kq4"/>
<constraint firstAttribute="bottom" secondItem="Rdr-iN-Ybe" secondAttribute="bottom" constant="1" id="ANv-oy-oaB"/>
<constraint firstItem="DqD-XB-qDa" firstAttribute="bottom" secondItem="Dh1-ev-PAu" secondAttribute="bottom" id="BAQ-qz-VPO"/>
<constraint firstItem="DqD-XB-qDa" firstAttribute="trailing" secondItem="Dh1-ev-PAu" secondAttribute="trailing" id="E4k-Jc-cdH"/>
<constraint firstAttribute="centerX" secondItem="tcU-YS-7RG" secondAttribute="centerX" id="GZ9-Oj-Xm8"/>
<constraint firstItem="DqD-XB-qDa" firstAttribute="top" secondItem="Dh1-ev-PAu" secondAttribute="top" id="Gap-eU-Qsv"/>
<constraint firstItem="DqD-XB-qDa" firstAttribute="leading" secondItem="Dh1-ev-PAu" secondAttribute="leading" id="TPb-pq-fW7"/>
<constraint firstItem="Rdr-iN-Ybe" firstAttribute="top" secondItem="DqD-XB-qDa" secondAttribute="bottom" constant="3" id="WdT-ln-Jkl"/>
<constraint firstItem="DqD-XB-qDa" firstAttribute="leading" secondItem="ZQC-xj-gZE" secondAttribute="leading" id="XCM-vM-IXY"/>
<constraint firstItem="DqD-XB-qDa" firstAttribute="leading" secondItem="Rdr-iN-Ybe" secondAttribute="leading" id="ZxX-3b-iKW"/>
<constraint firstItem="tcU-YS-7RG" firstAttribute="leading" secondItem="DqD-XB-qDa" secondAttribute="leading" id="bvY-tZ-DMG"/>
<constraint firstItem="DqD-XB-qDa" firstAttribute="trailing" secondItem="tcU-YS-7RG" secondAttribute="trailing" id="mba-fH-FP9"/>
<constraint firstItem="DqD-XB-qDa" firstAttribute="trailing" secondItem="Rdr-iN-Ybe" secondAttribute="trailing" id="y9c-dy-5t3"/>
<constraint firstItem="DqD-XB-qDa" firstAttribute="top" secondItem="ZQC-xj-gZE" secondAttribute="top" constant="64" id="yCY-EX-hN5"/>
</constraints>
<simulatedNavigationBarMetrics key="simulatedTopBarMetrics" translucent="NO" prompted="NO"/>
<simulatedScreenMetrics key="simulatedDestinationMetrics" type="retina4"/>
<connections>
<outletCollection property="gestureRecognizers" destination="jwt-nf-kvG" appends="YES" id="w6f-LW-HtL"/>
</connections>
<point key="canvasLocation" x="343" y="279"/>
</view>
<tapGestureRecognizer id="jwt-nf-kvG">
<connections>
<outlet property="delegate" destination="-1" id="kIz-ve-jBk"/>
</connections>
</tapGestureRecognizer>
</objects>
</document>
================================================
FILE: BrewMobile/View/BrewNewPhaseViewController.swift
================================================
//
// BrewNewPhaseViewController.swift
// BrewMobile
//
// Created by Ágnes Vásárhelyi on 08/11/14.
// Copyright (c) 2014 Ágnes Vásárhelyi. All rights reserved.
//
import UIKit
import ReactiveCocoa
class BrewNewPhaseViewController : UIViewController {
@IBOutlet weak var minTextField: UITextField!
@IBOutlet weak var tempTextField: UITextField!
@IBOutlet weak var minStepper: UIStepper!
@IBOutlet weak var tempStepper: UIStepper!
@IBOutlet weak var addButton: UIButton!
@IBOutlet weak var feedbackLabel: UILabel!
let brewDesignerViewModel: BrewDesignerViewModel
var cocoaActionAdd: CocoaAction!
init(brewDesignerViewModel: BrewDesignerViewModel) {
self.brewDesignerViewModel = brewDesignerViewModel
super.init(nibName:"BrewNewPhaseViewController", bundle: nil)
}
required init?(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
override func viewDidLoad() {
super.viewDidLoad()
let addAction = Action<Void, Void, NSError> {
let newPhase = BrewPhase(jobEnd:"", min:Int(self.minStepper.value), temp:Float(self.tempStepper.value), tempReached:false, inProgress:false)
var newPhases = self.brewDesignerViewModel.phases.value
newPhases.append(newPhase)
self.brewDesignerViewModel.phases.value = newPhases
return SignalProducer.empty
}
cocoaActionAdd = CocoaAction(addAction, input: ())
addButton.addTarget(cocoaActionAdd, action: CocoaAction.selector, forControlEvents: .TouchUpInside)
addAction.executing.producer
.on( next: { executing in
if executing {
self.feedbackLabel.text = "Phase added"
UIView.animateWithDuration(0.7, animations: { () -> Void in
self.feedbackLabel.alpha = 1.0
}, completion: { (Bool) -> Void in
UIView.animateWithDuration(0.7, animations: { () -> Void in
self.feedbackLabel.alpha = 0.0
}, completion: nil)
})
}
})
.start()
let minStepperSignalProducer = minStepper.rac_signalForControlEvents(.ValueChanged).toSignalProducer()
.map(self.mapStepper)
.flatMapError(self.catcher)
let tempStepperSignalProducer = tempStepper.rac_signalForControlEvents(.ValueChanged).toSignalProducer()
.map(self.mapStepper)
.flatMapError(self.catcher)
let minTextSignalProducer = minTextField.rac_textSignalProducer()
.filter(self.nonEmptyFilter)
.map(self.toIntConverter)
.flatMapError(self.catcher)
let tempTextSignalProducer = tempTextField.rac_textSignalProducer()
.filter(self.nonEmptyFilter)
.map(self.toIntConverter)
.flatMapError(self.catcher)
SignalProducer(values: [minStepperSignalProducer, minTextSignalProducer])
.flatten(.Merge)
.on( next: { min in
self.minStepper.value = Double(Int(min))
self.minTextField.text = String(Int(min))
})
.start()
SignalProducer(values: [tempStepperSignalProducer, tempTextSignalProducer])
.flatten(.Merge)
.on( next: { temp in
self.tempStepper.value = Double(Int(temp))
self.tempTextField.text = String(Int(temp))
})
.start()
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
}
// MARK: helper functions
func mapStepper(aStepper: AnyObject?) -> Int {
if let stepper = aStepper as? UIStepper {
return Int(stepper.value)
}
fatalError("stepper should be a UIStepper")
}
func catcher<E>(aInput: E) -> SignalProducer<Int, NoError> {
return SignalProducer.empty
}
func nonEmptyFilter(aInput: String) -> Bool {
return aInput != ""
}
func toIntConverter(aInput: String) -> Int {
return Int(aInput)!
}
}
================================================
FILE: BrewMobile/View/BrewNewPhaseViewController.xib
================================================
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<document type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="3.0" toolsVersion="6254" systemVersion="14B25" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES">
<dependencies>
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="6247"/>
</dependencies>
<objects>
<placeholder placeholderIdentifier="IBFilesOwner" id="-1" userLabel="File's Owner" customClass="BrewNewPhaseViewController" customModule="BrewMobile" customModuleProvider="target">
<connections>
<outlet property="addButton" destination="ohP-fR-VLW" id="BAw-fC-gWs"/>
<outlet property="feedbackLabel" destination="02L-2z-xPc" id="q2j-3d-aOP"/>
<outlet property="minStepper" destination="gPS-Ur-a4r" id="5x6-Fk-QMP"/>
<outlet property="minTextField" destination="kR8-wT-QR1" id="3Ij-dW-pgH"/>
<outlet property="tempStepper" destination="21a-cS-NFD" id="wRL-ZT-Lmf"/>
<outlet property="tempTextField" destination="itg-rt-tF2" id="Bb0-jc-4cx"/>
<outlet property="view" destination="hPt-CF-kI8" id="gzh-yv-S1g"/>
</connections>
</placeholder>
<placeholder placeholderIdentifier="IBFirstResponder" id="-2" customClass="UIResponder"/>
<view contentMode="scaleToFill" id="hPt-CF-kI8">
<rect key="frame" x="0.0" y="0.0" width="320" height="568"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<subviews>
<view contentMode="scaleToFill" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="hQV-AR-m0T">
<rect key="frame" x="0.0" y="92" width="320" height="200"/>
<subviews>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" fixedFrame="YES" text="˚C" textAlignment="right" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="6Cj-ZS-UoZ">
<rect key="frame" x="267" y="69" width="19" height="21"/>
<fontDescription key="fontDescription" name="HelveticaNeue-Light" family="Helvetica Neue" pointSize="17"/>
<color key="textColor" cocoaTouchSystemColor="darkTextColor"/>
<nil key="highlightedColor"/>
</label>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" fixedFrame="YES" text="min" textAlignment="right" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="kt6-zu-vch">
<rect key="frame" x="99" y="69" width="29" height="21"/>
<fontDescription key="fontDescription" name="HelveticaNeue-Light" family="Helvetica Neue" pointSize="17"/>
<color key="textColor" cocoaTouchSystemColor="darkTextColor"/>
<nil key="highlightedColor"/>
</label>
<textField opaque="NO" clipsSubviews="YES" contentMode="scaleToFill" fixedFrame="YES" contentHorizontalAlignment="left" contentVerticalAlignment="center" borderStyle="roundedRect" placeholder="20" textAlignment="center" minimumFontSize="17" translatesAutoresizingMaskIntoConstraints="NO" id="itg-rt-tF2">
<rect key="frame" x="197" y="65" width="62" height="30"/>
<fontDescription key="fontDescription" type="system" pointSize="14"/>
<textInputTraits key="textInputTraits" keyboardType="decimalPad"/>
</textField>
<textField opaque="NO" clipsSubviews="YES" contentMode="scaleToFill" fixedFrame="YES" contentHorizontalAlignment="left" contentVerticalAlignment="center" borderStyle="roundedRect" placeholder="0" textAlignment="center" minimumFontSize="17" translatesAutoresizingMaskIntoConstraints="NO" id="kR8-wT-QR1">
<rect key="frame" x="34" y="65" width="62" height="30"/>
<fontDescription key="fontDescription" type="system" pointSize="14"/>
<textInputTraits key="textInputTraits" keyboardType="decimalPad"/>
</textField>
<stepper opaque="NO" contentMode="scaleToFill" horizontalHuggingPriority="750" verticalHuggingPriority="750" fixedFrame="YES" contentHorizontalAlignment="center" contentVerticalAlignment="center" maximumValue="10000" translatesAutoresizingMaskIntoConstraints="NO" id="gPS-Ur-a4r">
<rect key="frame" x="34" y="103" width="94" height="29"/>
</stepper>
<stepper opaque="NO" contentMode="scaleToFill" horizontalHuggingPriority="750" verticalHuggingPriority="750" fixedFrame="YES" contentHorizontalAlignment="center" contentVerticalAlignment="center" value="20" maximumValue="10000" translatesAutoresizingMaskIntoConstraints="NO" id="21a-cS-NFD">
<rect key="frame" x="197" y="103" width="94" height="29"/>
</stepper>
<button opaque="NO" contentMode="scaleToFill" fixedFrame="YES" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="roundedRect" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="ohP-fR-VLW">
<rect key="frame" x="137" y="170" width="46" height="30"/>
<state key="normal" title="Add">
<color key="titleShadowColor" white="0.5" alpha="1" colorSpace="calibratedWhite"/>
</state>
</button>
<label opaque="NO" userInteractionEnabled="NO" alpha="0.0" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" fixedFrame="YES" text="" textAlignment="center" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="02L-2z-xPc">
<rect key="frame" x="31" y="8" width="258" height="21"/>
<fontDescription key="fontDescription" name="HelveticaNeue-Light" family="Helvetica Neue" pointSize="17"/>
<color key="textColor" cocoaTouchSystemColor="darkTextColor"/>
<nil key="highlightedColor"/>
</label>
</subviews>
<color key="backgroundColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
</view>
</subviews>
<color key="backgroundColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
<gestureRecognizers/>
<simulatedScreenMetrics key="simulatedDestinationMetrics" type="retina4"/>
</view>
</objects>
</document>
================================================
FILE: BrewMobile/View/BrewViewController.swift
================================================
//
// ViewController.swift
// BrewMobile
//
// Created by Ágnes Vásárhelyi on 19/08/14.
// Copyright (c) 2014 Ágnes Vásárhelyi. All rights reserved.
//
import UIKit
import SwiftyJSON
import ReactiveCocoa
class BrewViewController: UIViewController, UITableViewDelegate, UITableViewDataSource {
let brewViewModel: BrewViewModel
@IBOutlet weak var tempLabel: UILabel!
@IBOutlet weak var pwmLabel: UILabel!
@IBOutlet weak var nameLabel: UILabel!
@IBOutlet weak var startTimeLabel: UILabel!
@IBOutlet weak var phasesTableView: UITableView!
@IBOutlet weak var stopButton: UIButton!
init(brewViewModel: BrewViewModel) {
self.brewViewModel = brewViewModel
super.init(nibName:"BrewViewController", bundle: nil)
self.tabBarItem = UITabBarItem(title: "Brew", image: UIImage(named: "HopIcon"), tag: 0)
}
required init?(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
override func viewDidLoad() {
super.viewDidLoad()
stopButton.addTarget(self.brewViewModel.cocoaActionStop, action: CocoaAction.selector, forControlEvents: .TouchUpInside)
let nib = UINib(nibName: "BrewCell", bundle: nil)
phasesTableView.registerNib(nib, forCellReuseIdentifier: "BrewCell")
self.tempLabel.rac_text <~ self.brewViewModel.temp.producer
.map { temp in
return String(format:"%.2f ˚C", temp)
}
.flatMapError { _ in SignalProducer<String, NoError>.empty }
self.pwmLabel.rac_text <~ self.brewViewModel.pwm.producer
.map { pwm in
return String(format:"PWM %g %%", pwm)
}
.flatMapError { _ in SignalProducer<String, NoError>.empty }
self.brewViewModel.brew.producer
.on (next: { brewState in
self.phasesTableView.reloadData()
if brewState.phases.value.count > 0 {
self.nameLabel.text = "Brewing \(brewState.name.value) at"
} else {
self.nameLabel.text = "We are not brewing :(\nHow is it possible?"
}
self.startTimeLabel.text = brewState.phases.value.count > 0 ? "starting \(brewState.startTime.value)" : ""
})
.start()
}
func stateText(brewPhase: BrewPhase) -> String {
if self.brewViewModel.brew.value.paused.value {
return "paused"
}
switch brewPhase.state {
case State.FINISHED:
return "\(brewPhase.state.stateDescription()) at \(brewPhase.jobEnd)"
case State.HEATING:
if self.brewViewModel.temp.value > brewPhase.temp { return "cooling" }
fallthrough
default:
return brewPhase.state.stateDescription()
}
}
// MARK: UITableViewDataSource
func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return self.brewViewModel.brew.value.phases.value.count
}
func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCellWithIdentifier("BrewCell", forIndexPath: indexPath) as! BrewCell
if self.brewViewModel.brew.value.phases.value.count > indexPath.row {
let brewPhase = self.brewViewModel.brew.value.phases.value[indexPath.row]
let showEnd: Bool = brewPhase.tempReached && brewPhase.inProgress
cell.minLabel.text = showEnd ? "\(brewPhase.min) mins - \(Int(brewPhase.temp)) ˚C, ends: \(brewPhase.jobEnd)" : "\(brewPhase.min) mins - \(Int(brewPhase.temp)) ˚C"
cell.statusLabel.text = "\(self.stateText(brewPhase))"
UIView.animateWithDuration(0.3, animations: { () -> Void in
cell.backgroundColor = brewPhase.state.bgColor()
cell.setTextColorForAllLabels(brewPhase.state == State.INACTIVE ? UIColor.blackColor() : UIColor.whiteColor())
})
}
return cell
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
}
}
================================================
FILE: BrewMobile/View/BrewViewController.xib
================================================
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<document type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="3.0" toolsVersion="7706" systemVersion="14E46" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES">
<dependencies>
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="7703"/>
</dependencies>
<objects>
<placeholder placeholderIdentifier="IBFilesOwner" id="-1" userLabel="File's Owner" customClass="BrewViewController" customModule="BrewMobile" customModuleProvider="target">
<connections>
<outlet property="nameLabel" destination="Egq-fz-xuo" id="1st-M7-W78"/>
<outlet property="phasesTableView" destination="fDc-9C-BHN" id="ddS-r0-g0N"/>
<outlet property="pwmLabel" destination="ssE-4k-7ZS" id="1qY-vv-kf6"/>
<outlet property="startTimeLabel" destination="TJ5-FP-k2J" id="Pul-A4-Eee"/>
<outlet property="stopButton" destination="78v-bG-zsf" id="aDZ-6o-ki8"/>
<outlet property="tempLabel" destination="R8w-X5-zxS" id="ySP-OD-EV9"/>
<outlet property="view" destination="aIA-Io-OTP" id="a6v-7j-rs0"/>
</connections>
</placeholder>
<placeholder placeholderIdentifier="IBFirstResponder" id="-2" customClass="UIResponder"/>
<view contentMode="scaleToFill" id="aIA-Io-OTP">
<rect key="frame" x="0.0" y="0.0" width="320" height="568"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
<subviews>
<tableView clipsSubviews="YES" contentMode="scaleToFill" alwaysBounceVertical="YES" style="plain" separatorStyle="default" allowsSelection="NO" rowHeight="78" sectionHeaderHeight="22" sectionFooterHeight="22" translatesAutoresizingMaskIntoConstraints="NO" id="fDc-9C-BHN" userLabel="phasesTableView">
<rect key="frame" x="0.0" y="121" width="320" height="353"/>
<color key="backgroundColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
<sections/>
<connections>
<outlet property="dataSource" destination="-1" id="min-qr-WUQ"/>
<outlet property="delegate" destination="-1" id="Eko-ae-j5q"/>
</connections>
</tableView>
<label opaque="NO" clipsSubviews="YES" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="" textAlignment="center" lineBreakMode="tailTruncation" numberOfLines="2" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" preferredMaxLayoutWidth="0.0" translatesAutoresizingMaskIntoConstraints="NO" id="Egq-fz-xuo" userLabel="nameLabel">
<rect key="frame" x="50" y="35" width="220" height="0.0"/>
<constraints>
<constraint firstAttribute="height" constant="35" id="Yje-eS-gUy"/>
</constraints>
<fontDescription key="fontDescription" name="HelveticaNeue-Light" family="Helvetica Neue" pointSize="20"/>
<color key="textColor" red="0.0" green="0.0" blue="0.0" alpha="1" colorSpace="calibratedRGB"/>
<nil key="highlightedColor"/>
<variation key="default">
<mask key="constraints">
<exclude reference="Yje-eS-gUy"/>
</mask>
</variation>
</label>
<label opaque="NO" clipsSubviews="YES" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" misplaced="YES" text="" textAlignment="center" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" preferredMaxLayoutWidth="0.0" translatesAutoresizingMaskIntoConstraints="NO" id="R8w-X5-zxS" userLabel="tempLabel">
<rect key="frame" x="30" y="38" width="0.0" height="35"/>
<constraints>
<constraint firstAttribute="height" constant="35" id="m9X-iV-60v"/>
</constraints>
<fontDescription key="fontDescription" name="HelveticaNeue-Light" family="Helvetica Neue" pointSize="25"/>
<color key="textColor" red="0.0" green="0.0" blue="0.0" alpha="1" colorSpace="calibratedRGB"/>
<nil key="highlightedColor"/>
</label>
<label opaque="NO" clipsSubviews="YES" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="" textAlignment="center" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" preferredMaxLayoutWidth="0.0" translatesAutoresizingMaskIntoConstraints="NO" id="ssE-4k-7ZS" userLabel="pwmLabel">
<rect key="frame" x="80" y="38" width="0.0" height="35"/>
<constraints>
<constraint firstAttribute="height" constant="35" id="DXD-LH-Lob"/>
<constraint firstAttribute="height" relation="greaterThanOrEqual" id="csC-fz-P6W"/>
</constraints>
<fontDescription key="fontDescription" name="HelveticaNeue-Light" family="Helvetica Neue" pointSize="25"/>
<color key="textColor" red="0.0" green="0.0" blue="0.0" alpha="1" colorSpace="calibratedRGB"/>
<nil key="highlightedColor"/>
</label>
<label opaque="NO" clipsSubviews="YES" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="" textAlignment="center" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" preferredMaxLayoutWidth="0.0" translatesAutoresizingMaskIntoConstraints="NO" id="TJ5-FP-k2J" userLabel="startTimeLabel">
<rect key="frame" x="160" y="76" width="0.0" height="35"/>
<constraints>
<constraint firstAttribute="height" constant="35" id="lyO-0p-1NU"/>
</constraints>
<fontDescription key="fontDescription" name="HelveticaNeue-Light" family="Helvetica Neue" pointSize="20"/>
<color key="textColor" red="0.0" green="0.0" blue="0.0" alpha="1" colorSpace="calibratedRGB"/>
<nil key="highlightedColor"/>
</label>
<view contentMode="scaleToFill" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="Pyf-va-IwV">
<rect key="frame" x="0.0" y="477" width="320" height="42"/>
<subviews>
<button opaque="NO" contentMode="scaleToFill" fixedFrame="YES" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="roundedRect" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="78v-bG-zsf">
<rect key="frame" x="8" y="4" width="46" height="30"/>
<state key="normal" title="Stop"/>
</button>
</subviews>
<color key="backgroundColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
</view>
</subviews>
<color key="backgroundColor" white="1" alpha="1" colorSpace="custom" customColorSpace="calibratedWhite"/>
<constraints>
<constraint firstAttribute="bottom" secondItem="fDc-9C-BHN" secondAttribute="bottom" constant="94" id="2GS-ys-sTp"/>
<constraint firstItem="ssE-4k-7ZS" firstAttribute="centerY" secondItem="R8w-X5-zxS" secondAttribute="centerY" id="9vn-fa-EAv"/>
<constraint firstAttribute="centerX" secondItem="fDc-9C-BHN" secondAttribute="centerX" id="CTq-PJ-OD4"/>
<constraint firstItem="R8w-X5-zxS" firstAttribute="top" secondItem="Egq-fz-xuo" secondAttribute="bottom" constant="3" id="EsE-j3-dYN"/>
<constraint firstAttribute="centerX" secondItem="TJ5-FP-k2J" secondAttribute="centerX" id="MKM-4H-wwb"/>
<constraint firstItem="Egq-fz-xuo" firstAttribute="top" secondItem="aIA-Io-OTP" secondAttribute="top" constant="35" id="R2Z-8a-60t"/>
<constraint firstItem="fDc-9C-BHN" firstAttribute="leading" secondItem="aIA-Io-OTP" secondAttribute="leading" id="VaX-K7-RRV"/>
<constraint firstItem="fDc-9C-BHN" firstAttribute="top" secondItem="TJ5-FP-k2J" secondAttribute="bottom" constant="10" id="XZK-t1-9EJ"/>
<constraint firstAttribute="trailing" secondItem="fDc-9C-BHN" secondAttribute="trailing" id="Zt3-Mu-2gl"/>
<constraint firstAttribute="centerX" secondItem="Egq-fz-xuo" secondAttribute="centerX" id="d8y-Le-23F"/>
<constraint firstItem="R8w-X5-zxS" firstAttribute="centerX" secondItem="aIA-Io-OTP" secondAttribute="centerX" id="fIq-xw-c76"/>
<constraint firstItem="ssE-4k-7ZS" firstAttribute="leading" secondItem="R8w-X5-zxS" secondAttribute="trailing" constant="30" id="jRY-DD-VYB"/>
<constraint firstItem="R8w-X5-zxS" firstAttribute="leading" secondItem="Egq-fz-xuo" secondAttribute="leading" id="new-Px-2AN"/>
<constraint firstItem="TJ5-FP-k2J" firstAttribute="top" secondItem="R8w-X5-zxS" secondAttribute="bottom" constant="3" id="uai-PN-cl1"/>
<constraint firstItem="R8w-X5-zxS" firstAttribute="leading" secondItem="aIA-Io-OTP" secondAttribute="leading" constant="50" id="w4P-bk-Oa3"/>
</constraints>
<simulatedTabBarMetrics key="simulatedBottomBarMetrics"/>
<simulatedScreenMetrics key="simulatedDestinationMetrics" type="retina4"/>
<variation key="default">
<mask key="constraints">
<exclude reference="fIq-xw-c76"/>
</mask>
</variation>
</view>
</objects>
</document>
================================================
FILE: BrewMobile/View/PhaseCell.swift
================================================
//
// PhaseCell.swift
// BrewMobile
//
// Created by Agnes Vasarhelyi on 04/01/15.
// Copyright (c) 2015 Ágnes Vásárhelyi. All rights reserved.
//
import UIKit
class PhaseCell: UITableViewCell {
@IBOutlet weak var phaseLabel: UILabel!
}
================================================
FILE: BrewMobile/View/PhaseCell.xib
================================================
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<document type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="3.0" toolsVersion="6724" systemVersion="14B25" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES">
<dependencies>
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="6711"/>
<capability name="Constraints to layout margins" minToolsVersion="6.0"/>
</dependencies>
<objects>
<placeholder placeholderIdentifier="IBFilesOwner" id="-1" userLabel="File's Owner"/>
<placeholder placeholderIdentifier="IBFirstResponder" id="-2" customClass="UIResponder"/>
<tableViewCell contentMode="scaleToFill" selectionStyle="blue" hidesAccessoryWhenEditing="NO" indentationLevel="1" indentationWidth="0.0" reuseIdentifier="PhaseCell" id="X8E-jD-963" customClass="PhaseCell" customModule="BrewMobile" customModuleProvider="target">
<rect key="frame" x="0.0" y="0.0" width="320" height="60"/>
<autoresizingMask key="autoresizingMask"/>
<tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" tableViewCell="X8E-jD-963" id="6a5-ga-qF3">
<autoresizingMask key="autoresizingMask"/>
<subviews>
<label opaque="NO" clipsSubviews="YES" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" preferredMaxLayoutWidth="0.0" translatesAutoresizingMaskIntoConstraints="NO" id="m7t-v3-OJf" userLabel="minLabel">
<rect key="frame" x="18" y="16" width="285" height="28"/>
<constraints>
<constraint firstAttribute="width" constant="285" id="6dR-yH-ZIa"/>
</constraints>
<fontDescription key="fontDescription" name="HelveticaNeue-Light" family="Helvetica Neue" pointSize="17"/>
<nil key="highlightedColor"/>
</label>
</subviews>
<constraints>
<constraint firstItem="m7t-v3-OJf" firstAttribute="leading" secondItem="6a5-ga-qF3" secondAttribute="leadingMargin" constant="10" id="dIu-Ge-UHu"/>
<constraint firstAttribute="centerY" secondItem="m7t-v3-OJf" secondAttribute="centerY" constant="-0.25" id="fE7-72-edi"/>
<constraint firstAttribute="bottomMargin" secondItem="m7t-v3-OJf" secondAttribute="bottom" constant="7.5" id="j4b-cl-zws"/>
<constraint firstItem="m7t-v3-OJf" firstAttribute="top" secondItem="6a5-ga-qF3" secondAttribute="topMargin" constant="8" id="sca-c3-ess"/>
</constraints>
</tableViewCellContentView>
<connections>
<outlet property="phaseLabel" destination="m7t-v3-OJf" id="d4i-W2-sBT"/>
</connections>
<point key="canvasLocation" x="290" y="237"/>
</tableViewCell>
</objects>
</document>
================================================
FILE: BrewMobile/ViewModel/BrewDesignerViewModel.swift
================================================
//
// BrewDesignerViewModel.swift
// BrewMobile
//
// Created by Agnes Vasarhelyi on 01/03/15.
// Copyright (c) 2015 Ágnes Vásárhelyi. All rights reserved.
//
import Foundation
import ReactiveCocoa
class BrewDesignerViewModel : NSObject {
let brewManager: BrewManager
var cocoaActionSync: CocoaAction!
let phases = MutableProperty(PhaseArray())
let name = MutableProperty("")
let startTime = MutableProperty("")
let brewState = MutableProperty(BrewState())
let hasPhases = MutableProperty(false)
let validName = MutableProperty(false)
let validBeer = MutableProperty(false)
var newState: BrewState = BrewState()
init(brewManager: BrewManager) {
self.brewManager = brewManager
super.init()
brewState.value = (BrewState(name: name, startTime: startTime, phases: self.phases, paused: false, inProgress: false))
hasPhases <~ self.phases.producer
.map { $0.count > 0 }
validName <~ self.brewState.producer
.map{ $0.name.value.characters.count > 0 }
validBeer <~ combineLatest(hasPhases.producer, validName.producer)
.map { $0 && $1 }
cocoaActionSync = CocoaAction(brewManager.syncBrewAction, input: brewState.value)
}
}
================================================
FILE: BrewMobile/ViewModel/BrewViewModel.swift
================================================
//
// BrewViewModel.swift
// BrewMobile
//
// Created by Agnes Vasarhelyi on 04/01/15.
// Copyright (c) 2015 Ágnes Vásárhelyi. All rights reserved.
//
import Foundation
import ReactiveCocoa
class BrewViewModel : NSObject {
var cocoaActionStop: CocoaAction!
let temp = MutableProperty<Float>(0.0)
let brew = MutableProperty(BrewState())
let pwm = MutableProperty<Float>(0.0)
let brewManager: BrewManager
init(brewManager: BrewManager) {
self.brewManager = brewManager
super.init()
self.brewManager.connectToHost()
cocoaActionStop = CocoaAction(brewManager.stopBrewAction, input: ())
temp <~ self.brewManager.temp
brew <~ self.brewManager.brew
pwm <~ self.brewManager.pwm
}
}
================================================
FILE: BrewMobile.xcodeproj/project.pbxproj
================================================
// !$*UTF8*$!
{
archiveVersion = 1;
classes = {
};
objectVersion = 46;
objects = {
/* Begin PBXBuildFile section */
0213ADD21A57E6EB0010F9E1 /* BrewManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0213ADD11A57E6EB0010F9E1 /* BrewManager.swift */; };
023A3AD21C65FC3D004AD22E /* SocketIOClientSwift.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 023A3AD01C65FC3D004AD22E /* SocketIOClientSwift.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; };
0289A94C1A626C2600BD2601 /* ContentParser.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0289A94B1A626C2600BD2601 /* ContentParser.swift */; };
0289A94D1A626C2600BD2601 /* ContentParser.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0289A94B1A626C2600BD2601 /* ContentParser.swift */; };
0289A9521A62B0FF00BD2601 /* RAC.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0289A94F1A62B0FF00BD2601 /* RAC.swift */; };
0289A9531A62B0FF00BD2601 /* RAC.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0289A94F1A62B0FF00BD2601 /* RAC.swift */; };
02BDD66B1AA19BE100E44DC3 /* BrewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 02BDD6611AA19BE100E44DC3 /* BrewCell.swift */; };
02BDD66C1AA19BE100E44DC3 /* BrewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 02BDD6611AA19BE100E44DC3 /* BrewCell.swift */; };
02BDD66D1AA19BE100E44DC3 /* BrewCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = 02BDD6621AA19BE100E44DC3 /* BrewCell.xib */; };
02BDD66E1AA19BE100E44DC3 /* BrewCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = 02BDD6621AA19BE100E44DC3 /* BrewCell.xib */; };
02BDD66F1AA19BE100E44DC3 /* BrewDesignerViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 02BDD6631AA19BE100E44DC3 /* BrewDesignerViewController.swift */; };
02BDD6701AA19BE100E44DC3 /* BrewDesignerViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 02BDD6631AA19BE100E44DC3 /* BrewDesignerViewController.swift */; };
02BDD6711AA19BE100E44DC3 /* BrewDesignerViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 02BDD6641AA19BE100E44DC3 /* BrewDesignerViewController.xib */; };
02BDD6721AA19BE100E44DC3 /* BrewDesignerViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 02BDD6641AA19BE100E44DC3 /* BrewDesignerViewController.xib */; };
02BDD6731AA19BE100E44DC3 /* BrewNewPhaseViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 02BDD6651AA19BE100E44DC3 /* BrewNewPhaseViewController.swift */; };
02BDD6741AA19BE100E44DC3 /* BrewNewPhaseViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 02BDD6651AA19BE100E44DC3 /* BrewNewPhaseViewController.swift */; };
02BDD6751AA19BE100E44DC3 /* BrewNewPhaseViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 02BDD6661AA19BE100E44DC3 /* BrewNewPhaseViewController.xib */; };
02BDD6761AA19BE100E44DC3 /* BrewNewPhaseViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 02BDD6661AA19BE100E44DC3 /* BrewNewPhaseViewController.xib */; };
02BDD6771AA19BE100E44DC3 /* BrewViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 02BDD6671AA19BE100E44DC3 /* BrewViewController.swift */; };
02BDD6781AA19BE100E44DC3 /* BrewViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 02BDD6671AA19BE100E44DC3 /* BrewViewController.swift */; };
02BDD6791AA19BE100E44DC3 /* BrewViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 02BDD6681AA19BE100E44DC3 /* BrewViewController.xib */; };
02BDD67A1AA19BE100E44DC3 /* BrewViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 02BDD6681AA19BE100E44DC3 /* BrewViewController.xib */; };
02BDD67B1AA19BE100E44DC3 /* PhaseCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 02BDD6691AA19BE100E44DC3 /* PhaseCell.swift */; };
02BDD67C1AA19BE100E44DC3 /* PhaseCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 02BDD6691AA19BE100E44DC3 /* PhaseCell.swift */; };
02BDD67D1AA19BE100E44DC3 /* PhaseCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = 02BDD66A1AA19BE100E44DC3 /* PhaseCell.xib */; };
02BDD67E1AA19BE100E44DC3 /* PhaseCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = 02BDD66A1AA19BE100E44DC3 /* PhaseCell.xib */; };
02BDD6841AA19C3800E44DC3 /* BrewPhase.swift in Sources */ = {isa = PBXBuildFile; fileRef = 02BDD6801AA19C3800E44DC3 /* BrewPhase.swift */; };
02BDD6851AA19C3800E44DC3 /* BrewPhase.swift in Sources */ = {isa = PBXBuildFile; fileRef = 02BDD6801AA19C3800E44DC3 /* BrewPhase.swift */; };
02BDD6861AA19C3800E44DC3 /* BrewState.swift in Sources */ = {isa = PBXBuildFile; fileRef = 02BDD6811AA19C3800E44DC3 /* BrewState.swift */; };
02BDD6871AA19C3800E44DC3 /* BrewState.swift in Sources */ = {isa = PBXBuildFile; fileRef = 02BDD6811AA19C3800E44DC3 /* BrewState.swift */; };
02BDD6881AA19C3800E44DC3 /* BrewViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 02BDD6831AA19C3800E44DC3 /* BrewViewModel.swift */; };
02BDD6891AA19C3800E44DC3 /* BrewViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 02BDD6831AA19C3800E44DC3 /* BrewViewModel.swift */; };
02BDD68A1AA19C6200E44DC3 /* BrewManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0213ADD11A57E6EB0010F9E1 /* BrewManager.swift */; };
02BDD68C1AA2FF6700E44DC3 /* BrewDesignerViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 02BDD68B1AA2FF6700E44DC3 /* BrewDesignerViewModel.swift */; };
02BDD68D1AA2FF6700E44DC3 /* BrewDesignerViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 02BDD68B1AA2FF6700E44DC3 /* BrewDesignerViewModel.swift */; };
02C058C31B6529F7001AC3C1 /* ISO8601.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 02C058B91B652990001AC3C1 /* ISO8601.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; };
02C058C41B6529F7001AC3C1 /* ReactiveCocoa.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 02C058BA1B652990001AC3C1 /* ReactiveCocoa.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; };
02C058C51B6529F7001AC3C1 /* Result.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 02C058BB1B652990001AC3C1 /* Result.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; };
02C058C71B6529F7001AC3C1 /* SwiftyJSON.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 02C058BD1B652990001AC3C1 /* SwiftyJSON.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; };
692AAA8919A34C8C00224C4D /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 692AAA8819A34C8C00224C4D /* AppDelegate.swift */; };
692AAA9019A34C8C00224C4D /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 692AAA8F19A34C8C00224C4D /* Images.xcassets */; };
69A1102619CB38B900108B46 /* BrewPhaseTestCase.swift in Sources */ = {isa = PBXBuildFile; fileRef = 69A1102519CB38B900108B46 /* BrewPhaseTestCase.swift */; };
69A1102D19CB596700108B46 /* BrewStateTestCase.swift in Sources */ = {isa = PBXBuildFile; fileRef = 69A1102C19CB596700108B46 /* BrewStateTestCase.swift */; };
69EC2A8D19CC3439008108D8 /* ContentParserTestCase.swift in Sources */ = {isa = PBXBuildFile; fileRef = 69EC2A8C19CC3439008108D8 /* ContentParserTestCase.swift */; };
/* End PBXBuildFile section */
/* Begin PBXContainerItemProxy section */
692AAA9619A34C8C00224C4D /* PBXContainerItemProxy */ = {
isa = PBXContainerItemProxy;
containerPortal = 692AAA7B19A34C8C00224C4D /* Project object */;
proxyType = 1;
remoteGlobalIDString = 692AAA8219A34C8C00224C4D;
remoteInfo = BrewMobile;
};
/* End PBXContainerItemProxy section */
/* Begin PBXCopyFilesBuildPhase section */
0213ADC81A57DB480010F9E1 /* Embed Frameworks */ = {
isa = PBXCopyFilesBuildPhase;
buildActionMask = 2147483647;
dstPath = "";
dstSubfolderSpec = 10;
files = (
02C058C31B6529F7001AC3C1 /* ISO8601.framework in Embed Frameworks */,
02C058C41B6529F7001AC3C1 /* ReactiveCocoa.framework in Embed Frameworks */,
023A3AD21C65FC3D004AD22E /* SocketIOClientSwift.framework in Embed Frameworks */,
02C058C51B6529F7001AC3C1 /* Result.framework in Embed Frameworks */,
02C058C71B6529F7001AC3C1 /* SwiftyJSON.framework in Embed Frameworks */,
);
name = "Embed Frameworks";
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXCopyFilesBuildPhase section */
/* Begin PBXFileReference section */
0213ADD11A57E6EB0010F9E1 /* BrewManager.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = BrewManager.swift; sourceTree = "<group>"; };
023A3AD01C65FC3D004AD22E /* SocketIOClientSwift.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = SocketIOClientSwift.framework; path = Carthage/Build/iOS/SocketIOClientSwift.framework; sourceTree = "<group>"; };
0289A94B1A626C2600BD2601 /* ContentParser.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ContentParser.swift; sourceTree = "<group>"; };
0289A94F1A62B0FF00BD2601 /* RAC.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = RAC.swift; sourceTree = "<group>"; };
02BDD6611AA19BE100E44DC3 /* BrewCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = BrewCell.swift; sourceTree = "<group>"; };
02BDD6621AA19BE100E44DC3 /* BrewCell.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = BrewCell.xib; sourceTree = "<group>"; };
02BDD6631AA19BE100E44DC3 /* BrewDesignerViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = BrewDesignerViewController.swift; sourceTree = "<group>"; };
02BDD6641AA19BE100E44DC3 /* BrewDesignerViewController.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = BrewDesignerViewController.xib; sourceTree = "<group>"; };
02BDD6651AA19BE100E44DC3 /* BrewNewPhaseViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = BrewNewPhaseViewController.swift; sourceTree = "<group>"; };
02BDD6661AA19BE100E44DC3 /* BrewNewPhaseViewController.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = BrewNewPhaseViewController.xib; sourceTree = "<group>"; };
02BDD6671AA19BE100E44DC3 /* BrewViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = BrewViewController.swift; sourceTree = "<group>"; };
02BDD6681AA19BE100E44DC3 /* BrewViewController.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = BrewViewController.xib; sourceTree = "<group>"; };
02BDD6691AA19BE100E44DC3 /* PhaseCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PhaseCell.swift; sourceTree = "<group>"; };
02BDD66A1AA19BE100E44DC3 /* PhaseCell.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = PhaseCell.xib; sourceTree = "<group>"; };
02BDD6801AA19C3800E44DC3 /* BrewPhase.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = BrewPhase.swift; sourceTree = "<group>"; };
02BDD6811AA19C3800E44DC3 /* BrewState.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = BrewState.swift; sourceTree = "<group>"; };
02BDD6831AA19C3800E44DC3 /* BrewViewModel.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = BrewViewModel.swift; sourceTree = "<group>"; };
02BDD68B1AA2FF6700E44DC3 /* BrewDesignerViewModel.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = BrewDesignerViewModel.swift; sourceTree = "<group>"; };
02C058B91B652990001AC3C1 /* ISO8601.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = ISO8601.framework; path = Carthage/Build/iOS/ISO8601.framework; sourceTree = "<group>"; };
02C058BA1B652990001AC3C1 /* ReactiveCocoa.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = ReactiveCocoa.framework; path = Carthage/Build/iOS/ReactiveCocoa.framework; sourceTree = "<group>"; };
02C058BB1B652990001AC3C1 /* Result.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Result.framework; path = Carthage/Build/iOS/Result.framework; sourceTree = "<group>"; };
02C058BD1B652990001AC3C1 /* SwiftyJSON.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = SwiftyJSON.framework; path = Carthage/Build/iOS/SwiftyJSON.framework; sourceTree = "<group>"; };
692AAA8319A34C8C00224C4D /* BrewMobile.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = BrewMobile.app; sourceTree = BUILT_PRODUCTS_DIR; };
692AAA8719A34C8C00224C4D /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
692AAA8819A34C8C00224C4D /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = "<group>"; };
692AAA8F19A34C8C00224C4D /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Images.xcassets; sourceTree = "<group>"; };
692AAA9519A34C8C00224C4D /* BrewMobileTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = BrewMobileTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; };
692AAA9A19A34C8C00224C4D /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
69A1102519CB38B900108B46 /* BrewPhaseTestCase.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = BrewPhaseTestCase.swift; sourceTree = "<group>"; };
69A1102C19CB596700108B46 /* BrewStateTestCase.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = BrewStateTestCase.swift; sourceTree = "<group>"; };
69EC2A8C19CC3439008108D8 /* ContentParserTestCase.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ContentParserTestCase.swift; sourceTree = "<group>"; };
/* End PBXFileReference section */
/* Begin PBXFrameworksBuildPhase section */
692AAA8019A34C8C00224C4D /* Frameworks */ = {
isa = PBXFrameworksBuildPhase;
buildActionMask = 2147483647;
files = (
);
runOnlyForDeploymentPostprocessing = 0;
};
692AAA9219A34C8C00224C4D /* Frameworks */ = {
isa = PBXFrameworksBuildPhase;
buildActionMask = 2147483647;
files = (
);
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXFrameworksBuildPhase section */
/* Begin PBXGroup section */
0289A94A1A626C0C00BD2601 /* Helpers */ = {
isa = PBXGroup;
children = (
0289A94B1A626C2600BD2601 /* ContentParser.swift */,
);
name = Helpers;
sourceTree = "<group>";
};
0289A94E1A62B0FF00BD2601 /* RACUtils */ = {
isa = PBXGroup;
children = (
0289A94F1A62B0FF00BD2601 /* RAC.swift */,
);
path = RACUtils;
sourceTree = "<group>";
};
02BDD6601AA19BE100E44DC3 /* View */ = {
isa = PBXGroup;
children = (
02BDD6611AA19BE100E44DC3 /* BrewCell.swift */,
02BDD6621AA19BE100E44DC3 /* BrewCell.xib */,
02BDD6631AA19BE100E44DC3 /* BrewDesignerViewController.swift */,
02BDD6641AA19BE100E44DC3 /* BrewDesignerViewController.xib */,
02BDD6651AA19BE100E44DC3 /* BrewNewPhaseViewController.swift */,
02BDD6661AA19BE100E44DC3 /* BrewNewPhaseViewController.xib */,
02BDD6671AA19BE100E44DC3 /* BrewViewController.swift */,
02BDD6681AA19BE100E44DC3 /* BrewViewController.xib */,
02BDD6691AA19BE100E44DC3 /* PhaseCell.swift */,
02BDD66A1AA19BE100E44DC3 /* PhaseCell.xib */,
);
path = View;
sourceTree = "<group>";
};
02BDD67F1AA19C3800E44DC3 /* Model */ = {
isa = PBXGroup;
children = (
02BDD6801AA19C3800E44DC3 /* BrewPhase.swift */,
02BDD6811AA19C3800E44DC3 /* BrewState.swift */,
);
path = Model;
sourceTree = "<group>";
};
02BDD6821AA19C3800E44DC3 /* ViewModel */ = {
isa = PBXGroup;
children = (
02BDD6831AA19C3800E44DC3 /* BrewViewModel.swift */,
02BDD68B1AA2FF6700E44DC3 /* BrewDesignerViewModel.swift */,
);
path = ViewModel;
sourceTree = "<group>";
};
692AAA7A19A34C8B00224C4D = {
isa = PBXGroup;
children = (
692AAA8519A34C8C00224C4D /* BrewMobile */,
692AAA9819A34C8C00224C4D /* BrewMobileTests */,
692AAA8419A34C8C00224C4D /* Products */,
F3641B66629A474A89086F3F /* Frameworks */,
);
sourceTree = "<group>";
};
692AAA8419A34C8C00224C4D /* Products */ = {
isa = PBXGroup;
children = (
692AAA8319A34C8C00224C4D /* BrewMobile.app */,
692AAA9519A34C8C00224C4D /* BrewMobileTests.xctest */,
);
name = Products;
sourceTree = "<group>";
};
692AAA8519A34C8C00224C4D /* BrewMobile */ = {
isa = PBXGroup;
children = (
02BDD67F1AA19C3800E44DC3 /* Model */,
02BDD6601AA19BE100E44DC3 /* View */,
02BDD6821AA19C3800E44DC3 /* ViewModel */,
0289A94A1A626C0C00BD2601 /* Helpers */,
0289A94E1A62B0FF00BD2601 /* RACUtils */,
0213ADD11A57E6EB0010F9E1 /* BrewManager.swift */,
692AAA8819A34C8C00224C4D /* AppDelegate.swift */,
692AAA8F19A34C8C00224C4D /* Images.xcassets */,
692AAA8619A34C8C00224C4D /* Supporting Files */,
);
path = BrewMobile;
sourceTree = "<group>";
};
692AAA8619A34C8C00224C4D /* Supporting Files */ = {
isa = PBXGroup;
children = (
692AAA8719A34C8C00224C4D /* Info.plist */,
);
name = "Supporting Files";
sourceTree = "<group>";
};
692AAA9819A34C8C00224C4D /* BrewMobileTests */ = {
isa = PBXGroup;
children = (
69A1102519CB38B900108B46 /* BrewPhaseTestCase.swift */,
69A1102C19CB596700108B46 /* BrewStateTestCase.swift */,
69EC2A8C19CC3439008108D8 /* ContentParserTestCase.swift */,
692AAA9919A34C8C00224C4D /* Supporting Files */,
);
path = BrewMobileTests;
sourceTree = "<group>";
};
692AAA9919A34C8C00224C4D /* Supporting Files */ = {
isa = PBXGroup;
children = (
692AAA9A19A34C8C00224C4D /* Info.plist */,
);
name = "Supporting Files";
sourceTree = "<group>";
};
F3641B66629A474A89086F3F /* Frameworks */ = {
isa = PBXGroup;
children = (
023A3AD01C65FC3D004AD22E /* SocketIOClientSwift.framework */,
02C058B91B652990001AC3C1 /* ISO8601.framework */,
02C058BA1B652990001AC3C1 /* ReactiveCocoa.framework */,
02C058BB1B652990001AC3C1 /* Result.framework */,
02C058BD1B652990001AC3C1 /* SwiftyJSON.framework */,
);
name = Frameworks;
sourceTree = "<group>";
};
/* End PBXGroup section */
/* Begin PBXNativeTarget section */
692AAA8219A34C8C00224C4D /* BrewMobile */ = {
isa = PBXNativeTarget;
buildConfigurationList = 692AAA9F19A34C8C00224C4D /* Build configuration list for PBXNativeTarget "BrewMobile" */;
buildPhases = (
692AAA7F19A34C8C00224C4D /* Sources */,
692AAA8019A34C8C00224C4D /* Frameworks */,
692AAA8119A34C8C00224C4D /* Resources */,
027E31821A52B7A700802098 /* Carthage copy frameworks */,
0213ADC81A57DB480010F9E1 /* Embed Frameworks */,
);
buildRules = (
);
dependencies = (
);
name = BrewMobile;
productName = BrewMobile;
productReference = 692AAA8319A34C8C00224C4D /* BrewMobile.app */;
productType = "com.apple.product-type.application";
};
692AAA9419A34C8C00224C4D /* BrewMobileTests */ = {
isa = PBXNativeTarget;
buildConfigurationList = 692AAAA219A34C8C00224C4D /* Build configuration list for PBXNativeTarget "BrewMobileTests" */;
buildPhases = (
692AAA9119A34C8C00224C4D /* Sources */,
692AAA9219A34C8C00224C4D /* Frameworks */,
692AAA9319A34C8C00224C4D /* Resources */,
);
buildRules = (
);
dependencies = (
692AAA9719A34C8C00224C4D /* PBXTargetDependency */,
);
name = BrewMobileTests;
productName = BrewMobileTests;
productReference = 692AAA9519A34C8C00224C4D /* BrewMobileTests.xctest */;
productType = "com.apple.product-type.bundle.unit-test";
};
/* End PBXNativeTarget section */
/* Begin PBXProject section */
692AAA7B19A34C8C00224C4D /* Project object */ = {
isa = PBXProject;
attributes = {
LastSwiftMigration = 0700;
LastSwiftUpdateCheck = 0700;
LastUpgradeCheck = 0700;
ORGANIZATIONNAME = "Ágnes Vásárhelyi";
TargetAttributes = {
692AAA8219A34C8C00224C4D = {
CreatedOnToolsVersion = 6.0;
};
692AAA9419A34C8C00224C4D = {
CreatedOnToolsVersion = 6.0;
TestTargetID = 692AAA8219A34C8C00224C4D;
};
};
};
buildConfigurationList = 692AAA7E19A34C8C00224C4D /* Build configuration list for PBXProject "BrewMobile" */;
compatibilityVersion = "Xcode 3.2";
developmentRegion = English;
hasScannedForEncodings = 0;
knownRegions = (
en,
Base,
);
mainGroup = 692AAA7A19A34C8B00224C4D;
productRefGroup = 692AAA8419A34C8C00224C4D /* Products */;
projectDirPath = "";
projectRoot = "";
targets = (
692AAA8219A34C8C00224C4D /* BrewMobile */,
692AAA9419A34C8C00224C4D /* BrewMobileTests */,
);
};
/* End PBXProject section */
/* Begin PBXResourcesBuildPhase section */
692AAA8119A34C8C00224C4D /* Resources */ = {
isa = PBXResourcesBuildPhase;
buildActionMask = 2147483647;
files = (
02BDD6791AA19BE100E44DC3 /* BrewViewController.xib in Resources */,
02BDD6711AA19BE100E44DC3 /* BrewDesignerViewController.xib in Resources */,
02BDD6751AA19BE100E44DC3 /* BrewNewPhaseViewController.xib in Resources */,
02BDD67D1AA19BE100E44DC3 /* PhaseCell.xib in Resources */,
692AAA9019A34C8C00224C4D /* Images.xcassets in Resources */,
02BDD66D1AA19BE100E44DC3 /* BrewCell.xib in Resources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
692AAA9319A34C8C00224C4D /* Resources */ = {
isa = PBXResourcesBuildPhase;
buildActionMask = 2147483647;
files = (
02BDD67E1AA19BE100E44DC3 /* PhaseCell.xib in Resources */,
02BDD66E1AA19BE100E44DC3 /* BrewCell.xib in Resources */,
02BDD6761AA19BE100E44DC3 /* BrewNewPhaseViewController.xib in Resources */,
02BDD67A1AA19BE100E44DC3 /* BrewViewController.xib in Resources */,
02BDD6721AA19BE100E44DC3 /* BrewDesignerViewController.xib in Resources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXResourcesBuildPhase section */
/* Begin PBXShellScriptBuildPhase section */
027E31821A52B7A700802098 /* Carthage copy frameworks */ = {
isa = PBXShellScriptBuildPhase;
buildActionMask = 8;
files = (
);
inputPaths = (
"$(SRCROOT)/Carthage/Build/iOS/SocketIOClientSwift.framework",
"$(SRCROOT)/Carthage/Build/iOS/ISO8601.framework",
"$(SRCROOT)/Carthage/Build/iOS/ReactiveCocoa.framework",
"$(SRCROOT)/Carthage/Build/iOS/Result.framework",
"$(SRCROOT)/Carthage/Build/iOS/SwiftyJSON.framework",
);
name = "Carthage copy frameworks";
outputPaths = (
);
runOnlyForDeploymentPostprocessing = 1;
shellPath = /bin/sh;
shellScript = "/usr/local/bin/carthage copy-frameworks";
};
/* End PBXShellScriptBuildPhase section */
/* Begin PBXSourcesBuildPhase section */
692AAA7F19A34C8C00224C4D /* Sources */ = {
isa = PBXSourcesBuildPhase;
buildActionMask = 2147483647;
files = (
692AAA8919A34C8C00224C4D /* AppDelegate.swift in Sources */,
02BDD68C1AA2FF6700E44DC3 /* BrewDesignerViewModel.swift in Sources */,
02BDD66B1AA19BE100E44DC3 /* BrewCell.swift in Sources */,
02BDD6731AA19BE100E44DC3 /* BrewNewPhaseViewController.swift in Sources */,
02BDD67B1AA19BE100E44DC3 /* PhaseCell.swift in Sources */,
02BDD6881AA19C3800E44DC3 /* BrewViewModel.swift in Sources */,
02BDD6771AA19BE100E44DC3 /* BrewViewController.swift in Sources */,
0213ADD21A57E6EB0010F9E1 /* BrewManager.swift in Sources */,
0289A9521A62B0FF00BD2601 /* RAC.swift in Sources */,
02BDD66F1AA19BE100E44DC3 /* BrewDesignerViewController.swift in Sources */,
02BDD6861AA19C3800E44DC3 /* BrewState.swift in Sources */,
0289A94C1A626C2600BD2601 /* ContentParser.swift in Sources */,
02BDD6841AA19C3800E44DC3 /* BrewPhase.swift in Sources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
692AAA9119A34C8C00224C4D /* Sources */ = {
isa = PBXSourcesBuildPhase;
buildActionMask = 2147483647;
files = (
02BDD66C1AA19BE100E44DC3 /* BrewCell.swift in Sources */,
02BDD6741AA19BE100E44DC3 /* BrewNewPhaseViewController.swift in Sources */,
02BDD67C1AA19BE100E44DC3 /* PhaseCell.swift in Sources */,
02BDD6781AA19BE100E44DC3 /* BrewViewController.swift in Sources */,
69EC2A8D19CC3439008108D8 /* ContentParserTestCase.swift in Sources */,
0289A9531A62B0FF00BD2601 /* RAC.swift in Sources */,
02BDD68A1AA19C6200E44DC3 /* BrewManager.swift in Sources */,
02BDD6701AA19BE100E44DC3 /* BrewDesignerViewController.swift in Sources */,
02BDD6891AA19C3800E44DC3 /* BrewViewModel.swift in Sources */,
0289A94D1A626C2600BD2601 /* ContentParser.swift in Sources */,
02BDD6871AA19C3800E44DC3 /* BrewState.swift in Sources */,
69A1102619CB38B900108B46 /* BrewPhaseTestCase.swift in Sources */,
02BDD6851AA19C3800E44DC3 /* BrewPhase.swift in Sources */,
02BDD68D1AA2FF6700E44DC3 /* BrewDesignerViewModel.swift in Sources */,
69A1102D19CB596700108B46 /* BrewStateTestCase.swift in Sources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXSourcesBuildPhase section */
/* Begin PBXTargetDependency section */
692AAA9719A34C8C00224C4D /* PBXTargetDependency */ = {
isa = PBXTargetDependency;
target = 692AAA8219A34C8C00224C4D /* BrewMobile */;
targetProxy = 692AAA9619A34C8C00224C4D /* PBXContainerItemProxy */;
};
/* End PBXTargetDependency section */
/* Begin XCBuildConfiguration section */
692AAA9D19A34C8C00224C4D /* Debug */ = {
isa = XCBuildConfiguration;
buildSettings = {
ALWAYS_SEARCH_USER_PATHS = NO;
CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
CLANG_CXX_LIBRARY = "libc++";
CLANG_ENABLE_MODULES = YES;
CLANG_ENABLE_OBJC_ARC = YES;
CLANG_WARN_BOOL_CONVERSION = YES;
CLANG_WARN_CONSTANT_CONVERSION = YES;
CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
CLANG_WARN_EMPTY_BODY = YES;
CLANG_WARN_ENUM_CONVERSION = YES;
CLANG_WARN_INT_CONVERSION = YES;
CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
CLANG_WARN_UNREACHABLE_CODE = YES;
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
CODE_SIGN_IDENTITY = "iPhone Developer";
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
COPY_PHASE_STRIP = NO;
ENABLE_STRICT_OBJC_MSGSEND = YES;
ENABLE_TESTABILITY = YES;
GCC_C_LANGUAGE_STANDARD = gnu99;
GCC_DYNAMIC_NO_PIC = NO;
GCC_OPTIMIZATION_LEVEL = 0;
GCC_PREPROCESSOR_DEFINITIONS = (
"DEBUG=1",
"$(inherited)",
);
GCC_SYMBOLS_PRIVATE_EXTERN = NO;
GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
GCC_WARN_UNDECLARED_SELECTOR = YES;
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
GCC_WARN_UNUSED_FUNCTION = YES;
GCC_WARN_UNUSED_VARIABLE = YES;
IPHONEOS_DEPLOYMENT_TARGET = 8.1;
MTL_ENABLE_DEBUG_INFO = YES;
ONLY_ACTIVE_ARCH = YES;
SDKROOT = iphoneos;
SWIFT_OPTIMIZATION_LEVEL = "-Onone";
};
name = Debug;
};
692AAA9E19A34C8C00224C4D /* Release */ = {
isa = XCBuildConfiguration;
buildSettings = {
ALWAYS_SEARCH_USER_PATHS = NO;
CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
CLANG_CXX_LIBRARY = "libc++";
CLANG_ENABLE_MODULES = YES;
CLANG_ENABLE_OBJC_ARC = YES;
CLANG_WARN_BOOL_CONVERSION = YES;
CLANG_WARN_CONSTANT_CONVERSION = YES;
CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
CLANG_WARN_EMPTY_BODY = YES;
CLANG_WARN_ENUM_CONVERSION = YES;
CLANG_WARN_INT_CONVERSION = YES;
CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
CLANG_WARN_UNREACHABLE_CODE = YES;
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
CODE_SIGN_IDENTITY = "iPhone Developer";
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
ENABLE_NS_ASSERTIONS = NO;
ENABLE_STRICT_OBJC_MSGSEND = YES;
GCC_C_LANGUAGE_STANDARD = gnu99;
GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
GCC_WARN_UNDECLARED_SELECTOR = YES;
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
GCC_WARN_UNUSED_FUNCTION = YES;
GCC_WARN_UNUSED_VARIABLE = YES;
IPHONEOS_DEPLOYMENT_TARGET = 8.1;
MTL_ENABLE_DEBUG_INFO = NO;
SDKROOT = iphoneos;
VALIDATE_PRODUCT = YES;
};
name = Release;
};
692AAAA019A34C8C00224C4D /* Debug */ = {
isa = XCBuildConfiguration;
buildSettings = {
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = LaunchImage;
FRAMEWORK_SEARCH_PATHS = (
"$(inherited)",
"$(PROJECT_DIR)/Carthage/Build/iOS",
);
INFOPLIST_FILE = BrewMobile/Info.plist;
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
PRODUCT_BUNDLE_IDENTIFIER = "com.brew.$(PRODUCT_NAME:rfc1034identifier)";
PRODUCT_NAME = "$(TARGET_NAME)";
};
name = Debug;
};
692AAAA119A34C8C00224C4D /* Release */ = {
isa = XCBuildConfiguration;
buildSettings = {
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = LaunchImage;
FRAMEWORK_SEARCH_PATHS = (
"$(inherited)",
"$(PROJECT_DIR)/Carthage/Build/iOS",
);
INFOPLIST_FILE = BrewMobile/Info.plist;
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
PRODUCT_BUNDLE_IDENTIFIER = "com.brew.$(PRODUCT_NAME:rfc1034identifier)";
PRODUCT_NAME = "$(TARGET_NAME)";
};
name = Release;
};
692AAAA319A34C8C00224C4D /* Debug */ = {
isa = XCBuildConfiguration;
buildSettings = {
BUNDLE_LOADER = "$(BUILT_PRODUCTS_DIR)/BrewMobile.app/BrewMobile";
FRAMEWORK_SEARCH_PATHS = (
"$(SDKROOT)/Developer/Library/Frameworks",
"$(inherited)",
"$(PROJECT_DIR)/Carthage/Build/iOS",
);
GCC_PREPROCESSOR_DEFINITIONS = (
"DEBUG=1",
"$(inherited)",
);
HEADER_SEARCH_PATHS = (
"$(inherited)",
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include,
);
INFOPLIST_FILE = BrewMobileTests/Info.plist;
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks";
PRODUCT_BUNDLE_IDENTIFIER = "com.brew.${PRODUCT_NAME:rfc1034identifier}";
PRODUCT_NAME = "$(TARGET_NAME)";
TEST_HOST = "$(BUNDLE_LOADER)";
};
name = Debug;
};
692AAAA419A34C8C00224C4D /* Release */ = {
isa = XCBuildConfiguration;
buildSettings = {
BUNDLE_LOADER = "$(BUILT_PRODUCTS_DIR)/BrewMobile.app/BrewMobile";
FRAMEWORK_SEARCH_PATHS = (
"$(SDKROOT)/Developer/Library/Frameworks",
"$(inherited)",
"$(PROJECT_DIR)/Carthage/Build/iOS",
);
HEADER_SEARCH_PATHS = (
"$(inherited)",
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include,
);
INFOPLIST_FILE = BrewMobileTests/Info.plist;
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks";
PRODUCT_BUNDLE_IDENTIFIER = "com.brew.${PRODUCT_NAME:rfc1034identifier}";
PRODUCT_NAME = "$(TARGET_NAME)";
TEST_HOST = "$(BUNDLE_LOADER)";
};
name = Release;
};
/* End XCBuildConfiguration section */
/* Begin XCConfigurationList section */
692AAA7E19A34C8C00224C4D /* Build configuration list for PBXProject "BrewMobile" */ = {
isa = XCConfigurationList;
buildConfigurations = (
692AAA9D19A34C8C00224C4D /* Debug */,
692AAA9E19A34C8C00224C4D /* Release */,
);
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Release;
};
692AAA9F19A34C8C00224C4D /* Build configuration list for PBXNativeTarget "BrewMobile" */ = {
isa = XCConfigurationList;
buildConfigurations = (
692AAAA019A34C8C00224C4D /* Debug */,
692AAAA119A34C8C00224C4D /* Release */,
);
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Release;
};
692AAAA219A34C8C00224C4D /* Build configuration list for PBXNativeTarget "BrewMobileTests" */ = {
isa = XCConfigurationList;
buildConfigurations = (
692AAAA319A34C8C00224C4D /* Debug */,
692AAAA419A34C8C00224C4D /* Release */,
);
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Release;
};
/* End XCConfigurationList section */
};
rootObject = 692AAA7B19A34C8C00224C4D /* Project object */;
}
================================================
FILE: BrewMobile.xcodeproj/project.xcworkspace/contents.xcworkspacedata
================================================
<?xml version="1.0" encoding="UTF-8"?>
<Workspace
version = "1.0">
<FileRef
location = "self:BrewMobile.xcodeproj">
</FileRef>
</Workspace>
================================================
FILE: BrewMobile.xcodeproj/xcshareddata/xcschemes/BrewMobile.xcscheme
================================================
<?xml version="1.0" encoding="UTF-8"?>
<Scheme
LastUpgradeVersion = "0700"
version = "1.3">
<BuildAction
parallelizeBuildables = "YES"
buildImplicitDependencies = "YES">
<BuildActionEntries>
<BuildActionEntry
buildForTesting = "YES"
buildForRunning = "YES"
buildForProfiling = "YES"
buildForArchiving = "YES"
buildForAnalyzing = "YES">
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "692AAA8219A34C8C00224C4D"
BuildableName = "BrewMobile.app"
BlueprintName = "BrewMobile"
ReferencedContainer = "container:BrewMobile.xcodeproj">
</BuildableReference>
</BuildActionEntry>
<BuildActionEntry
buildForTesting = "YES"
buildForRunning = "YES"
buildForProfiling = "NO"
buildForArchiving = "NO"
buildForAnalyzing = "YES">
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "692AAA9419A34C8C00224C4D"
BuildableName = "BrewMobileTests.xctest"
BlueprintName = "BrewMobileTests"
ReferencedContainer = "container:BrewMobile.xcodeproj">
</BuildableReference>
</BuildActionEntry>
</BuildActionEntries>
</BuildAction>
<TestAction
buildConfiguration = "Debug"
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
shouldUseLaunchSchemeArgsEnv = "YES">
<Testables>
<TestableReference
skipped = "NO">
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "692AAA9419A34C8C00224C4D"
BuildableName = "BrewMobileTests.xctest"
BlueprintName = "BrewMobileTests"
ReferencedContainer = "container:BrewMobile.xcodeproj">
</BuildableReference>
</TestableReference>
</Testables>
<MacroExpansion>
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "692AAA8219A34C8C00224C4D"
BuildableName = "BrewMobile.app"
BlueprintName = "BrewMobile"
ReferencedContainer = "container:BrewMobile.xcodeproj">
</BuildableReference>
</MacroExpansion>
<AdditionalOptions>
</AdditionalOptions>
</TestAction>
<LaunchAction
buildConfiguration = "Debug"
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
launchStyle = "0"
useCustomWorkingDirectory = "NO"
ignoresPersistentStateOnLaunch = "NO"
debugDocumentVersioning = "YES"
debugServiceExtension = "internal"
allowLocationSimulation = "YES">
<BuildableProductRunnable
runnableDebuggingMode = "0">
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "692AAA8219A34C8C00224C4D"
BuildableName = "BrewMobile.app"
BlueprintName = "BrewMobile"
ReferencedContainer = "container:BrewMobile.xcodeproj">
</BuildableReference>
</BuildableProductRunnable>
<AdditionalOptions>
<AdditionalOption
key = "NSZombieEnabled"
value = "YES"
isEnabled = "YES">
</AdditionalOption>
</AdditionalOptions>
</LaunchAction>
<ProfileAction
buildConfiguration = "Release"
shouldUseLaunchSchemeArgsEnv = "YES"
savedToolIdentifier = ""
useCustomWorkingDirectory = "NO"
debugDocumentVersioning = "YES">
<BuildableProductRunnable
runnableDebuggingMode = "0">
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "692AAA8219A34C8C00224C4D"
BuildableName = "BrewMobile.app"
BlueprintName = "BrewMobile"
ReferencedContainer = "container:BrewMobile.xcodeproj">
</BuildableReference>
</BuildableProductRunnable>
</ProfileAction>
<AnalyzeAction
buildConfiguration = "Debug">
</AnalyzeAction>
<ArchiveAction
buildConfiguration = "Release"
revealArchiveInOrganizer = "YES">
</ArchiveAction>
</Scheme>
================================================
FILE: BrewMobile.xcworkspace/contents.xcworkspacedata
================================================
<?xml version="1.0" encoding="UTF-8"?>
<Workspace
version = "1.0">
<FileRef
location = "group:BrewMobile.xcodeproj">
</FileRef>
</Workspace>
================================================
FILE: BrewMobileTests/BrewPhaseTestCase.swift
================================================
//
// BrewPhaseTestCase.swift
// BrewMobile
//
// Created by Ágnes Vásárhelyi on 18/09/14.
// Copyright (c) 2014 Ágnes Vásárhelyi. All rights reserved.
//
import UIKit
import XCTest
class BrewPhaseTestCase: XCTestCase {
var brewPhase = BrewPhase()
override func setUp() {
super.setUp()
brewPhase = BrewPhase(jobEnd: "09:55", min: 30, temp: 45.0, tempReached: false, inProgress: true)
}
override func tearDown() {
super.tearDown()
}
func testJobEnd() {
XCTAssertNotNil(brewPhase.jobEnd, "should have jobEnd")
XCTAssertTrue(brewPhase.jobEnd == "09:55", "expected to be equal")
}
func testMin() {
XCTAssertNotNil(brewPhase.min, "should have min")
XCTAssertTrue(brewPhase.min == 30, "expected to be equal")
}
func testTemp() {
XCTAssertNotNil(brewPhase.temp, "should have temp")
XCTAssertTrue(brewPhase.temp == 45.0, "expected to be equal")
}
func testTempReached() {
XCTAssertNotNil(brewPhase.tempReached, "should have tempReached")
XCTAssertFalse(brewPhase.tempReached, "expected to be false")
}
func testInProgress() {
XCTAssertNotNil(brewPhase.inProgress, "should have inProgress")
XCTAssertTrue(brewPhase.inProgress, "expected to be true")
}
}
================================================
FILE: BrewMobileTests/BrewStateTestCase.swift
================================================
//
// BrewStateTestCase.swift
// BrewMobile
//
// Created by Ágnes Vásárhelyi on 18/09/14.
// Copyright (c) 2014 Ágnes Vásárhelyi. All rights reserved.
//
import UIKit
import XCTest
class BrewStateTestCase: XCTestCase {
var brewState = BrewState()
var brewPhase = BrewPhase()
override func setUp() {
super.setUp()
brewPhase = BrewPhase(jobEnd: ContentParser.formatDate("2014-08-03T11:55:00.000Z"), min: 10, temp: 70, tempReached: false, inProgress: true)
brewState = BrewState(name: "Very IPA", startTime: "10:30", phases: [brewPhase], paused: false, inProgress: true)
}
override func tearDown() {
super.tearDown()
}
func testName() {
XCTAssertNotNil(brewState.name.value, "should have name")
XCTAssertTrue(brewState.name.value == "Very IPA", "expected to be equal")
}
func testStartTime() {
XCTAssertNotNil(brewState.startTime.value, "should have startTime")
XCTAssertTrue(brewState.startTime.value == "10:30", "expected to be equal")
}
func testPhases() {
XCTAssertEqual(brewState.phases.value[0] as BrewPhase, brewPhase, "expected to be equal")
}
func testPaused() {
XCTAssertNotNil(brewState.paused.value, "should have paused")
XCTAssertFalse(brewState.paused.value, "expected to be false")
}
func testInProgress() {
XCTAssertNotNil(brewState.inProgress.value, "should have inProgress")
XCTAssertTrue(brewState.inProgress.value, "expected to be true")
}
}
================================================
FILE: BrewMobileTests/ContentParserTestCase.swift
================================================
//
// ContentParserTestCase.swift
// BrewMobile
//
// Created by Ágnes Vásárhelyi on 19/09/14.
// Copyright (c) 2014 Ágnes Vásárhelyi. All rights reserved.
//
import UIKit
import XCTest
import SwiftyJSON
class ContentParserTestCase: XCTestCase {
var mockBrewState = BrewState()
var mockBrewPhase = BrewPhase()
let currentZone = NSTimeZone.defaultTimeZone()
override func setUp() {
super.setUp()
NSTimeZone.setDefaultTimeZone(NSTimeZone(forSecondsFromGMT: +0))
mockBrewPhase = BrewPhase(jobEnd: ContentParser.formatDate("2014-08-03T11:55:00.000Z"), min: 10, temp: 70, tempReached: false, inProgress: true)
mockBrewState = BrewState(name: "Very IPA", startTime: ContentParser.formatDate("2014-08-03T09:55:00.000Z"), phases: [mockBrewPhase], paused: false, inProgress: true)
}
override func tearDown() {
NSTimeZone.setDefaultTimeZone(currentZone)
super.tearDown()
}
//MARK: Testing BrewState object parsing
func testParseBrewState() {
let brewPhaseJSON = ["jobEnd" : "2014-08-03T11:55:00.000Z", "min" : 10, "temp" : 70, "tempReached" : 0, "inProgress" : 1]
let brewStateJSON = ["name" : "Very IPA", "startTime" : "2014-08-03T09:55:00.000Z", "phases" : [brewPhaseJSON], "paused" : false, "inProgress" : true]
_ = ContentParser.parseBrewState(JSON(brewStateJSON))
}
func testParseBrewStateWithEmptyJSON() {
let json = ["name" : NSNull(), "startTime" : NSNull(), "phases" : NSNull(), "paused" : NSNull(), "inProgress" : NSNull()]
_ = ContentParser.parseBrewState(JSON(json))
}
func testParseBrewStateWithUnexpectedJSONStructure() {
let json = ["phases" : NSNull(), "paused" : NSNull(), "inProgress" : NSNull()]
_ = ContentParser.parseBrewState(JSON(json))
}
//MARK: Testing BrewPhase object parsing
func testParseBrewPhase() {
let json = ["jobEnd" : "2014-08-03T09:55:00.000Z", "min" : "100", "temp" : "76", "tempReached" : 0, "inProgress" : 1]
_ = ContentParser.parseBrewState(JSON(json))
}
func testParseBrewPhaseWithEmptyJSON() {
let json = ["jobEnd" : NSNull(), "min" : NSNull(), "temp" : NSNull(), "tempReached" : NSNull(), "inProgress" : NSNull()]
_ = ContentParser.parseBrewPhase(JSON(json))
}
func testParseBrewPhaseWithUnexpectedJSONStructure() {
let json = ["tempReached" : 0, "inProgress" : 1]
_ = ContentParser.parseBrewPhase(JSON(json))
}
func testFormatDate() {
let originalDateString = "2014-08-03T09:55:00.000Z"
let formattedDateString = ContentParser.formatDate(originalDateString)
XCTAssertEqual(formattedDateString, "09:55", "expected to be equal")
}
}
================================================
FILE: BrewMobileTests/Info.plist
================================================
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>CFBundleDevelopmentRegion</key>
<string>en</string>
<key>CFBundleExecutable</key>
<string>${EXECUTABLE_NAME}</string>
<key>CFBundleIdentifier</key>
<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>
<key>CFBundleInfoDictionaryVersion</key>
<string>6.0</string>
<key>CFBundleName</key>
<string>${PRODUCT_NAME}</string>
<key>CFBundlePackageType</key>
<string>BNDL</string>
<key>CFBundleShortVersionString</key>
<string>1.0</string>
<key>CFBundleSignature</key>
<string>????</string>
<key>CFBundleVersion</key>
<string>1</string>
</dict>
</plist>
================================================
FILE: Cartfile
================================================
github "socketio/socket.io-client-swift" ~> 5.3.3
github "boredzo/iso-8601-date-formatter" "43210ea91f5ea2baff6ba13d699af5dc267ad374"
github "ReactiveCocoa/ReactiveCocoa" ~> 4.0.1
github "SwiftyJSON/SwiftyJSON" >= 2.2.1
================================================
FILE: Cartfile.resolved
================================================
github "antitypical/Result" "1.0.2"
github "SwiftyJSON/SwiftyJSON" "2.3.3"
github "boredzo/iso-8601-date-formatter" "43210ea91f5ea2baff6ba13d699af5dc267ad374"
github "socketio/socket.io-client-swift" "v5.3.3"
github "ReactiveCocoa/ReactiveCocoa" "v4.0.1"
================================================
FILE: Carthage/Checkouts/ReactiveCocoa/.gitignore
================================================
# Xcode
build/*
*.pbxuser
!default.pbxuser
*.mode1v3
!default.mode1v3
*.mode2v3
!default.mode2v3
*.perspectivev3
!default.perspectivev3
*.xcworkspace
!default.xcworkspace
xcuserdata
profile
*.moved-aside
Carthage/Build
================================================
FILE: Carthage/Checkouts/ReactiveCocoa/.gitmodules
================================================
[submodule "Carthage/Checkouts/Nimble"]
path = Carthage/Checkouts/Nimble
url = https://github.com/Quick/Nimble.git
[submodule "Carthage/Checkouts/Quick"]
path = Carthage/Checkouts/Quick
url = https://github.com/Quick/Quick.git
[submodule "Carthage/Checkouts/xcconfigs"]
path = Carthage/Checkouts/xcconfigs
url = https://github.com/jspahrsummers/xcconfigs.git
[submodule "Carthage/Checkouts/Result"]
path = Carthage/Checkouts/Result
url = https://github.com/antitypical/Result.git
================================================
FILE: Carthage/Checkouts/ReactiveCocoa/.travis.yml
================================================
language: objective-c
osx_image: xcode7.1
before_install: true
install: true
git:
submodules: false
script: script/cibuild ReactiveCocoa-Mac ReactiveCocoa-iOS
notifications:
email: false
slack:
secure: C9QTry5wUG9CfeH3rm3Z19R5rDWqDO7EhHAqHDXBxT6CpGRkTPFliJexpjBYB4sroJ8CiY5ZgTI2sjRBiAdGoE5ZQkfnwSoKQhWXkwo19TnbSnufr3cKO2SZkUhBqOlZcA+mgfjZ7rm2wm7RhpCR/4z8oBXDN4/xv0U5R2fLCLE=
================================================
FILE: Carthage/Checkouts/ReactiveCocoa/CHANGELOG.md
================================================
# 4.0
If you’re new to the Swift API and migrating from RAC 2, start with the [3.0 changes](#30). This section only covers the differences between `3.0` and `4.0`.
Just like in `RAC 3`, because Objective-C is still in widespread use, 99% of `RAC 2.x` code will continue to work under `RAC 4.0` without any changes. That is, `RAC 2.x` primitives are still available in `RAC 4.0`.
`ReactiveCocoa 4.0` targets **Xcode 7.2.x** and **Swift 2.1.x**, and it supports `iOS 8.0`, `watchOS 2.0`, `tvOS 9.0` and `OS X 10.9`.
#### Signal operators are protocol extensions
The biggest change from `RAC 3` to `RAC 4` is that `Signal` and `SignalProducer` operators are implemented as **protocol extensions** instead of global functions. This is similar to many of the collection protocol changes in the `Swift 2` standard
library.
This enables chaining signal operators with normal dot-method calling syntax, which makes autocompleting operators a lot easier.
Previously the custom `|>` was required to enable chaining global functions without a mess of nested calls and parenthesis.
```swift
/// RAC 3
signal
|> filter { $0 % 2 == 0 }
|> map { $0 * $0 }
|> observe { print($0) }
/// RAC 4
signal
.filter { $0 % 2 == 0 }
.map { $0 * $0 }
.observeNext { print($0) }
```
Additionally, this means that `SignalProducer` operators are less “magic”. In RAC 3 the `Signal` operators were implicitly lifted to work on `SignalProducer` via `|>`. This was a point of confusion for some, especially when browsing the
source looking for these operators. Now as protocol extensions, the `SignalProducer` operators are explicitly implemented in terms of their `Signal` counterpart when available.
#### Removal of `|>` custom operator
As already alluded to above, the custom `|>` operator for chaining signals has been removed. Instead standard method calling syntax is used for chaining operators.
#### Event cases are no longer boxed
The improvements to associated enum values in `Swift 2` mean that `Event` case no longer need to be `Box`ed. In fact, the `Box` dependency has been removed completely from `RAC 4`.
#### Replacements for the `start` and `observer` overloads
The `observe` and `start` overloads taking `next`, `error`, etc. optional function parameters have been removed. They’ve been replaced with methods taking a single function with
the target `Event` case — `observeNext`, `startWithNext`, and the same for `failed` and `completed`. See [#2311](https://github.com/ReactiveCocoa/ReactiveCocoa/issues/2311) and [#2318](https://github.com/ReactiveCocoa/ReactiveCocoa/issues/2318) for more details.
#### Renamed `try` and `catch` operators
The `try` and `catch` operators were renamed because of the addition of the error handling keywords with the same name. They are now `attempt` and `flatMapError` respectively. Also, `tryMap` was renamed to `attemptMap` for consistency.
#### `flatten` and `flatMap` are now possible for all 4 combinations of `Signal`+`SignalProducer`
This fills a gap that was missing in `RAC 3`. It’s a common pattern to have signals-of-signals or signals-of-producers.
The addition of `flatten` and `flatMap` over these makes it now possible to work with any combination of `Signal`s and `SignalProducer`s.
#### Renamed `Event.Error` to `Event.Failed`
The `Error` case of `Event` has changed to `Failed`. This aims to help clarify the terminating nature of failure/error events and puts them in the same tense as other terminating cases (`Interrupted` and `Completed`). Likewise, some operations and parameters have been renamed (e.g. `Signal.observeError` is now `Signal.observeFailed`, `Observer.sendError` is now `Observer.sendFailed`).
#### Renamed signal generic parameters
The generic parameters of `Signal`, `SignalProducer`, and other related types
have been renamed to `Value` and `Error` from `T` and `E` respectively. This
is in-line with changes to the standard library to give more descriptive names
to type parameters for increased clarity. This should have limited impact,
only affecting generic, custom signal/producer extensions.
#### Added missing `SignalProducer` operators
There were some `Signal` operators that were missing `SignalProducer` equivalents:
* `takeUntil`
* `combineLatestWith`
* `sampleOn`
* `takeUntilReplacement`
* `zipWith`
#### Added new operators:
* `Signal.on`.
* `Signal.merge(signals:)`.
* `Signal.empty`.
* `skipUntil`.
* `replayLazily` ([#2639](https://github.com/ReactiveCocoa/ReactiveCocoa/issues/2639)).
#### Renamed `PropertyOf<T>` to `AnyProperty<T>`
This is in-line with changes to the standard library in `Swift 2`.
#### Enhancements to `PropertyType`
`MutableProperty` received 3 new methods, similar to those in `Atomic`: `modify`, `swap`, and `withValue`.
Additionally, all `PropertyType`s now have a `signal: Signal<T>` in addition to their existing `producer: SignalProducer<T>` property.
#### Publicized `Bag` and `Atomic`
`Bag` and `Atomic` are now public. These are useful when creating custom operators for RAC types.
#### `SignalProducer.buffer` no longer has a default capacity
In order to force users to think about the desired capacity, this no longer defaults to `Int.max`. Prior to this change one could have inadvertently cached every value emitted by the `SignalProducer`. This needs to be specified manually now.
#### Added `SignalProducer.replayLazily` for multicasting
It’s still recommended to use `SignalProducer.buffer` or `PropertyType` when buffering behavior is desired. However, when you need to compose an existing `SignalProducer` to avoid duplicate side effects, this operator is now available.
The full semantics of the operator are documented in the code, and you can see [#2639](https://github.com/ReactiveCocoa/ReactiveCocoa/issues/2639) for full details.
# 3.0
ReactiveCocoa 3.0 includes the first official Swift API, which is intended to
eventually supplant the Objective-C API entirely.
However, because migration is hard and time-consuming, and because Objective-C
is still in widespread use, 99% of RAC 2.x code will continue to work under RAC
3.0 without any changes.
Since the 3.0 changes are entirely additive, this document will discuss how
concepts from the Objective-C API map to the Swift API. For a complete diff of
all changes, see [the 3.0 pull
request](https://github.com/ReactiveCocoa/ReactiveCocoa/pull/1382).
**[Additions](#additions)**
1. [Parameterized types](#parameterized-types)
1. [Interrupted event](#interrupted-event)
1. [Objective-C bridging](#objective-c-bridging)
**[Replacements](#replacements)**
1. [Hot signals are now Signals](#hot-signals-are-now-signals)
1. [Cold signals are now SignalProducers](#cold-signals-are-now-signalproducers)
1. [Commands are now Actions](#commands-are-now-actions)
1. [Flattening/merging, concatenating, and switching are now one operator](#flatteningmerging-concatenating-and-switching-are-now-one-operator)
1. [Using PropertyType instead of RACObserve and RAC](#using-propertytype-instead-of-racobserve-and-rac)
1. [Using Signal.pipe instead of RACSubject](#using-signalpipe-instead-of-racsubject)
1. [Using SignalProducer.buffer instead of replaying](#using-signalproducerbuffer-instead-of-replaying)
1. [Using startWithSignal instead of multicasting](#using-startwithsignal-instead-of-multicasting)
**[Minor changes](#minor-changes)**
1. [Disposable changes](#disposable-changes)
1. [Scheduler changes](#scheduler-changes)
## Additions
### Parameterized types
Thanks to Swift, **it is now possible to express the type of value that a signal
can send. RAC also requires that the type of errors be specified.**
For example, `Signal<Int, NSError>` is a signal that may send zero or more
integers, and which may send an error of type `NSError`.
**If it is impossible for a signal to error out, use the built-in
[`NoError`](ReactiveCocoa/Swift/Errors.swift) type**
(which can be referred to, but never created) to represent that
case—for example, `Signal<String, NoError>` is a signal that may send zero or
more strings, and which will _not_ send an error under any circumstances.
Together, these additions make it much simpler to reason about signal
interactions, and protect against several kinds of common bugs that occurred in
Objective-C.
### Interrupted event
In addition to the `Next`, `Error`, and `Completed` events that have always been
part of RAC, version 3.0 [adds another terminating
event](https://github.com/ReactiveCocoa/ReactiveCocoa/pull/1735)—called
`Interrupted`—that is used to communicate cancellation.
Now, **whenever a [producer](#cold-signals-are-now-signalproducers) is disposed
of, one final `Interrupted` event will be sent to all consumers,** giving them
a chance to react to the cancellation.
Similarly, observing a [hot signal](#hot-signals-are-now-signals) that has
already terminated will immediately result in an `Interrupted` event, to clearly
indicate that no further events are possible.
This brings disposal semantics more in line with normal event delivery, where
events propagate downstream from producers to consumers. The result is a simpler
model for reasoning about non-erroneous, yet unsuccessful, signal terminations.
**Note:** Custom `Signal` and `SignalProducer` operators should handle any received
`Interrupted` event by forwarding it to their own observers. This ensures that
interruption correctly propagates through the whole signal chain.
### Objective-C bridging
**To support interoperation between the Objective-C APIs introduced in RAC 2 and
the Swift APIs introduced in RAC 3, the framework offers [bridging
functions](ReactiveCocoa/Swift/ObjectiveCBridging.swift)** that can convert types
back and forth between the two.
Because the APIs are based on fundamentally different designs, the conversion is
not always one-to-one; however, every attempt has been made to faithfully
translate the concepts between the two APIs (and languages).
**Common conversions include:**
* The `RACSignal.toSignalProducer` method **†**
* Converts `RACSignal *` to `SignalProducer<AnyObject?, NSError>`
* The `toRACSignal()` function
* Converts `SignalProducer<AnyObject?, ErrorType>` to `RACSignal *`
* Converts `Signal<AnyObject?, ErrorType>` to `RACSignal *`
* The `RACCommand.toAction` method **‡**
* Converts `RACCommand *` to `Action<AnyObject?, AnyObject?, NSError>`
* The `toRACCommand` function **‡**
* Converts `Action<AnyObject?, AnyObject?, ErrorType>` to `RACCommand *`
**†** It is not possible (in the general case) to convert arbitrary `RACSignal`
instances to `Signal`s, because any `RACSignal` subscription could potentially
involve side effects. To obtain a `Signal`, use `RACSignal.toSignalProducer`
followed by `SignalProducer.start`, thereby making those side effects explicit.
**‡** Unfortunately, the `executing` properties of actions and commands are not
synchronized across the API bridge. To ensure consistency, only observe the
`executing` property from the base object (the one passed _into_ the bridge, not
retrieved from it), so updates occur no matter which object is used for
execution.
## Replacements
### Hot signals are now Signals
In the terminology of RAC 2, a “hot” `RACSignal` does not trigger any side effects
when a `-subscribe…` method is called upon it. In other words, hot signals are
entirely producer-driven and push-based, and consumers (subscribers) cannot have
any effect on their lifetime.
This pattern is useful for notifying observers about events that will occur _no
matter what_. For example, a `loading` boolean might flip between true and false
regardless of whether anything is observing it.
Concretely, _every_ `RACSubject` is a kind of hot signal, because the events
being forwarded are not determined by the number of subscribers on the subject.
In RAC 3, **“hot” signals are now solely represented by the
[`Signal`](ReactiveCocoa/Swift/Signal.swift) class**, and “cold” signals have been
[separated into their own type](#cold-signals-are-now-signalproducers). This
reduces complexity by making it clear that no `Signal` object can trigger side
effects when observed.
### Cold signals are now SignalProducers
In the terminology of RAC 2, a “cold” `RACSignal` performs its work one time for
_every_ subscription. In other words, cold signals perform side effects when
a `-subscribe…` method is called upon them, and may be able to cancel
in-progress work if `-dispose` is called upon the returned `RACDisposable`.
This pattern is broadly useful because it minimizes unnecessary work, and
allows operators like `take`, `retry`, `concat`, etc. to manipulate when work is
started and cancelled. Cold signals are also similar to how [futures and
promises](http://en.wikipedia.org/wiki/Futures_and_promises) work, and can be
useful for structuring asynchronous code (like network requests).
In RAC 3, **“cold” signals are now solely represented by the
[`SignalProducer`](ReactiveCocoa/Swift/SignalProducer.swift) class**, which
clearly indicates their relationship to [“hot”
signals](#hot-signals-are-now-signals). As the name indicates, a signal
_producer_ is responsible for creating
a [_signal_](#hot-signals-are-now-signals) (when started), and can
perform work as part of that process—meanwhile, the signal can have any number
of observers without any additional side effects.
### Commands are now Actions
Instead of the ambiguously named `RACCommand`, the Swift API offers the
[`Action`](ReactiveCocoa/Swift/Action.swift) type—named as such because it’s
mainly useful in UI programming—to fulfill the same purpose.
Like the rest of the Swift API, actions are
[parameterized](#parameterized-types) by the types they use. **An action must
indicate the type of input it accepts, the type of output it produces, and
what kinds of errors can occur (if any).** This eliminates a few classes of type
error, and clarifies intention.
Actions are also intended to be simpler overall than their predecessor:
* **Unlike commands, actions are not bound to or dependent upon the main
thread**, making it easier to reason about when they can be executed and when
they will generate notifications.
* **Actions also only support serial execution**, because concurrent execution
was a rarely used feature of `RACCommand` that added significant complexity
to the interface and implementation.
Because actions are frequently used in conjunction with AppKit or UIKit, there
is also a `CocoaAction` class that erases the type parameters of an `Action`,
allowing it to be used from Objective-C.
As an example, an action can be wrapped and bound to `UIControl` like so:
```swift
self.cocoaAction = CocoaAction(underlyingAction)
self.button.addTarget(self.cocoaAction, action: CocoaAction.selector, forControlEvents: UIControlEvents.TouchUpInside)
```
### Flattening/merging, concatenating, and switching are now one operator
RAC 2 offers several operators for transforming a signal-of-signals into one
`RACSignal`, including:
* `-flatten`
* `-flattenMap:`
* `+merge:`
* `-concat`
* `+concat:`
* `-switchToLatest`
Because `-flattenMap:` is the easiest to use, it was often
incorrectly chosen even when concatenation or switching semantics are more
appropriate.
**RAC 3 distills these concepts down into just two operators, `flatten` and `flatMap`.**
Note that these do _not_ have the same behavior as `-flatten` and `-flattenMap:`
from RAC 2. Instead, both accept a “strategy” which determines how the
producer-of-producers should be integrated, which can be one of:
* `.Merge`, which is equivalent to RAC 2’s `-flatten` or `+merge:`
* `.Concat`, which is equivalent to `-concat` or `+concat:`
* `.Latest`, which is equivalent to `-switchToLatest`
This reduces the API surface area, and forces callers to consciously think about
which strategy is most appropriate for a given use.
**For streams of exactly one value, calls to `-flattenMap:` can be replaced with
`flatMap(.Concat)`**, which has the additional benefit of predictable behavior if
the input stream is refactored to have more values in the future.
### Using PropertyType instead of RACObserve and RAC
To be more Swift-like, RAC 3 de-emphasizes [Key-Value Coding](https://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/KeyValueCoding/Articles/KeyValueCoding.html) (KVC)
and [Key-Value Observing](https://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/KeyValueObserving/KeyValueObserving.html) (KVO)
in favor of a less “magical” representation for properties.
**The [`PropertyType` protocol and implementations](ReactiveCocoa/Swift/Property.swift)
replace most uses of the `RACObserve()` and `RAC()` macros.**
For example, `MutableProperty` can be used to represent a property that can be
bound to. If changes to that property should be visible to consumers, it can
additionally be wrapped in `PropertyOf` (to hide the mutable bits) and exposed
publicly.
**If KVC or KVO is required by a specific API**—for example, to observe changes
to `NSOperation.executing`—RAC 3 offers a `DynamicProperty` type that can wrap
those key paths. Use this class with caution, though, as it can’t offer any type
safety, and many APIs (especially in AppKit and UIKit) are not documented to be
KVO-compliant.
### Using Signal.pipe instead of RACSubject
Since the `Signal` type, like `RACSubject`, is [always “hot”](#hot-signals-are-now-signals),
there is a special class method for creating a controllable signal. **The
`Signal.pipe` method can replace the use of subjects**, and expresses intent
better by separating the observing API from the sending API.
To use a pipe, set up observers on the signal as desired, then send values to
the sink:
```swift
let (signal, sink) = Signal<Int, NoError>.pipe()
signal.observe(next: { value in
println(value)
})
// Prints each number
sendNext(sink, 0)
sendNext(sink, 1)
sendNext(sink, 2)
```
### Using SignalProducer.buffer instead of replaying
The producer version of
[`Signal.pipe`](#using-signalpipe-instead-of-racsubject),
**the `SignalProducer.buffer` method can replace replaying** with
`RACReplaySubject` or any of the `-replay…` methods.
Conceptually, `buffer` creates a (optionally bounded) queue for events, much
like `RACReplaySubject`, and replays those events when new `Signal`s are created
from the producer.
For example, to replay the values of an existing `Signal`, it just needs to be
fed into the write end of the buffer:
```swift
let signal: Signal<Int, NoError>
let (producer, sink) = SignalProducer<Int, NoError>.buffer()
// Saves observed values in the buffer
signal.observe(sink)
// Prints each value buffered
producer.start(next: { value in
println(value)
})
```
### Using startWithSignal instead of multicasting
`RACMulticastConnection` and the `-publish` and `-multicast:` operators were
always poorly understood features of RAC 2. In RAC 3, thanks to the `Signal` and
`SignalProducer` split, **the `SignalProducer.startWithSignal` method can
replace multicasting**.
`startWithSignal` allows any number of observers to attach to the created signal
_before_ any work is begun—therefore, the work (and any side effects) still
occurs just once, but the values can be distributed to multiple interested
observers. This fulfills the same purpose of multicasting, in a much clearer and
more tightly-scoped way.
For example:
```swift
let producer = timer(5, onScheduler: QueueScheduler.mainQueueScheduler).take(3)
// Starts just one timer, sending the dates to two different observers as they
// are generated.
producer.startWithSignal { signal, disposable in
signal.observe(next: { date in
println(date)
})
signal.observe(someOtherObserver)
}
```
## Minor changes
### Disposable changes
[Disposables](ReactiveCocoa/Swift/Disposable.swift) haven’t changed much overall
in RAC 3, besides the addition of a protocol and minor naming tweaks.
The biggest change to be aware of is that **setting
`SerialDisposable.innerDisposable` will always dispose of the previous value**,
which helps prevent resource leaks or logic errors from forgetting to dispose
manually.
### Scheduler changes
RAC 3 replaces the multipurpose `RACScheduler` class with two protocols,
[`SchedulerType` and `DateSchedulerType`](ReactiveCocoa/Swift/Scheduler.swift), with multiple implementations of each.
This design indicates and enforces the capabilities of each scheduler using the type
system.
In addition, **the `mainThreadScheduler` has been replaced with `UIScheduler` and
`QueueScheduler.mainQueueScheduler`**. The `UIScheduler` type runs operations as
soon as possible on the main thread—even synchronously (if possible), thereby
replacing RAC 2’s `-performOnMainThread` operator—while
`QueueScheduler.mainQueueScheduler` will always enqueue work after the current
run loop iteration, and can be used to schedule work at a future date.
================================================
FILE: Carthage/Checkouts/ReactiveCocoa/CONTRIBUTING.md
================================================
We love that you're interested in contributing to this project!
To make the process as painless as possible, we have just a couple of guidelines
that should make life easier for everyone involved.
## Prefer Pull Requests
If you know exactly how to implement the feature being suggested or fix the bug
being reported, please open a pull request instead of an issue. Pull requests are easier than
patches or inline code blocks for discussing and merging the changes.
If you can't make the change yourself, please open an issue after making sure
that one isn't already logged.
## Contributing Code
Fork this repository, make it awesomer (preferably in a branch named for the
topic), send a pull request!
All code contributions should match our [coding
conventions](https://github.com/github/objective-c-conventions).
Thanks for contributing! :boom::camel:
================================================
FILE: Carthage/Checkouts/ReactiveCocoa/Cartfile
================================================
github "antitypical/Result" ~> 1.0.2
================================================
FILE: Carthage/Checkouts/ReactiveCocoa/Cartfile.private
================================================
github "jspahrsummers/xcconfigs" "ec5753493605deed7358dec5f9260f503d3ed650"
github "Quick/Quick" ~> 0.8
github "Quick/Nimble" ~> 3.1
================================================
FILE: Carthage/Checkouts/ReactiveCocoa/Cartfile.resolved
================================================
github "Quick/Nimble" "v3.1.0"
github "Quick/Quick" "v0.8.0"
github "antitypical/Result" "1.0.2"
github "jspahrsummers/xcconfigs" "ec5753493605deed7358dec5f9260f503d3ed650"
================================================
FILE: Carthage/Checkouts/ReactiveCocoa/Carthage/Checkouts/Nimble/.gitignore
================================================
.DS_Store
xcuserdata/
build/
.idea
DerivedData/
Nimble.framework.zip
# Carthage
#
# Add this line if you want to avoid checking in source code from Carthage dependencies.
# Carthage/Checkouts
Carthage/Build
================================================
FILE: Carthage/Checkouts/ReactiveCocoa/Carthage/Checkouts/Nimble/.travis.yml
================================================
osx_image: xcode7
language: objective-c
env:
matrix:
- NIMBLE_RUNTIME_IOS_SDK_VERSION=9.0 TYPE=ios
- NIMBLE_RUNTIME_OSX_SDK_VERSION=10.10 TYPE=osx
script: ./test $TYPE
================================================
FILE: Carthage/Checkouts/ReactiveCocoa/Carthage/Checkouts/Nimble/CONTRIBUTING.md
================================================
<!-- START doctoc generated TOC please keep comment here to allow auto update -->
<!-- DON'T EDIT THIS SECTION, INSTEAD RE-RUN doctoc TO UPDATE -->
- [Welcome to Nimble!](#welcome-to-nimble!)
- [Reporting Bugs](#reporting-bugs)
- [Building the Project](#building-the-project)
- [Pull Requests](#pull-requests)
- [Style Conventions](#style-conventions)
- [Core Members](#core-members)
- [Code of Conduct](#code-of-conduct)
<!-- END doctoc generated TOC please keep comment here to allow auto update -->
# Welcome to Nimble!
We're building a testing framework for a new generation of Swift and
Objective-C developers.
Nimble should be easy to use and easy to maintain. Let's keep things
simple and well-tested.
**tl;dr:** If you've added a file to the project, make sure it's
included in both the OS X and iOS targets.
## Reporting Bugs
Nothing is off-limits. If you're having a problem, we want to hear about
it.
- See a crash? File an issue.
- Code isn't compiling, but you don't know why? Sounds like you should
submit a new issue, bud.
- Went to the kitchen, only to forget why you went in the first place?
Better submit an issue.
Be sure to include in your issue:
- Your Xcode version (eg - Xcode 7.0.1 7A1001)
- Your version of Nimble (eg - v2.0.0 or git sha `20a3f3b4e63cc8d97c92c4164bf36f2a2c9a6e1b`)
- What are the steps to reproduce this issue?
- What platform are you using? (eg - OS X, iOS, watchOS, tvOS)
- If the problem is on a UI Testing Bundle, Unit Testing Bundle, or some other target configuration
- Are you using carthage or cocoapods?
## Building the Project
- Use `Nimble.xcodeproj` to work on Nimble.
## Pull Requests
- Nothing is trivial. Submit pull requests for anything: typos,
whitespace, you name it.
- Not all pull requests will be merged, but all will be acknowledged. If
no one has provided feedback on your request, ping one of the owners
by name.
- Make sure your pull request includes any necessary updates to the
README or other documentation.
- Be sure the unit tests for both the OS X and iOS targets of Nimble
before submitting your pull request. You can run all the OS X & iOS unit
tests using `./test`.
- If you've added a file to the project, make sure it's included in both
the OS X and iOS targets.
- The `master` branch will always support the stable Xcode version. Other
branches will point to their corresponding versions they support.
- If you're making a configuration change, make sure to edit both the xcode
project and the podspec file.
### Style Conventions
- Indent using 4 spaces.
- Keep lines 100 characters or shorter. Break long statements into
shorter ones over multiple lines.
- In Objective-C, use `#pragma mark -` to mark public, internal,
protocol, and superclass methods.
## Core Members
If a few of your pull requests have been merged, and you'd like a
controlling stake in the project, file an issue asking for write access
to the repository.
### Code of Conduct
Your conduct as a core member is your own responsibility, but here are
some "ground rules":
- Feel free to push whatever you want to master, and (if you have
ownership permissions) to create any repositories you'd like.
Ideally, however, all changes should be submitted as GitHub pull
requests. No one should merge their own pull request, unless no
other core members respond for at least a few days.
If you'd like to create a new repository, it'd be nice if you created
a GitHub issue and gathered some feedback first.
- It'd be awesome if you could review, provide feedback on, and close
issues or pull requests submitted to the project. Please provide kind,
constructive feedback. Please don't be sarcastic or snarky.
### Creating a Release
The process is relatively straight forward, but here's is a useful checklist for tagging:
- Look at changes from the previously tagged release and write release notes: `git log v0.4.0...HEAD`
- Run the release script: `./script/release A.B.C release-notes-file`
- Go to [github releases](https://github.com/Quick/Nimble/releases) and mark the tagged commit as a release.
- Use the same release notes you created for the tag, but tweak up formatting for github.
- Attach the carthage release `Nimble.framework.zip` to the release.
- Announce!
================================================
FILE: Carthage/Checkouts/ReactiveCocoa/Carthage/Checkouts/Nimble/LICENSE.md
================================================
Apache License
Version 2.0, January 2004
http://www.apache.org/licenses/
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
1. Definitions.
"License" shall mean the terms and conditions for use, reproduction,
and distribution as defined by Sections 1 through 9 of this document.
"Licensor" shall mean the copyright owner or entity authorized by
the copyright owner that is granting the License.
"Legal Entity" shall mean the union of the acting entity and all
other entities that control, are controlled by, or are under common
control with that entity. For the purposes of this definition,
"control" means (i) the power, direct or indirect, to cause the
direction or management of such entity, whether by contract or
otherwise, or (ii) ownership of fifty percent (50%) or more of the
outstanding shares, or (iii) beneficial ownership of such entity.
"You" (or "Your") shall mean an individual or Legal Entity
exercising permissions granted by this License.
"Source" form shall mean the preferred form for making modifications,
including but not limited to software source code, documentation
source, and configuration files.
"Object" form shall mean any form resulting from mechanical
transformation or translation of a Source form, including but
not limited to compiled object code, generated documentation,
and conversions to other media types.
"Work" shall mean the work of authorship, whether in Source or
Object form, made available under the License, as indicated by a
copyright notice that is included in or attached to the work
(an example is provided in the Appendix below).
"Derivative Works" shall mean any work, whether in Source or Object
form, that is based on (or derived from) the Work and for which the
editorial revisions, annotations, elaborations, or other modifications
represent, as a whole, an original work of authorship. For the purposes
of this License, Derivative Works shall not include works that remain
separable from, or merely link (or bind by name) to the interfaces of,
the Work and Derivative Works thereof.
"Contribution" shall mean any work of authorship, including
the original version of the Work and any modifications or additions
to that Work or Derivative Works thereof, that is intentionally
submitted to Licensor for inclusion in the Work by the copyright owner
or by an individual or Legal Entity authorized to submit on behalf of
the copyright owner. For the purposes of this definition, "submitted"
means any form of electronic, verbal, or written communication sent
to the Licensor or its representatives, including but not limited to
communication on electronic mailing lists, source code control systems,
and issue tracking systems that are managed by, or on behalf of, the
Licensor for the purpose of discussing and improving the Work, but
excluding communication that is conspicuously marked or otherwise
designated in writing by the copyright owner as "Not a Contribution."
"Contributor" shall mean Licensor and any individual or Legal Entity
on behalf of whom a Contribution has been received by Licensor and
subsequently incorporated within the Work.
2. Grant of Copyright License. Subject to the terms and conditions of
this License, each Contributor hereby grants to You a perpetual,
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
copyright license to reproduce, prepare Derivative Works of,
publicly display, publicly perform, sublicense, and distribute the
Work and such Derivative Works in Source or Object form.
3. Grant of Patent License. Subject to the terms and conditions of
this License, each Contributor hereby grants to You a perpetual,
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
(except as stated in this section) patent license to make, have made,
use, offer to sell, sell, import, and otherwise transfer the Work,
where such license applies only to those patent claims licensable
by such Contributor that are necessarily infringed by their
Contribution(s) alone or by combination of their Contribution(s)
with the Work to which such Contribution(s) was submitted. If You
institute patent litigation against any entity (including a
cross-claim or counterclaim in a lawsuit) alleging that the Work
or a Contribution incorporated within the Work constitutes direct
or contributory patent infringement, then any patent licenses
granted to You under this License for that Work shall terminate
as of the date such litigation is filed.
4. Redistribution. You may reproduce and distribute copies of the
Work or Derivative Works thereof in any medium, with or without
modifications, and in Source or Object form, provided that You
meet the following conditions:
(a) You must give any other recipients of the Work or
Derivative Works a copy of this License; and
(b) You must cause any modified files to carry prominent notices
stating that You changed the files; and
(c) You must retain, in the Source form of any Derivative Works
that You distribute, all copyright, patent, trademark, and
attribution notices from the Source form of the Work,
excluding those notices that do not pertain to any part of
the Derivative Works; and
(d) If the Work includes a "NOTICE" text file as part of its
distribution, then any Derivative Works that You distribute must
include a readable copy of the attribution notices contained
within such NOTICE file, excluding those notices that do not
pertain to any part of the Derivative Works, in at least one
of the following places: within a NOTICE text file distributed
as part of the Derivative Works; within the Source form or
documentation, if provided along with the Derivative Works; or,
within a display generated by the Derivative Works, if and
wherever such third-party notices normally appear. The contents
of the NOTICE file are for informational purposes only and
do not modify the License. You may add Your own attribution
notices within Derivative Works that You distribute, alongside
or as an addendum to the NOTICE text from the Work, provided
that such additional attribution notices cannot be construed
as modifying the License.
You may add Your own copyright statement to Your modifications and
may provide additional or different license terms and conditions
for use, reproduction, or distribution of Your modifications, or
for any such Derivative Works as a whole, provided Your use,
reproduction, and distribution of the Work otherwise complies with
the conditions stated in this License.
5. Submission of Contributions. Unless You explicitly state otherwise,
any Contribution intentionally submitted for inclusion in the Work
by You to the Licensor shall be under the terms and conditions of
this License, without any additional terms or conditions.
Notwithstanding the above, nothing herein shall supersede or modify
the terms of any separate license agreement you may have executed
with Licensor regarding such Contributions.
6. Trademarks. This License does not grant permission to use the trade
names, trademarks, service marks, or product names of the Licensor,
except as required for reasonable and customary use in describing the
origin of the Work and reproducing the content of the NOTICE file.
7. Disclaimer of Warranty. Unless required by applicable law or
agreed to in writing, Licensor provides the Work (and each
Contributor provides its Contributions) on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
implied, including, without limitation, any warranties or conditions
of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
PARTICULAR PURPOSE. You are solely responsible for determining the
appropriateness of using or redistributing the Work and assume any
risks associated with Your exercise of permissions under this License.
8. Limitation of Liability. In no event and under no legal theory,
whether in tort (including negligence), contract, or otherwise,
unless required by applicable law (such as deliberate and grossly
negligent acts) or agreed to in writing, shall any Contributor be
liable to You for damages, including any direct, indirect, special,
incidental, or consequential damages of any character arising as a
result of this License or out of the use or inability to use the
Work (including but not limited to damages for loss of goodwill,
work stoppage, computer failure or malfunction, or any and all
other commercial damages or losses), even if such Contributor
has been advised of the possibility of such damages.
9. Accepting Warranty or Additional Liability. While redistributing
the Work or Derivative Works thereof, You may choose to offer,
and charge a fee for, acceptance of support, warranty, indemnity,
or other liability obligations and/or rights consistent with this
License. However, in accepting such obligations, You may act only
on Your own behalf and on Your sole responsibility, not on behalf
of any other Contributor, and only if You agree to indemnify,
defend, and hold each Contributor harmless for any liability
incurred by, or claims asserted against, such Contributor by reason
of your accepting any such warranty or additional liability.
END OF TERMS AND CONDITIONS
APPENDIX: How to apply the Apache License to your work.
To apply the Apache License to your work, attach the following
boilerplate notice, with the fields enclosed by brackets "{}"
replaced with your own identifying information. (Don't include
the brackets!) The text should be enclosed in the appropriate
comment syntax for the file format. We also recommend that a
file or class name and description of purpose be included on the
same "printed page" as the copyright notice for easier
identification within third-party archives.
Copyright 2014 Quick Team
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
================================================
FILE: Carthage/Checkouts/ReactiveCocoa/Carthage/Checkouts/Nimble/Nimble/Adapters/AdapterProtocols.swift
================================================
import Foundation
/// Protocol for the assertion handler that Nimble uses for all expectations.
public protocol AssertionHandler {
func assert(assertion: Bool, message: FailureMessage, location: SourceLocation)
}
/// Global backing interface for assertions that Nimble creates.
/// Defaults to a private test handler that passes through to XCTest.
///
/// If XCTest is not available, you must assign your own assertion handler
/// before using any matchers, otherwise Nimble will abort the program.
///
/// @see AssertionHandler
public var NimbleAssertionHandler: AssertionHandler = { () -> AssertionHandler in
return isXCTestAvailable() ? NimbleXCTestHandler() : NimbleXCTestUnavailableHandler()
}()
================================================
FILE: Carthage/Checkouts/ReactiveCocoa/Carthage/Checkouts/Nimble/Nimble/Adapters/AssertionDispatcher.swift
================================================
/// AssertionDispatcher allows multiple AssertionHandlers to receive
/// assertion messages.
///
/// @warning Does not fully dispatch if one of the handlers raises an exception.
/// This is possible with XCTest-based assertion handlers.
///
public class AssertionDispatcher: AssertionHandler {
let handlers: [AssertionHandler]
public init(handlers: [AssertionHandler]) {
self.handlers = handlers
}
public func assert(assertion: Bool, message: FailureMessage, location: SourceLocation) {
for handler in handlers {
handler.assert(assertion, message: message, location: location)
}
}
}
================================================
FILE: Carthage/Checkouts/ReactiveCocoa/Carthage/Checkouts/Nimble/Nimble/Adapters/AssertionRecorder.swift
================================================
import Foundation
/// A data structure that stores information about an assertion when
/// AssertionRecorder is set as the Nimble assertion handler.
///
/// @see AssertionRecorder
/// @see AssertionHandler
public struct AssertionRecord: CustomStringConvertible {
/// Whether the assertion succeeded or failed
public let success: Bool
/// The failure message the assertion would display on failure.
public let message: FailureMessage
/// The source location the expectation occurred on.
public let location: SourceLocation
public var description: String {
return "AssertionRecord { success=\(success), message='\(message.stringValue)', location=\(location) }"
}
}
/// An AssertionHandler that silently records assertions that Nimble makes.
/// This is useful for testing failure messages for matchers.
///
/// @see AssertionHandler
public class AssertionRecorder : AssertionHandler {
/// All the assertions that were captured by this recorder
public var assertions = [AssertionRecord]()
public init() {}
public func assert(assertion: Bool, message: FailureMessage, location: SourceLocation) {
assertions.append(
AssertionRecord(
success: assertion,
message: message,
location: location))
}
}
/// Allows you to temporarily replace the current Nimble assertion handler with
/// the one provided for the scope of the closure.
///
/// Once the closure finishes, then the original Nimble assertion handler is restored.
///
/// @see AssertionHandler
public func withAssertionHandler(tempAssertionHandler: AssertionHandler, closure: () throws -> Void) {
let environment = NimbleEnvironment.activeInstance
let oldRecorder = environment.assertionHandler
let capturer = NMBExceptionCapture(handler: nil, finally: ({
environment.assertionHandler = oldRecorder
}))
environment.assertionHandler = tempAssertionHandler
capturer.tryBlock {
try! closure()
}
}
/// Captures expectations that occur in the given closure. Note that all
/// expectations will still go through to the default Nimble handler.
///
/// This can be useful if you want to gather information about expectations
/// that occur within a closure.
///
/// @param silently expectations are no longer send to the default Nimble
/// assertion handler when this is true. Defaults to false.
///
/// @see gatherFailingExpectations
public func gatherExpectations(silently silently: Bool = false, closure: () -> Void) -> [AssertionRecord] {
let previousRecorder = NimbleEnvironment.activeInstance.assertionHandler
let recorder = AssertionRecorder()
let handlers: [AssertionHandler]
if silently {
handlers = [recorder]
} else {
handlers = [recorder, previousRecorder]
}
let dispatcher = AssertionDispatcher(handlers: handlers)
withAssertionHandler(dispatcher, closure: closure)
return recorder.assertions
}
/// Captures failed expectations that occur in the given closure. Note that all
/// expectations will still go through to the default Nimble handler.
///
/// This can be useful if you want to gather information about failed
/// expectations that occur within a closure.
///
/// @param silently expectations are no longer send to the default Nimble
/// assertion handler when this is true. Defaults to false.
///
/// @see gatherExpectations
/// @see raiseException source for an example use case.
public func gatherFailingExpectations(silently silently: Bool = false, closure: () -> Void) -> [AssertionRecord] {
let assertions = gatherExpectations(silently: silently, closure: closure)
return assertions.filter { assertion in
!assertion.success
}
}
================================================
FILE: Carthage/Checkouts/ReactiveCocoa/Carthage/Checkouts/Nimble/Nimble/Adapters/NimbleEnvironment.swift
================================================
import Foundation
/// "Global" state of Nimble is stored here. Only DSL functions should access / be aware of this
/// class' existance
internal class NimbleEnvironment {
static var activeInstance: NimbleEnvironment {
get {
let env = NSThread.currentThread().threadDictionary["NimbleEnvironment"]
if let env = env as? NimbleEnvironment {
return env
} else {
let newEnv = NimbleEnvironment()
self.activeInstance = newEnv
return newEnv
}
}
set {
NSThread.currentThread().threadDictionary["NimbleEnvironment"] = newValue
}
}
// TODO: eventually migrate the global to this environment value
var assertionHandler: AssertionHandler {
get { return NimbleAssertionHandler }
set { NimbleAssertionHandler = newValue }
}
var awaiter: Awaiter
init() {
awaiter = Awaiter(
waitLock: AssertionWaitLock(),
asyncQueue: dispatch_get_main_queue(),
timeoutQueue: dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0))
}
}
================================================
FILE: Carthage/Checkouts/ReactiveCocoa/Carthage/Checkouts/Nimble/Nimble/Adapters/NimbleXCTestHandler.swift
================================================
import Foundation
import XCTest
/// Default handler for Nimble. This assertion handler passes failures along to
/// XCTest.
public class NimbleXCTestHandler : AssertionHandler {
public func assert(assertion: Bool, message: FailureMessage, location: SourceLocation) {
if !assertion {
XCTFail("\(message.stringValue)\n", file: location.file, line: location.line)
}
}
}
/// Alternative handler for Nimble. This assertion handler passes failures along
/// to XCTest by attempting to reduce the failure message size.
public class NimbleShortXCTestHandler: AssertionHandler {
public func assert(assertion: Bool, message: FailureMessage, location: SourceLocation) {
if !assertion {
let msg: String
if let actual = message.actualValue {
msg = "got: \(actual) \(message.postfixActual)"
} else {
msg = "expected \(message.to) \(message.postfixMessage)"
}
XCTFail("\(msg)\n", file: location.file, line: location.line)
}
}
}
/// Fallback handler in case XCTest is unavailable. This assertion handler will abort
/// the program if it is invoked.
class NimbleXCTestUnavailableHandler : AssertionHandler {
func assert(assertion: Bool, message: FailureMessage, location: SourceLocation) {
fatalError("XCTest is not available and no custom assertion handler was configured. Aborting.")
}
}
func isXCTestAvailable() -> Bool {
return NSClassFromString("XCTestCase") != nil
}
================================================
FILE: Carthage/Checkouts/ReactiveCocoa/Carthage/Checkouts/Nimble/Nimble/DSL+Wait.swift
================================================
import Foundation
private enum ErrorResult {
case Exception(NSException)
case Error(ErrorType)
case None
}
/// Only classes, protocols, methods, properties, and subscript declarations can be
/// bridges to Objective-C via the @objc keyword. This class encapsulates callback-style
/// asynchronous waiting logic so that it may be called from Objective-C and Swift.
internal class NMBWait: NSObject {
internal class func until(
timeout timeout: NSTimeInterval,
file: String = __FILE__,
line: UInt = __LINE__,
action: (() -> Void) -> Void) -> Void {
return throwableUntil(timeout: timeout, file: file, line: line) { (done: () -> Void) throws -> Void in
action() { done() }
}
}
// Using a throwable closure makes this method not objc compatible.
internal class func throwableUntil(
timeout timeout: NSTimeInterval,
file: String = __FILE__,
line: UInt = __LINE__,
action: (() -> Void) throws -> Void) -> Void {
let awaiter = NimbleEnvironment.activeInstance.awaiter
let leeway = timeout / 2.0
let result = awaiter.performBlock { (done: (ErrorResult) -> Void) throws -> Void in
dispatch_async(dispatch_get_main_queue()) {
let capture = NMBExceptionCapture(
handler: ({ exception in
done(.Exception(exception))
}),
finally: ({ })
)
capture.tryBlock {
do {
try action() {
done(.None)
}
} catch let e {
done(.Error(e))
}
}
}
}.timeout(timeout, forcefullyAbortTimeout: leeway).wait("waitUntil(...)", file: file, line: line)
switch result {
case .Incomplete: internalError("Reached .Incomplete state for waitUntil(...).")
case .BlockedRunLoop:
fail(blockedRunLoopErrorMessageFor("-waitUntil()", leeway: leeway),
file: file, line: line)
case .TimedOut:
let pluralize = (timeout == 1 ? "" : "s")
fail("Waited more than \(timeout) second\(pluralize)", file: file, line: line)
case let .RaisedException(exception):
fail("Unexpected exception raised: \(exception)")
case let .ErrorThrown(error):
fail("Unexpected error thrown: \(error)")
case .Completed(.Exception(let exception)):
fail("Unexpected exception raised: \(exception)")
case .Completed(.Error(let error)):
fail("Unexpected error thrown: \(error)")
case .Completed(.None): // success
break
}
}
@objc(untilFile:line:action:)
internal class func until(file: String = __FILE__, line: UInt = __LINE__, action: (() -> Void) -> Void) -> Void {
until(timeout: 1, file: file, line: line, action: action)
}
}
internal func blockedRunLoopErrorMessageFor(fnName: String, leeway: NSTimeInterval) -> String {
return "\(fnName) timed out but was unable to run the timeout handler because the main thread is unresponsive (\(leeway) seconds is allow after the wait times out). Conditions that may cause this include processing blocking IO on the main thread, calls to sleep(), deadlocks, and synchronous IPC. Nimble forcefully stopped run loop which may cause future failures in test run."
}
/// Wait asynchronously until the done closure is called or the timeout has been reached.
///
/// @discussion
/// Call the done() closure to indicate the waiting has completed.
///
/// This function manages the main run loop (`NSRunLoop.mainRunLoop()`) while this function
/// is executing. Any attempts to touch the run loop may cause non-deterministic behavior.
public func waitUntil(timeout timeout: NSTimeInterval = 1, file: String = __FILE__, line: UInt = __LINE__, action: (() -> Void) -> Void) -> Void {
NMBWait.until(timeout: timeout, file: file, line: line, action: action)
}
================================================
FILE: Carthage/Checkouts/ReactiveCocoa/Carthage/Checkouts/Nimble/Nimble/DSL.swift
================================================
import Foundation
/// Make an expectation on a given actual value. The value given is lazily evaluated.
public func expect<T>(@autoclosure(escaping) expression: () throws -> T?, file: String = __FILE__, line: UInt = __LINE__) -> Expectation<T> {
return Expectation(
expression: Expression(
expression: expression,
location: SourceLocation(file: file, line: line),
isClosure: true))
}
/// Make an expectation on a given actual value. The closure is lazily invoked.
public func expect<T>(file: String = __FILE__, line: UInt = __LINE__, expression: () throws -> T?) -> Expectation<T> {
return Expectation(
expression: Expression(
expression: expression,
location: SourceLocation(file: file, line: line),
isClosure: true))
}
/// Always fails the test with a message and a specified location.
public func fail(message: String, location: SourceLocation) {
let handler = NimbleEnvironment.activeInstance.assertionHandler
handler.assert(false, message: FailureMessage(stringValue: message), location: location)
}
/// Always fails the test with a message.
public func fail(message: String, file: String = __FILE__, line: UInt = __LINE__) {
fail(message, location: SourceLocation(file: file, line: line))
}
/// Always fails the test.
public func fail(file: String = __FILE__, line: UInt = __LINE__) {
fail("fail() always fails", file: file, line: line)
}
/// Like Swift's precondition(), but raises NSExceptions instead of sigaborts
internal func nimblePrecondition(
@autoclosure expr: () -> Bool,
@autoclosure _ name: () -> String,
@autoclosure _ message: () -> String) -> Bool {
let result = expr()
if !result {
let e = NSException(
name: name(),
reason: message(),
userInfo: nil)
e.raise()
}
return result
}
@noreturn
internal func internalError(msg: String, file: String = __FILE__, line: UInt = __LINE__) {
fatalError(
"Nimble Bug Found: \(msg) at \(file):\(line).\n" +
"Please file a bug to Nimble: https://github.com/Quick/Nimble/issues with the " +
"code snippet that caused this error."
)
}
================================================
FILE: Carthage/Checkouts/ReactiveCocoa/Carthage/Checkouts/Nimble/Nimble/Expectation.swift
================================================
import Foundation
internal func expressionMatches<T, U where U: Matcher, U.ValueType == T>(expression: Expression<T>, matcher: U, to: String, description: String?) -> (Bool, FailureMessage) {
let msg = FailureMessage()
msg.userDescription = description
msg.to = to
do {
let pass = try matcher.matches(expression, failureMessage: msg)
if msg.actualValue == "" {
msg.actualValue = "<\(stringify(try expression.evaluate()))>"
}
return (pass, msg)
} catch let error {
msg.actualValue = "an unexpected error thrown: <\(error)>"
return (false, msg)
}
}
internal func expressionDoesNotMatch<T, U where U: Matcher, U.ValueType == T>(expression: Expression<T>, matcher: U, toNot: String, description: String?) -> (Bool, FailureMessage) {
let msg = FailureMessage()
msg.userDescription = description
msg.to = toNot
do {
let pass = try matcher.doesNotMatch(expression, failureMessage: msg)
if msg.actualValue == "" {
msg.actualValue = "<\(stringify(try expression.evaluate()))>"
}
return (pass, msg)
} catch let error {
msg.actualValue = "an unexpected error thrown: <\(error)>"
return (false, msg)
}
}
public struct Expectation<T> {
let expression: Expression<T>
public func verify(pass: Bool, _ message: FailureMessage) {
let handler = NimbleEnvironment.activeInstance.assertionHandler
handler.assert(pass, message: message, location: expression.location)
}
/// Tests the actual value using a matcher to match.
public func to<U where U: Matcher, U.ValueType == T>(matcher: U, description: String? = nil) {
let (pass, msg) = expressionMatches(expression, matcher: matcher, to: "to", description: description)
verify(pass, msg)
}
/// Tests the actual value using a matcher to not match.
public func toNot<U where U: Matcher, U.ValueType == T>(matcher: U, description: String? = nil) {
let (pass, msg) = expressionDoesNotMatch(expression, matcher: matcher, toNot: "to not", description: description)
verify(pass, msg)
}
/// Tests the actual value using a matcher to not match.
///
/// Alias to toNot().
public func notTo<U where U: Matcher, U.ValueType == T>(matcher: U, description: String? = nil) {
toNot(matcher, description: description)
}
// see:
// - AsyncMatcherWrapper for extension
// - NMBExpectation for Objective-C interface
}
================================================
FILE: Carthage/Checkouts/ReactiveCocoa/Carthage/Checkouts/Nimble/Nimble/Expression.swift
================================================
import Foundation
// Memoizes the given closure, only calling the passed
// closure once; even if repeat calls to the returned closure
internal func memoizedClosure<T>(closure: () throws -> T) -> (Bool) throws -> T {
var cache: T?
return ({ withoutCaching in
if (withoutCaching || cache == nil) {
cache = try closure()
}
return cache!
})
}
/// Expression represents the closure of the value inside expect(...).
/// Expressions are memoized by default. This makes them safe to call
/// evaluate() multiple times without causing a re-evaluation of the underlying
/// closure.
///
/// @warning Since the closure can be any code, Objective-C code may choose
/// to raise an exception. Currently, Expression does not memoize
/// exception raising.
///
/// This provides a common consumable API for matchers to utilize to allow
/// Nimble to change internals to how the captured closure is managed.
public struct Expression<T> {
internal let _expression: (Bool) throws -> T?
internal let _withoutCaching: Bool
public let location: SourceLocation
public let isClosure: Bool
/// Creates a new expression struct. Normally, expect(...) will manage this
/// creation process. The expression is memoized.
///
/// @param expression The closure that produces a given value.
/// @param location The source location that this closure originates from.
/// @param isClosure A bool indicating if the captured expression is a
/// closure or internally produced closure. Some matchers
/// may require closures. For example, toEventually()
/// requires an explicit closure. This gives Nimble
/// flexibility if @autoclosure behavior changes between
/// Swift versions. Nimble internals always sets this true.
public init(expression: () throws -> T?, location: SourceLocation, isClosure: Bool = true) {
self._expression = memoizedClosure(expression)
self.location = location
self._withoutCaching = false
self.isClosure = isClosure
}
/// Creates a new expression struct. Normally, expect(...) will manage this
/// creation process.
///
/// @param expression The closure that produces a given value.
/// @param location The source location that this closure originates from.
/// @param withoutCaching Indicates if the struct should memoize the given
/// closure's result. Subsequent evaluate() calls will
/// not call the given closure if this is true.
/// @param isClosure A bool indicating if the captured expression is a
/// closure or internally produced closure. Some matchers
/// may require closures. For example, toEventually()
/// requires an explicit closure. This gives Nimble
/// flexibility if @autoclosure behavior changes between
/// Swift versions. Nimble internals always sets this true.
public init(memoizedExpression: (Bool) throws -> T?, location: SourceLocation, withoutCaching: Bool, isClosure: Bool = true) {
self._expression = memoizedExpression
self.location = location
self._withoutCaching = withoutCaching
self.isClosure = isClosure
}
/// Returns a new Expression from the given expression. Identical to a map()
/// on this type. This should be used only to typecast the Expression's
/// closure value.
///
/// The returned expression will preserve location and isClosure.
///
/// @param block The block that can cast the current Expression value to a
/// new type.
public func cast<U>(block: (T?) throws -> U?) -> Expression<U> {
return Expression<U>(expression: ({ try block(self.evaluate()) }), location: self.location, isClosure: self.isClosure)
}
public func evaluate() throws -> T? {
return try self._expression(_withoutCaching)
}
public func withoutCaching() -> Expression<T> {
return Expression(memoizedExpression: self._expression, location: location, withoutCaching: true, isClosure: isClosure)
}
}
================================================
FILE: Carthage/Checkouts/ReactiveCocoa/Carthage/Checkouts/Nimble/Nimble/FailureMessage.swift
================================================
import Foundation
/// Encapsulates the failure message that matchers can report to the end user.
///
/// This is shared state between Nimble and matchers that mutate this value.
public class FailureMessage: NSObject {
public var expected: String = "expected"
public var actualValue: String? = "" // empty string -> use default; nil -> exclude
public var to: String = "to"
public var postfixMessage: String = "match"
public var postfixActual: String = ""
public var userDescription: String? = nil
public var stringValue: String {
get {
if let value = _stringValueOverride {
return value
} else {
return computeStringValue()
}
}
set {
_stringValueOverride = newValue
}
}
internal var _stringValueOverride: String?
public override init() {
}
public init(stringValue: String) {
_stringValueOverride = stringValue
}
internal func stripNewlines(str: String) -> String {
var lines: [String] = (str as NSString).componentsSeparatedByString("\n") as [String]
let whitespace = NSCharacterSet.whitespaceAndNewlineCharacterSet()
lines = lines.map { line in line.stringByTrimmingCharactersInSet(whitespace) }
return lines.joinWithSeparator("")
}
internal func computeStringValue() -> String {
var value = "\(expected) \(to) \(postfixMessage)"
if let actualValue = actualValue {
value = "\(expected) \(to) \(postfixMessage), got \(actualValue)\(postfixActual)"
}
value = stripNewlines(value)
if let userDescription = userDescription {
return "\(userDescription)\n\(value)"
}
return value
}
}
================================================
FILE: Carthage/Checkouts/ReactiveCocoa/Carthage/Checkouts/Nimble/Nimble/Info.plist
================================================
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>CFBundleDevelopmentRegion</key>
<string>en</string>
<key>CFBundleExecutable</key>
<string>${EXECUTABLE_NAME}</string>
<key>CFBundleIdentifier</key>
<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>
<key>CFBundleInfoDictionaryVersion</key>
<string>6.0</string>
<key>CFBundleName</key>
<string>${PRODUCT_NAME}</string>
<key>CFBundlePackageType</key>
<string>FMWK</string>
<key>CFBundleShortVersionString</key>
<string>1.0</string>
<key>CFBundleSignature</key>
<string>????</string>
<key>CFBundleVersion</key>
<string>${CURRENT_PROJECT_VERSION}</string>
<key>NSHumanReadableCopyright</key>
<string>Copyright © 2014 Jeff Hui. All rights reserved.</string>
<key>NSPrincipalClass</key>
<string></string>
</dict>
</plist>
================================================
FILE: Carthage/Checkouts/ReactiveCocoa/Carthage/Checkouts/Nimble/Nimble/Matchers/AllPass.swift
================================================
import Foundation
public func allPass<T,U where U: SequenceType, U.Generator.Element == T>
(passFunc: (T?) -> Bool) -> NonNilMatcherFunc<U> {
return allPass("pass a condition", passFunc)
}
public func allPass<T,U where U: SequenceType, U.Generator.Element == T>
(passName: String, _ passFunc: (T?) -> Bool) -> NonNilMatcherFunc<U> {
return createAllPassMatcher() {
expression, failureMessage in
failureMessage.postfixMessage = passName
return passFunc(try expression.evaluate())
}
}
public func allPass<U,V where U: SequenceType, V: Matcher, U.Generator.Element == V.ValueType>
(matcher: V) -> NonNilMatcherFunc<U> {
return createAllPassMatcher() {
try matcher.matches($0,
gitextract_trattway/ ├── .gitignore ├── BrewMobile/ │ ├── AppDelegate.swift │ ├── BrewManager.swift │ ├── ContentParser.swift │ ├── Images.xcassets/ │ │ ├── AppIcon.appiconset/ │ │ │ └── Contents.json │ │ ├── DesignerIcon.imageset/ │ │ │ └── Contents.json │ │ ├── HopIcon.imageset/ │ │ │ └── Contents.json │ │ └── LaunchImage.launchimage/ │ │ └── Contents.json │ ├── Info.plist │ ├── Model/ │ │ ├── BrewPhase.swift │ │ └── BrewState.swift │ ├── RACUtils/ │ │ └── RAC.swift │ ├── View/ │ │ ├── BrewCell.swift │ │ ├── BrewCell.xib │ │ ├── BrewDesignerViewController.swift │ │ ├── BrewDesignerViewController.xib │ │ ├── BrewNewPhaseViewController.swift │ │ ├── BrewNewPhaseViewController.xib │ │ ├── BrewViewController.swift │ │ ├── BrewViewController.xib │ │ ├── PhaseCell.swift │ │ └── PhaseCell.xib │ └── ViewModel/ │ ├── BrewDesignerViewModel.swift │ └── BrewViewModel.swift ├── BrewMobile.xcodeproj/ │ ├── project.pbxproj │ ├── project.xcworkspace/ │ │ └── contents.xcworkspacedata │ └── xcshareddata/ │ └── xcschemes/ │ └── BrewMobile.xcscheme ├── BrewMobile.xcworkspace/ │ └── contents.xcworkspacedata ├── BrewMobileTests/ │ ├── BrewPhaseTestCase.swift │ ├── BrewStateTestCase.swift │ ├── ContentParserTestCase.swift │ └── Info.plist ├── Cartfile ├── Cartfile.resolved ├── Carthage/ │ └── Checkouts/ │ ├── ReactiveCocoa/ │ │ ├── .gitignore │ │ ├── .gitmodules │ │ ├── .travis.yml │ │ ├── CHANGELOG.md │ │ ├── CONTRIBUTING.md │ │ ├── Cartfile │ │ ├── Cartfile.private │ │ ├── Cartfile.resolved │ │ ├── Carthage/ │ │ │ └── Checkouts/ │ │ │ ├── Nimble/ │ │ │ │ ├── .gitignore │ │ │ │ ├── .travis.yml │ │ │ │ ├── CONTRIBUTING.md │ │ │ │ ├── LICENSE.md │ │ │ │ ├── Nimble/ │ │ │ │ │ ├── Adapters/ │ │ │ │ │ │ ├── AdapterProtocols.swift │ │ │ │ │ │ ├── AssertionDispatcher.swift │ │ │ │ │ │ ├── AssertionRecorder.swift │ │ │ │ │ │ ├── NimbleEnvironment.swift │ │ │ │ │ │ └── NimbleXCTestHandler.swift │ │ │ │ │ ├── DSL+Wait.swift │ │ │ │ │ ├── DSL.swift │ │ │ │ │ ├── Expectation.swift │ │ │ │ │ ├── Expression.swift │ │ │ │ │ ├── FailureMessage.swift │ │ │ │ │ ├── Info.plist │ │ │ │ │ ├── Matchers/ │ │ │ │ │ │ ├── AllPass.swift │ │ │ │ │ │ ├── BeAKindOf.swift │ │ │ │ │ │ ├── BeAnInstanceOf.swift │ │ │ │ │ │ ├── BeCloseTo.swift │ │ │ │ │ │ ├── BeEmpty.swift │ │ │ │ │ │ ├── BeGreaterThan.swift │ │ │ │ │ │ ├── BeGreaterThanOrEqualTo.swift │ │ │ │ │ │ ├── BeIdenticalTo.swift │ │ │ │ │ │ ├── BeLessThan.swift │ │ │ │ │ │ ├── BeLessThanOrEqual.swift │ │ │ │ │ │ ├── BeLogical.swift │ │ │ │ │ │ ├── BeNil.swift │ │ │ │ │ │ ├── BeginWith.swift │ │ │ │ │ │ ├── Contain.swift │ │ │ │ │ │ ├── EndWith.swift │ │ │ │ │ │ ├── Equal.swift │ │ │ │ │ │ ├── HaveCount.swift │ │ │ │ │ │ ├── Match.swift │ │ │ │ │ │ ├── MatcherProtocols.swift │ │ │ │ │ │ ├── RaisesException.swift │ │ │ │ │ │ ├── SatisfyAnyOf.swift │ │ │ │ │ │ └── ThrowError.swift │ │ │ │ │ ├── Nimble.h │ │ │ │ │ ├── ObjCExpectation.swift │ │ │ │ │ ├── Utils/ │ │ │ │ │ │ ├── Async.swift │ │ │ │ │ │ ├── Functional.swift │ │ │ │ │ │ ├── SourceLocation.swift │ │ │ │ │ │ └── Stringers.swift │ │ │ │ │ ├── Wrappers/ │ │ │ │ │ │ ├── AsyncMatcherWrapper.swift │ │ │ │ │ │ ├── MatcherFunc.swift │ │ │ │ │ │ └── ObjCMatcher.swift │ │ │ │ │ └── objc/ │ │ │ │ │ ├── DSL.h │ │ │ │ │ ├── DSL.m │ │ │ │ │ ├── NMBExceptionCapture.h │ │ │ │ │ └── NMBExceptionCapture.m │ │ │ │ ├── Nimble.podspec │ │ │ │ ├── Nimble.xcodeproj/ │ │ │ │ │ ├── project.pbxproj │ │ │ │ │ └── xcshareddata/ │ │ │ │ │ └── xcschemes/ │ │ │ │ │ ├── Nimble-OSX.xcscheme │ │ │ │ │ ├── Nimble-iOS.xcscheme │ │ │ │ │ └── Nimble-tvOS.xcscheme │ │ │ │ ├── NimbleTests/ │ │ │ │ │ ├── AsynchronousTest.swift │ │ │ │ │ ├── Helpers/ │ │ │ │ │ │ ├── ObjectWithLazyProperty.swift │ │ │ │ │ │ └── utils.swift │ │ │ │ │ ├── Info.plist │ │ │ │ │ ├── Matchers/ │ │ │ │ │ │ ├── AllPassTest.swift │ │ │ │ │ │ ├── BeAKindOfTest.swift │ │ │ │ │ │ ├── BeAnInstanceOfTest.swift │ │ │ │ │ │ ├── BeCloseToTest.swift │ │ │ │ │ │ ├── BeEmptyTest.swift │ │ │ │ │ │ ├── BeGreaterThanOrEqualToTest.swift │ │ │ │ │ │ ├── BeGreaterThanTest.swift │ │ │ │ │ │ ├── BeIdenticalToObjectTest.swift │ │ │ │ │ │ ├── BeIdenticalToTest.swift │ │ │ │ │ │ ├── BeLessThanOrEqualToTest.swift │ │ │ │ │ │ ├── BeLessThanTest.swift │ │ │ │ │ │ ├── BeLogicalTest.swift │ │ │ │ │ │ ├── BeNilTest.swift │ │ │ │ │ │ ├── BeginWithTest.swift │ │ │ │ │ │ ├── ContainTest.swift │ │ │ │ │ │ ├── EndWithTest.swift │ │ │ │ │ │ ├── EqualTest.swift │ │ │ │ │ │ ├── HaveCountTest.swift │ │ │ │ │ │ ├── MatchTest.swift │ │ │ │ │ │ ├── RaisesExceptionTest.swift │ │ │ │ │ │ ├── SatisfyAnyOfTest.swift │ │ │ │ │ │ └── ThrowErrorTest.swift │ │ │ │ │ ├── SynchronousTests.swift │ │ │ │ │ ├── UserDescriptionTest.swift │ │ │ │ │ └── objc/ │ │ │ │ │ ├── Nimble-OSXTests-Bridging-Header.h │ │ │ │ │ ├── NimbleSpecHelper.h │ │ │ │ │ ├── NimbleTests-Bridging-Header.h │ │ │ │ │ ├── ObjCAllPassTest.m │ │ │ │ │ ├── ObjCAsyncTest.m │ │ │ │ │ ├── ObjCBeAnInstanceOfTest.m │ │ │ │ │ ├── ObjCBeCloseToTest.m │ │ │ │ │ ├── ObjCBeEmptyTest.m │ │ │ │ │ ├── ObjCBeFalseTest.m │ │ │ │ │ ├── ObjCBeFalsyTest.m │ │ │ │ │ ├── ObjCBeGreaterThanOrEqualToTest.m │ │ │ │ │ ├── ObjCBeGreaterThanTest.m │ │ │ │ │ ├── ObjCBeIdenticalToTest.m │ │ │ │ │ ├── ObjCBeKindOfTest.m │ │ │ │ │ ├── ObjCBeLessThanOrEqualToTest.m │ │ │ │ │ ├── ObjCBeLessThanTest.m │ │ │ │ │ ├── ObjCBeNilTest.m │ │ │ │ │ ├── ObjCBeTrueTest.m │ │ │ │ │ ├── ObjCBeTruthyTest.m │ │ │ │ │ ├── ObjCBeginWithTest.m │ │ │ │ │ ├── ObjCContainTest.m │ │ │ │ │ ├── ObjCEndWithTest.m │ │ │ │ │ ├── ObjCEqualTest.m │ │ │ │ │ ├── ObjCHaveCount.m │ │ │ │ │ ├── ObjCMatchTest.m │ │ │ │ │ ├── ObjCRaiseExceptionTest.m │ │ │ │ │ ├── ObjCSatisfyAnyOfTest.m │ │ │ │ │ ├── ObjCSyncTest.m │ │ │ │ │ └── ObjCUserDescriptionTest.m │ │ │ │ ├── README.md │ │ │ │ ├── circle.yml │ │ │ │ ├── script/ │ │ │ │ │ └── release │ │ │ │ └── test │ │ │ ├── Quick/ │ │ │ │ ├── .gitignore │ │ │ │ ├── .gitmodules │ │ │ │ ├── .travis.yml │ │ │ │ ├── CONTRIBUTING.md │ │ │ │ ├── Documentation/ │ │ │ │ │ ├── ArrangeActAssert.md │ │ │ │ │ ├── BehavioralTesting.md │ │ │ │ │ ├── ConfiguringQuick.md │ │ │ │ │ ├── InstallingFileTemplates.md │ │ │ │ │ ├── InstallingQuick.md │ │ │ │ │ ├── MoreResources.md │ │ │ │ │ ├── NimbleAssertions.md │ │ │ │ │ ├── QuickExamplesAndGroups.md │ │ │ │ │ ├── QuickInObjectiveC.md │ │ │ │ │ ├── README.md │ │ │ │ │ ├── SettingUpYourXcodeProject.md │ │ │ │ │ ├── SharedExamples.md │ │ │ │ │ └── TestingApps.md │ │ │ │ ├── Externals/ │ │ │ │ │ └── Nimble/ │ │ │ │ │ ├── .gitignore │ │ │ │ │ ├── .travis.yml │ │ │ │ │ ├── CONTRIBUTING.md │ │ │ │ │ ├── LICENSE.md │ │ │ │ │ ├── Nimble/ │ │ │ │ │ │ ├── Adapters/ │ │ │ │ │ │ │ ├── AdapterProtocols.swift │ │ │ │ │ │ │ ├── AssertionDispatcher.swift │ │ │ │ │ │ │ ├── AssertionRecorder.swift │ │ │ │ │ │ │ └── NimbleXCTestHandler.swift │ │ │ │ │ │ ├── DSL+Wait.swift │ │ │ │ │ │ ├── DSL.swift │ │ │ │ │ │ ├── Expectation.swift │ │ │ │ │ │ ├── Expression.swift │ │ │ │ │ │ ├── FailureMessage.swift │ │ │ │ │ │ ├── Info.plist │ │ │ │ │ │ ├── Matchers/ │ │ │ │ │ │ │ ├── AllPass.swift │ │ │ │ │ │ │ ├── BeAKindOf.swift │ │ │ │ │ │ │ ├── BeAnInstanceOf.swift │ │ │ │ │ │ │ ├── BeCloseTo.swift │ │ │ │ │ │ │ ├── BeEmpty.swift │ │ │ │ │ │ │ ├── BeGreaterThan.swift │ │ │ │ │ │ │ ├── BeGreaterThanOrEqualTo.swift │ │ │ │ │ │ │ ├── BeIdenticalTo.swift │ │ │ │ │ │ │ ├── BeLessThan.swift │ │ │ │ │ │ │ ├── BeLessThanOrEqual.swift │ │ │ │ │ │ │ ├── BeLogical.swift │ │ │ │ │ │ │ ├── BeNil.swift │ │ │ │ │ │ │ ├── BeginWith.swift │ │ │ │ │ │ │ ├── Contain.swift │ │ │ │ │ │ │ ├── EndWith.swift │ │ │ │ │ │ │ ├── Equal.swift │ │ │ │ │ │ │ ├── HaveCount.swift │ │ │ │ │ │ │ ├── Match.swift │ │ │ │ │ │ │ ├── MatcherProtocols.swift │ │ │ │ │ │ │ ├── RaisesException.swift │ │ │ │ │ │ │ └── ThrowError.swift │ │ │ │ │ │ ├── Nimble.h │ │ │ │ │ │ ├── ObjCExpectation.swift │ │ │ │ │ │ ├── Utils/ │ │ │ │ │ │ │ ├── Functional.swift │ │ │ │ │ │ │ ├── Poll.swift │ │ │ │ │ │ │ ├── SourceLocation.swift │ │ │ │ │ │ │ └── Stringers.swift │ │ │ │ │ │ ├── Wrappers/ │ │ │ │ │ │ │ ├── AsyncMatcherWrapper.swift │ │ │ │ │ │ │ ├── MatcherFunc.swift │ │ │ │ │ │ │ └── ObjCMatcher.swift │ │ │ │ │ │ └── objc/ │ │ │ │ │ │ ├── DSL.h │ │ │ │ │ │ ├── DSL.m │ │ │ │ │ │ ├── NMBExceptionCapture.h │ │ │ │ │ │ └── NMBExceptionCapture.m │ │ │ │ │ ├── Nimble.podspec │ │ │ │ │ ├── Nimble.xcodeproj/ │ │ │ │ │ │ ├── project.pbxproj │ │ │ │ │ │ └── xcshareddata/ │ │ │ │ │ │ └── xcschemes/ │ │ │ │ │ │ ├── Nimble-OSX.xcscheme │ │ │ │ │ │ ├── Nimble-iOS.xcscheme │ │ │ │ │ │ └── Nimble-tvOS.xcscheme │ │ │ │ │ ├── NimbleTests/ │ │ │ │ │ │ ├── AsynchronousTest.swift │ │ │ │ │ │ ├── Helpers/ │ │ │ │ │ │ │ ├── ObjectWithLazyProperty.swift │ │ │ │ │ │ │ └── utils.swift │ │ │ │ │ │ ├── Info.plist │ │ │ │ │ │ ├── Matchers/ │ │ │ │ │ │ │ ├── AllPassTest.swift │ │ │ │ │ │ │ ├── BeAKindOfTest.swift │ │ │ │ │ │ │ ├── BeAnInstanceOfTest.swift │ │ │ │ │ │ │ ├── BeCloseToTest.swift │ │ │ │ │ │ │ ├── BeEmptyTest.swift │ │ │ │ │ │ │ ├── BeGreaterThanOrEqualToTest.swift │ │ │ │ │ │ │ ├── BeGreaterThanTest.swift │ │ │ │ │ │ │ ├── BeIdenticalToObjectTest.swift │ │ │ │ │ │ │ ├── BeIdenticalToTest.swift │ │ │ │ │ │ │ ├── BeLessThanOrEqualToTest.swift │ │ │ │ │ │ │ ├── BeLessThanTest.swift │ │ │ │ │ │ │ ├── BeLogicalTest.swift │ │ │ │ │ │ │ ├── BeNilTest.swift │ │ │ │ │ │ │ ├── BeginWithTest.swift │ │ │ │ │ │ │ ├── ContainTest.swift │ │ │ │ │ │ │ ├── EndWithTest.swift │ │ │ │ │ │ │ ├── EqualTest.swift │ │ │ │ │ │ │ ├── HaveCountTest.swift │ │ │ │ │ │ │ ├── MatchTest.swift │ │ │ │ │ │ │ ├── RaisesExceptionTest.swift │ │ │ │ │ │ │ └── ThrowErrorTest.swift │ │ │ │ │ │ ├── SynchronousTests.swift │ │ │ │ │ │ ├── UserDescriptionTest.swift │ │ │ │ │ │ └── objc/ │ │ │ │ │ │ ├── Nimble-OSXTests-Bridging-Header.h │ │ │ │ │ │ ├── NimbleSpecHelper.h │ │ │ │ │ │ ├── NimbleTests-Bridging-Header.h │ │ │ │ │ │ ├── ObjCAllPassTest.m │ │ │ │ │ │ ├── ObjCAsyncTest.m │ │ │ │ │ │ ├── ObjCBeAnInstanceOfTest.m │ │ │ │ │ │ ├── ObjCBeCloseToTest.m │ │ │ │ │ │ ├── ObjCBeEmptyTest.m │ │ │ │ │ │ ├── ObjCBeFalseTest.m │ │ │ │ │ │ ├── ObjCBeFalsyTest.m │ │ │ │ │ │ ├── ObjCBeGreaterThanOrEqualToTest.m │ │ │ │ │ │ ├── ObjCBeGreaterThanTest.m │ │ │ │ │ │ ├── ObjCBeIdenticalToTest.m │ │ │ │ │ │ ├── ObjCBeKindOfTest.m │ │ │ │ │ │ ├── ObjCBeLessThanOrEqualToTest.m │ │ │ │ │ │ ├── ObjCBeLessThanTest.m │ │ │ │ │ │ ├── ObjCBeNilTest.m │ │ │ │ │ │ ├── ObjCBeTrueTest.m │ │ │ │ │ │ ├── ObjCBeTruthyTest.m │ │ │ │ │ │ ├── ObjCBeginWithTest.m │ │ │ │ │ │ ├── ObjCContainTest.m │ │ │ │ │ │ ├── ObjCEndWithTest.m │ │ │ │ │ │ ├── ObjCEqualTest.m │ │ │ │ │ │ ├── ObjCHaveCount.m │ │ │ │ │ │ ├── ObjCMatchTest.m │ │ │ │ │ │ ├── ObjCRaiseExceptionTest.m │ │ │ │ │ │ ├── ObjCSyncTest.m │ │ │ │ │ │ └── ObjCUserDescriptionTest.m │ │ │ │ │ ├── README.md │ │ │ │ │ ├── circle.yml │ │ │ │ │ ├── script/ │ │ │ │ │ │ └── release │ │ │ │ │ └── test │ │ │ │ ├── LICENSE │ │ │ │ ├── Quick/ │ │ │ │ │ ├── Callsite.swift │ │ │ │ │ ├── Configuration/ │ │ │ │ │ │ ├── Configuration.swift │ │ │ │ │ │ ├── QuickConfiguration.h │ │ │ │ │ │ └── QuickConfiguration.m │ │ │ │ │ ├── DSL/ │ │ │ │ │ │ ├── DSL.swift │ │ │ │ │ │ ├── QCKDSL.h │ │ │ │ │ │ ├── QCKDSL.m │ │ │ │ │ │ ├── World+DSL.h │ │ │ │ │ │ └── World+DSL.swift │ │ │ │ │ ├── Example.swift │ │ │ │ │ ├── ExampleGroup.swift │ │ │ │ │ ├── ExampleMetadata.swift │ │ │ │ │ ├── Filter.swift │ │ │ │ │ ├── Hooks/ │ │ │ │ │ │ ├── Closures.swift │ │ │ │ │ │ ├── ExampleHooks.swift │ │ │ │ │ │ └── SuiteHooks.swift │ │ │ │ │ ├── Info.plist │ │ │ │ │ ├── NSString+QCKSelectorName.h │ │ │ │ │ ├── NSString+QCKSelectorName.m │ │ │ │ │ ├── Quick.h │ │ │ │ │ ├── QuickSpec.h │ │ │ │ │ ├── QuickSpec.m │ │ │ │ │ ├── World.h │ │ │ │ │ └── World.swift │ │ │ │ ├── Quick Templates/ │ │ │ │ │ ├── Quick Configuration Class.xctemplate/ │ │ │ │ │ │ ├── Objective-C/ │ │ │ │ │ │ │ ├── ___FILEBASENAME___.h │ │ │ │ │ │ │ └── ___FILEBASENAME___.m │ │ │ │ │ │ ├── Swift/ │ │ │ │ │ │ │ └── ___FILEBASENAME___.swift │ │ │ │ │ │ ├── TemplateIcon.icns │ │ │ │ │ │ └── TemplateInfo.plist │ │ │ │ │ └── Quick Spec Class.xctemplate/ │ │ │ │ │ ├── Objective-C/ │ │ │ │ │ │ └── ___FILEBASENAME___.m │ │ │ │ │ ├── Swift/ │ │ │ │ │ │ └── ___FILEBASENAME___.swift │ │ │ │ │ ├── TemplateIcon.icns │ │ │ │ │ └── TemplateInfo.plist │ │ │ │ ├── Quick.podspec │ │ │ │ ├── Quick.xcodeproj/ │ │ │ │ │ ├── project.pbxproj │ │ │ │ │ └── xcshareddata/ │ │ │ │ │ └── xcschemes/ │ │ │ │ │ ├── Quick-OSX.xcscheme │ │ │ │ │ ├── Quick-iOS.xcscheme │ │ │ │ │ └── Quick-tvOS.xcscheme │ │ │ │ ├── QuickFocusedTests/ │ │ │ │ │ ├── FocusedTests+ObjC.m │ │ │ │ │ ├── FocusedTests.swift │ │ │ │ │ └── Info.plist │ │ │ │ ├── QuickTests/ │ │ │ │ │ ├── Fixtures/ │ │ │ │ │ │ └── FunctionalTests_SharedExamplesTests_SharedExamples.swift │ │ │ │ │ ├── FunctionalTests/ │ │ │ │ │ │ ├── AfterEachTests+ObjC.m │ │ │ │ │ │ ├── AfterEachTests.swift │ │ │ │ │ │ ├── AfterSuiteTests+ObjC.m │ │ │ │ │ │ ├── AfterSuiteTests.swift │ │ │ │ │ │ ├── BeforeEachTests+ObjC.m │ │ │ │ │ │ ├── BeforeEachTests.swift │ │ │ │ │ │ ├── BeforeSuiteTests+ObjC.m │ │ │ │ │ │ ├── BeforeSuiteTests.swift │ │ │ │ │ │ ├── Configuration/ │ │ │ │ │ │ │ ├── AfterEach/ │ │ │ │ │ │ │ │ ├── Configuration+AfterEach.swift │ │ │ │ │ │ │ │ └── Configuration+AfterEachTests.swift │ │ │ │ │ │ │ └── BeforeEach/ │ │ │ │ │ │ │ ├── Configuration+BeforeEach.swift │ │ │ │ │ │ │ └── Configuration+BeforeEachTests.swift │ │ │ │ │ │ ├── FailureTests+ObjC.m │ │ │ │ │ │ ├── FailureUsingXCTAssertTests+ObjC.m │ │ │ │ │ │ ├── ItTests+ObjC.m │ │ │ │ │ │ ├── ItTests.swift │ │ │ │ │ │ ├── PendingTests+ObjC.m │ │ │ │ │ │ ├── PendingTests.swift │ │ │ │ │ │ ├── SharedExamples+BeforeEachTests+ObjC.m │ │ │ │ │ │ ├── SharedExamples+BeforeEachTests.swift │ │ │ │ │ │ ├── SharedExamplesTests+ObjC.m │ │ │ │ │ │ └── SharedExamplesTests.swift │ │ │ │ │ ├── Helpers/ │ │ │ │ │ │ ├── QCKSpecRunner.h │ │ │ │ │ │ ├── QCKSpecRunner.m │ │ │ │ │ │ ├── QuickTestsBridgingHeader.h │ │ │ │ │ │ └── XCTestObservationCenter+QCKSuspendObservation.h │ │ │ │ │ ├── Info.plist │ │ │ │ │ └── QuickConfigurationTests.m │ │ │ │ ├── README.md │ │ │ │ ├── Rakefile │ │ │ │ ├── circle.yml │ │ │ │ └── script/ │ │ │ │ └── release │ │ │ ├── Result/ │ │ │ │ ├── .gitignore │ │ │ │ ├── .travis.yml │ │ │ │ ├── CONTRIBUTING.md │ │ │ │ ├── LICENSE │ │ │ │ ├── Package.swift │ │ │ │ ├── README.md │ │ │ │ ├── Result/ │ │ │ │ │ ├── Info.plist │ │ │ │ │ ├── Result.h │ │ │ │ │ ├── Result.swift │ │ │ │ │ └── ResultType.swift │ │ │ │ ├── Result.podspec │ │ │ │ ├── Result.xcodeproj/ │ │ │ │ │ ├── project.pbxproj │ │ │ │ │ └── xcshareddata/ │ │ │ │ │ └── xcschemes/ │ │ │ │ │ ├── Result-Mac.xcscheme │ │ │ │ │ ├── Result-iOS.xcscheme │ │ │ │ │ ├── Result-tvOS.xcscheme │ │ │ │ │ └── Result-watchOS.xcscheme │ │ │ │ └── Tests/ │ │ │ │ ├── Info.plist │ │ │ │ └── ResultTests.swift │ │ │ └── xcconfigs/ │ │ │ ├── .gitignore │ │ │ ├── Base/ │ │ │ │ ├── Common.xcconfig │ │ │ │ ├── Configurations/ │ │ │ │ │ ├── Debug.xcconfig │ │ │ │ │ ├── Profile.xcconfig │ │ │ │ │ ├── Release.xcconfig │ │ │ │ │ └── Test.xcconfig │ │ │ │ └── Targets/ │ │ │ │ ├── Application.xcconfig │ │ │ │ ├── Framework.xcconfig │ │ │ │ └── StaticLibrary.xcconfig │ │ │ ├── Mac OS X/ │ │ │ │ ├── Mac-Application.xcconfig │ │ │ │ ├── Mac-Base.xcconfig │ │ │ │ ├── Mac-DynamicLibrary.xcconfig │ │ │ │ ├── Mac-Framework.xcconfig │ │ │ │ └── Mac-StaticLibrary.xcconfig │ │ │ ├── README.md │ │ │ ├── iOS/ │ │ │ │ ├── iOS-Application.xcconfig │ │ │ │ ├── iOS-Base.xcconfig │ │ │ │ ├── iOS-Framework.xcconfig │ │ │ │ └── iOS-StaticLibrary.xcconfig │ │ │ ├── tvOS/ │ │ │ │ ├── tvOS-Application.xcconfig │ │ │ │ ├── tvOS-Base.xcconfig │ │ │ │ ├── tvOS-Framework.xcconfig │ │ │ │ └── tvOS-StaticLibrary.xcconfig │ │ │ └── watchOS/ │ │ │ ├── watchOS-Application.xcconfig │ │ │ ├── watchOS-Base.xcconfig │ │ │ ├── watchOS-Framework.xcconfig │ │ │ └── watchOS-StaticLibrary.xcconfig │ │ ├── Documentation/ │ │ │ ├── BasicOperators.md │ │ │ ├── DebuggingTechniques.md │ │ │ ├── DesignGuidelines.md │ │ │ ├── FrameworkOverview.md │ │ │ ├── Legacy/ │ │ │ │ ├── BasicOperators.md │ │ │ │ ├── DesignGuidelines.md │ │ │ │ ├── FrameworkOverview.md │ │ │ │ ├── MemoryManagement.md │ │ │ │ └── README.md │ │ │ ├── ObjectiveCBridging.md │ │ │ └── README.md │ │ ├── Instruments/ │ │ │ ├── Disposable Growth.tracetemplate │ │ │ ├── README.md │ │ │ └── Signal Events.tracetemplate │ │ ├── LICENSE.md │ │ ├── Logo/ │ │ │ └── README.md │ │ ├── README.md │ │ ├── ReactiveCocoa/ │ │ │ ├── Info.plist │ │ │ ├── Objective-C/ │ │ │ │ ├── MKAnnotationView+RACSignalSupport.h │ │ │ │ ├── MKAnnotationView+RACSignalSupport.m │ │ │ │ ├── NSArray+RACSequenceAdditions.h │ │ │ │ ├── NSArray+RACSequenceAdditions.m │ │ │ │ ├── NSControl+RACCommandSupport.h │ │ │ │ ├── NSControl+RACCommandSupport.m │ │ │ │ ├── NSControl+RACTextSignalSupport.h │ │ │ │ ├── NSControl+RACTextSignalSupport.m │ │ │ │ ├── NSData+RACSupport.h │ │ │ │ ├── NSData+RACSupport.m │ │ │ │ ├── NSDictionary+RACSequenceAdditions.h │ │ │ │ ├── NSDictionary+RACSequenceAdditions.m │ │ │ │ ├── NSEnumerator+RACSequenceAdditions.h │ │ │ │ ├── NSEnumerator+RACSequenceAdditions.m │ │ │ │ ├── NSFileHandle+RACSupport.h │ │ │ │ ├── NSFileHandle+RACSupport.m │ │ │ │ ├── NSIndexSet+RACSequenceAdditions.h │ │ │ │ ├── NSIndexSet+RACSequenceAdditions.m │ │ │ │ ├── NSInvocation+RACTypeParsing.h │ │ │ │ ├── NSInvocation+RACTypeParsing.m │ │ │ │ ├── NSNotificationCenter+RACSupport.h │ │ │ │ ├── NSNotificationCenter+RACSupport.m │ │ │ │ ├── NSObject+RACAppKitBindings.h │ │ │ │ ├── NSObject+RACAppKitBindings.m │ │ │ │ ├── NSObject+RACDeallocating.h │ │ │ │ ├── NSObject+RACDeallocating.m │ │ │ │ ├── NSObject+RACDescription.h │ │ │ │ ├── NSObject+RACDescription.m │ │ │ │ ├── NSObject+RACKVOWrapper.h │ │ │ │ ├── NSObject+RACKVOWrapper.m │ │ │ │ ├── NSObject+RACLifting.h │ │ │ │ ├── NSObject+RACLifting.m │ │ │ │ ├── NSObject+RACPropertySubscribing.h │ │ │ │ ├── NSObject+RACPropertySubscribing.m │ │ │ │ ├── NSObject+RACSelectorSignal.h │ │ │ │ ├── NSObject+RACSelectorSignal.m │ │ │ │ ├── NSOrderedSet+RACSequenceAdditions.h │ │ │ │ ├── NSOrderedSet+RACSequenceAdditions.m │ │ │ │ ├── NSSet+RACSequenceAdditions.h │ │ │ │ ├── NSSet+RACSequenceAdditions.m │ │ │ │ ├── NSString+RACKeyPathUtilities.h │ │ │ │ ├── NSString+RACKeyPathUtilities.m │ │ │ │ ├── NSString+RACSequenceAdditions.h │ │ │ │ ├── NSString+RACSequenceAdditions.m │ │ │ │ ├── NSString+RACSupport.h │ │ │ │ ├── NSString+RACSupport.m │ │ │ │ ├── NSText+RACSignalSupport.h │ │ │ │ ├── NSText+RACSignalSupport.m │ │ │ │ ├── NSURLConnection+RACSupport.h │ │ │ │ ├── NSURLConnection+RACSupport.m │ │ │ │ ├── NSUserDefaults+RACSupport.h │ │ │ │ ├── NSUserDefaults+RACSupport.m │ │ │ │ ├── RACArraySequence.h │ │ │ │ ├── RACArraySequence.m │ │ │ │ ├── RACBehaviorSubject.h │ │ │ │ ├── RACBehaviorSubject.m │ │ │ │ ├── RACBlockTrampoline.h │ │ │ │ ├── RACBlockTrampoline.m │ │ │ │ ├── RACChannel.h │ │ │ │ ├── RACChannel.m │ │ │ │ ├── RACCommand.h │ │ │ │ ├── RACCommand.m │ │ │ │ ├── RACCompoundDisposable.h │ │ │ │ ├── RACCompoundDisposable.m │ │ │ │ ├── RACCompoundDisposableProvider.d │ │ │ │ ├── RACDelegateProxy.h │ │ │ │ ├── RACDelegateProxy.m │ │ │ │ ├── RACDisposable.h │ │ │ │ ├── RACDisposable.m │ │ │ │ ├── RACDynamicPropertySuperclass.h │ │ │ │ ├── RACDynamicPropertySuperclass.m │ │ │ │ ├── RACDynamicSequence.h │ │ │ │ ├── RACDynamicSequence.m │ │ │ │ ├── RACDynamicSignal.h │ │ │ │ ├── RACDynamicSignal.m │ │ │ │ ├── RACEagerSequence.h │ │ │ │ ├── RACEagerSequence.m │ │ │ │ ├── RACEmptySequence.h │ │ │ │ ├── RACEmptySequence.m │ │ │ │ ├── RACEmptySignal.h │ │ │ │ ├── RACEmptySignal.m │ │ │ │ ├── RACErrorSignal.h │ │ │ │ ├── RACErrorSignal.m │ │ │ │ ├── RACEvent.h │ │ │ │ ├── RACEvent.m │ │ │ │ ├── RACGroupedSignal.h │ │ │ │ ├── RACGroupedSignal.m │ │ │ │ ├── RACImmediateScheduler.h │ │ │ │ ├── RACImmediateScheduler.m │ │ │ │ ├── RACIndexSetSequence.h │ │ │ │ ├── RACIndexSetSequence.m │ │ │ │ ├── RACKVOChannel.h │ │ │ │ ├── RACKVOChannel.m │ │ │ │ ├── RACKVOProxy.h │ │ │ │ ├── RACKVOProxy.m │ │ │ │ ├── RACKVOTrampoline.h │ │ │ │ ├── RACKVOTrampoline.m │ │ │ │ ├── RACMulticastConnection+Private.h │ │ │ │ ├── RACMulticastConnection.h │ │ │ │ ├── RACMulticastConnection.m │ │ │ │ ├── RACObjCRuntime.h │ │ │ │ ├── RACObjCRuntime.m │ │ │ │ ├── RACPassthroughSubscriber.h │ │ │ │ ├── RACPassthroughSubscriber.m │ │ │ │ ├── RACQueueScheduler+Subclass.h │ │ │ │ ├── RACQueueScheduler.h │ │ │ │ ├── RACQueueScheduler.m │ │ │ │ ├── RACReplaySubject.h │ │ │ │ ├── RACReplaySubject.m │ │ │ │ ├── RACReturnSignal.h │ │ │ │ ├── RACReturnSignal.m │ │ │ │ ├── RACScheduler+Private.h │ │ │ │ ├── RACScheduler+Subclass.h │ │ │ │ ├── RACScheduler.h │ │ │ │ ├── RACScheduler.m │ │ │ │ ├── RACScopedDisposable.h │ │ │ │ ├── RACScopedDisposable.m │ │ │ │ ├── RACSequence.h │ │ │ │ ├── RACSequence.m │ │ │ │ ├── RACSerialDisposable.h │ │ │ │ ├── RACSerialDisposable.m │ │ │ │ ├── RACSignal+Operations.h │ │ │ │ ├── RACSignal+Operations.m │ │ │ │ ├── RACSignal.h │ │ │ │ ├── RACSignal.m │ │ │ │ ├── RACSignalProvider.d │ │ │ │ ├── RACSignalSequence.h │ │ │ │ ├── RACSignalSequence.m │ │ │ │ ├── RACStream+Private.h │ │ │ │ ├── RACStream.h │ │ │ │ ├── RACStream.m │ │ │ │ ├── RACStringSequence.h │ │ │ │ ├── RACStringSequence.m │ │ │ │ ├── RACSubject.h │ │ │ │ ├── RACSubject.m │ │ │ │ ├── RACSubscriber+Private.h │ │ │ │ ├── RACSubscriber.h │ │ │ │ ├── RACSubscriber.m │ │ │ │ ├── RACSubscriptingAssignmentTrampoline.h │ │ │ │ ├── RACSubscriptingAssignmentTrampoline.m │ │ │ │ ├── RACSubscriptionScheduler.h │ │ │ │ ├── RACSubscriptionScheduler.m │ │ │ │ ├── RACTargetQueueScheduler.h │ │ │ │ ├── RACTargetQueueScheduler.m │ │ │ │ ├── RACTestScheduler.h │ │ │ │ ├── RACTestScheduler.m │ │ │ │ ├── RACTuple.h │ │ │ │ ├── RACTuple.m │ │ │ │ ├── RACTupleSequence.h │ │ │ │ ├── RACTupleSequence.m │ │ │ │ ├── RACUnarySequence.h │ │ │ │ ├── RACUnarySequence.m │ │ │ │ ├── RACUnit.h │ │ │ │ ├── RACUnit.m │ │ │ │ ├── RACValueTransformer.h │ │ │ │ ├── RACValueTransformer.m │ │ │ │ ├── ReactiveCocoa-Bridging-Header.h │ │ │ │ ├── UIActionSheet+RACSignalSupport.h │ │ │ │ ├── UIActionSheet+RACSignalSupport.m │ │ │ │ ├── UIAlertView+RACSignalSupport.h │ │ │ │ ├── UIAlertView+RACSignalSupport.m │ │ │ │ ├── UIBarButtonItem+RACCommandSupport.h │ │ │ │ ├── UIBarButtonItem+RACCommandSupport.m │ │ │ │ ├── UIButton+RACCommandSupport.h │ │ │ │ ├── UIButton+RACCommandSupport.m │ │ │ │ ├── UICollectionReusableView+RACSignalSupport.h │ │ │ │ ├── UICollectionReusableView+RACSignalSupport.m │ │ │ │ ├── UIControl+RACSignalSupport.h │ │ │ │ ├── UIControl+RACSignalSupport.m │ │ │ │ ├── UIControl+RACSignalSupportPrivate.h │ │ │ │ ├── UIControl+RACSignalSupportPrivate.m │ │ │ │ ├── UIDatePicker+RACSignalSupport.h │ │ │ │ ├── UIDatePicker+RACSignalSupport.m │ │ │ │ ├── UIGestureRecognizer+RACSignalSupport.h │ │ │ │ ├── UIGestureRecognizer+RACSignalSupport.m │ │ │ │ ├── UIImagePickerController+RACSignalSupport.h │ │ │ │ ├── UIImagePickerController+RACSignalSupport.m │ │ │ │ ├── UIRefreshControl+RACCommandSupport.h │ │ │ │ ├── UIRefreshControl+RACCommandSupport.m │ │ │ │ ├── UISegmentedControl+RACSignalSupport.h │ │ │ │ ├── UISegmentedControl+RACSignalSupport.m │ │ │ │ ├── UISlider+RACSignalSupport.h │ │ │ │ ├── UISlider+RACSignalSupport.m │ │ │ │ ├── UIStepper+RACSignalSupport.h │ │ │ │ ├── UIStepper+RACSignalSupport.m │ │ │ │ ├── UISwitch+RACSignalSupport.h │ │ │ │ ├── UISwitch+RACSignalSupport.m │ │ │ │ ├── UITableViewCell+RACSignalSupport.h │ │ │ │ ├── UITableViewCell+RACSignalSupport.m │ │ │ │ ├── UITableViewHeaderFooterView+RACSignalSupport.h │ │ │ │ ├── UITableViewHeaderFooterView+RACSignalSupport.m │ │ │ │ ├── UITextField+RACSignalSupport.h │ │ │ │ ├── UITextField+RACSignalSupport.m │ │ │ │ ├── UITextView+RACSignalSupport.h │ │ │ │ ├── UITextView+RACSignalSupport.m │ │ │ │ └── extobjc/ │ │ │ │ ├── EXTKeyPathCoding.h │ │ │ │ ├── EXTRuntimeExtensions.h │ │ │ │ ├── EXTRuntimeExtensions.m │ │ │ │ ├── EXTScope.h │ │ │ │ └── metamacros.h │ │ │ ├── ReactiveCocoa.h │ │ │ └── Swift/ │ │ │ ├── Action.swift │ │ │ ├── Atomic.swift │ │ │ ├── Bag.swift │ │ │ ├── Disposable.swift │ │ │ ├── Event.swift │ │ │ ├── Flatten.swift │ │ │ ├── FoundationExtensions.swift │ │ │ ├── ObjectiveCBridging.swift │ │ │ ├── Observer.swift │ │ │ ├── Optional.swift │ │ │ ├── Property.swift │ │ │ ├── Scheduler.swift │ │ │ ├── Signal.swift │ │ │ ├── SignalProducer.swift │ │ │ └── TupleExtensions.swift │ │ ├── ReactiveCocoa.xcodeproj/ │ │ │ ├── project.pbxproj │ │ │ └── xcshareddata/ │ │ │ └── xcschemes/ │ │ │ ├── ReactiveCocoa-Mac.xcscheme │ │ │ ├── ReactiveCocoa-iOS.xcscheme │ │ │ ├── ReactiveCocoa-tvOS.xcscheme │ │ │ └── ReactiveCocoa-watchOS.xcscheme │ │ ├── ReactiveCocoaTests/ │ │ │ ├── Info.plist │ │ │ ├── Objective-C/ │ │ │ │ ├── NSControllerRACSupportSpec.m │ │ │ │ ├── NSEnumeratorRACSequenceAdditionsSpec.m │ │ │ │ ├── NSNotificationCenterRACSupportSpec.m │ │ │ │ ├── NSObjectRACAppKitBindingsSpec.m │ │ │ │ ├── NSObjectRACDeallocatingSpec.m │ │ │ │ ├── NSObjectRACLiftingSpec.m │ │ │ │ ├── NSObjectRACPropertySubscribingExamples.h │ │ │ │ ├── NSObjectRACPropertySubscribingExamples.m │ │ │ │ ├── NSObjectRACPropertySubscribingSpec.m │ │ │ │ ├── NSObjectRACSelectorSignalSpec.m │ │ │ │ ├── NSStringRACKeyPathUtilitiesSpec.m │ │ │ │ ├── NSURLConnectionRACSupportSpec.m │ │ │ │ ├── NSUserDefaultsRACSupportSpec.m │ │ │ │ ├── RACBlockTrampolineSpec.m │ │ │ │ ├── RACChannelExamples.h │ │ │ │ ├── RACChannelExamples.m │ │ │ │ ├── RACChannelSpec.m │ │ │ │ ├── RACCommandSpec.m │ │ │ │ ├── RACCompoundDisposableSpec.m │ │ │ │ ├── RACControlCommandExamples.h │ │ │ │ ├── RACControlCommandExamples.m │ │ │ │ ├── RACDelegateProxySpec.m │ │ │ │ ├── RACDisposableSpec.m │ │ │ │ ├── RACEventSpec.m │ │ │ │ ├── RACKVOChannelSpec.m │ │ │ │ ├── RACKVOProxySpec.m │ │ │ │ ├── RACKVOWrapperSpec.m │ │ │ │ ├── RACMulticastConnectionSpec.m │ │ │ │ ├── RACPropertySignalExamples.h │ │ │ │ ├── RACPropertySignalExamples.m │ │ │ │ ├── RACSchedulerSpec.m │ │ │ │ ├── RACSequenceAdditionsSpec.m │ │ │ │ ├── RACSequenceExamples.h │ │ │ │ ├── RACSequenceExamples.m │ │ │ │ ├── RACSequenceSpec.m │ │ │ │ ├── RACSerialDisposableSpec.m │ │ │ │ ├── RACSignalSpec.m │ │ │ │ ├── RACStreamExamples.h │ │ │ │ ├── RACStreamExamples.m │ │ │ │ ├── RACSubclassObject.h │ │ │ │ ├── RACSubclassObject.m │ │ │ │ ├── RACSubjectSpec.m │ │ │ │ ├── RACSubscriberExamples.h │ │ │ │ ├── RACSubscriberExamples.m │ │ │ │ ├── RACSubscriberSpec.m │ │ │ │ ├── RACSubscriptingAssignmentTrampolineSpec.m │ │ │ │ ├── RACTargetQueueSchedulerSpec.m │ │ │ │ ├── RACTestExampleScheduler.h │ │ │ │ ├── RACTestExampleScheduler.m │ │ │ │ ├── RACTestObject.h │ │ │ │ ├── RACTestObject.m │ │ │ │ ├── RACTestSchedulerSpec.m │ │ │ │ ├── RACTestUIButton.h │ │ │ │ ├── RACTestUIButton.m │ │ │ │ ├── RACTupleSpec.m │ │ │ │ ├── UIActionSheetRACSupportSpec.m │ │ │ │ ├── UIAlertViewRACSupportSpec.m │ │ │ │ ├── UIBarButtonItemRACSupportSpec.m │ │ │ │ ├── UIButtonRACSupportSpec.m │ │ │ │ └── UIImagePickerControllerRACSupportSpec.m │ │ │ ├── Swift/ │ │ │ │ ├── ActionSpec.swift │ │ │ │ ├── AtomicSpec.swift │ │ │ │ ├── BagSpec.swift │ │ │ │ ├── DisposableSpec.swift │ │ │ │ ├── FlattenSpec.swift │ │ │ │ ├── FoundationExtensionsSpec.swift │ │ │ │ ├── ObjectiveCBridgingSpec.swift │ │ │ │ ├── PropertySpec.swift │ │ │ │ ├── SchedulerSpec.swift │ │ │ │ ├── SignalLifetimeSpec.swift │ │ │ │ ├── SignalProducerLiftingSpec.swift │ │ │ │ ├── SignalProducerNimbleMatchers.swift │ │ │ │ ├── SignalProducerSpec.swift │ │ │ │ ├── SignalSpec.swift │ │ │ │ └── TestError.swift │ │ │ └── test-data.json │ │ └── script/ │ │ ├── LICENSE.md │ │ ├── README.md │ │ ├── bootstrap │ │ ├── cibuild │ │ ├── schemes.awk │ │ ├── targets.awk │ │ ├── xcodebuild.awk │ │ └── xctool.awk │ ├── Result/ │ │ ├── .gitignore │ │ ├── .travis.yml │ │ ├── CONTRIBUTING.md │ │ ├── LICENSE │ │ ├── Package.swift │ │ ├── README.md │ │ ├── Result/ │ │ │ ├── Info.plist │ │ │ ├── Result.h │ │ │ ├── Result.swift │ │ │ └── ResultType.swift │ │ ├── Result.podspec │ │ ├── Result.xcodeproj/ │ │ │ ├── project.pbxproj │ │ │ ├── project.xcworkspace/ │ │ │ │ └── contents.xcworkspacedata │ │ │ └── xcshareddata/ │ │ │ └── xcschemes/ │ │ │ ├── Result-Mac.xcscheme │ │ │ ├── Result-iOS.xcscheme │ │ │ ├── Result-tvOS.xcscheme │ │ │ └── Result-watchOS.xcscheme │ │ └── Tests/ │ │ ├── Info.plist │ │ └── ResultTests.swift │ ├── SIOSocket/ │ │ ├── .gitignore │ │ ├── LICENSE │ │ ├── README.md │ │ ├── SIOSocket.podspec │ │ ├── SocketIO/ │ │ │ ├── Info.plist │ │ │ ├── SocketIO.m │ │ │ └── Source/ │ │ │ ├── SIOSocket.h │ │ │ ├── SIOSocket.m │ │ │ └── socket.io.js.h │ │ ├── SocketIO.xcodeproj/ │ │ │ ├── project.pbxproj │ │ │ ├── project.xcworkspace/ │ │ │ │ └── contents.xcworkspacedata │ │ │ └── xcshareddata/ │ │ │ └── xcschemes/ │ │ │ ├── SocketIOFramework.xcscheme │ │ │ └── SocketIOHost.xcscheme │ │ ├── SocketIOFramework/ │ │ │ ├── Info.plist │ │ │ └── SocketIOFramework.h │ │ ├── SocketIOHost/ │ │ │ ├── AppDelegate.h │ │ │ ├── AppDelegate.m │ │ │ ├── Base.lproj/ │ │ │ │ └── Main.storyboard │ │ │ ├── Images.xcassets/ │ │ │ │ ├── AppIcon.appiconset/ │ │ │ │ │ └── Contents.json │ │ │ │ └── LaunchImage.launchimage/ │ │ │ │ └── Contents.json │ │ │ ├── Info.plist │ │ │ ├── ViewController.h │ │ │ ├── ViewController.m │ │ │ └── main.m │ │ └── socket_tester/ │ │ └── app.js │ ├── SwiftyJSON/ │ │ ├── .gitignore │ │ ├── .travis.yml │ │ ├── CHANGELOG.md │ │ ├── Example/ │ │ │ ├── Example/ │ │ │ │ ├── AppDelegate.swift │ │ │ │ ├── Base.lproj/ │ │ │ │ │ ├── LaunchScreen.xib │ │ │ │ │ └── Main.storyboard │ │ │ │ ├── Images.xcassets/ │ │ │ │ │ ├── AppIcon.appiconset/ │ │ │ │ │ │ └── Contents.json │ │ │ │ │ └── LaunchImage.launchimage/ │ │ │ │ │ └── Contents.json │ │ │ │ ├── Info.plist │ │ │ │ ├── SwiftyJSONTests.json │ │ │ │ └── ViewController.swift │ │ │ ├── Example.xcodeproj/ │ │ │ │ ├── project.pbxproj │ │ │ │ └── project.xcworkspace/ │ │ │ │ └── contents.xcworkspacedata │ │ │ └── Playground.playground/ │ │ │ ├── Contents.swift │ │ │ ├── contents.xcplayground │ │ │ └── timeline.xctimeline │ │ ├── LICENSE │ │ ├── Package.swift │ │ ├── README.md │ │ ├── Source/ │ │ │ ├── Info-OSX.plist │ │ │ ├── Info-iOS.plist │ │ │ ├── Info-tvOS.plist │ │ │ ├── Info-watchOS.plist │ │ │ ├── SwiftyJSON.h │ │ │ └── SwiftyJSON.swift │ │ ├── SwiftyJSON.podspec │ │ ├── SwiftyJSON.xcodeproj/ │ │ │ ├── project.pbxproj │ │ │ ├── project.xcworkspace/ │ │ │ │ └── contents.xcworkspacedata │ │ │ └── xcshareddata/ │ │ │ └── xcschemes/ │ │ │ ├── SwiftyJSON OSX.xcscheme │ │ │ ├── SwiftyJSON iOS.xcscheme │ │ │ ├── SwiftyJSON tvOS.xcscheme │ │ │ └── SwiftyJSON watchOS.xcscheme │ │ ├── SwiftyJSON.xcworkspace/ │ │ │ ├── contents.xcworkspacedata │ │ │ └── xcshareddata/ │ │ │ └── WorkspaceSettings.xcsettings │ │ ├── Tests/ │ │ │ ├── ArrayTests.swift │ │ │ ├── BaseTests.swift │ │ │ ├── ComparableTests.swift │ │ │ ├── DictionaryTests.swift │ │ │ ├── Info-OSX.plist │ │ │ ├── Info-iOS.plist │ │ │ ├── Info-tvOS.plist │ │ │ ├── LiteralConvertibleTests.swift │ │ │ ├── NumberTests.swift │ │ │ ├── PerformanceTests.swift │ │ │ ├── PrintableTests.swift │ │ │ ├── RawRepresentableTests.swift │ │ │ ├── RawTests.swift │ │ │ ├── SequenceTypeTests.swift │ │ │ ├── StringTests.swift │ │ │ ├── SubscriptTests.swift │ │ │ └── Tests.json │ │ └── scripts/ │ │ └── ci.sh │ ├── iso-8601-date-formatter/ │ │ ├── .gitignore │ │ ├── .hgtags │ │ ├── .travis.yml │ │ ├── AppledocSettings.plist │ │ ├── ISO8601DateFormatter.h │ │ ├── ISO8601DateFormatter.m │ │ ├── ISO8601ForCocoa/ │ │ │ ├── ISO8601DateFormatter/ │ │ │ │ ├── ISO8601.h │ │ │ │ └── Info.plist │ │ │ ├── ISO8601ForCocoa/ │ │ │ │ └── ISO8601ForCocoa-Prefix.pch │ │ │ ├── ISO8601ForCocoa.xcodeproj/ │ │ │ │ ├── project.pbxproj │ │ │ │ ├── project.xcworkspace/ │ │ │ │ │ └── contents.xcworkspacedata │ │ │ │ └── xcshareddata/ │ │ │ │ └── xcschemes/ │ │ │ │ ├── ISO8601DateFormatter.xcscheme │ │ │ │ ├── ISO8601ForCocoa.xcscheme │ │ │ │ └── ISO8601ForCocoaTouch.xcscheme │ │ │ ├── ISO8601ForCocoaTests/ │ │ │ │ ├── ISO8601ForCocoaCalendarDateTests.h │ │ │ │ ├── ISO8601ForCocoaCalendarDateTests.m │ │ │ │ ├── ISO8601ForCocoaTests-Info.plist │ │ │ │ ├── ISO8601ForCocoaTimeOnlyTests.h │ │ │ │ ├── ISO8601ForCocoaTimeOnlyTests.m │ │ │ │ ├── ISO8601ForCocoaWeekDateTests.h │ │ │ │ ├── ISO8601ForCocoaWeekDateTests.m │ │ │ │ ├── ISO8601Testing.h │ │ │ │ ├── ISO8601Testing.m │ │ │ │ ├── MBMockLocale.h │ │ │ │ ├── MBMockLocale.m │ │ │ │ ├── NSLocale+UnitTestSwizzling.h │ │ │ │ ├── NSLocale+UnitTestSwizzling.m │ │ │ │ ├── PRHNamedCharacter.h │ │ │ │ └── en.lproj/ │ │ │ │ └── InfoPlist.strings │ │ │ ├── ISO8601ForCocoaTouch/ │ │ │ │ └── ISO8601ForCocoaTouch-Prefix.pch │ │ │ └── ISO8601ForCocoaTouchTests/ │ │ │ ├── ISO8601ForCocoaTouchTests-Info.plist │ │ │ ├── ISO8601MemoryWarningTests.h │ │ │ ├── ISO8601MemoryWarningTests.m │ │ │ └── en.lproj/ │ │ │ └── InfoPlist.strings │ │ ├── LICENSE.txt │ │ ├── Makefile │ │ ├── README.md │ │ ├── test_files/ │ │ │ ├── 2005-2006.txt │ │ │ ├── 2005.txt │ │ │ ├── 2006.txt │ │ │ ├── 2009-2010.txt │ │ │ ├── januaries.txt │ │ │ └── januaries3.txt │ │ ├── testparser.m │ │ ├── testparser.sh.in │ │ ├── testparser.sh.py │ │ ├── testunparser.sh │ │ ├── testunparsewithtime.m │ │ ├── timetrial.m │ │ ├── unparse-date.m │ │ ├── unparse-ordinaldate.m │ │ └── unparse-weekdate.m │ └── socket.io-client-swift/ │ ├── .gitignore │ ├── .travis.yml │ ├── LICENSE │ ├── Package.swift │ ├── README.md │ ├── Socket.IO-Client-Swift.podspec │ ├── Socket.IO-Test-Server/ │ │ ├── TestCases.js │ │ ├── acknowledgementEvents.js │ │ ├── emitEvents.js │ │ ├── main.js │ │ ├── package.json │ │ └── socketEventRegister.js │ ├── SocketIO-Mac/ │ │ ├── Info.plist │ │ └── SocketIO-Mac.h │ ├── SocketIO-MacTests/ │ │ ├── Info.plist │ │ ├── SocketAckManagerTest.swift │ │ ├── SocketBasicPacketTest.swift │ │ ├── SocketEngineTest.swift │ │ ├── SocketNamespacePacketTest.swift │ │ ├── SocketParserTest.swift │ │ └── SocketSideEffectTest.swift │ ├── SocketIO-iOS/ │ │ ├── Info.plist │ │ └── SocketIO-iOS.h │ ├── SocketIO-iOSTests/ │ │ └── Info.plist │ └── Source/ │ ├── SocketAckEmitter.swift │ ├── SocketAckManager.swift │ ├── SocketAnyEvent.swift │ ├── SocketClientSpec.swift │ ├── SocketEngine.swift │ ├── SocketEngineClient.swift │ ├── SocketEnginePacketType.swift │ ├── SocketEnginePollable.swift │ ├── SocketEngineSpec.swift │ ├── SocketEngineWebsocket.swift │ ├── SocketEventHandler.swift │ ├── SocketFixUTF8.swift │ ├── SocketIOClient.swift │ ├── SocketIOClientOption.swift │ ├── SocketIOClientStatus.swift │ ├── SocketLogger.swift │ ├── SocketPacket.swift │ ├── SocketParsable.swift │ ├── SocketStringReader.swift │ ├── SocketTypes.swift │ ├── SwiftRegex.swift │ └── WebSocket.swift └── README.md
SYMBOL INDEX (31 symbols across 14 files)
FILE: Carthage/Checkouts/ReactiveCocoa/Carthage/Checkouts/Quick/Quick/DSL/QCKDSL.h
type NSDictionary (line 48) | typedef NSDictionary *(^QCKDSLSharedExampleContext)(void);
function beforeSuite (line 81) | static inline void beforeSuite(QCKDSLEmptyBlock closure) {
function afterSuite (line 96) | static inline void afterSuite(QCKDSLEmptyBlock closure) {
function sharedExamples (line 110) | static inline void sharedExamples(NSString *name, QCKDSLSharedExampleBlo...
function describe (line 121) | static inline void describe(NSString *description, QCKDSLEmptyBlock clos...
function context (line 128) | static inline void context(NSString *description, QCKDSLEmptyBlock closu...
function beforeEach (line 140) | static inline void beforeEach(QCKDSLEmptyBlock closure) {
function beforeEachWithMetadata (line 148) | static inline void beforeEachWithMetadata(QCKDSLExampleMetadataBlock clo...
function afterEach (line 160) | static inline void afterEach(QCKDSLEmptyBlock closure) {
function afterEachWithMetadata (line 168) | static inline void afterEachWithMetadata(QCKDSLExampleMetadataBlock clos...
function pending (line 179) | static inline void pending(NSString *description, QCKDSLEmptyBlock closu...
function xdescribe (line 187) | static inline void xdescribe(NSString *description, QCKDSLEmptyBlock clo...
function xcontext (line 195) | static inline void xcontext(NSString *description, QCKDSLEmptyBlock clos...
function fdescribe (line 204) | static inline void fdescribe(NSString *description, QCKDSLEmptyBlock clo...
function fcontext (line 211) | static inline void fcontext(NSString *description, QCKDSLEmptyBlock clos...
FILE: Carthage/Checkouts/ReactiveCocoa/ReactiveCocoa/Objective-C/RACEvent.h
type RACEventTypeCompleted (line 16) | typedef NS_ENUM(NSUInteger, RACEventType) {
FILE: Carthage/Checkouts/ReactiveCocoa/ReactiveCocoa/Objective-C/RACScheduler.h
type RACSchedulerPriority (line 17) | typedef enum : long {
FILE: Carthage/Checkouts/ReactiveCocoa/ReactiveCocoa/Objective-C/RACStream.h
type RACStream (line 18) | typedef RACStream * (^RACStreamBindBlock)(id value, BOOL *stop);
FILE: Carthage/Checkouts/ReactiveCocoa/ReactiveCocoa/Objective-C/RACTuple.h
function end (line 97) | end
FILE: Carthage/Checkouts/ReactiveCocoa/ReactiveCocoa/Objective-C/extobjc/EXTRuntimeExtensions.h
type rac_propertyMemoryManagementPolicy (line 15) | typedef enum {
type rac_propertyAttributes (line 35) | typedef struct {
FILE: Carthage/Checkouts/ReactiveCocoa/ReactiveCocoa/Objective-C/extobjc/EXTScope.h
function rac_executeCleanupBlock (line 93) | static inline void rac_executeCleanupBlock (__strong rac_cleanupBlock_t ...
FILE: Carthage/Checkouts/ReactiveCocoa/ReactiveCocoaTests/Objective-C/RACTestObject.h
type RACTestStruct (line 12) | typedef struct {
FILE: Carthage/Checkouts/SIOSocket/SocketIO/Source/SIOSocket.h
type NSArray (line 12) | typedef NSArray SIOParameterArray;
FILE: Carthage/Checkouts/SIOSocket/SocketIO/Source/socket.io.js.h
function NSString (line 19) | static NSString *socket_io_js_constructor(NSString *hostURL, BOOL reconn...
FILE: Carthage/Checkouts/iso-8601-date-formatter/ISO8601DateFormatter.h
type ISO8601DateFormatCalendar (line 10) | typedef NS_ENUM(NSUInteger, ISO8601DateFormat) {
function interface (line 40) | interface ISO8601DateFormatter: NSFormatter
FILE: Carthage/Checkouts/socket.io-client-swift/Socket.IO-Test-Server/acknowledgementEvents.js
function socketCallback (line 1) | function socketCallback(testKey, socket, testCase) {
FILE: Carthage/Checkouts/socket.io-client-swift/Socket.IO-Test-Server/emitEvents.js
function socketCallback (line 1) | function socketCallback(testKey, socket, testCase) {
function addArrays (line 10) | function addArrays(firstArray, secondArray) {
FILE: Carthage/Checkouts/socket.io-client-swift/Socket.IO-Test-Server/socketEventRegister.js
function registerSocketForEvents (line 3) | function registerSocketForEvents(ioSocket, socketCallback, testKind) {
Condensed preview — 926 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (4,380K chars).
[
{
"path": ".gitignore",
"chars": 323,
"preview": "## Build generated\nbuild/\nDerivedData\n\n## Various settings\n*.pbxuser\n!default.pbxuser\n*.mode1v3\n!default.mode1v3\n*.mode2"
},
{
"path": "BrewMobile/AppDelegate.swift",
"chars": 3148,
"preview": "//\n// AppDelegate.swift\n// BrewMobile\n//\n// Created by Ágnes Vásárhelyi on 19/08/14.\n// Copyright (c) 2014 Ágnes Vás"
},
{
"path": "BrewMobile/BrewManager.swift",
"chars": 3389,
"preview": "//\n// BrewManager.swift\n// BrewMobile\n//\n// Created by Agnes Vasarhelyi on 03/01/15.\n// Copyright (c) 2015 Ágnes Vás"
},
{
"path": "BrewMobile/ContentParser.swift",
"chars": 1287,
"preview": "//\n// ContentParser.swift\n// BrewMobile\n//\n// Created by Ágnes Vásárhelyi on 19/08/14.\n// Copyright (c) 2014 Ágnes V"
},
{
"path": "BrewMobile/Images.xcassets/AppIcon.appiconset/Contents.json",
"chars": 575,
"preview": "{\n \"images\" : [\n {\n \"size\" : \"29x29\",\n \"idiom\" : \"iphone\",\n \"filename\" : \"icon58.png\",\n \"scale\" "
},
{
"path": "BrewMobile/Images.xcassets/DesignerIcon.imageset/Contents.json",
"chars": 394,
"preview": "{\n \"images\" : [\n {\n \"idiom\" : \"universal\",\n \"scale\" : \"1x\",\n \"filename\" : \"edit-disabled-2.png\"\n }"
},
{
"path": "BrewMobile/Images.xcassets/HopIcon.imageset/Contents.json",
"chars": 397,
"preview": "{\n \"images\" : [\n {\n \"idiom\" : \"universal\",\n \"scale\" : \"1x\",\n \"filename\" : \"hops-disabled2-2.png\"\n "
},
{
"path": "BrewMobile/Images.xcassets/LaunchImage.launchimage/Contents.json",
"chars": 519,
"preview": "{\n \"images\" : [\n {\n \"orientation\" : \"portrait\",\n \"idiom\" : \"iphone\",\n \"extent\" : \"full-screen\",\n "
},
{
"path": "BrewMobile/Info.plist",
"chars": 1081,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/P"
},
{
"path": "BrewMobile/Model/BrewPhase.swift",
"chars": 3186,
"preview": "//\n// BrewPhase.swift\n// BrewMobile\n//\n// Created by Ágnes Vásárhelyi on 14/09/14.\n// Copyright (c) 2014 Ágnes Vásár"
},
{
"path": "BrewMobile/Model/BrewState.swift",
"chars": 2993,
"preview": "//\n// BrewState.swift\n// BrewMobile\n//\n// Created by Ágnes Vásárhelyi on 14/09/14.\n// Copyright (c) 2014 Ágnes Vásár"
},
{
"path": "BrewMobile/RACUtils/RAC.swift",
"chars": 2606,
"preview": "//\n// RAC.swift\n//\n// Created by Colin Eberhardt on 15/07/2014.\n// Copyright (c) 2014 Colin Eberhardt. All rights res"
},
{
"path": "BrewMobile/View/BrewCell.swift",
"chars": 424,
"preview": "//\n// BrewCell.swift\n// BrewMobile\n//\n// Created by Agnes Vasarhelyi on 04/01/15.\n// Copyright (c) 2015 Ágnes Vásárh"
},
{
"path": "BrewMobile/View/BrewCell.xib",
"chars": 3909,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>\n<document type=\"com.apple.InterfaceBuilder3.CocoaTouch.XIB\" versi"
},
{
"path": "BrewMobile/View/BrewDesignerViewController.swift",
"chars": 9264,
"preview": "//\n// BrewDesignerViewController.swift\n// BrewMobile\n//\n// Created by Ágnes Vásárhelyi on 07/11/14.\n// Copyright (c)"
},
{
"path": "BrewMobile/View/BrewDesignerViewController.xib",
"chars": 17031,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>\n<document type=\"com.apple.InterfaceBuilder3.CocoaTouch.XIB\" versi"
},
{
"path": "BrewMobile/View/BrewNewPhaseViewController.swift",
"chars": 4279,
"preview": "//\n// BrewNewPhaseViewController.swift\n// BrewMobile\n//\n// Created by Ágnes Vásárhelyi on 08/11/14.\n// Copyright (c)"
},
{
"path": "BrewMobile/View/BrewNewPhaseViewController.xib",
"chars": 7392,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>\n<document type=\"com.apple.InterfaceBuilder3.CocoaTouch.XIB\" versi"
},
{
"path": "BrewMobile/View/BrewViewController.swift",
"chars": 4293,
"preview": "//\n// ViewController.swift\n// BrewMobile\n//\n// Created by Ágnes Vásárhelyi on 19/08/14.\n// Copyright (c) 2014 Ágnes "
},
{
"path": "BrewMobile/View/BrewViewController.xib",
"chars": 10211,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>\n<document type=\"com.apple.InterfaceBuilder3.CocoaTouch.XIB\" versi"
},
{
"path": "BrewMobile/View/PhaseCell.swift",
"chars": 247,
"preview": "//\n// PhaseCell.swift\n// BrewMobile\n//\n// Created by Agnes Vasarhelyi on 04/01/15.\n// Copyright (c) 2015 Ágnes Vásár"
},
{
"path": "BrewMobile/View/PhaseCell.xib",
"chars": 3206,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>\n<document type=\"com.apple.InterfaceBuilder3.CocoaTouch.XIB\" versi"
},
{
"path": "BrewMobile/ViewModel/BrewDesignerViewModel.swift",
"chars": 1287,
"preview": "//\n// BrewDesignerViewModel.swift\n// BrewMobile\n//\n// Created by Agnes Vasarhelyi on 01/03/15.\n// Copyright (c) 2015"
},
{
"path": "BrewMobile/ViewModel/BrewViewModel.swift",
"chars": 778,
"preview": "//\n// BrewViewModel.swift\n// BrewMobile\n//\n// Created by Agnes Vasarhelyi on 04/01/15.\n// Copyright (c) 2015 Ágnes V"
},
{
"path": "BrewMobile.xcodeproj/project.pbxproj",
"chars": 32908,
"preview": "// !$*UTF8*$!\n{\n\tarchiveVersion = 1;\n\tclasses = {\n\t};\n\tobjectVersion = 46;\n\tobjects = {\n\n/* Begin PBXBuildFile section *"
},
{
"path": "BrewMobile.xcodeproj/project.xcworkspace/contents.xcworkspacedata",
"chars": 155,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Workspace\n version = \"1.0\">\n <FileRef\n location = \"self:BrewMobile.xcod"
},
{
"path": "BrewMobile.xcodeproj/xcshareddata/xcschemes/BrewMobile.xcscheme",
"chars": 4521,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Scheme\n LastUpgradeVersion = \"0700\"\n version = \"1.3\">\n <BuildAction\n "
},
{
"path": "BrewMobile.xcworkspace/contents.xcworkspacedata",
"chars": 156,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Workspace\n version = \"1.0\">\n <FileRef\n location = \"group:BrewMobile.xco"
},
{
"path": "BrewMobileTests/BrewPhaseTestCase.swift",
"chars": 1355,
"preview": "//\n// BrewPhaseTestCase.swift\n// BrewMobile\n//\n// Created by Ágnes Vásárhelyi on 18/09/14.\n// Copyright (c) 2014 Ágn"
},
{
"path": "BrewMobileTests/BrewStateTestCase.swift",
"chars": 1572,
"preview": "//\n// BrewStateTestCase.swift\n// BrewMobile\n//\n// Created by Ágnes Vásárhelyi on 18/09/14.\n// Copyright (c) 2014 Ágn"
},
{
"path": "BrewMobileTests/ContentParserTestCase.swift",
"chars": 2798,
"preview": "//\n// ContentParserTestCase.swift\n// BrewMobile\n//\n// Created by Ágnes Vásárhelyi on 19/09/14.\n// Copyright (c) 2014"
},
{
"path": "BrewMobileTests/Info.plist",
"chars": 733,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/P"
},
{
"path": "Cartfile",
"chars": 220,
"preview": "github \"socketio/socket.io-client-swift\" ~> 5.3.3\ngithub \"boredzo/iso-8601-date-formatter\" \"43210ea91f5ea2baff6ba13d699a"
},
{
"path": "Cartfile.resolved",
"chars": 255,
"preview": "github \"antitypical/Result\" \"1.0.2\"\ngithub \"SwiftyJSON/SwiftyJSON\" \"2.3.3\"\ngithub \"boredzo/iso-8601-date-formatter\" \"432"
},
{
"path": "Carthage/Checkouts/ReactiveCocoa/.gitignore",
"chars": 220,
"preview": "# Xcode\nbuild/*\n*.pbxuser\n!default.pbxuser\n*.mode1v3\n!default.mode1v3\n*.mode2v3\n!default.mode2v3\n*.perspectivev3\n!defaul"
},
{
"path": "Carthage/Checkouts/ReactiveCocoa/.gitmodules",
"chars": 488,
"preview": "[submodule \"Carthage/Checkouts/Nimble\"]\n\tpath = Carthage/Checkouts/Nimble\n\turl = https://github.com/Quick/Nimble.git\n[su"
},
{
"path": "Carthage/Checkouts/ReactiveCocoa/.travis.yml",
"chars": 385,
"preview": "language: objective-c\nosx_image: xcode7.1\nbefore_install: true\ninstall: true\ngit:\n submodules: false\nscript: script/cib"
},
{
"path": "Carthage/Checkouts/ReactiveCocoa/CHANGELOG.md",
"chars": 20914,
"preview": "# 4.0\n\nIf you’re new to the Swift API and migrating from RAC 2, start with the [3.0 changes](#30). This section only cov"
},
{
"path": "Carthage/Checkouts/ReactiveCocoa/CONTRIBUTING.md",
"chars": 861,
"preview": "We love that you're interested in contributing to this project!\n\nTo make the process as painless as possible, we have ju"
},
{
"path": "Carthage/Checkouts/ReactiveCocoa/Cartfile",
"chars": 37,
"preview": "github \"antitypical/Result\" ~> 1.0.2\n"
},
{
"path": "Carthage/Checkouts/ReactiveCocoa/Cartfile.private",
"chars": 133,
"preview": "github \"jspahrsummers/xcconfigs\" \"ec5753493605deed7358dec5f9260f503d3ed650\"\ngithub \"Quick/Quick\" ~> 0.8\ngithub \"Quick/Ni"
},
{
"path": "Carthage/Checkouts/ReactiveCocoa/Cartfile.resolved",
"chars": 173,
"preview": "github \"Quick/Nimble\" \"v3.1.0\"\ngithub \"Quick/Quick\" \"v0.8.0\"\ngithub \"antitypical/Result\" \"1.0.2\"\ngithub \"jspahrsummers/x"
},
{
"path": "Carthage/Checkouts/ReactiveCocoa/Carthage/Checkouts/Nimble/.gitignore",
"chars": 209,
"preview": ".DS_Store\nxcuserdata/\nbuild/\n.idea\nDerivedData/\nNimble.framework.zip\n\n# Carthage\n#\n# Add this line if you want to avoid "
},
{
"path": "Carthage/Checkouts/ReactiveCocoa/Carthage/Checkouts/Nimble/.travis.yml",
"chars": 180,
"preview": "osx_image: xcode7\nlanguage: objective-c\n\nenv:\n matrix:\n - NIMBLE_RUNTIME_IOS_SDK_VERSION=9.0 TYPE=ios\n - NIMBLE_R"
},
{
"path": "Carthage/Checkouts/ReactiveCocoa/Carthage/Checkouts/Nimble/CONTRIBUTING.md",
"chars": 4304,
"preview": "<!-- START doctoc generated TOC please keep comment here to allow auto update -->\n<!-- DON'T EDIT THIS SECTION, INSTEAD "
},
{
"path": "Carthage/Checkouts/ReactiveCocoa/Carthage/Checkouts/Nimble/LICENSE.md",
"chars": 11307,
"preview": "Apache License\n Version 2.0, January 2004\n http://www.apache.org/licens"
},
{
"path": "Carthage/Checkouts/ReactiveCocoa/Carthage/Checkouts/Nimble/Nimble/Adapters/AdapterProtocols.swift",
"chars": 711,
"preview": "import Foundation\n\n/// Protocol for the assertion handler that Nimble uses for all expectations.\npublic protocol Asserti"
},
{
"path": "Carthage/Checkouts/ReactiveCocoa/Carthage/Checkouts/Nimble/Nimble/Adapters/AssertionDispatcher.swift",
"chars": 651,
"preview": "\n/// AssertionDispatcher allows multiple AssertionHandlers to receive\n/// assertion messages.\n///\n/// @warning Does not "
},
{
"path": "Carthage/Checkouts/ReactiveCocoa/Carthage/Checkouts/Nimble/Nimble/Adapters/AssertionRecorder.swift",
"chars": 3784,
"preview": "import Foundation\n\n/// A data structure that stores information about an assertion when\n/// AssertionRecorder is set as "
},
{
"path": "Carthage/Checkouts/ReactiveCocoa/Carthage/Checkouts/Nimble/Nimble/Adapters/NimbleEnvironment.swift",
"chars": 1157,
"preview": "import Foundation\n\n/// \"Global\" state of Nimble is stored here. Only DSL functions should access / be aware of this\n/// "
},
{
"path": "Carthage/Checkouts/ReactiveCocoa/Carthage/Checkouts/Nimble/Nimble/Adapters/NimbleXCTestHandler.swift",
"chars": 1532,
"preview": "import Foundation\nimport XCTest\n\n/// Default handler for Nimble. This assertion handler passes failures along to\n/// XCT"
},
{
"path": "Carthage/Checkouts/ReactiveCocoa/Carthage/Checkouts/Nimble/Nimble/DSL+Wait.swift",
"chars": 4293,
"preview": "import Foundation\n\nprivate enum ErrorResult {\n case Exception(NSException)\n case Error(ErrorType)\n case None\n}\n"
},
{
"path": "Carthage/Checkouts/ReactiveCocoa/Carthage/Checkouts/Nimble/Nimble/DSL.swift",
"chars": 2256,
"preview": "import Foundation\n\n/// Make an expectation on a given actual value. The value given is lazily evaluated.\npublic func exp"
},
{
"path": "Carthage/Checkouts/ReactiveCocoa/Carthage/Checkouts/Nimble/Nimble/Expectation.swift",
"chars": 2527,
"preview": "import Foundation\n\ninternal func expressionMatches<T, U where U: Matcher, U.ValueType == T>(expression: Expression<T>, m"
},
{
"path": "Carthage/Checkouts/ReactiveCocoa/Carthage/Checkouts/Nimble/Nimble/Expression.swift",
"chars": 4287,
"preview": "import Foundation\n\n// Memoizes the given closure, only calling the passed\n// closure once; even if repeat calls to the r"
},
{
"path": "Carthage/Checkouts/ReactiveCocoa/Carthage/Checkouts/Nimble/Nimble/FailureMessage.swift",
"chars": 1802,
"preview": "import Foundation\n\n/// Encapsulates the failure message that matchers can report to the end user.\n///\n/// This is shared"
},
{
"path": "Carthage/Checkouts/ReactiveCocoa/Carthage/Checkouts/Nimble/Nimble/Info.plist",
"chars": 909,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/P"
},
{
"path": "Carthage/Checkouts/ReactiveCocoa/Carthage/Checkouts/Nimble/Nimble/Matchers/AllPass.swift",
"chars": 3843,
"preview": "import Foundation\n\npublic func allPass<T,U where U: SequenceType, U.Generator.Element == T>\n (passFunc: (T?) -> Bool)"
},
{
"path": "Carthage/Checkouts/ReactiveCocoa/Carthage/Checkouts/Nimble/Nimble/Matchers/BeAKindOf.swift",
"chars": 1556,
"preview": "import Foundation\n\n// A Nimble matcher that catches attempts to use beAKindOf with non Objective-C types\npublic func beA"
},
{
"path": "Carthage/Checkouts/ReactiveCocoa/Carthage/Checkouts/Nimble/Nimble/Matchers/BeAnInstanceOf.swift",
"chars": 1583,
"preview": "import Foundation\n\n// A Nimble matcher that catches attempts to use beAnInstanceOf with non Objective-C types\npublic fun"
},
{
"path": "Carthage/Checkouts/ReactiveCocoa/Carthage/Checkouts/Nimble/Nimble/Matchers/BeCloseTo.swift",
"chars": 4820,
"preview": "import Foundation\n\ninternal let DefaultDelta = 0.0001\n\ninternal func isCloseTo(actualValue: NMBDoubleConvertible?, expec"
},
{
"path": "Carthage/Checkouts/ReactiveCocoa/Carthage/Checkouts/Nimble/Nimble/Matchers/BeEmpty.swift",
"chars": 4228,
"preview": "import Foundation\n\n\n/// A Nimble matcher that succeeds when a value is \"empty\". For collections, this\n/// means the are "
},
{
"path": "Carthage/Checkouts/ReactiveCocoa/Carthage/Checkouts/Nimble/Nimble/Matchers/BeGreaterThan.swift",
"chars": 1567,
"preview": "import Foundation\n\n\n/// A Nimble matcher that succeeds when the actual value is greater than the expected value.\npublic "
},
{
"path": "Carthage/Checkouts/ReactiveCocoa/Carthage/Checkouts/Nimble/Nimble/Matchers/BeGreaterThanOrEqualTo.swift",
"chars": 1703,
"preview": "import Foundation\n\n/// A Nimble matcher that succeeds when the actual value is greater than\n/// or equal to the expected"
},
{
"path": "Carthage/Checkouts/ReactiveCocoa/Carthage/Checkouts/Nimble/Nimble/Matchers/BeIdenticalTo.swift",
"chars": 1062,
"preview": "import Foundation\n\n\n/// A Nimble matcher that succeeds when the actual value is the same instance\n/// as the expected in"
},
{
"path": "Carthage/Checkouts/ReactiveCocoa/Carthage/Checkouts/Nimble/Nimble/Matchers/BeLessThan.swift",
"chars": 1536,
"preview": "import Foundation\n\n/// A Nimble matcher that succeeds when the actual value is less than the expected value.\npublic func"
},
{
"path": "Carthage/Checkouts/ReactiveCocoa/Carthage/Checkouts/Nimble/Nimble/Matchers/BeLessThanOrEqual.swift",
"chars": 1605,
"preview": "import Foundation\n\n/// A Nimble matcher that succeeds when the actual value is less than\n/// or equal to the expected va"
},
{
"path": "Carthage/Checkouts/ReactiveCocoa/Carthage/Checkouts/Nimble/Nimble/Matchers/BeLogical.swift",
"chars": 3663,
"preview": "import Foundation\n\ninternal func matcherWithFailureMessage<T, M: Matcher where M.ValueType == T>(matcher: M, postprocess"
},
{
"path": "Carthage/Checkouts/ReactiveCocoa/Carthage/Checkouts/Nimble/Nimble/Matchers/BeNil.swift",
"chars": 598,
"preview": "import Foundation\n\n/// A Nimble matcher that succeeds when the actual value is nil.\npublic func beNil<T>() -> MatcherFun"
},
{
"path": "Carthage/Checkouts/ReactiveCocoa/Carthage/Checkouts/Nimble/Nimble/Matchers/BeginWith.swift",
"chars": 2419,
"preview": "import Foundation\n\n\n/// A Nimble matcher that succeeds when the actual sequence's first element\n/// is equal to the expe"
},
{
"path": "Carthage/Checkouts/ReactiveCocoa/Carthage/Checkouts/Nimble/Nimble/Matchers/Contain.swift",
"chars": 4119,
"preview": "import Foundation\n\n/// A Nimble matcher that succeeds when the actual sequence contains the expected value.\npublic func "
},
{
"path": "Carthage/Checkouts/ReactiveCocoa/Carthage/Checkouts/Nimble/Nimble/Matchers/EndWith.swift",
"chars": 2664,
"preview": "import Foundation\n\n\n/// A Nimble matcher that succeeds when the actual sequence's last element\n/// is equal to the expec"
},
{
"path": "Carthage/Checkouts/ReactiveCocoa/Carthage/Checkouts/Nimble/Nimble/Matchers/Equal.swift",
"chars": 6493,
"preview": "import Foundation\n\n/// A Nimble matcher that succeeds when the actual value is equal to the expected value.\n/// Values c"
},
{
"path": "Carthage/Checkouts/ReactiveCocoa/Carthage/Checkouts/Nimble/Nimble/Matchers/HaveCount.swift",
"chars": 2147,
"preview": "import Foundation\n\n/// A Nimble matcher that succeeds when the actual CollectionType's count equals\n/// the expected val"
},
{
"path": "Carthage/Checkouts/ReactiveCocoa/Carthage/Checkouts/Nimble/Nimble/Matchers/Match.swift",
"chars": 996,
"preview": "import Foundation\n\n/// A Nimble matcher that succeeds when the actual string satisfies the regular expression\n/// descri"
},
{
"path": "Carthage/Checkouts/ReactiveCocoa/Carthage/Checkouts/Nimble/Nimble/Matchers/MatcherProtocols.swift",
"chars": 3336,
"preview": "import Foundation\n\n/// Implement this protocol to implement a custom matcher for Swift\u0013\npublic protocol Matcher {\n ty"
},
{
"path": "Carthage/Checkouts/ReactiveCocoa/Carthage/Checkouts/Nimble/Nimble/Matchers/RaisesException.swift",
"chars": 6160,
"preview": "import Foundation\n\n/// A Nimble matcher that succeeds when the actual expression raises an\n/// exception with the specif"
},
{
"path": "Carthage/Checkouts/ReactiveCocoa/Carthage/Checkouts/Nimble/Nimble/Matchers/SatisfyAnyOf.swift",
"chars": 2695,
"preview": "import Foundation\n\n/// A Nimble matcher that succeeds when the actual value matches with any of the matchers\n/// provide"
},
{
"path": "Carthage/Checkouts/ReactiveCocoa/Carthage/Checkouts/Nimble/Nimble/Matchers/ThrowError.swift",
"chars": 6329,
"preview": "import Foundation\n\n/// A Nimble matcher that succeeds when the actual expression throws an\n/// error of the specified ty"
},
{
"path": "Carthage/Checkouts/ReactiveCocoa/Carthage/Checkouts/Nimble/Nimble/Nimble.h",
"chars": 189,
"preview": "#import <Foundation/Foundation.h>\n#import \"NMBExceptionCapture.h\"\n#import \"DSL.h\"\n\nFOUNDATION_EXPORT double NimbleVersio"
},
{
"path": "Carthage/Checkouts/ReactiveCocoa/Carthage/Checkouts/Nimble/Nimble/ObjCExpectation.swift",
"chars": 4081,
"preview": "internal struct ObjCMatcherWrapper : Matcher {\n let matcher: NMBMatcher\n\n func matches(actualExpression: Expressio"
},
{
"path": "Carthage/Checkouts/ReactiveCocoa/Carthage/Checkouts/Nimble/Nimble/Utils/Async.swift",
"chars": 13314,
"preview": "import Foundation\nimport Dispatch\n\nprivate let timeoutLeeway: UInt64 = NSEC_PER_MSEC\nprivate let pollLeeway: UInt64 = NS"
},
{
"path": "Carthage/Checkouts/ReactiveCocoa/Carthage/Checkouts/Nimble/Nimble/Utils/Functional.swift",
"chars": 186,
"preview": "import Foundation\n\ninternal func all<T>(array: [T], fn: (T) -> Bool) -> Bool {\n for item in array {\n if !fn(it"
},
{
"path": "Carthage/Checkouts/ReactiveCocoa/Carthage/Checkouts/Nimble/Nimble/Utils/SourceLocation.swift",
"chars": 373,
"preview": "import Foundation\n\n\npublic class SourceLocation : NSObject {\n public let file: String\n public let line: UInt\n\n "
},
{
"path": "Carthage/Checkouts/ReactiveCocoa/Carthage/Checkouts/Nimble/Nimble/Utils/Stringers.swift",
"chars": 1605,
"preview": "import Foundation\n\n\ninternal func identityAsString(value: AnyObject?) -> String {\n if value == nil {\n return \""
},
{
"path": "Carthage/Checkouts/ReactiveCocoa/Carthage/Checkouts/Nimble/Nimble/Wrappers/AsyncMatcherWrapper.swift",
"chars": 6074,
"preview": "import Foundation\n\ninternal struct AsyncMatcherWrapper<T, U where U: Matcher, U.ValueType == T>: Matcher {\n let fullM"
},
{
"path": "Carthage/Checkouts/ReactiveCocoa/Carthage/Checkouts/Nimble/Nimble/Wrappers/MatcherFunc.swift",
"chars": 3869,
"preview": "/// A convenience API to build matchers that allow full control over\n/// to() and toNot() match cases.\n///\n/// The final"
},
{
"path": "Carthage/Checkouts/ReactiveCocoa/Carthage/Checkouts/Nimble/Nimble/Wrappers/ObjCMatcher.swift",
"chars": 3194,
"preview": "import Foundation\n\npublic typealias MatcherBlock = (actualExpression: Expression<NSObject>, failureMessage: FailureMessa"
},
{
"path": "Carthage/Checkouts/ReactiveCocoa/Carthage/Checkouts/Nimble/Nimble/objc/DSL.h",
"chars": 5870,
"preview": "#import <Foundation/Foundation.h>\n\n@class NMBExpectation;\n@class NMBObjCBeCloseToMatcher;\n@class NMBObjCRaiseExceptionMa"
},
{
"path": "Carthage/Checkouts/ReactiveCocoa/Carthage/Checkouts/Nimble/Nimble/objc/DSL.m",
"chars": 4727,
"preview": "#import <Nimble/DSL.h>\n#import <Nimble/Nimble-Swift.h>\n\nSWIFT_CLASS(\"_TtC6Nimble7NMBWait\")\n@interface NMBWait : NSObject"
},
{
"path": "Carthage/Checkouts/ReactiveCocoa/Carthage/Checkouts/Nimble/Nimble/objc/NMBExceptionCapture.h",
"chars": 294,
"preview": "#import <Foundation/Foundation.h>\n#import <dispatch/dispatch.h>\n\n@interface NMBExceptionCapture : NSObject\n\n- (id)initWi"
},
{
"path": "Carthage/Checkouts/ReactiveCocoa/Carthage/Checkouts/Nimble/Nimble/objc/NMBExceptionCapture.m",
"chars": 733,
"preview": "#import \"NMBExceptionCapture.h\"\n\n@interface NMBExceptionCapture ()\n@property (nonatomic, copy) void(^handler)(NSExceptio"
},
{
"path": "Carthage/Checkouts/ReactiveCocoa/Carthage/Checkouts/Nimble/Nimble.podspec",
"chars": 973,
"preview": "Pod::Spec.new do |s|\n s.name = \"Nimble\"\n s.version = \"3.1.0\"\n s.summary = \"A Matcher Framework for "
},
{
"path": "Carthage/Checkouts/ReactiveCocoa/Carthage/Checkouts/Nimble/Nimble.xcodeproj/project.pbxproj",
"chars": 121236,
"preview": "// !$*UTF8*$!\n{\n\tarchiveVersion = 1;\n\tclasses = {\n\t};\n\tobjectVersion = 46;\n\tobjects = {\n\n/* Begin PBXBuildFile section *"
},
{
"path": "Carthage/Checkouts/ReactiveCocoa/Carthage/Checkouts/Nimble/Nimble.xcodeproj/xcshareddata/xcschemes/Nimble-OSX.xcscheme",
"chars": 2913,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Scheme\n LastUpgradeVersion = \"0710\"\n version = \"2.0\">\n <BuildAction\n "
},
{
"path": "Carthage/Checkouts/ReactiveCocoa/Carthage/Checkouts/Nimble/Nimble.xcodeproj/xcshareddata/xcschemes/Nimble-iOS.xcscheme",
"chars": 2913,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Scheme\n LastUpgradeVersion = \"0710\"\n version = \"2.0\">\n <BuildAction\n "
},
{
"path": "Carthage/Checkouts/ReactiveCocoa/Carthage/Checkouts/Nimble/Nimble.xcodeproj/xcshareddata/xcschemes/Nimble-tvOS.xcscheme",
"chars": 3653,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Scheme\n LastUpgradeVersion = \"0710\"\n version = \"1.3\">\n <BuildAction\n "
},
{
"path": "Carthage/Checkouts/ReactiveCocoa/Carthage/Checkouts/Nimble/NimbleTests/AsynchronousTest.swift",
"chars": 5417,
"preview": "import XCTest\nimport Nimble\n\nclass AsyncTest: XCTestCase {\n let errorToThrow = NSError(domain: NSInternalInconsistenc"
},
{
"path": "Carthage/Checkouts/ReactiveCocoa/Carthage/Checkouts/Nimble/NimbleTests/Helpers/ObjectWithLazyProperty.swift",
"chars": 160,
"preview": "import Foundation\n\nclass ObjectWithLazyProperty {\n init() {}\n lazy var value: String = \"hello\"\n lazy var anothe"
},
{
"path": "Carthage/Checkouts/ReactiveCocoa/Carthage/Checkouts/Nimble/NimbleTests/Helpers/utils.swift",
"chars": 3294,
"preview": "import Foundation\nimport Nimble\nimport XCTest\n\nfunc failsWithErrorMessage(messages: [String], file: String = __FILE__, l"
},
{
"path": "Carthage/Checkouts/ReactiveCocoa/Carthage/Checkouts/Nimble/NimbleTests/Info.plist",
"chars": 733,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/P"
},
{
"path": "Carthage/Checkouts/ReactiveCocoa/Carthage/Checkouts/Nimble/NimbleTests/Matchers/AllPassTest.swift",
"chars": 3011,
"preview": "import XCTest\nimport Nimble\n\nclass AllPassTest: XCTestCase {\n func testAllPassArray() {\n expect([1,2,3,4]).to("
},
{
"path": "Carthage/Checkouts/ReactiveCocoa/Carthage/Checkouts/Nimble/NimbleTests/Matchers/BeAKindOfTest.swift",
"chars": 1882,
"preview": "import XCTest\nimport Nimble\n\nclass TestNull : NSNull {}\n\nclass BeAKindOfTest: XCTestCase {\n func testPositiveMatch() "
},
{
"path": "Carthage/Checkouts/ReactiveCocoa/Carthage/Checkouts/Nimble/NimbleTests/Matchers/BeAnInstanceOfTest.swift",
"chars": 1892,
"preview": "import XCTest\nimport Nimble\n\nclass BeAnInstanceOfTest: XCTestCase {\n func testPositiveMatch() {\n expect(NSNull"
},
{
"path": "Carthage/Checkouts/ReactiveCocoa/Carthage/Checkouts/Nimble/NimbleTests/Matchers/BeCloseToTest.swift",
"chars": 3345,
"preview": "import XCTest\nimport Nimble\n\nclass BeCloseToTest: XCTestCase {\n func testBeCloseTo() {\n expect(1.2).to(beClose"
},
{
"path": "Carthage/Checkouts/ReactiveCocoa/Carthage/Checkouts/Nimble/NimbleTests/Matchers/BeEmptyTest.swift",
"chars": 1674,
"preview": "import XCTest\nimport Nimble\n\nclass BeEmptyTest: XCTestCase {\n func testBeEmptyPositive() {\n expect([] as [Int]"
},
{
"path": "Carthage/Checkouts/ReactiveCocoa/Carthage/Checkouts/Nimble/NimbleTests/Matchers/BeGreaterThanOrEqualToTest.swift",
"chars": 1499,
"preview": "import XCTest\nimport Nimble\n\nclass BeGreaterThanOrEqualToTest: XCTestCase {\n\n func testGreaterThanOrEqualTo() {\n "
},
{
"path": "Carthage/Checkouts/ReactiveCocoa/Carthage/Checkouts/Nimble/NimbleTests/Matchers/BeGreaterThanTest.swift",
"chars": 1172,
"preview": "import XCTest\nimport Nimble\n\nclass BeGreaterThanTest: XCTestCase {\n func testGreaterThan() {\n expect(10).to(be"
},
{
"path": "Carthage/Checkouts/ReactiveCocoa/Carthage/Checkouts/Nimble/NimbleTests/Matchers/BeIdenticalToObjectTest.swift",
"chars": 1919,
"preview": "import XCTest\nimport Nimble\n\nclass BeIdenticalToObjectTest: XCTestCase {\n private class BeIdenticalToObjectTester {}\n"
},
{
"path": "Carthage/Checkouts/ReactiveCocoa/Carthage/Checkouts/Nimble/NimbleTests/Matchers/BeIdenticalToTest.swift",
"chars": 1199,
"preview": "import XCTest\nimport Nimble\n\nclass BeIdenticalToTest: XCTestCase {\n func testBeIdenticalToPositive() {\n expect"
},
{
"path": "Carthage/Checkouts/ReactiveCocoa/Carthage/Checkouts/Nimble/NimbleTests/Matchers/BeLessThanOrEqualToTest.swift",
"chars": 1445,
"preview": "import XCTest\nimport Nimble\n\nclass BeLessThanOrEqualToTest: XCTestCase {\n func testLessThanOrEqualTo() {\n expe"
},
{
"path": "Carthage/Checkouts/ReactiveCocoa/Carthage/Checkouts/Nimble/NimbleTests/Matchers/BeLessThanTest.swift",
"chars": 1184,
"preview": "import XCTest\nimport Nimble\n\nclass BeLessThanTest: XCTestCase {\n\n func testLessThan() {\n expect(2).to(beLessTh"
},
{
"path": "Carthage/Checkouts/ReactiveCocoa/Carthage/Checkouts/Nimble/NimbleTests/Matchers/BeLogicalTest.swift",
"chars": 4430,
"preview": "import XCTest\nimport Nimble\n\nenum ConvertsToBool : BooleanType, CustomStringConvertible {\n case TrueLike, FalseLike\n\n"
},
{
"path": "Carthage/Checkouts/ReactiveCocoa/Carthage/Checkouts/Nimble/NimbleTests/Matchers/BeNilTest.swift",
"chars": 527,
"preview": "import XCTest\nimport Nimble\n\nclass BeNilTest: XCTestCase {\n func producesNil() -> Array<Int>? {\n return nil\n "
},
{
"path": "Carthage/Checkouts/ReactiveCocoa/Carthage/Checkouts/Nimble/NimbleTests/Matchers/BeginWithTest.swift",
"chars": 1471,
"preview": "import XCTest\nimport Nimble\n\nclass BeginWithTest: XCTestCase {\n\n func testPositiveMatches() {\n expect([1, 2, 3"
},
{
"path": "Carthage/Checkouts/ReactiveCocoa/Carthage/Checkouts/Nimble/NimbleTests/Matchers/ContainTest.swift",
"chars": 2447,
"preview": "import XCTest\nimport Nimble\n\nclass ContainTest: XCTestCase {\n func testContain() {\n expect([1, 2, 3]).to(conta"
},
{
"path": "Carthage/Checkouts/ReactiveCocoa/Carthage/Checkouts/Nimble/NimbleTests/Matchers/EndWithTest.swift",
"chars": 1423,
"preview": "import XCTest\nimport Nimble\n\nclass EndWithTest: XCTestCase {\n\n func testEndWithPositives() {\n expect([1, 2, 3]"
},
{
"path": "Carthage/Checkouts/ReactiveCocoa/Carthage/Checkouts/Nimble/NimbleTests/Matchers/EqualTest.swift",
"chars": 9126,
"preview": "import XCTest\nimport Nimble\n\nclass EqualTest: XCTestCase {\n func testEquality() {\n expect(1 as CInt).to(equal("
},
{
"path": "Carthage/Checkouts/ReactiveCocoa/Carthage/Checkouts/Nimble/NimbleTests/Matchers/HaveCountTest.swift",
"chars": 1383,
"preview": "import XCTest\nimport Nimble\n\nclass HaveCountTest: XCTestCase {\n func testHaveCountForArray() {\n expect([1, 2, "
},
{
"path": "Carthage/Checkouts/ReactiveCocoa/Carthage/Checkouts/Nimble/NimbleTests/Matchers/MatchTest.swift",
"chars": 1060,
"preview": "import XCTest\nimport Nimble\n\nclass MatchTest:XCTestCase {\n func testMatchPositive() {\n expect(\"11:14\").to(matc"
},
{
"path": "Carthage/Checkouts/ReactiveCocoa/Carthage/Checkouts/Nimble/NimbleTests/Matchers/RaisesExceptionTest.swift",
"chars": 9228,
"preview": "import XCTest\nimport Nimble\n\nclass RaisesExceptionTest: XCTestCase {\n var anException = NSException(name: \"laugh\", re"
},
{
"path": "Carthage/Checkouts/ReactiveCocoa/Carthage/Checkouts/Nimble/NimbleTests/Matchers/SatisfyAnyOfTest.swift",
"chars": 1973,
"preview": "import XCTest\nimport Nimble\n\nclass SatisfyAnyOfTest: XCTestCase {\n func testSatisfyAnyOf() {\n expect(2).to(sat"
},
{
"path": "Carthage/Checkouts/ReactiveCocoa/Carthage/Checkouts/Nimble/NimbleTests/Matchers/ThrowErrorTest.swift",
"chars": 5276,
"preview": "import XCTest\nimport Nimble\n\nenum Error : ErrorType {\n case Laugh\n case Cry\n}\n\nenum EquatableError : ErrorType {\n "
},
{
"path": "Carthage/Checkouts/ReactiveCocoa/Carthage/Checkouts/Nimble/NimbleTests/SynchronousTests.swift",
"chars": 3614,
"preview": "import XCTest\nimport Nimble\n\nclass SynchronousTest: XCTestCase {\n let errorToThrow = NSError(domain: NSInternalIncons"
},
{
"path": "Carthage/Checkouts/ReactiveCocoa/Carthage/Checkouts/Nimble/NimbleTests/UserDescriptionTest.swift",
"chars": 1904,
"preview": "import XCTest\nimport Nimble\n\nclass UserDescriptionTest: XCTestCase {\n \n func testToMatcher_CustomFailureMessage() "
},
{
"path": "Carthage/Checkouts/ReactiveCocoa/Carthage/Checkouts/Nimble/NimbleTests/objc/Nimble-OSXTests-Bridging-Header.h",
"chars": 104,
"preview": "//\n// Use this file to import your target's public headers that you would like to expose to Swift.\n//\n\n"
},
{
"path": "Carthage/Checkouts/ReactiveCocoa/Carthage/Checkouts/Nimble/NimbleTests/objc/NimbleSpecHelper.h",
"chars": 670,
"preview": "@import Nimble;\n#import \"NimbleTests-Swift.h\"\n\n// Use this when you want to verify the failure message for when an expec"
},
{
"path": "Carthage/Checkouts/ReactiveCocoa/Carthage/Checkouts/Nimble/NimbleTests/objc/NimbleTests-Bridging-Header.h",
"chars": 104,
"preview": "//\n// Use this file to import your target's public headers that you would like to expose to Swift.\n//\n\n"
},
{
"path": "Carthage/Checkouts/ReactiveCocoa/Carthage/Checkouts/Nimble/NimbleTests/objc/ObjCAllPassTest.m",
"chars": 1599,
"preview": "#import <XCTest/XCTest.h>\n#import \"NimbleSpecHelper.h\"\n\n@interface ObjCAllPassTest : XCTestCase\n\n@end\n\n@implementation O"
},
{
"path": "Carthage/Checkouts/ReactiveCocoa/Carthage/Checkouts/Nimble/NimbleTests/objc/ObjCAsyncTest.m",
"chars": 1450,
"preview": "#import <XCTest/XCTest.h>\n#import <Nimble/Nimble.h>\n#import \"NimbleSpecHelper.h\"\n\n@interface ObjCAsyncTest : XCTestCase\n"
},
{
"path": "Carthage/Checkouts/ReactiveCocoa/Carthage/Checkouts/Nimble/NimbleTests/objc/ObjCBeAnInstanceOfTest.m",
"chars": 1023,
"preview": "#import <XCTest/XCTest.h>\n#import \"NimbleSpecHelper.h\"\n\n@interface ObjCBeAnInstanceOfTest : XCTestCase\n@end\n\n@implementa"
},
{
"path": "Carthage/Checkouts/ReactiveCocoa/Carthage/Checkouts/Nimble/NimbleTests/objc/ObjCBeCloseToTest.m",
"chars": 1014,
"preview": "#import <XCTest/XCTest.h>\n#import \"NimbleSpecHelper.h\"\n\n@interface ObjCBeCloseToTest : XCTestCase\n\n@end\n\n@implementation"
},
{
"path": "Carthage/Checkouts/ReactiveCocoa/Carthage/Checkouts/Nimble/NimbleTests/objc/ObjCBeEmptyTest.m",
"chars": 2999,
"preview": "#import <XCTest/XCTest.h>\n#import \"NimbleSpecHelper.h\"\n\n@interface ObjCBeEmptyTest : XCTestCase\n@end\n\n@implementation Ob"
},
{
"path": "Carthage/Checkouts/ReactiveCocoa/Carthage/Checkouts/Nimble/NimbleTests/objc/ObjCBeFalseTest.m",
"chars": 500,
"preview": "#import <XCTest/XCTest.h>\n#import \"NimbleSpecHelper.h\"\n\n@interface ObjCBeFalseTest : XCTestCase\n\n@end\n\n@implementation O"
},
{
"path": "Carthage/Checkouts/ReactiveCocoa/Carthage/Checkouts/Nimble/NimbleTests/objc/ObjCBeFalsyTest.m",
"chars": 639,
"preview": "#import <XCTest/XCTest.h>\n#import \"NimbleSpecHelper.h\"\n\n@interface ObjCBeFalsyTest : XCTestCase\n\n@end\n\n@implementation O"
},
{
"path": "Carthage/Checkouts/ReactiveCocoa/Carthage/Checkouts/Nimble/NimbleTests/objc/ObjCBeGreaterThanOrEqualToTest.m",
"chars": 1006,
"preview": "#import <XCTest/XCTest.h>\n#import \"NimbleSpecHelper.h\"\n\n@interface ObjCBeGreaterThanOrEqualToTest : XCTestCase\n\n@end\n\n@i"
},
{
"path": "Carthage/Checkouts/ReactiveCocoa/Carthage/Checkouts/Nimble/NimbleTests/objc/ObjCBeGreaterThanTest.m",
"chars": 888,
"preview": "#import <XCTest/XCTest.h>\n#import \"NimbleSpecHelper.h\"\n\n@interface ObjCBeGreaterThanTest : XCTestCase\n\n@end\n\n@implementa"
},
{
"path": "Carthage/Checkouts/ReactiveCocoa/Carthage/Checkouts/Nimble/NimbleTests/objc/ObjCBeIdenticalToTest.m",
"chars": 1075,
"preview": "#import <XCTest/XCTest.h>\n#import \"NimbleSpecHelper.h\"\n\n@interface ObjCBeIdenticalToTest : XCTestCase\n\n@end\n\n@implementa"
},
{
"path": "Carthage/Checkouts/ReactiveCocoa/Carthage/Checkouts/Nimble/NimbleTests/objc/ObjCBeKindOfTest.m",
"chars": 983,
"preview": "#import <XCTest/XCTest.h>\n#import \"NimbleSpecHelper.h\"\n\n@interface ObjCBeKindOfTest : XCTestCase\n\n@end\n\n@implementation "
},
{
"path": "Carthage/Checkouts/ReactiveCocoa/Carthage/Checkouts/Nimble/NimbleTests/objc/ObjCBeLessThanOrEqualToTest.m",
"chars": 962,
"preview": "#import <XCTest/XCTest.h>\n#import \"NimbleSpecHelper.h\"\n\n@interface ObjCBeLessThanOrEqualToTest : XCTestCase\n\n@end\n\n@impl"
},
{
"path": "Carthage/Checkouts/ReactiveCocoa/Carthage/Checkouts/Nimble/NimbleTests/objc/ObjCBeLessThanTest.m",
"chars": 846,
"preview": "#import <XCTest/XCTest.h>\n#import \"NimbleSpecHelper.h\"\n\n@interface ObjCBeLessThanTest : XCTestCase\n\n@end\n\n@implementatio"
},
{
"path": "Carthage/Checkouts/ReactiveCocoa/Carthage/Checkouts/Nimble/NimbleTests/objc/ObjCBeNilTest.m",
"chars": 479,
"preview": "#import <XCTest/XCTest.h>\n#import \"NimbleSpecHelper.h\"\n\n@interface ObjCBeNilTest : XCTestCase\n\n@end\n\n@implementation Obj"
},
{
"path": "Carthage/Checkouts/ReactiveCocoa/Carthage/Checkouts/Nimble/NimbleTests/objc/ObjCBeTrueTest.m",
"chars": 515,
"preview": "#import <XCTest/XCTest.h>\n#import \"NimbleSpecHelper.h\"\n\n@interface ObjCBeTrueTest : XCTestCase\n\n@end\n\n@implementation Ob"
},
{
"path": "Carthage/Checkouts/ReactiveCocoa/Carthage/Checkouts/Nimble/NimbleTests/objc/ObjCBeTruthyTest.m",
"chars": 651,
"preview": "#import <XCTest/XCTest.h>\n#import \"NimbleSpecHelper.h\"\n\n@interface ObjCBeTruthyTest : XCTestCase\n\n@end\n\n@implementation "
},
{
"path": "Carthage/Checkouts/ReactiveCocoa/Carthage/Checkouts/Nimble/NimbleTests/objc/ObjCBeginWithTest.m",
"chars": 964,
"preview": "#import <XCTest/XCTest.h>\n#import \"NimbleSpecHelper.h\"\n\n@interface ObjCBeginWithTest : XCTestCase\n\n@end\n\n@implementation"
},
{
"path": "Carthage/Checkouts/ReactiveCocoa/Carthage/Checkouts/Nimble/NimbleTests/objc/ObjCContainTest.m",
"chars": 2049,
"preview": "#import <XCTest/XCTest.h>\n#import \"NimbleSpecHelper.h\"\n\n@interface ObjCContainTest : XCTestCase\n\n@end\n\n@implementation O"
},
{
"path": "Carthage/Checkouts/ReactiveCocoa/Carthage/Checkouts/Nimble/NimbleTests/objc/ObjCEndWithTest.m",
"chars": 1003,
"preview": "#import <XCTest/XCTest.h>\n#import \"NimbleSpecHelper.h\"\n\n@interface ObjCEndWithTest : XCTestCase\n\n@end\n\n@implementation O"
},
{
"path": "Carthage/Checkouts/ReactiveCocoa/Carthage/Checkouts/Nimble/NimbleTests/objc/ObjCEqualTest.m",
"chars": 841,
"preview": "#import <XCTest/XCTest.h>\n#import \"NimbleSpecHelper.h\"\n\n@interface ObjCEqualTest : XCTestCase\n\n@end\n\n@implementation Obj"
},
{
"path": "Carthage/Checkouts/ReactiveCocoa/Carthage/Checkouts/Nimble/NimbleTests/objc/ObjCHaveCount.m",
"chars": 2813,
"preview": "#import <XCTest/XCTest.h>\n#import \"NimbleSpecHelper.h\"\n\n@interface ObjCHaveCountTest : XCTestCase\n\n@end\n\n@implementation"
},
{
"path": "Carthage/Checkouts/ReactiveCocoa/Carthage/Checkouts/Nimble/NimbleTests/objc/ObjCMatchTest.m",
"chars": 904,
"preview": "#import <XCTest/XCTest.h>\n#import \"NimbleSpecHelper.h\"\n\n@interface ObjCMatchTest : XCTestCase\n\n@end\n\n@implementation Obj"
},
{
"path": "Carthage/Checkouts/ReactiveCocoa/Carthage/Checkouts/Nimble/NimbleTests/objc/ObjCRaiseExceptionTest.m",
"chars": 10183,
"preview": "#import <XCTest/XCTest.h>\n#import \"NimbleSpecHelper.h\"\n\n@interface ObjCRaiseExceptionTest : XCTestCase\n\n@end\n\n@implement"
},
{
"path": "Carthage/Checkouts/ReactiveCocoa/Carthage/Checkouts/Nimble/NimbleTests/objc/ObjCSatisfyAnyOfTest.m",
"chars": 1253,
"preview": "#import <XCTest/XCTest.h>\n#import \"NimbleSpecHelper.h\"\n\n@interface ObjCSatisfyAnyOfTest : XCTestCase\n\n@end\n\n@implementat"
},
{
"path": "Carthage/Checkouts/ReactiveCocoa/Carthage/Checkouts/Nimble/NimbleTests/objc/ObjCSyncTest.m",
"chars": 379,
"preview": "#import <XCTest/XCTest.h>\n#import <Nimble/Nimble.h>\n#import \"NimbleSpecHelper.h\"\n\n@interface ObjCSyncTest : XCTestCase\n\n"
},
{
"path": "Carthage/Checkouts/ReactiveCocoa/Carthage/Checkouts/Nimble/NimbleTests/objc/ObjCUserDescriptionTest.m",
"chars": 1958,
"preview": "#import <XCTest/XCTest.h>\n#import \"NimbleSpecHelper.h\"\n\n@interface ObjCUserDescriptionTest : XCTestCase\n\n@end\n\n@implemen"
},
{
"path": "Carthage/Checkouts/ReactiveCocoa/Carthage/Checkouts/Nimble/README.md",
"chars": 34904,
"preview": "# Nimble\n\nUse Nimble to express the expected outcomes of Swift\nor Objective-C expressions. Inspired by\n[Cedar](https://g"
},
{
"path": "Carthage/Checkouts/ReactiveCocoa/Carthage/Checkouts/Nimble/circle.yml",
"chars": 162,
"preview": "machine:\n xcode:\n version: \"7.0\"\n\ntest:\n override:\n - NIMBLE_RUNTIME_IOS_SDK_VERSION=9.0 ./test ios\n - NIMBLE"
},
{
"path": "Carthage/Checkouts/ReactiveCocoa/Carthage/Checkouts/Nimble/script/release",
"chars": 7155,
"preview": "#!/usr/bin/env sh\nREMOTE_BRANCH=master\nPOD_NAME=Nimble\nPODSPEC=Nimble.podspec\nGITHUB_TAGS_URL=https://github.com/Quick/N"
},
{
"path": "Carthage/Checkouts/ReactiveCocoa/Carthage/Checkouts/Nimble/test",
"chars": 3035,
"preview": "#!/bin/sh\n\nBUILD_DIR=`pwd`/build\nLATEST_IOS_SDK_VERSION=`xcodebuild -showsdks | grep iphonesimulator | cut -d ' ' -f 4 |"
},
{
"path": "Carthage/Checkouts/ReactiveCocoa/Carthage/Checkouts/Quick/.gitignore",
"chars": 703,
"preview": "# Xcode\n#\nbuild/\n*.pbxuser\n!default.pbxuser\n*.mode1v3\n!default.mode1v3\n*.mode2v3\n!default.mode2v3\n*.perspectivev3\n!defau"
},
{
"path": "Carthage/Checkouts/ReactiveCocoa/Carthage/Checkouts/Quick/.gitmodules",
"chars": 99,
"preview": "[submodule \"Externals/Nimble\"]\n\tpath = Externals/Nimble\n\turl = https://github.com/Quick/Nimble.git\n"
},
{
"path": "Carthage/Checkouts/ReactiveCocoa/Carthage/Checkouts/Quick/.travis.yml",
"chars": 113,
"preview": "osx_image: xcode7\nlanguage: objective-c\n\nbefore_install: git submodule update --init --recursive\nscript: \"rake\"\n\n"
},
{
"path": "Carthage/Checkouts/ReactiveCocoa/Carthage/Checkouts/Quick/CONTRIBUTING.md",
"chars": 4359,
"preview": "<!-- START doctoc generated TOC please keep comment here to allow auto update -->\n<!-- DON'T EDIT THIS SECTION, INSTEAD "
},
{
"path": "Carthage/Checkouts/ReactiveCocoa/Carthage/Checkouts/Quick/Documentation/ArrangeActAssert.md",
"chars": 6166,
"preview": "# Effective Tests Using XCTest: Arrange, Act, and Assert\n\nWhether you're using XCTest, Quick, or another testing framewo"
},
{
"path": "Carthage/Checkouts/ReactiveCocoa/Carthage/Checkouts/Quick/Documentation/BehavioralTesting.md",
"chars": 2870,
"preview": "# Don't Test Code, Instead Verify Behavior\n\nTests should only fail if the application **behaves differently**.\nThey shou"
},
{
"path": "Carthage/Checkouts/ReactiveCocoa/Carthage/Checkouts/Quick/Documentation/ConfiguringQuick.md",
"chars": 2216,
"preview": "# Configuring How Quick Behaves\n\nYou can customize how Quick behaves by subclassing `QuickConfiguration` and\noverriding "
},
{
"path": "Carthage/Checkouts/ReactiveCocoa/Carthage/Checkouts/Quick/Documentation/InstallingFileTemplates.md",
"chars": 692,
"preview": "# Installing Quick File Templates\n\nThe Quick repository includes file templates for both Swift and\nObjective-C specs.\n\n#"
},
{
"path": "Carthage/Checkouts/ReactiveCocoa/Carthage/Checkouts/Quick/Documentation/InstallingQuick.md",
"chars": 6166,
"preview": "# Installing Quick\n\n> **If you're using Xcode 6.2 & Swift 1.1,** use Quick `v0.2.*`.\n> New releases are developed on the"
},
{
"path": "Carthage/Checkouts/ReactiveCocoa/Carthage/Checkouts/Quick/Documentation/MoreResources.md",
"chars": 1312,
"preview": "# More Resources\n\n## Examples of Quick Specs\n\nQuick is used by many companies, open-source projects, and individuals,\nin"
},
{
"path": "Carthage/Checkouts/ReactiveCocoa/Carthage/Checkouts/Quick/Documentation/NimbleAssertions.md",
"chars": 3836,
"preview": "# Clearer Tests Using Nimble Assertions\n\nWhen code doesn't work the way it's supposed to, unit tests should make it\n**cl"
},
{
"path": "Carthage/Checkouts/ReactiveCocoa/Carthage/Checkouts/Quick/Documentation/QuickExamplesAndGroups.md",
"chars": 11829,
"preview": "# Organized Tests with Quick Examples and Example Groups\n\nQuick uses a special syntax to define **examples** and **examp"
},
{
"path": "Carthage/Checkouts/ReactiveCocoa/Carthage/Checkouts/Quick/Documentation/QuickInObjectiveC.md",
"chars": 1538,
"preview": "# Using Quick in Objective-C\n\nQuick works equally well in both Swift and Objective-C.\n\nThere are two notes to keep in mi"
},
{
"path": "Carthage/Checkouts/ReactiveCocoa/Carthage/Checkouts/Quick/Documentation/README.md",
"chars": 2434,
"preview": "# Documentation\n\nQuick helps you verify how your Swift and Objective-C programs behave.\nDoing so effectively isn't just "
},
{
"path": "Carthage/Checkouts/ReactiveCocoa/Carthage/Checkouts/Quick/Documentation/SettingUpYourXcodeProject.md",
"chars": 1870,
"preview": "# Setting Up Tests in Your Xcode Project\n\nWhen you create a new project in Xcode 6, a unit test target is included\nby de"
},
{
"path": "Carthage/Checkouts/ReactiveCocoa/Carthage/Checkouts/Quick/Documentation/SharedExamples.md",
"chars": 3134,
"preview": "# Reducing Test Boilerplate with Shared Assertions\n\nIn some cases, the same set of specifications apply to multiple obje"
},
{
"path": "Carthage/Checkouts/ReactiveCocoa/Carthage/Checkouts/Quick/Documentation/TestingApps.md",
"chars": 5635,
"preview": "# Testing OS X and iOS Applications\n\n*[Setting Up Tests in Your Xcode Project](SettingUpYourXcodeProject.md)*\ncovers eve"
},
{
"path": "Carthage/Checkouts/ReactiveCocoa/Carthage/Checkouts/Quick/Externals/Nimble/.gitignore",
"chars": 209,
"preview": ".DS_Store\nxcuserdata/\nbuild/\n.idea\nDerivedData/\nNimble.framework.zip\n\n# Carthage\n#\n# Add this line if you want to avoid "
},
{
"path": "Carthage/Checkouts/ReactiveCocoa/Carthage/Checkouts/Quick/Externals/Nimble/.travis.yml",
"chars": 180,
"preview": "osx_image: xcode7\nlanguage: objective-c\n\nenv:\n matrix:\n - NIMBLE_RUNTIME_IOS_SDK_VERSION=9.0 TYPE=ios\n - NIMBLE_R"
},
{
"path": "Carthage/Checkouts/ReactiveCocoa/Carthage/Checkouts/Quick/Externals/Nimble/CONTRIBUTING.md",
"chars": 4102,
"preview": "<!-- START doctoc generated TOC please keep comment here to allow auto update -->\n<!-- DON'T EDIT THIS SECTION, INSTEAD "
},
{
"path": "Carthage/Checkouts/ReactiveCocoa/Carthage/Checkouts/Quick/Externals/Nimble/LICENSE.md",
"chars": 11307,
"preview": "Apache License\n Version 2.0, January 2004\n http://www.apache.org/licens"
},
{
"path": "Carthage/Checkouts/ReactiveCocoa/Carthage/Checkouts/Quick/Externals/Nimble/Nimble/Adapters/AdapterProtocols.swift",
"chars": 711,
"preview": "import Foundation\n\n/// Protocol for the assertion handler that Nimble uses for all expectations.\npublic protocol Asserti"
},
{
"path": "Carthage/Checkouts/ReactiveCocoa/Carthage/Checkouts/Quick/Externals/Nimble/Nimble/Adapters/AssertionDispatcher.swift",
"chars": 651,
"preview": "\n/// AssertionDispatcher allows multiple AssertionHandlers to receive\n/// assertion messages.\n///\n/// @warning Does not "
},
{
"path": "Carthage/Checkouts/ReactiveCocoa/Carthage/Checkouts/Quick/Externals/Nimble/Nimble/Adapters/AssertionRecorder.swift",
"chars": 3684,
"preview": "import Foundation\n\n/// A data structure that stores information about an assertion when\n/// AssertionRecorder is set as "
},
{
"path": "Carthage/Checkouts/ReactiveCocoa/Carthage/Checkouts/Quick/Externals/Nimble/Nimble/Adapters/NimbleXCTestHandler.swift",
"chars": 1532,
"preview": "import Foundation\nimport XCTest\n\n/// Default handler for Nimble. This assertion handler passes failures along to\n/// XCT"
},
{
"path": "Carthage/Checkouts/ReactiveCocoa/Carthage/Checkouts/Quick/Externals/Nimble/Nimble/DSL+Wait.swift",
"chars": 1970,
"preview": "import Foundation\n\n/// Only classes, protocols, methods, properties, and subscript declarations can be\n/// bridges to Ob"
},
{
"path": "Carthage/Checkouts/ReactiveCocoa/Carthage/Checkouts/Quick/Externals/Nimble/Nimble/DSL.swift",
"chars": 1390,
"preview": "/// Make an expectation on a given actual value. The value given is lazily evaluated.\npublic func expect<T>(@autoclosure"
},
{
"path": "Carthage/Checkouts/ReactiveCocoa/Carthage/Checkouts/Quick/Externals/Nimble/Nimble/Expectation.swift",
"chars": 2470,
"preview": "import Foundation\n\ninternal func expressionMatches<T, U where U: Matcher, U.ValueType == T>(expression: Expression<T>, m"
},
{
"path": "Carthage/Checkouts/ReactiveCocoa/Carthage/Checkouts/Quick/Externals/Nimble/Nimble/Expression.swift",
"chars": 4287,
"preview": "import Foundation\n\n// Memoizes the given closure, only calling the passed\n// closure once; even if repeat calls to the r"
},
{
"path": "Carthage/Checkouts/ReactiveCocoa/Carthage/Checkouts/Quick/Externals/Nimble/Nimble/FailureMessage.swift",
"chars": 1802,
"preview": "import Foundation\n\n/// Encapsulates the failure message that matchers can report to the end user.\n///\n/// This is shared"
},
{
"path": "Carthage/Checkouts/ReactiveCocoa/Carthage/Checkouts/Quick/Externals/Nimble/Nimble/Info.plist",
"chars": 909,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/P"
},
{
"path": "Carthage/Checkouts/ReactiveCocoa/Carthage/Checkouts/Quick/Externals/Nimble/Nimble/Matchers/AllPass.swift",
"chars": 3843,
"preview": "import Foundation\n\npublic func allPass<T,U where U: SequenceType, U.Generator.Element == T>\n (passFunc: (T?) -> Bool)"
},
{
"path": "Carthage/Checkouts/ReactiveCocoa/Carthage/Checkouts/Quick/Externals/Nimble/Nimble/Matchers/BeAKindOf.swift",
"chars": 1556,
"preview": "import Foundation\n\n// A Nimble matcher that catches attempts to use beAKindOf with non Objective-C types\npublic func beA"
},
{
"path": "Carthage/Checkouts/ReactiveCocoa/Carthage/Checkouts/Quick/Externals/Nimble/Nimble/Matchers/BeAnInstanceOf.swift",
"chars": 1583,
"preview": "import Foundation\n\n// A Nimble matcher that catches attempts to use beAnInstanceOf with non Objective-C types\npublic fun"
},
{
"path": "Carthage/Checkouts/ReactiveCocoa/Carthage/Checkouts/Quick/Externals/Nimble/Nimble/Matchers/BeCloseTo.swift",
"chars": 4820,
"preview": "import Foundation\n\ninternal let DefaultDelta = 0.0001\n\ninternal func isCloseTo(actualValue: NMBDoubleConvertible?, expec"
},
{
"path": "Carthage/Checkouts/ReactiveCocoa/Carthage/Checkouts/Quick/Externals/Nimble/Nimble/Matchers/BeEmpty.swift",
"chars": 4228,
"preview": "import Foundation\n\n\n/// A Nimble matcher that succeeds when a value is \"empty\". For collections, this\n/// means the are "
},
{
"path": "Carthage/Checkouts/ReactiveCocoa/Carthage/Checkouts/Quick/Externals/Nimble/Nimble/Matchers/BeGreaterThan.swift",
"chars": 1567,
"preview": "import Foundation\n\n\n/// A Nimble matcher that succeeds when the actual value is greater than the expected value.\npublic "
},
{
"path": "Carthage/Checkouts/ReactiveCocoa/Carthage/Checkouts/Quick/Externals/Nimble/Nimble/Matchers/BeGreaterThanOrEqualTo.swift",
"chars": 1703,
"preview": "import Foundation\n\n/// A Nimble matcher that succeeds when the actual value is greater than\n/// or equal to the expected"
},
{
"path": "Carthage/Checkouts/ReactiveCocoa/Carthage/Checkouts/Quick/Externals/Nimble/Nimble/Matchers/BeIdenticalTo.swift",
"chars": 1062,
"preview": "import Foundation\n\n\n/// A Nimble matcher that succeeds when the actual value is the same instance\n/// as the expected in"
},
{
"path": "Carthage/Checkouts/ReactiveCocoa/Carthage/Checkouts/Quick/Externals/Nimble/Nimble/Matchers/BeLessThan.swift",
"chars": 1536,
"preview": "import Foundation\n\n/// A Nimble matcher that succeeds when the actual value is less than the expected value.\npublic func"
},
{
"path": "Carthage/Checkouts/ReactiveCocoa/Carthage/Checkouts/Quick/Externals/Nimble/Nimble/Matchers/BeLessThanOrEqual.swift",
"chars": 1605,
"preview": "import Foundation\n\n/// A Nimble matcher that succeeds when the actual value is less than\n/// or equal to the expected va"
},
{
"path": "Carthage/Checkouts/ReactiveCocoa/Carthage/Checkouts/Quick/Externals/Nimble/Nimble/Matchers/BeLogical.swift",
"chars": 3663,
"preview": "import Foundation\n\ninternal func matcherWithFailureMessage<T, M: Matcher where M.ValueType == T>(matcher: M, postprocess"
}
]
// ... and 726 more files (download for full content)
About this extraction
This page contains the full source code of the brewfactory/BrewMobile GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 926 files (3.8 MB), approximately 1.1M tokens, and a symbol index with 31 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.
Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.