├── .gitattributes ├── .gitignore ├── .travis.yml ├── .yo-rc.json ├── CONTRIBUTING.md ├── README.md ├── generators ├── app │ └── index.js ├── carthage │ ├── index.js │ └── templates │ │ ├── Cartfile.private │ │ └── Cartfile.resolved ├── cocoapods │ ├── index.js │ └── templates │ │ └── PROJECT_NAME.podspec ├── contributing │ ├── index.js │ └── templates │ │ └── CONTRIBUTING.md ├── gitignore │ ├── index.js │ └── templates │ │ └── gitignore ├── license │ ├── index.js │ └── templates │ │ └── LICENSE ├── mobileprovision │ └── index.js ├── readme │ ├── index.js │ └── templates │ │ └── README.md ├── script │ ├── index.js │ └── templates │ │ ├── Gemfile │ │ ├── Gemfile.lock │ │ ├── Makefile │ │ └── script │ │ ├── README.md │ │ └── cert ├── travis │ ├── index.js │ └── templates │ │ └── .travis.yml └── xcode │ ├── index.js │ └── templates │ ├── Example │ ├── AppDelegate.swift │ ├── Assets.xcassets │ │ └── AppIcon.appiconset │ │ │ └── Contents.json │ ├── Base.lproj │ │ ├── LaunchScreen.storyboard │ │ └── Main.storyboard │ ├── Info.plist │ └── ViewController.swift │ ├── PROJECT_NAME.xcodeproj │ ├── project.pbxproj │ ├── project.xcworkspace │ │ └── contents.xcworkspacedata │ └── xcshareddata │ │ └── xcschemes │ │ └── PROJECT_NAME.xcscheme │ ├── PROJECT_NAME │ ├── Info.plist │ ├── PROJECT_NAME.h │ └── PROJECT_NAME.swift │ └── UnitTests │ ├── Info.plist │ └── UnitTests.swift ├── package.json └── test ├── test-app.js ├── test-carthage.js ├── test-cocoapods.js ├── test-contributing.js ├── test-gitignore.js ├── test-license.js ├── test-readme.js ├── test-script.js └── test-travis.js /.gitattributes: -------------------------------------------------------------------------------- 1 | * text=auto 2 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules/ 2 | -------------------------------------------------------------------------------- /.travis.yml: -------------------------------------------------------------------------------- 1 | sudo: false 2 | language: node_js 3 | node_js: 4 | - '5' 5 | - '4' 6 | before_script: 7 | - npm prune 8 | after_success: 9 | - 'curl -Lo travis_after_all.py https://git.io/travis_after_all' 10 | - python travis_after_all.py 11 | - export $(cat .to_export_back) &> /dev/null 12 | - npm run semantic-release 13 | branches: 14 | except: 15 | - /^v\d+\.\d+\.\d+$/ 16 | notifications: 17 | slack: 18 | secure: rnwOVPsCeKJaU2J/qnovUkMyyAi/NBYh4fVlOK9PhtIgwbqG88xIK82QtlpSt/8I9WlOMCTCGvkXD3i+SFTY+S072iTqR+NA21D87Vu3gb2a2AfVdWTUqX9eJW4jKKhZ+e15siUcO4qIUnvYTI6kHap3RoGtcBpLFe132cHUpY0KLv/DVI9K++4Cem1W8syhbqY1WRvd6FrvGxt+WFnvjTJonIIEHNOCp7a2uGgaENaUvwJJZUoW3bqDqM3HMuNpsKHlr1sPn5/bcBAtkINWXkgXNThkXXRT8+tb3H83BhmM7YHI99qk62DJ3xLa4TVimQpDxBs3hD7bI2qhY3tb8q4Z25aDEk+hYWkkcER0sOp+GyYfOjOKn8iJmPFgcoBeH122bfERZ+ysUjSZtZtb1y8CI0S3g8odQzYpPgffj7+Ip1ZTJrbVXP7x14lQ/0FLoR56rGoZlqdG9O7gEWgyDpsNZJMpv+UrOKg875TIThmGbCNZ7AVF0/T7xkOD4oPDGFufl+2lmW5DYhYWYq9R27xSvfT+dzctWUkBBnI58wSk7p+r9we5QRBfswmDbc00yW3fvXl7ETblFKk4gsGTHMC5QvZQQayGmt4R+uu7rvXTHGFK0TEimWtbjZ9lmKQs/AmZzbUW59H7pEZukTxEwR14M7RePNz2VWUePIIMWlo= 19 | email: false 20 | -------------------------------------------------------------------------------- /.yo-rc.json: -------------------------------------------------------------------------------- 1 | { 2 | "generator-generator": {} 3 | } -------------------------------------------------------------------------------- /CONTRIBUTING.md: -------------------------------------------------------------------------------- 1 | We love that you’re interested in contributing to generator-swift-framework! Any contribution is more than welcome! 2 | 3 | ## generator-swift-framework is simple 4 | 5 | Please file issues or submit pull requests for anything you’d like to see! However, we make no promises that they’ll be accepted—many suggestions will be rejected to preserve simplicity. 6 | 7 | ## Prefer pull requests 8 | 9 | If you know exactly how to implement the feature being suggested or fix the bug being reported, please open a pull request instead of an issue. Pull requests are easier than patches or inline code blocks for discussing and merging the changes. 10 | 11 | If you can’t make the change yourself, please open an issue after making sure that one isn’t already logged. 12 | 13 | ## Get started 14 | 15 | After checkout, you can bootstrap the development environment by running the following command from the cloned directory: 16 | 17 | ```bash 18 | npm install 19 | ``` 20 | ## Update Templates 21 | 22 | If you want to update existing Xcode Template Project, you can open it in Xcode directly or run the following command 23 | 24 | ```bash 25 | npm run open-template-project 26 | ``` 27 | 28 | Then, you can changed everything you want, the Template Project is just a normal Xcode project. It can be built, tested and anything available in Xcode. 29 | 30 | ## Create New Template 31 | 32 | Create **Cocoa Touch Framework** target in Xcode with following settings: 33 | 34 | - Use `PROJECT_NAME` for **Product Name** 35 | - Use `ORGANIZATION_NAME` for **Organization Name** 36 | - Use `ORGANIZATION-ID` for **Organization Identifier** 37 | - Do NOT select **Include Unit Tests**, see [reason]() 38 | 39 | 40 | ## Pass Tests 41 | 42 | In order to archive best quality, generator-swift-framework has a lot of tests to pursue this goal. After changed the code, it's better to update the tests accordingly and have all tests passed with the following command: 43 | 44 | ```bash 45 | npm test 46 | ``` 47 | 48 | ## Code style 49 | 50 | If you’re interested in contributing code, please have a look at our [style guide](http://standardjs.com/), which we try to match fairly closely. 51 | 52 | If you have a case that is not covered in the style guide, simply do your best to match the style of the surrounding code. 53 | 54 | **Thanks for contributing!** 55 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # generator-swift-framework 2 | 3 | > Scaffolds out a Xcode Embedded Framework project with Swift 2.0 4 | 5 | [![Build Status](http://img.shields.io/travis/cybertk/generator-swift-framework.svg?style=flat)](https://travis-ci.org/cybertk/generator-swift-framework) 6 | [![js-standard-style](https://img.shields.io/badge/code%20style-standard-brightgreen.svg)](http://standardjs.com/) 7 | [![Dependency Status](https://david-dm.org/cybertk/generator-swift-framework.svg)](https://david-dm.org/cybertk/generator-swift-framework) 8 | [![devDependency Status](https://david-dm.org/cybertk/generator-swift-framework/dev-status.svg)](https://david-dm.org/cybertk/generator-swift-framework#info=devDependencies) 9 | [![semantic-release](https://img.shields.io/badge/%20%20%F0%9F%93%A6%F0%9F%9A%80-semantic--release-e10079.svg)](https://github.com/semantic-release/semantic-release) 10 | 11 | generator-swift-framework is used to create a Xcode [Embedded Framework](https://developer.apple.com/library/ios/documentation/General/Conceptual/ExtensibilityPG/ExtensionScenarios.html) project with the following features: 12 | 13 | - Embedded Framework template 14 | - Unit Test template based on [Nimble](https://github.com/quick/nimble) 15 | - Example App template 16 | - Swift 2.0 syntax 17 | - Manage dependencies with [Carthage][] 18 | - Support distribution via [CocoaPods](http://cocoapods.com) and [Carthage][] 19 | - MIT License 20 | - Test suites to cover distributions and fundamentals with `make test` 21 | - [Scripts](https://github.com/cybertk/ios-build-scripts) for working on CLI and CI integration 22 | - Optional Travis CI integration 23 | - Optional Apple Development Certification provisioning 24 | 25 | [Carthage]: https://github.com/carthage/carthage 26 | 27 | ## Getting Started 28 | 29 | To install the latest stable version of generator-swift-framework from npm, run: 30 | 31 | ```bash 32 | npm install -g generator-swift-framework 33 | ``` 34 | 35 | Make a new directory for the framework, and cd into it: 36 | 37 | ```bash 38 | mkdir my-new-framework && cd $_ 39 | ``` 40 | 41 | Then, initiate the generator via [Yeoman][]: 42 | 43 | ```bash 44 | yo swift-framework 45 | ``` 46 | 47 | generator-swift-framework is actually a [Yeoman Generator](#yeoman-generators). 48 | 49 | [Yeoman]: http://yeoman.io 50 | 51 | ### What is Yeoman? 52 | 53 | Trick question. It's not a thing. It's this guy: 54 | 55 | ![](http://i.imgur.com/JHaAlBJ.png) 56 | 57 | Basically, he wears a top hat, lives in your computer, and waits for you to tell him what kind of application you wish to create. 58 | 59 | Not every new computer comes with a Yeoman pre-installed. He lives in the [npm](https://npmjs.org) package repository. You only have to ask for him once, then he packs up and moves into your hard drive. *Make sure you clean up, he likes new and shiny things.* 60 | 61 | ```bash 62 | npm install -g yo 63 | ``` 64 | 65 | ### Yeoman Generators 66 | 67 | Yeoman travels light. He didn't pack any generators when he moved in. You can think of a generator like a plug-in. You get to choose what type of application you wish to create, such as a Backbone application or even a Chrome extension. 68 | 69 | ## Contributions 70 | 71 | To install the development branch 72 | 73 | ``` 74 | npm install -g github:cybertk/generator-swift-framework#branch/name 75 | ``` 76 | 77 | See [Contribution Guide](CONTRIBUTING.md) for more details. 78 | 79 | ## License 80 | 81 | generator-swift-framework is available under the MIT license. 82 | -------------------------------------------------------------------------------- /generators/app/index.js: -------------------------------------------------------------------------------- 1 | 'use strict' 2 | var generators = require('yeoman-generator') 3 | var _ = require('underscore') 4 | 5 | module.exports = generators.Base.extend({ 6 | constructor: function () { 7 | generators.Base.apply(this, arguments) 8 | 9 | // This method adds support for a `--skip-install` flag 10 | this.option('skipInstall', { 11 | type: Boolean, 12 | required: false, 13 | defaults: false, 14 | desc: 'Do not install Carthage deps' 15 | }) 16 | }, 17 | 18 | prompting: { 19 | askFor: function () { 20 | // Have Yeoman greet the user. 21 | this.log('Welcome to using swift.framework generator!') 22 | this.log('If you have any questions, please submit issue at https://github.com/cybertk/generator-swift-framework/issues') 23 | this.log() 24 | 25 | var prompts = [{ 26 | type: 'input', 27 | name: 'projectName', 28 | message: 'Project Name', 29 | default: 'MyProject' 30 | }, { 31 | type: 'input', 32 | name: 'organizationName', 33 | message: 'Organization Name', 34 | default: 'MyOrg', 35 | store: true 36 | }, { 37 | type: 'input', 38 | name: 'organizationId', 39 | message: 'Organization Identifier', 40 | default: 'org.my', 41 | store: true 42 | }] 43 | 44 | return this.prompt(prompts).then(function (props) { 45 | this.projectName = props.projectName 46 | this.organizationName = props.organizationName 47 | this.organizationId = props.organizationId 48 | 49 | this.props = props 50 | }.bind(this)) 51 | }, 52 | 53 | askForCocoaPods: function () { 54 | var prompts = [{ 55 | type: 'confirm', 56 | name: 'cocoapods', 57 | message: 'Would you like to distribute via CocoaPods?', 58 | default: true 59 | }] 60 | 61 | return this.prompt(prompts).then(function (props) { 62 | this.cocoapods = props.cocoapods 63 | }.bind(this)) 64 | }, 65 | 66 | askForGitHub: function () { 67 | var prompts = [{ 68 | type: 'input', 69 | name: 'githubUser', 70 | message: 'Would you mind telling me your username on GitHub?', 71 | store: true 72 | }] 73 | 74 | return this.prompt(prompts).then(function (props) { 75 | this.githubUser = props.githubUser 76 | this.props = _.extend(this.props, props) 77 | }.bind(this)) 78 | }, 79 | 80 | askForTravis: function () { 81 | var prompts = [{ 82 | type: 'confirm', 83 | name: 'travis', 84 | message: 'Would you like to enable Travis CI?', 85 | default: true 86 | }] 87 | 88 | return this.prompt(prompts).then(function (props) { 89 | this.travis = props.travis 90 | }.bind(this)) 91 | }, 92 | 93 | askForCertPath: function () { 94 | var travis = this.travis 95 | 96 | var prompts = [{ 97 | type: 'confirm', 98 | name: 'mobileprovision', 99 | message: 'Would you like to provision Development Certificate', 100 | default: true, 101 | store: true, 102 | when: function () { 103 | return travis 104 | } 105 | }] 106 | 107 | return this.prompt(prompts).then(function (props) { 108 | this.mobileprovision = props.mobileprovision 109 | }.bind(this)) 110 | } 111 | }, 112 | 113 | default: function () { 114 | this.composeWith('swift-framework:xcode', { 115 | options: { 116 | organizationName: this.props.organizationName, 117 | organizationId: this.props.organizationId, 118 | projectName: this.props.projectName 119 | } 120 | }, { 121 | local: require.resolve('../xcode') 122 | }) 123 | 124 | this.composeWith('swift-framework:readme', { 125 | options: { 126 | projectName: this.props.projectName, 127 | githubUser: this.props.githubUser 128 | } 129 | }, { 130 | local: require.resolve('../readme') 131 | }) 132 | 133 | this.composeWith('swift-framework:contributing', { 134 | options: { 135 | projectName: this.props.projectName 136 | } 137 | }, { 138 | local: require.resolve('../contributing') 139 | }) 140 | 141 | this.composeWith('swift-framework:script', { 142 | options: { 143 | projectName: this.props.projectName 144 | } 145 | }, { 146 | local: require.resolve('../script') 147 | }) 148 | 149 | this.composeWith('swift-framework:license', { 150 | options: { 151 | organizationName: this.props.organizationName 152 | } 153 | }, { 154 | local: require.resolve('../license') 155 | }) 156 | 157 | this.composeWith('swift-framework:carthage', { 158 | options: { 159 | skipInstall: this.options.skipInstall 160 | } 161 | }, { 162 | local: require.resolve('../carthage') 163 | }) 164 | 165 | this.composeWith('swift-framework:gitignore', {}, { 166 | local: require.resolve('../gitignore') 167 | }) 168 | 169 | if (this.travis) { 170 | this.composeWith('swift-framework:travis', {}, { 171 | local: require.resolve('../travis') 172 | }) 173 | } 174 | 175 | if (this.mobileprovision) { 176 | this.composeWith('swift-framework:mobileprovision', {}, { 177 | local: require.resolve('../mobileprovision') 178 | }) 179 | } 180 | 181 | if (this.cocoapods) { 182 | this.composeWith('swift-framework:cocoapods', { 183 | options: { 184 | projectName: this.props.projectName, 185 | githubUser: this.props.githubUser 186 | } 187 | }, { 188 | local: require.resolve('../cocoapods') 189 | }) 190 | } 191 | }, 192 | 193 | end: { 194 | openXcode: function () { 195 | if (this.options.openXcode !== false) { 196 | this.spawnCommand('open', [this.destinationPath(this.projectName + '.xcodeproj')]) 197 | } 198 | } 199 | } 200 | }) 201 | -------------------------------------------------------------------------------- /generators/carthage/index.js: -------------------------------------------------------------------------------- 1 | 'use strict' 2 | var generators = require('yeoman-generator') 3 | 4 | module.exports = generators.Base.extend({ 5 | constructor: function () { 6 | generators.Base.apply(this, arguments) 7 | 8 | this.option('skipInstall', { 9 | type: Boolean, 10 | required: false, 11 | defaults: true, 12 | desc: 'Do not install Carthage deps' 13 | }) 14 | }, 15 | 16 | initializing: function () { 17 | this.fs.copy(this.templatePath('Cartfile.*'), this.destinationPath('./')) 18 | }, 19 | 20 | install: { 21 | carthageBootstrap: function () { 22 | if (this.options.skipInstall) { 23 | this.log('Please run `carthage bootstrap`') 24 | return 25 | } 26 | 27 | var done = this.async() 28 | 29 | this.log('Carthage bootstraping') 30 | var child = this.spawnCommand('carthage', ['bootstrap']) 31 | child.on('exit', done) 32 | } 33 | } 34 | }) 35 | -------------------------------------------------------------------------------- /generators/carthage/templates/Cartfile.private: -------------------------------------------------------------------------------- 1 | github "Quick/Nimble" "swift-2.0" 2 | -------------------------------------------------------------------------------- /generators/carthage/templates/Cartfile.resolved: -------------------------------------------------------------------------------- 1 | github "Quick/Nimble" "930aab083cd4e2054faca10431929202dc807a07" 2 | -------------------------------------------------------------------------------- /generators/cocoapods/index.js: -------------------------------------------------------------------------------- 1 | 'use strict' 2 | var generators = require('yeoman-generator') 3 | 4 | module.exports = generators.Base.extend({ 5 | constructor: function () { 6 | generators.Base.apply(this, arguments) 7 | 8 | this.option('githubUser', { 9 | type: String, 10 | required: true, 11 | desc: 'Github user name' 12 | }) 13 | this.option('projectName', { 14 | type: String, 15 | required: true, 16 | desc: 'Project name' 17 | }) 18 | }, 19 | 20 | initializing: function () { 21 | var podspec = this.destinationPath(this.options.projectName + '.podspec') 22 | this.fs.copyTpl(this.templatePath('PROJECT_NAME.podspec'), podspec, this.options) 23 | } 24 | }) 25 | -------------------------------------------------------------------------------- /generators/cocoapods/templates/PROJECT_NAME.podspec: -------------------------------------------------------------------------------- 1 | Pod::Spec.new do |s| 2 | 3 | s.name = "<%= projectName %>" 4 | s.version = "0.1.0" 5 | s.license = "MIT" 6 | s.summary = "A short description" 7 | s.homepage = "https://github.com/<%= githubUser %>/<%= projectName %>" 8 | s.author = "<%= projectName %> Contributors" 9 | s.source = { :git => "https://github.com/<%= githubUser %>/<%= projectName %>.git", :tag => "v#{s.version}" } 10 | 11 | s.platform = :ios, "8.0" 12 | s.requires_arc = true 13 | 14 | s.source_files = "<%= projectName %>/**/*.swift" 15 | end 16 | -------------------------------------------------------------------------------- /generators/contributing/index.js: -------------------------------------------------------------------------------- 1 | 'use strict' 2 | var generators = require('yeoman-generator') 3 | 4 | module.exports = generators.Base.extend({ 5 | constructor: function () { 6 | generators.Base.apply(this, arguments) 7 | 8 | this.option('projectName', { 9 | type: String, 10 | required: true, 11 | desc: 'Project name' 12 | }) 13 | }, 14 | 15 | initializing: function () { 16 | this.fs.copyTpl(this.templatePath('CONTRIBUTING.md'), this.destinationPath('CONTRIBUTING.md'), this.options) 17 | } 18 | }) 19 | -------------------------------------------------------------------------------- /generators/contributing/templates/CONTRIBUTING.md: -------------------------------------------------------------------------------- 1 | We love that you’re interested in contributing to <%= projectName %>! Any contribution is more than welcome! 2 | 3 | ## <%= projectName %> is simple 4 | 5 | Please file issues or submit pull requests for anything you’d like to see! However, we make no promises that they’ll be accepted—many suggestions will be rejected to preserve simplicity. 6 | 7 | ## Prefer pull requests 8 | 9 | If you know exactly how to implement the feature being suggested or fix the bug being reported, please open a pull request instead of an issue. Pull requests are easier than patches or inline code blocks for discussing and merging the changes. 10 | 11 | If you can’t make the change yourself, please open an issue after making sure that one isn’t already logged. 12 | 13 | ## Get started 14 | 15 | After checkout, you can bootstrap the development environment by running the following command from the cloned directory: 16 | 17 | ```bash 18 | make bootstrap 19 | ``` 20 | 21 | Then, open the workspace in Xcode, and make your changes: 22 | 23 | ```bash 24 | open <%= projectName %>.xcodeproj 25 | ``` 26 | 27 | ## Pass Tests 28 | 29 | In order to archive best quality, <%= projectName %> has a lot tests to pursue this goal. After changed the code, it's better to update the tests accordingly and have all tests passed with the following command: 30 | 31 | ```bash 32 | make test 33 | ``` 34 | 35 | ## Code style 36 | 37 | If you’re interested in contributing code, please have a look at our [style guide](https://github.com/github/swift-style-guide), which we try to match fairly closely. 38 | 39 | If you have a case that is not covered in the style guide, simply do your best to match the style of the surrounding code. 40 | 41 | ## Communication 42 | 43 | **Thanks for contributing!** 44 | -------------------------------------------------------------------------------- /generators/gitignore/index.js: -------------------------------------------------------------------------------- 1 | 'use strict' 2 | var generators = require('yeoman-generator') 3 | 4 | module.exports = generators.Base.extend({ 5 | constructor: function () { 6 | generators.Base.apply(this, arguments) 7 | }, 8 | 9 | initializing: function () { 10 | this.fs.copy(this.templatePath('gitignore'), this.destinationPath('.gitignore')) 11 | } 12 | }) 13 | -------------------------------------------------------------------------------- /generators/gitignore/templates/gitignore: -------------------------------------------------------------------------------- 1 | # OS X 2 | .DS_Store 3 | 4 | # Xcode 5 | build/ 6 | *.pbxuser 7 | !default.pbxuser 8 | *.mode1v3 9 | !default.mode1v3 10 | *.mode2v3 11 | !default.mode2v3 12 | *.perspectivev3 13 | !default.perspectivev3 14 | xcuserdata 15 | *.xccheckout 16 | profile 17 | *.moved-aside 18 | DerivedData 19 | *.hmap 20 | *.ipa 21 | 22 | # Bundler 23 | .bundle 24 | 25 | Carthage 26 | # We recommend against adding the Pods directory to your .gitignore. However 27 | # you should judge for yourself, the pros and cons are mentioned at: 28 | # http://guides.cocoapods.org/using/using-cocoapods.html#should-i-ignore-the-pods-directory-in-source-control 29 | # 30 | # Note: if you ignore the Pods directory, make sure to uncomment 31 | # `pod install` in .travis.yml 32 | # 33 | # Pods/ 34 | -------------------------------------------------------------------------------- /generators/license/index.js: -------------------------------------------------------------------------------- 1 | 'use strict' 2 | var generators = require('yeoman-generator') 3 | 4 | module.exports = generators.Base.extend({ 5 | constructor: function () { 6 | generators.Base.apply(this, arguments) 7 | 8 | this.option('organizationName', { 9 | type: String, 10 | required: true, 11 | desc: 'Organization name' 12 | }) 13 | }, 14 | 15 | initializing: function () { 16 | this.fs.copyTpl(this.templatePath('LICENSE'), this.destinationPath('LICENSE'), this.options) 17 | } 18 | }) 19 | -------------------------------------------------------------------------------- /generators/license/templates/LICENSE: -------------------------------------------------------------------------------- 1 | Copyright (c) 2015 <%= organizationName %> 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 | -------------------------------------------------------------------------------- /generators/mobileprovision/index.js: -------------------------------------------------------------------------------- 1 | 'use strict' 2 | var generators = require('yeoman-generator') 3 | var path = require('path') 4 | var fs = require('fs') 5 | 6 | var resolvePath = function (string) { 7 | if (string.substr(0, 1) === '~') { 8 | string = process.env.HOME + string.substr(1) 9 | } 10 | return path.resolve(string) 11 | } 12 | 13 | module.exports = generators.Base.extend({ 14 | constructor: function () { 15 | generators.Base.apply(this, arguments) 16 | 17 | this.option('organizationName', { 18 | type: String, 19 | required: true, 20 | desc: 'Organization name' 21 | }) 22 | }, 23 | prompting: { 24 | askForCertPath: function () { 25 | var done = this.async() 26 | 27 | var prompts = [{ 28 | type: 'input', 29 | name: 'certPath', 30 | message: 'Development Certificate Path', 31 | default: 'path/to/development.p12', 32 | store: true 33 | }, { 34 | type: 'confirm', 35 | name: 'askCertPathAgain', 36 | message: 'The certificate you provide does not exist, specify again?', 37 | default: true, 38 | when: function (answers) { 39 | var done = this.async() 40 | 41 | answers.certPath = resolvePath(answers.certPath) 42 | fs.stat(answers.certPath, function (err, stats) { 43 | if (err || !stats.isFile()) { 44 | answers.certPath = null 45 | } 46 | done(answers.certPath === null) 47 | }) 48 | } 49 | }] 50 | 51 | this.prompt(prompts, function (props) { 52 | if (props.askCertPathAgain) { 53 | return this.prompting.askForCertPath.call(this) 54 | } 55 | 56 | this.certPath = props.certPath 57 | done() 58 | }.bind(this)) 59 | } 60 | }, 61 | 62 | writing: function () { 63 | if (this.certPath) { 64 | this.fs.copy(this.certPath, this.destinationPath('script/certificates/development.p12')) 65 | } 66 | } 67 | }) 68 | -------------------------------------------------------------------------------- /generators/readme/index.js: -------------------------------------------------------------------------------- 1 | 'use strict' 2 | var generators = require('yeoman-generator') 3 | 4 | module.exports = generators.Base.extend({ 5 | constructor: function () { 6 | generators.Base.apply(this, arguments) 7 | 8 | this.option('githubUser', { 9 | type: String, 10 | required: true, 11 | desc: 'Github user name' 12 | }) 13 | this.option('projectName', { 14 | type: String, 15 | required: true, 16 | desc: 'Project name' 17 | }) 18 | }, 19 | 20 | initializing: function () { 21 | this.fs.copyTpl(this.templatePath('README.md'), this.destinationPath('README.md'), this.options) 22 | } 23 | }) 24 | -------------------------------------------------------------------------------- /generators/readme/templates/README.md: -------------------------------------------------------------------------------- 1 | # <%= projectName %> 2 | 3 | [![CI Status](http://img.shields.io/travis/<%= githubUser %>/<%= projectName %>.svg?style=flat)](https://travis-ci.org/<%= githubUser %>/<%= projectName %>) 4 | [![Carthage compatible](https://img.shields.io/badge/Carthage-compatible-4BC51D.svg?style=flat)](https://github.com/Carthage/Carthage) 5 | [![Version](https://img.shields.io/cocoapods/v/<%= projectName %>.svg?style=flat)](http://cocoapods.org/pods/<%= projectName %>) 6 | [![Platform](https://img.shields.io/cocoapods/p/<%= projectName %>.svg?style=flat)](http://cocoapods.org/pods/<%= projectName %>) 7 | 8 | ## Usage 9 | 10 | To run the example project, clone the repo, and open `Example` target within Xcode. 11 | 12 | ## Requirements 13 | 14 | - iOS 8.0 and above 15 | - Xcode 7.0 and above 16 | 17 | ## Installation 18 | 19 | ### Carthage 20 | 21 | <%= projectName %> is available through [Carthage](https://github.com/carthage/carthage). To install it, simply add the following line to your Cartfile: 22 | 23 | ``` 24 | github "<%= githubUser %>/<%= projectName %>" 25 | ``` 26 | 27 | ### Cocoapods 28 | 29 | <%= projectName %> is available through [CocoaPods](http://cocoapods.org). To install 30 | it, simply add the following line to your Podfile: 31 | 32 | ```ruby 33 | pod "<%= projectName %>" 34 | ``` 35 | 36 | ## Author 37 | 38 | [@<%= githubUser %>](https://github.com/<%= githubUser %>) 39 | 40 | ## License 41 | 42 | <%= projectName %> is available under the MIT license. See the [LICENSE](LICENSE) file for more info. 43 | -------------------------------------------------------------------------------- /generators/script/index.js: -------------------------------------------------------------------------------- 1 | 'use strict' 2 | var generators = require('yeoman-generator') 3 | 4 | module.exports = generators.Base.extend({ 5 | constructor: function () { 6 | generators.Base.apply(this, arguments) 7 | 8 | this.option('projectName', { 9 | type: String, 10 | required: true, 11 | desc: 'Project name' 12 | }) 13 | }, 14 | 15 | initializing: function () { 16 | this.fs.copyTpl(this.templatePath('Makefile'), this.destinationPath('Makefile'), this.options) 17 | this.fs.copy(this.templatePath('script/*'), this.destinationPath('script/')) 18 | this.fs.copy(this.templatePath('Gemfile*'), this.destinationPath('./')) 19 | } 20 | }) 21 | -------------------------------------------------------------------------------- /generators/script/templates/Gemfile: -------------------------------------------------------------------------------- 1 | source "https://rubygems.org" 2 | 3 | gem "xcpretty", "~> 0.1.10" 4 | gem "cocoapods", "~> 0.39.0.beta.3" 5 | -------------------------------------------------------------------------------- /generators/script/templates/Gemfile.lock: -------------------------------------------------------------------------------- 1 | GEM 2 | remote: https://rubygems.org/ 3 | specs: 4 | activesupport (4.2.4) 5 | i18n (~> 0.7) 6 | json (~> 1.7, >= 1.7.7) 7 | minitest (~> 5.1) 8 | thread_safe (~> 0.3, >= 0.3.4) 9 | tzinfo (~> 1.1) 10 | claide (0.9.1) 11 | cocoapods (0.39.0.beta.3) 12 | activesupport (>= 3.2.15) 13 | claide (~> 0.9.1) 14 | cocoapods-core (= 0.39.0.beta.3) 15 | cocoapods-downloader (~> 0.9.3) 16 | cocoapods-plugins (~> 0.4.2) 17 | cocoapods-stats (~> 0.6.1) 18 | cocoapods-trunk (~> 0.6.3) 19 | cocoapods-try (~> 0.5.1) 20 | colored (~> 1.2) 21 | escape (~> 0.0.4) 22 | molinillo (~> 0.3.1) 23 | nap (~> 1.0) 24 | xcodeproj (~> 0.27.1) 25 | cocoapods-core (0.39.0.beta.3) 26 | activesupport (>= 3.2.15) 27 | fuzzy_match (~> 2.0.4) 28 | nap (~> 1.0) 29 | cocoapods-downloader (0.9.3) 30 | cocoapods-plugins (0.4.2) 31 | nap 32 | cocoapods-stats (0.6.1) 33 | cocoapods-trunk (0.6.4) 34 | nap (>= 0.8, < 2.0) 35 | netrc (= 0.7.8) 36 | cocoapods-try (0.5.1) 37 | colored (1.2) 38 | escape (0.0.4) 39 | fuzzy_match (2.0.4) 40 | i18n (0.7.0) 41 | json (1.8.3) 42 | minitest (5.8.0) 43 | molinillo (0.3.1) 44 | nap (1.0.0) 45 | netrc (0.7.8) 46 | thread_safe (0.3.5) 47 | tzinfo (1.2.2) 48 | thread_safe (~> 0.1) 49 | xcodeproj (0.27.1) 50 | activesupport (>= 3) 51 | claide (~> 0.9.1) 52 | colored (~> 1.2) 53 | xcpretty (0.1.11) 54 | 55 | PLATFORMS 56 | ruby 57 | 58 | DEPENDENCIES 59 | cocoapods (~> 0.39.0.beta.3) 60 | xcpretty (~> 0.1.10) 61 | -------------------------------------------------------------------------------- /generators/script/templates/Makefile: -------------------------------------------------------------------------------- 1 | SHELL = /bin/bash -o pipefail 2 | project = <%= projectName %> 3 | 4 | test: test-unit test-carthage test-cocoapods 5 | 6 | test-unit: 7 | xcodebuild test -scheme $(project) -sdk iphonesimulator ONLY_ACTIVE_ARCH=NO OBJROOT=$(PWD)/build SYMROOT=$(PWD)/build | xcpretty 8 | 9 | test-carthage: 10 | carthage build --verbose --no-skip-current | xcpretty 11 | 12 | test-cocoapods: 13 | pod lib lint $(project).podspec 14 | 15 | bootstrap: 16 | bundle install 17 | 18 | # Detect Travis CI, see http://docs.travis-ci.com/user/environment-variables/ 19 | ifeq ($(TRAVIS_CI),true) 20 | # Cannot brew install carthage on Travis-CI 21 | curl -OL https://github.com/Carthage/Carthage/releases/download/0.8/Carthage.pkg 22 | sudo /usr/sbin/installer -pkg Carthage.pkg -target / 23 | else 24 | brew install carthage 25 | endif 26 | 27 | deps: 28 | carthage bootstrap --use-ssh --verbose | xcpretty 29 | 30 | release: 31 | zip -r -9 $(project).framework.zip Carthage/Build/iOS/*.framework 32 | 33 | clean: 34 | git clean -xfd 35 | git submodule foreach git clean -xfd 36 | rm -rf ~/Library/Developer/Xcode/DerivedData/$(project)-* 37 | 38 | .PHONY: all clean test test-unit test-carthage test-cocoapods bootstrap deps release 39 | -------------------------------------------------------------------------------- /generators/script/templates/script/README.md: -------------------------------------------------------------------------------- 1 | # ios-build-scripts 2 | 3 | [![CI Status](http://img.shields.io/travis/cybertk/ios-build-scripts/master.svg?style=flat)](https://travis-ci.org/cybertk/ios-build-scripts) 4 | 5 | This project is a collection of scripts created with two goals: 6 | 7 | 1. To standardize how iOS projects are bootstrapped after cloning 8 | 1. To easily build iOS projects on continuous integration servers 9 | 10 | ## Getting Started 11 | 12 | ### Commit in repo 13 | 14 | To add the scripts to your project, read the contents of this repository into a script folder: 15 | 16 | bash <(curl -s https://cybertk.github.io/ios-build-scripts/bash) 17 | 18 | Which inactually executes following steps: 19 | 20 | git remote add ios-build-scripts https://github.com/cybertk/ios-build-scripts.git 21 | git fetch ios-build-scripts 22 | git read-tree --prefix=script/ -u ios-build-scripts/master 23 | 24 | Then commit the changes, to incorporate the scripts into your own repository's history. You can also freely tweak the scripts for your specific project's needs. 25 | 26 | To merge in upstream changes later: 27 | 28 | make -C script 29 | 30 | or 31 | 32 | git fetch -p ios-build-scripts 33 | git merge --ff --squash -Xsubtree=script ios-build-scripts/master 34 | 35 | ### git submodules 36 | 37 | git submodule add https://github.com/cybertk/ios-build-scripts.git script 38 | 39 | ## Provisions and Certificates 40 | 41 | **update_keychain** is used to manage Provisions and Certificates, put your certificates and `script/certificates/` dir and put provisions under `script/provisions/` 42 | 43 | ## Run Commands in cibuild context 44 | 45 | You can run any command inside `cibuild` context 46 | 47 | ./script/cibuild echo $GIT_COMMIT $GIT_BRANCH $BUILD 48 | 49 | ## Source cibuild 50 | 51 | You can also source `cibuild` to get env/utility in current context with 52 | 53 | . script/cibuild 54 | -------------------------------------------------------------------------------- /generators/script/templates/script/cert: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | 3 | # The name of the keychain to create for iOS code signing. 4 | KEYCHAIN=ck-ios-build.keychain 5 | 6 | import_certs () 7 | { 8 | local password=cibuild 9 | if security unlock-keychain -p "$password" "$KEYCHAIN" >/dev/null 2>&1 10 | then 11 | echo "warnning: $KEYCHAIN already exist, force removed" 12 | security delete-keychain "$KEYCHAIN" 13 | fi 14 | 15 | echo "*** Setting up code signing..." 16 | 17 | # Create a temporary keychain for code signing. 18 | security create-keychain -p "$password" "$KEYCHAIN" 19 | security default-keychain -s "$KEYCHAIN" 20 | security unlock-keychain -p "$password" "$KEYCHAIN" 21 | security set-keychain-settings -t 3600 -l "$KEYCHAIN" 22 | 23 | # Download the certificate for the Apple Worldwide Developer Relations 24 | # Certificate Authority. 25 | local certpath="$SCRIPT_DIR/apple_wwdr.cer" 26 | curl 'https://developer.apple.com/certificationauthority/AppleWWDRCA.cer' > "$certpath" 27 | security import "$certpath" -k "$KEYCHAIN" -T /usr/bin/codesign 28 | 29 | [ -z "$KEY_PASSWORD" ] && echo "warning: KEY_PASSOWRD is not defined" 30 | 31 | # Import certificates. 32 | for c in $SCRIPT_DIR/certificates/*.p12; 33 | do 34 | [ "$c" = "$SCRIPT_DIR/certificates/*.p12" ] && break 35 | security import "$c" -k "$KEYCHAIN" -P "$KEY_PASSWORD" -T /usr/bin/codesign 36 | done 37 | } 38 | 39 | delete_keychain () 40 | { 41 | security delete-keychain "$KEYCHAIN" 42 | } 43 | 44 | main () { 45 | if [ -z "$SCRIPT_DIR" ]; 46 | then 47 | SCRIPT_DIR=$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd) 48 | fi 49 | 50 | case "$1" in 51 | --import) 52 | import_certs 53 | ;; 54 | --remove) 55 | delete_keychain 56 | ;; 57 | *) 58 | echo "Usage: cert <--import|--remove>" 59 | ;; 60 | esac 61 | } 62 | 63 | main "$@" 64 | -------------------------------------------------------------------------------- /generators/travis/index.js: -------------------------------------------------------------------------------- 1 | 'use strict' 2 | var generators = require('yeoman-generator') 3 | 4 | module.exports = generators.Base.extend({ 5 | constructor: function () { 6 | generators.Base.apply(this, arguments) 7 | }, 8 | 9 | initializing: function () { 10 | this.fs.copy(this.templatePath('.travis.yml'), this.destinationPath('.travis.yml')) 11 | } 12 | }) 13 | -------------------------------------------------------------------------------- /generators/travis/templates/.travis.yml: -------------------------------------------------------------------------------- 1 | language: objective-c 2 | os: osx 3 | osx_image: xcode7 4 | install: 5 | - make bootstrap 6 | before_script: 7 | - script/cert --import 8 | - make deps 9 | script: 10 | - make test 11 | after_script: 12 | - script/cert --remove 13 | notifications: 14 | email: false 15 | -------------------------------------------------------------------------------- /generators/xcode/index.js: -------------------------------------------------------------------------------- 1 | 'use strict' 2 | var generators = require('yeoman-generator') 3 | var glob = require('glob') 4 | 5 | module.exports = generators.Base.extend({ 6 | constructor: function () { 7 | generators.Base.apply(this, arguments) 8 | 9 | this.option('organizationName', { 10 | type: String, 11 | required: true, 12 | desc: 'Organization name' 13 | }) 14 | this.option('organizationId', { 15 | type: String, 16 | required: true, 17 | desc: 'Organization Id' 18 | }) 19 | this.option('projectName', { 20 | type: String, 21 | required: true, 22 | desc: 'Project Name' 23 | }) 24 | }, 25 | 26 | writing: { 27 | xcode: function () { 28 | var files = glob.sync('**/*', { 29 | cwd: this.templatePath('.'), 30 | nodir: true 31 | }) 32 | 33 | files.forEach(function (entry) { 34 | var source = entry 35 | 36 | // Handle file name 37 | source = source.replace(/PROJECT_NAME/g, this.options.projectName) 38 | 39 | this.fs.copyTpl(this.templatePath(entry), this.destinationPath(source), this.options) 40 | 41 | // Handle .xcodeproj 42 | var data = this.fs.read(this.destinationPath(source), 'utf8') 43 | data = data.replace(/ORGANIZATION-ID.PROJECT-NAME/g, 44 | this.options.organizationId + '.' + this.options.projectName) 45 | data = data.replace(/PROJECT_NAME/g, this.options.projectName) 46 | data = data.replace(/ORGANIZATION_NAME/g, this.options.organizationName) 47 | data = data.replace(/ORGANIZATION-ID/g, this.options.organizationId) 48 | this.fs.write(this.destinationPath(source), data, 'utf8') 49 | }.bind(this)) 50 | } 51 | 52 | } 53 | }) 54 | -------------------------------------------------------------------------------- /generators/xcode/templates/Example/AppDelegate.swift: -------------------------------------------------------------------------------- 1 | // 2 | // AppDelegate.swift 3 | // Example 4 | // 5 | // Copyright © 2015 <%= organizationName %>. All rights reserved. 6 | // 7 | 8 | import UIKit 9 | 10 | @UIApplicationMain 11 | class AppDelegate: UIResponder, UIApplicationDelegate { 12 | 13 | var window: UIWindow? 14 | 15 | 16 | func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool { 17 | // Override point for customization after application launch. 18 | return true 19 | } 20 | 21 | func applicationWillResignActive(application: UIApplication) { 22 | // Sent when the application is about to move from active to inactive state. This can occur for certain types of temporary interruptions (such as an incoming phone call or SMS message) or when the user quits the application and it begins the transition to the background state. 23 | // Use this method to pause ongoing tasks, disable timers, and throttle down OpenGL ES frame rates. Games should use this method to pause the game. 24 | } 25 | 26 | func applicationDidEnterBackground(application: UIApplication) { 27 | // Use this method to release shared resources, save user data, invalidate timers, and store enough application state information to restore your application to its current state in case it is terminated later. 28 | // If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits. 29 | } 30 | 31 | func applicationWillEnterForeground(application: UIApplication) { 32 | // Called as part of the transition from the background to the inactive state; here you can undo many of the changes made on entering the background. 33 | } 34 | 35 | func applicationDidBecomeActive(application: UIApplication) { 36 | // Restart any tasks that were paused (or not yet started) while the application was inactive. If the application was previously in the background, optionally refresh the user interface. 37 | } 38 | 39 | func applicationWillTerminate(application: UIApplication) { 40 | // Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:. 41 | } 42 | 43 | 44 | } 45 | 46 | -------------------------------------------------------------------------------- /generators/xcode/templates/Example/Assets.xcassets/AppIcon.appiconset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "iphone", 5 | "size" : "29x29", 6 | "scale" : "2x" 7 | }, 8 | { 9 | "idiom" : "iphone", 10 | "size" : "29x29", 11 | "scale" : "3x" 12 | }, 13 | { 14 | "idiom" : "iphone", 15 | "size" : "40x40", 16 | "scale" : "2x" 17 | }, 18 | { 19 | "idiom" : "iphone", 20 | "size" : "40x40", 21 | "scale" : "3x" 22 | }, 23 | { 24 | "idiom" : "iphone", 25 | "size" : "60x60", 26 | "scale" : "2x" 27 | }, 28 | { 29 | "idiom" : "iphone", 30 | "size" : "60x60", 31 | "scale" : "3x" 32 | }, 33 | { 34 | "idiom" : "ipad", 35 | "size" : "29x29", 36 | "scale" : "1x" 37 | }, 38 | { 39 | "idiom" : "ipad", 40 | "size" : "29x29", 41 | "scale" : "2x" 42 | }, 43 | { 44 | "idiom" : "ipad", 45 | "size" : "40x40", 46 | "scale" : "1x" 47 | }, 48 | { 49 | "idiom" : "ipad", 50 | "size" : "40x40", 51 | "scale" : "2x" 52 | }, 53 | { 54 | "idiom" : "ipad", 55 | "size" : "76x76", 56 | "scale" : "1x" 57 | }, 58 | { 59 | "idiom" : "ipad", 60 | "size" : "76x76", 61 | "scale" : "2x" 62 | } 63 | ], 64 | "info" : { 65 | "version" : 1, 66 | "author" : "xcode" 67 | } 68 | } -------------------------------------------------------------------------------- /generators/xcode/templates/Example/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 | 27 | 28 | -------------------------------------------------------------------------------- /generators/xcode/templates/Example/Base.lproj/Main.storyboard: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | -------------------------------------------------------------------------------- /generators/xcode/templates/Example/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleExecutable 8 | $(EXECUTABLE_NAME) 9 | CFBundleIdentifier 10 | $(PRODUCT_BUNDLE_IDENTIFIER) 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | $(PRODUCT_NAME) 15 | CFBundlePackageType 16 | APPL 17 | CFBundleShortVersionString 18 | 1.0 19 | CFBundleSignature 20 | ???? 21 | CFBundleVersion 22 | 1 23 | LSRequiresIPhoneOS 24 | 25 | UILaunchStoryboardName 26 | LaunchScreen 27 | UIMainStoryboardFile 28 | Main 29 | UIRequiredDeviceCapabilities 30 | 31 | armv7 32 | 33 | UISupportedInterfaceOrientations 34 | 35 | UIInterfaceOrientationPortrait 36 | UIInterfaceOrientationLandscapeLeft 37 | UIInterfaceOrientationLandscapeRight 38 | 39 | UISupportedInterfaceOrientations~ipad 40 | 41 | UIInterfaceOrientationPortrait 42 | UIInterfaceOrientationPortraitUpsideDown 43 | UIInterfaceOrientationLandscapeLeft 44 | UIInterfaceOrientationLandscapeRight 45 | 46 | 47 | 48 | -------------------------------------------------------------------------------- /generators/xcode/templates/Example/ViewController.swift: -------------------------------------------------------------------------------- 1 | // 2 | // ViewController.swift 3 | // Example 4 | // 5 | // Copyright © 2015 <%= organizationName %>. All rights reserved. 6 | // 7 | 8 | import UIKit 9 | 10 | import <%= projectName %> 11 | 12 | class ViewController: UIViewController { 13 | 14 | // MARK: Outlets 15 | 16 | @IBOutlet weak var label: UILabel! 17 | 18 | // MARK: Overrides 19 | 20 | override func viewDidLoad() { 21 | super.viewDidLoad() 22 | // Do any additional setup after loading the view, typically from a nib. 23 | 24 | let p = <%= projectName %>() 25 | label.text = p.hello() 26 | } 27 | 28 | override func didReceiveMemoryWarning() { 29 | super.didReceiveMemoryWarning() 30 | // Dispose of any resources that can be recreated. 31 | } 32 | 33 | 34 | } 35 | 36 | -------------------------------------------------------------------------------- /generators/xcode/templates/PROJECT_NAME.xcodeproj/project.pbxproj: -------------------------------------------------------------------------------- 1 | // !$*UTF8*$! 2 | { 3 | archiveVersion = 1; 4 | classes = { 5 | }; 6 | objectVersion = 46; 7 | objects = { 8 | 9 | /* Begin PBXBuildFile section */ 10 | 9208B45D1B8EBDE000C1631B /* PROJECT_NAME.h in Headers */ = {isa = PBXBuildFile; fileRef = 9208B45C1B8EBDE000C1631B /* PROJECT_NAME.h */; settings = {ATTRIBUTES = (Public, ); }; }; 11 | 9208B4641B8EBDE000C1631B /* PROJECT_NAME.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 9208B4591B8EBDE000C1631B /* PROJECT_NAME.framework */; }; 12 | 9208B4691B8EBDE000C1631B /* UnitTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9208B4681B8EBDE000C1631B /* UnitTests.swift */; }; 13 | 92DC99081B8EF03100350407 /* PROJECT_NAME.swift in Sources */ = {isa = PBXBuildFile; fileRef = 92DC99071B8EF03100350407 /* PROJECT_NAME.swift */; settings = {ASSET_TAGS = (); }; }; 14 | 92DC990A1B9215EE00350407 /* Nimble.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 92DC99091B9215EE00350407 /* Nimble.framework */; }; 15 | 92DC99291B93418500350407 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 92DC99281B93418500350407 /* AppDelegate.swift */; }; 16 | 92DC992B1B93418500350407 /* ViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 92DC992A1B93418500350407 /* ViewController.swift */; }; 17 | 92DC992E1B93418500350407 /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 92DC992C1B93418500350407 /* Main.storyboard */; }; 18 | 92DC99301B93418500350407 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 92DC992F1B93418500350407 /* Assets.xcassets */; }; 19 | 92DC99331B93418500350407 /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 92DC99311B93418500350407 /* LaunchScreen.storyboard */; }; 20 | 92DC993A1B93547600350407 /* PROJECT_NAME.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 9208B4591B8EBDE000C1631B /* PROJECT_NAME.framework */; }; 21 | /* End PBXBuildFile section */ 22 | 23 | /* Begin PBXContainerItemProxy section */ 24 | 9208B4651B8EBDE000C1631B /* PBXContainerItemProxy */ = { 25 | isa = PBXContainerItemProxy; 26 | containerPortal = 9208B4501B8EBDE000C1631B /* Project object */; 27 | proxyType = 1; 28 | remoteGlobalIDString = 9208B4581B8EBDE000C1631B; 29 | remoteInfo = PROJECT_NAME; 30 | }; 31 | /* End PBXContainerItemProxy section */ 32 | 33 | /* Begin PBXFileReference section */ 34 | 9208B4591B8EBDE000C1631B /* PROJECT_NAME.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = PROJECT_NAME.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 35 | 9208B45C1B8EBDE000C1631B /* PROJECT_NAME.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = PROJECT_NAME.h; sourceTree = ""; }; 36 | 9208B45E1B8EBDE000C1631B /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 37 | 9208B4631B8EBDE000C1631B /* UnitTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = UnitTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; 38 | 9208B4681B8EBDE000C1631B /* UnitTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UnitTests.swift; sourceTree = ""; }; 39 | 9208B46A1B8EBDE000C1631B /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 40 | 92DC99071B8EF03100350407 /* PROJECT_NAME.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PROJECT_NAME.swift; sourceTree = ""; }; 41 | 92DC99091B9215EE00350407 /* Nimble.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Nimble.framework; path = Carthage/Build/iOS/Nimble.framework; sourceTree = ""; }; 42 | 92DC99261B93418500350407 /* Example.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Example.app; sourceTree = BUILT_PRODUCTS_DIR; }; 43 | 92DC99281B93418500350407 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; 44 | 92DC992A1B93418500350407 /* ViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ViewController.swift; sourceTree = ""; }; 45 | 92DC992D1B93418500350407 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; 46 | 92DC992F1B93418500350407 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; 47 | 92DC99321B93418500350407 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; 48 | 92DC99341B93418500350407 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 49 | /* End PBXFileReference section */ 50 | 51 | /* Begin PBXFrameworksBuildPhase section */ 52 | 9208B4551B8EBDE000C1631B /* Frameworks */ = { 53 | isa = PBXFrameworksBuildPhase; 54 | buildActionMask = 2147483647; 55 | files = ( 56 | ); 57 | runOnlyForDeploymentPostprocessing = 0; 58 | }; 59 | 9208B4601B8EBDE000C1631B /* Frameworks */ = { 60 | isa = PBXFrameworksBuildPhase; 61 | buildActionMask = 2147483647; 62 | files = ( 63 | 92DC990A1B9215EE00350407 /* Nimble.framework in Frameworks */, 64 | 9208B4641B8EBDE000C1631B /* PROJECT_NAME.framework in Frameworks */, 65 | ); 66 | runOnlyForDeploymentPostprocessing = 0; 67 | }; 68 | 92DC99231B93418500350407 /* Frameworks */ = { 69 | isa = PBXFrameworksBuildPhase; 70 | buildActionMask = 2147483647; 71 | files = ( 72 | 92DC993A1B93547600350407 /* PROJECT_NAME.framework in Frameworks */, 73 | ); 74 | runOnlyForDeploymentPostprocessing = 0; 75 | }; 76 | /* End PBXFrameworksBuildPhase section */ 77 | 78 | /* Begin PBXGroup section */ 79 | 9208B44F1B8EBDE000C1631B = { 80 | isa = PBXGroup; 81 | children = ( 82 | 9208B45B1B8EBDE000C1631B /* PROJECT_NAME */, 83 | 92DC99271B93418500350407 /* Example */, 84 | 9208B4671B8EBDE000C1631B /* UnitTests */, 85 | 92DC99381B93437800350407 /* Frameworks */, 86 | 9208B45A1B8EBDE000C1631B /* Products */, 87 | ); 88 | sourceTree = ""; 89 | }; 90 | 9208B45A1B8EBDE000C1631B /* Products */ = { 91 | isa = PBXGroup; 92 | children = ( 93 | 9208B4591B8EBDE000C1631B /* PROJECT_NAME.framework */, 94 | 9208B4631B8EBDE000C1631B /* UnitTests.xctest */, 95 | 92DC99261B93418500350407 /* Example.app */, 96 | ); 97 | name = Products; 98 | sourceTree = ""; 99 | }; 100 | 9208B45B1B8EBDE000C1631B /* PROJECT_NAME */ = { 101 | isa = PBXGroup; 102 | children = ( 103 | 9208B45C1B8EBDE000C1631B /* PROJECT_NAME.h */, 104 | 9208B45E1B8EBDE000C1631B /* Info.plist */, 105 | 92DC99071B8EF03100350407 /* PROJECT_NAME.swift */, 106 | ); 107 | path = PROJECT_NAME; 108 | sourceTree = ""; 109 | }; 110 | 9208B4671B8EBDE000C1631B /* UnitTests */ = { 111 | isa = PBXGroup; 112 | children = ( 113 | 9208B4681B8EBDE000C1631B /* UnitTests.swift */, 114 | 9208B46A1B8EBDE000C1631B /* Info.plist */, 115 | ); 116 | path = UnitTests; 117 | sourceTree = ""; 118 | }; 119 | 92DC99271B93418500350407 /* Example */ = { 120 | isa = PBXGroup; 121 | children = ( 122 | 92DC99281B93418500350407 /* AppDelegate.swift */, 123 | 92DC992A1B93418500350407 /* ViewController.swift */, 124 | 92DC992C1B93418500350407 /* Main.storyboard */, 125 | 92DC992F1B93418500350407 /* Assets.xcassets */, 126 | 92DC99311B93418500350407 /* LaunchScreen.storyboard */, 127 | 92DC99341B93418500350407 /* Info.plist */, 128 | ); 129 | path = Example; 130 | sourceTree = ""; 131 | }; 132 | 92DC99381B93437800350407 /* Frameworks */ = { 133 | isa = PBXGroup; 134 | children = ( 135 | 92DC99091B9215EE00350407 /* Nimble.framework */, 136 | ); 137 | name = Frameworks; 138 | sourceTree = ""; 139 | }; 140 | /* End PBXGroup section */ 141 | 142 | /* Begin PBXHeadersBuildPhase section */ 143 | 9208B4561B8EBDE000C1631B /* Headers */ = { 144 | isa = PBXHeadersBuildPhase; 145 | buildActionMask = 2147483647; 146 | files = ( 147 | 9208B45D1B8EBDE000C1631B /* PROJECT_NAME.h in Headers */, 148 | ); 149 | runOnlyForDeploymentPostprocessing = 0; 150 | }; 151 | /* End PBXHeadersBuildPhase section */ 152 | 153 | /* Begin PBXNativeTarget section */ 154 | 9208B4581B8EBDE000C1631B /* PROJECT_NAME */ = { 155 | isa = PBXNativeTarget; 156 | buildConfigurationList = 9208B46D1B8EBDE000C1631B /* Build configuration list for PBXNativeTarget "PROJECT_NAME" */; 157 | buildPhases = ( 158 | 9208B4541B8EBDE000C1631B /* Sources */, 159 | 9208B4551B8EBDE000C1631B /* Frameworks */, 160 | 9208B4561B8EBDE000C1631B /* Headers */, 161 | 9208B4571B8EBDE000C1631B /* Resources */, 162 | ); 163 | buildRules = ( 164 | ); 165 | dependencies = ( 166 | ); 167 | name = PROJECT_NAME; 168 | productName = PROJECT_NAME; 169 | productReference = 9208B4591B8EBDE000C1631B /* PROJECT_NAME.framework */; 170 | productType = "com.apple.product-type.framework"; 171 | }; 172 | 9208B4621B8EBDE000C1631B /* UnitTests */ = { 173 | isa = PBXNativeTarget; 174 | buildConfigurationList = 9208B4701B8EBDE000C1631B /* Build configuration list for PBXNativeTarget "UnitTests" */; 175 | buildPhases = ( 176 | 9208B45F1B8EBDE000C1631B /* Sources */, 177 | 9208B4601B8EBDE000C1631B /* Frameworks */, 178 | 9208B4611B8EBDE000C1631B /* Resources */, 179 | 92DC990B1B92198300350407 /* Carthage Copy Frameworks */, 180 | ); 181 | buildRules = ( 182 | ); 183 | dependencies = ( 184 | 9208B4661B8EBDE000C1631B /* PBXTargetDependency */, 185 | ); 186 | name = UnitTests; 187 | productName = UnitTests; 188 | productReference = 9208B4631B8EBDE000C1631B /* UnitTests.xctest */; 189 | productType = "com.apple.product-type.bundle.unit-test"; 190 | }; 191 | 92DC99251B93418500350407 /* Example */ = { 192 | isa = PBXNativeTarget; 193 | buildConfigurationList = 92DC99371B93418500350407 /* Build configuration list for PBXNativeTarget "Example" */; 194 | buildPhases = ( 195 | 92DC99221B93418500350407 /* Sources */, 196 | 92DC99231B93418500350407 /* Frameworks */, 197 | 92DC99241B93418500350407 /* Resources */, 198 | ); 199 | buildRules = ( 200 | ); 201 | dependencies = ( 202 | ); 203 | name = Example; 204 | productName = Example; 205 | productReference = 92DC99261B93418500350407 /* Example.app */; 206 | productType = "com.apple.product-type.application"; 207 | }; 208 | /* End PBXNativeTarget section */ 209 | 210 | /* Begin PBXProject section */ 211 | 9208B4501B8EBDE000C1631B /* Project object */ = { 212 | isa = PBXProject; 213 | attributes = { 214 | LastSwiftUpdateCheck = 0700; 215 | LastUpgradeCheck = 0700; 216 | ORGANIZATIONNAME = ORGANIZATION_NAME; 217 | TargetAttributes = { 218 | 9208B4581B8EBDE000C1631B = { 219 | CreatedOnToolsVersion = 7.0; 220 | }; 221 | 9208B4621B8EBDE000C1631B = { 222 | CreatedOnToolsVersion = 7.0; 223 | }; 224 | 92DC99251B93418500350407 = { 225 | CreatedOnToolsVersion = 7.0; 226 | }; 227 | }; 228 | }; 229 | buildConfigurationList = 9208B4531B8EBDE000C1631B /* Build configuration list for PBXProject "PROJECT_NAME" */; 230 | compatibilityVersion = "Xcode 3.2"; 231 | developmentRegion = English; 232 | hasScannedForEncodings = 0; 233 | knownRegions = ( 234 | en, 235 | Base, 236 | ); 237 | mainGroup = 9208B44F1B8EBDE000C1631B; 238 | productRefGroup = 9208B45A1B8EBDE000C1631B /* Products */; 239 | projectDirPath = ""; 240 | projectRoot = ""; 241 | targets = ( 242 | 92DC99251B93418500350407 /* Example */, 243 | 9208B4581B8EBDE000C1631B /* PROJECT_NAME */, 244 | 9208B4621B8EBDE000C1631B /* UnitTests */, 245 | ); 246 | }; 247 | /* End PBXProject section */ 248 | 249 | /* Begin PBXResourcesBuildPhase section */ 250 | 9208B4571B8EBDE000C1631B /* Resources */ = { 251 | isa = PBXResourcesBuildPhase; 252 | buildActionMask = 2147483647; 253 | files = ( 254 | ); 255 | runOnlyForDeploymentPostprocessing = 0; 256 | }; 257 | 9208B4611B8EBDE000C1631B /* Resources */ = { 258 | isa = PBXResourcesBuildPhase; 259 | buildActionMask = 2147483647; 260 | files = ( 261 | ); 262 | runOnlyForDeploymentPostprocessing = 0; 263 | }; 264 | 92DC99241B93418500350407 /* Resources */ = { 265 | isa = PBXResourcesBuildPhase; 266 | buildActionMask = 2147483647; 267 | files = ( 268 | 92DC99331B93418500350407 /* LaunchScreen.storyboard in Resources */, 269 | 92DC99301B93418500350407 /* Assets.xcassets in Resources */, 270 | 92DC992E1B93418500350407 /* Main.storyboard in Resources */, 271 | ); 272 | runOnlyForDeploymentPostprocessing = 0; 273 | }; 274 | /* End PBXResourcesBuildPhase section */ 275 | 276 | /* Begin PBXShellScriptBuildPhase section */ 277 | 92DC990B1B92198300350407 /* Carthage Copy Frameworks */ = { 278 | isa = PBXShellScriptBuildPhase; 279 | buildActionMask = 2147483647; 280 | files = ( 281 | ); 282 | inputPaths = ( 283 | "$(SRCROOT)/Carthage/Build/iOS/Nimble.framework", 284 | ); 285 | name = "Carthage Copy Frameworks"; 286 | outputPaths = ( 287 | ); 288 | runOnlyForDeploymentPostprocessing = 0; 289 | shellPath = /bin/sh; 290 | shellScript = "/usr/local/bin/carthage copy-frameworks"; 291 | }; 292 | /* End PBXShellScriptBuildPhase section */ 293 | 294 | /* Begin PBXSourcesBuildPhase section */ 295 | 9208B4541B8EBDE000C1631B /* Sources */ = { 296 | isa = PBXSourcesBuildPhase; 297 | buildActionMask = 2147483647; 298 | files = ( 299 | 92DC99081B8EF03100350407 /* PROJECT_NAME.swift in Sources */, 300 | ); 301 | runOnlyForDeploymentPostprocessing = 0; 302 | }; 303 | 9208B45F1B8EBDE000C1631B /* Sources */ = { 304 | isa = PBXSourcesBuildPhase; 305 | buildActionMask = 2147483647; 306 | files = ( 307 | 9208B4691B8EBDE000C1631B /* UnitTests.swift in Sources */, 308 | ); 309 | runOnlyForDeploymentPostprocessing = 0; 310 | }; 311 | 92DC99221B93418500350407 /* Sources */ = { 312 | isa = PBXSourcesBuildPhase; 313 | buildActionMask = 2147483647; 314 | files = ( 315 | 92DC992B1B93418500350407 /* ViewController.swift in Sources */, 316 | 92DC99291B93418500350407 /* AppDelegate.swift in Sources */, 317 | ); 318 | runOnlyForDeploymentPostprocessing = 0; 319 | }; 320 | /* End PBXSourcesBuildPhase section */ 321 | 322 | /* Begin PBXTargetDependency section */ 323 | 9208B4661B8EBDE000C1631B /* PBXTargetDependency */ = { 324 | isa = PBXTargetDependency; 325 | target = 9208B4581B8EBDE000C1631B /* PROJECT_NAME */; 326 | targetProxy = 9208B4651B8EBDE000C1631B /* PBXContainerItemProxy */; 327 | }; 328 | /* End PBXTargetDependency section */ 329 | 330 | /* Begin PBXVariantGroup section */ 331 | 92DC992C1B93418500350407 /* Main.storyboard */ = { 332 | isa = PBXVariantGroup; 333 | children = ( 334 | 92DC992D1B93418500350407 /* Base */, 335 | ); 336 | name = Main.storyboard; 337 | sourceTree = ""; 338 | }; 339 | 92DC99311B93418500350407 /* LaunchScreen.storyboard */ = { 340 | isa = PBXVariantGroup; 341 | children = ( 342 | 92DC99321B93418500350407 /* Base */, 343 | ); 344 | name = LaunchScreen.storyboard; 345 | sourceTree = ""; 346 | }; 347 | /* End PBXVariantGroup section */ 348 | 349 | /* Begin XCBuildConfiguration section */ 350 | 9208B46B1B8EBDE000C1631B /* Debug */ = { 351 | isa = XCBuildConfiguration; 352 | buildSettings = { 353 | ALWAYS_SEARCH_USER_PATHS = NO; 354 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 355 | CLANG_CXX_LIBRARY = "libc++"; 356 | CLANG_ENABLE_MODULES = YES; 357 | CLANG_ENABLE_OBJC_ARC = YES; 358 | CLANG_WARN_BOOL_CONVERSION = YES; 359 | CLANG_WARN_CONSTANT_CONVERSION = YES; 360 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 361 | CLANG_WARN_EMPTY_BODY = YES; 362 | CLANG_WARN_ENUM_CONVERSION = YES; 363 | CLANG_WARN_INT_CONVERSION = YES; 364 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 365 | CLANG_WARN_UNREACHABLE_CODE = YES; 366 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 367 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; 368 | COPY_PHASE_STRIP = NO; 369 | CURRENT_PROJECT_VERSION = 1; 370 | DEBUG_INFORMATION_FORMAT = dwarf; 371 | ENABLE_STRICT_OBJC_MSGSEND = YES; 372 | ENABLE_TESTABILITY = YES; 373 | GCC_C_LANGUAGE_STANDARD = gnu99; 374 | GCC_DYNAMIC_NO_PIC = NO; 375 | GCC_NO_COMMON_BLOCKS = YES; 376 | GCC_OPTIMIZATION_LEVEL = 0; 377 | GCC_PREPROCESSOR_DEFINITIONS = ( 378 | "DEBUG=1", 379 | "$(inherited)", 380 | ); 381 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 382 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 383 | GCC_WARN_UNDECLARED_SELECTOR = YES; 384 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 385 | GCC_WARN_UNUSED_FUNCTION = YES; 386 | GCC_WARN_UNUSED_VARIABLE = YES; 387 | IPHONEOS_DEPLOYMENT_TARGET = 9.0; 388 | MTL_ENABLE_DEBUG_INFO = YES; 389 | ONLY_ACTIVE_ARCH = YES; 390 | SDKROOT = iphoneos; 391 | SWIFT_OPTIMIZATION_LEVEL = "-Onone"; 392 | TARGETED_DEVICE_FAMILY = "1,2"; 393 | VERSIONING_SYSTEM = "apple-generic"; 394 | VERSION_INFO_PREFIX = ""; 395 | }; 396 | name = Debug; 397 | }; 398 | 9208B46C1B8EBDE000C1631B /* Release */ = { 399 | isa = XCBuildConfiguration; 400 | buildSettings = { 401 | ALWAYS_SEARCH_USER_PATHS = NO; 402 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 403 | CLANG_CXX_LIBRARY = "libc++"; 404 | CLANG_ENABLE_MODULES = YES; 405 | CLANG_ENABLE_OBJC_ARC = YES; 406 | CLANG_WARN_BOOL_CONVERSION = YES; 407 | CLANG_WARN_CONSTANT_CONVERSION = YES; 408 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 409 | CLANG_WARN_EMPTY_BODY = YES; 410 | CLANG_WARN_ENUM_CONVERSION = YES; 411 | CLANG_WARN_INT_CONVERSION = YES; 412 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 413 | CLANG_WARN_UNREACHABLE_CODE = YES; 414 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 415 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; 416 | COPY_PHASE_STRIP = NO; 417 | CURRENT_PROJECT_VERSION = 1; 418 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; 419 | ENABLE_NS_ASSERTIONS = NO; 420 | ENABLE_STRICT_OBJC_MSGSEND = YES; 421 | GCC_C_LANGUAGE_STANDARD = gnu99; 422 | GCC_NO_COMMON_BLOCKS = YES; 423 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 424 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 425 | GCC_WARN_UNDECLARED_SELECTOR = YES; 426 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 427 | GCC_WARN_UNUSED_FUNCTION = YES; 428 | GCC_WARN_UNUSED_VARIABLE = YES; 429 | IPHONEOS_DEPLOYMENT_TARGET = 9.0; 430 | MTL_ENABLE_DEBUG_INFO = NO; 431 | SDKROOT = iphoneos; 432 | TARGETED_DEVICE_FAMILY = "1,2"; 433 | VALIDATE_PRODUCT = YES; 434 | VERSIONING_SYSTEM = "apple-generic"; 435 | VERSION_INFO_PREFIX = ""; 436 | }; 437 | name = Release; 438 | }; 439 | 9208B46E1B8EBDE000C1631B /* Debug */ = { 440 | isa = XCBuildConfiguration; 441 | buildSettings = { 442 | APPLICATION_EXTENSION_API_ONLY = YES; 443 | CLANG_ENABLE_MODULES = YES; 444 | DEFINES_MODULE = YES; 445 | DYLIB_COMPATIBILITY_VERSION = 1; 446 | DYLIB_CURRENT_VERSION = 1; 447 | DYLIB_INSTALL_NAME_BASE = "@rpath"; 448 | INFOPLIST_FILE = PROJECT_NAME/Info.plist; 449 | INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; 450 | IPHONEOS_DEPLOYMENT_TARGET = 8.0; 451 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; 452 | PRODUCT_BUNDLE_IDENTIFIER = "ORGANIZATION-ID.PROJECT-NAME"; 453 | PRODUCT_NAME = "$(TARGET_NAME)"; 454 | SKIP_INSTALL = YES; 455 | SWIFT_OPTIMIZATION_LEVEL = "-Onone"; 456 | }; 457 | name = Debug; 458 | }; 459 | 9208B46F1B8EBDE000C1631B /* Release */ = { 460 | isa = XCBuildConfiguration; 461 | buildSettings = { 462 | APPLICATION_EXTENSION_API_ONLY = YES; 463 | CLANG_ENABLE_MODULES = YES; 464 | DEFINES_MODULE = YES; 465 | DYLIB_COMPATIBILITY_VERSION = 1; 466 | DYLIB_CURRENT_VERSION = 1; 467 | DYLIB_INSTALL_NAME_BASE = "@rpath"; 468 | INFOPLIST_FILE = PROJECT_NAME/Info.plist; 469 | INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; 470 | IPHONEOS_DEPLOYMENT_TARGET = 8.0; 471 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; 472 | PRODUCT_BUNDLE_IDENTIFIER = "ORGANIZATION-ID.PROJECT-NAME"; 473 | PRODUCT_NAME = "$(TARGET_NAME)"; 474 | SKIP_INSTALL = YES; 475 | }; 476 | name = Release; 477 | }; 478 | 9208B4711B8EBDE000C1631B /* Debug */ = { 479 | isa = XCBuildConfiguration; 480 | buildSettings = { 481 | FRAMEWORK_SEARCH_PATHS = ( 482 | "$(inherited)", 483 | "$(PROJECT_DIR)/Carthage/Build/iOS", 484 | ); 485 | INFOPLIST_FILE = UnitTests/Info.plist; 486 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; 487 | PRODUCT_BUNDLE_IDENTIFIER = "ORGANIZATION-ID.UnitTests"; 488 | PRODUCT_NAME = "$(TARGET_NAME)"; 489 | }; 490 | name = Debug; 491 | }; 492 | 9208B4721B8EBDE000C1631B /* Release */ = { 493 | isa = XCBuildConfiguration; 494 | buildSettings = { 495 | FRAMEWORK_SEARCH_PATHS = ( 496 | "$(inherited)", 497 | "$(PROJECT_DIR)/Carthage/Build/iOS", 498 | ); 499 | INFOPLIST_FILE = UnitTests/Info.plist; 500 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; 501 | PRODUCT_BUNDLE_IDENTIFIER = "ORGANIZATION-ID.UnitTests"; 502 | PRODUCT_NAME = "$(TARGET_NAME)"; 503 | }; 504 | name = Release; 505 | }; 506 | 92DC99351B93418500350407 /* Debug */ = { 507 | isa = XCBuildConfiguration; 508 | buildSettings = { 509 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 510 | INFOPLIST_FILE = Example/Info.plist; 511 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; 512 | PRODUCT_BUNDLE_IDENTIFIER = "ORGANIZATION-ID.PROJECT-NAME.Example"; 513 | PRODUCT_NAME = "$(TARGET_NAME)"; 514 | }; 515 | name = Debug; 516 | }; 517 | 92DC99361B93418500350407 /* Release */ = { 518 | isa = XCBuildConfiguration; 519 | buildSettings = { 520 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 521 | INFOPLIST_FILE = Example/Info.plist; 522 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; 523 | PRODUCT_BUNDLE_IDENTIFIER = "ORGANIZATION-ID.PROJECT-NAME.Example"; 524 | PRODUCT_NAME = "$(TARGET_NAME)"; 525 | }; 526 | name = Release; 527 | }; 528 | /* End XCBuildConfiguration section */ 529 | 530 | /* Begin XCConfigurationList section */ 531 | 9208B4531B8EBDE000C1631B /* Build configuration list for PBXProject "PROJECT_NAME" */ = { 532 | isa = XCConfigurationList; 533 | buildConfigurations = ( 534 | 9208B46B1B8EBDE000C1631B /* Debug */, 535 | 9208B46C1B8EBDE000C1631B /* Release */, 536 | ); 537 | defaultConfigurationIsVisible = 0; 538 | defaultConfigurationName = Release; 539 | }; 540 | 9208B46D1B8EBDE000C1631B /* Build configuration list for PBXNativeTarget "PROJECT_NAME" */ = { 541 | isa = XCConfigurationList; 542 | buildConfigurations = ( 543 | 9208B46E1B8EBDE000C1631B /* Debug */, 544 | 9208B46F1B8EBDE000C1631B /* Release */, 545 | ); 546 | defaultConfigurationIsVisible = 0; 547 | defaultConfigurationName = Release; 548 | }; 549 | 9208B4701B8EBDE000C1631B /* Build configuration list for PBXNativeTarget "UnitTests" */ = { 550 | isa = XCConfigurationList; 551 | buildConfigurations = ( 552 | 9208B4711B8EBDE000C1631B /* Debug */, 553 | 9208B4721B8EBDE000C1631B /* Release */, 554 | ); 555 | defaultConfigurationIsVisible = 0; 556 | defaultConfigurationName = Release; 557 | }; 558 | 92DC99371B93418500350407 /* Build configuration list for PBXNativeTarget "Example" */ = { 559 | isa = XCConfigurationList; 560 | buildConfigurations = ( 561 | 92DC99351B93418500350407 /* Debug */, 562 | 92DC99361B93418500350407 /* Release */, 563 | ); 564 | defaultConfigurationIsVisible = 0; 565 | defaultConfigurationName = Release; 566 | }; 567 | /* End XCConfigurationList section */ 568 | }; 569 | rootObject = 9208B4501B8EBDE000C1631B /* Project object */; 570 | } 571 | -------------------------------------------------------------------------------- /generators/xcode/templates/PROJECT_NAME.xcodeproj/project.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /generators/xcode/templates/PROJECT_NAME.xcodeproj/xcshareddata/xcschemes/PROJECT_NAME.xcscheme: -------------------------------------------------------------------------------- 1 | 2 | 5 | 8 | 9 | 15 | 21 | 22 | 23 | 24 | 25 | 31 | 32 | 34 | 40 | 41 | 42 | 43 | 44 | 50 | 51 | 52 | 53 | 54 | 55 | 65 | 66 | 72 | 73 | 74 | 75 | 76 | 77 | 83 | 84 | 90 | 91 | 92 | 93 | 95 | 96 | 99 | 100 | 101 | -------------------------------------------------------------------------------- /generators/xcode/templates/PROJECT_NAME/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleExecutable 8 | $(EXECUTABLE_NAME) 9 | CFBundleIdentifier 10 | $(PRODUCT_BUNDLE_IDENTIFIER) 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | $(PRODUCT_NAME) 15 | CFBundlePackageType 16 | FMWK 17 | CFBundleShortVersionString 18 | 1.0 19 | CFBundleSignature 20 | ???? 21 | CFBundleVersion 22 | $(CURRENT_PROJECT_VERSION) 23 | NSPrincipalClass 24 | 25 | 26 | 27 | -------------------------------------------------------------------------------- /generators/xcode/templates/PROJECT_NAME/PROJECT_NAME.h: -------------------------------------------------------------------------------- 1 | // 2 | // <%= projectName %>.h 3 | // <%= projectName %> 4 | // 5 | // Created by generator-swift-framework. 6 | // Copyright © 2015 <%= organizationName %>. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | //! Project version number for <%= projectName %>. 12 | FOUNDATION_EXPORT double <%= projectName %>VersionNumber; 13 | 14 | //! Project version string for <%= projectName %>. 15 | FOUNDATION_EXPORT const unsigned char <%= projectName %>VersionString[]; 16 | 17 | // In this header, you should import all the public headers of your framework using statements like #import <<%= projectName %>/PublicHeader.h> 18 | 19 | 20 | -------------------------------------------------------------------------------- /generators/xcode/templates/PROJECT_NAME/PROJECT_NAME.swift: -------------------------------------------------------------------------------- 1 | // 2 | // <%= projectName %>.swift 3 | // <%= projectName %> 4 | // 5 | // Copyright © 2015 <%= organizationName %>. All rights reserved. 6 | // 7 | 8 | import UIKit 9 | 10 | public class <%= projectName %> { 11 | 12 | // MARK: Internal Properties 13 | 14 | var someProperty: String 15 | 16 | // MARK: APIs 17 | 18 | public func hello() -> String { 19 | return someProperty 20 | } 21 | 22 | // MARK: Initilizers 23 | 24 | public init() { 25 | someProperty = "a string" 26 | } 27 | } 28 | 29 | 30 | -------------------------------------------------------------------------------- /generators/xcode/templates/UnitTests/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleExecutable 8 | $(EXECUTABLE_NAME) 9 | CFBundleIdentifier 10 | $(PRODUCT_BUNDLE_IDENTIFIER) 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | $(PRODUCT_NAME) 15 | CFBundlePackageType 16 | BNDL 17 | CFBundleShortVersionString 18 | 1.0 19 | CFBundleSignature 20 | ???? 21 | CFBundleVersion 22 | 1 23 | 24 | 25 | -------------------------------------------------------------------------------- /generators/xcode/templates/UnitTests/UnitTests.swift: -------------------------------------------------------------------------------- 1 | // 2 | // UnitTests.swift 3 | // UnitTests 4 | // 5 | // Created by generator-swift-framework on 8/26/15. 6 | // Copyright © 2015 <%= organizationName %>. All rights reserved. 7 | // 8 | 9 | import XCTest 10 | import Nimble 11 | 12 | @testable import <%= projectName %> 13 | 14 | class UnitTests: XCTestCase { 15 | 16 | override func setUp() { 17 | super.setUp() 18 | // Put setup code here. This method is called before the invocation of each test method in the class. 19 | } 20 | 21 | override func tearDown() { 22 | // Put teardown code here. This method is called after the invocation of each test method in the class. 23 | super.tearDown() 24 | } 25 | 26 | func testInit() { 27 | let p = <%= projectName %>() 28 | expect(p.someProperty).to(equal("a string")) 29 | } 30 | 31 | func testPerformanceExample() { 32 | // This is an example of a performance test case. 33 | self.measureBlock { 34 | // Put the code you want to measure the time of here. 35 | } 36 | } 37 | 38 | } 39 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "generator-swift-framework", 3 | "description": "Scaffolds out a Xcode Embedded Framework project with Swift 2.0", 4 | "license": "MIT", 5 | "main": "app/index.js", 6 | "repository": { 7 | "type": "git", 8 | "url": "https://github.com/cybertk/generator-swift-framework.git" 9 | }, 10 | "author": { 11 | "name": "", 12 | "email": "", 13 | "url": "https://github.com/cybertk" 14 | }, 15 | "scripts": { 16 | "pretest": "standard", 17 | "test": "npm run test:unit", 18 | "test:unit": "mocha", 19 | "test:template": "xcodebuild -list -project generators/app/templates/PROJECT_NAME.xcodeproj", 20 | "open-template-project": "open generators/app/templates/PROJECT_NAME.xcodeproj", 21 | "semantic-release": "semantic-release pre && npm publish && semantic-release post" 22 | }, 23 | "files": [ 24 | "generators" 25 | ], 26 | "keywords": [ 27 | "yeoman-generator", 28 | "xcode", 29 | "framework", 30 | "swift", 31 | "ios" 32 | ], 33 | "dependencies": { 34 | "glob": "^7.0.3", 35 | "underscore": "^1.8.3", 36 | "yeoman-generator": "^0.24.1" 37 | }, 38 | "devDependencies": { 39 | "yeoman-assert": "^2.2.0", 40 | "yeoman-test": "^1.4.0", 41 | "mocha": "^3.0.2", 42 | "standard": "^10.0.2", 43 | "semantic-release": "^6.3.6" 44 | } 45 | } 46 | -------------------------------------------------------------------------------- /test/test-app.js: -------------------------------------------------------------------------------- 1 | /* global describe, before, it */ 2 | 3 | 'use strict' 4 | 5 | var path = require('path') 6 | var assert = require('yeoman-assert') 7 | var helpers = require('yeoman-test') 8 | 9 | assert.noFilesContent = function (files, pattern) { 10 | files.forEach(function (file) { 11 | assert.noFileContent(file, pattern) 12 | }) 13 | } 14 | 15 | describe('swift.framework:app', function () { 16 | // Placeholders 17 | var pattern = /(PROJECT-NAME|PROJECT_NAME|ORGANIZATION-ID|ORGANIZATION_NAME|<%=|%>)/ 18 | 19 | describe('with mobileprovision disable', function () { 20 | before(function (done) { 21 | helpers.run(path.join(__dirname, '../generators/app')) 22 | .withOptions({ 23 | skipInstall: true, 24 | openXcode: false 25 | }) 26 | .withPrompts({ 27 | projectName: 'F', 28 | organizationName: 'example-org', 29 | organizationId: 'org.example', 30 | cocoapods: true, 31 | githubUser: 'gu', 32 | travis: true, 33 | mobileprovision: false 34 | }) 35 | .on('end', done) 36 | }) 37 | 38 | it('creates Xcode project', function () { 39 | // Xcode project 40 | var files = [ 41 | 'F.xcodeproj/project.pbxproj', 42 | 'F.xcodeproj/project.xcworkspace/contents.xcworkspacedata', 43 | 'F.xcodeproj/xcshareddata/xcschemes/F.xcscheme', 44 | 'F/Info.plist', 45 | 'F/F.h', 46 | 'F/F.swift', 47 | 'UnitTests/Info.plist', 48 | 'UnitTests/UnitTests.swift', 49 | 'Example/AppDelegate.swift', 50 | 'Example/Assets.xcassets/AppIcon.appiconset/Contents.json', 51 | 'Example/Base.lproj/LaunchScreen.storyboard', 52 | 'Example/Base.lproj/Main.storyboard', 53 | 'Example/Info.plist', 54 | 'Example/ViewController.swift' 55 | ] 56 | 57 | assert.file(files) 58 | assert.noFilesContent(files, pattern) 59 | }) 60 | 61 | it('creates gitignore', function () { 62 | assert.file('.gitignore') 63 | }) 64 | 65 | it('creates license', function () { 66 | assert.file('LICENSE') 67 | }) 68 | 69 | it('creates readme', function () { 70 | assert.file('README.md') 71 | }) 72 | 73 | it('creates contributing', function () { 74 | assert.file('CONTRIBUTING.md') 75 | }) 76 | 77 | it('creates podsepc', function () { 78 | assert.file('F.podspec') 79 | // repo url 80 | assert.fileContent('F.podspec', 'https://github.com/gu/F.git') 81 | assert.noFileContent('F.podspec', pattern) 82 | }) 83 | 84 | it('creates Cartfile', function () { 85 | assert.file([ 86 | 'Cartfile.private', 87 | 'Cartfile.resolved' 88 | ]) 89 | }) 90 | 91 | it('creates Travis scripts', function () { 92 | assert.file('.travis.yml') 93 | }) 94 | 95 | it('creates scripts', function () { 96 | var files = [ 97 | 'script/cert', 98 | 'script/README.md', 99 | 'Makefile', 100 | 'Gemfile', 101 | 'Gemfile.lock' 102 | ] 103 | assert.file(files) 104 | assert.noFilesContent(files, pattern) 105 | }) 106 | }) 107 | 108 | describe('with travis disabled', function () { 109 | before(function (done) { 110 | helpers.run(path.join(__dirname, '../generators/app')) 111 | .withOptions({ 112 | skipInstall: true, 113 | openXcode: false 114 | }) 115 | .withPrompts({ 116 | projectName: 'F', 117 | organizationName: 'example-org', 118 | organizationId: 'org.example', 119 | cocoapods: true, 120 | githubUser: 'gu', 121 | travis: false, 122 | mobileprovision: false 123 | }) 124 | .on('end', done) 125 | }) 126 | 127 | it('creates Xcode project', function () { 128 | // Xcode project 129 | var files = [ 130 | 'F.xcodeproj/project.pbxproj', 131 | 'F.xcodeproj/project.xcworkspace/contents.xcworkspacedata', 132 | 'F.xcodeproj/xcshareddata/xcschemes/F.xcscheme', 133 | 'F/Info.plist', 134 | 'F/F.h', 135 | 'F/F.swift', 136 | 'UnitTests/Info.plist', 137 | 'UnitTests/UnitTests.swift', 138 | 'Example/AppDelegate.swift', 139 | 'Example/Assets.xcassets/AppIcon.appiconset/Contents.json', 140 | 'Example/Base.lproj/LaunchScreen.storyboard', 141 | 'Example/Base.lproj/Main.storyboard', 142 | 'Example/Info.plist', 143 | 'Example/ViewController.swift' 144 | ] 145 | 146 | assert.file(files) 147 | assert.noFilesContent(files, pattern) 148 | }) 149 | 150 | it('creates gitignore', function () { 151 | assert.file('.gitignore') 152 | }) 153 | 154 | it('creates license', function () { 155 | assert.file('LICENSE') 156 | }) 157 | 158 | it('creates readme', function () { 159 | assert.file('README.md') 160 | }) 161 | 162 | it('creates contributing', function () { 163 | assert.file('CONTRIBUTING.md') 164 | }) 165 | 166 | it('creates podsepc', function () { 167 | assert.file('F.podspec') 168 | // repo url 169 | assert.fileContent('F.podspec', 'https://github.com/gu/F.git') 170 | assert.noFileContent('F.podspec', pattern) 171 | }) 172 | 173 | it('creates Cartfile', function () { 174 | assert.file([ 175 | 'Cartfile.private', 176 | 'Cartfile.resolved' 177 | ]) 178 | }) 179 | 180 | it('does not create Travis scripts', function () { 181 | assert.noFile('.travis.yml') 182 | }) 183 | 184 | it('creates scripts', function () { 185 | var files = [ 186 | 'script/cert', 187 | 'script/README.md', 188 | 'Makefile', 189 | 'Gemfile', 190 | 'Gemfile.lock' 191 | ] 192 | assert.file(files) 193 | assert.noFilesContent(files, pattern) 194 | }) 195 | }) 196 | 197 | describe('with cocoapods disabled', function () { 198 | before(function (done) { 199 | helpers.run(path.join(__dirname, '../generators/app')) 200 | .withOptions({ 201 | skipInstall: true, 202 | openXcode: false 203 | }) 204 | .withPrompts({ 205 | projectName: 'F', 206 | organizationName: 'example-org', 207 | organizationId: 'org.example', 208 | cocoapods: false, 209 | githubUser: 'gu', 210 | travis: true, 211 | mobileprovision: false 212 | }) 213 | .on('end', done) 214 | }) 215 | 216 | it('creates Xcode project', function () { 217 | // Xcode project 218 | var files = [ 219 | 'F.xcodeproj/project.pbxproj', 220 | 'F.xcodeproj/project.xcworkspace/contents.xcworkspacedata', 221 | 'F.xcodeproj/xcshareddata/xcschemes/F.xcscheme', 222 | 'F/Info.plist', 223 | 'F/F.h', 224 | 'F/F.swift', 225 | 'UnitTests/Info.plist', 226 | 'UnitTests/UnitTests.swift', 227 | 'Example/AppDelegate.swift', 228 | 'Example/Assets.xcassets/AppIcon.appiconset/Contents.json', 229 | 'Example/Base.lproj/LaunchScreen.storyboard', 230 | 'Example/Base.lproj/Main.storyboard', 231 | 'Example/Info.plist', 232 | 'Example/ViewController.swift' 233 | ] 234 | 235 | assert.file(files) 236 | assert.noFilesContent(files, pattern) 237 | }) 238 | 239 | it('creates gitignore', function () { 240 | assert.file('.gitignore') 241 | }) 242 | 243 | it('creates license', function () { 244 | assert.file('LICENSE') 245 | }) 246 | 247 | it('creates readme', function () { 248 | assert.file('README.md') 249 | }) 250 | 251 | it('creates contributing', function () { 252 | assert.file('CONTRIBUTING.md') 253 | }) 254 | 255 | it('does not create podsepc', function () { 256 | assert.noFile('F.podspec') 257 | }) 258 | 259 | it('creates Cartfile', function () { 260 | assert.file([ 261 | 'Cartfile.private', 262 | 'Cartfile.resolved' 263 | ]) 264 | }) 265 | 266 | it('creates Travis scripts', function () { 267 | assert.file('.travis.yml') 268 | }) 269 | 270 | it('creates scripts', function () { 271 | var files = [ 272 | 'script/cert', 273 | 'script/README.md', 274 | 'Makefile', 275 | 'Gemfile', 276 | 'Gemfile.lock' 277 | ] 278 | assert.file(files) 279 | assert.noFilesContent(files, pattern) 280 | }) 281 | }) 282 | }) 283 | -------------------------------------------------------------------------------- /test/test-carthage.js: -------------------------------------------------------------------------------- 1 | /* global describe, before, it */ 2 | 3 | 'use strict' 4 | 5 | var path = require('path') 6 | var assert = require('yeoman-assert') 7 | var helpers = require('yeoman-test') 8 | 9 | describe('swift.framework:carthage', function () { 10 | describe('with all features enabled', function () { 11 | before(function (done) { 12 | helpers.run(path.join(__dirname, '../generators/carthage')) 13 | .on('end', done) 14 | }) 15 | 16 | it('creates carthage', function () { 17 | assert.file('Cartfile.private') 18 | assert.file('Cartfile.resolved') 19 | }) 20 | }) 21 | }) 22 | -------------------------------------------------------------------------------- /test/test-cocoapods.js: -------------------------------------------------------------------------------- 1 | /* global describe, before, it */ 2 | 3 | 'use strict' 4 | 5 | var path = require('path') 6 | var assert = require('yeoman-assert') 7 | var helpers = require('yeoman-test') 8 | 9 | describe('swift.framework:cocoapods', function () { 10 | var pattern = /(<%=|%>)/ 11 | 12 | describe('with all features enabled', function () { 13 | before(function (done) { 14 | helpers.run(path.join(__dirname, '../generators/cocoapods')) 15 | .withOptions({ 16 | projectName: 'F', 17 | githubUser: 'GU' 18 | }) 19 | .on('end', done) 20 | }) 21 | 22 | it('creates cocoapods', function () { 23 | assert.file('F.podspec') 24 | assert.noFileContent('F.podspec', pattern) 25 | }) 26 | }) 27 | }) 28 | -------------------------------------------------------------------------------- /test/test-contributing.js: -------------------------------------------------------------------------------- 1 | /* global describe, before, it */ 2 | 3 | 'use strict' 4 | 5 | var path = require('path') 6 | var assert = require('yeoman-assert') 7 | var helpers = require('yeoman-test') 8 | 9 | describe('swift.framework:contributing', function () { 10 | var pattern = /(<%=|%>)/ 11 | 12 | describe('with all features enabled', function () { 13 | before(function (done) { 14 | helpers.run(path.join(__dirname, '../generators/contributing')) 15 | .withOptions({ 16 | projectName: 'F' 17 | }) 18 | .on('end', done) 19 | }) 20 | 21 | it('creates contributing', function () { 22 | assert.file('CONTRIBUTING.md') 23 | assert.noFileContent('CONTRIBUTING.md', pattern) 24 | }) 25 | }) 26 | }) 27 | -------------------------------------------------------------------------------- /test/test-gitignore.js: -------------------------------------------------------------------------------- 1 | /* global describe, before, it */ 2 | 3 | 'use strict' 4 | 5 | var path = require('path') 6 | var assert = require('yeoman-assert') 7 | var helpers = require('yeoman-test') 8 | 9 | describe('swift.framework:gitignore', function () { 10 | describe('with all features enabled', function () { 11 | before(function (done) { 12 | helpers.run(path.join(__dirname, '../generators/gitignore')) 13 | .on('end', done) 14 | }) 15 | 16 | it('creates gitignore', function () { 17 | assert.file('.gitignore') 18 | }) 19 | }) 20 | }) 21 | -------------------------------------------------------------------------------- /test/test-license.js: -------------------------------------------------------------------------------- 1 | /* global describe, before, it */ 2 | 3 | 'use strict' 4 | 5 | var path = require('path') 6 | var assert = require('yeoman-assert') 7 | var helpers = require('yeoman-test') 8 | 9 | describe('swift.framework:license', function () { 10 | var pattern = /(<%=|%>)/ 11 | 12 | describe('with all features enabled', function () { 13 | before(function (done) { 14 | helpers.run(path.join(__dirname, '../generators/license')) 15 | .withOptions({ 16 | organizationName: 'O' 17 | }) 18 | .on('end', done) 19 | }) 20 | 21 | it('creates license', function () { 22 | assert.file('LICENSE') 23 | assert.noFileContent('LICENSE', pattern) 24 | }) 25 | }) 26 | }) 27 | -------------------------------------------------------------------------------- /test/test-readme.js: -------------------------------------------------------------------------------- 1 | /* global describe, before, it */ 2 | 3 | 'use strict' 4 | 5 | var path = require('path') 6 | var assert = require('yeoman-assert') 7 | var helpers = require('yeoman-test') 8 | 9 | describe('swift.framework:readme', function () { 10 | var pattern = /(<%=|%>)/ 11 | 12 | describe('with all features enabled', function () { 13 | before(function (done) { 14 | helpers.run(path.join(__dirname, '../generators/readme')) 15 | .withOptions({ 16 | projectName: 'F', 17 | githubUser: 'GU' 18 | }) 19 | .on('end', done) 20 | }) 21 | 22 | it('creates readme', function () { 23 | assert.file('README.md') 24 | assert.noFileContent('README.md', pattern) 25 | }) 26 | }) 27 | }) 28 | -------------------------------------------------------------------------------- /test/test-script.js: -------------------------------------------------------------------------------- 1 | /* global describe, before, it */ 2 | 3 | 'use strict' 4 | 5 | var path = require('path') 6 | var assert = require('yeoman-assert') 7 | var helpers = require('yeoman-test') 8 | 9 | describe('swift.framework:script', function () { 10 | var pattern = /(<%=|%>)/ 11 | 12 | describe('with all features enabled', function () { 13 | before(function (done) { 14 | helpers.run(path.join(__dirname, '../generators/script')) 15 | .withOptions({ 16 | projectName: 'F' 17 | }) 18 | .on('end', done) 19 | }) 20 | 21 | it('creates Makefile', function () { 22 | assert.file('Makefile') 23 | assert.noFileContent('Makefile', pattern) 24 | }) 25 | 26 | it('creates scripts', function () { 27 | assert.file('script/README.md') 28 | assert.file('script/cert') 29 | }) 30 | 31 | it('creates Gemfile', function () { 32 | assert.file('Gemfile') 33 | assert.file('Gemfile.lock') 34 | }) 35 | }) 36 | }) 37 | -------------------------------------------------------------------------------- /test/test-travis.js: -------------------------------------------------------------------------------- 1 | /* global describe, before, it */ 2 | 3 | 'use strict' 4 | 5 | var path = require('path') 6 | var assert = require('yeoman-assert') 7 | var helpers = require('yeoman-test') 8 | 9 | describe('swift.framework:travis', function () { 10 | describe('with all features enabled', function () { 11 | before(function (done) { 12 | helpers.run(path.join(__dirname, '../generators/travis')) 13 | .on('end', done) 14 | }) 15 | 16 | it('creates travis', function () { 17 | assert.file('.travis.yml') 18 | }) 19 | }) 20 | }) 21 | --------------------------------------------------------------------------------