From d02f2fb06ef84f6110ea9a57b3d256fecd303198 Mon Sep 17 00:00:00 2001 From: Georges Boumis Date: Fri, 15 Jun 2018 11:49:57 +0300 Subject: [PATCH] 1.0 initial commit --- .gitignore | 38 ++ .travis.yml | 14 + AutomaticModelKit.podspec | 42 ++ AutomaticModelKit/Assets/.gitkeep | 0 AutomaticModelKit/Classes/.gitkeep | 0 .../AutomaticCollectionViewModel.swift | 175 +++++ .../Classes/AutomaticTableViewModel.swift | 191 ++++++ .../Classes/CollectionViewModel.swift | 133 ++++ .../Classes/TableViewModel.swift | 134 ++++ .../project.pbxproj | 384 +++++++++++ .../contents.xcworkspacedata | 7 + .../xcshareddata/IDEWorkspaceChecks.plist | 8 + .../AutomaticModelKit-Example.xcscheme | 117 ++++ .../contents.xcworkspacedata | 10 + .../xcshareddata/IDEWorkspaceChecks.plist | 8 + Example/Podfile | 6 + Example/Podfile.lock | 16 + .../AutomaticModelKit.podspec.json | 22 + Example/Pods/Manifest.lock | 16 + Example/Pods/Pods.xcodeproj/project.pbxproj | 596 ++++++++++++++++++ .../AutomaticModelKit-dummy.m | 5 + .../AutomaticModelKit-prefix.pch | 12 + .../AutomaticModelKit-umbrella.h | 16 + .../AutomaticModelKit.modulemap | 6 + .../AutomaticModelKit.xcconfig | 9 + .../AutomaticModelKit/Info.plist | 26 + .../Pods-AutomaticModelKit_Tests/Info.plist | 26 + ...icModelKit_Tests-acknowledgements.markdown | 208 ++++++ ...maticModelKit_Tests-acknowledgements.plist | 240 +++++++ .../Pods-AutomaticModelKit_Tests-dummy.m | 5 + ...Pods-AutomaticModelKit_Tests-frameworks.sh | 153 +++++ .../Pods-AutomaticModelKit_Tests-resources.sh | 118 ++++ .../Pods-AutomaticModelKit_Tests-umbrella.h | 16 + ...ods-AutomaticModelKit_Tests.debug.xcconfig | 11 + .../Pods-AutomaticModelKit_Tests.modulemap | 6 + ...s-AutomaticModelKit_Tests.release.xcconfig | 11 + Example/Tests/Info.plist | 24 + Example/Tests/Tests.swift | 28 + LICENSE | 201 ++++++ NOTICE | 2 + README.md | 19 + _Pods.xcodeproj | 1 + 42 files changed, 3060 insertions(+) create mode 100644 .gitignore create mode 100644 .travis.yml create mode 100644 AutomaticModelKit.podspec create mode 100644 AutomaticModelKit/Assets/.gitkeep create mode 100644 AutomaticModelKit/Classes/.gitkeep create mode 100644 AutomaticModelKit/Classes/AutomaticCollectionViewModel.swift create mode 100644 AutomaticModelKit/Classes/AutomaticTableViewModel.swift create mode 100644 AutomaticModelKit/Classes/CollectionViewModel.swift create mode 100644 AutomaticModelKit/Classes/TableViewModel.swift create mode 100644 Example/AutomaticModelKit.xcodeproj/project.pbxproj create mode 100644 Example/AutomaticModelKit.xcodeproj/project.xcworkspace/contents.xcworkspacedata create mode 100644 Example/AutomaticModelKit.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist create mode 100644 Example/AutomaticModelKit.xcodeproj/xcshareddata/xcschemes/AutomaticModelKit-Example.xcscheme create mode 100644 Example/AutomaticModelKit.xcworkspace/contents.xcworkspacedata create mode 100644 Example/AutomaticModelKit.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist create mode 100644 Example/Podfile create mode 100644 Example/Podfile.lock create mode 100644 Example/Pods/Local Podspecs/AutomaticModelKit.podspec.json create mode 100644 Example/Pods/Manifest.lock create mode 100644 Example/Pods/Pods.xcodeproj/project.pbxproj create mode 100644 Example/Pods/Target Support Files/AutomaticModelKit/AutomaticModelKit-dummy.m create mode 100644 Example/Pods/Target Support Files/AutomaticModelKit/AutomaticModelKit-prefix.pch create mode 100644 Example/Pods/Target Support Files/AutomaticModelKit/AutomaticModelKit-umbrella.h create mode 100644 Example/Pods/Target Support Files/AutomaticModelKit/AutomaticModelKit.modulemap create mode 100644 Example/Pods/Target Support Files/AutomaticModelKit/AutomaticModelKit.xcconfig create mode 100644 Example/Pods/Target Support Files/AutomaticModelKit/Info.plist create mode 100644 Example/Pods/Target Support Files/Pods-AutomaticModelKit_Tests/Info.plist create mode 100644 Example/Pods/Target Support Files/Pods-AutomaticModelKit_Tests/Pods-AutomaticModelKit_Tests-acknowledgements.markdown create mode 100644 Example/Pods/Target Support Files/Pods-AutomaticModelKit_Tests/Pods-AutomaticModelKit_Tests-acknowledgements.plist create mode 100644 Example/Pods/Target Support Files/Pods-AutomaticModelKit_Tests/Pods-AutomaticModelKit_Tests-dummy.m create mode 100755 Example/Pods/Target Support Files/Pods-AutomaticModelKit_Tests/Pods-AutomaticModelKit_Tests-frameworks.sh create mode 100755 Example/Pods/Target Support Files/Pods-AutomaticModelKit_Tests/Pods-AutomaticModelKit_Tests-resources.sh create mode 100644 Example/Pods/Target Support Files/Pods-AutomaticModelKit_Tests/Pods-AutomaticModelKit_Tests-umbrella.h create mode 100644 Example/Pods/Target Support Files/Pods-AutomaticModelKit_Tests/Pods-AutomaticModelKit_Tests.debug.xcconfig create mode 100644 Example/Pods/Target Support Files/Pods-AutomaticModelKit_Tests/Pods-AutomaticModelKit_Tests.modulemap create mode 100644 Example/Pods/Target Support Files/Pods-AutomaticModelKit_Tests/Pods-AutomaticModelKit_Tests.release.xcconfig create mode 100644 Example/Tests/Info.plist create mode 100644 Example/Tests/Tests.swift create mode 100644 LICENSE create mode 100644 NOTICE create mode 100644 README.md create mode 120000 _Pods.xcodeproj diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..35e9669 --- /dev/null +++ b/.gitignore @@ -0,0 +1,38 @@ +# OS X +.DS_Store + +# Xcode +build/ +*.pbxuser +!default.pbxuser +*.mode1v3 +!default.mode1v3 +*.mode2v3 +!default.mode2v3 +*.perspectivev3 +!default.perspectivev3 +xcuserdata/ +*.xccheckout +profile +*.moved-aside +DerivedData +*.hmap +*.ipa + +# Bundler +.bundle + +# Add this line if you want to avoid checking in source code from Carthage dependencies. +# Carthage/Checkouts + +Carthage/Build + +# We recommend against adding the Pods directory to your .gitignore. However +# you should judge for yourself, the pros and cons are mentioned at: +# https://guides.cocoapods.org/using/using-cocoapods.html#should-i-ignore-the-pods-directory-in-source-control +# +# Note: if you ignore the Pods directory, make sure to uncomment +# `pod install` in .travis.yml +# +# Pods/ +*.swp diff --git a/.travis.yml b/.travis.yml new file mode 100644 index 0000000..36ee605 --- /dev/null +++ b/.travis.yml @@ -0,0 +1,14 @@ +# references: +# * https://www.objc.io/issues/6-build-tools/travis-ci/ +# * https://github.com/supermarin/xcpretty#usage + +osx_image: xcode7.3 +language: objective-c +# cache: cocoapods +# podfile: Example/Podfile +# before_install: +# - gem install cocoapods # Since Travis is not always on latest version +# - pod install --project-directory=Example +script: +- set -o pipefail && xcodebuild test -enableCodeCoverage YES -workspace Example/AutomaticModelKit.xcworkspace -scheme AutomaticModelKit-Example -sdk iphonesimulator9.3 ONLY_ACTIVE_ARCH=NO | xcpretty +- pod lib lint diff --git a/AutomaticModelKit.podspec b/AutomaticModelKit.podspec new file mode 100644 index 0000000..bd13a86 --- /dev/null +++ b/AutomaticModelKit.podspec @@ -0,0 +1,42 @@ +# +# Be sure to run `pod lib lint AutomaticModelKit.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 https://guides.cocoapods.org/syntax/podspec.html +# + +Pod::Spec.new do |s| + s.name = 'AutomaticModelKit' + s.version = '1.0' + s.summary = 'A reusable strong typed data source for UITableView and UICollectionView.' + +# 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.description = <<-DESC +TODO: Add long description of the pod here. + DESC + + s.homepage = 'https://github.com/averello/AutomaticModelKit' + # s.screenshots = 'www.example.com/screenshots_1', 'www.example.com/screenshots_2' + s.license = { :type => 'Apache 2.0', :file => 'LICENSE' } + s.author = { 'Georges Boumis' => 'developer.george.boumis@gmail.com' } + s.source = { :git => 'https://github.com/averello/AutomaticModelKit.git', :tag => s.version.to_s } + # s.social_media_url = 'https://twitter.com/' + + s.ios.deployment_target = '9.0' + + s.source_files = 'AutomaticModelKit/Classes/**/*' + + # s.resource_bundles = { + # 'AutomaticModelKit' => ['AutomaticModelKit/Assets/*.png'] + # } + + # s.public_header_files = 'Pod/Classes/**/*.h' + # s.frameworks = 'UIKit', 'MapKit' + # s.dependency 'AFNetworking', '~> 2.3' +end diff --git a/AutomaticModelKit/Assets/.gitkeep b/AutomaticModelKit/Assets/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/AutomaticModelKit/Classes/.gitkeep b/AutomaticModelKit/Classes/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/AutomaticModelKit/Classes/AutomaticCollectionViewModel.swift b/AutomaticModelKit/Classes/AutomaticCollectionViewModel.swift new file mode 100644 index 0000000..3a2d5aa --- /dev/null +++ b/AutomaticModelKit/Classes/AutomaticCollectionViewModel.swift @@ -0,0 +1,175 @@ +// +// AutomaticCollectionViewModel.swift +// AutomaticModelKit +// +// Created by Georges Boumis on 13/04/2018. +// +// Licensed to the Apache Software Foundation (ASF) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The ASF licenses this file +// to you under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in compliance +// with the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. +// + +import Foundation +import UIKit + +open class AutomaticCollectionViewCell: UICollectionViewCell { + open func configure(withEntry entry: T) {} +} + +open class AutomaticCollectionViewModel: NSObject, Collection, UICollectionViewDataSource where Cell: AutomaticCollectionViewCell { + final private let decoration: CollectionViewModel + + public init(entries: [T]) { + self.decoration = CollectionViewModel(entries: entries, + configuration: { (entry: T, cell: Cell) in + cell.configure(withEntry: entry) + }) + } + + public func register(onCollectionView collectionView: UICollectionView) { + self._register(onCollectionView: collectionView) + if let delegate = self as? UICollectionViewDelegate { + collectionView.delegate = delegate + } + } + + final fileprivate func _register(onCollectionView collectionView: UICollectionView) { + collectionView.register(self.decoration.cellType, + forCellWithReuseIdentifier: self.decoration.cellIdentifier) + collectionView.dataSource = self + } + + final public func numberOfSections(in collectionView: UICollectionView) -> Int { + return self.decoration.numberOfSections(in: collectionView) + } + + + final public func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int { + return self.decoration.collectionView(collectionView, + numberOfItemsInSection: section) + } + + final public func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell { + return self.decoration.collectionView(collectionView, + cellForItemAt: indexPath) + } + + // MARK: Collection conformance + final public var startIndex: Int { return self.decoration.startIndex } + final public var endIndex: Int { return self.decoration.endIndex } + final public subscript(i: Int) -> T { return self.decoration[i] } + final public func index(after i: Int) -> Int { return self.decoration.index(after: i) } +} + +//class AutomaticCollectionHeaderFooterView: UICollectionReusableView { +// func configure(forSection section: Int) {} +//} +// +//class AutomaticCollectionHeaderView: AutomaticCollectionHeaderFooterView {} +//class AutomaticCollectionFooterView: AutomaticCollectionHeaderFooterView {} +// +// +//class FullAutomaticCollectionViewModel: AutomaticCollectionViewModel, UICollectionViewDelegate where Header: AutomaticCollectionHeaderView, Footer: AutomaticCollectionFooterView, Cell: AutomaticCollectionViewCell { +// +// final private let headerHeight: CGFloat +// final private let footerHeight: CGFloat +// +// init(entries: [T], +// headerHeight: CGFloat = 0, +// footerHeight: CGFloat = 0) { +// self.footerHeight = footerHeight +// self.headerHeight = headerHeight +// super.init(entries: entries) +// } +// +// final override func register(onCollectionView collectionView: UICollectionView) { +// super.register(onCollectionView: collectionView) +// (self.headerHeight > 0).map { +// self.registerHeader(onTableView: collectionView) +// } +// (self.footerHeight > 0).map { +// self.registerHeader(onTableView: collectionView) +// } +// collectionView.delegate = self +// } +// +// final private var headerType: Header.Type { +// return Header.self +// } +// final private var footerType: Footer.Type { +// return Footer.self +// } +// +// final private var hasHeader: Bool = false +// final private var hasFooter: Bool = false +// +// final private var headerIdentifier: String { +// return String(describing: type(of: self.headerType)) +// } +// +// final private var footerIdentifier: String { +// return String(describing: type(of: self.footerType)) +// } +// +// final func registerHeader(onCollectionView collectionView: UICollectionView) { +// self.hasHeader = true +// collectionView.register(self.headerType, +// forSupplementaryViewOfKind: "header", +// withReuseIdentifier: self.headerIdentifier) +// } +// +// final func registerFooter(onCollectionView collectionView: UICollectionView) { +// self.hasFooter = true +// collectionView.register(self.footerType, +// forSupplementaryViewOfKind: "footer", +// withReuseIdentifier: self.footerIdentifier) +// } +// +// final override func responds(to aSelector: Selector) -> Bool { +// if aSelector == #selector(tableView(_:viewForFooterInSection:)) { +// return self.hasFooter +// } +// +// if aSelector == #selector(tableView(_:viewForHeaderInSection:)) { +// return self.hasHeader +// } +// return super.responds(to: aSelector) +// } +// +// final func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat { +// guard self.hasHeader else { return 0.0 } +// return self.headerHeight +// } +// +// final func tableView(_ tableView: UITableView, heightForFooterInSection section: Int) -> CGFloat { +// guard self.hasFooter else { return 0.0 } +// return self.footerHeight +// } +// +// final func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? { +// guard self.hasHeader, +// let header = tableView.dequeueReusableHeaderFooterView(withIdentifier: self.headerIdentifier) as? Header else { return nil } +// header.configure(forSection: section) +// return header +// } +// +// final func tableView(_ tableView: UITableView, viewForFooterInSection section: Int) -> UIView? { +// guard self.hasFooter, +// let footer = tableView.dequeueReusableHeaderFooterView(withIdentifier: self.footerIdentifier) as? Footer else { return nil } +// footer.configure(forSection: section) +// return footer +// } +//} diff --git a/AutomaticModelKit/Classes/AutomaticTableViewModel.swift b/AutomaticModelKit/Classes/AutomaticTableViewModel.swift new file mode 100644 index 0000000..a7e44b8 --- /dev/null +++ b/AutomaticModelKit/Classes/AutomaticTableViewModel.swift @@ -0,0 +1,191 @@ +// +// AutomaticTableViewModel.swift +// AutomaticModelKit +// +// Created by Georges Boumis on 26/03/2018. +// +// Licensed to the Apache Software Foundation (ASF) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The ASF licenses this file +// to you under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in compliance +// with the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. +// + + +import Foundation + + +open class AutomaticTableViewCell: UITableViewCell { + open func configure(withEntry entry: T) {} +} + +open class AutomaticTableViewModel: NSObject, Collection, UITableViewDataSource where Cell: AutomaticTableViewCell { + + final fileprivate let decoration: TableViewModel + + public init(entries: [T]) { + self.decoration = TableViewModel(entries: entries, + configuration: { (entry: T, cell: Cell) in + cell.configure(withEntry: entry) + }) + } + + open func register(onTableView tableView: UITableView) { + self._register(onTableView: tableView) + if let delegate = self as? UITableViewDelegate { + tableView.delegate = delegate + } + tableView.reloadData() + } + + final fileprivate func _register(onTableView tableView: UITableView) { + tableView.register(self.decoration.cellType, + forCellReuseIdentifier: self.decoration.cellIdentifier) + tableView.dataSource = self + } + + final public func numberOfSections(in tableView: UITableView) -> Int { + return self.decoration.numberOfSections(in: tableView) + } + + final public func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { + return self.decoration.tableView(tableView, + numberOfRowsInSection: section) + } + + final public func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { + return self.decoration.tableView(tableView, cellForRowAt: indexPath) + } + + // MARK: Collection conformance + final public var startIndex: Int { return self.decoration.startIndex } + final public var endIndex: Int { return self.decoration.endIndex } + final public func index(after i: Int) -> Int { return self.decoration.index(after: i) } + final public subscript(i: Int) -> T { + get { return self.decoration[i] } +// set { self.decoration[i] = newValue } + } + +// // MARK: RangeReplaceableCollection +// required convenience override init() { +// self.init(entries: []) +// } +// +// final func replaceSubrange(_ subrange: Range, with newElements: [T]) { +// self.decoration.replaceSubrange(subrange, with: newElements) +// } +} + +open class AutomaticTableHeaderFooterView: UITableViewHeaderFooterView { + open func configure(forSection section: Int) {} +} + +open class AutomaticTableHeaderView: AutomaticTableHeaderFooterView {} +open class AutomaticTableFooterView: AutomaticTableHeaderFooterView {} + + +open class FullAutomaticTableViewModel: AutomaticTableViewModel, UITableViewDelegate where Header: AutomaticTableHeaderView, Footer: AutomaticTableFooterView, Cell: AutomaticTableViewCell { + + final private let headerHeight: CGFloat + final private let footerHeight: CGFloat + + public init(entries: [T], + headerHeight: CGFloat = 0, + footerHeight: CGFloat = 0) { + self.footerHeight = footerHeight + self.headerHeight = headerHeight + super.init(entries: entries) + } + + // MARK: RangeReplaceableCollection + required convenience public init() { + self.init(entries: []) + } + + final public override func register(onTableView tableView: UITableView) { + super.register(onTableView: tableView) + if self.headerHeight > 0 { + self.registerHeader(onTableView: tableView) + } + if self.footerHeight > 0 { + self.registerHeader(onTableView: tableView) + } + tableView.delegate = self + } + + final private var headerType: Header.Type { + return Header.self + } + final private var footerType: Footer.Type { + return Footer.self + } + + final private var hasHeader: Bool = false + final private var hasFooter: Bool = false + + final private var headerIdentifier: String { + return String(describing: type(of: self.headerType)) + } + + final private var footerIdentifier: String { + return String(describing: type(of: self.footerType)) + } + + final public func registerHeader(onTableView tableView: UITableView) { + self.hasHeader = true + tableView.register(self.headerType, + forHeaderFooterViewReuseIdentifier: self.headerIdentifier) + } + + final public func registerFooter(onTableView tableView: UITableView) { + self.hasFooter = true + tableView.register(self.footerType, + forHeaderFooterViewReuseIdentifier: self.footerIdentifier) + } + + final public override func responds(to aSelector: Selector) -> Bool { + if aSelector == #selector(tableView(_:viewForFooterInSection:)) { + return self.hasFooter + } + + if aSelector == #selector(tableView(_:viewForHeaderInSection:)) { + return self.hasHeader + } + return super.responds(to: aSelector) + } + + final public func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat { + guard self.hasHeader else { return 0.0 } + return self.headerHeight + } + + final public func tableView(_ tableView: UITableView, heightForFooterInSection section: Int) -> CGFloat { + guard self.hasFooter else { return 0.0 } + return self.footerHeight + } + + final public func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? { + guard self.hasHeader, + let header = tableView.dequeueReusableHeaderFooterView(withIdentifier: self.headerIdentifier) as? Header else { return nil } + header.configure(forSection: section) + return header + } + + final public func tableView(_ tableView: UITableView, viewForFooterInSection section: Int) -> UIView? { + guard self.hasFooter, + let footer = tableView.dequeueReusableHeaderFooterView(withIdentifier: self.footerIdentifier) as? Footer else { return nil } + footer.configure(forSection: section) + return footer + } +} diff --git a/AutomaticModelKit/Classes/CollectionViewModel.swift b/AutomaticModelKit/Classes/CollectionViewModel.swift new file mode 100644 index 0000000..7f007e5 --- /dev/null +++ b/AutomaticModelKit/Classes/CollectionViewModel.swift @@ -0,0 +1,133 @@ +// +// CollectionViewModel.swift +// AutomaticModelKit +// +// Created by Georges Boumis on 13/04/2018. +// +// Licensed to the Apache Software Foundation (ASF) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The ASF licenses this file +// to you under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in compliance +// with the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. +// + + +import Foundation + +open class CollectionViewModel: NSObject, Collection, UICollectionViewDataSource where Cell: UICollectionViewCell { + final private let entries: [T] + public typealias Configuration = (T, Cell) -> Void + final private let configuration: Configuration + + public init(entries: [T], + configuration: @escaping Configuration) { + self.entries = entries + self.configuration = configuration + } + + final public var cellType: Cell.Type { + return Cell.self + } + final public var cellIdentifier: String { + return String(describing: type(of: Cell.self)) + } + + final public func register(onCollectionView collectionView: UICollectionView) { + self._register(onCollectionView: collectionView) + if let delegate = self as? UICollectionViewDelegate { + collectionView.delegate = delegate + } + } + + final fileprivate func _register(onCollectionView collectionView: UICollectionView) { + collectionView.register(self.cellType, + forCellWithReuseIdentifier: self.cellIdentifier) + collectionView.dataSource = self + } + + final public func numberOfSections(in collectionView: UICollectionView) -> Int { + return 1 + } + + final public func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int { + return self.entries.count + } + + final public func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell { + let cell = collectionView.dequeueReusableCell(withReuseIdentifier: self.cellIdentifier, + for: indexPath) as! Cell + self.configuration(self[indexPath.row], cell) + return cell + } + + // MARK: Collection conformance + final public var startIndex: Int { return self.entries.startIndex } + final public var endIndex: Int { return self.entries.endIndex } + final public subscript(i: Int) -> T { return self.entries[i] } + final public func index(after i: Int) -> Int { return self.entries.index(after: i) } +} + +open class MultidimensionCollectionViewModel: NSObject, UICollectionViewDataSource where Cell: UICollectionViewCell { + final private let options: [[T]] + public typealias Configuration = (T, Cell) -> Void + final private let configuration: Configuration + + public init(options: [[T]], + configuration: @escaping Configuration) { + self.options = options + self.configuration = configuration + } + + final public var cellType: Cell.Type { + return Cell.self + } + final public var cellIdentifier: String { + return String(describing: type(of: Cell.self)) + } + + final public func register(onCollectionView collectionView: UICollectionView) { + self._register(onCollectionView: collectionView) + if let delegate = self as? UICollectionViewDelegate { + collectionView.delegate = delegate + } + } + + final fileprivate func _register(onCollectionView collectionView: UICollectionView) { + collectionView.register(self.cellType, + forCellWithReuseIdentifier: self.cellIdentifier) + collectionView.dataSource = self + } + + final public func numberOfSections(in collectionView: UICollectionView) -> Int { + return self.options.count + } + + final public func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int { + return self.options[section].count + } + + final public func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell { + let cell = collectionView.dequeueReusableCell(withReuseIdentifier: self.cellIdentifier, + for: indexPath) as! Cell + self.configuration(self.options[indexPath.section][indexPath.row], cell) + return cell + } + // + // // MARK: Collection conformance + // final var startIndex: Int { return self.options.startIndex } + // final var endIndex: Int { return self.options.endIndex } + // final subscript(i: Int) -> T { return self.options[i] } + // final func index(after i: Int) -> Int { return self.options.index(after: i) } +} + diff --git a/AutomaticModelKit/Classes/TableViewModel.swift b/AutomaticModelKit/Classes/TableViewModel.swift new file mode 100644 index 0000000..50102ed --- /dev/null +++ b/AutomaticModelKit/Classes/TableViewModel.swift @@ -0,0 +1,134 @@ +// +// TableViewModel.swift +// AutomaticModelKit +// +// Created by Georges Boumis on 22/03/2018. +// +// Licensed to the Apache Software Foundation (ASF) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The ASF licenses this file +// to you under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in compliance +// with the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. +// + +import Foundation +import UIKit + +open class TableViewModel: NSObject, Collection, UITableViewDataSource where Cell: UITableViewCell { + + final private var entries: [T] + public typealias Configuration = (T, Cell) -> Void + final private let configuration: Configuration + + public init(entries: [T], + configuration: @escaping Configuration) { + self.entries = entries + self.configuration = configuration + } + + final public var cellType: Cell.Type { + return Cell.self + } + final public var cellIdentifier: String { + return String(describing: type(of: Cell.self)) + } + + final public func register(onTableView tableView: UITableView) { + self._register(onTableView: tableView) + if let delegate = self as? UITableViewDelegate { + tableView.delegate = delegate + } + } + + final fileprivate func _register(onTableView tableView: UITableView) { + tableView.register(self.cellType, + forCellReuseIdentifier: self.cellIdentifier) + tableView.dataSource = self + } + + + final public func numberOfSections(in tableView: UITableView) -> Int { + return 1 + } + + final public func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { + return self.entries.count + } + + public func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { + let cell = tableView.dequeueReusableCell(withIdentifier: self.cellIdentifier, + for: indexPath) as! Cell + self.configuration(self[indexPath.row], cell) + return cell + } + + // MARK: Collection conformance + final public var startIndex: Int { return self.entries.startIndex } + final public var endIndex: Int { return self.entries.endIndex } + final public func index(after i: Int) -> Int { return self.entries.index(after: i) } + final public subscript(i: Int) -> T { + get { return self.entries[i] } +// set { self.entries[i] = newValue } + } + +// // MARK: RangeReplaceableCollection +// required convenience override init() { +// self.init(entries: []) { _,_ in } +// } +// +// final func replaceSubrange(_ subrange: Range, with newElements: [T]) { +// self.entries.replaceSubrange(subrange, with: newElements) +// } +} + +open class MultidimensionTableViewModel: NSObject, UITableViewDataSource where Cell: UITableViewCell { + final private let options: [[T]] + public typealias Configuration = (T, Cell) -> Void + final private let configuration: Configuration + + public init(options: [[T]], + configuration: @escaping Configuration) { + self.options = options + self.configuration = configuration + } + + final public var cellType: Cell.Type { + return Cell.self + } + final public var cellIdentifier: String { + return String(describing: type(of: Cell.self)) + } + + final public func numberOfSections(in tableView: UITableView) -> Int { + return self.options.count + } + + final public func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { + return self.options[section].count + } + + final public func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { + let cell = tableView.dequeueReusableCell(withIdentifier: self.cellIdentifier, + for: indexPath) as! Cell + self.configuration(self.options[indexPath.section][indexPath.row], cell) + return cell + } + // + // // MARK: Collection conformance + // final var startIndex: Int { return self.options.startIndex } + // final var endIndex: Int { return self.options.endIndex } + // final subscript(i: Int) -> T { return self.options[i] } + // final func index(after i: Int) -> Int { return self.options.index(after: i) } +} + diff --git a/Example/AutomaticModelKit.xcodeproj/project.pbxproj b/Example/AutomaticModelKit.xcodeproj/project.pbxproj new file mode 100644 index 0000000..8eb7185 --- /dev/null +++ b/Example/AutomaticModelKit.xcodeproj/project.pbxproj @@ -0,0 +1,384 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 46; + objects = { + +/* Begin PBXBuildFile section */ + 607FACEC1AFB9204008FA782 /* Tests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 607FACEB1AFB9204008FA782 /* Tests.swift */; }; + E93B0A6B61F27E35B324AEAE /* Pods_AutomaticModelKit_Tests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 9D20BA7C61D5146CB5B12D98 /* Pods_AutomaticModelKit_Tests.framework */; }; +/* End PBXBuildFile section */ + +/* Begin PBXFileReference section */ + 000B664C0FC6DB220DE1BD1A /* README.md */ = {isa = PBXFileReference; includeInIndex = 1; name = README.md; path = ../README.md; sourceTree = ""; }; + 3F256C7138FE9D63A9B09060 /* LICENSE */ = {isa = PBXFileReference; includeInIndex = 1; name = LICENSE; path = ../LICENSE; sourceTree = ""; }; + 4562691FB917A9084EB3F047 /* Pods-AutomaticModelKit_Tests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-AutomaticModelKit_Tests.release.xcconfig"; path = "Pods/Target Support Files/Pods-AutomaticModelKit_Tests/Pods-AutomaticModelKit_Tests.release.xcconfig"; sourceTree = ""; }; + 607FACE51AFB9204008FA782 /* AutomaticModelKit_Tests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = AutomaticModelKit_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 = ""; }; + 9D20BA7C61D5146CB5B12D98 /* Pods_AutomaticModelKit_Tests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_AutomaticModelKit_Tests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + C6D48FD087E776FEB0B8ED1A /* Pods-AutomaticModelKit_Tests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-AutomaticModelKit_Tests.debug.xcconfig"; path = "Pods/Target Support Files/Pods-AutomaticModelKit_Tests/Pods-AutomaticModelKit_Tests.debug.xcconfig"; sourceTree = ""; }; + CA93C4B56F5231E4C7260AB8 /* AutomaticModelKit.podspec */ = {isa = PBXFileReference; includeInIndex = 1; name = AutomaticModelKit.podspec; path = ../AutomaticModelKit.podspec; sourceTree = ""; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + 607FACE21AFB9204008FA782 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + E93B0A6B61F27E35B324AEAE /* Pods_AutomaticModelKit_Tests.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 3814A3F559E235C4D2061ABC /* Pods */ = { + isa = PBXGroup; + children = ( + C6D48FD087E776FEB0B8ED1A /* Pods-AutomaticModelKit_Tests.debug.xcconfig */, + 4562691FB917A9084EB3F047 /* Pods-AutomaticModelKit_Tests.release.xcconfig */, + ); + name = Pods; + sourceTree = ""; + }; + 607FACC71AFB9204008FA782 = { + isa = PBXGroup; + children = ( + 607FACF51AFB993E008FA782 /* Podspec Metadata */, + 607FACE81AFB9204008FA782 /* Tests */, + 607FACD11AFB9204008FA782 /* Products */, + 3814A3F559E235C4D2061ABC /* Pods */, + F5DFD3862470EFD9697823DA /* Frameworks */, + ); + sourceTree = ""; + }; + 607FACD11AFB9204008FA782 /* Products */ = { + isa = PBXGroup; + children = ( + 607FACE51AFB9204008FA782 /* AutomaticModelKit_Tests.xctest */, + ); + name = Products; + 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 = ( + CA93C4B56F5231E4C7260AB8 /* AutomaticModelKit.podspec */, + 000B664C0FC6DB220DE1BD1A /* README.md */, + 3F256C7138FE9D63A9B09060 /* LICENSE */, + ); + name = "Podspec Metadata"; + sourceTree = ""; + }; + F5DFD3862470EFD9697823DA /* Frameworks */ = { + isa = PBXGroup; + children = ( + 9D20BA7C61D5146CB5B12D98 /* Pods_AutomaticModelKit_Tests.framework */, + ); + name = Frameworks; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXNativeTarget section */ + 607FACE41AFB9204008FA782 /* AutomaticModelKit_Tests */ = { + isa = PBXNativeTarget; + buildConfigurationList = 607FACF21AFB9204008FA782 /* Build configuration list for PBXNativeTarget "AutomaticModelKit_Tests" */; + buildPhases = ( + 5FDEF3F90477162BE855AC5E /* [CP] Check Pods Manifest.lock */, + 607FACE11AFB9204008FA782 /* Sources */, + 607FACE21AFB9204008FA782 /* Frameworks */, + 607FACE31AFB9204008FA782 /* Resources */, + 9957EBB4F0BE167A05A0DCC0 /* [CP] Embed Pods Frameworks */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = AutomaticModelKit_Tests; + productName = Tests; + productReference = 607FACE51AFB9204008FA782 /* AutomaticModelKit_Tests.xctest */; + productType = "com.apple.product-type.bundle.unit-test"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + 607FACC81AFB9204008FA782 /* Project object */ = { + isa = PBXProject; + attributes = { + LastSwiftUpdateCheck = 0830; + LastUpgradeCheck = 0830; + ORGANIZATIONNAME = CocoaPods; + TargetAttributes = { + 607FACCF1AFB9204008FA782 = { + CreatedOnToolsVersion = 6.3.1; + LastSwiftMigration = 0900; + }; + 607FACE41AFB9204008FA782 = { + CreatedOnToolsVersion = 6.3.1; + LastSwiftMigration = 0900; + TestTargetID = 607FACCF1AFB9204008FA782; + }; + }; + }; + buildConfigurationList = 607FACCB1AFB9204008FA782 /* Build configuration list for PBXProject "AutomaticModelKit" */; + compatibilityVersion = "Xcode 3.2"; + developmentRegion = English; + hasScannedForEncodings = 0; + knownRegions = ( + en, + Base, + ); + mainGroup = 607FACC71AFB9204008FA782; + productRefGroup = 607FACD11AFB9204008FA782 /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + 607FACE41AFB9204008FA782 /* AutomaticModelKit_Tests */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + 607FACE31AFB9204008FA782 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXShellScriptBuildPhase section */ + 5FDEF3F90477162BE855AC5E /* [CP] Check Pods Manifest.lock */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + "${PODS_PODFILE_DIR_PATH}/Podfile.lock", + "${PODS_ROOT}/Manifest.lock", + ); + name = "[CP] Check Pods Manifest.lock"; + outputPaths = ( + "$(DERIVED_FILE_DIR)/Pods-AutomaticModelKit_Tests-checkManifestLockResult.txt", + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/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# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; + showEnvVarsInLog = 0; + }; + 9957EBB4F0BE167A05A0DCC0 /* [CP] Embed Pods Frameworks */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + "${SRCROOT}/Pods/Target Support Files/Pods-AutomaticModelKit_Tests/Pods-AutomaticModelKit_Tests-frameworks.sh", + "${BUILT_PRODUCTS_DIR}/AutomaticModelKit/AutomaticModelKit.framework", + ); + name = "[CP] Embed Pods Frameworks"; + outputPaths = ( + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/AutomaticModelKit.framework", + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "\"${SRCROOT}/Pods/Target Support Files/Pods-AutomaticModelKit_Tests/Pods-AutomaticModelKit_Tests-frameworks.sh\"\n"; + showEnvVarsInLog = 0; + }; +/* End PBXShellScriptBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + 607FACE11AFB9204008FA782 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 607FACEC1AFB9204008FA782 /* Tests.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase 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_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = 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_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + 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 = 9.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_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = 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_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + 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 = 9.3; + MTL_ENABLE_DEBUG_INFO = NO; + SDKROOT = iphoneos; + SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; + VALIDATE_PRODUCT = YES; + }; + name = Release; + }; + 607FACF31AFB9204008FA782 /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = C6D48FD087E776FEB0B8ED1A /* Pods-AutomaticModelKit_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_SWIFT3_OBJC_INFERENCE = Default; + SWIFT_VERSION = 4.0; + }; + name = Debug; + }; + 607FACF41AFB9204008FA782 /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 4562691FB917A9084EB3F047 /* Pods-AutomaticModelKit_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_SWIFT3_OBJC_INFERENCE = Default; + SWIFT_VERSION = 4.0; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 607FACCB1AFB9204008FA782 /* Build configuration list for PBXProject "AutomaticModelKit" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 607FACED1AFB9204008FA782 /* Debug */, + 607FACEE1AFB9204008FA782 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 607FACF21AFB9204008FA782 /* Build configuration list for PBXNativeTarget "AutomaticModelKit_Tests" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 607FACF31AFB9204008FA782 /* Debug */, + 607FACF41AFB9204008FA782 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + }; + rootObject = 607FACC81AFB9204008FA782 /* Project object */; +} diff --git a/Example/AutomaticModelKit.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/Example/AutomaticModelKit.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..0f7ed70 --- /dev/null +++ b/Example/AutomaticModelKit.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/Example/AutomaticModelKit.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/Example/AutomaticModelKit.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 0000000..18d9810 --- /dev/null +++ b/Example/AutomaticModelKit.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/Example/AutomaticModelKit.xcodeproj/xcshareddata/xcschemes/AutomaticModelKit-Example.xcscheme b/Example/AutomaticModelKit.xcodeproj/xcshareddata/xcschemes/AutomaticModelKit-Example.xcscheme new file mode 100644 index 0000000..710d476 --- /dev/null +++ b/Example/AutomaticModelKit.xcodeproj/xcshareddata/xcschemes/AutomaticModelKit-Example.xcscheme @@ -0,0 +1,117 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Example/AutomaticModelKit.xcworkspace/contents.xcworkspacedata b/Example/AutomaticModelKit.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..415a7d1 --- /dev/null +++ b/Example/AutomaticModelKit.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,10 @@ + + + + + + + diff --git a/Example/AutomaticModelKit.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/Example/AutomaticModelKit.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 0000000..18d9810 --- /dev/null +++ b/Example/AutomaticModelKit.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/Example/Podfile b/Example/Podfile new file mode 100644 index 0000000..bfde967 --- /dev/null +++ b/Example/Podfile @@ -0,0 +1,6 @@ +platform :ios, '9.0' +use_frameworks! + +target 'AutomaticModelKit_Tests' do + pod 'AutomaticModelKit', :path => '../' +end diff --git a/Example/Podfile.lock b/Example/Podfile.lock new file mode 100644 index 0000000..4036785 --- /dev/null +++ b/Example/Podfile.lock @@ -0,0 +1,16 @@ +PODS: + - AutomaticModelKit (1.0) + +DEPENDENCIES: + - AutomaticModelKit (from `../`) + +EXTERNAL SOURCES: + AutomaticModelKit: + :path: "../" + +SPEC CHECKSUMS: + AutomaticModelKit: 8a395859a2526db8ae3c6b1385bd14ee13699a0c + +PODFILE CHECKSUM: 10100e250eb69cce1ea03fecb10c02f00e08d056 + +COCOAPODS: 1.5.3 diff --git a/Example/Pods/Local Podspecs/AutomaticModelKit.podspec.json b/Example/Pods/Local Podspecs/AutomaticModelKit.podspec.json new file mode 100644 index 0000000..aabcf3e --- /dev/null +++ b/Example/Pods/Local Podspecs/AutomaticModelKit.podspec.json @@ -0,0 +1,22 @@ +{ + "name": "AutomaticModelKit", + "version": "1.0", + "summary": "A reusable strong typed data source for UITableView and UICollectionView.", + "description": "TODO: Add long description of the pod here.", + "homepage": "https://github.com/averello/AutomaticModelKit", + "license": { + "type": "Apache 2.0", + "file": "LICENSE" + }, + "authors": { + "Georges Boumis": "developer.george.boumis@gmail.com" + }, + "source": { + "git": "https://github.com/averello/AutomaticModelKit.git", + "tag": "1.0" + }, + "platforms": { + "ios": "9.0" + }, + "source_files": "AutomaticModelKit/Classes/**/*" +} diff --git a/Example/Pods/Manifest.lock b/Example/Pods/Manifest.lock new file mode 100644 index 0000000..4036785 --- /dev/null +++ b/Example/Pods/Manifest.lock @@ -0,0 +1,16 @@ +PODS: + - AutomaticModelKit (1.0) + +DEPENDENCIES: + - AutomaticModelKit (from `../`) + +EXTERNAL SOURCES: + AutomaticModelKit: + :path: "../" + +SPEC CHECKSUMS: + AutomaticModelKit: 8a395859a2526db8ae3c6b1385bd14ee13699a0c + +PODFILE CHECKSUM: 10100e250eb69cce1ea03fecb10c02f00e08d056 + +COCOAPODS: 1.5.3 diff --git a/Example/Pods/Pods.xcodeproj/project.pbxproj b/Example/Pods/Pods.xcodeproj/project.pbxproj new file mode 100644 index 0000000..f7041ee --- /dev/null +++ b/Example/Pods/Pods.xcodeproj/project.pbxproj @@ -0,0 +1,596 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 46; + objects = { + +/* Begin PBXBuildFile section */ + 0B71EAE022E025453EE74C6FF1864001 /* TableViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8658FCB47091678CA4AEF2CAB6E58B35 /* TableViewModel.swift */; }; + 34114E860C59ED934659ADD6D12A5A19 /* AutomaticCollectionViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = DC89CCE41DC79D4D7DD4B7C367F2D027 /* AutomaticCollectionViewModel.swift */; }; + 4FEC61F58EACD22235A5175EBFCEC716 /* Pods-AutomaticModelKit_Tests-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 29441A90674DA390B1FA19061B584E9F /* Pods-AutomaticModelKit_Tests-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 595F4D41A16610D966F80762210932E2 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 5A16F4CFC63FAC439D7A04994F579A03 /* Foundation.framework */; }; + 700CE179498D6F90EC1BEA6439924AD1 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 5A16F4CFC63FAC439D7A04994F579A03 /* Foundation.framework */; }; + 816DC57903B6F89C58E339CB7B942A15 /* Pods-AutomaticModelKit_Tests-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = FC05D1643226F969B719D88B4417D323 /* Pods-AutomaticModelKit_Tests-dummy.m */; }; + 845227688513E29C1DFD3D43DC945D87 /* AutomaticModelKit-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = E4BCE9CB351E468977AE60A00C5C7824 /* AutomaticModelKit-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; + A0574CE4AD3E9CB0B1CD0A02440C6D3B /* CollectionViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5AB275F3450D9B6CBB60C9EFF3A6E93E /* CollectionViewModel.swift */; }; + A0AF07CFB3C5271F946A8640E00CD2A2 /* AutomaticTableViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = BA9F28812D113E779759820F29C9D063 /* AutomaticTableViewModel.swift */; }; + D8FBE4B2E70517D0EC596E609D538E0A /* AutomaticModelKit-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 8245C5D827135731E4C1DC10A133600D /* AutomaticModelKit-dummy.m */; }; +/* End PBXBuildFile section */ + +/* Begin PBXContainerItemProxy section */ + 45ABBEE52784DC15C39FC72C9E5058A4 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */; + proxyType = 1; + remoteGlobalIDString = F0B214DDDD09380820A831AD75AD5435; + remoteInfo = AutomaticModelKit; + }; +/* End PBXContainerItemProxy section */ + +/* Begin PBXFileReference section */ + 019983878BF3B178D43B5447A7894BEC /* Pods-AutomaticModelKit_Tests-acknowledgements.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Pods-AutomaticModelKit_Tests-acknowledgements.plist"; sourceTree = ""; }; + 1B30A66379ED2ECA076C3005B77840A1 /* README.md */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = net.daringfireball.markdown; path = README.md; sourceTree = ""; }; + 1CA547443F64B30041D468CED220B20C /* Pods_AutomaticModelKit_Tests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_AutomaticModelKit_Tests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 29441A90674DA390B1FA19061B584E9F /* Pods-AutomaticModelKit_Tests-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Pods-AutomaticModelKit_Tests-umbrella.h"; sourceTree = ""; }; + 29EF90A438B977E52C8CEBE2B8F59753 /* Pods-AutomaticModelKit_Tests-acknowledgements.markdown */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text; path = "Pods-AutomaticModelKit_Tests-acknowledgements.markdown"; sourceTree = ""; }; + 44B8A8C341E6E2AB32F205474F10D71C /* AutomaticModelKit.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = AutomaticModelKit.modulemap; sourceTree = ""; }; + 5A16F4CFC63FAC439D7A04994F579A03 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS11.3.sdk/System/Library/Frameworks/Foundation.framework; sourceTree = DEVELOPER_DIR; }; + 5AB275F3450D9B6CBB60C9EFF3A6E93E /* CollectionViewModel.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = CollectionViewModel.swift; path = AutomaticModelKit/Classes/CollectionViewModel.swift; sourceTree = ""; }; + 647EDBFC5958F6C788E8AF083003DCC5 /* Pods-AutomaticModelKit_Tests-frameworks.sh */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.script.sh; path = "Pods-AutomaticModelKit_Tests-frameworks.sh"; sourceTree = ""; }; + 6F3310716BCA918889CEE1987368974C /* AutomaticModelKit.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = AutomaticModelKit.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 8245C5D827135731E4C1DC10A133600D /* AutomaticModelKit-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "AutomaticModelKit-dummy.m"; sourceTree = ""; }; + 8658FCB47091678CA4AEF2CAB6E58B35 /* TableViewModel.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = TableViewModel.swift; path = AutomaticModelKit/Classes/TableViewModel.swift; sourceTree = ""; }; + 9102361787FE94B68708889F6B233E44 /* LICENSE */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text; path = LICENSE; sourceTree = ""; }; + 93A4A3777CF96A4AAC1D13BA6DCCEA73 /* Podfile */ = {isa = PBXFileReference; explicitFileType = text.script.ruby; includeInIndex = 1; name = Podfile; path = ../Podfile; sourceTree = SOURCE_ROOT; xcLanguageSpecificationIdentifier = xcode.lang.ruby; }; + 996A59FE741B1DF1483EA64DE5A22DF7 /* Pods-AutomaticModelKit_Tests-resources.sh */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.script.sh; path = "Pods-AutomaticModelKit_Tests-resources.sh"; sourceTree = ""; }; + 9ADD176D4942EE76DF236AFFEFB37CCC /* Pods-AutomaticModelKit_Tests.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = "Pods-AutomaticModelKit_Tests.modulemap"; sourceTree = ""; }; + A2B717648FBD0003ADB1DE2A3F189DB8 /* AutomaticModelKit.podspec */ = {isa = PBXFileReference; explicitFileType = text.script.ruby; includeInIndex = 1; path = AutomaticModelKit.podspec; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.ruby; }; + B903872E4DECA147DD337C1B114E974E /* Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + BA9F28812D113E779759820F29C9D063 /* AutomaticTableViewModel.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = AutomaticTableViewModel.swift; path = AutomaticModelKit/Classes/AutomaticTableViewModel.swift; sourceTree = ""; }; + C03EF6148CECB13CFBFC4245EE35E7C3 /* Pods-AutomaticModelKit_Tests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-AutomaticModelKit_Tests.debug.xcconfig"; sourceTree = ""; }; + C5F447AD5AE01B758C6509B8102A940E /* AutomaticModelKit.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = AutomaticModelKit.xcconfig; sourceTree = ""; }; + CED9CECE02F59A587E30D1B015CCC896 /* Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + DC89CCE41DC79D4D7DD4B7C367F2D027 /* AutomaticCollectionViewModel.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = AutomaticCollectionViewModel.swift; path = AutomaticModelKit/Classes/AutomaticCollectionViewModel.swift; sourceTree = ""; }; + E4BCE9CB351E468977AE60A00C5C7824 /* AutomaticModelKit-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "AutomaticModelKit-umbrella.h"; sourceTree = ""; }; + F264F0F46119DC0A0680C2ADDE3D04CA /* AutomaticModelKit-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "AutomaticModelKit-prefix.pch"; sourceTree = ""; }; + F98A61A57D92CF6FD1FCE68B1327B484 /* Pods-AutomaticModelKit_Tests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-AutomaticModelKit_Tests.release.xcconfig"; sourceTree = ""; }; + FC05D1643226F969B719D88B4417D323 /* Pods-AutomaticModelKit_Tests-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Pods-AutomaticModelKit_Tests-dummy.m"; sourceTree = ""; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + 274A3C2202202884544B1DBE89A044BA /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 595F4D41A16610D966F80762210932E2 /* Foundation.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + D6E2510DA039032BF3F70CCA55799119 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 700CE179498D6F90EC1BEA6439924AD1 /* Foundation.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 324D1B34924D23156DBB599EE7FB5DB1 /* Support Files */ = { + isa = PBXGroup; + children = ( + 44B8A8C341E6E2AB32F205474F10D71C /* AutomaticModelKit.modulemap */, + C5F447AD5AE01B758C6509B8102A940E /* AutomaticModelKit.xcconfig */, + 8245C5D827135731E4C1DC10A133600D /* AutomaticModelKit-dummy.m */, + F264F0F46119DC0A0680C2ADDE3D04CA /* AutomaticModelKit-prefix.pch */, + E4BCE9CB351E468977AE60A00C5C7824 /* AutomaticModelKit-umbrella.h */, + CED9CECE02F59A587E30D1B015CCC896 /* Info.plist */, + ); + name = "Support Files"; + path = "Example/Pods/Target Support Files/AutomaticModelKit"; + sourceTree = ""; + }; + 55DF9AFE5E05EA2E90C5007BCA90BF37 /* Pod */ = { + isa = PBXGroup; + children = ( + A2B717648FBD0003ADB1DE2A3F189DB8 /* AutomaticModelKit.podspec */, + 9102361787FE94B68708889F6B233E44 /* LICENSE */, + 1B30A66379ED2ECA076C3005B77840A1 /* README.md */, + ); + name = Pod; + sourceTree = ""; + }; + 5C79E8A2BB6BD3A90C37F943BFBF9175 /* Products */ = { + isa = PBXGroup; + children = ( + 6F3310716BCA918889CEE1987368974C /* AutomaticModelKit.framework */, + 1CA547443F64B30041D468CED220B20C /* Pods_AutomaticModelKit_Tests.framework */, + ); + name = Products; + sourceTree = ""; + }; + 5E0D919E635D23B70123790B8308F8EF /* iOS */ = { + isa = PBXGroup; + children = ( + 5A16F4CFC63FAC439D7A04994F579A03 /* Foundation.framework */, + ); + name = iOS; + sourceTree = ""; + }; + 63AE3085254C2A41FF14912E7F622C86 /* Pods-AutomaticModelKit_Tests */ = { + isa = PBXGroup; + children = ( + B903872E4DECA147DD337C1B114E974E /* Info.plist */, + 9ADD176D4942EE76DF236AFFEFB37CCC /* Pods-AutomaticModelKit_Tests.modulemap */, + 29EF90A438B977E52C8CEBE2B8F59753 /* Pods-AutomaticModelKit_Tests-acknowledgements.markdown */, + 019983878BF3B178D43B5447A7894BEC /* Pods-AutomaticModelKit_Tests-acknowledgements.plist */, + FC05D1643226F969B719D88B4417D323 /* Pods-AutomaticModelKit_Tests-dummy.m */, + 647EDBFC5958F6C788E8AF083003DCC5 /* Pods-AutomaticModelKit_Tests-frameworks.sh */, + 996A59FE741B1DF1483EA64DE5A22DF7 /* Pods-AutomaticModelKit_Tests-resources.sh */, + 29441A90674DA390B1FA19061B584E9F /* Pods-AutomaticModelKit_Tests-umbrella.h */, + C03EF6148CECB13CFBFC4245EE35E7C3 /* Pods-AutomaticModelKit_Tests.debug.xcconfig */, + F98A61A57D92CF6FD1FCE68B1327B484 /* Pods-AutomaticModelKit_Tests.release.xcconfig */, + ); + name = "Pods-AutomaticModelKit_Tests"; + path = "Target Support Files/Pods-AutomaticModelKit_Tests"; + sourceTree = ""; + }; + 70C0BED680DCDAAD1C64E41A8A4F9DC3 /* Development Pods */ = { + isa = PBXGroup; + children = ( + E09E96310C19752E333367C459CCA522 /* AutomaticModelKit */, + ); + name = "Development Pods"; + sourceTree = ""; + }; + 7DB346D0F39D3F0E887471402A8071AB = { + isa = PBXGroup; + children = ( + 93A4A3777CF96A4AAC1D13BA6DCCEA73 /* Podfile */, + 70C0BED680DCDAAD1C64E41A8A4F9DC3 /* Development Pods */, + BC3CA7F9E30CC8F7E2DD044DD34432FC /* Frameworks */, + 5C79E8A2BB6BD3A90C37F943BFBF9175 /* Products */, + EAC0481CFCDA949AF8C7AAE6FFAE1B4F /* Targets Support Files */, + ); + sourceTree = ""; + }; + BC3CA7F9E30CC8F7E2DD044DD34432FC /* Frameworks */ = { + isa = PBXGroup; + children = ( + 5E0D919E635D23B70123790B8308F8EF /* iOS */, + ); + name = Frameworks; + sourceTree = ""; + }; + E09E96310C19752E333367C459CCA522 /* AutomaticModelKit */ = { + isa = PBXGroup; + children = ( + DC89CCE41DC79D4D7DD4B7C367F2D027 /* AutomaticCollectionViewModel.swift */, + BA9F28812D113E779759820F29C9D063 /* AutomaticTableViewModel.swift */, + 5AB275F3450D9B6CBB60C9EFF3A6E93E /* CollectionViewModel.swift */, + 8658FCB47091678CA4AEF2CAB6E58B35 /* TableViewModel.swift */, + 55DF9AFE5E05EA2E90C5007BCA90BF37 /* Pod */, + 324D1B34924D23156DBB599EE7FB5DB1 /* Support Files */, + ); + name = AutomaticModelKit; + path = ../..; + sourceTree = ""; + }; + EAC0481CFCDA949AF8C7AAE6FFAE1B4F /* Targets Support Files */ = { + isa = PBXGroup; + children = ( + 63AE3085254C2A41FF14912E7F622C86 /* Pods-AutomaticModelKit_Tests */, + ); + name = "Targets Support Files"; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXHeadersBuildPhase section */ + 8F80739D15120E0A3468C57E1A0E7A2D /* Headers */ = { + isa = PBXHeadersBuildPhase; + buildActionMask = 2147483647; + files = ( + 845227688513E29C1DFD3D43DC945D87 /* AutomaticModelKit-umbrella.h in Headers */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + AA4B6AE1E7E7F62A0C9C11845EACF3E0 /* Headers */ = { + isa = PBXHeadersBuildPhase; + buildActionMask = 2147483647; + files = ( + 4FEC61F58EACD22235A5175EBFCEC716 /* Pods-AutomaticModelKit_Tests-umbrella.h in Headers */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXHeadersBuildPhase section */ + +/* Begin PBXNativeTarget section */ + 45D69B43396CA24C881402124E6280A5 /* Pods-AutomaticModelKit_Tests */ = { + isa = PBXNativeTarget; + buildConfigurationList = 0AD54A4587AD16896036DE32A2A90DB8 /* Build configuration list for PBXNativeTarget "Pods-AutomaticModelKit_Tests" */; + buildPhases = ( + 12FD3A42F6D8D286E044066D7535EE0C /* Sources */, + D6E2510DA039032BF3F70CCA55799119 /* Frameworks */, + AA4B6AE1E7E7F62A0C9C11845EACF3E0 /* Headers */, + ); + buildRules = ( + ); + dependencies = ( + B60538AF71D8C9559C4CB44A005956C1 /* PBXTargetDependency */, + ); + name = "Pods-AutomaticModelKit_Tests"; + productName = "Pods-AutomaticModelKit_Tests"; + productReference = 1CA547443F64B30041D468CED220B20C /* Pods_AutomaticModelKit_Tests.framework */; + productType = "com.apple.product-type.framework"; + }; + F0B214DDDD09380820A831AD75AD5435 /* AutomaticModelKit */ = { + isa = PBXNativeTarget; + buildConfigurationList = 2CAB469A56B6E62901C2E44C93C53F5B /* Build configuration list for PBXNativeTarget "AutomaticModelKit" */; + buildPhases = ( + 1A445CBB1A3A0E687AB1E361BAF05E55 /* Sources */, + 274A3C2202202884544B1DBE89A044BA /* Frameworks */, + 8F80739D15120E0A3468C57E1A0E7A2D /* Headers */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = AutomaticModelKit; + productName = AutomaticModelKit; + productReference = 6F3310716BCA918889CEE1987368974C /* AutomaticModelKit.framework */; + productType = "com.apple.product-type.framework"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + D41D8CD98F00B204E9800998ECF8427E /* Project object */ = { + isa = PBXProject; + attributes = { + LastSwiftUpdateCheck = 0930; + LastUpgradeCheck = 0930; + }; + buildConfigurationList = 2D8E8EC45A3A1A1D94AE762CB5028504 /* Build configuration list for PBXProject "Pods" */; + compatibilityVersion = "Xcode 3.2"; + developmentRegion = English; + hasScannedForEncodings = 0; + knownRegions = ( + en, + ); + mainGroup = 7DB346D0F39D3F0E887471402A8071AB; + productRefGroup = 5C79E8A2BB6BD3A90C37F943BFBF9175 /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + F0B214DDDD09380820A831AD75AD5435 /* AutomaticModelKit */, + 45D69B43396CA24C881402124E6280A5 /* Pods-AutomaticModelKit_Tests */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXSourcesBuildPhase section */ + 12FD3A42F6D8D286E044066D7535EE0C /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 816DC57903B6F89C58E339CB7B942A15 /* Pods-AutomaticModelKit_Tests-dummy.m in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 1A445CBB1A3A0E687AB1E361BAF05E55 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 34114E860C59ED934659ADD6D12A5A19 /* AutomaticCollectionViewModel.swift in Sources */, + D8FBE4B2E70517D0EC596E609D538E0A /* AutomaticModelKit-dummy.m in Sources */, + A0AF07CFB3C5271F946A8640E00CD2A2 /* AutomaticTableViewModel.swift in Sources */, + A0574CE4AD3E9CB0B1CD0A02440C6D3B /* CollectionViewModel.swift in Sources */, + 0B71EAE022E025453EE74C6FF1864001 /* TableViewModel.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin PBXTargetDependency section */ + B60538AF71D8C9559C4CB44A005956C1 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + name = AutomaticModelKit; + target = F0B214DDDD09380820A831AD75AD5435 /* AutomaticModelKit */; + targetProxy = 45ABBEE52784DC15C39FC72C9E5058A4 /* PBXContainerItemProxy */; + }; +/* End PBXTargetDependency section */ + +/* Begin XCBuildConfiguration section */ + 199D972A13F2B4C56847F7A89CCA83BC /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_ENABLE_OBJC_WEAK = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = 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_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + CODE_SIGNING_ALLOWED = NO; + CODE_SIGNING_REQUIRED = NO; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = dwarf; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; + GCC_C_LANGUAGE_STANDARD = gnu11; + GCC_DYNAMIC_NO_PIC = NO; + GCC_NO_COMMON_BLOCKS = YES; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "POD_CONFIGURATION_DEBUG=1", + "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 = 9.0; + MTL_ENABLE_DEBUG_INFO = YES; + ONLY_ACTIVE_ARCH = YES; + PRODUCT_NAME = "$(TARGET_NAME)"; + STRIP_INSTALLED_PRODUCT = NO; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; + SYMROOT = "${SRCROOT}/../build"; + }; + name = Debug; + }; + 3F9796F4B099B3897EF12C39054D8388 /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = F98A61A57D92CF6FD1FCE68B1327B484 /* Pods-AutomaticModelKit_Tests.release.xcconfig */; + buildSettings = { + ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = NO; + CODE_SIGN_IDENTITY = ""; + "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; + CURRENT_PROJECT_VERSION = 1; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + INFOPLIST_FILE = "Target Support Files/Pods-AutomaticModelKit_Tests/Info.plist"; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 9.0; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + MACH_O_TYPE = staticlib; + MODULEMAP_FILE = "Target Support Files/Pods-AutomaticModelKit_Tests/Pods-AutomaticModelKit_Tests.modulemap"; + OTHER_LDFLAGS = ""; + OTHER_LIBTOOLFLAGS = ""; + PODS_ROOT = "$(SRCROOT)"; + PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.${PRODUCT_NAME:rfc1034identifier}"; + PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; + TARGETED_DEVICE_FAMILY = "1,2"; + VALIDATE_PRODUCT = YES; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Release; + }; + 998601676D5078435BED4A97426478B9 /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = C5F447AD5AE01B758C6509B8102A940E /* AutomaticModelKit.xcconfig */; + buildSettings = { + CODE_SIGN_IDENTITY = ""; + "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; + CURRENT_PROJECT_VERSION = 1; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + GCC_PREFIX_HEADER = "Target Support Files/AutomaticModelKit/AutomaticModelKit-prefix.pch"; + INFOPLIST_FILE = "Target Support Files/AutomaticModelKit/Info.plist"; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 9.0; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + MODULEMAP_FILE = "Target Support Files/AutomaticModelKit/AutomaticModelKit.modulemap"; + PRODUCT_MODULE_NAME = AutomaticModelKit; + PRODUCT_NAME = AutomaticModelKit; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; + SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; + SWIFT_VERSION = 4.0; + TARGETED_DEVICE_FAMILY = "1,2"; + VALIDATE_PRODUCT = YES; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Release; + }; + A04A9BCE0008C85E3431595F01A627ED /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = C5F447AD5AE01B758C6509B8102A940E /* AutomaticModelKit.xcconfig */; + buildSettings = { + CODE_SIGN_IDENTITY = ""; + "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; + CURRENT_PROJECT_VERSION = 1; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + GCC_PREFIX_HEADER = "Target Support Files/AutomaticModelKit/AutomaticModelKit-prefix.pch"; + INFOPLIST_FILE = "Target Support Files/AutomaticModelKit/Info.plist"; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 9.0; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + MODULEMAP_FILE = "Target Support Files/AutomaticModelKit/AutomaticModelKit.modulemap"; + PRODUCT_MODULE_NAME = AutomaticModelKit; + PRODUCT_NAME = AutomaticModelKit; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + SWIFT_VERSION = 4.0; + TARGETED_DEVICE_FAMILY = "1,2"; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Debug; + }; + B908BDAB49A194C98211985D4C066694 /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = C03EF6148CECB13CFBFC4245EE35E7C3 /* Pods-AutomaticModelKit_Tests.debug.xcconfig */; + buildSettings = { + ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = NO; + CODE_SIGN_IDENTITY = ""; + "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; + CURRENT_PROJECT_VERSION = 1; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + INFOPLIST_FILE = "Target Support Files/Pods-AutomaticModelKit_Tests/Info.plist"; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 9.0; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + MACH_O_TYPE = staticlib; + MODULEMAP_FILE = "Target Support Files/Pods-AutomaticModelKit_Tests/Pods-AutomaticModelKit_Tests.modulemap"; + OTHER_LDFLAGS = ""; + OTHER_LIBTOOLFLAGS = ""; + PODS_ROOT = "$(SRCROOT)"; + PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.${PRODUCT_NAME:rfc1034identifier}"; + PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + TARGETED_DEVICE_FAMILY = "1,2"; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Debug; + }; + FDB2FC4A1E5891381CD9D922145497F1 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_ENABLE_OBJC_WEAK = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = 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_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + CODE_SIGNING_ALLOWED = NO; + CODE_SIGNING_REQUIRED = NO; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_C_LANGUAGE_STANDARD = gnu11; + GCC_NO_COMMON_BLOCKS = YES; + GCC_PREPROCESSOR_DEFINITIONS = ( + "POD_CONFIGURATION_RELEASE=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 = 9.0; + MTL_ENABLE_DEBUG_INFO = NO; + PRODUCT_NAME = "$(TARGET_NAME)"; + STRIP_INSTALLED_PRODUCT = NO; + SYMROOT = "${SRCROOT}/../build"; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 0AD54A4587AD16896036DE32A2A90DB8 /* Build configuration list for PBXNativeTarget "Pods-AutomaticModelKit_Tests" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + B908BDAB49A194C98211985D4C066694 /* Debug */, + 3F9796F4B099B3897EF12C39054D8388 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 2CAB469A56B6E62901C2E44C93C53F5B /* Build configuration list for PBXNativeTarget "AutomaticModelKit" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + A04A9BCE0008C85E3431595F01A627ED /* Debug */, + 998601676D5078435BED4A97426478B9 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 2D8E8EC45A3A1A1D94AE762CB5028504 /* Build configuration list for PBXProject "Pods" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 199D972A13F2B4C56847F7A89CCA83BC /* Debug */, + FDB2FC4A1E5891381CD9D922145497F1 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + }; + rootObject = D41D8CD98F00B204E9800998ECF8427E /* Project object */; +} diff --git a/Example/Pods/Target Support Files/AutomaticModelKit/AutomaticModelKit-dummy.m b/Example/Pods/Target Support Files/AutomaticModelKit/AutomaticModelKit-dummy.m new file mode 100644 index 0000000..270c1c9 --- /dev/null +++ b/Example/Pods/Target Support Files/AutomaticModelKit/AutomaticModelKit-dummy.m @@ -0,0 +1,5 @@ +#import +@interface PodsDummy_AutomaticModelKit : NSObject +@end +@implementation PodsDummy_AutomaticModelKit +@end diff --git a/Example/Pods/Target Support Files/AutomaticModelKit/AutomaticModelKit-prefix.pch b/Example/Pods/Target Support Files/AutomaticModelKit/AutomaticModelKit-prefix.pch new file mode 100644 index 0000000..beb2a24 --- /dev/null +++ b/Example/Pods/Target Support Files/AutomaticModelKit/AutomaticModelKit-prefix.pch @@ -0,0 +1,12 @@ +#ifdef __OBJC__ +#import +#else +#ifndef FOUNDATION_EXPORT +#if defined(__cplusplus) +#define FOUNDATION_EXPORT extern "C" +#else +#define FOUNDATION_EXPORT extern +#endif +#endif +#endif + diff --git a/Example/Pods/Target Support Files/AutomaticModelKit/AutomaticModelKit-umbrella.h b/Example/Pods/Target Support Files/AutomaticModelKit/AutomaticModelKit-umbrella.h new file mode 100644 index 0000000..db32a3e --- /dev/null +++ b/Example/Pods/Target Support Files/AutomaticModelKit/AutomaticModelKit-umbrella.h @@ -0,0 +1,16 @@ +#ifdef __OBJC__ +#import +#else +#ifndef FOUNDATION_EXPORT +#if defined(__cplusplus) +#define FOUNDATION_EXPORT extern "C" +#else +#define FOUNDATION_EXPORT extern +#endif +#endif +#endif + + +FOUNDATION_EXPORT double AutomaticModelKitVersionNumber; +FOUNDATION_EXPORT const unsigned char AutomaticModelKitVersionString[]; + diff --git a/Example/Pods/Target Support Files/AutomaticModelKit/AutomaticModelKit.modulemap b/Example/Pods/Target Support Files/AutomaticModelKit/AutomaticModelKit.modulemap new file mode 100644 index 0000000..2a575ba --- /dev/null +++ b/Example/Pods/Target Support Files/AutomaticModelKit/AutomaticModelKit.modulemap @@ -0,0 +1,6 @@ +framework module AutomaticModelKit { + umbrella header "AutomaticModelKit-umbrella.h" + + export * + module * { export * } +} diff --git a/Example/Pods/Target Support Files/AutomaticModelKit/AutomaticModelKit.xcconfig b/Example/Pods/Target Support Files/AutomaticModelKit/AutomaticModelKit.xcconfig new file mode 100644 index 0000000..3ca6ae1 --- /dev/null +++ b/Example/Pods/Target Support Files/AutomaticModelKit/AutomaticModelKit.xcconfig @@ -0,0 +1,9 @@ +CONFIGURATION_BUILD_DIR = ${PODS_CONFIGURATION_BUILD_DIR}/AutomaticModelKit +GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 +OTHER_SWIFT_FLAGS = $(inherited) "-D" "COCOAPODS" +PODS_BUILD_DIR = ${BUILD_DIR} +PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) +PODS_ROOT = ${SRCROOT} +PODS_TARGET_SRCROOT = ${PODS_ROOT}/../.. +PRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier} +SKIP_INSTALL = YES diff --git a/Example/Pods/Target Support Files/AutomaticModelKit/Info.plist b/Example/Pods/Target Support Files/AutomaticModelKit/Info.plist new file mode 100644 index 0000000..2243fe6 --- /dev/null +++ b/Example/Pods/Target Support Files/AutomaticModelKit/Info.plist @@ -0,0 +1,26 @@ + + + + + CFBundleDevelopmentRegion + en + CFBundleExecutable + ${EXECUTABLE_NAME} + CFBundleIdentifier + ${PRODUCT_BUNDLE_IDENTIFIER} + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + ${PRODUCT_NAME} + CFBundlePackageType + FMWK + CFBundleShortVersionString + 1.0.0 + CFBundleSignature + ???? + CFBundleVersion + ${CURRENT_PROJECT_VERSION} + NSPrincipalClass + + + diff --git a/Example/Pods/Target Support Files/Pods-AutomaticModelKit_Tests/Info.plist b/Example/Pods/Target Support Files/Pods-AutomaticModelKit_Tests/Info.plist new file mode 100644 index 0000000..2243fe6 --- /dev/null +++ b/Example/Pods/Target Support Files/Pods-AutomaticModelKit_Tests/Info.plist @@ -0,0 +1,26 @@ + + + + + CFBundleDevelopmentRegion + en + CFBundleExecutable + ${EXECUTABLE_NAME} + CFBundleIdentifier + ${PRODUCT_BUNDLE_IDENTIFIER} + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + ${PRODUCT_NAME} + CFBundlePackageType + FMWK + CFBundleShortVersionString + 1.0.0 + CFBundleSignature + ???? + CFBundleVersion + ${CURRENT_PROJECT_VERSION} + NSPrincipalClass + + + diff --git a/Example/Pods/Target Support Files/Pods-AutomaticModelKit_Tests/Pods-AutomaticModelKit_Tests-acknowledgements.markdown b/Example/Pods/Target Support Files/Pods-AutomaticModelKit_Tests/Pods-AutomaticModelKit_Tests-acknowledgements.markdown new file mode 100644 index 0000000..409e383 --- /dev/null +++ b/Example/Pods/Target Support Files/Pods-AutomaticModelKit_Tests/Pods-AutomaticModelKit_Tests-acknowledgements.markdown @@ -0,0 +1,208 @@ +# Acknowledgements +This application makes use of the following third party libraries: + +## AutomaticModelKit + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "{}" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright {yyyy} {name of copyright owner} + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + +Generated by CocoaPods - https://cocoapods.org diff --git a/Example/Pods/Target Support Files/Pods-AutomaticModelKit_Tests/Pods-AutomaticModelKit_Tests-acknowledgements.plist b/Example/Pods/Target Support Files/Pods-AutomaticModelKit_Tests/Pods-AutomaticModelKit_Tests-acknowledgements.plist new file mode 100644 index 0000000..67aab76 --- /dev/null +++ b/Example/Pods/Target Support Files/Pods-AutomaticModelKit_Tests/Pods-AutomaticModelKit_Tests-acknowledgements.plist @@ -0,0 +1,240 @@ + + + + + PreferenceSpecifiers + + + FooterText + This application makes use of the following third party libraries: + Title + Acknowledgements + Type + PSGroupSpecifier + + + FooterText + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "{}" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright {yyyy} {name of copyright owner} + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + + License + Apache 2.0 + Title + AutomaticModelKit + Type + PSGroupSpecifier + + + FooterText + Generated by CocoaPods - https://cocoapods.org + Title + + Type + PSGroupSpecifier + + + StringsTable + Acknowledgements + Title + Acknowledgements + + diff --git a/Example/Pods/Target Support Files/Pods-AutomaticModelKit_Tests/Pods-AutomaticModelKit_Tests-dummy.m b/Example/Pods/Target Support Files/Pods-AutomaticModelKit_Tests/Pods-AutomaticModelKit_Tests-dummy.m new file mode 100644 index 0000000..990315d --- /dev/null +++ b/Example/Pods/Target Support Files/Pods-AutomaticModelKit_Tests/Pods-AutomaticModelKit_Tests-dummy.m @@ -0,0 +1,5 @@ +#import +@interface PodsDummy_Pods_AutomaticModelKit_Tests : NSObject +@end +@implementation PodsDummy_Pods_AutomaticModelKit_Tests +@end diff --git a/Example/Pods/Target Support Files/Pods-AutomaticModelKit_Tests/Pods-AutomaticModelKit_Tests-frameworks.sh b/Example/Pods/Target Support Files/Pods-AutomaticModelKit_Tests/Pods-AutomaticModelKit_Tests-frameworks.sh new file mode 100755 index 0000000..2bb1d5e --- /dev/null +++ b/Example/Pods/Target Support Files/Pods-AutomaticModelKit_Tests/Pods-AutomaticModelKit_Tests-frameworks.sh @@ -0,0 +1,153 @@ +#!/bin/sh +set -e +set -u +set -o pipefail + +if [ -z ${FRAMEWORKS_FOLDER_PATH+x} ]; then + # If FRAMEWORKS_FOLDER_PATH is not set, then there's nowhere for us to copy + # frameworks to, so exit 0 (signalling the script phase was successful). + exit 0 +fi + +echo "mkdir -p ${CONFIGURATION_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" +mkdir -p "${CONFIGURATION_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" + +COCOAPODS_PARALLEL_CODE_SIGN="${COCOAPODS_PARALLEL_CODE_SIGN:-false}" +SWIFT_STDLIB_PATH="${DT_TOOLCHAIN_DIR}/usr/lib/swift/${PLATFORM_NAME}" + +# Used as a return value for each invocation of `strip_invalid_archs` function. +STRIP_BINARY_RETVAL=0 + +# This protects against multiple targets copying the same framework dependency at the same time. The solution +# was originally proposed here: https://lists.samba.org/archive/rsync/2008-February/020158.html +RSYNC_PROTECT_TMP_FILES=(--filter "P .*.??????") + +# Copies and strips a vendored framework +install_framework() +{ + if [ -r "${BUILT_PRODUCTS_DIR}/$1" ]; then + local source="${BUILT_PRODUCTS_DIR}/$1" + elif [ -r "${BUILT_PRODUCTS_DIR}/$(basename "$1")" ]; then + local source="${BUILT_PRODUCTS_DIR}/$(basename "$1")" + elif [ -r "$1" ]; then + local source="$1" + fi + + local destination="${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" + + if [ -L "${source}" ]; then + echo "Symlinked..." + source="$(readlink "${source}")" + fi + + # Use filter instead of exclude so missing patterns don't throw errors. + echo "rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --filter \"- CVS/\" --filter \"- .svn/\" --filter \"- .git/\" --filter \"- .hg/\" --filter \"- Headers\" --filter \"- PrivateHeaders\" --filter \"- Modules\" \"${source}\" \"${destination}\"" + rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --filter "- CVS/" --filter "- .svn/" --filter "- .git/" --filter "- .hg/" --filter "- Headers" --filter "- PrivateHeaders" --filter "- Modules" "${source}" "${destination}" + + local basename + basename="$(basename -s .framework "$1")" + binary="${destination}/${basename}.framework/${basename}" + if ! [ -r "$binary" ]; then + binary="${destination}/${basename}" + fi + + # Strip invalid architectures so "fat" simulator / device frameworks work on device + if [[ "$(file "$binary")" == *"dynamically linked shared library"* ]]; then + strip_invalid_archs "$binary" + fi + + # Resign the code if required by the build settings to avoid unstable apps + code_sign_if_enabled "${destination}/$(basename "$1")" + + # Embed linked Swift runtime libraries. No longer necessary as of Xcode 7. + if [ "${XCODE_VERSION_MAJOR}" -lt 7 ]; then + local swift_runtime_libs + swift_runtime_libs=$(xcrun otool -LX "$binary" | grep --color=never @rpath/libswift | sed -E s/@rpath\\/\(.+dylib\).*/\\1/g | uniq -u && exit ${PIPESTATUS[0]}) + for lib in $swift_runtime_libs; do + echo "rsync -auv \"${SWIFT_STDLIB_PATH}/${lib}\" \"${destination}\"" + rsync -auv "${SWIFT_STDLIB_PATH}/${lib}" "${destination}" + code_sign_if_enabled "${destination}/${lib}" + done + fi +} + +# Copies and strips a vendored dSYM +install_dsym() { + local source="$1" + if [ -r "$source" ]; then + # Copy the dSYM into a the targets temp dir. + echo "rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --filter \"- CVS/\" --filter \"- .svn/\" --filter \"- .git/\" --filter \"- .hg/\" --filter \"- Headers\" --filter \"- PrivateHeaders\" --filter \"- Modules\" \"${source}\" \"${DERIVED_FILES_DIR}\"" + rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --filter "- CVS/" --filter "- .svn/" --filter "- .git/" --filter "- .hg/" --filter "- Headers" --filter "- PrivateHeaders" --filter "- Modules" "${source}" "${DERIVED_FILES_DIR}" + + local basename + basename="$(basename -s .framework.dSYM "$source")" + binary="${DERIVED_FILES_DIR}/${basename}.framework.dSYM/Contents/Resources/DWARF/${basename}" + + # Strip invalid architectures so "fat" simulator / device frameworks work on device + if [[ "$(file "$binary")" == *"Mach-O dSYM companion"* ]]; then + strip_invalid_archs "$binary" + fi + + if [[ $STRIP_BINARY_RETVAL == 1 ]]; then + # Move the stripped file into its final destination. + echo "rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --filter \"- CVS/\" --filter \"- .svn/\" --filter \"- .git/\" --filter \"- .hg/\" --filter \"- Headers\" --filter \"- PrivateHeaders\" --filter \"- Modules\" \"${DERIVED_FILES_DIR}/${basename}.framework.dSYM\" \"${DWARF_DSYM_FOLDER_PATH}\"" + rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --filter "- CVS/" --filter "- .svn/" --filter "- .git/" --filter "- .hg/" --filter "- Headers" --filter "- PrivateHeaders" --filter "- Modules" "${DERIVED_FILES_DIR}/${basename}.framework.dSYM" "${DWARF_DSYM_FOLDER_PATH}" + else + # The dSYM was not stripped at all, in this case touch a fake folder so the input/output paths from Xcode do not reexecute this script because the file is missing. + touch "${DWARF_DSYM_FOLDER_PATH}/${basename}.framework.dSYM" + fi + fi +} + +# Signs a framework with the provided identity +code_sign_if_enabled() { + if [ -n "${EXPANDED_CODE_SIGN_IDENTITY}" -a "${CODE_SIGNING_REQUIRED:-}" != "NO" -a "${CODE_SIGNING_ALLOWED}" != "NO" ]; then + # Use the current code_sign_identitiy + echo "Code Signing $1 with Identity ${EXPANDED_CODE_SIGN_IDENTITY_NAME}" + local code_sign_cmd="/usr/bin/codesign --force --sign ${EXPANDED_CODE_SIGN_IDENTITY} ${OTHER_CODE_SIGN_FLAGS:-} --preserve-metadata=identifier,entitlements '$1'" + + if [ "${COCOAPODS_PARALLEL_CODE_SIGN}" == "true" ]; then + code_sign_cmd="$code_sign_cmd &" + fi + echo "$code_sign_cmd" + eval "$code_sign_cmd" + fi +} + +# Strip invalid architectures +strip_invalid_archs() { + binary="$1" + # Get architectures for current target binary + binary_archs="$(lipo -info "$binary" | rev | cut -d ':' -f1 | awk '{$1=$1;print}' | rev)" + # Intersect them with the architectures we are building for + intersected_archs="$(echo ${ARCHS[@]} ${binary_archs[@]} | tr ' ' '\n' | sort | uniq -d)" + # If there are no archs supported by this binary then warn the user + if [[ -z "$intersected_archs" ]]; then + echo "warning: [CP] Vendored binary '$binary' contains architectures ($binary_archs) none of which match the current build architectures ($ARCHS)." + STRIP_BINARY_RETVAL=0 + return + fi + stripped="" + for arch in $binary_archs; do + if ! [[ "${ARCHS}" == *"$arch"* ]]; then + # Strip non-valid architectures in-place + lipo -remove "$arch" -output "$binary" "$binary" || exit 1 + stripped="$stripped $arch" + fi + done + if [[ "$stripped" ]]; then + echo "Stripped $binary of architectures:$stripped" + fi + STRIP_BINARY_RETVAL=1 +} + + +if [[ "$CONFIGURATION" == "Debug" ]]; then + install_framework "${BUILT_PRODUCTS_DIR}/AutomaticModelKit/AutomaticModelKit.framework" +fi +if [[ "$CONFIGURATION" == "Release" ]]; then + install_framework "${BUILT_PRODUCTS_DIR}/AutomaticModelKit/AutomaticModelKit.framework" +fi +if [ "${COCOAPODS_PARALLEL_CODE_SIGN}" == "true" ]; then + wait +fi diff --git a/Example/Pods/Target Support Files/Pods-AutomaticModelKit_Tests/Pods-AutomaticModelKit_Tests-resources.sh b/Example/Pods/Target Support Files/Pods-AutomaticModelKit_Tests/Pods-AutomaticModelKit_Tests-resources.sh new file mode 100755 index 0000000..345301f --- /dev/null +++ b/Example/Pods/Target Support Files/Pods-AutomaticModelKit_Tests/Pods-AutomaticModelKit_Tests-resources.sh @@ -0,0 +1,118 @@ +#!/bin/sh +set -e +set -u +set -o pipefail + +if [ -z ${UNLOCALIZED_RESOURCES_FOLDER_PATH+x} ]; then + # If UNLOCALIZED_RESOURCES_FOLDER_PATH is not set, then there's nowhere for us to copy + # resources to, so exit 0 (signalling the script phase was successful). + exit 0 +fi + +mkdir -p "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" + +RESOURCES_TO_COPY=${PODS_ROOT}/resources-to-copy-${TARGETNAME}.txt +> "$RESOURCES_TO_COPY" + +XCASSET_FILES=() + +# This protects against multiple targets copying the same framework dependency at the same time. The solution +# was originally proposed here: https://lists.samba.org/archive/rsync/2008-February/020158.html +RSYNC_PROTECT_TMP_FILES=(--filter "P .*.??????") + +case "${TARGETED_DEVICE_FAMILY:-}" in + 1,2) + TARGET_DEVICE_ARGS="--target-device ipad --target-device iphone" + ;; + 1) + TARGET_DEVICE_ARGS="--target-device iphone" + ;; + 2) + TARGET_DEVICE_ARGS="--target-device ipad" + ;; + 3) + TARGET_DEVICE_ARGS="--target-device tv" + ;; + 4) + TARGET_DEVICE_ARGS="--target-device watch" + ;; + *) + TARGET_DEVICE_ARGS="--target-device mac" + ;; +esac + +install_resource() +{ + if [[ "$1" = /* ]] ; then + RESOURCE_PATH="$1" + else + RESOURCE_PATH="${PODS_ROOT}/$1" + fi + if [[ ! -e "$RESOURCE_PATH" ]] ; then + cat << EOM +error: Resource "$RESOURCE_PATH" not found. Run 'pod install' to update the copy resources script. +EOM + exit 1 + fi + case $RESOURCE_PATH in + *.storyboard) + echo "ibtool --reference-external-strings-file --errors --warnings --notices --minimum-deployment-target ${!DEPLOYMENT_TARGET_SETTING_NAME} --output-format human-readable-text --compile ${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \"$RESOURCE_PATH\" .storyboard`.storyboardc $RESOURCE_PATH --sdk ${SDKROOT} ${TARGET_DEVICE_ARGS}" || true + ibtool --reference-external-strings-file --errors --warnings --notices --minimum-deployment-target ${!DEPLOYMENT_TARGET_SETTING_NAME} --output-format human-readable-text --compile "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \"$RESOURCE_PATH\" .storyboard`.storyboardc" "$RESOURCE_PATH" --sdk "${SDKROOT}" ${TARGET_DEVICE_ARGS} + ;; + *.xib) + echo "ibtool --reference-external-strings-file --errors --warnings --notices --minimum-deployment-target ${!DEPLOYMENT_TARGET_SETTING_NAME} --output-format human-readable-text --compile ${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \"$RESOURCE_PATH\" .xib`.nib $RESOURCE_PATH --sdk ${SDKROOT} ${TARGET_DEVICE_ARGS}" || true + ibtool --reference-external-strings-file --errors --warnings --notices --minimum-deployment-target ${!DEPLOYMENT_TARGET_SETTING_NAME} --output-format human-readable-text --compile "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \"$RESOURCE_PATH\" .xib`.nib" "$RESOURCE_PATH" --sdk "${SDKROOT}" ${TARGET_DEVICE_ARGS} + ;; + *.framework) + echo "mkdir -p ${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" || true + mkdir -p "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" + echo "rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" $RESOURCE_PATH ${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" || true + rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" "$RESOURCE_PATH" "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" + ;; + *.xcdatamodel) + echo "xcrun momc \"$RESOURCE_PATH\" \"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$RESOURCE_PATH"`.mom\"" || true + xcrun momc "$RESOURCE_PATH" "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$RESOURCE_PATH" .xcdatamodel`.mom" + ;; + *.xcdatamodeld) + echo "xcrun momc \"$RESOURCE_PATH\" \"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$RESOURCE_PATH" .xcdatamodeld`.momd\"" || true + xcrun momc "$RESOURCE_PATH" "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$RESOURCE_PATH" .xcdatamodeld`.momd" + ;; + *.xcmappingmodel) + echo "xcrun mapc \"$RESOURCE_PATH\" \"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$RESOURCE_PATH" .xcmappingmodel`.cdm\"" || true + xcrun mapc "$RESOURCE_PATH" "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$RESOURCE_PATH" .xcmappingmodel`.cdm" + ;; + *.xcassets) + ABSOLUTE_XCASSET_FILE="$RESOURCE_PATH" + XCASSET_FILES+=("$ABSOLUTE_XCASSET_FILE") + ;; + *) + echo "$RESOURCE_PATH" || true + echo "$RESOURCE_PATH" >> "$RESOURCES_TO_COPY" + ;; + esac +} + +mkdir -p "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" +rsync -avr --copy-links --no-relative --exclude '*/.svn/*' --files-from="$RESOURCES_TO_COPY" / "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" +if [[ "${ACTION}" == "install" ]] && [[ "${SKIP_INSTALL}" == "NO" ]]; then + mkdir -p "${INSTALL_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" + rsync -avr --copy-links --no-relative --exclude '*/.svn/*' --files-from="$RESOURCES_TO_COPY" / "${INSTALL_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" +fi +rm -f "$RESOURCES_TO_COPY" + +if [[ -n "${WRAPPER_EXTENSION}" ]] && [ "`xcrun --find actool`" ] && [ -n "${XCASSET_FILES:-}" ] +then + # Find all other xcassets (this unfortunately includes those of path pods and other targets). + OTHER_XCASSETS=$(find "$PWD" -iname "*.xcassets" -type d) + while read line; do + if [[ $line != "${PODS_ROOT}*" ]]; then + XCASSET_FILES+=("$line") + fi + done <<<"$OTHER_XCASSETS" + + if [ -z ${ASSETCATALOG_COMPILER_APPICON_NAME+x} ]; then + printf "%s\0" "${XCASSET_FILES[@]}" | xargs -0 xcrun actool --output-format human-readable-text --notices --warnings --platform "${PLATFORM_NAME}" --minimum-deployment-target "${!DEPLOYMENT_TARGET_SETTING_NAME}" ${TARGET_DEVICE_ARGS} --compress-pngs --compile "${BUILT_PRODUCTS_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" + else + printf "%s\0" "${XCASSET_FILES[@]}" | xargs -0 xcrun actool --output-format human-readable-text --notices --warnings --platform "${PLATFORM_NAME}" --minimum-deployment-target "${!DEPLOYMENT_TARGET_SETTING_NAME}" ${TARGET_DEVICE_ARGS} --compress-pngs --compile "${BUILT_PRODUCTS_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" --app-icon "${ASSETCATALOG_COMPILER_APPICON_NAME}" --output-partial-info-plist "${TARGET_TEMP_DIR}/assetcatalog_generated_info_cocoapods.plist" + fi +fi diff --git a/Example/Pods/Target Support Files/Pods-AutomaticModelKit_Tests/Pods-AutomaticModelKit_Tests-umbrella.h b/Example/Pods/Target Support Files/Pods-AutomaticModelKit_Tests/Pods-AutomaticModelKit_Tests-umbrella.h new file mode 100644 index 0000000..006bd6d --- /dev/null +++ b/Example/Pods/Target Support Files/Pods-AutomaticModelKit_Tests/Pods-AutomaticModelKit_Tests-umbrella.h @@ -0,0 +1,16 @@ +#ifdef __OBJC__ +#import +#else +#ifndef FOUNDATION_EXPORT +#if defined(__cplusplus) +#define FOUNDATION_EXPORT extern "C" +#else +#define FOUNDATION_EXPORT extern +#endif +#endif +#endif + + +FOUNDATION_EXPORT double Pods_AutomaticModelKit_TestsVersionNumber; +FOUNDATION_EXPORT const unsigned char Pods_AutomaticModelKit_TestsVersionString[]; + diff --git a/Example/Pods/Target Support Files/Pods-AutomaticModelKit_Tests/Pods-AutomaticModelKit_Tests.debug.xcconfig b/Example/Pods/Target Support Files/Pods-AutomaticModelKit_Tests/Pods-AutomaticModelKit_Tests.debug.xcconfig new file mode 100644 index 0000000..712027b --- /dev/null +++ b/Example/Pods/Target Support Files/Pods-AutomaticModelKit_Tests/Pods-AutomaticModelKit_Tests.debug.xcconfig @@ -0,0 +1,11 @@ +ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES +FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/AutomaticModelKit" +GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 +LD_RUNPATH_SEARCH_PATHS = $(inherited) '@executable_path/Frameworks' '@loader_path/Frameworks' +OTHER_CFLAGS = $(inherited) -iquote "${PODS_CONFIGURATION_BUILD_DIR}/AutomaticModelKit/AutomaticModelKit.framework/Headers" +OTHER_LDFLAGS = $(inherited) -framework "AutomaticModelKit" +OTHER_SWIFT_FLAGS = $(inherited) "-D" "COCOAPODS" +PODS_BUILD_DIR = ${BUILD_DIR} +PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) +PODS_PODFILE_DIR_PATH = ${SRCROOT}/. +PODS_ROOT = ${SRCROOT}/Pods diff --git a/Example/Pods/Target Support Files/Pods-AutomaticModelKit_Tests/Pods-AutomaticModelKit_Tests.modulemap b/Example/Pods/Target Support Files/Pods-AutomaticModelKit_Tests/Pods-AutomaticModelKit_Tests.modulemap new file mode 100644 index 0000000..6ef7acc --- /dev/null +++ b/Example/Pods/Target Support Files/Pods-AutomaticModelKit_Tests/Pods-AutomaticModelKit_Tests.modulemap @@ -0,0 +1,6 @@ +framework module Pods_AutomaticModelKit_Tests { + umbrella header "Pods-AutomaticModelKit_Tests-umbrella.h" + + export * + module * { export * } +} diff --git a/Example/Pods/Target Support Files/Pods-AutomaticModelKit_Tests/Pods-AutomaticModelKit_Tests.release.xcconfig b/Example/Pods/Target Support Files/Pods-AutomaticModelKit_Tests/Pods-AutomaticModelKit_Tests.release.xcconfig new file mode 100644 index 0000000..712027b --- /dev/null +++ b/Example/Pods/Target Support Files/Pods-AutomaticModelKit_Tests/Pods-AutomaticModelKit_Tests.release.xcconfig @@ -0,0 +1,11 @@ +ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES +FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/AutomaticModelKit" +GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 +LD_RUNPATH_SEARCH_PATHS = $(inherited) '@executable_path/Frameworks' '@loader_path/Frameworks' +OTHER_CFLAGS = $(inherited) -iquote "${PODS_CONFIGURATION_BUILD_DIR}/AutomaticModelKit/AutomaticModelKit.framework/Headers" +OTHER_LDFLAGS = $(inherited) -framework "AutomaticModelKit" +OTHER_SWIFT_FLAGS = $(inherited) "-D" "COCOAPODS" +PODS_BUILD_DIR = ${BUILD_DIR} +PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) +PODS_PODFILE_DIR_PATH = ${SRCROOT}/. +PODS_ROOT = ${SRCROOT}/Pods diff --git a/Example/Tests/Info.plist b/Example/Tests/Info.plist new file mode 100644 index 0000000..ba72822 --- /dev/null +++ b/Example/Tests/Info.plist @@ -0,0 +1,24 @@ + + + + + CFBundleDevelopmentRegion + en + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + $(PRODUCT_NAME) + CFBundlePackageType + BNDL + CFBundleShortVersionString + 1.0 + CFBundleSignature + ???? + CFBundleVersion + 1 + + diff --git a/Example/Tests/Tests.swift b/Example/Tests/Tests.swift new file mode 100644 index 0000000..eec3186 --- /dev/null +++ b/Example/Tests/Tests.swift @@ -0,0 +1,28 @@ +import XCTest +import AutomaticModelKit + +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/LICENSE b/LICENSE new file mode 100644 index 0000000..8dada3e --- /dev/null +++ b/LICENSE @@ -0,0 +1,201 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "{}" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright {yyyy} {name of copyright owner} + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/NOTICE b/NOTICE new file mode 100644 index 0000000..64d36bb --- /dev/null +++ b/NOTICE @@ -0,0 +1,2 @@ +AutomaticModelKit +Copyright 2016-2018 Georges Boumis diff --git a/README.md b/README.md new file mode 100644 index 0000000..59dcb33 --- /dev/null +++ b/README.md @@ -0,0 +1,19 @@ +# AutomaticModelKit + +A reusable strong typed data source for UITableView and UICollectionView + +## Example + +To run the example project, clone the repo, and run `pod install` from the Example directory first. + +## Requirements + +## Installation + +## Author + +Georges Boumis, developer.george.boumis@gmail.com + +## License + +AutomaticModelKit is available under the Apache 2.0 license. See the LICENSE file for more info. diff --git a/_Pods.xcodeproj b/_Pods.xcodeproj new file mode 120000 index 0000000..3c5a8e7 --- /dev/null +++ b/_Pods.xcodeproj @@ -0,0 +1 @@ +Example/Pods/Pods.xcodeproj \ No newline at end of file