yolo 1.0.0.pre → 1.0.0
Sign up to get free protection for your applications and to get access to all the features.
- data/README.md +56 -1
- data/lib/yolo.rb +1 -1
- data/lib/yolo/config.rb +10 -0
- data/lib/yolo/config/settings.rb +57 -5
- data/lib/yolo/deployment.rb +10 -0
- data/lib/yolo/deployment/base_deployer.rb +21 -2
- data/lib/yolo/deployment/ota.rb +32 -5
- data/lib/yolo/formatters.rb +10 -0
- data/lib/yolo/formatters/error_formatter.rb +33 -0
- data/lib/yolo/formatters/progress_formatter.rb +62 -1
- data/lib/yolo/notify.rb +11 -1
- data/lib/yolo/notify/email.rb +25 -1
- data/lib/yolo/notify/ios.rb +13 -0
- data/lib/yolo/notify/ios/email.html +7 -56
- data/lib/yolo/notify/ios/ota_email.rb +30 -4
- data/lib/yolo/tasks.rb +11 -4
- data/lib/yolo/tasks/base_task.rb +5 -0
- data/lib/yolo/tasks/ios.rb +16 -0
- data/lib/yolo/tasks/ios/build.rb +8 -3
- data/lib/yolo/tasks/ios/calabash.rb +8 -3
- data/lib/yolo/tasks/ios/ocunit.rb +9 -4
- data/lib/yolo/tasks/ios/release.rb +7 -1
- data/lib/yolo/tools.rb +11 -4
- data/lib/yolo/tools/git.rb +5 -0
- data/lib/yolo/tools/ios.rb +16 -0
- data/lib/yolo/tools/ios/calabash.rb +11 -0
- data/lib/yolo/tools/ios/ipa.rb +12 -2
- data/lib/yolo/tools/ios/release_notes.rb +32 -0
- data/lib/yolo/tools/ios/xcode.rb +35 -1
- metadata +11 -8
data/README.md
CHANGED
@@ -1,4 +1,59 @@
|
|
1
1
|
yolo
|
2
2
|
====
|
3
3
|
|
4
|
-
Continuous Integration
|
4
|
+
yolo is a RubyGem which provides a Ruby interface to Continuous Integration build tools. yolo is currently geared towards the Xcode toolchain and iOS development.
|
5
|
+
|
6
|
+
yolo allows you to run a number of continuous integration tasks and is best implemented with an installation of [Jenkins](http://jenkins-ci.org/).
|
7
|
+
|
8
|
+
Examples of tasks yolo can complete for you are:
|
9
|
+
* Building Xcode projects
|
10
|
+
* Running OCUnit & Kiwi unit tests and generating reports
|
11
|
+
* Running Calabash integration tests and generating reports
|
12
|
+
* Packaging iOS IPA files and deploying them to external services
|
13
|
+
* Sending notification emails
|
14
|
+
* Running tasks on each new git tag or commit
|
15
|
+
|
16
|
+
Hat tip to [Luke Redpath](https://github.com/lukeredpath) and his [xcodebuild-rb](https://github.com/lukeredpath/xcodebuild-rb) gem which is the foundation of this project.
|
17
|
+
|
18
|
+
## Installing yolo
|
19
|
+
|
20
|
+
It is recommended that you have [rvm](https://rvm.io/) installed and do not install yolo on system ruby as you may find a number of permissions issues.
|
21
|
+
|
22
|
+
gem install yolo
|
23
|
+
|
24
|
+
## Getting Started
|
25
|
+
|
26
|
+
* [Quick Start](https://github.com/alexefish/yolo/wiki/Quick-Start)
|
27
|
+
* [Configuration](https://github.gcom/alexefish/yolo/wiki/Configuration)
|
28
|
+
|
29
|
+
## Release Builds
|
30
|
+
|
31
|
+
* [Generating IPAs](https://github.com/alexefish/yolo/wiki/Generating-IPAs)
|
32
|
+
* [Deployment](https://github.com/alexefish/yolo/wiki/Deployment)
|
33
|
+
|
34
|
+
## Running Tests
|
35
|
+
|
36
|
+
* [OCUnit & Kiwi](https://github.com/alexefish/yolo/wiki/OCUnit-&-Kiwi)
|
37
|
+
* [Calabash](https://github.com/alexefish/yolo/wiki/Calabash)
|
38
|
+
|
39
|
+
## License
|
40
|
+
|
41
|
+
Copyright (C) 2013 by Alex Fish
|
42
|
+
|
43
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
44
|
+
of this software and associated documentation files (the "Software"), to deal
|
45
|
+
in the Software without restriction, including without limitation the rights
|
46
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
47
|
+
copies of the Software, and to permit persons to whom the Software is
|
48
|
+
furnished to do so, subject to the following conditions:
|
49
|
+
|
50
|
+
The above copyright notice and this permission notice shall be included in
|
51
|
+
all copies or substantial portions of the Software.
|
52
|
+
|
53
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
54
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
55
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
56
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
57
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
58
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
59
|
+
THE SOFTWARE.
|
data/lib/yolo.rb
CHANGED
data/lib/yolo/config.rb
CHANGED
data/lib/yolo/config/settings.rb
CHANGED
@@ -4,10 +4,18 @@ require 'fileutils'
|
|
4
4
|
|
5
5
|
module Yolo
|
6
6
|
module Config
|
7
|
+
#
|
8
|
+
# The Settings Singleton class provides yolo with a number of configurable settings using a config.yml file written to the users home directory
|
9
|
+
#
|
10
|
+
# @author [Alex Fish]
|
11
|
+
#
|
7
12
|
class Settings
|
8
13
|
|
9
14
|
include Singleton
|
10
15
|
|
16
|
+
#
|
17
|
+
# Creates a new Settings instance with default settings, also checks for the presence of a settings file in the users home directory
|
18
|
+
#
|
11
19
|
def initialize
|
12
20
|
@formatter = Yolo::Formatters::ProgressFormatter.new
|
13
21
|
@error = Yolo::Formatters::ErrorFormatter.new
|
@@ -15,6 +23,9 @@ module Yolo
|
|
15
23
|
@yaml = YAML::load_file yaml_path
|
16
24
|
end
|
17
25
|
|
26
|
+
#
|
27
|
+
# Moves the config.yml settings file into the usrs home directory
|
28
|
+
#
|
18
29
|
def load_config
|
19
30
|
create_yolo_dir
|
20
31
|
unless File.exist?(yaml_path)
|
@@ -23,41 +34,67 @@ module Yolo
|
|
23
34
|
end
|
24
35
|
end
|
25
36
|
|
37
|
+
#
|
38
|
+
# The bundle_directory option is the directory which applications are bundled too
|
39
|
+
#
|
40
|
+
# @return [String] The bundle_directory path defined in config.yml
|
26
41
|
def bundle_directory
|
27
42
|
@yaml["paths"]["bundle_directory"]
|
28
43
|
end
|
29
44
|
|
45
|
+
#
|
46
|
+
# The deploy_url is the target url used when deploying
|
47
|
+
#
|
48
|
+
# @return [String] The deployment url defined in config.yml
|
30
49
|
def deploy_url
|
31
50
|
@yaml["deployment"]["url"] if @yaml["deployment"]["url"] and @yaml["deployment"]["url"] != "http://example.com"
|
32
51
|
end
|
33
52
|
|
34
|
-
#
|
53
|
+
#
|
54
|
+
# The mail account is the account used when sending SMTP mail
|
55
|
+
#
|
56
|
+
# @return [String] The mail account defined in config.yml
|
35
57
|
def mail_account
|
36
58
|
@yaml["mail"]["account"] if @yaml["mail"]["account"] and @yaml["mail"]["account"] != "example@example.com"
|
37
59
|
end
|
38
60
|
|
61
|
+
#
|
62
|
+
# The mail password is the password used when sending SMTP mail
|
63
|
+
#
|
64
|
+
# @return [String] The mail password defined in config.yml
|
39
65
|
def mail_password
|
40
66
|
@yaml["mail"]["password"] if @yaml["mail"]["password"] and @yaml["mail"]["password"] != "example"
|
41
67
|
end
|
42
68
|
|
69
|
+
#
|
70
|
+
# The mail port used when sending SMTP mail
|
71
|
+
#
|
72
|
+
# @return [Number] The mail port defined in config.yml
|
43
73
|
def mail_port
|
44
74
|
@yaml["mail"]["port"] if @yaml["mail"]["port"] and @yaml["mail"]["port"] != 0
|
45
75
|
end
|
46
76
|
|
77
|
+
#
|
78
|
+
# The mail host used when sending SMTP mail
|
79
|
+
#
|
80
|
+
# @return [String] The mail host defined in config.yml
|
47
81
|
def mail_host
|
48
82
|
@yaml["mail"]["host"] if @yaml["mail"]["host"] and @yaml["mail"]["host"] != "your.server.ip"
|
49
83
|
end
|
50
84
|
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
85
|
+
#
|
86
|
+
# The email address that SMTP mails are sent from
|
87
|
+
#
|
88
|
+
# @return [String] The from address defined in config.yml
|
55
89
|
def mail_from
|
56
90
|
@yaml["mail"]["from"] if @yaml["mail"]["from"] and @yaml["mail"]["from"] != "example@example.com"
|
57
91
|
end
|
58
92
|
|
59
93
|
private
|
60
94
|
|
95
|
+
#
|
96
|
+
# Checks for the existance of the config directory in the users home directory and creates it if not present
|
97
|
+
#
|
61
98
|
def check_config
|
62
99
|
unless File.directory?(yolo_dir) and File.exist?(yaml_path)
|
63
100
|
@error.run_setup
|
@@ -66,18 +103,33 @@ module Yolo
|
|
66
103
|
end
|
67
104
|
end
|
68
105
|
|
106
|
+
#
|
107
|
+
# The path to the users home directory, same as ~
|
108
|
+
#
|
109
|
+
# @return [String] The full path to the current users home directory
|
69
110
|
def user_directory
|
70
111
|
File.expand_path('~')
|
71
112
|
end
|
72
113
|
|
114
|
+
#
|
115
|
+
# The path to the users config.yml
|
116
|
+
#
|
117
|
+
# @return [String] The full path to the users config.yml file in their home directory
|
73
118
|
def yaml_path
|
74
119
|
"#{user_directory}/.yolo/config.yml"
|
75
120
|
end
|
76
121
|
|
122
|
+
#
|
123
|
+
# The path to the users .yolo directory, this is directory which contains config.yml
|
124
|
+
#
|
125
|
+
# @return [String] The full path to the users .yolo directory
|
77
126
|
def yolo_dir
|
78
127
|
"#{user_directory}/.yolo"
|
79
128
|
end
|
80
129
|
|
130
|
+
#
|
131
|
+
# Creates the .yolo directory in the users home directory (~)
|
132
|
+
#
|
81
133
|
def create_yolo_dir
|
82
134
|
unless File.directory?(yolo_dir)
|
83
135
|
FileUtils.mkdir_p(yolo_dir)
|
data/lib/yolo/deployment.rb
CHANGED
@@ -1,14 +1,33 @@
|
|
1
1
|
module Yolo
|
2
2
|
module Deployment
|
3
|
-
class BaseDeployer
|
4
3
|
|
4
|
+
#
|
5
|
+
# The Deployment super class
|
6
|
+
#
|
7
|
+
# @author [Alex Fish]
|
8
|
+
#
|
9
|
+
class BaseDeployer
|
10
|
+
# The deployer's url
|
5
11
|
attr_accessor :url
|
6
|
-
|
12
|
+
# The path to the [packge to deploy]
|
13
|
+
attr_accessor :package_path
|
7
14
|
|
15
|
+
#
|
16
|
+
# Returns a new Deployer instance
|
17
|
+
#
|
18
|
+
# @return [BaseDeployer] A new BaseDeployer instance
|
8
19
|
def initialize
|
9
20
|
self.url = Yolo::Config::Settings.instance.deploy_url
|
10
21
|
end
|
11
22
|
|
23
|
+
#
|
24
|
+
# Deploys the package, all deployer subclasses must implement this method
|
25
|
+
# @param package_path [String] A full path to the package to deploy
|
26
|
+
# @param block [Block] Block fired on completing
|
27
|
+
#
|
28
|
+
def deploy(package_path, &block)
|
29
|
+
end
|
30
|
+
|
12
31
|
end
|
13
32
|
end
|
14
33
|
end
|
data/lib/yolo/deployment/ota.rb
CHANGED
@@ -2,16 +2,32 @@ require 'json'
|
|
2
2
|
|
3
3
|
module Yolo
|
4
4
|
module Deployment
|
5
|
+
|
6
|
+
#
|
7
|
+
# Deploys IPA's using ustwo's OTA
|
8
|
+
#
|
9
|
+
# @author [Alex Fish]
|
10
|
+
#
|
5
11
|
class OTA < Yolo::Deployment::BaseDeployer
|
6
12
|
|
13
|
+
#
|
14
|
+
# Creates a new OTA instance
|
15
|
+
#
|
16
|
+
# @return [OTA] A new OTA deployer instance
|
7
17
|
def initialize
|
8
18
|
@error_formatter = Yolo::Formatters::ErrorFormatter.new
|
9
19
|
@progress_formatter = Yolo::Formatters::ProgressFormatter.new
|
10
20
|
super
|
11
21
|
end
|
12
22
|
|
13
|
-
|
14
|
-
|
23
|
+
|
24
|
+
#
|
25
|
+
# Overides the super deploy method
|
26
|
+
# @param package_path [String] A full path to the package to deploy
|
27
|
+
# @param block [Block] Block fired on completing
|
28
|
+
#
|
29
|
+
def deploy(package_path, &block)
|
30
|
+
self.package_path = package_path
|
15
31
|
@complete_block = block
|
16
32
|
|
17
33
|
unless self.url
|
@@ -19,19 +35,26 @@ module Yolo
|
|
19
35
|
return
|
20
36
|
end
|
21
37
|
|
22
|
-
@progress_formatter.deploying_ipa(self.
|
38
|
+
@progress_formatter.deploying_ipa(self.package_path)
|
23
39
|
|
24
40
|
upload
|
25
41
|
end
|
26
42
|
|
43
|
+
#
|
44
|
+
# Creates a json package for the OTA uploader params
|
45
|
+
#
|
46
|
+
# @return [String] A JSON string package
|
27
47
|
def package
|
28
|
-
filename = self.
|
48
|
+
filename = self.package_path.split("/").last
|
29
49
|
"{\"fileName\": \"#{filename}\", \"password\": \"\", \"validUntil\": \"2000000000\"}"
|
30
50
|
end
|
31
51
|
|
52
|
+
#
|
53
|
+
# Uploades the package using CURL
|
54
|
+
#
|
32
55
|
def upload
|
33
56
|
response = ""
|
34
|
-
IO.popen("curl -s #{self.url} -X POST -F fileContent=@\"#{self.
|
57
|
+
IO.popen("curl -s #{self.url} -X POST -F fileContent=@\"#{self.package_path}\" -F params='#{package}'") do |io|
|
35
58
|
begin
|
36
59
|
while line = io.readline
|
37
60
|
begin
|
@@ -47,6 +70,10 @@ module Yolo
|
|
47
70
|
upload_complete(response)
|
48
71
|
end
|
49
72
|
|
73
|
+
#
|
74
|
+
# Method called when the upload is complete, parses the json response form OTA which contains the package url and password
|
75
|
+
# @param response [String] The OTA servers response
|
76
|
+
#
|
50
77
|
def upload_complete(response)
|
51
78
|
json = nil
|
52
79
|
begin
|
data/lib/yolo/formatters.rb
CHANGED
@@ -2,32 +2,65 @@ require 'xcodebuild'
|
|
2
2
|
|
3
3
|
module Yolo
|
4
4
|
module Formatters
|
5
|
+
#
|
6
|
+
# Outputs formatted error messages to the console
|
7
|
+
#
|
8
|
+
# @author [Alex Fish]
|
9
|
+
#
|
5
10
|
class ErrorFormatter < XcodeBuild::Formatters::ProgressFormatter
|
6
11
|
|
12
|
+
#
|
13
|
+
# Outputs a red string stating that the info.plist file could not be found
|
14
|
+
#
|
7
15
|
def info_plist_not_found
|
8
16
|
puts red("Can't locate Info.plist")
|
9
17
|
end
|
10
18
|
|
19
|
+
#
|
20
|
+
# Outputs a red string stating that setup is required
|
21
|
+
#
|
11
22
|
def run_setup
|
12
23
|
puts red("Setup required, running rake yolo:setup")
|
13
24
|
end
|
14
25
|
|
26
|
+
#
|
27
|
+
# Outputs a red string stating the the deployment class is invalid
|
28
|
+
# @param klass [String] The deployment class name
|
29
|
+
#
|
15
30
|
def deployment_class_error(klass)
|
16
31
|
puts red("#{klass} is not a valid Class in the Deployment module")
|
17
32
|
end
|
18
33
|
|
34
|
+
#
|
35
|
+
# Outputs a red string stating that there was an issue deploying the ipa
|
36
|
+
# @param error [String] The error string
|
37
|
+
#
|
19
38
|
def deploy_failed(error)
|
20
39
|
puts red("There was a problem deploying the ipa: #{error}")
|
21
40
|
end
|
22
41
|
|
42
|
+
#
|
43
|
+
# Outputs a red string stating that no deploy URL was found in the config file
|
44
|
+
#
|
23
45
|
def no_deploy_url
|
24
46
|
puts red("No deploy url found, please specify one in ~/.yolo/config.yml")
|
25
47
|
end
|
26
48
|
|
49
|
+
#
|
50
|
+
# Outputs a red string stating that email notification failed because of missing details
|
51
|
+
#
|
27
52
|
def missing_email_details
|
28
53
|
puts red("Can't send mail notification, missing details")
|
29
54
|
end
|
30
55
|
|
56
|
+
#
|
57
|
+
# Outputs a red string stating that a release notes file could not be found
|
58
|
+
# @param notes [String] The path which should contain a notes file
|
59
|
+
#
|
60
|
+
def no_notes(notes)
|
61
|
+
puts red("No release notes found in the current directory: #{notes}")
|
62
|
+
end
|
63
|
+
|
31
64
|
end
|
32
65
|
end
|
33
66
|
end
|
@@ -2,16 +2,31 @@ require 'xcodebuild'
|
|
2
2
|
|
3
3
|
module Yolo
|
4
4
|
module Formatters
|
5
|
+
#
|
6
|
+
# Outputs formatted progress messages to the console
|
7
|
+
#
|
8
|
+
# @author [Alex Fish]
|
9
|
+
#
|
5
10
|
class ProgressFormatter < XcodeBuild::Formatters::ProgressFormatter
|
6
11
|
|
12
|
+
#
|
13
|
+
# Outputs a green string stating that the config file was created
|
14
|
+
# @param config [String] The path to the config file
|
15
|
+
#
|
7
16
|
def config_created(config)
|
8
17
|
puts green("Config file created in: #{config}")
|
9
18
|
end
|
10
19
|
|
20
|
+
#
|
21
|
+
# Outputs a green string stating that setup is complete
|
22
|
+
#
|
11
23
|
def setup_complete
|
12
24
|
puts green("Setup complete")
|
13
25
|
end
|
14
26
|
|
27
|
+
#
|
28
|
+
# Outputs an underlined bold string stating that the ipa is being generated
|
29
|
+
#
|
15
30
|
def generating_ipa
|
16
31
|
puts
|
17
32
|
generating = "Generating IPA"
|
@@ -20,6 +35,10 @@ module Yolo
|
|
20
35
|
puts
|
21
36
|
end
|
22
37
|
|
38
|
+
#
|
39
|
+
# Outputs an underlined bold string stating the ipa is being deployed and it's file size
|
40
|
+
# @param ipa [String] The path to the ipa being deployred
|
41
|
+
#
|
23
42
|
def deploying_ipa(ipa)
|
24
43
|
puts
|
25
44
|
deploying = "Deploying IPA"
|
@@ -30,10 +49,17 @@ module Yolo
|
|
30
49
|
puts
|
31
50
|
end
|
32
51
|
|
52
|
+
#
|
53
|
+
# Outputs a green string stating that the ipa was deployed
|
54
|
+
# @param ipa [String] The path to the ipa
|
55
|
+
#
|
33
56
|
def ipa_generated(ipa)
|
34
57
|
puts green("IPA saved to: #{ipa}")
|
35
58
|
end
|
36
59
|
|
60
|
+
#
|
61
|
+
# Outputs an underlined bold string stating that the release notes are being generated
|
62
|
+
#
|
37
63
|
def generating_notes
|
38
64
|
puts
|
39
65
|
notes = "Generating release notes"
|
@@ -42,26 +68,47 @@ module Yolo
|
|
42
68
|
puts
|
43
69
|
end
|
44
70
|
|
71
|
+
#
|
72
|
+
# Outputs a green string stating that the release notes have been generated
|
73
|
+
# @param notes [String] The path to the release notes
|
74
|
+
#
|
45
75
|
def notes_generated(notes)
|
46
|
-
puts green("Release notes generated")
|
76
|
+
puts green("Release notes generated: #{notes}")
|
47
77
|
end
|
48
78
|
|
79
|
+
#
|
80
|
+
# Outputs a cyan string stating that a new tag has been found
|
81
|
+
# @param tag [String] The tag
|
82
|
+
#
|
49
83
|
def new_tag(tag)
|
50
84
|
puts cyan("Found new tag: #{tag}")
|
51
85
|
end
|
52
86
|
|
87
|
+
#
|
88
|
+
# Outputs a cyan string stating that a new commit has been found
|
89
|
+
# @param commit [String] The commit hash
|
90
|
+
#
|
53
91
|
def new_commit(commit)
|
54
92
|
puts cyan("Found new commit: #{commit}")
|
55
93
|
end
|
56
94
|
|
95
|
+
#
|
96
|
+
# Outputs a red string stating that no new commit was found
|
97
|
+
#
|
57
98
|
def no_new_commit
|
58
99
|
puts red("No new commit found")
|
59
100
|
end
|
60
101
|
|
102
|
+
#
|
103
|
+
# Outputs a red string stating that no new tag was found
|
104
|
+
#
|
61
105
|
def no_new_tag
|
62
106
|
puts red("No new tag found")
|
63
107
|
end
|
64
108
|
|
109
|
+
#
|
110
|
+
# Outputs an underlined bold string stating that the notification email is being sent
|
111
|
+
#
|
65
112
|
def sending_email
|
66
113
|
puts
|
67
114
|
email = "Sending notification email"
|
@@ -70,10 +117,19 @@ module Yolo
|
|
70
117
|
puts
|
71
118
|
end
|
72
119
|
|
120
|
+
#
|
121
|
+
# Outputs a green string stating the email was sent
|
122
|
+
# @param to [Array] the users the email was sent to
|
123
|
+
#
|
73
124
|
def email_sent(to)
|
74
125
|
puts green("Notification sent to: #{to}")
|
75
126
|
end
|
76
127
|
|
128
|
+
#
|
129
|
+
# Outputs a formatted string stating that the OTA deploy is complete
|
130
|
+
# @param url [String] The URL to the deployed Application
|
131
|
+
# @param password [String] The password for the deployed application
|
132
|
+
#
|
77
133
|
def deploy_complete(url,password)
|
78
134
|
puts
|
79
135
|
deployed = "IPA deployed"
|
@@ -88,6 +144,11 @@ module Yolo
|
|
88
144
|
puts
|
89
145
|
end
|
90
146
|
|
147
|
+
#
|
148
|
+
# Calculates the size of a file
|
149
|
+
# @param file [String] The full path to the file
|
150
|
+
#
|
151
|
+
# @return [Number] The size of the file in MBs
|
91
152
|
def filesize(file)
|
92
153
|
'%.2f' % (File.size(file).to_f / 2**20)
|
93
154
|
end
|
data/lib/yolo/notify.rb
CHANGED
data/lib/yolo/notify/email.rb
CHANGED
@@ -2,19 +2,33 @@ require 'net/smtp'
|
|
2
2
|
|
3
3
|
module Yolo
|
4
4
|
module Notify
|
5
|
+
#
|
6
|
+
# Sends emails via SMTP
|
7
|
+
#
|
8
|
+
# @author [Alex Fish]
|
9
|
+
#
|
5
10
|
class Email
|
6
11
|
|
12
|
+
# An array of email addresses used in the to field
|
7
13
|
attr_accessor :to
|
14
|
+
# The email address used in the from feild
|
8
15
|
attr_accessor :from
|
16
|
+
# An SMTP server
|
9
17
|
attr_accessor :server
|
18
|
+
# The port to use when sending mail
|
10
19
|
attr_accessor :port
|
20
|
+
# The email account to use when sending mail
|
11
21
|
attr_accessor :account
|
22
|
+
# The account password to use when sending mail
|
12
23
|
attr_accessor :password
|
13
24
|
|
25
|
+
#
|
26
|
+
# Initilizes an instance of the class with default settings
|
27
|
+
# Loads defaults from Yolo::Config::Settings
|
28
|
+
#
|
14
29
|
def initialize
|
15
30
|
self.server = Yolo::Config::Settings.instance.mail_host
|
16
31
|
self.from = Yolo::Config::Settings.instance.mail_from
|
17
|
-
self.to = Yolo::Config::Settings.instance.mail_to
|
18
32
|
self.port = Yolo::Config::Settings.instance.mail_port
|
19
33
|
self.account = Yolo::Config::Settings.instance.mail_account
|
20
34
|
self.password = Yolo::Config::Settings.instance.mail_password
|
@@ -23,11 +37,16 @@ module Yolo
|
|
23
37
|
@progress_formatter = Yolo::Formatters::ProgressFormatter.new
|
24
38
|
end
|
25
39
|
|
40
|
+
#
|
41
|
+
# Sends a nofification email using SMTP
|
42
|
+
# @param opts [Hash] An options hash, options are: server, from, subject, title, body, password, account, port, to
|
43
|
+
#
|
26
44
|
def send(opts={})
|
27
45
|
|
28
46
|
opts[:server] ||= self.server
|
29
47
|
opts[:from] ||= self.from
|
30
48
|
opts[:subject] ||= "New Build!"
|
49
|
+
opts[:title] ||= "New Build!"
|
31
50
|
opts[:body] ||= body(opts)
|
32
51
|
opts[:password] ||= self.password
|
33
52
|
opts[:account] ||= self.account
|
@@ -55,6 +74,11 @@ module Yolo
|
|
55
74
|
end
|
56
75
|
end
|
57
76
|
|
77
|
+
#
|
78
|
+
# The body of them notification email, this method should be overwritten in subclasses
|
79
|
+
# to provide custom content
|
80
|
+
# @param opts [Hash] A populated options hash, allows the use of options when generating email content
|
81
|
+
#
|
58
82
|
def body(opts)
|
59
83
|
""
|
60
84
|
end
|
@@ -2,7 +2,7 @@
|
|
2
2
|
<html xmlns="http://www.w3.org/1999/xhtml">
|
3
3
|
<head>
|
4
4
|
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
|
5
|
-
<title
|
5
|
+
<title></title>
|
6
6
|
<style type="text/css">
|
7
7
|
/* Reset Styles */
|
8
8
|
body{margin:0; padding:0;}
|
@@ -450,25 +450,7 @@
|
|
450
450
|
<!-- END PREHEADER \\ -->
|
451
451
|
<!-- // BEGIN CONTAINER -->
|
452
452
|
<table border="0" cellpadding="0" cellspacing="0" width="100%" id="templateContainer">
|
453
|
-
|
454
|
-
<td align="center" valign="top">
|
455
|
-
<!-- // BEGIN HEADER -->
|
456
|
-
<table border="0" cellpadding="0" cellspacing="0" width="100%" id="templateHeader">
|
457
|
-
<tr>
|
458
|
-
<td align="center" valign="top">
|
459
|
-
<table border="0" cellpadding="0" cellspacing="0" width="320">
|
460
|
-
<tr>
|
461
|
-
<td class="headerContent">
|
462
|
-
<img src="http://gallery.mailchimp.com/27aac8a65e64c994c4416d6b8/images/yoga_logo.png" style="max-width:320px;" id="headerImage campaign-icon" mc:label="header_image" mc:edit="header_image" mc:allowdesigner mc:allowtext />
|
463
|
-
</td>
|
464
|
-
</tr>
|
465
|
-
</table>
|
466
|
-
</td>
|
467
|
-
</tr>
|
468
|
-
</table>
|
469
|
-
<!-- END HEADER \\ -->
|
470
|
-
</td>
|
471
|
-
</tr>
|
453
|
+
|
472
454
|
<tr>
|
473
455
|
<td align="center" valign="top">
|
474
456
|
<!-- // BEGIN BODY -->
|
@@ -481,25 +463,9 @@
|
|
481
463
|
<table border="0" cellpadding="0" cellspacing="0" width="100%">
|
482
464
|
<tr>
|
483
465
|
<td valign="top" class="bodyContent" mc:edit="body_content">
|
484
|
-
<h1>
|
485
|
-
|
486
|
-
|
487
|
-
<ul>
|
488
|
-
<li>Trac-55 - Welcome screen - Showing on logout & not setting shown until close hit</li>
|
489
|
-
</ul>
|
490
|
-
</p>
|
491
|
-
<h3>Fixes</h3>
|
492
|
-
<p>
|
493
|
-
<ul>
|
494
|
-
<li>No Fixes</li>
|
495
|
-
</ul>
|
496
|
-
</p>
|
497
|
-
<h3>Notes</h3>
|
498
|
-
<p>No Notes</p>
|
499
|
-
<h3>Known issues</h3>
|
500
|
-
<p>No Known issues</p>
|
501
|
-
<h3>Password</h3>
|
502
|
-
<p>iasjdiasjdf</p>
|
466
|
+
<h1>YOLO.TITLE</h1>
|
467
|
+
YOLO.CONTENT
|
468
|
+
YOLO.PASSWORD
|
503
469
|
</td>
|
504
470
|
</tr>
|
505
471
|
<tr>
|
@@ -507,7 +473,7 @@
|
|
507
473
|
<table border="0" cellpadding="20" cellspacing="0" width="100%" class="templateButton" mc:hideable>
|
508
474
|
<tr>
|
509
475
|
<td align="center" valign="middle" class="templateButtonContent" mc:edit="button_content00">
|
510
|
-
<a href="
|
476
|
+
<a href="YOLO.LINK" target="_blank">Install</a>
|
511
477
|
</td>
|
512
478
|
</tr>
|
513
479
|
</table>
|
@@ -532,22 +498,7 @@
|
|
532
498
|
<table border="0" cellpadding="0" cellspacing="0" width="320">
|
533
499
|
<tr>
|
534
500
|
<td valign="top" class="footerContent" mc:edit="footer_content">
|
535
|
-
<em>
|
536
|
-
<br />
|
537
|
-
*|IFNOT:ARCHIVE_PAGE|* *|LIST:DESCRIPTION|*
|
538
|
-
<br />
|
539
|
-
<br />
|
540
|
-
<strong>Our mailing address is:</strong>
|
541
|
-
<br />
|
542
|
-
*|HTML:LIST_ADDRESS_HTML|**|END:IF|*
|
543
|
-
<br />
|
544
|
-
<br />
|
545
|
-
*|IF:REWARDS|* *|HTML:REWARDS|* *|END:IF|*
|
546
|
-
</td>
|
547
|
-
</tr>
|
548
|
-
<tr>
|
549
|
-
<td colspan="3" valign="top" class="footerContent" style="padding-top:20px;" mc:edit="footer_utility">
|
550
|
-
<a href="*|UNSUB|*">unsubscribe from this list</a> | <a href="*|UPDATE_PROFILE|*">update subscription preferences</a>
|
501
|
+
<p><em>This is an automated message sent by <a href="https://github.com/alexefish/yolo">yolo</a> A build tools gem by <a href="http://alexefish.com/">Alex Fish</a></em></p>
|
551
502
|
</td>
|
552
503
|
</tr>
|
553
504
|
</table>
|
@@ -3,21 +3,47 @@ require 'net/smtp'
|
|
3
3
|
module Yolo
|
4
4
|
module Notify
|
5
5
|
module Ios
|
6
|
+
#
|
7
|
+
# OTAEmail generates an HTML email for OTA build notifications
|
8
|
+
#
|
9
|
+
# @author [Alex Fish]
|
10
|
+
#
|
6
11
|
class OTAEmail < Yolo::Notify::Email
|
7
12
|
|
13
|
+
#
|
14
|
+
# The OTA Email body content, this content is generated using release_notes.md
|
15
|
+
# and an HTML email template in the same directory (email.html)
|
16
|
+
# @param opts [Hash] The options hash from super
|
17
|
+
#
|
8
18
|
def body(opts)
|
9
|
-
file = File.open(File.dirname(__FILE__) + "/email.html", "r")
|
10
|
-
content = file.read
|
11
|
-
|
12
19
|
message = <<MESSAGE_END
|
13
20
|
To: A Test User <test@todomain.com>
|
14
21
|
MIME-Version: 1.0
|
15
22
|
Content-type: text/html
|
16
23
|
Subject: #{opts[:subject]}
|
17
24
|
|
18
|
-
#{
|
25
|
+
#{parsed_body(opts)}
|
19
26
|
MESSAGE_END
|
20
27
|
end
|
28
|
+
|
29
|
+
#
|
30
|
+
# Returns HTML ready to be used in the email body, HTML is generated by
|
31
|
+
# parsing the email.html template and applying realease_notes.md content
|
32
|
+
# @param opts [Hash] The options hash from super
|
33
|
+
#
|
34
|
+
# @return [String] HTML body content for emailing
|
35
|
+
def parsed_body(opts)
|
36
|
+
file = File.open(File.dirname(__FILE__) + "/email.html", "r")
|
37
|
+
content = file.read
|
38
|
+
markdown = Yolo::Tools::Ios::ReleaseNotes.html
|
39
|
+
|
40
|
+
content = content.gsub("YOLO.TITLE",opts[:title])
|
41
|
+
content = content.gsub("YOLO.CONTENT",markdown)
|
42
|
+
content = content.gsub("YOLO.PASSWORD","<h3>Password</h3><hr><p>#{opts[:ota_password]}</p>")
|
43
|
+
content = content.gsub("YOLO.LINK",opts[:ota_url])
|
44
|
+
content
|
45
|
+
end
|
46
|
+
|
21
47
|
end
|
22
48
|
end
|
23
49
|
end
|
data/lib/yolo/tasks.rb
CHANGED
@@ -1,5 +1,12 @@
|
|
1
|
+
module Yolo
|
2
|
+
#
|
3
|
+
# The tasks module contains classes which run tasks such as build, release & test
|
4
|
+
#
|
5
|
+
# @author [Alex Fish]
|
6
|
+
#
|
7
|
+
module Tasks
|
8
|
+
end
|
9
|
+
end
|
10
|
+
|
1
11
|
require 'yolo/tasks/base_task'
|
2
|
-
require 'yolo/tasks/ios
|
3
|
-
require 'yolo/tasks/ios/release'
|
4
|
-
require 'yolo/tasks/ios/ocunit'
|
5
|
-
require 'yolo/tasks/ios/calabash'
|
12
|
+
require 'yolo/tasks/ios'
|
data/lib/yolo/tasks/base_task.rb
CHANGED
@@ -0,0 +1,16 @@
|
|
1
|
+
module Yolo
|
2
|
+
module Tasks
|
3
|
+
#
|
4
|
+
# The Ios Tasks module contains all Ios specific tasks
|
5
|
+
#
|
6
|
+
# @author [author]
|
7
|
+
#
|
8
|
+
module Ios
|
9
|
+
end
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
require 'yolo/tasks/ios/build'
|
14
|
+
require 'yolo/tasks/ios/release'
|
15
|
+
require 'yolo/tasks/ios/ocunit'
|
16
|
+
require 'yolo/tasks/ios/calabash'
|
data/lib/yolo/tasks/ios/build.rb
CHANGED
@@ -1,6 +1,11 @@
|
|
1
1
|
module Yolo
|
2
2
|
module Tasks
|
3
3
|
module Ios
|
4
|
+
#
|
5
|
+
# Executes all build related tasks
|
6
|
+
#
|
7
|
+
# @author [Alex Fish]
|
8
|
+
#
|
4
9
|
class Build < Yolo::Tasks::BaseTask
|
5
10
|
#
|
6
11
|
# Defines rake tasks available to the Build class
|
@@ -8,17 +13,17 @@ module Yolo
|
|
8
13
|
def define
|
9
14
|
super
|
10
15
|
namespace :yolo do
|
11
|
-
desc "Builds the specified
|
16
|
+
desc "Builds the specified scheme(s)."
|
12
17
|
task :build do
|
13
18
|
xcodebuild :build
|
14
19
|
end
|
15
20
|
|
16
|
-
desc "Cleans the specified
|
21
|
+
desc "Cleans the specified scheme(s)."
|
17
22
|
task :clean do
|
18
23
|
xcodebuild :clean
|
19
24
|
end
|
20
25
|
|
21
|
-
desc "Builds the specified
|
26
|
+
desc "Builds the specified scheme(s) from a clean slate."
|
22
27
|
task :cleanbuild => [:clean, :build]
|
23
28
|
end
|
24
29
|
end
|
@@ -1,6 +1,11 @@
|
|
1
1
|
module Yolo
|
2
2
|
module Tasks
|
3
3
|
module Ios
|
4
|
+
#
|
5
|
+
# Executes all calabash related tasks
|
6
|
+
#
|
7
|
+
# @author [Alex Fish]
|
8
|
+
#
|
4
9
|
class Calabash < Yolo::Tasks::BaseTask
|
5
10
|
|
6
11
|
# The test report output format
|
@@ -25,17 +30,17 @@ module Yolo
|
|
25
30
|
super
|
26
31
|
namespace :yolo do
|
27
32
|
namespace :calabash do
|
28
|
-
desc "Runs the specified
|
33
|
+
desc "Runs the specified scheme(s) calabash tests."
|
29
34
|
task :test do
|
30
35
|
Yolo::Tools::Ios::Calabash.run(format, output_dir)
|
31
36
|
end
|
32
37
|
|
33
|
-
desc "Cleans the specified
|
38
|
+
desc "Cleans the specified scheme(s)."
|
34
39
|
task :clean do
|
35
40
|
xcodebuild :clean
|
36
41
|
end
|
37
42
|
|
38
|
-
desc "Runs the specified
|
43
|
+
desc "Runs the specified scheme(s) calabash tests from a clean slate."
|
39
44
|
task :cleantest => [:clean, :test]
|
40
45
|
end
|
41
46
|
end
|
@@ -1,6 +1,11 @@
|
|
1
1
|
module Yolo
|
2
2
|
module Tasks
|
3
3
|
module Ios
|
4
|
+
#
|
5
|
+
# Executes all OCunit related tasks
|
6
|
+
#
|
7
|
+
# @author [Alex Fish]
|
8
|
+
#
|
4
9
|
class OCUnit < Yolo::Tasks::BaseTask
|
5
10
|
|
6
11
|
# the test_output type used when running tests, currently only supports
|
@@ -20,7 +25,7 @@ module Yolo
|
|
20
25
|
# Overrides the superclass build_opts_string method and appends a pipe
|
21
26
|
# if test_ouput is defined
|
22
27
|
#
|
23
|
-
# @param
|
28
|
+
# @param additional_opts [Array] an array of additional options for the build command
|
24
29
|
#
|
25
30
|
# @return [String] the option string with additional options and test output
|
26
31
|
# pipe appended if defined
|
@@ -37,17 +42,17 @@ module Yolo
|
|
37
42
|
super
|
38
43
|
namespace :yolo do
|
39
44
|
namespace :ocunit do
|
40
|
-
desc "Runs the specified
|
45
|
+
desc "Runs the specified scheme(s) OCUnit tests."
|
41
46
|
task :test do
|
42
47
|
xcodebuild :build
|
43
48
|
end
|
44
49
|
|
45
|
-
desc "Cleans the specified
|
50
|
+
desc "Cleans the specified scheme(s)."
|
46
51
|
task :clean do
|
47
52
|
xcodebuild :clean
|
48
53
|
end
|
49
54
|
|
50
|
-
desc "Runs the specified
|
55
|
+
desc "Runs the specified scheme(s) OCUnit tests from a clean slate."
|
51
56
|
task :cleantest => [:clean, :test]
|
52
57
|
end
|
53
58
|
end
|
@@ -3,6 +3,11 @@ require 'find'
|
|
3
3
|
module Yolo
|
4
4
|
module Tasks
|
5
5
|
module Ios
|
6
|
+
#
|
7
|
+
# Executes all release related tasks
|
8
|
+
#
|
9
|
+
# @author [Alex Fish]
|
10
|
+
#
|
6
11
|
class Release < Yolo::Tasks::BaseTask
|
7
12
|
|
8
13
|
# The email addresses used when notifying
|
@@ -129,7 +134,8 @@ module Yolo
|
|
129
134
|
:to => self.mail_to,
|
130
135
|
:ota_url => url,
|
131
136
|
:ota_password => password,
|
132
|
-
:subject => "New #{name} build: #{version}"
|
137
|
+
:subject => "New #{name} build: #{version}",
|
138
|
+
:title => name
|
133
139
|
)
|
134
140
|
end
|
135
141
|
end
|
data/lib/yolo/tools.rb
CHANGED
@@ -1,5 +1,12 @@
|
|
1
|
+
module Yolo
|
2
|
+
#
|
3
|
+
# The tools module contains tools such as git, calabash, xcode
|
4
|
+
#
|
5
|
+
# @author [Alex Fish]
|
6
|
+
#
|
7
|
+
module Tools
|
8
|
+
end
|
9
|
+
end
|
10
|
+
|
1
11
|
require 'yolo/tools/git'
|
2
|
-
require 'yolo/tools/ios
|
3
|
-
require 'yolo/tools/ios/xcode'
|
4
|
-
require 'yolo/tools/ios/ipa'
|
5
|
-
require 'yolo/tools/ios/release_notes'
|
12
|
+
require 'yolo/tools/ios'
|
data/lib/yolo/tools/git.rb
CHANGED
@@ -0,0 +1,16 @@
|
|
1
|
+
module Yolo
|
2
|
+
module Tools
|
3
|
+
#
|
4
|
+
# The Ios Tools module contains all iOS specific tools
|
5
|
+
#
|
6
|
+
# @author [Alex Fish]
|
7
|
+
#
|
8
|
+
module Ios
|
9
|
+
end
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
require 'yolo/tools/ios/calabash'
|
14
|
+
require 'yolo/tools/ios/xcode'
|
15
|
+
require 'yolo/tools/ios/ipa'
|
16
|
+
require 'yolo/tools/ios/release_notes'
|
@@ -3,7 +3,18 @@ require "calabash-cucumber"
|
|
3
3
|
module Yolo
|
4
4
|
module Tools
|
5
5
|
module Ios
|
6
|
+
#
|
7
|
+
# Runs calabash tests and outputs reports
|
8
|
+
#
|
9
|
+
# @author [Alex Fish]
|
10
|
+
#
|
6
11
|
module Calabash
|
12
|
+
#
|
13
|
+
# Runs cucumber calabash tests and outputs reports to a defined location
|
14
|
+
# @param format = :junit [Symbol] The test output type, defaults to junit for Jenkins, see the cucumber docs for more options
|
15
|
+
# @param output_dir = "test-reports/cucumber" [String] Folder destination to output the test reports to
|
16
|
+
#
|
17
|
+
# @return [type] [description]
|
7
18
|
def self.run(format = :junit, output_dir = "test-reports/cucumber")
|
8
19
|
IO.popen("cucumber --format #{format.to_s} --out #{output_dir}") do |io|
|
9
20
|
begin
|
data/lib/yolo/tools/ios/ipa.rb
CHANGED
@@ -1,9 +1,19 @@
|
|
1
|
-
require 'CFPropertyList'
|
2
|
-
|
3
1
|
module Yolo
|
4
2
|
module Tools
|
5
3
|
module Ios
|
4
|
+
#
|
5
|
+
# Generates iOS IPA packages using xcrun
|
6
|
+
#
|
7
|
+
# @author [Alex Fish]
|
8
|
+
#
|
6
9
|
class IPA
|
10
|
+
#
|
11
|
+
# Generates an ipa package
|
12
|
+
# @param app_path [String] The full path to the .app file
|
13
|
+
# @param dsym_path [String] The full path to the dSYM folder
|
14
|
+
# @param output_directory [String] The full path to the ipa save destination
|
15
|
+
# @param block [Block] Block called on completion
|
16
|
+
#
|
7
17
|
def self.generate(app_path,dsym_path,output_directory, &block)
|
8
18
|
formatter = Yolo::Formatters::ProgressFormatter.new
|
9
19
|
formatter.generating_ipa
|
@@ -1,7 +1,18 @@
|
|
1
|
+
require 'Redcarpet'
|
2
|
+
|
1
3
|
module Yolo
|
2
4
|
module Tools
|
3
5
|
module Ios
|
6
|
+
#
|
7
|
+
# Generates and parses release notes for application releases
|
8
|
+
#
|
9
|
+
# @author [Alex Fish]
|
10
|
+
#
|
4
11
|
module ReleaseNotes
|
12
|
+
#
|
13
|
+
# Generates a release notes markdown file in the current directory
|
14
|
+
# @param plist_path [String] The full path to the applications info.plist
|
15
|
+
#
|
5
16
|
def self.generate(plist_path)
|
6
17
|
xcode = Yolo::Tools::Ios::Xcode.new
|
7
18
|
xcode.info_plist_path = plist_path
|
@@ -28,6 +39,27 @@ module Yolo
|
|
28
39
|
|
29
40
|
`open #{directory}/release_notes.md`
|
30
41
|
end
|
42
|
+
|
43
|
+
#
|
44
|
+
# Uses Redcarpet to parse the release notes markdown file into html.
|
45
|
+
#
|
46
|
+
# @return [String] An html string representation of the current release_notes.md file
|
47
|
+
def self.html
|
48
|
+
notes = "#{Dir.pwd}/release_notes.md"
|
49
|
+
unless File.exist?(notes)
|
50
|
+
error_formatter = Yolo::Formatters::ErrorFormatter.new
|
51
|
+
error_formatter.no_notes(notes)
|
52
|
+
return ""
|
53
|
+
end
|
54
|
+
|
55
|
+
file = File.open(notes, "r")
|
56
|
+
file_content = file.read
|
57
|
+
markdown = Redcarpet::Markdown.new(Redcarpet::Render::HTML,
|
58
|
+
:autolink => true, :space_after_headers => true)
|
59
|
+
content = markdown.render(file_content)
|
60
|
+
content.gsub("\n","")
|
61
|
+
content
|
62
|
+
end
|
31
63
|
end
|
32
64
|
end
|
33
65
|
end
|
data/lib/yolo/tools/ios/xcode.rb
CHANGED
@@ -3,30 +3,56 @@ require 'CFPropertyList'
|
|
3
3
|
module Yolo
|
4
4
|
module Tools
|
5
5
|
module Ios
|
6
|
+
#
|
7
|
+
# Provides an interface to Xcode
|
8
|
+
#
|
9
|
+
# @author [Alex Fish]
|
10
|
+
#
|
6
11
|
class Xcode
|
7
|
-
|
12
|
+
# The path to The Xcode preferences file
|
8
13
|
attr_accessor :prefs_plist_path
|
14
|
+
# The path to an applications info plist
|
9
15
|
attr_accessor :info_plist_path
|
10
16
|
|
17
|
+
#
|
18
|
+
# Creates a new instance of Xcode with the default preferences p list location loaded
|
19
|
+
#
|
20
|
+
# @return [Xcode] An Xcode instance
|
11
21
|
def initialize
|
12
22
|
self.prefs_plist_path = "#{user_directory}/Library/Preferences/com.apple.dt.Xcode.plist"
|
13
23
|
end
|
14
24
|
|
25
|
+
#
|
26
|
+
# The current users home directory path
|
27
|
+
#
|
28
|
+
# @return [String] The path to the current users home directory, same as ~
|
15
29
|
def user_directory
|
16
30
|
File.expand_path('~')
|
17
31
|
end
|
18
32
|
|
33
|
+
#
|
34
|
+
# Returns a hash representation of Xcode's preferences
|
35
|
+
#
|
36
|
+
# @return [Hash] A hash containing all of Xcode's preferences
|
19
37
|
def prefs
|
20
38
|
plist = CFPropertyList::List.new(:file => prefs_plist_path)
|
21
39
|
CFPropertyList.native_types(plist.value)
|
22
40
|
end
|
23
41
|
|
42
|
+
#
|
43
|
+
# Querys Xcode's preferences to find it's build folder location
|
44
|
+
#
|
45
|
+
# @return [String] The full path to Xcode's build location
|
24
46
|
def build_path
|
25
47
|
path = prefs["IDECustomDerivedDataLocation"]
|
26
48
|
path = "#{user_directory}/Library/Developer/Xcode/DerivedData" unless path
|
27
49
|
path
|
28
50
|
end
|
29
51
|
|
52
|
+
#
|
53
|
+
# Creates a Hash representation of an applications info.plist
|
54
|
+
#
|
55
|
+
# @return [Hash] A hash representation of the instances info.plist
|
30
56
|
def info_plist
|
31
57
|
if info_plist_path
|
32
58
|
plist = CFPropertyList::List.new(:file => info_plist_path)
|
@@ -37,10 +63,18 @@ module Yolo
|
|
37
63
|
end
|
38
64
|
end
|
39
65
|
|
66
|
+
#
|
67
|
+
# Queries the instances info_plist hash to return the CFBundleVersion
|
68
|
+
#
|
69
|
+
# @return [String] The current instances info.plist CFBundleVersion
|
40
70
|
def build_number
|
41
71
|
info_plist["CFBundleVersion"]
|
42
72
|
end
|
43
73
|
|
74
|
+
#
|
75
|
+
# Queries the instances info_plist hash to return the CFBundleShortVersionString
|
76
|
+
#
|
77
|
+
# @return [String] The current instances info.plist CFBundleShortVersionString
|
44
78
|
def version_number
|
45
79
|
info_plist["CFBundleShortVersionString"]
|
46
80
|
end
|
metadata
CHANGED
@@ -1,15 +1,15 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: yolo
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.0.0
|
5
|
-
prerelease:
|
4
|
+
version: 1.0.0
|
5
|
+
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
8
8
|
- Alex Fish
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2013-02-
|
12
|
+
date: 2013-02-03 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: xcodebuild-rb
|
@@ -44,7 +44,7 @@ dependencies:
|
|
44
44
|
- !ruby/object:Gem::Version
|
45
45
|
version: '1.2'
|
46
46
|
- !ruby/object:Gem::Dependency
|
47
|
-
name:
|
47
|
+
name: calabash-cucumber
|
48
48
|
requirement: !ruby/object:Gem::Requirement
|
49
49
|
none: false
|
50
50
|
requirements:
|
@@ -60,7 +60,7 @@ dependencies:
|
|
60
60
|
- !ruby/object:Gem::Version
|
61
61
|
version: '0'
|
62
62
|
- !ruby/object:Gem::Dependency
|
63
|
-
name:
|
63
|
+
name: redcarpet
|
64
64
|
requirement: !ruby/object:Gem::Requirement
|
65
65
|
none: false
|
66
66
|
requirements:
|
@@ -75,7 +75,7 @@ dependencies:
|
|
75
75
|
- - ! '>='
|
76
76
|
- !ruby/object:Gem::Version
|
77
77
|
version: '0'
|
78
|
-
description:
|
78
|
+
description: A ruby interface to Continuous integration
|
79
79
|
email: alex@alexefish.com
|
80
80
|
executables: []
|
81
81
|
extensions: []
|
@@ -95,18 +95,21 @@ files:
|
|
95
95
|
- lib/yolo/notify/email.rb
|
96
96
|
- lib/yolo/notify/ios/email.html
|
97
97
|
- lib/yolo/notify/ios/ota_email.rb
|
98
|
+
- lib/yolo/notify/ios.rb
|
98
99
|
- lib/yolo/notify.rb
|
99
100
|
- lib/yolo/tasks/base_task.rb
|
100
101
|
- lib/yolo/tasks/ios/build.rb
|
101
102
|
- lib/yolo/tasks/ios/calabash.rb
|
102
103
|
- lib/yolo/tasks/ios/ocunit.rb
|
103
104
|
- lib/yolo/tasks/ios/release.rb
|
105
|
+
- lib/yolo/tasks/ios.rb
|
104
106
|
- lib/yolo/tasks.rb
|
105
107
|
- lib/yolo/tools/git.rb
|
106
108
|
- lib/yolo/tools/ios/calabash.rb
|
107
109
|
- lib/yolo/tools/ios/ipa.rb
|
108
110
|
- lib/yolo/tools/ios/release_notes.rb
|
109
111
|
- lib/yolo/tools/ios/xcode.rb
|
112
|
+
- lib/yolo/tools/ios.rb
|
110
113
|
- lib/yolo/tools.rb
|
111
114
|
- lib/yolo.rb
|
112
115
|
- README.md
|
@@ -125,9 +128,9 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
125
128
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
126
129
|
none: false
|
127
130
|
requirements:
|
128
|
-
- - ! '
|
131
|
+
- - ! '>='
|
129
132
|
- !ruby/object:Gem::Version
|
130
|
-
version:
|
133
|
+
version: '0'
|
131
134
|
requirements: []
|
132
135
|
rubyforge_project:
|
133
136
|
rubygems_version: 1.8.24
|