├── .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 | [](https://travis-ci.org/cybertk/generator-swift-framework)
6 | [](http://standardjs.com/)
7 | [](https://david-dm.org/cybertk/generator-swift-framework)
8 | [](https://david-dm.org/cybertk/generator-swift-framework#info=devDependencies)
9 | [](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 | 
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 | [](https://travis-ci.org/<%= githubUser %>/<%= projectName %>)
4 | [](https://github.com/Carthage/Carthage)
5 | [](http://cocoapods.org/pods/<%= projectName %>)
6 | [](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 | [](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 |
--------------------------------------------------------------------------------