├── Zen ├── ZenExample │ ├── Assets.xcassets │ │ ├── Contents.json │ │ └── AppIcon.appiconset │ │ │ └── Contents.json │ ├── Models │ │ └── Todo.swift │ ├── Networking │ │ └── APIClient.swift │ ├── ViewController.swift │ ├── AppDelegate.swift │ ├── Base.lproj │ │ ├── Main.storyboard │ │ └── LaunchScreen.storyboard │ ├── Info.plist │ └── SceneDelegate.swift ├── Zen.xcodeproj │ ├── project.xcworkspace │ │ ├── contents.xcworkspacedata │ │ └── xcshareddata │ │ │ ├── IDEWorkspaceChecks.plist │ │ │ └── swiftpm │ │ │ └── Package.resolved │ ├── xcshareddata │ │ └── xcschemes │ │ │ └── Zen.xcscheme │ └── project.pbxproj └── Zen │ ├── Zen.h │ └── Info.plist ├── Tests ├── LinuxMain.swift └── ZenTests │ ├── XCTestManifests.swift │ ├── Model │ ├── Todo.swift │ ├── User.swift │ └── Users.swift │ ├── Networking │ └── APIClient.swift │ └── ZenTests.swift ├── .swiftpm └── xcode │ └── package.xcworkspace │ └── contents.xcworkspacedata ├── Sources └── Zen │ ├── ZenError.swift │ ├── RequestParameters.swift │ └── ZenRequest.swift ├── Package.resolved ├── .github ├── workflows │ ├── deploy.yml │ └── build.yml ├── ISSUE_TEMPLATE │ ├── bug_report.md │ └── feature_request.md └── pull_request_template.md ├── LICENSE ├── Package.swift ├── Zen.podspec ├── .gitignore └── README.md /Zen/ZenExample/Assets.xcassets/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "version" : 1, 4 | "author" : "xcode" 5 | } 6 | } -------------------------------------------------------------------------------- /Tests/LinuxMain.swift: -------------------------------------------------------------------------------- 1 | import XCTest 2 | 3 | import ZenTests 4 | 5 | var tests = [XCTestCaseEntry]() 6 | tests += ZenTests.allTests() 7 | XCTMain(tests) 8 | -------------------------------------------------------------------------------- /.swiftpm/xcode/package.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /Zen/Zen.xcodeproj/project.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /Tests/ZenTests/XCTestManifests.swift: -------------------------------------------------------------------------------- 1 | import XCTest 2 | 3 | #if !canImport(ObjectiveC) 4 | public func allTests() -> [XCTestCaseEntry] { 5 | return [ 6 | testCase(ZenTests.allTests), 7 | ] 8 | } 9 | #endif 10 | -------------------------------------------------------------------------------- /Sources/Zen/ZenError.swift: -------------------------------------------------------------------------------- 1 | // 2 | // ZenError.swift 3 | // 4 | // 5 | // Created by KarimEbrahem on 7/19/20. 6 | // 7 | 8 | import Foundation 9 | 10 | public enum ZenError: Error { 11 | case RequestBuilderFailed 12 | case DecodingResponseFailed 13 | } 14 | -------------------------------------------------------------------------------- /Tests/ZenTests/Model/Todo.swift: -------------------------------------------------------------------------------- 1 | // 2 | // Todo.swift 3 | // 4 | // 5 | // Created by KarimEbrahem on 7/19/20. 6 | // 7 | 8 | import Foundation 9 | 10 | struct Todo: Codable { 11 | var userId: Int 12 | var id: Int 13 | var title: String 14 | var completed: Bool 15 | } 16 | -------------------------------------------------------------------------------- /Tests/ZenTests/Model/User.swift: -------------------------------------------------------------------------------- 1 | // 2 | // User.swift 3 | // 4 | // 5 | // Created by KarimEbrahem on 7/20/20. 6 | // 7 | 8 | import Foundation 9 | 10 | struct User: Codable { 11 | var id: String 12 | var name: String 13 | var job: String 14 | var createdAt: String 15 | } 16 | -------------------------------------------------------------------------------- /Zen/Zen.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | IDEDidComputeMac32BitWarning 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /Zen/ZenExample/Models/Todo.swift: -------------------------------------------------------------------------------- 1 | // 2 | // Todo.swift 3 | // ZenExample 4 | // 5 | // Created by Karim Ebrahem on 4/7/20. 6 | // Copyright © 2020 Karim Ebrahem. All rights reserved. 7 | // 8 | 9 | struct Todo: Codable { 10 | var userId: Int 11 | var id: Int 12 | var title: String 13 | var completed: Bool 14 | } 15 | -------------------------------------------------------------------------------- /Zen/ZenExample/Networking/APIClient.swift: -------------------------------------------------------------------------------- 1 | // 2 | // APIClient.swift 3 | // ZenExample 4 | // 5 | // Created by Karim Ebrahem on 4/7/20. 6 | // Copyright © 2020 Karim Ebrahem. All rights reserved. 7 | // 8 | 9 | import Foundation 10 | import Zen 11 | 12 | class APIClient { 13 | @ZenRequest("https://jsonplaceholder.typicode.com/todos/") 14 | static var fetchTodo: Service 15 | } 16 | -------------------------------------------------------------------------------- /Package.resolved: -------------------------------------------------------------------------------- 1 | { 2 | "object": { 3 | "pins": [ 4 | { 5 | "package": "Alamofire", 6 | "repositoryURL": "https://github.com/Alamofire/Alamofire.git", 7 | "state": { 8 | "branch": null, 9 | "revision": "fca036f7aeca07124067cb6e0c12b0ad6359e3d4", 10 | "version": "5.1.0" 11 | } 12 | } 13 | ] 14 | }, 15 | "version": 1 16 | } 17 | -------------------------------------------------------------------------------- /.github/workflows/deploy.yml: -------------------------------------------------------------------------------- 1 | name: Deploy 2 | 3 | on: 4 | push: 5 | tags: 6 | - '*' 7 | 8 | jobs: 9 | build: 10 | 11 | runs-on: macos-latest 12 | 13 | steps: 14 | - uses: actions/checkout@v1 15 | 16 | - name: Deploy to Cocoapods 17 | run: | 18 | set -eo pipefail 19 | pod lib lint --allow-warnings 20 | pod trunk push --allow-warnings 21 | env: 22 | COCOAPODS_TRUNK_TOKEN: ${{ secrets.COCOAPODS_TRUNK_TOKEN }} 23 | -------------------------------------------------------------------------------- /Tests/ZenTests/Networking/APIClient.swift: -------------------------------------------------------------------------------- 1 | // 2 | // APIClient.swift 3 | // 4 | // 5 | // Created by KarimEbrahem on 7/19/20. 6 | // 7 | 8 | import Foundation 9 | import Zen 10 | 11 | class APIClient { 12 | @ZenRequest("https://jsonplaceholder.typicode.com/todos/") 13 | static var fetchTodo: Service 14 | 15 | @ZenRequest("https://reqres.in/api/users") 16 | static var fetchUsers: Service 17 | 18 | @ZenRequest("https://reqres.in/api/users") 19 | static var createUser: Service 20 | } 21 | -------------------------------------------------------------------------------- /Zen/Zen/Zen.h: -------------------------------------------------------------------------------- 1 | // 2 | // Zen.h 3 | // Zen 4 | // 5 | // Created by Karim Ebrahem on 4/7/20. 6 | // Copyright © 2020 Karim Ebrahem. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | //! Project version number for Zen. 12 | FOUNDATION_EXPORT double ZenVersionNumber; 13 | 14 | //! Project version string for Zen. 15 | FOUNDATION_EXPORT const unsigned char ZenVersionString[]; 16 | 17 | // In this header, you should import all the public headers of your framework using statements like #import 18 | 19 | 20 | -------------------------------------------------------------------------------- /Tests/ZenTests/Model/Users.swift: -------------------------------------------------------------------------------- 1 | // 2 | // Users.swift 3 | // 4 | // 5 | // Created by KarimEbrahem on 7/20/20. 6 | // 7 | 8 | import Foundation 9 | 10 | struct Users: Codable { 11 | var page: Int 12 | var per_page: Int 13 | var total: Int 14 | var total_pages: Int 15 | var data: [UserList] 16 | var ad: Ad 17 | } 18 | 19 | struct UserList: Codable { 20 | var id: Int 21 | var email: String 22 | var first_name: String 23 | var last_name: String 24 | var avatar: String 25 | } 26 | 27 | struct Ad: Codable { 28 | var company: String 29 | var url: String 30 | var text: String 31 | } 32 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/bug_report.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: Bug report 3 | about: Create a report to help us improve 4 | title: '' 5 | labels: bug 6 | assignees: KarimEbrahemAbdelaziz 7 | 8 | --- 9 | 10 | **Describe the bug** 11 | A clear and concise description of what the bug is. 12 | 13 | **To Reproduce** 14 | Steps to reproduce the behavior. 15 | 16 | **Expected behavior** 17 | A clear and concise description of what you expected to happen. 18 | 19 | **Smartphone (please complete the following information):** 20 | - Device: [e.g. iPhone6] 21 | - OS: [e.g. iOS8.1] 22 | - Zen Version [e.g. 0.1.1] 23 | 24 | **Additional context** 25 | Add any other context about the problem here. 26 | -------------------------------------------------------------------------------- /.github/workflows/build.yml: -------------------------------------------------------------------------------- 1 | name: Build 2 | 3 | # Controls when the action will run. Triggers the workflow on push or pull request 4 | # events but only for the master branch 5 | on: 6 | push: 7 | branches: [ master ] 8 | pull_request: 9 | branches: [ master ] 10 | 11 | jobs: 12 | test: 13 | name: Build 14 | runs-on: macos-latest 15 | strategy: 16 | matrix: 17 | destination: ['platform=iOS Simulator,OS=13.5,name=iPhone 11 Pro Max'] 18 | steps: 19 | - name: Checkout 20 | uses: actions/checkout@master 21 | 22 | - name: Lint 23 | run: | 24 | set -eo pipefail 25 | pod lib lint --allow-warnings 26 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/feature_request.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: Feature request 3 | about: Suggest an idea for this project 4 | title: '' 5 | labels: Feature 6 | assignees: KarimEbrahemAbdelaziz 7 | 8 | --- 9 | 10 | **Is your feature request related to a problem? Please describe.** 11 | A clear and concise description of what the problem is. Ex. I'm always frustrated when [...] 12 | 13 | **Describe the solution you'd like** 14 | A clear and concise description of what you want to happen. 15 | 16 | **Describe alternatives you've considered** 17 | A clear and concise description of any alternative solutions or features you've considered. 18 | 19 | **Additional context** 20 | Add any other context or screenshots about the feature request here. 21 | -------------------------------------------------------------------------------- /Zen/Zen.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved: -------------------------------------------------------------------------------- 1 | { 2 | "object": { 3 | "pins": [ 4 | { 5 | "package": "Alamofire", 6 | "repositoryURL": "https://github.com/Alamofire/Alamofire.git", 7 | "state": { 8 | "branch": null, 9 | "revision": "fca036f7aeca07124067cb6e0c12b0ad6359e3d4", 10 | "version": "5.1.0" 11 | } 12 | }, 13 | { 14 | "package": "Zen", 15 | "repositoryURL": "https://github.com/KarimEbrahemAbdelaziz/Zen.git", 16 | "state": { 17 | "branch": null, 18 | "revision": "04677faa802ef7f2cde1c79ca36479d9d6d53c23", 19 | "version": "0.1.3" 20 | } 21 | } 22 | ] 23 | }, 24 | "version": 1 25 | } 26 | -------------------------------------------------------------------------------- /Sources/Zen/RequestParameters.swift: -------------------------------------------------------------------------------- 1 | // 2 | // RequestParameters.swift 3 | // 4 | // 5 | // Created by KarimEbrahem on 7/19/20. 6 | // 7 | 8 | import Foundation 9 | import Alamofire 10 | 11 | public enum RequestParameters { 12 | case body([String: String]?) 13 | case url([String: String]?) 14 | 15 | var parameters: [String: String]? { 16 | switch self { 17 | case .body(let parameters), .url(let parameters): 18 | return parameters 19 | } 20 | } 21 | 22 | var encoder: ParameterEncoder { 23 | switch self { 24 | case .body: 25 | return JSONParameterEncoder.default 26 | case .url: 27 | return URLEncodedFormParameterEncoder.default 28 | } 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /Zen/Zen/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | $(DEVELOPMENT_LANGUAGE) 7 | CFBundleExecutable 8 | $(EXECUTABLE_NAME) 9 | CFBundleIdentifier 10 | $(PRODUCT_BUNDLE_IDENTIFIER) 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | $(PRODUCT_NAME) 15 | CFBundlePackageType 16 | $(PRODUCT_BUNDLE_PACKAGE_TYPE) 17 | CFBundleShortVersionString 18 | 1.0 19 | CFBundleVersion 20 | $(CURRENT_PROJECT_VERSION) 21 | 22 | 23 | -------------------------------------------------------------------------------- /Zen/ZenExample/ViewController.swift: -------------------------------------------------------------------------------- 1 | // 2 | // ViewController.swift 3 | // ZenExample 4 | // 5 | // Created by Karim Ebrahem on 4/7/20. 6 | // Copyright © 2020 Karim Ebrahem. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | import Zen 11 | 12 | class ViewController: UIViewController { 13 | 14 | override func viewDidLoad() { 15 | super.viewDidLoad() 16 | 17 | fetchTodo() 18 | } 19 | 20 | private func fetchTodo() { 21 | try? APIClient.$fetchTodo 22 | .set(method: .get) 23 | .set(path: "1") 24 | .build() 25 | 26 | APIClient.fetchTodo { result in 27 | switch result { 28 | case .success(let todo): 29 | print(todo.title) 30 | case .failure(let error): 31 | print(error) 32 | } 33 | } 34 | } 35 | 36 | } 37 | 38 | -------------------------------------------------------------------------------- /.github/pull_request_template.md: -------------------------------------------------------------------------------- 1 | ### Explanation: 2 | - Please write explanation of what your changes do and why you'd like us to include them. 3 | 4 | ### Issue Number: 5 | - Please mention Issue number that related to this PR. 6 | - If your PR is not related to an Open Issue, Please open one and link it to the PR. 7 | 8 | ### Reviewer: 9 | - Please mention reviewer for this PR. 10 | 11 | ### All Submissions: 12 | 13 | * [ ] Do your PR related to an Open Issue? 14 | * [ ] Have you checked to ensure there aren't other open [Pull Requests](https://github.com/KarimEbrahemAbdelaziz/Zen/pulls) for the same update/change? 15 | 16 | ### New Feature Submissions: 17 | 18 | 1. [ ] Does your submission include tests? 19 | 2. [ ] Does your submission pass tests? 20 | 3. [ ] Have you lint your code locally prior to submission? 21 | 22 | ### Changes to Core Features: 23 | 24 | * [ ] Have you added an explanation of what your changes do and why you'd like us to include them? 25 | * [ ] Have you written new tests for your core changes, as applicable? 26 | * [ ] Have you successfully ran tests with your changes locally? 27 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | Copyright (c) 2019 KarimEbrahem 2 | 3 | Permission is hereby granted, free of charge, to any person obtaining a copy 4 | of this software and associated documentation files (the "Software"), to deal 5 | in the Software without restriction, including without limitation the rights 6 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 7 | copies of the Software, and to permit persons to whom the Software is 8 | furnished to do so, subject to the following conditions: 9 | 10 | The above copyright notice and this permission notice shall be included in 11 | all copies or substantial portions of the Software. 12 | 13 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 14 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 15 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 16 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 17 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 18 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 19 | THE SOFTWARE. 20 | -------------------------------------------------------------------------------- /Package.swift: -------------------------------------------------------------------------------- 1 | // swift-tools-version:5.1 2 | // The swift-tools-version declares the minimum version of Swift required to build this package. 3 | 4 | import PackageDescription 5 | 6 | let package = Package( 7 | name: "Zen", 8 | platforms: [ 9 | // Add support for all platforms starting from a specific version. 10 | .macOS(.v10_12), 11 | .iOS(.v13), 12 | ], 13 | products: [ 14 | // Products define the executables and libraries produced by a package, and make them visible to other packages. 15 | .library( 16 | name: "Zen", 17 | targets: ["Zen"]), 18 | ], 19 | dependencies: [ 20 | // Dependencies declare other packages that this package depends on. 21 | // .package(url: /* package url */, from: "1.0.0"), 22 | .package(url: "https://github.com/Alamofire/Alamofire.git", .upToNextMajor(from: "5.1.0")) 23 | ], 24 | targets: [ 25 | // Targets are the basic building blocks of a package. A target can define a module or a test suite. 26 | // Targets can depend on other targets in this package, and on products in packages which this package depends on. 27 | .target( 28 | name: "Zen", 29 | dependencies: ["Alamofire"]), 30 | .testTarget( 31 | name: "ZenTests", 32 | dependencies: ["Zen"]), 33 | ] 34 | ) 35 | -------------------------------------------------------------------------------- /Zen/ZenExample/AppDelegate.swift: -------------------------------------------------------------------------------- 1 | // 2 | // AppDelegate.swift 3 | // ZenExample 4 | // 5 | // Created by Karim Ebrahem on 4/7/20. 6 | // Copyright © 2020 Karim Ebrahem. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | 11 | @UIApplicationMain 12 | class AppDelegate: UIResponder, UIApplicationDelegate { 13 | 14 | 15 | 16 | func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool { 17 | // Override point for customization after application launch. 18 | return true 19 | } 20 | 21 | // MARK: UISceneSession Lifecycle 22 | 23 | func application(_ application: UIApplication, configurationForConnecting connectingSceneSession: UISceneSession, options: UIScene.ConnectionOptions) -> UISceneConfiguration { 24 | // Called when a new scene session is being created. 25 | // Use this method to select a configuration to create the new scene with. 26 | return UISceneConfiguration(name: "Default Configuration", sessionRole: connectingSceneSession.role) 27 | } 28 | 29 | func application(_ application: UIApplication, didDiscardSceneSessions sceneSessions: Set) { 30 | // Called when the user discards a scene session. 31 | // If any sessions were discarded while the application was not running, this will be called shortly after application:didFinishLaunchingWithOptions. 32 | // Use this method to release any resources that were specific to the discarded scenes, as they will not return. 33 | } 34 | 35 | 36 | } 37 | 38 | -------------------------------------------------------------------------------- /Zen.podspec: -------------------------------------------------------------------------------- 1 | # 2 | # Be sure to run `pod lib lint Zen.podspec' to ensure this is a 3 | # valid spec before submitting. 4 | # 5 | # Any lines starting with a # are optional, but their use is encouraged 6 | # To learn more about a Podspec see https://guides.cocoapods.org/syntax/podspec.html 7 | # 8 | 9 | Pod::Spec.new do |s| 10 | s.name = 'Zen' 11 | s.version = '0.1.7' 12 | s.summary = 'Zero Effort Networking Library in Swift.' 13 | 14 | # This description is used to generate tags and improve search results. 15 | # * Think: What does it do? Why did you write it? What is the focus? 16 | # * Try to keep it short, snappy and to the point. 17 | # * Write the description between the DESC delimiters below. 18 | # * Finally, don't worry about the indent, CocoaPods strips it! 19 | 20 | s.description = <<-DESC 21 | Zero Effort Networking Library built with Swift on top of Alamofire. 22 | DESC 23 | 24 | s.homepage = 'https://github.com/KarimEbrahemAbdelaziz/Zen' 25 | # s.screenshots = 'www.example.com/screenshots_1', 'www.example.com/screenshots_2' 26 | s.license = { :type => 'MIT', :file => 'LICENSE' } 27 | s.author = { 'KarimEbrahemAbdelaziz' => 'karimabdelazizmansour@gmail.com' } 28 | s.source = { :git => 'https://github.com/KarimEbrahemAbdelaziz/Zen.git', :tag => s.version.to_s } 29 | s.social_media_url = 'https://twitter.com/k_ebrahem_' 30 | 31 | s.ios.deployment_target = '13.0' 32 | 33 | s.source_files = 'Sources/**/*.swift' 34 | 35 | s.frameworks = 'Foundation' 36 | s.dependency 'Alamofire', '5.1.0' 37 | end 38 | -------------------------------------------------------------------------------- /Zen/ZenExample/Base.lproj/Main.storyboard: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | -------------------------------------------------------------------------------- /Zen/ZenExample/Base.lproj/LaunchScreen.storyboard: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | -------------------------------------------------------------------------------- /Zen/ZenExample/Assets.xcassets/AppIcon.appiconset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "iphone", 5 | "size" : "20x20", 6 | "scale" : "2x" 7 | }, 8 | { 9 | "idiom" : "iphone", 10 | "size" : "20x20", 11 | "scale" : "3x" 12 | }, 13 | { 14 | "idiom" : "iphone", 15 | "size" : "29x29", 16 | "scale" : "2x" 17 | }, 18 | { 19 | "idiom" : "iphone", 20 | "size" : "29x29", 21 | "scale" : "3x" 22 | }, 23 | { 24 | "idiom" : "iphone", 25 | "size" : "40x40", 26 | "scale" : "2x" 27 | }, 28 | { 29 | "idiom" : "iphone", 30 | "size" : "40x40", 31 | "scale" : "3x" 32 | }, 33 | { 34 | "idiom" : "iphone", 35 | "size" : "60x60", 36 | "scale" : "2x" 37 | }, 38 | { 39 | "idiom" : "iphone", 40 | "size" : "60x60", 41 | "scale" : "3x" 42 | }, 43 | { 44 | "idiom" : "ipad", 45 | "size" : "20x20", 46 | "scale" : "1x" 47 | }, 48 | { 49 | "idiom" : "ipad", 50 | "size" : "20x20", 51 | "scale" : "2x" 52 | }, 53 | { 54 | "idiom" : "ipad", 55 | "size" : "29x29", 56 | "scale" : "1x" 57 | }, 58 | { 59 | "idiom" : "ipad", 60 | "size" : "29x29", 61 | "scale" : "2x" 62 | }, 63 | { 64 | "idiom" : "ipad", 65 | "size" : "40x40", 66 | "scale" : "1x" 67 | }, 68 | { 69 | "idiom" : "ipad", 70 | "size" : "40x40", 71 | "scale" : "2x" 72 | }, 73 | { 74 | "idiom" : "ipad", 75 | "size" : "76x76", 76 | "scale" : "1x" 77 | }, 78 | { 79 | "idiom" : "ipad", 80 | "size" : "76x76", 81 | "scale" : "2x" 82 | }, 83 | { 84 | "idiom" : "ipad", 85 | "size" : "83.5x83.5", 86 | "scale" : "2x" 87 | }, 88 | { 89 | "idiom" : "ios-marketing", 90 | "size" : "1024x1024", 91 | "scale" : "1x" 92 | } 93 | ], 94 | "info" : { 95 | "version" : 1, 96 | "author" : "xcode" 97 | } 98 | } -------------------------------------------------------------------------------- /Zen/ZenExample/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | $(DEVELOPMENT_LANGUAGE) 7 | CFBundleExecutable 8 | $(EXECUTABLE_NAME) 9 | CFBundleIdentifier 10 | $(PRODUCT_BUNDLE_IDENTIFIER) 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | $(PRODUCT_NAME) 15 | CFBundlePackageType 16 | $(PRODUCT_BUNDLE_PACKAGE_TYPE) 17 | CFBundleShortVersionString 18 | 1.0 19 | CFBundleVersion 20 | 1 21 | LSRequiresIPhoneOS 22 | 23 | UIApplicationSceneManifest 24 | 25 | UIApplicationSupportsMultipleScenes 26 | 27 | UISceneConfigurations 28 | 29 | UIWindowSceneSessionRoleApplication 30 | 31 | 32 | UISceneConfigurationName 33 | Default Configuration 34 | UISceneDelegateClassName 35 | $(PRODUCT_MODULE_NAME).SceneDelegate 36 | UISceneStoryboardFile 37 | Main 38 | 39 | 40 | 41 | 42 | UILaunchStoryboardName 43 | LaunchScreen 44 | UIMainStoryboardFile 45 | Main 46 | UIRequiredDeviceCapabilities 47 | 48 | armv7 49 | 50 | UISupportedInterfaceOrientations 51 | 52 | UIInterfaceOrientationPortrait 53 | UIInterfaceOrientationLandscapeLeft 54 | UIInterfaceOrientationLandscapeRight 55 | 56 | UISupportedInterfaceOrientations~ipad 57 | 58 | UIInterfaceOrientationPortrait 59 | UIInterfaceOrientationPortraitUpsideDown 60 | UIInterfaceOrientationLandscapeLeft 61 | UIInterfaceOrientationLandscapeRight 62 | 63 | 64 | 65 | -------------------------------------------------------------------------------- /Zen/ZenExample/SceneDelegate.swift: -------------------------------------------------------------------------------- 1 | // 2 | // SceneDelegate.swift 3 | // ZenExample 4 | // 5 | // Created by Karim Ebrahem on 4/7/20. 6 | // Copyright © 2020 Karim Ebrahem. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | 11 | class SceneDelegate: UIResponder, UIWindowSceneDelegate { 12 | 13 | var window: UIWindow? 14 | 15 | 16 | func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) { 17 | // Use this method to optionally configure and attach the UIWindow `window` to the provided UIWindowScene `scene`. 18 | // If using a storyboard, the `window` property will automatically be initialized and attached to the scene. 19 | // This delegate does not imply the connecting scene or session are new (see `application:configurationForConnectingSceneSession` instead). 20 | guard let _ = (scene as? UIWindowScene) else { return } 21 | } 22 | 23 | func sceneDidDisconnect(_ scene: UIScene) { 24 | // Called as the scene is being released by the system. 25 | // This occurs shortly after the scene enters the background, or when its session is discarded. 26 | // Release any resources associated with this scene that can be re-created the next time the scene connects. 27 | // The scene may re-connect later, as its session was not neccessarily discarded (see `application:didDiscardSceneSessions` instead). 28 | } 29 | 30 | func sceneDidBecomeActive(_ scene: UIScene) { 31 | // Called when the scene has moved from an inactive state to an active state. 32 | // Use this method to restart any tasks that were paused (or not yet started) when the scene was inactive. 33 | } 34 | 35 | func sceneWillResignActive(_ scene: UIScene) { 36 | // Called when the scene will move from an active state to an inactive state. 37 | // This may occur due to temporary interruptions (ex. an incoming phone call). 38 | } 39 | 40 | func sceneWillEnterForeground(_ scene: UIScene) { 41 | // Called as the scene transitions from the background to the foreground. 42 | // Use this method to undo the changes made on entering the background. 43 | } 44 | 45 | func sceneDidEnterBackground(_ scene: UIScene) { 46 | // Called as the scene transitions from the foreground to the background. 47 | // Use this method to save data, release shared resources, and store enough scene-specific state information 48 | // to restore the scene back to its current state. 49 | } 50 | 51 | 52 | } 53 | 54 | -------------------------------------------------------------------------------- /Tests/ZenTests/ZenTests.swift: -------------------------------------------------------------------------------- 1 | import XCTest 2 | @testable import Zen 3 | 4 | final class ZenTests: XCTestCase { 5 | 6 | func testGetRequestWithCustomPath() { 7 | let expectation = self.expectation(description: "Get Request") 8 | 9 | try? APIClient.$fetchTodo 10 | .set(method: .get) 11 | .set(path: "1") 12 | .build() 13 | 14 | APIClient.fetchTodo { result in 15 | switch result { 16 | case .success(let todo): 17 | print(todo.title) 18 | case .failure(let error): 19 | print(error) 20 | } 21 | expectation.fulfill() 22 | } 23 | 24 | waitForExpectations(timeout: 5, handler: nil) 25 | } 26 | 27 | func testGetRequestWithQueryParameters() { 28 | let expectation = self.expectation(description: "Get Request with Query Parameters") 29 | 30 | try? APIClient.$fetchUsers 31 | .set(method: .get) 32 | .set(parameters: .url([ 33 | "delay": "3" 34 | ])) 35 | .build() 36 | 37 | APIClient.fetchUsers { result in 38 | switch result { 39 | case .success(let users): 40 | print(users.data.count) 41 | case .failure(let error): 42 | print(error) 43 | } 44 | expectation.fulfill() 45 | } 46 | 47 | waitForExpectations(timeout: 5, handler: nil) 48 | } 49 | 50 | func testPostRequest() { 51 | let expectation = self.expectation(description: "Post Request with Body Parameters") 52 | 53 | try? APIClient.$createUser 54 | .set(method: .post) 55 | .set(parameters: .body([ 56 | "name": "Karim Ebrahem", 57 | "job": "iOS Software Engineer" 58 | ])) 59 | .build() 60 | 61 | APIClient.createUser { result in 62 | switch result { 63 | case .success(let user): 64 | print(user.name) 65 | case .failure(let error): 66 | print(error) 67 | } 68 | expectation.fulfill() 69 | } 70 | 71 | waitForExpectations(timeout: 5, handler: nil) 72 | } 73 | 74 | static var allTests = [ 75 | ("testGetRequestWithCustomPath", testGetRequestWithCustomPath), 76 | ("testGetRequestWithQueryParameters", testGetRequestWithQueryParameters), 77 | ("testPostRequest", testPostRequest) 78 | ] 79 | } 80 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Xcode 2 | # 3 | # gitignore contributors: remember to update Global/Xcode.gitignore, Objective-C.gitignore & Swift.gitignore 4 | 5 | ## User settings 6 | xcuserdata/ 7 | 8 | ## compatibility with Xcode 8 and earlier (ignoring not required starting Xcode 9) 9 | *.xcscmblueprint 10 | *.xccheckout 11 | 12 | ## compatibility with Xcode 3 and earlier (ignoring not required starting Xcode 4) 13 | build/ 14 | DerivedData/ 15 | *.moved-aside 16 | *.pbxuser 17 | !default.pbxuser 18 | *.mode1v3 19 | !default.mode1v3 20 | *.mode2v3 21 | !default.mode2v3 22 | *.perspectivev3 23 | !default.perspectivev3 24 | 25 | ## Obj-C/Swift specific 26 | *.hmap 27 | 28 | ## App packaging 29 | *.ipa 30 | *.dSYM.zip 31 | *.dSYM 32 | 33 | ## Playgrounds 34 | timeline.xctimeline 35 | playground.xcworkspace 36 | 37 | # Swift Package Manager 38 | # 39 | # Add this line if you want to avoid checking in source code from Swift Package Manager dependencies. 40 | # Packages/ 41 | # Package.pins 42 | # Package.resolved 43 | # *.xcodeproj 44 | # 45 | # Xcode automatically generates this directory with a .xcworkspacedata file and xcuserdata 46 | # hence it is not needed unless you have added a package configuration file to your project 47 | # .swiftpm 48 | 49 | .build/ 50 | 51 | # CocoaPods 52 | # 53 | # We recommend against adding the Pods directory to your .gitignore. However 54 | # you should judge for yourself, the pros and cons are mentioned at: 55 | # https://guides.cocoapods.org/using/using-cocoapods.html#should-i-check-the-pods-directory-into-source-control 56 | # 57 | # Pods/ 58 | # 59 | # Add this line if you want to avoid checking in source code from the Xcode workspace 60 | # *.xcworkspace 61 | 62 | # Carthage 63 | # 64 | # Add this line if you want to avoid checking in source code from Carthage dependencies. 65 | 66 | Zen/Carthage/Checkouts/ 67 | Carthage/Checkouts/ 68 | Carthage/Build/ 69 | 70 | # Accio dependency management 71 | Dependencies/ 72 | .accio/ 73 | 74 | # fastlane 75 | # 76 | # It is recommended to not store the screenshots in the git repo. 77 | # Instead, use fastlane to re-generate the screenshots whenever they are needed. 78 | # For more information about the recommended setup visit: 79 | # https://docs.fastlane.tools/best-practices/source-control/#source-control 80 | 81 | fastlane/report.xml 82 | fastlane/Preview.html 83 | fastlane/screenshots/**/*.png 84 | fastlane/test_output 85 | 86 | # Code Injection 87 | # 88 | # After new code Injection tools there's a generated folder /iOSInjectionProject 89 | # https://github.com/johnno1962/injectionforxcode 90 | 91 | iOSInjectionProject/ 92 | 93 | Zen/.DS_Store 94 | 95 | .DS_Store 96 | -------------------------------------------------------------------------------- /Zen/Zen.xcodeproj/xcshareddata/xcschemes/Zen.xcscheme: -------------------------------------------------------------------------------- 1 | 2 | 5 | 8 | 9 | 15 | 21 | 22 | 23 | 24 | 25 | 30 | 31 | 32 | 33 | 43 | 44 | 50 | 51 | 57 | 58 | 59 | 60 | 62 | 63 | 66 | 67 | 68 | -------------------------------------------------------------------------------- /Sources/Zen/ZenRequest.swift: -------------------------------------------------------------------------------- 1 | // 2 | // ZenRequest.swift 3 | // 4 | // Created by Karim Ebrahem on 4/7/20. 5 | // 6 | 7 | import Foundation 8 | import Alamofire 9 | 10 | public typealias Service = (_ completionHandler: @escaping (Result) -> Void) -> Void 11 | 12 | @propertyWrapper 13 | public class ZenRequest where T: Codable { 14 | 15 | private var url: URL 16 | private var path: String? 17 | private var method: HTTPMethod? 18 | private var headers: [String: Any]? 19 | private var parameters: RequestParameters? 20 | private var request: URLRequest? 21 | 22 | public var projectedValue: ZenRequest { return self } 23 | 24 | public init(_ url: String) { 25 | self.url = URL(string: url)! 26 | } 27 | 28 | @discardableResult 29 | func set(method: HTTPMethod) -> Self { 30 | self.method = method 31 | return self 32 | } 33 | 34 | @discardableResult 35 | public func set(path: String) -> Self { 36 | self.path = path 37 | return self 38 | } 39 | 40 | @discardableResult 41 | public func set(headers: [String: Any]?) -> Self { 42 | self.headers = headers 43 | return self 44 | } 45 | 46 | @discardableResult 47 | public func set(parameters: RequestParameters?) -> Self { 48 | self.parameters = parameters 49 | return self 50 | } 51 | 52 | public func build() throws { 53 | do { 54 | var urlRequest = URLRequest( 55 | url: url.appendingPathComponent(path ?? ""), 56 | cachePolicy: .reloadIgnoringLocalAndRemoteCacheData, 57 | timeoutInterval: 25 58 | ) 59 | urlRequest.httpMethod = method?.rawValue 60 | headers?.forEach { 61 | urlRequest.addValue($0.value as! String, forHTTPHeaderField: $0.key) 62 | } 63 | if let params = parameters { 64 | urlRequest = try buildRequestParams(urlRequest, params: params) 65 | } 66 | self.request = urlRequest 67 | } catch { 68 | throw ZenError.RequestBuilderFailed 69 | } 70 | } 71 | 72 | fileprivate func buildRequestParams(_ urlRequest: URLRequest, params: RequestParameters) throws -> URLRequest { 73 | var urlRequest = urlRequest 74 | urlRequest = try params.encoder.encode(params.parameters, into: urlRequest) 75 | return urlRequest 76 | } 77 | 78 | public var wrappedValue: Service { 79 | get { 80 | return { completion in 81 | guard let request = self.request else { return } 82 | 83 | AF.request(request) 84 | .responseData { (response: AFDataResponse) in 85 | 86 | switch response.result { 87 | case .success(let data): 88 | do { 89 | let responseData = try JSONDecoder().decode(T.self, from: data) 90 | completion(.success(responseData)) 91 | } catch { 92 | completion(.failure(ZenError.DecodingResponseFailed)) 93 | } 94 | case .failure(let error): 95 | completion(.failure(error)) 96 | } 97 | } 98 | } 99 | } 100 | } 101 | 102 | } 103 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 |

Zen, Zero Effort Networking

2 | 3 |

4 | 5 | 6 | 7 | MIT License 8 | 9 |

10 | 11 |

12 | 13 | Cocoapod 14 | 15 | 16 | Carthage 17 | 18 | 19 | Swift Package Manager 20 | 21 | Version 22 |
23 | 24 | Facebook: @KarimEbrahemAbdelaziz 25 | 26 | 27 | Twitter: @k_ebrahem_ 28 | 29 |

30 | 31 | # 32 | 33 | Zen is simple yet powerfull Networking library for iOS. It leverage the powerfull feature of Alamofire and Swift to make building Network Layer more straight forward and efficient. 34 | 35 | - [Requirements](#requirements) 36 | - [Installation](#installation) 37 | - [Cocoapods](#cocoapods) 38 | - [Carthage](#carthage) 39 | - [Swift Package Manager](#spm) 40 | - [Usage](#usage) 41 | - [Todo](#todo) 42 | - [Author](#author) 43 | - [License](#license) 44 | 45 | 46 | ## Requirements 47 | 48 | * Xcode 11.3+ 49 | * Swift 5.1+ 50 | * iOS 13+ 51 | 52 | ## Installation 53 | 54 | ### CocoaPods 55 | 56 | [CocoaPods](https://cocoapods.org) is a dependency manager for Cocoa projects. For usage and installation instructions, visit their website. To integrate Zen into your Xcode project using CocoaPods, specify it in your `Podfile`: 57 | 58 | ```ruby 59 | pod 'Zen', '~> 0.1.7' 60 | ``` 61 | 62 | ### Carthage 63 | 64 | [Carthage](https://github.com/Carthage/Carthage) is a decentralized dependency manager that builds your dependencies and provides you with binary frameworks. To integrate Zen into your Xcode project using Carthage, specify it in your `Cartfile`: 65 | 66 | ```ogdl 67 | github "KarimEbrahemAbdelaziz/Zen" ~> 0.1.7 68 | ``` 69 | 70 | ### SPM 71 | 72 | The [Swift Package Manager](https://swift.org/package-manager/) is a tool for automating the distribution of Swift code and is integrated into the `swift` compiler. It is in early development, but Zen does support its use on supported platforms. 73 | 74 | Once you have your Swift package set up, adding Zen as a dependency is as easy as adding it to the `dependencies` value of your `Package.swift`. 75 | 76 | ```swift 77 | dependencies: [ 78 | .package(url: "https://github.com/KarimEbrahemAbdelaziz/Zen.git", .upToNextMajor(from: "0.1.7")) 79 | ] 80 | ``` 81 | 82 | # Usage 83 | 84 | ## Create your Model (Must Conform to Codable) 85 | ```swift 86 | struct Todo: Codable { 87 | var userId: Int 88 | var id: Int 89 | var title: String 90 | var completed: Bool 91 | } 92 | ``` 93 | 94 | ## Create your API Client 🔥 95 | ```swift 96 | import Zen 97 | 98 | class APIClient { 99 | @ZenRequest("https://jsonplaceholder.typicode.com/todos/") 100 | static var fetchTodo: Service 101 | } 102 | ``` 103 | 104 | ## Use it 🤓 105 | ### Zen GET Request 106 | ```swift 107 | try? APIClient.$fetchTodo 108 | // Specifiy HTTPMethod for The Request 109 | .set(method: .get) 110 | // Specifiy Custom PATH for The Request 111 | .set(path: "1") 112 | // Build the Request 113 | .build() 114 | 115 | APIClient.fetchTodo { result in 116 | switch result { 117 | case .success(let todo): 118 | print(todo.title) 119 | case .failure(let error): 120 | print(error) 121 | } 122 | } 123 | ``` 124 | 125 | ### Zen GET Request (Query Parameters) 126 | ```swift 127 | try? APIClient.$fetchUsers 128 | // Specifiy HTTPMethod for The Request 129 | .set(method: .get) 130 | // Specifiy Query Parameters for The Request 131 | .set(parameters: .url([ 132 | "delay": "3" 133 | ])) 134 | // Build the Request 135 | .build() 136 | 137 | APIClient.fetchUsers { result in 138 | switch result { 139 | case .success(let users): 140 | print(users.data.count) 141 | case .failure(let error): 142 | print(error) 143 | } 144 | } 145 | ``` 146 | 147 | ### Zen POST Request 148 | ```swift 149 | try? APIClient.$createUser 150 | // Specifiy HTTPMethod for The Request 151 | .set(method: .post) 152 | // Specifiy Body Parameters for The Request 153 | .set(parameters: .body([ 154 | "name": "Karim Ebrahem", 155 | "job": "iOS Software Engineer" 156 | ])) 157 | // Build the Request 158 | .build() 159 | 160 | APIClient.createUser { result in 161 | switch result { 162 | case .success(let user): 163 | print(user.name) 164 | case .failure(let error): 165 | print(error) 166 | } 167 | } 168 | ``` 169 | 170 | ## Todo 171 | 172 | - [x] Support all HTTP Methods Requests. 173 | - [x] Support Body Parameters. 174 | - [x] Support Query Parameters. 175 | - [x] Support Headers. 176 | - [ ] Support Interceptors. 177 | 178 | ## Author 179 | 180 | Karim Ebrahem, karimabdelazizmansour@gmail.com 181 | You can find me on Twitter [@k_ebrahem_](https://twitter.com/k_ebrahem_). 182 | 183 | ## License 184 | 185 | Zen is available under the MIT license. See the `LICENSE` file for more info. 186 | 187 | Zen will be updated when necessary and fixes will be done as soon as discovered to keep it up to date. 188 | 189 | Enjoy! 190 | -------------------------------------------------------------------------------- /Zen/Zen.xcodeproj/project.pbxproj: -------------------------------------------------------------------------------- 1 | // !$*UTF8*$! 2 | { 3 | archiveVersion = 1; 4 | classes = { 5 | }; 6 | objectVersion = 52; 7 | objects = { 8 | 9 | /* Begin PBXBuildFile section */ 10 | BC27B530243D617C005E6E0E /* Zen in Frameworks */ = {isa = PBXBuildFile; productRef = BC27B52F243D617C005E6E0E /* Zen */; }; 11 | BCC88A5A243C12090087AFAB /* Zen.h in Headers */ = {isa = PBXBuildFile; fileRef = BCC88A58243C12090087AFAB /* Zen.h */; settings = {ATTRIBUTES = (Public, ); }; }; 12 | BCC88A63243C125F0087AFAB /* GET.swift in Sources */ = {isa = PBXBuildFile; fileRef = BCC88A62243C125F0087AFAB /* GET.swift */; }; 13 | BCC88A70243C1D0F0087AFAB /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = BCC88A6F243C1D0F0087AFAB /* AppDelegate.swift */; }; 14 | BCC88A72243C1D0F0087AFAB /* SceneDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = BCC88A71243C1D0F0087AFAB /* SceneDelegate.swift */; }; 15 | BCC88A74243C1D0F0087AFAB /* ViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = BCC88A73243C1D0F0087AFAB /* ViewController.swift */; }; 16 | BCC88A77243C1D0F0087AFAB /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = BCC88A75243C1D0F0087AFAB /* Main.storyboard */; }; 17 | BCC88A79243C1D100087AFAB /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = BCC88A78243C1D100087AFAB /* Assets.xcassets */; }; 18 | BCC88A7C243C1D100087AFAB /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = BCC88A7A243C1D100087AFAB /* LaunchScreen.storyboard */; }; 19 | BCC88A84243C1D400087AFAB /* APIClient.swift in Sources */ = {isa = PBXBuildFile; fileRef = BCC88A83243C1D400087AFAB /* APIClient.swift */; }; 20 | BCC88A87243C1D4C0087AFAB /* Todo.swift in Sources */ = {isa = PBXBuildFile; fileRef = BCC88A86243C1D4C0087AFAB /* Todo.swift */; }; 21 | BCDB9AC2243D7E5100D23B0F /* Alamofire in Frameworks */ = {isa = PBXBuildFile; productRef = BCDB9AC1243D7E5100D23B0F /* Alamofire */; }; 22 | /* End PBXBuildFile section */ 23 | 24 | /* Begin PBXFileReference section */ 25 | BCC88A55243C12090087AFAB /* Zen.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Zen.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 26 | BCC88A58243C12090087AFAB /* Zen.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = Zen.h; sourceTree = ""; }; 27 | BCC88A59243C12090087AFAB /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 28 | BCC88A62243C125F0087AFAB /* GET.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = GET.swift; path = ../../Sources/Zen/GET.swift; sourceTree = ""; }; 29 | BCC88A65243C1CF10087AFAB /* Alamofire.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Alamofire.framework; path = Carthage/Build/iOS/Alamofire.framework; sourceTree = ""; }; 30 | BCC88A6D243C1D0F0087AFAB /* ZenExample.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = ZenExample.app; sourceTree = BUILT_PRODUCTS_DIR; }; 31 | BCC88A6F243C1D0F0087AFAB /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; 32 | BCC88A71243C1D0F0087AFAB /* SceneDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SceneDelegate.swift; sourceTree = ""; }; 33 | BCC88A73243C1D0F0087AFAB /* ViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ViewController.swift; sourceTree = ""; }; 34 | BCC88A76243C1D0F0087AFAB /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; 35 | BCC88A78243C1D100087AFAB /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; 36 | BCC88A7B243C1D100087AFAB /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; 37 | BCC88A7D243C1D100087AFAB /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 38 | BCC88A83243C1D400087AFAB /* APIClient.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = APIClient.swift; sourceTree = ""; }; 39 | BCC88A86243C1D4C0087AFAB /* Todo.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Todo.swift; sourceTree = ""; }; 40 | /* End PBXFileReference section */ 41 | 42 | /* Begin PBXFrameworksBuildPhase section */ 43 | BCC88A52243C12090087AFAB /* Frameworks */ = { 44 | isa = PBXFrameworksBuildPhase; 45 | buildActionMask = 2147483647; 46 | files = ( 47 | BCDB9AC2243D7E5100D23B0F /* Alamofire in Frameworks */, 48 | ); 49 | runOnlyForDeploymentPostprocessing = 0; 50 | }; 51 | BCC88A6A243C1D0F0087AFAB /* Frameworks */ = { 52 | isa = PBXFrameworksBuildPhase; 53 | buildActionMask = 2147483647; 54 | files = ( 55 | BC27B530243D617C005E6E0E /* Zen in Frameworks */, 56 | ); 57 | runOnlyForDeploymentPostprocessing = 0; 58 | }; 59 | /* End PBXFrameworksBuildPhase section */ 60 | 61 | /* Begin PBXGroup section */ 62 | BCC88A4B243C12090087AFAB = { 63 | isa = PBXGroup; 64 | children = ( 65 | BCC88A57243C12090087AFAB /* Zen */, 66 | BCC88A6E243C1D0F0087AFAB /* ZenExample */, 67 | BCC88A56243C12090087AFAB /* Products */, 68 | BCC88A64243C1CF10087AFAB /* Frameworks */, 69 | ); 70 | sourceTree = ""; 71 | }; 72 | BCC88A56243C12090087AFAB /* Products */ = { 73 | isa = PBXGroup; 74 | children = ( 75 | BCC88A55243C12090087AFAB /* Zen.framework */, 76 | BCC88A6D243C1D0F0087AFAB /* ZenExample.app */, 77 | ); 78 | name = Products; 79 | sourceTree = ""; 80 | }; 81 | BCC88A57243C12090087AFAB /* Zen */ = { 82 | isa = PBXGroup; 83 | children = ( 84 | BCC88A62243C125F0087AFAB /* GET.swift */, 85 | BCC88A58243C12090087AFAB /* Zen.h */, 86 | BCC88A59243C12090087AFAB /* Info.plist */, 87 | ); 88 | path = Zen; 89 | sourceTree = ""; 90 | }; 91 | BCC88A64243C1CF10087AFAB /* Frameworks */ = { 92 | isa = PBXGroup; 93 | children = ( 94 | BCC88A65243C1CF10087AFAB /* Alamofire.framework */, 95 | ); 96 | name = Frameworks; 97 | sourceTree = ""; 98 | }; 99 | BCC88A6E243C1D0F0087AFAB /* ZenExample */ = { 100 | isa = PBXGroup; 101 | children = ( 102 | BCC88A82243C1D330087AFAB /* Models */, 103 | BCC88A81243C1D250087AFAB /* Networking */, 104 | BCC88A6F243C1D0F0087AFAB /* AppDelegate.swift */, 105 | BCC88A71243C1D0F0087AFAB /* SceneDelegate.swift */, 106 | BCC88A73243C1D0F0087AFAB /* ViewController.swift */, 107 | BCC88A75243C1D0F0087AFAB /* Main.storyboard */, 108 | BCC88A78243C1D100087AFAB /* Assets.xcassets */, 109 | BCC88A7A243C1D100087AFAB /* LaunchScreen.storyboard */, 110 | BCC88A7D243C1D100087AFAB /* Info.plist */, 111 | ); 112 | path = ZenExample; 113 | sourceTree = ""; 114 | }; 115 | BCC88A81243C1D250087AFAB /* Networking */ = { 116 | isa = PBXGroup; 117 | children = ( 118 | BCC88A83243C1D400087AFAB /* APIClient.swift */, 119 | ); 120 | path = Networking; 121 | sourceTree = ""; 122 | }; 123 | BCC88A82243C1D330087AFAB /* Models */ = { 124 | isa = PBXGroup; 125 | children = ( 126 | BCC88A86243C1D4C0087AFAB /* Todo.swift */, 127 | ); 128 | path = Models; 129 | sourceTree = ""; 130 | }; 131 | /* End PBXGroup section */ 132 | 133 | /* Begin PBXHeadersBuildPhase section */ 134 | BCC88A50243C12090087AFAB /* Headers */ = { 135 | isa = PBXHeadersBuildPhase; 136 | buildActionMask = 2147483647; 137 | files = ( 138 | BCC88A5A243C12090087AFAB /* Zen.h in Headers */, 139 | ); 140 | runOnlyForDeploymentPostprocessing = 0; 141 | }; 142 | /* End PBXHeadersBuildPhase section */ 143 | 144 | /* Begin PBXNativeTarget section */ 145 | BCC88A54243C12090087AFAB /* Zen */ = { 146 | isa = PBXNativeTarget; 147 | buildConfigurationList = BCC88A5D243C12090087AFAB /* Build configuration list for PBXNativeTarget "Zen" */; 148 | buildPhases = ( 149 | BCC88A50243C12090087AFAB /* Headers */, 150 | BCC88A51243C12090087AFAB /* Sources */, 151 | BCC88A52243C12090087AFAB /* Frameworks */, 152 | BCC88A53243C12090087AFAB /* Resources */, 153 | ); 154 | buildRules = ( 155 | ); 156 | dependencies = ( 157 | ); 158 | name = Zen; 159 | packageProductDependencies = ( 160 | BCDB9AC1243D7E5100D23B0F /* Alamofire */, 161 | ); 162 | productName = Zen; 163 | productReference = BCC88A55243C12090087AFAB /* Zen.framework */; 164 | productType = "com.apple.product-type.framework"; 165 | }; 166 | BCC88A6C243C1D0F0087AFAB /* ZenExample */ = { 167 | isa = PBXNativeTarget; 168 | buildConfigurationList = BCC88A7E243C1D100087AFAB /* Build configuration list for PBXNativeTarget "ZenExample" */; 169 | buildPhases = ( 170 | BCC88A69243C1D0F0087AFAB /* Sources */, 171 | BCC88A6A243C1D0F0087AFAB /* Frameworks */, 172 | BCC88A6B243C1D0F0087AFAB /* Resources */, 173 | ); 174 | buildRules = ( 175 | ); 176 | dependencies = ( 177 | ); 178 | name = ZenExample; 179 | packageProductDependencies = ( 180 | BC27B52F243D617C005E6E0E /* Zen */, 181 | ); 182 | productName = ZenExample; 183 | productReference = BCC88A6D243C1D0F0087AFAB /* ZenExample.app */; 184 | productType = "com.apple.product-type.application"; 185 | }; 186 | /* End PBXNativeTarget section */ 187 | 188 | /* Begin PBXProject section */ 189 | BCC88A4C243C12090087AFAB /* Project object */ = { 190 | isa = PBXProject; 191 | attributes = { 192 | LastSwiftUpdateCheck = 1130; 193 | LastUpgradeCheck = 1130; 194 | ORGANIZATIONNAME = "Karim Ebrahem"; 195 | TargetAttributes = { 196 | BCC88A54243C12090087AFAB = { 197 | CreatedOnToolsVersion = 11.3.1; 198 | LastSwiftMigration = 1130; 199 | }; 200 | BCC88A6C243C1D0F0087AFAB = { 201 | CreatedOnToolsVersion = 11.3.1; 202 | }; 203 | }; 204 | }; 205 | buildConfigurationList = BCC88A4F243C12090087AFAB /* Build configuration list for PBXProject "Zen" */; 206 | compatibilityVersion = "Xcode 9.3"; 207 | developmentRegion = en; 208 | hasScannedForEncodings = 0; 209 | knownRegions = ( 210 | en, 211 | Base, 212 | ); 213 | mainGroup = BCC88A4B243C12090087AFAB; 214 | packageReferences = ( 215 | BC27B52E243D617C005E6E0E /* XCRemoteSwiftPackageReference "Zen" */, 216 | BCDB9AC0243D7E5100D23B0F /* XCRemoteSwiftPackageReference "Alamofire" */, 217 | ); 218 | productRefGroup = BCC88A56243C12090087AFAB /* Products */; 219 | projectDirPath = ""; 220 | projectRoot = ""; 221 | targets = ( 222 | BCC88A54243C12090087AFAB /* Zen */, 223 | BCC88A6C243C1D0F0087AFAB /* ZenExample */, 224 | ); 225 | }; 226 | /* End PBXProject section */ 227 | 228 | /* Begin PBXResourcesBuildPhase section */ 229 | BCC88A53243C12090087AFAB /* Resources */ = { 230 | isa = PBXResourcesBuildPhase; 231 | buildActionMask = 2147483647; 232 | files = ( 233 | ); 234 | runOnlyForDeploymentPostprocessing = 0; 235 | }; 236 | BCC88A6B243C1D0F0087AFAB /* Resources */ = { 237 | isa = PBXResourcesBuildPhase; 238 | buildActionMask = 2147483647; 239 | files = ( 240 | BCC88A7C243C1D100087AFAB /* LaunchScreen.storyboard in Resources */, 241 | BCC88A79243C1D100087AFAB /* Assets.xcassets in Resources */, 242 | BCC88A77243C1D0F0087AFAB /* Main.storyboard in Resources */, 243 | ); 244 | runOnlyForDeploymentPostprocessing = 0; 245 | }; 246 | /* End PBXResourcesBuildPhase section */ 247 | 248 | /* Begin PBXSourcesBuildPhase section */ 249 | BCC88A51243C12090087AFAB /* Sources */ = { 250 | isa = PBXSourcesBuildPhase; 251 | buildActionMask = 2147483647; 252 | files = ( 253 | BCC88A63243C125F0087AFAB /* GET.swift in Sources */, 254 | ); 255 | runOnlyForDeploymentPostprocessing = 0; 256 | }; 257 | BCC88A69243C1D0F0087AFAB /* Sources */ = { 258 | isa = PBXSourcesBuildPhase; 259 | buildActionMask = 2147483647; 260 | files = ( 261 | BCC88A74243C1D0F0087AFAB /* ViewController.swift in Sources */, 262 | BCC88A70243C1D0F0087AFAB /* AppDelegate.swift in Sources */, 263 | BCC88A72243C1D0F0087AFAB /* SceneDelegate.swift in Sources */, 264 | BCC88A84243C1D400087AFAB /* APIClient.swift in Sources */, 265 | BCC88A87243C1D4C0087AFAB /* Todo.swift in Sources */, 266 | ); 267 | runOnlyForDeploymentPostprocessing = 0; 268 | }; 269 | /* End PBXSourcesBuildPhase section */ 270 | 271 | /* Begin PBXVariantGroup section */ 272 | BCC88A75243C1D0F0087AFAB /* Main.storyboard */ = { 273 | isa = PBXVariantGroup; 274 | children = ( 275 | BCC88A76243C1D0F0087AFAB /* Base */, 276 | ); 277 | name = Main.storyboard; 278 | sourceTree = ""; 279 | }; 280 | BCC88A7A243C1D100087AFAB /* LaunchScreen.storyboard */ = { 281 | isa = PBXVariantGroup; 282 | children = ( 283 | BCC88A7B243C1D100087AFAB /* Base */, 284 | ); 285 | name = LaunchScreen.storyboard; 286 | sourceTree = ""; 287 | }; 288 | /* End PBXVariantGroup section */ 289 | 290 | /* Begin XCBuildConfiguration section */ 291 | BCC88A5B243C12090087AFAB /* Debug */ = { 292 | isa = XCBuildConfiguration; 293 | buildSettings = { 294 | ALWAYS_SEARCH_USER_PATHS = NO; 295 | CLANG_ANALYZER_NONNULL = YES; 296 | CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; 297 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; 298 | CLANG_CXX_LIBRARY = "libc++"; 299 | CLANG_ENABLE_MODULES = YES; 300 | CLANG_ENABLE_OBJC_ARC = YES; 301 | CLANG_ENABLE_OBJC_WEAK = YES; 302 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 303 | CLANG_WARN_BOOL_CONVERSION = YES; 304 | CLANG_WARN_COMMA = YES; 305 | CLANG_WARN_CONSTANT_CONVERSION = YES; 306 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; 307 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 308 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES; 309 | CLANG_WARN_EMPTY_BODY = YES; 310 | CLANG_WARN_ENUM_CONVERSION = YES; 311 | CLANG_WARN_INFINITE_RECURSION = YES; 312 | CLANG_WARN_INT_CONVERSION = YES; 313 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; 314 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; 315 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; 316 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 317 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 318 | CLANG_WARN_STRICT_PROTOTYPES = YES; 319 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 320 | CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; 321 | CLANG_WARN_UNREACHABLE_CODE = YES; 322 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 323 | COPY_PHASE_STRIP = NO; 324 | CURRENT_PROJECT_VERSION = 1; 325 | DEBUG_INFORMATION_FORMAT = dwarf; 326 | ENABLE_STRICT_OBJC_MSGSEND = YES; 327 | ENABLE_TESTABILITY = YES; 328 | GCC_C_LANGUAGE_STANDARD = gnu11; 329 | GCC_DYNAMIC_NO_PIC = NO; 330 | GCC_NO_COMMON_BLOCKS = YES; 331 | GCC_OPTIMIZATION_LEVEL = 0; 332 | GCC_PREPROCESSOR_DEFINITIONS = ( 333 | "DEBUG=1", 334 | "$(inherited)", 335 | ); 336 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 337 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 338 | GCC_WARN_UNDECLARED_SELECTOR = YES; 339 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 340 | GCC_WARN_UNUSED_FUNCTION = YES; 341 | GCC_WARN_UNUSED_VARIABLE = YES; 342 | IPHONEOS_DEPLOYMENT_TARGET = 13.2; 343 | MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; 344 | MTL_FAST_MATH = YES; 345 | ONLY_ACTIVE_ARCH = YES; 346 | SDKROOT = iphoneos; 347 | SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; 348 | SWIFT_OPTIMIZATION_LEVEL = "-Onone"; 349 | VERSIONING_SYSTEM = "apple-generic"; 350 | VERSION_INFO_PREFIX = ""; 351 | }; 352 | name = Debug; 353 | }; 354 | BCC88A5C243C12090087AFAB /* Release */ = { 355 | isa = XCBuildConfiguration; 356 | buildSettings = { 357 | ALWAYS_SEARCH_USER_PATHS = NO; 358 | CLANG_ANALYZER_NONNULL = YES; 359 | CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; 360 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; 361 | CLANG_CXX_LIBRARY = "libc++"; 362 | CLANG_ENABLE_MODULES = YES; 363 | CLANG_ENABLE_OBJC_ARC = YES; 364 | CLANG_ENABLE_OBJC_WEAK = YES; 365 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 366 | CLANG_WARN_BOOL_CONVERSION = YES; 367 | CLANG_WARN_COMMA = YES; 368 | CLANG_WARN_CONSTANT_CONVERSION = YES; 369 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; 370 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 371 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES; 372 | CLANG_WARN_EMPTY_BODY = YES; 373 | CLANG_WARN_ENUM_CONVERSION = YES; 374 | CLANG_WARN_INFINITE_RECURSION = YES; 375 | CLANG_WARN_INT_CONVERSION = YES; 376 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; 377 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; 378 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; 379 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 380 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 381 | CLANG_WARN_STRICT_PROTOTYPES = YES; 382 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 383 | CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; 384 | CLANG_WARN_UNREACHABLE_CODE = YES; 385 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 386 | COPY_PHASE_STRIP = NO; 387 | CURRENT_PROJECT_VERSION = 1; 388 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; 389 | ENABLE_NS_ASSERTIONS = NO; 390 | ENABLE_STRICT_OBJC_MSGSEND = YES; 391 | GCC_C_LANGUAGE_STANDARD = gnu11; 392 | GCC_NO_COMMON_BLOCKS = YES; 393 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 394 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 395 | GCC_WARN_UNDECLARED_SELECTOR = YES; 396 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 397 | GCC_WARN_UNUSED_FUNCTION = YES; 398 | GCC_WARN_UNUSED_VARIABLE = YES; 399 | IPHONEOS_DEPLOYMENT_TARGET = 13.2; 400 | MTL_ENABLE_DEBUG_INFO = NO; 401 | MTL_FAST_MATH = YES; 402 | SDKROOT = iphoneos; 403 | SWIFT_COMPILATION_MODE = wholemodule; 404 | SWIFT_OPTIMIZATION_LEVEL = "-O"; 405 | VALIDATE_PRODUCT = YES; 406 | VERSIONING_SYSTEM = "apple-generic"; 407 | VERSION_INFO_PREFIX = ""; 408 | }; 409 | name = Release; 410 | }; 411 | BCC88A5E243C12090087AFAB /* Debug */ = { 412 | isa = XCBuildConfiguration; 413 | buildSettings = { 414 | CLANG_ENABLE_MODULES = YES; 415 | CODE_SIGN_STYLE = Automatic; 416 | DEFINES_MODULE = YES; 417 | DYLIB_COMPATIBILITY_VERSION = 1; 418 | DYLIB_CURRENT_VERSION = 1; 419 | DYLIB_INSTALL_NAME_BASE = "@rpath"; 420 | FRAMEWORK_SEARCH_PATHS = ( 421 | "$(inherited)", 422 | "$(PROJECT_DIR)/Carthage/Build/iOS", 423 | ); 424 | INFOPLIST_FILE = Zen/Info.plist; 425 | INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; 426 | LD_RUNPATH_SEARCH_PATHS = ( 427 | "$(inherited)", 428 | "@executable_path/Frameworks", 429 | "@loader_path/Frameworks", 430 | ); 431 | PRODUCT_BUNDLE_IDENTIFIER = com.karimebrahem.Zen; 432 | PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; 433 | SKIP_INSTALL = YES; 434 | SWIFT_OPTIMIZATION_LEVEL = "-Onone"; 435 | SWIFT_VERSION = 5.0; 436 | TARGETED_DEVICE_FAMILY = "1,2"; 437 | }; 438 | name = Debug; 439 | }; 440 | BCC88A5F243C12090087AFAB /* Release */ = { 441 | isa = XCBuildConfiguration; 442 | buildSettings = { 443 | CLANG_ENABLE_MODULES = YES; 444 | CODE_SIGN_STYLE = Automatic; 445 | DEFINES_MODULE = YES; 446 | DYLIB_COMPATIBILITY_VERSION = 1; 447 | DYLIB_CURRENT_VERSION = 1; 448 | DYLIB_INSTALL_NAME_BASE = "@rpath"; 449 | FRAMEWORK_SEARCH_PATHS = ( 450 | "$(inherited)", 451 | "$(PROJECT_DIR)/Carthage/Build/iOS", 452 | ); 453 | INFOPLIST_FILE = Zen/Info.plist; 454 | INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; 455 | LD_RUNPATH_SEARCH_PATHS = ( 456 | "$(inherited)", 457 | "@executable_path/Frameworks", 458 | "@loader_path/Frameworks", 459 | ); 460 | PRODUCT_BUNDLE_IDENTIFIER = com.karimebrahem.Zen; 461 | PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; 462 | SKIP_INSTALL = YES; 463 | SWIFT_VERSION = 5.0; 464 | TARGETED_DEVICE_FAMILY = "1,2"; 465 | }; 466 | name = Release; 467 | }; 468 | BCC88A7F243C1D100087AFAB /* Debug */ = { 469 | isa = XCBuildConfiguration; 470 | buildSettings = { 471 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 472 | CODE_SIGN_STYLE = Automatic; 473 | INFOPLIST_FILE = ZenExample/Info.plist; 474 | LD_RUNPATH_SEARCH_PATHS = ( 475 | "$(inherited)", 476 | "@executable_path/Frameworks", 477 | ); 478 | PRODUCT_BUNDLE_IDENTIFIER = com.karimebrahem.ZenExample; 479 | PRODUCT_NAME = "$(TARGET_NAME)"; 480 | SWIFT_VERSION = 5.0; 481 | TARGETED_DEVICE_FAMILY = "1,2"; 482 | }; 483 | name = Debug; 484 | }; 485 | BCC88A80243C1D100087AFAB /* Release */ = { 486 | isa = XCBuildConfiguration; 487 | buildSettings = { 488 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 489 | CODE_SIGN_STYLE = Automatic; 490 | INFOPLIST_FILE = ZenExample/Info.plist; 491 | LD_RUNPATH_SEARCH_PATHS = ( 492 | "$(inherited)", 493 | "@executable_path/Frameworks", 494 | ); 495 | PRODUCT_BUNDLE_IDENTIFIER = com.karimebrahem.ZenExample; 496 | PRODUCT_NAME = "$(TARGET_NAME)"; 497 | SWIFT_VERSION = 5.0; 498 | TARGETED_DEVICE_FAMILY = "1,2"; 499 | }; 500 | name = Release; 501 | }; 502 | /* End XCBuildConfiguration section */ 503 | 504 | /* Begin XCConfigurationList section */ 505 | BCC88A4F243C12090087AFAB /* Build configuration list for PBXProject "Zen" */ = { 506 | isa = XCConfigurationList; 507 | buildConfigurations = ( 508 | BCC88A5B243C12090087AFAB /* Debug */, 509 | BCC88A5C243C12090087AFAB /* Release */, 510 | ); 511 | defaultConfigurationIsVisible = 0; 512 | defaultConfigurationName = Release; 513 | }; 514 | BCC88A5D243C12090087AFAB /* Build configuration list for PBXNativeTarget "Zen" */ = { 515 | isa = XCConfigurationList; 516 | buildConfigurations = ( 517 | BCC88A5E243C12090087AFAB /* Debug */, 518 | BCC88A5F243C12090087AFAB /* Release */, 519 | ); 520 | defaultConfigurationIsVisible = 0; 521 | defaultConfigurationName = Release; 522 | }; 523 | BCC88A7E243C1D100087AFAB /* Build configuration list for PBXNativeTarget "ZenExample" */ = { 524 | isa = XCConfigurationList; 525 | buildConfigurations = ( 526 | BCC88A7F243C1D100087AFAB /* Debug */, 527 | BCC88A80243C1D100087AFAB /* Release */, 528 | ); 529 | defaultConfigurationIsVisible = 0; 530 | defaultConfigurationName = Release; 531 | }; 532 | /* End XCConfigurationList section */ 533 | 534 | /* Begin XCRemoteSwiftPackageReference section */ 535 | BC27B52E243D617C005E6E0E /* XCRemoteSwiftPackageReference "Zen" */ = { 536 | isa = XCRemoteSwiftPackageReference; 537 | repositoryURL = "https://github.com/KarimEbrahemAbdelaziz/Zen.git"; 538 | requirement = { 539 | kind = upToNextMajorVersion; 540 | minimumVersion = 0.1.3; 541 | }; 542 | }; 543 | BCDB9AC0243D7E5100D23B0F /* XCRemoteSwiftPackageReference "Alamofire" */ = { 544 | isa = XCRemoteSwiftPackageReference; 545 | repositoryURL = "https://github.com/Alamofire/Alamofire.git"; 546 | requirement = { 547 | kind = upToNextMajorVersion; 548 | minimumVersion = 5.1.0; 549 | }; 550 | }; 551 | /* End XCRemoteSwiftPackageReference section */ 552 | 553 | /* Begin XCSwiftPackageProductDependency section */ 554 | BC27B52F243D617C005E6E0E /* Zen */ = { 555 | isa = XCSwiftPackageProductDependency; 556 | package = BC27B52E243D617C005E6E0E /* XCRemoteSwiftPackageReference "Zen" */; 557 | productName = Zen; 558 | }; 559 | BCDB9AC1243D7E5100D23B0F /* Alamofire */ = { 560 | isa = XCSwiftPackageProductDependency; 561 | package = BCDB9AC0243D7E5100D23B0F /* XCRemoteSwiftPackageReference "Alamofire" */; 562 | productName = Alamofire; 563 | }; 564 | /* End XCSwiftPackageProductDependency section */ 565 | }; 566 | rootObject = BCC88A4C243C12090087AFAB /* Project object */; 567 | } 568 | --------------------------------------------------------------------------------