From d1e4c43bc1e78082fbf3200576f6af1d6e795438 Mon Sep 17 00:00:00 2001 From: Nick DiZazzo Date: Wed, 1 Mar 2017 10:29:09 -0500 Subject: [PATCH] First version of Biome --- Biome.podspec | 36 +- Biome.xcodeproj/project.pbxproj | 475 ++++++++++++++ .../contents.xcworkspacedata | 0 .../xcshareddata/xcschemes/Biome.xcscheme | 57 +- Biome/Assets/.gitkeep | 0 Biome/Biome.h | 25 + Biome/Classes/.gitkeep | 0 Biome/Classes/Biome.swift | 116 ++++ Biome/Classes/BiomeDataSource.swift | 98 +++ Biome/Classes/PlistBiomeProvider.swift | 31 + Biome/Classes/ReplaceMe.swift | 0 Biome/Info.plist | 24 + BiomeDemo/BiomeDemo.xcodeproj/project.pbxproj | 428 +++++++++++++ .../contents.xcworkspacedata | 7 + BiomeDemo/BiomeDemo/AppDelegate.swift | 37 ++ .../AppIcon.appiconset/Contents.json | 32 +- .../BiomeDemo}/Base.lproj/LaunchScreen.xib | 13 +- .../BiomeDemo/Base.lproj/Main.storyboard | 118 ++++ BiomeDemo/BiomeDemo/Development.plist | 8 + .../AppIcon.appiconset/Contents.json | 128 ++++ .../AppIcon.appiconset/Icon-App-20x20@1x.png | Bin 0 -> 787 bytes .../AppIcon.appiconset/Icon-App-20x20@2x.png | Bin 0 -> 1791 bytes .../AppIcon.appiconset/Icon-App-20x20@3x.png | Bin 0 -> 2785 bytes .../AppIcon.appiconset/Icon-App-29x29@1x.png | Bin 0 -> 1248 bytes .../AppIcon.appiconset/Icon-App-29x29@2x.png | Bin 0 -> 2915 bytes .../AppIcon.appiconset/Icon-App-29x29@3x.png | Bin 0 -> 4790 bytes .../AppIcon.appiconset/Icon-App-40x40@1x.png | Bin 0 -> 1791 bytes .../AppIcon.appiconset/Icon-App-40x40@2x.png | Bin 0 -> 4056 bytes .../AppIcon.appiconset/Icon-App-40x40@3x.png | Bin 0 -> 7591 bytes .../AppIcon.appiconset/Icon-App-57x57@1x.png | Bin 0 -> 2744 bytes .../AppIcon.appiconset/Icon-App-57x57@2x.png | Bin 0 -> 7079 bytes .../AppIcon.appiconset/Icon-App-60x60@2x.png | Bin 0 -> 7591 bytes .../AppIcon.appiconset/Icon-App-60x60@3x.png | Bin 0 -> 15103 bytes .../AppIcon.appiconset/Icon-App-76x76@1x.png | Bin 0 -> 3923 bytes .../AppIcon.appiconset/Icon-App-76x76@2x.png | Bin 0 -> 10772 bytes .../Icon-App-83.5x83.5@2x.png | Bin 0 -> 13027 bytes .../BiomeDemo/Images.xcassets/Contents.json | 6 + .../logo.imageset/Contents.json | 23 + .../Images.xcassets/logo.imageset/biome-1.png | Bin 0 -> 26068 bytes .../Images.xcassets/logo.imageset/biome-2.png | Bin 0 -> 26068 bytes .../Images.xcassets/logo.imageset/biome.png | Bin 0 -> 26068 bytes .../Biome => BiomeDemo/BiomeDemo}/Info.plist | 0 BiomeDemo/BiomeDemo/Production.plist | 8 + BiomeDemo/BiomeDemo/Staging.plist | 8 + BiomeDemo/BiomeDemo/ViewController.swift | 47 ++ BiomeTests/BiomeManagerTests.swift | 94 +++ BiomeTests/BiomeTests.swift | 59 ++ {Example/Tests => BiomeTests}/Info.plist | 0 BiomeTests/PlistBiomeProviderTests.swift | 46 ++ BiomeTests/testProperties.plist | 14 + CONTRIBUTING.md | 1 + Carthage.xcconfig | 14 + Example/Biome.xcodeproj/project.pbxproj | 591 ------------------ Example/Biome/AppDelegate.swift | 46 -- Example/Biome/Base.lproj/Main.storyboard | 25 - Example/Biome/ViewController.swift | 24 - Example/Podfile | 11 - Example/Tests/Tests.swift | 29 - Images/biome.png | Bin 0 -> 26068 bytes LICENSE | 2 +- README.md | 192 +++++- _Pods.xcodeproj | 1 - scripts/build-dependencies.sh | 26 + scripts/copy-carthage-frameworks.sh | 24 + 64 files changed, 2112 insertions(+), 812 deletions(-) create mode 100644 Biome.xcodeproj/project.pbxproj rename {Example/Biome.xcodeproj => Biome.xcodeproj}/project.xcworkspace/contents.xcworkspacedata (100%) rename Example/Biome.xcodeproj/xcshareddata/xcschemes/Biome-Example.xcscheme => Biome.xcodeproj/xcshareddata/xcschemes/Biome.xcscheme (62%) delete mode 100644 Biome/Assets/.gitkeep create mode 100644 Biome/Biome.h delete mode 100644 Biome/Classes/.gitkeep create mode 100644 Biome/Classes/Biome.swift create mode 100644 Biome/Classes/BiomeDataSource.swift create mode 100644 Biome/Classes/PlistBiomeProvider.swift delete mode 100644 Biome/Classes/ReplaceMe.swift create mode 100644 Biome/Info.plist create mode 100644 BiomeDemo/BiomeDemo.xcodeproj/project.pbxproj create mode 100644 BiomeDemo/BiomeDemo.xcodeproj/project.xcworkspace/contents.xcworkspacedata create mode 100644 BiomeDemo/BiomeDemo/AppDelegate.swift rename {Example/Biome/Images.xcassets => BiomeDemo/BiomeDemo/Assets.xcassets}/AppIcon.appiconset/Contents.json (54%) rename {Example/Biome => BiomeDemo/BiomeDemo}/Base.lproj/LaunchScreen.xib (84%) create mode 100644 BiomeDemo/BiomeDemo/Base.lproj/Main.storyboard create mode 100644 BiomeDemo/BiomeDemo/Development.plist create mode 100644 BiomeDemo/BiomeDemo/Images.xcassets/AppIcon.appiconset/Contents.json create mode 100644 BiomeDemo/BiomeDemo/Images.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png create mode 100644 BiomeDemo/BiomeDemo/Images.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png create mode 100644 BiomeDemo/BiomeDemo/Images.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png create mode 100644 BiomeDemo/BiomeDemo/Images.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png create mode 100644 BiomeDemo/BiomeDemo/Images.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png create mode 100644 BiomeDemo/BiomeDemo/Images.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png create mode 100644 BiomeDemo/BiomeDemo/Images.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png create mode 100644 BiomeDemo/BiomeDemo/Images.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png create mode 100644 BiomeDemo/BiomeDemo/Images.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png create mode 100644 BiomeDemo/BiomeDemo/Images.xcassets/AppIcon.appiconset/Icon-App-57x57@1x.png create mode 100644 BiomeDemo/BiomeDemo/Images.xcassets/AppIcon.appiconset/Icon-App-57x57@2x.png create mode 100644 BiomeDemo/BiomeDemo/Images.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png create mode 100644 BiomeDemo/BiomeDemo/Images.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png create mode 100644 BiomeDemo/BiomeDemo/Images.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png create mode 100644 BiomeDemo/BiomeDemo/Images.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png create mode 100644 BiomeDemo/BiomeDemo/Images.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png create mode 100644 BiomeDemo/BiomeDemo/Images.xcassets/Contents.json create mode 100644 BiomeDemo/BiomeDemo/Images.xcassets/logo.imageset/Contents.json create mode 100644 BiomeDemo/BiomeDemo/Images.xcassets/logo.imageset/biome-1.png create mode 100644 BiomeDemo/BiomeDemo/Images.xcassets/logo.imageset/biome-2.png create mode 100644 BiomeDemo/BiomeDemo/Images.xcassets/logo.imageset/biome.png rename {Example/Biome => BiomeDemo/BiomeDemo}/Info.plist (100%) create mode 100644 BiomeDemo/BiomeDemo/Production.plist create mode 100644 BiomeDemo/BiomeDemo/Staging.plist create mode 100644 BiomeDemo/BiomeDemo/ViewController.swift create mode 100644 BiomeTests/BiomeManagerTests.swift create mode 100644 BiomeTests/BiomeTests.swift rename {Example/Tests => BiomeTests}/Info.plist (100%) create mode 100644 BiomeTests/PlistBiomeProviderTests.swift create mode 100644 BiomeTests/testProperties.plist create mode 100644 CONTRIBUTING.md create mode 100644 Carthage.xcconfig delete mode 100644 Example/Biome.xcodeproj/project.pbxproj delete mode 100644 Example/Biome/AppDelegate.swift delete mode 100644 Example/Biome/Base.lproj/Main.storyboard delete mode 100644 Example/Biome/ViewController.swift delete mode 100644 Example/Podfile delete mode 100644 Example/Tests/Tests.swift create mode 100644 Images/biome.png delete mode 120000 _Pods.xcodeproj create mode 100755 scripts/build-dependencies.sh create mode 100755 scripts/copy-carthage-frameworks.sh diff --git a/Biome.podspec b/Biome.podspec index 5852e52..ba8c568 100644 --- a/Biome.podspec +++ b/Biome.podspec @@ -1,42 +1,18 @@ -# -# Be sure to run `pod lib lint Biome.podspec' to ensure this is a -# valid spec before submitting. -# -# Any lines starting with a # are optional, but their use is encouraged -# To learn more about a Podspec see http://guides.cocoapods.org/syntax/podspec.html -# - Pod::Spec.new do |s| s.name = 'Biome' - s.version = '0.1.0' - s.summary = 'A short description of Biome.' - -# This description is used to generate tags and improve search results. -# * Think: What does it do? Why did you write it? What is the focus? -# * Try to keep it short, snappy and to the point. -# * Write the description between the DESC delimiters below. -# * Finally, don't worry about the indent, CocoaPods strips it! - + s.version = '1.0.0' + s.summary = 'Simple environment management for iOS / macOS / tvOS / watchOS!' s.description = <<-DESC -TODO: Add long description of the pod here. +Biome is a simple way to manage sets of variables between environments you might need to work with when developing your application. + +One problem developers face, is the need to create multiple builds in order to test how their application functions in different environments. Biome aims to reduce the amount of re-building that needs to occur, by providing a mechanism to switch configurations during run-time. DESC s.homepage = 'https://github.com/ndizazzo/Biome' - # s.screenshots = 'www.example.com/screenshots_1', 'www.example.com/screenshots_2' s.license = { :type => 'MIT', :file => 'LICENSE' } - s.author = { 'ndizazzo' => 'nick@twg.io' } + s.author = { 'ndizazzo' => 'nick.dizazzo@gmail.com' } s.source = { :git => 'https://github.com/ndizazzo/Biome.git', :tag => s.version.to_s } - # s.social_media_url = 'https://twitter.com/' s.ios.deployment_target = '8.0' - s.source_files = 'Biome/Classes/**/*' - - # s.resource_bundles = { - # 'Biome' => ['Biome/Assets/*.png'] - # } - - # s.public_header_files = 'Pod/Classes/**/*.h' - # s.frameworks = 'UIKit', 'MapKit' - # s.dependency 'AFNetworking', '~> 2.3' end diff --git a/Biome.xcodeproj/project.pbxproj b/Biome.xcodeproj/project.pbxproj new file mode 100644 index 0000000..6bf6b1b --- /dev/null +++ b/Biome.xcodeproj/project.pbxproj @@ -0,0 +1,475 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 46; + objects = { + +/* Begin PBXBuildFile section */ + C5EE7B1E1E6DE98200EC5A49 /* Biome.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = C5EE7B141E6DE98200EC5A49 /* Biome.framework */; }; + C5EE7B251E6DE98200EC5A49 /* Biome.h in Headers */ = {isa = PBXBuildFile; fileRef = C5EE7B171E6DE98200EC5A49 /* Biome.h */; settings = {ATTRIBUTES = (Public, ); }; }; + C5EE7B321E6DEA4100EC5A49 /* Biome.swift in Sources */ = {isa = PBXBuildFile; fileRef = C5EE7B2F1E6DEA4100EC5A49 /* Biome.swift */; }; + C5EE7B331E6DEA4100EC5A49 /* BiomeDataSource.swift in Sources */ = {isa = PBXBuildFile; fileRef = C5EE7B301E6DEA4100EC5A49 /* BiomeDataSource.swift */; }; + C5EE7B341E6DEA4100EC5A49 /* PlistBiomeProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = C5EE7B311E6DEA4100EC5A49 /* PlistBiomeProvider.swift */; }; + C5EE7B3A1E6DEAA100EC5A49 /* BiomeManagerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = C5EE7B361E6DEAA100EC5A49 /* BiomeManagerTests.swift */; }; + C5EE7B3B1E6DEAA100EC5A49 /* BiomeTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = C5EE7B371E6DEAA100EC5A49 /* BiomeTests.swift */; }; + C5EE7B3C1E6DEAA100EC5A49 /* PlistBiomeProviderTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = C5EE7B381E6DEAA100EC5A49 /* PlistBiomeProviderTests.swift */; }; + C5EE7B3D1E6DEAA100EC5A49 /* testProperties.plist in Resources */ = {isa = PBXBuildFile; fileRef = C5EE7B391E6DEAA100EC5A49 /* testProperties.plist */; }; + C5EE7B611E6DFD3500EC5A49 /* Carthage.xcconfig in Resources */ = {isa = PBXBuildFile; fileRef = C5EE7B601E6DFD3500EC5A49 /* Carthage.xcconfig */; }; +/* End PBXBuildFile section */ + +/* Begin PBXContainerItemProxy section */ + C5EE7B1F1E6DE98200EC5A49 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = C5EE7B0B1E6DE98200EC5A49 /* Project object */; + proxyType = 1; + remoteGlobalIDString = C5EE7B131E6DE98200EC5A49; + remoteInfo = Biome; + }; +/* End PBXContainerItemProxy section */ + +/* Begin PBXFileReference section */ + C5EE7B141E6DE98200EC5A49 /* Biome.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Biome.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + C5EE7B171E6DE98200EC5A49 /* Biome.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = Biome.h; sourceTree = ""; }; + C5EE7B181E6DE98200EC5A49 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + C5EE7B1D1E6DE98200EC5A49 /* BiomeTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = BiomeTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; + C5EE7B241E6DE98200EC5A49 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + C5EE7B2F1E6DEA4100EC5A49 /* Biome.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = Biome.swift; path = Classes/Biome.swift; sourceTree = ""; }; + C5EE7B301E6DEA4100EC5A49 /* BiomeDataSource.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = BiomeDataSource.swift; path = Classes/BiomeDataSource.swift; sourceTree = ""; }; + C5EE7B311E6DEA4100EC5A49 /* PlistBiomeProvider.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = PlistBiomeProvider.swift; path = Classes/PlistBiomeProvider.swift; sourceTree = ""; }; + C5EE7B361E6DEAA100EC5A49 /* BiomeManagerTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = BiomeManagerTests.swift; sourceTree = ""; }; + C5EE7B371E6DEAA100EC5A49 /* BiomeTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = BiomeTests.swift; sourceTree = ""; }; + C5EE7B381E6DEAA100EC5A49 /* PlistBiomeProviderTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PlistBiomeProviderTests.swift; sourceTree = ""; }; + C5EE7B391E6DEAA100EC5A49 /* testProperties.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = testProperties.plist; sourceTree = ""; }; + C5EE7B601E6DFD3500EC5A49 /* Carthage.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = Carthage.xcconfig; sourceTree = ""; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + C5EE7B101E6DE98200EC5A49 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + C5EE7B1A1E6DE98200EC5A49 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + C5EE7B1E1E6DE98200EC5A49 /* Biome.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + C5EE7B0A1E6DE98200EC5A49 = { + isa = PBXGroup; + children = ( + C5EE7B601E6DFD3500EC5A49 /* Carthage.xcconfig */, + C5EE7B161E6DE98200EC5A49 /* Biome */, + C5EE7B211E6DE98200EC5A49 /* BiomeTests */, + C5EE7B151E6DE98200EC5A49 /* Products */, + ); + sourceTree = ""; + }; + C5EE7B151E6DE98200EC5A49 /* Products */ = { + isa = PBXGroup; + children = ( + C5EE7B141E6DE98200EC5A49 /* Biome.framework */, + C5EE7B1D1E6DE98200EC5A49 /* BiomeTests.xctest */, + ); + name = Products; + sourceTree = ""; + }; + C5EE7B161E6DE98200EC5A49 /* Biome */ = { + isa = PBXGroup; + children = ( + C5EE7B2E1E6DE9DA00EC5A49 /* Biome */, + C5EE7B171E6DE98200EC5A49 /* Biome.h */, + C5EE7B181E6DE98200EC5A49 /* Info.plist */, + ); + path = Biome; + sourceTree = ""; + }; + C5EE7B211E6DE98200EC5A49 /* BiomeTests */ = { + isa = PBXGroup; + children = ( + C5EE7B351E6DEA4B00EC5A49 /* Biome */, + C5EE7B241E6DE98200EC5A49 /* Info.plist */, + ); + path = BiomeTests; + sourceTree = ""; + }; + C5EE7B2E1E6DE9DA00EC5A49 /* Biome */ = { + isa = PBXGroup; + children = ( + C5EE7B2F1E6DEA4100EC5A49 /* Biome.swift */, + C5EE7B301E6DEA4100EC5A49 /* BiomeDataSource.swift */, + C5EE7B311E6DEA4100EC5A49 /* PlistBiomeProvider.swift */, + ); + name = Biome; + sourceTree = ""; + }; + C5EE7B351E6DEA4B00EC5A49 /* Biome */ = { + isa = PBXGroup; + children = ( + C5EE7B361E6DEAA100EC5A49 /* BiomeManagerTests.swift */, + C5EE7B371E6DEAA100EC5A49 /* BiomeTests.swift */, + C5EE7B381E6DEAA100EC5A49 /* PlistBiomeProviderTests.swift */, + C5EE7B391E6DEAA100EC5A49 /* testProperties.plist */, + ); + name = Biome; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXHeadersBuildPhase section */ + C5EE7B111E6DE98200EC5A49 /* Headers */ = { + isa = PBXHeadersBuildPhase; + buildActionMask = 2147483647; + files = ( + C5EE7B251E6DE98200EC5A49 /* Biome.h in Headers */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXHeadersBuildPhase section */ + +/* Begin PBXNativeTarget section */ + C5EE7B131E6DE98200EC5A49 /* Biome */ = { + isa = PBXNativeTarget; + buildConfigurationList = C5EE7B281E6DE98200EC5A49 /* Build configuration list for PBXNativeTarget "Biome" */; + buildPhases = ( + C5EE7B0F1E6DE98200EC5A49 /* Sources */, + C5EE7B101E6DE98200EC5A49 /* Frameworks */, + C5EE7B111E6DE98200EC5A49 /* Headers */, + C5EE7B121E6DE98200EC5A49 /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = Biome; + productName = Biome; + productReference = C5EE7B141E6DE98200EC5A49 /* Biome.framework */; + productType = "com.apple.product-type.framework"; + }; + C5EE7B1C1E6DE98200EC5A49 /* BiomeTests */ = { + isa = PBXNativeTarget; + buildConfigurationList = C5EE7B2B1E6DE98200EC5A49 /* Build configuration list for PBXNativeTarget "BiomeTests" */; + buildPhases = ( + C5EE7B191E6DE98200EC5A49 /* Sources */, + C5EE7B1A1E6DE98200EC5A49 /* Frameworks */, + C5EE7B1B1E6DE98200EC5A49 /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + C5EE7B201E6DE98200EC5A49 /* PBXTargetDependency */, + ); + name = BiomeTests; + productName = BiomeTests; + productReference = C5EE7B1D1E6DE98200EC5A49 /* BiomeTests.xctest */; + productType = "com.apple.product-type.bundle.unit-test"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + C5EE7B0B1E6DE98200EC5A49 /* Project object */ = { + isa = PBXProject; + attributes = { + LastSwiftUpdateCheck = 0820; + LastUpgradeCheck = 0820; + ORGANIZATIONNAME = "Nick DiZazzo"; + TargetAttributes = { + C5EE7B131E6DE98200EC5A49 = { + CreatedOnToolsVersion = 8.2.1; + LastSwiftMigration = 0820; + ProvisioningStyle = Manual; + }; + C5EE7B1C1E6DE98200EC5A49 = { + CreatedOnToolsVersion = 8.2.1; + ProvisioningStyle = Automatic; + }; + }; + }; + buildConfigurationList = C5EE7B0E1E6DE98200EC5A49 /* Build configuration list for PBXProject "Biome" */; + compatibilityVersion = "Xcode 3.2"; + developmentRegion = English; + hasScannedForEncodings = 0; + knownRegions = ( + en, + ); + mainGroup = C5EE7B0A1E6DE98200EC5A49; + productRefGroup = C5EE7B151E6DE98200EC5A49 /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + C5EE7B131E6DE98200EC5A49 /* Biome */, + C5EE7B1C1E6DE98200EC5A49 /* BiomeTests */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + C5EE7B121E6DE98200EC5A49 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + C5EE7B611E6DFD3500EC5A49 /* Carthage.xcconfig in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + C5EE7B1B1E6DE98200EC5A49 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + C5EE7B3D1E6DEAA100EC5A49 /* testProperties.plist in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + C5EE7B0F1E6DE98200EC5A49 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + C5EE7B341E6DEA4100EC5A49 /* PlistBiomeProvider.swift in Sources */, + C5EE7B321E6DEA4100EC5A49 /* Biome.swift in Sources */, + C5EE7B331E6DEA4100EC5A49 /* BiomeDataSource.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + C5EE7B191E6DE98200EC5A49 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + C5EE7B3B1E6DEAA100EC5A49 /* BiomeTests.swift in Sources */, + C5EE7B3A1E6DEAA100EC5A49 /* BiomeManagerTests.swift in Sources */, + C5EE7B3C1E6DEAA100EC5A49 /* PlistBiomeProviderTests.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin PBXTargetDependency section */ + C5EE7B201E6DE98200EC5A49 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = C5EE7B131E6DE98200EC5A49 /* Biome */; + targetProxy = C5EE7B1F1E6DE98200EC5A49 /* PBXContainerItemProxy */; + }; +/* End PBXTargetDependency section */ + +/* Begin XCBuildConfiguration section */ + C5EE7B261E6DE98200EC5A49 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + 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_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + COPY_PHASE_STRIP = NO; + CURRENT_PROJECT_VERSION = 1; + DEBUG_INFORMATION_FORMAT = dwarf; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_DYNAMIC_NO_PIC = NO; + GCC_NO_COMMON_BLOCKS = YES; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + 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.0; + MACOSX_DEPLOYMENT_TARGET = 10.10; + MTL_ENABLE_DEBUG_INFO = YES; + ONLY_ACTIVE_ARCH = YES; + SDKROOT = macosx; + SUPPORTED_PLATFORMS = "iphoneos iphonesimulator appletvos appletvsimulator macosx"; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + TARGETED_DEVICE_FAMILY = "1,2,3,4"; + TVOS_DEPLOYMENT_TARGET = 9.0; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + WATCHOS_DEPLOYMENT_TARGET = 3.0; + }; + name = Debug; + }; + C5EE7B271E6DE98200EC5A49 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + 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_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + COPY_PHASE_STRIP = NO; + CURRENT_PROJECT_VERSION = 1; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_NO_COMMON_BLOCKS = YES; + 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.0; + MACOSX_DEPLOYMENT_TARGET = 10.10; + MTL_ENABLE_DEBUG_INFO = NO; + SDKROOT = macosx; + SUPPORTED_PLATFORMS = "iphoneos iphonesimulator appletvos appletvsimulator macosx"; + SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; + TARGETED_DEVICE_FAMILY = "1,2,3,4"; + TVOS_DEPLOYMENT_TARGET = 9.0; + VALIDATE_PRODUCT = YES; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + WATCHOS_DEPLOYMENT_TARGET = 3.0; + }; + name = Release; + }; + C5EE7B291E6DE98200EC5A49 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + APPLICATION_EXTENSION_API_ONLY = YES; + CLANG_ENABLE_MODULES = YES; + CODE_SIGN_IDENTITY = ""; + DEFINES_MODULE = YES; + DEVELOPMENT_TEAM = ""; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + INFOPLIST_FILE = Biome/Info.plist; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = com.ndizazzo.Biome; + PRODUCT_NAME = "$(TARGET_NAME)"; + SKIP_INSTALL = YES; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + SWIFT_VERSION = 3.0; + }; + name = Debug; + }; + C5EE7B2A1E6DE98200EC5A49 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + APPLICATION_EXTENSION_API_ONLY = YES; + CLANG_ENABLE_MODULES = YES; + CODE_SIGN_IDENTITY = ""; + DEFINES_MODULE = YES; + DEVELOPMENT_TEAM = ""; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + INFOPLIST_FILE = Biome/Info.plist; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = com.ndizazzo.Biome; + PRODUCT_NAME = "$(TARGET_NAME)"; + SKIP_INSTALL = YES; + SWIFT_VERSION = 3.0; + }; + name = Release; + }; + C5EE7B2C1E6DE98200EC5A49 /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = C5EE7B601E6DFD3500EC5A49 /* Carthage.xcconfig */; + buildSettings = { + ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; + INFOPLIST_FILE = BiomeTests/Info.plist; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = com.ndizazzo.BiomeTests; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_VERSION = 3.0; + }; + name = Debug; + }; + C5EE7B2D1E6DE98200EC5A49 /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = C5EE7B601E6DFD3500EC5A49 /* Carthage.xcconfig */; + buildSettings = { + ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; + INFOPLIST_FILE = BiomeTests/Info.plist; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = com.ndizazzo.BiomeTests; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_VERSION = 3.0; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + C5EE7B0E1E6DE98200EC5A49 /* Build configuration list for PBXProject "Biome" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + C5EE7B261E6DE98200EC5A49 /* Debug */, + C5EE7B271E6DE98200EC5A49 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + C5EE7B281E6DE98200EC5A49 /* Build configuration list for PBXNativeTarget "Biome" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + C5EE7B291E6DE98200EC5A49 /* Debug */, + C5EE7B2A1E6DE98200EC5A49 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + C5EE7B2B1E6DE98200EC5A49 /* Build configuration list for PBXNativeTarget "BiomeTests" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + C5EE7B2C1E6DE98200EC5A49 /* Debug */, + C5EE7B2D1E6DE98200EC5A49 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + }; + rootObject = C5EE7B0B1E6DE98200EC5A49 /* Project object */; +} diff --git a/Example/Biome.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/Biome.xcodeproj/project.xcworkspace/contents.xcworkspacedata similarity index 100% rename from Example/Biome.xcodeproj/project.xcworkspace/contents.xcworkspacedata rename to Biome.xcodeproj/project.xcworkspace/contents.xcworkspacedata diff --git a/Example/Biome.xcodeproj/xcshareddata/xcschemes/Biome-Example.xcscheme b/Biome.xcodeproj/xcshareddata/xcschemes/Biome.xcscheme similarity index 62% rename from Example/Biome.xcodeproj/xcshareddata/xcschemes/Biome-Example.xcscheme rename to Biome.xcodeproj/xcshareddata/xcschemes/Biome.xcscheme index 7fafef4..3aa7ed2 100644 --- a/Example/Biome.xcodeproj/xcshareddata/xcschemes/Biome-Example.xcscheme +++ b/Biome.xcodeproj/xcshareddata/xcschemes/Biome.xcscheme @@ -14,23 +14,9 @@ buildForAnalyzing = "YES"> - - - - @@ -40,15 +26,16 @@ buildConfiguration = "Debug" selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB" selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB" - shouldUseLaunchSchemeArgsEnv = "YES"> + shouldUseLaunchSchemeArgsEnv = "YES" + codeCoverageEnabled = "YES"> @@ -56,9 +43,9 @@ @@ -75,16 +62,15 @@ debugDocumentVersioning = "YES" debugServiceExtension = "internal" allowLocationSimulation = "YES"> - + - + @@ -94,16 +80,15 @@ savedToolIdentifier = "" useCustomWorkingDirectory = "NO" debugDocumentVersioning = "YES"> - + - + diff --git a/Biome/Assets/.gitkeep b/Biome/Assets/.gitkeep deleted file mode 100644 index e69de29..0000000 diff --git a/Biome/Biome.h b/Biome/Biome.h new file mode 100644 index 0000000..8a02c1a --- /dev/null +++ b/Biome/Biome.h @@ -0,0 +1,25 @@ +// +// Biome1.h +// Biome1 +// +// Created by Nick DiZazzo on 2017-03-06. +// Copyright © 2017 Nick DiZazzo. All rights reserved. +// + +#include + +#if TARGET_OS_IPHONE || TARGET_OS_TV || TARGET_IPHONE_SIMULATOR +#import +#else +#import +#endif + +//! Project version number for Biome1. +FOUNDATION_EXPORT double Biome1VersionNumber; + +//! Project version string for Biome1. +FOUNDATION_EXPORT const unsigned char Biome1VersionString[]; + +// In this header, you should import all the public headers of your framework using statements like #import + + diff --git a/Biome/Classes/.gitkeep b/Biome/Classes/.gitkeep deleted file mode 100644 index e69de29..0000000 diff --git a/Biome/Classes/Biome.swift b/Biome/Classes/Biome.swift new file mode 100644 index 0000000..d74266f --- /dev/null +++ b/Biome/Classes/Biome.swift @@ -0,0 +1,116 @@ +// +// Biome.swift +// Biome +// +// Created by Nick DiZazzo on 2017-02-28. +// Copyright © 2017 Nick DiZazzo. All rights reserved. +// + +import Foundation + +// MARK: - +// MARK: BiomeProvider + +public protocol BiomeProvider { + var biomeName: String { get } + func mappedPropertyDictionary() -> [String: Any] +} + +// MARK: - +// MARK: BiomeManager + +public enum BiomeError: Error { + case previouslyRegistered + case notRegistered +} + +public protocol BiomeManagerDelegate { + func switched(to biome: Biome?) +} + +public class BiomeManager { + public static let shared = BiomeManager() + + internal var biomes: Set = Set() + + public var count: Int { get { return self.biomes.count } } + public var current: Biome? { didSet { self.delegate?.switched(to: self.current) } } + public var delegate: BiomeManagerDelegate? + + public var keys: Set { + get { + var unversalKeys = Set() + + for biome in self.biomes { + biome.properties.keys.forEach { unversalKeys.insert($0) } + } + + return unversalKeys + } + } + + public static func register(_ biome: Biome) throws { + if shared.biomes.contains(biome) { + throw BiomeError.previouslyRegistered + } + + if shared.count == 0 { + shared.current = biome + } + + shared.biomes.insert(biome) + } + + public static func remove(_ biome: Biome) throws { + guard shared.biomes.contains(biome) else { + throw BiomeError.notRegistered + } + + shared.biomes.remove(biome) + } + + public func clear() { + self.current = nil + self.biomes.removeAll() + } +} + +// MARK: - +// MARK: Biome +public class Biome { + fileprivate var properties: [String: Any] = [:] + + public private(set) var name: String = "" + public var count: Int { get { return properties.keys.count } } + + public init(named biomeName: String) { + self.name = biomeName + } + + public init(with provider: BiomeProvider) { + self.name = provider.biomeName + self.properties = provider.mappedPropertyDictionary() + } + + public func get(_ key: String) -> Any? { + return self.properties[key] + } + + public func set(_ key: String, value: Any?) { + self.properties[key] = value + } +} + +// MARK: - +// MARK: Equatable +extension Biome: Equatable { + public static func ==(lhs: Biome, rhs: Biome) -> Bool { + return lhs.name == rhs.name + } +} + +// MARK: - +// MARK: Hashable +extension Biome: Hashable { + public var hashValue: Int { get { return self.name.hash } } +} diff --git a/Biome/Classes/BiomeDataSource.swift b/Biome/Classes/BiomeDataSource.swift new file mode 100644 index 0000000..9e6cec4 --- /dev/null +++ b/Biome/Classes/BiomeDataSource.swift @@ -0,0 +1,98 @@ +// +// BiomeDataSource.swift +// Pods +// +// Created by Nick DiZazzo on 2017-03-01. +// +// + +import Foundation + +#if os(iOS) || os(watchOS) || os(tvOS) +// MARK: - +// MARK: BiomeDataSource +public class BiomeDataSource: NSObject { + internal weak var manager: BiomeManager? + internal var biomes: [Biome] + + public init(biomeManager: BiomeManager) { + self.manager = biomeManager + self.biomes = Array(biomeManager.biomes) + } + + fileprivate func biome(at index: Int) -> Biome? { + guard index >= 0 && index < self.biomes.count else { + return nil + } + + return self.biomes[index] + } + + fileprivate func viewModel(for biome: Biome) -> BiomeViewModel { + let isActive = self.manager?.current == biome + let string = biome.count == 1 ? "%d key" : "%d keys" + return BiomeViewModel(name: biome.name, + subtitle: String.init(format: string, biome.count), + active: isActive) + } +} + +// MARK: - +// MARK: UITableViewDataSource +extension BiomeDataSource: UITableViewDataSource { + + public func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { + return self.biomes.count + } + + public func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { + let cell = self.cell(tableView: tableView) + if let biome = self.biome(at: indexPath.row) { + let viewModel = self.viewModel(for: biome) + cell.update(with: viewModel) + } + + return cell + } + + private func cell(tableView: UITableView) -> UITableViewCell { + var cell = tableView.dequeueReusableCell(withIdentifier: "cell") + + if cell == nil { + cell = UITableViewCell(style: .subtitle, reuseIdentifier: "cell") + } + + return cell! + } +} + +// MARK: - +// MARK: UITableViewDelegate +extension BiomeDataSource: UITableViewDelegate { + public func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { + let biome = self.biome(at: indexPath.row) + self.manager?.current = biome + + var indexSet = IndexSet() + indexSet.insert(0) + + tableView.reloadSections(indexSet, with: .automatic) + } +} + +// MARK: - +// MARK: Random view stuff +fileprivate struct BiomeViewModel { + var name: String + var subtitle: String + var active: Bool +} + +extension UITableViewCell { + fileprivate func update(with viewModel: BiomeViewModel) { + self.textLabel?.text = viewModel.name + self.detailTextLabel?.text = viewModel.subtitle + self.accessoryType = viewModel.active ? .checkmark : .none + } +} +#endif diff --git a/Biome/Classes/PlistBiomeProvider.swift b/Biome/Classes/PlistBiomeProvider.swift new file mode 100644 index 0000000..2859aa5 --- /dev/null +++ b/Biome/Classes/PlistBiomeProvider.swift @@ -0,0 +1,31 @@ +// +// PlistBiomeProvider.swift +// Biome +// +// Created by Nick DiZazzo on 2017-02-28. +// Copyright © 2017 Nick DiZazzo. All rights reserved. +// + +import Foundation + +public class PlistBiomeProvider: BiomeProvider { + + var plistFileName: String + var bundle: Bundle + + public var biomeName: String { get { return self.plistFileName } } + + public init(bundle: Bundle, filename: String) { + self.plistFileName = filename + self.bundle = bundle + } + + public func mappedPropertyDictionary() -> [String : Any] { + if let path = self.bundle.path(forResource: self.plistFileName, ofType: "plist"), + let dict = NSDictionary(contentsOfFile: path) as? [String: AnyObject] { + return dict + } + + return [:] + } +} diff --git a/Biome/Classes/ReplaceMe.swift b/Biome/Classes/ReplaceMe.swift deleted file mode 100644 index e69de29..0000000 diff --git a/Biome/Info.plist b/Biome/Info.plist new file mode 100644 index 0000000..fbe1e6b --- /dev/null +++ b/Biome/Info.plist @@ -0,0 +1,24 @@ + + + + + CFBundleDevelopmentRegion + en + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + $(PRODUCT_NAME) + CFBundlePackageType + FMWK + CFBundleShortVersionString + 1.0 + CFBundleVersion + $(CURRENT_PROJECT_VERSION) + NSPrincipalClass + + + diff --git a/BiomeDemo/BiomeDemo.xcodeproj/project.pbxproj b/BiomeDemo/BiomeDemo.xcodeproj/project.pbxproj new file mode 100644 index 0000000..b301d52 --- /dev/null +++ b/BiomeDemo/BiomeDemo.xcodeproj/project.pbxproj @@ -0,0 +1,428 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 46; + objects = { + +/* Begin PBXBuildFile section */ + C57075AF1E6F15DF00F4C96E /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = C57075A31E6F15DF00F4C96E /* AppDelegate.swift */; }; + C57075B01E6F15DF00F4C96E /* LaunchScreen.xib in Resources */ = {isa = PBXBuildFile; fileRef = C57075A51E6F15DF00F4C96E /* LaunchScreen.xib */; }; + C57075B11E6F15DF00F4C96E /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = C57075A71E6F15DF00F4C96E /* Main.storyboard */; }; + C57075B21E6F15DF00F4C96E /* Development.plist in Resources */ = {isa = PBXBuildFile; fileRef = C57075A91E6F15DF00F4C96E /* Development.plist */; }; + C57075B31E6F15DF00F4C96E /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = C57075AA1E6F15DF00F4C96E /* Images.xcassets */; }; + C57075B51E6F15DF00F4C96E /* Production.plist in Resources */ = {isa = PBXBuildFile; fileRef = C57075AC1E6F15DF00F4C96E /* Production.plist */; }; + C57075B61E6F15DF00F4C96E /* Staging.plist in Resources */ = {isa = PBXBuildFile; fileRef = C57075AD1E6F15DF00F4C96E /* Staging.plist */; }; + C57075B71E6F15DF00F4C96E /* ViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = C57075AE1E6F15DF00F4C96E /* ViewController.swift */; }; + C57075C31E6F177E00F4C96E /* Biome.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = C57075C01E6F174E00F4C96E /* Biome.framework */; }; + C57075C41E6F177E00F4C96E /* Biome.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = C57075C01E6F174E00F4C96E /* Biome.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; +/* End PBXBuildFile section */ + +/* Begin PBXContainerItemProxy section */ + C57075BF1E6F174E00F4C96E /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = C57075BA1E6F174E00F4C96E /* Biome.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = C5EE7B141E6DE98200EC5A49; + remoteInfo = Biome; + }; + C57075C11E6F174E00F4C96E /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = C57075BA1E6F174E00F4C96E /* Biome.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = C5EE7B1D1E6DE98200EC5A49; + remoteInfo = BiomeTests; + }; + C57075C51E6F177E00F4C96E /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = C57075BA1E6F174E00F4C96E /* Biome.xcodeproj */; + proxyType = 1; + remoteGlobalIDString = C5EE7B131E6DE98200EC5A49; + remoteInfo = Biome; + }; +/* End PBXContainerItemProxy section */ + +/* Begin PBXCopyFilesBuildPhase section */ + C57075C71E6F177E00F4C96E /* Embed Frameworks */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 2147483647; + dstPath = ""; + dstSubfolderSpec = 10; + files = ( + C57075C41E6F177E00F4C96E /* Biome.framework in Embed Frameworks */, + ); + name = "Embed Frameworks"; + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXCopyFilesBuildPhase section */ + +/* Begin PBXFileReference section */ + C570758E1E6F15A500F4C96E /* BiomeDemo.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = BiomeDemo.app; sourceTree = BUILT_PRODUCTS_DIR; }; + C57075A31E6F15DF00F4C96E /* AppDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; + C57075A61E6F15DF00F4C96E /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = LaunchScreen.xib; sourceTree = ""; }; + C57075A81E6F15DF00F4C96E /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Main.storyboard; sourceTree = ""; }; + C57075A91E6F15DF00F4C96E /* Development.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = Development.plist; sourceTree = ""; }; + C57075AA1E6F15DF00F4C96E /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Images.xcassets; sourceTree = ""; }; + C57075AB1E6F15DF00F4C96E /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + C57075AC1E6F15DF00F4C96E /* Production.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = Production.plist; sourceTree = ""; }; + C57075AD1E6F15DF00F4C96E /* Staging.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = Staging.plist; sourceTree = ""; }; + C57075AE1E6F15DF00F4C96E /* ViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ViewController.swift; sourceTree = ""; }; + C57075BA1E6F174E00F4C96E /* Biome.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = Biome.xcodeproj; path = ../Biome.xcodeproj; sourceTree = ""; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + C570758B1E6F15A500F4C96E /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + C57075C31E6F177E00F4C96E /* Biome.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + C57075851E6F15A500F4C96E = { + isa = PBXGroup; + children = ( + C57075901E6F15A500F4C96E /* BiomeDemo */, + C570758F1E6F15A500F4C96E /* Products */, + C57075BA1E6F174E00F4C96E /* Biome.xcodeproj */, + ); + sourceTree = ""; + }; + C570758F1E6F15A500F4C96E /* Products */ = { + isa = PBXGroup; + children = ( + C570758E1E6F15A500F4C96E /* BiomeDemo.app */, + ); + name = Products; + sourceTree = ""; + }; + C57075901E6F15A500F4C96E /* BiomeDemo */ = { + isa = PBXGroup; + children = ( + C57075A31E6F15DF00F4C96E /* AppDelegate.swift */, + C57075B91E6F15FC00F4C96E /* View Controllers */, + C57075B81E6F15EF00F4C96E /* Supporting Files */, + ); + path = BiomeDemo; + sourceTree = ""; + }; + C57075B81E6F15EF00F4C96E /* Supporting Files */ = { + isa = PBXGroup; + children = ( + C57075A71E6F15DF00F4C96E /* Main.storyboard */, + C57075A51E6F15DF00F4C96E /* LaunchScreen.xib */, + C57075A91E6F15DF00F4C96E /* Development.plist */, + C57075AA1E6F15DF00F4C96E /* Images.xcassets */, + C57075AB1E6F15DF00F4C96E /* Info.plist */, + C57075AC1E6F15DF00F4C96E /* Production.plist */, + C57075AD1E6F15DF00F4C96E /* Staging.plist */, + ); + name = "Supporting Files"; + sourceTree = ""; + }; + C57075B91E6F15FC00F4C96E /* View Controllers */ = { + isa = PBXGroup; + children = ( + C57075AE1E6F15DF00F4C96E /* ViewController.swift */, + ); + name = "View Controllers"; + sourceTree = ""; + }; + C57075BB1E6F174E00F4C96E /* Products */ = { + isa = PBXGroup; + children = ( + C57075C01E6F174E00F4C96E /* Biome.framework */, + C57075C21E6F174E00F4C96E /* BiomeTests.xctest */, + ); + name = Products; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXNativeTarget section */ + C570758D1E6F15A500F4C96E /* BiomeDemo */ = { + isa = PBXNativeTarget; + buildConfigurationList = C57075A01E6F15A500F4C96E /* Build configuration list for PBXNativeTarget "BiomeDemo" */; + buildPhases = ( + C570758A1E6F15A500F4C96E /* Sources */, + C570758B1E6F15A500F4C96E /* Frameworks */, + C570758C1E6F15A500F4C96E /* Resources */, + C57075C71E6F177E00F4C96E /* Embed Frameworks */, + ); + buildRules = ( + ); + dependencies = ( + C57075C61E6F177E00F4C96E /* PBXTargetDependency */, + ); + name = BiomeDemo; + productName = BiomeDemo; + productReference = C570758E1E6F15A500F4C96E /* BiomeDemo.app */; + productType = "com.apple.product-type.application"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + C57075861E6F15A500F4C96E /* Project object */ = { + isa = PBXProject; + attributes = { + LastSwiftUpdateCheck = 0820; + LastUpgradeCheck = 0820; + ORGANIZATIONNAME = "Nick DiZazzo"; + TargetAttributes = { + C570758D1E6F15A500F4C96E = { + CreatedOnToolsVersion = 8.2.1; + LastSwiftMigration = 0820; + ProvisioningStyle = Automatic; + }; + }; + }; + buildConfigurationList = C57075891E6F15A500F4C96E /* Build configuration list for PBXProject "BiomeDemo" */; + compatibilityVersion = "Xcode 3.2"; + developmentRegion = English; + hasScannedForEncodings = 0; + knownRegions = ( + en, + Base, + ); + mainGroup = C57075851E6F15A500F4C96E; + productRefGroup = C570758F1E6F15A500F4C96E /* Products */; + projectDirPath = ""; + projectReferences = ( + { + ProductGroup = C57075BB1E6F174E00F4C96E /* Products */; + ProjectRef = C57075BA1E6F174E00F4C96E /* Biome.xcodeproj */; + }, + ); + projectRoot = ""; + targets = ( + C570758D1E6F15A500F4C96E /* BiomeDemo */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXReferenceProxy section */ + C57075C01E6F174E00F4C96E /* Biome.framework */ = { + isa = PBXReferenceProxy; + fileType = wrapper.framework; + path = Biome.framework; + remoteRef = C57075BF1E6F174E00F4C96E /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; + C57075C21E6F174E00F4C96E /* BiomeTests.xctest */ = { + isa = PBXReferenceProxy; + fileType = wrapper.cfbundle; + path = BiomeTests.xctest; + remoteRef = C57075C11E6F174E00F4C96E /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; +/* End PBXReferenceProxy section */ + +/* Begin PBXResourcesBuildPhase section */ + C570758C1E6F15A500F4C96E /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + C57075B01E6F15DF00F4C96E /* LaunchScreen.xib in Resources */, + C57075B11E6F15DF00F4C96E /* Main.storyboard in Resources */, + C57075B31E6F15DF00F4C96E /* Images.xcassets in Resources */, + C57075B51E6F15DF00F4C96E /* Production.plist in Resources */, + C57075B61E6F15DF00F4C96E /* Staging.plist in Resources */, + C57075B21E6F15DF00F4C96E /* Development.plist in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + C570758A1E6F15A500F4C96E /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + C57075B71E6F15DF00F4C96E /* ViewController.swift in Sources */, + C57075AF1E6F15DF00F4C96E /* AppDelegate.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin PBXTargetDependency section */ + C57075C61E6F177E00F4C96E /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + name = Biome; + targetProxy = C57075C51E6F177E00F4C96E /* PBXContainerItemProxy */; + }; +/* End PBXTargetDependency section */ + +/* Begin PBXVariantGroup section */ + C57075A51E6F15DF00F4C96E /* LaunchScreen.xib */ = { + isa = PBXVariantGroup; + children = ( + C57075A61E6F15DF00F4C96E /* Base */, + ); + name = LaunchScreen.xib; + path = Base.lproj; + sourceTree = ""; + }; + C57075A71E6F15DF00F4C96E /* Main.storyboard */ = { + isa = PBXVariantGroup; + children = ( + C57075A81E6F15DF00F4C96E /* Base */, + ); + name = Main.storyboard; + path = Base.lproj; + sourceTree = ""; + }; +/* End PBXVariantGroup section */ + +/* Begin XCBuildConfiguration section */ + C570759E1E6F15A500F4C96E /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + 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_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = dwarf; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_DYNAMIC_NO_PIC = NO; + GCC_NO_COMMON_BLOCKS = YES; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + 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 = 10.2; + MTL_ENABLE_DEBUG_INFO = YES; + ONLY_ACTIVE_ARCH = YES; + SDKROOT = iphoneos; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Debug; + }; + C570759F1E6F15A500F4C96E /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + 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_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_NO_COMMON_BLOCKS = YES; + 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 = 10.2; + MTL_ENABLE_DEBUG_INFO = NO; + SDKROOT = iphoneos; + SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; + TARGETED_DEVICE_FAMILY = "1,2"; + VALIDATE_PRODUCT = YES; + }; + name = Release; + }; + C57075A11E6F15A500F4C96E /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CLANG_ENABLE_MODULES = YES; + INFOPLIST_FILE = BiomeDemo/Info.plist; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = com.ndizazzo.BiomeDemo; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + SWIFT_VERSION = 3.0; + }; + name = Debug; + }; + C57075A21E6F15A500F4C96E /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CLANG_ENABLE_MODULES = YES; + INFOPLIST_FILE = BiomeDemo/Info.plist; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = com.ndizazzo.BiomeDemo; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_VERSION = 3.0; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + C57075891E6F15A500F4C96E /* Build configuration list for PBXProject "BiomeDemo" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + C570759E1E6F15A500F4C96E /* Debug */, + C570759F1E6F15A500F4C96E /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + C57075A01E6F15A500F4C96E /* Build configuration list for PBXNativeTarget "BiomeDemo" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + C57075A11E6F15A500F4C96E /* Debug */, + C57075A21E6F15A500F4C96E /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + }; + rootObject = C57075861E6F15A500F4C96E /* Project object */; +} diff --git a/BiomeDemo/BiomeDemo.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/BiomeDemo/BiomeDemo.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..3c480e1 --- /dev/null +++ b/BiomeDemo/BiomeDemo.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/BiomeDemo/BiomeDemo/AppDelegate.swift b/BiomeDemo/BiomeDemo/AppDelegate.swift new file mode 100644 index 0000000..b860a0f --- /dev/null +++ b/BiomeDemo/BiomeDemo/AppDelegate.swift @@ -0,0 +1,37 @@ +// +// AppDelegate.swift +// Biome +// +// Created by ndizazzo on 03/01/2017. +// Copyright (c) 2017 ndizazzo. All rights reserved. +// + +import UIKit +import Biome + +@UIApplicationMain +class AppDelegate: UIResponder, UIApplicationDelegate { + var window: UIWindow? + + func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool { + + self.createExampleBiomes() + + return true + } + + func createExampleBiomes() { + let devBiome = Biome(with: PlistBiomeProvider(bundle: Bundle.main, filename: "Development")) + let stagingBiome = Biome(with: PlistBiomeProvider(bundle: Bundle.main, filename: "Staging")) + let prodBiome = Biome(with: PlistBiomeProvider(bundle: Bundle.main, filename: "Production")) + + do { + try BiomeManager.register(devBiome) + try BiomeManager.register(stagingBiome) + try BiomeManager.register(prodBiome) + } catch _ { + assert(false, "Couldn't create a Biome. Is a Plist file missing?") + } + } +} + diff --git a/Example/Biome/Images.xcassets/AppIcon.appiconset/Contents.json b/BiomeDemo/BiomeDemo/Assets.xcassets/AppIcon.appiconset/Contents.json similarity index 54% rename from Example/Biome/Images.xcassets/AppIcon.appiconset/Contents.json rename to BiomeDemo/BiomeDemo/Assets.xcassets/AppIcon.appiconset/Contents.json index d3942e9..36d2c80 100644 --- a/Example/Biome/Images.xcassets/AppIcon.appiconset/Contents.json +++ b/BiomeDemo/BiomeDemo/Assets.xcassets/AppIcon.appiconset/Contents.json @@ -29,10 +29,40 @@ "idiom" : "iphone", "size" : "60x60", "scale" : "3x" + }, + { + "idiom" : "ipad", + "size" : "29x29", + "scale" : "1x" + }, + { + "idiom" : "ipad", + "size" : "29x29", + "scale" : "2x" + }, + { + "idiom" : "ipad", + "size" : "40x40", + "scale" : "1x" + }, + { + "idiom" : "ipad", + "size" : "40x40", + "scale" : "2x" + }, + { + "idiom" : "ipad", + "size" : "76x76", + "scale" : "1x" + }, + { + "idiom" : "ipad", + "size" : "76x76", + "scale" : "2x" } ], "info" : { "version" : 1, "author" : "xcode" } -} +} \ No newline at end of file diff --git a/Example/Biome/Base.lproj/LaunchScreen.xib b/BiomeDemo/BiomeDemo/Base.lproj/LaunchScreen.xib similarity index 84% rename from Example/Biome/Base.lproj/LaunchScreen.xib rename to BiomeDemo/BiomeDemo/Base.lproj/LaunchScreen.xib index f4c11b8..102b219 100644 --- a/Example/Biome/Base.lproj/LaunchScreen.xib +++ b/BiomeDemo/BiomeDemo/Base.lproj/LaunchScreen.xib @@ -1,8 +1,13 @@ - - + + + + + - + + + @@ -24,7 +29,7 @@ - + diff --git a/BiomeDemo/BiomeDemo/Base.lproj/Main.storyboard b/BiomeDemo/BiomeDemo/Base.lproj/Main.storyboard new file mode 100644 index 0000000..b2de96c --- /dev/null +++ b/BiomeDemo/BiomeDemo/Base.lproj/Main.storyboard @@ -0,0 +1,118 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/BiomeDemo/BiomeDemo/Development.plist b/BiomeDemo/BiomeDemo/Development.plist new file mode 100644 index 0000000..9cf7d28 --- /dev/null +++ b/BiomeDemo/BiomeDemo/Development.plist @@ -0,0 +1,8 @@ + + + + + api_url + http://development.api.com + + diff --git a/BiomeDemo/BiomeDemo/Images.xcassets/AppIcon.appiconset/Contents.json b/BiomeDemo/BiomeDemo/Images.xcassets/AppIcon.appiconset/Contents.json new file mode 100644 index 0000000..577719e --- /dev/null +++ b/BiomeDemo/BiomeDemo/Images.xcassets/AppIcon.appiconset/Contents.json @@ -0,0 +1,128 @@ +{ + "images" : [ + { + "size" : "20x20", + "idiom" : "iphone", + "filename" : "Icon-App-20x20@2x.png", + "scale" : "2x" + }, + { + "size" : "20x20", + "idiom" : "iphone", + "filename" : "Icon-App-20x20@3x.png", + "scale" : "3x" + }, + { + "size" : "29x29", + "idiom" : "iphone", + "filename" : "Icon-App-29x29@1x.png", + "scale" : "1x" + }, + { + "size" : "29x29", + "idiom" : "iphone", + "filename" : "Icon-App-29x29@2x.png", + "scale" : "2x" + }, + { + "size" : "29x29", + "idiom" : "iphone", + "filename" : "Icon-App-29x29@3x.png", + "scale" : "3x" + }, + { + "size" : "40x40", + "idiom" : "iphone", + "filename" : "Icon-App-40x40@2x.png", + "scale" : "2x" + }, + { + "size" : "40x40", + "idiom" : "iphone", + "filename" : "Icon-App-40x40@3x.png", + "scale" : "3x" + }, + { + "size" : "57x57", + "idiom" : "iphone", + "filename" : "Icon-App-57x57@1x.png", + "scale" : "1x" + }, + { + "size" : "57x57", + "idiom" : "iphone", + "filename" : "Icon-App-57x57@2x.png", + "scale" : "2x" + }, + { + "size" : "60x60", + "idiom" : "iphone", + "filename" : "Icon-App-60x60@2x.png", + "scale" : "2x" + }, + { + "size" : "60x60", + "idiom" : "iphone", + "filename" : "Icon-App-60x60@3x.png", + "scale" : "3x" + }, + { + "size" : "20x20", + "idiom" : "ipad", + "filename" : "Icon-App-20x20@1x.png", + "scale" : "1x" + }, + { + "size" : "20x20", + "idiom" : "ipad", + "filename" : "Icon-App-20x20@2x.png", + "scale" : "2x" + }, + { + "size" : "29x29", + "idiom" : "ipad", + "filename" : "Icon-App-29x29@1x.png", + "scale" : "1x" + }, + { + "size" : "29x29", + "idiom" : "ipad", + "filename" : "Icon-App-29x29@2x.png", + "scale" : "2x" + }, + { + "size" : "40x40", + "idiom" : "ipad", + "filename" : "Icon-App-40x40@1x.png", + "scale" : "1x" + }, + { + "size" : "40x40", + "idiom" : "ipad", + "filename" : "Icon-App-40x40@2x.png", + "scale" : "2x" + }, + { + "size" : "76x76", + "idiom" : "ipad", + "filename" : "Icon-App-76x76@1x.png", + "scale" : "1x" + }, + { + "size" : "76x76", + "idiom" : "ipad", + "filename" : "Icon-App-76x76@2x.png", + "scale" : "2x" + }, + { + "size" : "83.5x83.5", + "idiom" : "ipad", + "filename" : "Icon-App-83.5x83.5@2x.png", + "scale" : "2x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/BiomeDemo/BiomeDemo/Images.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png b/BiomeDemo/BiomeDemo/Images.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png new file mode 100644 index 0000000000000000000000000000000000000000..e5206ae0231c3a10fd569e0bcdded02cec166198 GIT binary patch literal 787 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 N002ovPDHLkV1h?#oU{M{ literal 0 HcmV?d00001 diff --git a/BiomeDemo/BiomeDemo/Images.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png b/BiomeDemo/BiomeDemo/Images.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..1384364a917ef38fd56a8b8d6ab5697d75efe2ee GIT binary patch literal 4790 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 literal 0 HcmV?d00001 diff --git a/BiomeDemo/BiomeDemo/Images.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png b/BiomeDemo/BiomeDemo/Images.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png new file mode 100644 index 0000000000000000000000000000000000000000..5396423832f6624820e04014b5579ec6b3944a81 GIT binary patch literal 1791 zcmVB*D(&wlD|-qF7+PI>Ai3XaCT9-aB*eoz#8zeZO#-JI{H} z^L)=a&vVatj=%&>)2e|!;27{5poCurIpE(w9QaE*ot`rqgo)hmfWHFezYr-W{0N*& zr_(>c8o@Pkf0t6aeobZugb@D$exFXKe-LZS`d&);v(B6l0x9LDWvtHRcOIb6Om3|a zKy@^X6#jZV9zvlIwY9ZWRaN2h`2fgdGR)7`DwSe+d3nPFlv0)pA^JSPF*7Nf zk>tG#Aqa&+baZqOi9{4BCuA}i-n@Ck*w`4UR0=y^MP$c>rfFH$nXT2;)#$oTYip~m z(PEHNGC4U(EEZ#KZtmM1R*@4scI=Sf(h@=tjYc_p_ADhOKaJ(<*RLd#Nv5Wzn3SPY2zJ^$dM!J|EpK8 z7#J8(vsIWlc1~b*R(pDS*uQ_jl0A9ygjg(Al%Tt!qT+iY1jb`VG#aJ5yIXY_9314) zqetX&xjcRIZ=u|Ha=9F@U%w`s%@PiW5kk<=(7?jN0@Ksej(yz~6&2sxtPs`J)m*)L z6_3XQz~JB@@pv47#>Pet9XdpLc{%BH+OE4J-oJlOE|+81u3ZQr2#3Q=OiVb2ipMEX zbzP^Vqy#A?vba!`i;=~C6ve_&X6B8T$&c)+#YHMrRw{IUMB_-&(&dr-Q zZFOz8w)*;dT3cIz)r1%r7(hx%U0t0bC#B@xy?c)2ihb{-lne|Es99@mZKb}x-nOr+ z(2x*wR1<7wzrs zc)i}DdS)MH-^xxQ(;G~16f>LRQ~KvMwTQggcG@9JIR?dXDBNx1E8#|jMJx2 z7fl=|e?kar3>rxxr6dptIL3~qX}0kdiA3`DTPY<64jdpH4%^xZ1OiGglgU_Puy924 z^YhAhO-+qu#6k#m?%c`s>(}Y&>B*Bh%gV`F2sC4ePKgb<`sDJCZ;m6F%%#pSXdeC!Mwv14wRQu683 zC$3$)#?z-ynVp@@)0>=}R2APhlf-ypv6$M(?Hm@8EF@d_|L)zp%+1Xa4u@%IXi)NO zHmi>Pg@cn)7OzR7(J1H7pU;zhYZ=YRX0r?p4N+HDM`dLt3kwUhw6x%MyH&sY_wV!U z*|WTU=ENgw3Nd$%G7tCd|MktlvF+eq1I zPK5O&iE-LC>KX%5N>z3`l^n{y-Dk!Q=EB{)1cju{11oecgdm&Es=|Fe5SpfCrIhQs z`q;jGySn<=42-Lf+1c4V(slz`8+1-+n)VMVWwW`_fYU71*VpG=9yuimSTB#9$T$#8 z3Qg1g1pIL`Gvao;*LD52va+%n^8kPTzg=MduMk4~2z-}!1&l+T{3}3R0lNV{fByW> zii(PV0l$?}mi`)In18F9-9U0*Kpy)GG-gk+2CJ$|mZnK$#=iR?}GjI0nc z!nI{@$tZrG9*@uX=RMDOo#(-!^fc*dxoANk5Is^0fd>Alzb`c<@Qq_WE(d`abC3u% zL*LB3r$M@qCmq2fFc{t3Q+7ISFo!wGGG;a@FBD~#F_o9>__$TRv_Qxu)*34}+j=G} z?~tdz$o1Shwr&Ny_t?l|?3x6_Kb?;e`>M?=VK4S%SKirme6K)Nl)5EgAG#M)D{E(K z_b_+rN@c)?u$Z~ncM&*3h$mB{wz0GGNE&wsaf6b``Y94|^# zo7w2LtgfnqD|))*mrYj1*%<;7%}u&4Mo{N(IM$ePVwpg2x~0dUn=S7a0>uDKHG9K@ z1VV|DHzrxI-XulsdAE!XNr}=XY+TfXuA|Y88S(uu*_hNTNY8y5=Kd_Ixo-``b~}++ zlJa^Z-vtbYm`;-uLOT*;m}KZJ!|RxOZ!0wKiGgk${bn0!msH*U79;7mc2vtks*faflE4Mk(zYTxr?d8MV9 zbOj(fjS&w`X|;tm-2y>g;{QG(oV|fNH0CV$`IghLsiH z@yW@u8$1DzCyDOOa|p4vCKV76;Nao;ytKr7d37bNqQaB1$T2`GTCk4YxClXO-!SKO zK7YNoW@Bh*nA_S4@$>Urf=d>ytg*3avs07bm6OA=isEuoxWeCxkC6 zD@z-uq2}}5d>4r_FbF?CKTqf~Zx7@o5{a8TJD&h6ekd&Tx{xO5_K%MC)w~!&VK8s% z>gp0Wv$L{#?Q()%pPikh>4o=@#-t!_QIdUpNqiFt4Tft;PBW5|ZfCa!>d2~7i=ykN|hK#e=3*ou2Ar^ zKxQ^Jwvsr}0$`o6q4jQH>ib(6v1Mg2c$VI6FxcrcacnH?*J8*+;fNyBQ2)+XknQd5 z|Iz-pklbn^#l_7%HaExZ)#;BiG{gc&WiKu+E+Jm_;8M=Luq zVmLh0|K{h-V`5{Mr=Nwy&cyTGzwcLRdG~hyJwjq)c&ddz4Wv(OoPv}DqU6h@8PD@# zd$e#j^;vM(^v;X8Xi$~s7W(w(Pb*JPIesXlbf@^AZm;)aQJ0tgJ$-%R<0$P{hf8V@ zMQ`1AbRZy`wEp`Kd{EaPRMN{FyL)xe(HBNWb)DIQj5|N~{Wd)sQ6yWZFKYDR4aCL8g*Gc-zlo~8zJ8|qITcUPseakB4jx%qSq?5PwBeHZ zQg;L$;5w5U8=N(y)&#Z$XRsT|q?wbX`h7oiXyd0A04%@?-~XDPJMB0-o9FcG>`s*B-faC!-ZTF%BO}&}?LjNbEltAA zO=S%YU}a_H=3|aQ9uW!sawGeCjJ}c42Ycx-Rgh$AwCN*2Y4UWxo?QL${YCTvQX;p7 zVwl2Q()jBgL{w#284yWN8vY>)qV@H|0Ov%60sA!)UrM(bYFcn4p#y&(^__1O=A^a% zNJr$?M1!UB3JW#yIgO3*SEgJBEMihp#&9xTy%bZ#S0Yhj5YUUmE-GklTia9oOBE#I zvLP@}3J^T=24%cngda1VQ7Id6B3d$wN-!B2nQo9eb^GPExUUk=y!V{T=KlWc>76Gt zwij7a-#a@&lF!;>03pr|Twh=Ba;&!w3{=WjekzDIG3gf!-`{_U(qECN#rMHZWfZzn3!7;Wbu9BTU!oKMBeqQ zRmS{ulFvArb*fy>@>x*BU@(R~GRn%sfu{sKo>^|H_&Z$_3sP4X+iR`Q!IW9zbz|c5 zy!gwOC;!8TPy&H4)9mH+?F`$hbz)a-l8~0hfmRU2%{a>oSNpbEXe>wQF!;YfUok|I zIZaovtqTbWiHeFwy)nVIRvq(b149LcgrxgG%Mm>6Ki(ofy3Bp>J^uJ&i2ZRE3eaCW z1`Qzn_`DvyjT*DJv30by{nsM~KO4n{E5p>&Qcw&w93CGZSGlhbM&UH}@ZoL~#)*i~ z!_U%FUiFd?I>KR#Wf!UQLaXV$6uWFcO50jfW(9HAcOP8b?YG?B-4medI*Em{T(Kn* zs9_7an(b{zlX9ac@^#;xXX+db5GrdDkJEpln)#4xv-M72NTwX?N4RmYXYCM1m2+NM zhAn+lQ{4Rgd=(PmTb!5-j7&dK)fTI;Xd5gGi=YFSOuaEGCk9{b&9nz8?l-P7JT33F zu3oy>$f4rvazand{7bFo;!=KY5x4Nj7bMj%G}!WcDPL&Nk>0?-AT2EoRmWuIUj8}1 zj6FFmEy~!!k0Load8Xb8%)-JVXO@lP?e#7--Ab5hmT)ZF$K78bsH?;ac47>tXF zi4ld&?0Ki@3P-3(xce?gfO{-!Yip}r=HzW3kO1p6{#poNYky?*=kljXdtg)E(7+!i z^}h_zLaeCb8?H^4%ne6~762GvoA=kIR7e7~!P3nwLG0N_XM!U=ax^+Ry4qnv z_(N=ZI#*I^D%DoHuJG=BlR;+qzwT+nwyl@jr2vf)q(CMgojHxlF$Dy>drygi>S7up zArDEzLh~rKb#%fheT?W|*xKf`w_A9^8eHyjpp1=0RQ3e0mRDzcYNPh1*ms&A0lI6w zzT7dXwT*4`XRatWsV0@`_+4|Ji7DZxCjYv)SQ#CMtdEMQuo~aUq8GA#*D_>{&?eoJNrtVa0ULFFeY|?`MwZVC zQ0GGz4;UR+92^{GYV8<-5*hAk_&sLzFC*mT@jsCnA7>Pj%^2<<7+`jtcG~(_SGV;0 z;)IWe`YVz@3GM0WY3c24gpb?s+x=dv32}nQeIjF23RPGPWQ}H*7*_^QJRr|OFM0?8 z7__;$i4uC$1k;<9TffKOdwvcFw5E4osF&!o7z@x0_xtznwY0RDrt?E6fb{)KkEW)k z&9AW|BYH#E;sym4*6pp0aMz8>8m17#}uNal|WB#KBY zDM6;-rB~i5hYdsPEaB)!bz~~yDQ<4R&tE|vc#8HjI5i1JEFMG-t&a=F6lo!}WMyRX z?0@)sZbT!3uP^KXmyi#eO^lEC{PO?iX=Y}&eB|5BW9^w3b?OiBpSHGknp1y9>_PjL zUM8AE)zR^e_rZchd-u@)`c~C|0ilObWyEPpFfUVQlgCDtsRLI9-U`RFg0J1*f1((onLjJNbT~zp)^+2HW&`BCUwbw#06la;d3}A`7xtKp&gBN&ez%l+#+O$AVLC-Cp3xI7|tWTX5 zLXx$e`K5ycVLI058Y%XNs+8h223I8`+Mh3l>}dF+ zX+Xea3e^eo1TC0Nh`zH|3o-H*2(ZxzsE9nFSW}jTf1qb6qa zdz6`KomtlnJrdz1?)!t^%h`E1#6^Ct5EM*y=n6s$I6Q5T!4}horjqP>wh#xi?&OY> x7ND+t0Q5O}r3x3vYuR9etpTM*oF3f0X6!^)749PgdV!7|gw)VORH$42@BiUVt%?8u literal 0 HcmV?d00001 diff --git a/BiomeDemo/BiomeDemo/Images.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png b/BiomeDemo/BiomeDemo/Images.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..ba9095ac19293d7459f48217564d4405c678761d GIT binary patch literal 7591 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 oKV^kWbs01zV39tTW6I&4asPK~Z4^d)@ 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 oTR&@Cce(%n5M2q+RWbPocOlF}X04d3DW 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 b$6H{`y8bqKwS5Z?wn7wSRHZ8=O+Nk)x(^r< literal 0 HcmV?d00001 diff --git a/BiomeDemo/BiomeDemo/Images.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png b/BiomeDemo/BiomeDemo/Images.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png new file mode 100644 index 0000000000000000000000000000000000000000..c1839d468a077bbcf9db468177d7b1780cb8cf0e GIT binary patch literal 3923 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 literal 0 HcmV?d00001 diff --git a/BiomeDemo/BiomeDemo/Images.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png b/BiomeDemo/BiomeDemo/Images.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..581e701c1155e52d7ea8f2b73424e22ec2a8eb05 GIT binary patch literal 10772 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 literal 0 HcmV?d00001 diff --git a/BiomeDemo/BiomeDemo/Images.xcassets/logo.imageset/biome-2.png b/BiomeDemo/BiomeDemo/Images.xcassets/logo.imageset/biome-2.png new file mode 100644 index 0000000000000000000000000000000000000000..2351385d3c1fa9cd55d11b01dfe2ae65d38f245c GIT binary patch literal 26068 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 literal 0 HcmV?d00001 diff --git a/BiomeDemo/BiomeDemo/Images.xcassets/logo.imageset/biome.png b/BiomeDemo/BiomeDemo/Images.xcassets/logo.imageset/biome.png new file mode 100644 index 0000000000000000000000000000000000000000..2351385d3c1fa9cd55d11b01dfe2ae65d38f245c GIT binary patch literal 26068 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 literal 0 HcmV?d00001 diff --git a/Example/Biome/Info.plist b/BiomeDemo/BiomeDemo/Info.plist similarity index 100% rename from Example/Biome/Info.plist rename to BiomeDemo/BiomeDemo/Info.plist diff --git a/BiomeDemo/BiomeDemo/Production.plist b/BiomeDemo/BiomeDemo/Production.plist new file mode 100644 index 0000000..309b5ec --- /dev/null +++ b/BiomeDemo/BiomeDemo/Production.plist @@ -0,0 +1,8 @@ + + + + + api_url + http://production.api.com + + diff --git a/BiomeDemo/BiomeDemo/Staging.plist b/BiomeDemo/BiomeDemo/Staging.plist new file mode 100644 index 0000000..b7b7186 --- /dev/null +++ b/BiomeDemo/BiomeDemo/Staging.plist @@ -0,0 +1,8 @@ + + + + + api_url + http://staging.api.com + + diff --git a/BiomeDemo/BiomeDemo/ViewController.swift b/BiomeDemo/BiomeDemo/ViewController.swift new file mode 100644 index 0000000..5f2fedb --- /dev/null +++ b/BiomeDemo/BiomeDemo/ViewController.swift @@ -0,0 +1,47 @@ +// +// ViewController.swift +// Biome +// +// Created by ndizazzo on 03/01/2017. +// Copyright (c) 2017 ndizazzo. All rights reserved. +// + +import UIKit +import Biome + +class ViewController: UIViewController { + @IBOutlet weak var showBiomesButton: UIButton? + + @IBOutlet weak var apiURLLabel: UILabel? + + var dataSource: BiomeDataSource? + + override func viewDidLoad() { + super.viewDidLoad() + + self.showBiomesButton?.layer.cornerRadius = 3.0 + + let currentBiome = BiomeManager.shared.current + self.apiURLLabel?.text = currentBiome?.get("api_url") as? String + } + + @IBAction func showBiomes(_ sender: Any) { + self.dataSource = BiomeDataSource(biomeManager: BiomeManager.shared) + + BiomeManager.shared.delegate = self + + let tableViewController = UITableViewController(style: .plain) + tableViewController.tableView.delegate = self.dataSource + tableViewController.tableView.dataSource = self.dataSource + tableViewController.title = "Registered Biomes" + + self.navigationController?.pushViewController(tableViewController, animated: true) + } +} + +extension ViewController: BiomeManagerDelegate { + func switched(to biome: Biome?) { + self.apiURLLabel?.text = biome?.get("api_url") as? String + } +} + diff --git a/BiomeTests/BiomeManagerTests.swift b/BiomeTests/BiomeManagerTests.swift new file mode 100644 index 0000000..8683e5c --- /dev/null +++ b/BiomeTests/BiomeManagerTests.swift @@ -0,0 +1,94 @@ +import XCTest +import Biome + +class BiomeManagerTests: XCTestCase { + + var testBiome: Biome! + var biomeManager: BiomeManager! = BiomeManager.shared + + override func setUp() { + super.setUp() + + biomeManager.clear() + + self.testBiome = Biome(named: "test") + self.testBiome.set("testKey", value: "testValue") + } + + override func tearDown() { + super.tearDown() + } + + func testRegisterBiome() { + XCTAssertEqual(biomeManager.count, 0) + + try! BiomeManager.register(testBiome) + XCTAssertEqual(biomeManager.count, 1) + } + + func testRegisteringDuplicateBiome() { + XCTAssertEqual(biomeManager.count, 0) + + try! BiomeManager.register(testBiome) + XCTAssertEqual(biomeManager.count, 1) + + XCTAssertThrowsError( + try BiomeManager.register(testBiome), + "'register' didnt throw expected error", + { error in XCTAssertEqual(error as! BiomeError, .previouslyRegistered) } + ) + } + + func testRemoveBiome() { + try! BiomeManager.register(testBiome) + XCTAssertEqual(biomeManager.count, 1) + + try! BiomeManager.remove(testBiome) + XCTAssertEqual(biomeManager.count, 0) + } + + func testRemovingNonexistantBiome() { + XCTAssertThrowsError( + try BiomeManager.remove(testBiome), + "'remove' didnt throw expected error", + { error in XCTAssertEqual(error as! BiomeError, .notRegistered) } + ) + } + + func testClearingBiomes() { + try! BiomeManager.register(testBiome) + try! BiomeManager.register(Biome(named: "another one")) + XCTAssertEqual(biomeManager.count, 2) + + biomeManager.clear() + + XCTAssertEqual(biomeManager.count, 0) + XCTAssertEqual(biomeManager.current, nil) + } + + func testGatheringKeysAcrossBiomes() { + let firstBiome = Biome(named: "first") + let secondBiome = Biome(named: "second") + + firstBiome.set("firstKey", value: 1) + secondBiome.set("secondKey", value: 2) + + try! BiomeManager.register(firstBiome) + try! BiomeManager.register(secondBiome) + + XCTAssertEqual(BiomeManager.shared.count, 2) + XCTAssertEqual(BiomeManager.shared.keys.count, 2) + XCTAssertEqual(Array(BiomeManager.shared.keys), ["firstKey", "secondKey"]) + } + + func testCurrentBiomeIsSetWhenRegistering() { + try! BiomeManager.register(testBiome) + XCTAssertEqual(biomeManager.current, testBiome) + } + + func testCurrentBiomeRemainsSetWhenRegistering() { + try! BiomeManager.register(testBiome) + try! BiomeManager.register(Biome(named: "second biome")) + XCTAssertEqual(biomeManager.current, testBiome) + } +} diff --git a/BiomeTests/BiomeTests.swift b/BiomeTests/BiomeTests.swift new file mode 100644 index 0000000..aaf5259 --- /dev/null +++ b/BiomeTests/BiomeTests.swift @@ -0,0 +1,59 @@ +import XCTest +import Biome + +final class TestBiomeProvider: BiomeProvider { + var biomeName: String = "testBiome1" + + func mappedPropertyDictionary() -> [String : Any] { + return ["testProviderValue": 1] + } +} + +class BiomeTests: XCTestCase { + var testBiome: Biome! + + override func setUp() { + super.setUp() + + self.testBiome = Biome(named: "test") + self.testBiome.set("testKey", value: "testValue") + } + + override func tearDown() { + super.tearDown() + } + + func testBiomeName() { + XCTAssert(testBiome.name == "test") + } + + func testBiomeCount() { + XCTAssertEqual(self.testBiome.count, 1) + } + + func testGettingBiomeValue() { + try! BiomeManager.register(testBiome) + let testValue = testBiome.get("testKey") as! String + XCTAssertEqual(testValue, "testValue") + } + + func testBiomeEquality() { + let first = Biome(named: "first") + let second = Biome(named: "second") + let duplicate = Biome(named: "first") + + XCTAssertEqual(first, duplicate) + XCTAssertEqual(first, first) + XCTAssertNotEqual(first, second) + } + + func testBiomeWithProvider() { + let biome = Biome(with: TestBiomeProvider()) + XCTAssertEqual(biome.name, "testBiome1") + XCTAssertEqual(biome.count, 1) + + let value = biome.get("testProviderValue") as! Int + XCTAssertEqual(value, 1) + } + +} diff --git a/Example/Tests/Info.plist b/BiomeTests/Info.plist similarity index 100% rename from Example/Tests/Info.plist rename to BiomeTests/Info.plist diff --git a/BiomeTests/PlistBiomeProviderTests.swift b/BiomeTests/PlistBiomeProviderTests.swift new file mode 100644 index 0000000..9e8be54 --- /dev/null +++ b/BiomeTests/PlistBiomeProviderTests.swift @@ -0,0 +1,46 @@ +import XCTest +import Biome + +class PlistBiomeTests: XCTestCase { + + var provider: PlistBiomeProvider! + + override func setUp() { + super.setUp() + + BiomeManager.shared.clear() + self.provider = PlistBiomeProvider(bundle: Bundle(for: BiomeTests.self), filename: "testProperties") + } + + override func tearDown() { + super.tearDown() + } + + func testProviderProperlyProvidesName() { + XCTAssertEqual(self.provider.biomeName, "testProperties") + } + + func testProviderMapsPlistProperties() { + let dict = self.provider.mappedPropertyDictionary() + + XCTAssertEqual(dict.count, 4) + + if let first = dict["test_item_1"] as? String, + let second = dict["test_item_2"] as? Int, + let third = dict["test_item_3"] as? Date, + let fourth = dict["test_item_4"] as? Bool { + XCTAssertEqual(first, "item1") + XCTAssertEqual(second, 0) + XCTAssertEqual(third, Date(timeIntervalSince1970: 1488337200)) + XCTAssertEqual(fourth, false) + } else { + XCTFail("One or more properties were not converted properly") + } + } + + func testProviderReturnsEmptyDictionary() { + let provider = PlistBiomeProvider(bundle: Bundle.main, filename: "doesnt_exist") + let dict = provider.mappedPropertyDictionary() + XCTAssert(dict.isEmpty) + } +} diff --git a/BiomeTests/testProperties.plist b/BiomeTests/testProperties.plist new file mode 100644 index 0000000..fb41657 --- /dev/null +++ b/BiomeTests/testProperties.plist @@ -0,0 +1,14 @@ + + + + + test_item_1 + item1 + test_item_2 + 0 + test_item_3 + 2017-03-01T03:00:00Z + test_item_4 + + + diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md new file mode 100644 index 0000000..088292c --- /dev/null +++ b/CONTRIBUTING.md @@ -0,0 +1 @@ +aosndia diff --git a/Carthage.xcconfig b/Carthage.xcconfig new file mode 100644 index 0000000..ba72009 --- /dev/null +++ b/Carthage.xcconfig @@ -0,0 +1,14 @@ +// +// Biome.xcconfig +// Biome +// +// Copyright 2017 Nick DiZazzo +// Simple environment management for iOS / tvOS / watchOS / macOS +// +// https://github.com/ndizazzo/Biome +// + +FRAMEWORK_SEARCH_PATHS[sdk=macosx*] = $(SRCROOT)/Carthage/Build/Mac/ $(inherited) +FRAMEWORK_SEARCH_PATHS[sdk=iphone*] = $(SRCROOT)/Carthage/Build/iOS/ $(inherited) +FRAMEWORK_SEARCH_PATHS[sdk=watch*] = $(SRCROOT)/Carthage/Build/watchOS/ $(inherited) +FRAMEWORK_SEARCH_PATHS[sdk=appletv*] = $(SRCROOT)/Carthage/Build/tvOS/ $(inherited) diff --git a/Example/Biome.xcodeproj/project.pbxproj b/Example/Biome.xcodeproj/project.pbxproj deleted file mode 100644 index 63f3923..0000000 --- a/Example/Biome.xcodeproj/project.pbxproj +++ /dev/null @@ -1,591 +0,0 @@ -// !$*UTF8*$! -{ - archiveVersion = 1; - classes = { - }; - objectVersion = 46; - objects = { - -/* Begin PBXBuildFile section */ - 160D6C99ACB467D862F69AA0 /* Pods_Biome_Tests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 40987F739DAFAC4E3AFCD1E7 /* Pods_Biome_Tests.framework */; }; - 607FACD61AFB9204008FA782 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 607FACD51AFB9204008FA782 /* AppDelegate.swift */; }; - 607FACD81AFB9204008FA782 /* ViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 607FACD71AFB9204008FA782 /* ViewController.swift */; }; - 607FACDB1AFB9204008FA782 /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 607FACD91AFB9204008FA782 /* Main.storyboard */; }; - 607FACDD1AFB9204008FA782 /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 607FACDC1AFB9204008FA782 /* Images.xcassets */; }; - 607FACE01AFB9204008FA782 /* LaunchScreen.xib in Resources */ = {isa = PBXBuildFile; fileRef = 607FACDE1AFB9204008FA782 /* LaunchScreen.xib */; }; - 607FACEC1AFB9204008FA782 /* Tests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 607FACEB1AFB9204008FA782 /* Tests.swift */; }; - A274BC7EF901CCB9EACAB7D5 /* Pods_Biome_Example.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 68277A81DE59560A060864B5 /* Pods_Biome_Example.framework */; }; -/* End PBXBuildFile section */ - -/* Begin PBXContainerItemProxy section */ - 607FACE61AFB9204008FA782 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 607FACC81AFB9204008FA782 /* Project object */; - proxyType = 1; - remoteGlobalIDString = 607FACCF1AFB9204008FA782; - remoteInfo = Biome; - }; -/* End PBXContainerItemProxy section */ - -/* Begin PBXFileReference section */ - 123F1145991820198CF3FD54 /* README.md */ = {isa = PBXFileReference; includeInIndex = 1; name = README.md; path = ../README.md; sourceTree = ""; }; - 40987F739DAFAC4E3AFCD1E7 /* Pods_Biome_Tests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Biome_Tests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - 607FACD01AFB9204008FA782 /* Biome_Example.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Biome_Example.app; sourceTree = BUILT_PRODUCTS_DIR; }; - 607FACD41AFB9204008FA782 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - 607FACD51AFB9204008FA782 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; - 607FACD71AFB9204008FA782 /* ViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ViewController.swift; sourceTree = ""; }; - 607FACDA1AFB9204008FA782 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; - 607FACDC1AFB9204008FA782 /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Images.xcassets; sourceTree = ""; }; - 607FACDF1AFB9204008FA782 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/LaunchScreen.xib; sourceTree = ""; }; - 607FACE51AFB9204008FA782 /* Biome_Tests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = Biome_Tests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; - 607FACEA1AFB9204008FA782 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - 607FACEB1AFB9204008FA782 /* Tests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Tests.swift; sourceTree = ""; }; - 68277A81DE59560A060864B5 /* Pods_Biome_Example.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Biome_Example.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - 8EDA48D0C57AA2D938A969AB /* LICENSE */ = {isa = PBXFileReference; includeInIndex = 1; name = LICENSE; path = ../LICENSE; sourceTree = ""; }; - 9E36663531A1101350B98B3F /* Pods-Biome_Example.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Biome_Example.debug.xcconfig"; path = "Pods/Target Support Files/Pods-Biome_Example/Pods-Biome_Example.debug.xcconfig"; sourceTree = ""; }; - B791235A4D5D0513621E0525 /* Pods-Biome_Example.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Biome_Example.release.xcconfig"; path = "Pods/Target Support Files/Pods-Biome_Example/Pods-Biome_Example.release.xcconfig"; sourceTree = ""; }; - CD551544C9CF793F826D6135 /* Pods-Biome_Tests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Biome_Tests.release.xcconfig"; path = "Pods/Target Support Files/Pods-Biome_Tests/Pods-Biome_Tests.release.xcconfig"; sourceTree = ""; }; - E836313710B95F5DF4152EE1 /* Pods-Biome_Tests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Biome_Tests.debug.xcconfig"; path = "Pods/Target Support Files/Pods-Biome_Tests/Pods-Biome_Tests.debug.xcconfig"; sourceTree = ""; }; - FAC44176C68790DF210D40AF /* Biome.podspec */ = {isa = PBXFileReference; includeInIndex = 1; name = Biome.podspec; path = ../Biome.podspec; sourceTree = ""; }; -/* End PBXFileReference section */ - -/* Begin PBXFrameworksBuildPhase section */ - 607FACCD1AFB9204008FA782 /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - A274BC7EF901CCB9EACAB7D5 /* Pods_Biome_Example.framework in Frameworks */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 607FACE21AFB9204008FA782 /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - 160D6C99ACB467D862F69AA0 /* Pods_Biome_Tests.framework in Frameworks */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXFrameworksBuildPhase section */ - -/* Begin PBXGroup section */ - 3922357F8B370D52F423FD23 /* Pods */ = { - isa = PBXGroup; - children = ( - 9E36663531A1101350B98B3F /* Pods-Biome_Example.debug.xcconfig */, - B791235A4D5D0513621E0525 /* Pods-Biome_Example.release.xcconfig */, - E836313710B95F5DF4152EE1 /* Pods-Biome_Tests.debug.xcconfig */, - CD551544C9CF793F826D6135 /* Pods-Biome_Tests.release.xcconfig */, - ); - name = Pods; - sourceTree = ""; - }; - 529140C1A39F3BC16288FCCF /* Frameworks */ = { - isa = PBXGroup; - children = ( - 68277A81DE59560A060864B5 /* Pods_Biome_Example.framework */, - 40987F739DAFAC4E3AFCD1E7 /* Pods_Biome_Tests.framework */, - ); - name = Frameworks; - sourceTree = ""; - }; - 607FACC71AFB9204008FA782 = { - isa = PBXGroup; - children = ( - 607FACF51AFB993E008FA782 /* Podspec Metadata */, - 607FACD21AFB9204008FA782 /* Example for Biome */, - 607FACE81AFB9204008FA782 /* Tests */, - 607FACD11AFB9204008FA782 /* Products */, - 3922357F8B370D52F423FD23 /* Pods */, - 529140C1A39F3BC16288FCCF /* Frameworks */, - ); - sourceTree = ""; - }; - 607FACD11AFB9204008FA782 /* Products */ = { - isa = PBXGroup; - children = ( - 607FACD01AFB9204008FA782 /* Biome_Example.app */, - 607FACE51AFB9204008FA782 /* Biome_Tests.xctest */, - ); - name = Products; - sourceTree = ""; - }; - 607FACD21AFB9204008FA782 /* Example for Biome */ = { - isa = PBXGroup; - children = ( - 607FACD51AFB9204008FA782 /* AppDelegate.swift */, - 607FACD71AFB9204008FA782 /* ViewController.swift */, - 607FACD91AFB9204008FA782 /* Main.storyboard */, - 607FACDC1AFB9204008FA782 /* Images.xcassets */, - 607FACDE1AFB9204008FA782 /* LaunchScreen.xib */, - 607FACD31AFB9204008FA782 /* Supporting Files */, - ); - name = "Example for Biome"; - path = Biome; - sourceTree = ""; - }; - 607FACD31AFB9204008FA782 /* Supporting Files */ = { - isa = PBXGroup; - children = ( - 607FACD41AFB9204008FA782 /* Info.plist */, - ); - name = "Supporting Files"; - sourceTree = ""; - }; - 607FACE81AFB9204008FA782 /* Tests */ = { - isa = PBXGroup; - children = ( - 607FACEB1AFB9204008FA782 /* Tests.swift */, - 607FACE91AFB9204008FA782 /* Supporting Files */, - ); - path = Tests; - sourceTree = ""; - }; - 607FACE91AFB9204008FA782 /* Supporting Files */ = { - isa = PBXGroup; - children = ( - 607FACEA1AFB9204008FA782 /* Info.plist */, - ); - name = "Supporting Files"; - sourceTree = ""; - }; - 607FACF51AFB993E008FA782 /* Podspec Metadata */ = { - isa = PBXGroup; - children = ( - FAC44176C68790DF210D40AF /* Biome.podspec */, - 123F1145991820198CF3FD54 /* README.md */, - 8EDA48D0C57AA2D938A969AB /* LICENSE */, - ); - name = "Podspec Metadata"; - sourceTree = ""; - }; -/* End PBXGroup section */ - -/* Begin PBXNativeTarget section */ - 607FACCF1AFB9204008FA782 /* Biome_Example */ = { - isa = PBXNativeTarget; - buildConfigurationList = 607FACEF1AFB9204008FA782 /* Build configuration list for PBXNativeTarget "Biome_Example" */; - buildPhases = ( - 84C35381466C4448F7C0CCD5 /* [CP] Check Pods Manifest.lock */, - 607FACCC1AFB9204008FA782 /* Sources */, - 607FACCD1AFB9204008FA782 /* Frameworks */, - 607FACCE1AFB9204008FA782 /* Resources */, - 537BB4FA245B9BB8B9D2F734 /* [CP] Embed Pods Frameworks */, - DD80C0D3D9F5727F91BD3588 /* [CP] Copy Pods Resources */, - ); - buildRules = ( - ); - dependencies = ( - ); - name = Biome_Example; - productName = Biome; - productReference = 607FACD01AFB9204008FA782 /* Biome_Example.app */; - productType = "com.apple.product-type.application"; - }; - 607FACE41AFB9204008FA782 /* Biome_Tests */ = { - isa = PBXNativeTarget; - buildConfigurationList = 607FACF21AFB9204008FA782 /* Build configuration list for PBXNativeTarget "Biome_Tests" */; - buildPhases = ( - 620FAAA4C3C61141183DCC93 /* [CP] Check Pods Manifest.lock */, - 607FACE11AFB9204008FA782 /* Sources */, - 607FACE21AFB9204008FA782 /* Frameworks */, - 607FACE31AFB9204008FA782 /* Resources */, - 44B3BB3CF6DF85D9F2A2BAEB /* [CP] Embed Pods Frameworks */, - 8ED466B773FE7845B6D53CF3 /* [CP] Copy Pods Resources */, - ); - buildRules = ( - ); - dependencies = ( - 607FACE71AFB9204008FA782 /* PBXTargetDependency */, - ); - name = Biome_Tests; - productName = Tests; - productReference = 607FACE51AFB9204008FA782 /* Biome_Tests.xctest */; - productType = "com.apple.product-type.bundle.unit-test"; - }; -/* End PBXNativeTarget section */ - -/* Begin PBXProject section */ - 607FACC81AFB9204008FA782 /* Project object */ = { - isa = PBXProject; - attributes = { - LastSwiftUpdateCheck = 0720; - LastUpgradeCheck = 0820; - ORGANIZATIONNAME = CocoaPods; - TargetAttributes = { - 607FACCF1AFB9204008FA782 = { - CreatedOnToolsVersion = 6.3.1; - LastSwiftMigration = 0820; - }; - 607FACE41AFB9204008FA782 = { - CreatedOnToolsVersion = 6.3.1; - LastSwiftMigration = 0820; - TestTargetID = 607FACCF1AFB9204008FA782; - }; - }; - }; - buildConfigurationList = 607FACCB1AFB9204008FA782 /* Build configuration list for PBXProject "Biome" */; - compatibilityVersion = "Xcode 3.2"; - developmentRegion = English; - hasScannedForEncodings = 0; - knownRegions = ( - en, - Base, - ); - mainGroup = 607FACC71AFB9204008FA782; - productRefGroup = 607FACD11AFB9204008FA782 /* Products */; - projectDirPath = ""; - projectRoot = ""; - targets = ( - 607FACCF1AFB9204008FA782 /* Biome_Example */, - 607FACE41AFB9204008FA782 /* Biome_Tests */, - ); - }; -/* End PBXProject section */ - -/* Begin PBXResourcesBuildPhase section */ - 607FACCE1AFB9204008FA782 /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 607FACDB1AFB9204008FA782 /* Main.storyboard in Resources */, - 607FACE01AFB9204008FA782 /* LaunchScreen.xib in Resources */, - 607FACDD1AFB9204008FA782 /* Images.xcassets in Resources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 607FACE31AFB9204008FA782 /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXResourcesBuildPhase section */ - -/* Begin PBXShellScriptBuildPhase section */ - 44B3BB3CF6DF85D9F2A2BAEB /* [CP] Embed Pods Frameworks */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputPaths = ( - ); - name = "[CP] Embed Pods Frameworks"; - outputPaths = ( - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "\"${SRCROOT}/Pods/Target Support Files/Pods-Biome_Tests/Pods-Biome_Tests-frameworks.sh\"\n"; - showEnvVarsInLog = 0; - }; - 537BB4FA245B9BB8B9D2F734 /* [CP] Embed Pods Frameworks */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputPaths = ( - ); - name = "[CP] Embed Pods Frameworks"; - outputPaths = ( - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "\"${SRCROOT}/Pods/Target Support Files/Pods-Biome_Example/Pods-Biome_Example-frameworks.sh\"\n"; - showEnvVarsInLog = 0; - }; - 620FAAA4C3C61141183DCC93 /* [CP] Check Pods Manifest.lock */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputPaths = ( - ); - name = "[CP] Check Pods Manifest.lock"; - outputPaths = ( - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "diff \"${PODS_ROOT}/../Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n"; - showEnvVarsInLog = 0; - }; - 84C35381466C4448F7C0CCD5 /* [CP] Check Pods Manifest.lock */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputPaths = ( - ); - name = "[CP] Check Pods Manifest.lock"; - outputPaths = ( - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "diff \"${PODS_ROOT}/../Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n"; - showEnvVarsInLog = 0; - }; - 8ED466B773FE7845B6D53CF3 /* [CP] Copy Pods Resources */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputPaths = ( - ); - name = "[CP] Copy Pods Resources"; - outputPaths = ( - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "\"${SRCROOT}/Pods/Target Support Files/Pods-Biome_Tests/Pods-Biome_Tests-resources.sh\"\n"; - showEnvVarsInLog = 0; - }; - DD80C0D3D9F5727F91BD3588 /* [CP] Copy Pods Resources */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputPaths = ( - ); - name = "[CP] Copy Pods Resources"; - outputPaths = ( - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "\"${SRCROOT}/Pods/Target Support Files/Pods-Biome_Example/Pods-Biome_Example-resources.sh\"\n"; - showEnvVarsInLog = 0; - }; -/* End PBXShellScriptBuildPhase section */ - -/* Begin PBXSourcesBuildPhase section */ - 607FACCC1AFB9204008FA782 /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 607FACD81AFB9204008FA782 /* ViewController.swift in Sources */, - 607FACD61AFB9204008FA782 /* AppDelegate.swift in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 607FACE11AFB9204008FA782 /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 607FACEC1AFB9204008FA782 /* Tests.swift in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXSourcesBuildPhase section */ - -/* Begin PBXTargetDependency section */ - 607FACE71AFB9204008FA782 /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - target = 607FACCF1AFB9204008FA782 /* Biome_Example */; - targetProxy = 607FACE61AFB9204008FA782 /* PBXContainerItemProxy */; - }; -/* End PBXTargetDependency section */ - -/* Begin PBXVariantGroup section */ - 607FACD91AFB9204008FA782 /* Main.storyboard */ = { - isa = PBXVariantGroup; - children = ( - 607FACDA1AFB9204008FA782 /* Base */, - ); - name = Main.storyboard; - sourceTree = ""; - }; - 607FACDE1AFB9204008FA782 /* LaunchScreen.xib */ = { - isa = PBXVariantGroup; - children = ( - 607FACDF1AFB9204008FA782 /* Base */, - ); - name = LaunchScreen.xib; - sourceTree = ""; - }; -/* End PBXVariantGroup section */ - -/* Begin XCBuildConfiguration section */ - 607FACED1AFB9204008FA782 /* 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_INFINITE_RECURSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; - CLANG_WARN_SUSPICIOUS_MOVE = YES; - CLANG_WARN_UNREACHABLE_CODE = YES; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; - COPY_PHASE_STRIP = NO; - DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; - ENABLE_STRICT_OBJC_MSGSEND = YES; - ENABLE_TESTABILITY = YES; - GCC_C_LANGUAGE_STANDARD = gnu99; - GCC_DYNAMIC_NO_PIC = NO; - GCC_NO_COMMON_BLOCKS = YES; - 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.3; - MTL_ENABLE_DEBUG_INFO = YES; - ONLY_ACTIVE_ARCH = YES; - SDKROOT = iphoneos; - SWIFT_OPTIMIZATION_LEVEL = "-Onone"; - }; - name = Debug; - }; - 607FACEE1AFB9204008FA782 /* 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_INFINITE_RECURSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; - CLANG_WARN_SUSPICIOUS_MOVE = YES; - CLANG_WARN_UNREACHABLE_CODE = YES; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; - COPY_PHASE_STRIP = NO; - DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; - ENABLE_NS_ASSERTIONS = NO; - ENABLE_STRICT_OBJC_MSGSEND = YES; - GCC_C_LANGUAGE_STANDARD = gnu99; - GCC_NO_COMMON_BLOCKS = YES; - 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.3; - MTL_ENABLE_DEBUG_INFO = NO; - SDKROOT = iphoneos; - SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; - VALIDATE_PRODUCT = YES; - }; - name = Release; - }; - 607FACF01AFB9204008FA782 /* Debug */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 9E36663531A1101350B98B3F /* Pods-Biome_Example.debug.xcconfig */; - buildSettings = { - ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; - INFOPLIST_FILE = Biome/Info.plist; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; - MODULE_NAME = ExampleApp; - PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.demo.$(PRODUCT_NAME:rfc1034identifier)"; - PRODUCT_NAME = "$(TARGET_NAME)"; - SWIFT_VERSION = 3.0; - }; - name = Debug; - }; - 607FACF11AFB9204008FA782 /* Release */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = B791235A4D5D0513621E0525 /* Pods-Biome_Example.release.xcconfig */; - buildSettings = { - ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; - INFOPLIST_FILE = Biome/Info.plist; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; - MODULE_NAME = ExampleApp; - PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.demo.$(PRODUCT_NAME:rfc1034identifier)"; - PRODUCT_NAME = "$(TARGET_NAME)"; - SWIFT_VERSION = 3.0; - }; - name = Release; - }; - 607FACF31AFB9204008FA782 /* Debug */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = E836313710B95F5DF4152EE1 /* Pods-Biome_Tests.debug.xcconfig */; - buildSettings = { - FRAMEWORK_SEARCH_PATHS = ( - "$(SDKROOT)/Developer/Library/Frameworks", - "$(inherited)", - ); - GCC_PREPROCESSOR_DEFINITIONS = ( - "DEBUG=1", - "$(inherited)", - ); - INFOPLIST_FILE = Tests/Info.plist; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; - PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.$(PRODUCT_NAME:rfc1034identifier)"; - PRODUCT_NAME = "$(TARGET_NAME)"; - SWIFT_VERSION = 3.0; - }; - name = Debug; - }; - 607FACF41AFB9204008FA782 /* Release */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = CD551544C9CF793F826D6135 /* Pods-Biome_Tests.release.xcconfig */; - buildSettings = { - FRAMEWORK_SEARCH_PATHS = ( - "$(SDKROOT)/Developer/Library/Frameworks", - "$(inherited)", - ); - INFOPLIST_FILE = Tests/Info.plist; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; - PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.$(PRODUCT_NAME:rfc1034identifier)"; - PRODUCT_NAME = "$(TARGET_NAME)"; - SWIFT_VERSION = 3.0; - }; - name = Release; - }; -/* End XCBuildConfiguration section */ - -/* Begin XCConfigurationList section */ - 607FACCB1AFB9204008FA782 /* Build configuration list for PBXProject "Biome" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 607FACED1AFB9204008FA782 /* Debug */, - 607FACEE1AFB9204008FA782 /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - 607FACEF1AFB9204008FA782 /* Build configuration list for PBXNativeTarget "Biome_Example" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 607FACF01AFB9204008FA782 /* Debug */, - 607FACF11AFB9204008FA782 /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - 607FACF21AFB9204008FA782 /* Build configuration list for PBXNativeTarget "Biome_Tests" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 607FACF31AFB9204008FA782 /* Debug */, - 607FACF41AFB9204008FA782 /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; -/* End XCConfigurationList section */ - }; - rootObject = 607FACC81AFB9204008FA782 /* Project object */; -} diff --git a/Example/Biome/AppDelegate.swift b/Example/Biome/AppDelegate.swift deleted file mode 100644 index 561577a..0000000 --- a/Example/Biome/AppDelegate.swift +++ /dev/null @@ -1,46 +0,0 @@ -// -// AppDelegate.swift -// Biome -// -// Created by ndizazzo on 03/01/2017. -// Copyright (c) 2017 ndizazzo. All rights reserved. -// - -import UIKit - -@UIApplicationMain -class AppDelegate: UIResponder, UIApplicationDelegate { - - var window: UIWindow? - - - func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool { - // Override point for customization after application launch. - 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:. - } - - -} - diff --git a/Example/Biome/Base.lproj/Main.storyboard b/Example/Biome/Base.lproj/Main.storyboard deleted file mode 100644 index 52ea29e..0000000 --- a/Example/Biome/Base.lproj/Main.storyboard +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Example/Biome/ViewController.swift b/Example/Biome/ViewController.swift deleted file mode 100644 index 87fa3de..0000000 --- a/Example/Biome/ViewController.swift +++ /dev/null @@ -1,24 +0,0 @@ -// -// ViewController.swift -// Biome -// -// Created by ndizazzo on 03/01/2017. -// Copyright (c) 2017 ndizazzo. All rights reserved. -// - -import UIKit - -class ViewController: UIViewController { - - override func viewDidLoad() { - super.viewDidLoad() - // Do any additional setup after loading the view, typically from a nib. - } - - override func didReceiveMemoryWarning() { - super.didReceiveMemoryWarning() - // Dispose of any resources that can be recreated. - } - -} - diff --git a/Example/Podfile b/Example/Podfile deleted file mode 100644 index 2930ba4..0000000 --- a/Example/Podfile +++ /dev/null @@ -1,11 +0,0 @@ -use_frameworks! - -target 'Biome_Example' do - pod 'Biome', :path => '../' - - target 'Biome_Tests' do - inherit! :search_paths - - - end -end diff --git a/Example/Tests/Tests.swift b/Example/Tests/Tests.swift deleted file mode 100644 index 5c47535..0000000 --- a/Example/Tests/Tests.swift +++ /dev/null @@ -1,29 +0,0 @@ -import UIKit -import XCTest -import Biome - -class Tests: XCTestCase { - - override func setUp() { - super.setUp() - // Put setup code here. This method is called before the invocation of each test method in the class. - } - - override func tearDown() { - // Put teardown code here. This method is called after the invocation of each test method in the class. - super.tearDown() - } - - func testExample() { - // This is an example of a functional test case. - XCTAssert(true, "Pass") - } - - func testPerformanceExample() { - // This is an example of a performance test case. - self.measure() { - // Put the code you want to measure the time of here. - } - } - -} diff --git a/Images/biome.png b/Images/biome.png new file mode 100644 index 0000000000000000000000000000000000000000..2351385d3c1fa9cd55d11b01dfe2ae65d38f245c GIT binary patch literal 26068 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 literal 0 HcmV?d00001 diff --git a/LICENSE b/LICENSE index 09a2ac3..f4e6a07 100644 --- a/LICENSE +++ b/LICENSE @@ -1,4 +1,4 @@ -Copyright (c) 2017 ndizazzo +Copyright (c) 2017 ndizazzo Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal diff --git a/README.md b/README.md index 72a3165..bcf10f6 100644 --- a/README.md +++ b/README.md @@ -1,29 +1,195 @@ -# Biome + -[![CI Status](http://img.shields.io/travis/ndizazzo/Biome.svg?style=flat)](https://travis-ci.org/ndizazzo/Biome) +## Current Status [![Version](https://img.shields.io/cocoapods/v/Biome.svg?style=flat)](http://cocoapods.org/pods/Biome) +[![Downloads](https://img.shields.io/github/downloads/biome/biome/total.svg)](http://cocoapods.org/pods/Biome) +![Supported Platforms](https://img.shields.io/cocoapods/p/Biome.svg) +[![CI Status](http://img.shields.io/travis/ndizazzo/Biome.svg?style=flat)](https://travis-ci.org/ndizazzo/Biome) [![License](https://img.shields.io/cocoapods/l/Biome.svg?style=flat)](http://cocoapods.org/pods/Biome) [![Platform](https://img.shields.io/cocoapods/p/Biome.svg?style=flat)](http://cocoapods.org/pods/Biome) -## Example +## What is Biome? + +Biome is a simple way to manage sets of variables between environments you might need to work with when developing your application. + +One problem developers face, is the need to create multiple builds in order to test how their application functions in different environments. Biome aims to reduce the amount of re-building that needs to occur, by providing a mechanism to switch configurations during run-time. + +## Bio-me? Bi-om-ee? + +Nope. Bi-ohm. + +## What *is* a Biome? + +By definition: + +_noun_ `ECOLOGY` + +> A biome /ˈbaɪoʊm/ is a formation of plants and animals that have common characteristics due to similar climates and can be found over a range of continents. + +Applied for our purposes: + +> A biome is a collection of variables and settings that have common characteristics due to similar environments and can be found across a range of applications. + +## Concept + +### Biome + +The smallest conceptual unit - this object holds simple key / value pairs that define an environment. + +### BiomeProvider -To run the example project, clone the repo, and run `pod install` from the Example directory first. +A protocol that allows mappings from various types of data sets into Biome objects. Conformance to this protocol implies that Biomes will be able to be created from a given provider. -## Requirements +### BiomeManager -## Installation +A centralized place to manage many Biomes. -Biome is available through [CocoaPods](http://cocoapods.org). To install -it, simply add the following line to your Podfile: +## Support +* Xcode 8.0 / Swift 3.0 +* iOS >= 8.0 (Use as an **Embedded** Framework) +* tvOS >= 9.0 +* macOS >= 10.10 (untested, but should still work in theory) + +## Having trouble running the demo? + +* `BiomeDemo/BiomeDemo.xcodeproj` is the demo project for iOS +* Make sure you are running a supported version of Xcode. +* Make sure that your project supports Swift 3.0 + +# Installation + +## Manual Installation + +In order to correctly compile the project: + +1. Drag the `Biome.xcodeproj` to your project +2. Go to your target's settings, hit the "+" under the "Embedded Binaries" section, and select the Biome.framework +3. `@import Biome` +4. When using Swift in an ObjC project: + - You need to import your Bridging Header. Usually it is "*YourProject-Swift.h*". + - (Xcode 8.1 and earlier) Under "Build Options", mark "Embedded Content Contains Swift Code" + - (Xcode 8.2+) Under "Build Options", mark "Always Embed Swift Standard Libraries" + +## CocoaPods Install + +Add the following to your Podfile: -```ruby -pod "Biome" ``` +pod 'Biome' +``` + +and run `pod install` + +## Carthage Install + +Biome includes Carthage prebuilt binaries. + +```carthage +github "ndizazzo/Biome" == 1.0.0 +github "ndizazzo/Biome" ~> 1.0.0 +``` + +In order to build the binaries for a new release, use `carthage build --no-skip-current && carthage archive Biome`. + +# Usage + +## Implementing Biome in your Project +To implement Biome, first `import Biome` into the relevant files where you want to use it. + +Then, create a Biome by calling the `Biome()` constructor, or using the `PlistBiomeProvider(bundle: Bundle, filename: String)`. You can also write a `BiomeProvider` that will return a Biome object out of the provided data. Consider forking and 🔨 contributing back 🔨 to this project. Don't forget to update this README! + +Once you have a `Biome` object, use `BiomeManager.register()` to register it. This does a couple things: +1. Adds it to the set of available Biomes. One uniquely named Biome is allowed per manager. +1. Sets it as the `current` object on `BiomeManager`. This is a property tells you which tells you what Biome is currently active. + +Finally, extend one of your classes: + +```swift +extension MyClass: BiomeManagerDelegate { + func switched(to: Biome) { + print("The active biome has been switched to '\(to.name)'") + } +} +``` + +Use that delegate method to do anything, like clear a CoreData database and reload data into it from a different environment, re-query an API for new data, refresh a view controller's appearance, etc. + +In order to take full advantage of Biome, you'll want to follow the pattern: +```swift + + if let biome = BiomeManager.shared.current, let apiEndpoint = biome.get("api_url") as? String { + myAPIClient.get(apiEndpoint) { response in + // ... + } + } +``` +to gate your application's properties behind Biome so that when you switch environments, the most up-to-date values are always used. + +*NOTE* You are _not_ required to use the shared `BiomeManager`. You can create numerious instances of the class and store them where you wish. + +## Class Descriptions +Implementation of Biome is straightforward. Biome provides several classes and protocols for you to use or customize: +* `class BiomeManager` - A singleton manager object that maintains a list of active 'Biomes' created in your application. + +* `class Biome` - A simple wrapper object that dictates how to access values for keys. You are responsible for knowing the type of data going in, and coming out of a Biome. + +* `protocol BiomeProvider` - A protocol that defines how 'providers' should map keys and values to a Biome. Examples might include: plist files, JSON, XML, user defaults. + +* `class PlistBiomeProvider` - A biome provider that knows how to obtain values from a Plist file. + +# Feature Roadmap + +#### Biome Groups +* You may want to have multiple Biomes active at a given time, or mix and match combinations of variables. Groups would allow the developer to do something like: + * Have a set of variables for API endpoints + * Have a set of style colours to use for UI elements + * Have a set of logging levels + + All without having to make `n!` distinct Biomes to switch between to achieve all possible permutations of variable configurations. + +#### Run-time Property Modification +* Sometimes a developer might need to modify a property at run-time instead of providing it before compile-time. This feature would allow developers to do things like tweak animation timings, for instance. + +# Troubleshooting + +### Can't compile? + +* Please note the difference between installing a compiled framework from CocoaPods or Carthage, and copying the source code. +* Please re-read the usage section. +* Search issues. +* Politely ask in the issues section. + +### Other problems / Feature requests + +* Search issues. +* Politely ask in the issues section. + +# Other + +## 3rd party software + +Biome does not depend on any 3rd party libraries. It's designed to be lightweight and not add tons of overhead to your project. + +## Contributing + +If you have ideas or like what you see here and want to support the project, you could: +* Let people know this library exists (🚀 spread the word 🚀) +* Contribute code, issues and pull requests + +## Questions & Issues + +If you are having questions or problems, you should: + + - Make sure you are using the latest version of the library. Check the [**release-section**](https://github.com/danielgindi/Biome/releases). + - Search or open questions on [**stackoverflow**](http://stackoverflow.com/questions/tagged/ios-biome) with the `ios-biome` tag + - Search [**known issues**](https://github.com/danielgindi/Biome/issues) for your problem (open and closed) + - Create new issues (please **search known issues beforehand** and avoid creating duplicate issues) -## Author +## Documentation +Documentation exists in the form of Xcode quick-help. Please refer to [**Apple's Documentation**](https://developer.apple.com/library/content/documentation/Xcode/Reference/xcode_markup_formatting_ref/SymbolDocumentation.html) for writing quick help documentation. -ndizazzo, nick@twg.io +Or you can study the [**BiomeDemo**](https://github.com/ndizazzo/biome/tree/master/BiomeDemo) project to learn by example. ## License -Biome is available under the MIT license. See the LICENSE file for more info. +Biome is available under the MIT license. See the LICENSE file for more information. diff --git a/_Pods.xcodeproj b/_Pods.xcodeproj deleted file mode 120000 index 3c5a8e7..0000000 --- a/_Pods.xcodeproj +++ /dev/null @@ -1 +0,0 @@ -Example/Pods/Pods.xcodeproj \ No newline at end of file diff --git a/scripts/build-dependencies.sh b/scripts/build-dependencies.sh new file mode 100755 index 0000000..f33a526 --- /dev/null +++ b/scripts/build-dependencies.sh @@ -0,0 +1,26 @@ +#!/bin/sh + +function build_dependencies { + + has_dependencies=$(ls Carthage/Build/**/*.framework 2> /dev/null | wc -l) + + if [ $has_dependencies != 0 ] + then + echo "Depencies have already been built." + else + echo "Building dependencies..." + carthage bootstrap + fi +} + +function alert_to_install_carthage { + echo "error: Carthage was not found! In order to build Charts you need to use Carthage to build it's dependencies. Carthage can be downloaded from https://github.com/Carthage/Carthage." + exit 1 +} + +if hash carthage 2>/dev/null +then + build_dependencies +else + alert_to_install_carthage +fi \ No newline at end of file diff --git a/scripts/copy-carthage-frameworks.sh b/scripts/copy-carthage-frameworks.sh new file mode 100755 index 0000000..fe47804 --- /dev/null +++ b/scripts/copy-carthage-frameworks.sh @@ -0,0 +1,24 @@ +#!/bin/sh + +case "$PLATFORM_NAME" in + macosx) plat=Mac;; + iphone*) plat=iOS;; + watch*) plat=watchOS;; + appletv*) plat=tvOS;; + *) echo "error: Unknown PLATFORM_NAME: $PLATFORM_NAME"; exit 1;; +esac + +for (( n = 0; n < SCRIPT_INPUT_FILE_COUNT; n++ )); do + VAR=SCRIPT_INPUT_FILE_$n + framework=$(basename "${!VAR}") + export SCRIPT_INPUT_FILE_$n="$SRCROOT"/Carthage/Build/$plat/"$framework".framework +done + +/usr/local/bin/carthage copy-frameworks || exit + +for (( n = 0; n < SCRIPT_INPUT_FILE_COUNT; n++ )); do + VAR=SCRIPT_INPUT_FILE_$n + source=${!VAR}.dSYM + dest=${BUILT_PRODUCTS_DIR}/$(basename "$source") + ditto "$source" "$dest" || exit +done \ No newline at end of file