yolo 1.1.11 → 1.1.12
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/README.md +4 -0
- data/Rakefile +1 -1
- data/lib/yolo/config/settings.rb +41 -35
- data/lib/yolo/deployment/base_deployer.rb +1 -1
- data/lib/yolo/deployment/ota.rb +4 -8
- data/lib/yolo/tasks/ios/build.rb +17 -0
- data/lib/yolo/tools/git.rb +4 -6
- data/lib/yolo/tools/ios/calabash.rb +2 -2
- data/lib/yolo/tools/ios/coverage.rb +3 -7
- data/lib/yolo/tools/ios/ipa.rb +51 -11
- data/lib/yolo/tools/ios/release_notes.rb +1 -1
- data/lib/yolo/tools/ios/xcode.rb +7 -13
- data/spec/config/settings_spec.rb +128 -0
- data/spec/deployment/base_deployer_spec.rb +16 -0
- data/spec/deployment/ota_spec.rb +109 -0
- data/spec/deployment/test_flight_spec.rb +8 -0
- data/spec/notify/email_spec.rb +8 -0
- data/spec/notify/ios/ota_email_spec.rb +9 -0
- data/spec/spec_helper.rb +13 -0
- data/spec/tools/git_spec.rb +123 -0
- data/spec/tools/ios/calabash_spec.rb +29 -0
- data/spec/tools/ios/coverage_spec.rb +52 -0
- data/spec/tools/ios/ipa_spec.rb +107 -0
- data/spec/tools/ios/release_notes_spec.rb +100 -0
- data/spec/tools/ios/xcode_spec.rb +72 -0
- metadata +16 -3
data/README.md
CHANGED
@@ -1,6 +1,10 @@
|
|
1
1
|
yolo
|
2
2
|
====
|
3
3
|
|
4
|
+
[](https://codeclimate.com/github/alexefish/yolo)
|
5
|
+
[](https://coveralls.io/r/alexefish/yolo)
|
6
|
+
[](https://travis-ci.org/alexefish/yolo)
|
7
|
+
|
4
8
|
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
9
|
|
6
10
|
yolo allows you to run a number of continuous integration tasks and is best implemented with an installation of [Jenkins](http://jenkins-ci.org/).
|
data/Rakefile
CHANGED
data/lib/yolo/config/settings.rb
CHANGED
@@ -21,6 +21,12 @@ module Yolo
|
|
21
21
|
@error = Yolo::Formatters::ErrorFormatter.new
|
22
22
|
check_config
|
23
23
|
update_config
|
24
|
+
end
|
25
|
+
|
26
|
+
#
|
27
|
+
# Loads the @yaml instance var
|
28
|
+
#
|
29
|
+
def load_yaml
|
24
30
|
@yaml = YAML::load_file yaml_path
|
25
31
|
end
|
26
32
|
|
@@ -35,6 +41,40 @@ module Yolo
|
|
35
41
|
end
|
36
42
|
end
|
37
43
|
|
44
|
+
#
|
45
|
+
# Checks for the existance of the config directory in the users home directory and creates it if not present
|
46
|
+
#
|
47
|
+
def check_config
|
48
|
+
unless File.directory?(yolo_dir) and File.exist?(yaml_path)
|
49
|
+
@error.run_setup
|
50
|
+
load_config
|
51
|
+
@formatter.setup_complete
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
55
|
+
#
|
56
|
+
# Checks the config file is update to the latest and adds any options that are missing
|
57
|
+
#
|
58
|
+
def update_config
|
59
|
+
if File.directory?(yolo_dir) and File.exist?(yaml_path)
|
60
|
+
@yaml = YAML::load_file yaml_path
|
61
|
+
unless @yaml["deployment"]["api_token"]
|
62
|
+
@yaml["deployment"]["api_token"] = "example"
|
63
|
+
File.open(yaml_path, 'w') {|f|
|
64
|
+
f.write(@yaml.to_yaml)
|
65
|
+
}
|
66
|
+
@formatter.config_updated(yaml_path)
|
67
|
+
end
|
68
|
+
unless @yaml["deployment"]["team_token"]
|
69
|
+
@yaml["deployment"]["team_token"] = "example"
|
70
|
+
File.open(yaml_path, 'w') {|f|
|
71
|
+
f.write(@yaml.to_yaml)
|
72
|
+
}
|
73
|
+
@formatter.config_updated(yaml_path)
|
74
|
+
end
|
75
|
+
end
|
76
|
+
end
|
77
|
+
|
38
78
|
#
|
39
79
|
# The bundle_directory option is the directory which applications are bundled too
|
40
80
|
#
|
@@ -107,46 +147,12 @@ module Yolo
|
|
107
147
|
@yaml["mail"]["from"] if @yaml["mail"]["from"] and @yaml["mail"]["from"] != "example@example.com"
|
108
148
|
end
|
109
149
|
|
110
|
-
#
|
111
|
-
# Checks for the existance of the config directory in the users home directory and creates it if not present
|
112
|
-
#
|
113
|
-
def check_config
|
114
|
-
unless File.directory?(yolo_dir) and File.exist?(yaml_path)
|
115
|
-
@error.run_setup
|
116
|
-
load_config
|
117
|
-
@formatter.setup_complete
|
118
|
-
end
|
119
|
-
end
|
120
|
-
|
121
|
-
#
|
122
|
-
# Checks the config file is update to the latest and adds any options that are missing
|
123
|
-
#
|
124
|
-
def update_config
|
125
|
-
if File.directory?(yolo_dir) and File.exist?(yaml_path)
|
126
|
-
@yaml = YAML::load_file yaml_path
|
127
|
-
unless @yaml["deployment"]["api_token"]
|
128
|
-
@yaml["deployment"]["api_token"] = "example"
|
129
|
-
File.open(yaml_path, 'w') {|f|
|
130
|
-
f.write(@yaml.to_yaml)
|
131
|
-
}
|
132
|
-
@formatter.config_updated(yaml_path)
|
133
|
-
end
|
134
|
-
unless @yaml["deployment"]["team_token"]
|
135
|
-
@yaml["deployment"]["team_token"] = "example"
|
136
|
-
File.open(yaml_path, 'w') {|f|
|
137
|
-
f.write(@yaml.to_yaml)
|
138
|
-
}
|
139
|
-
@formatter.config_updated(yaml_path)
|
140
|
-
end
|
141
|
-
end
|
142
|
-
end
|
143
|
-
|
144
150
|
#
|
145
151
|
# The path to the users home directory, same as ~
|
146
152
|
#
|
147
153
|
# @return [String] The full path to the current users home directory
|
148
154
|
def user_directory
|
149
|
-
|
155
|
+
Dir.pwd
|
150
156
|
end
|
151
157
|
|
152
158
|
#
|
data/lib/yolo/deployment/ota.rb
CHANGED
@@ -58,17 +58,13 @@ module Yolo
|
|
58
58
|
IO.popen("curl #{self.url} -X POST -# -F fileContent=@\"#{self.package_path}\" -F params='#{package}'") do |io|
|
59
59
|
begin
|
60
60
|
while line = io.readline
|
61
|
-
|
62
|
-
response << line
|
63
|
-
rescue StandardError => e
|
64
|
-
@error_formatter.deploy_failed("ParserError: #{e}")
|
65
|
-
end
|
61
|
+
response << line
|
66
62
|
end
|
67
63
|
rescue EOFError
|
68
|
-
|
69
|
-
|
64
|
+
@error_formatter.deploy_failed("Upload error")
|
65
|
+
end
|
70
66
|
end
|
71
|
-
upload_complete(response)
|
67
|
+
upload_complete(response) if response.length > 0
|
72
68
|
end
|
73
69
|
|
74
70
|
#
|
data/lib/yolo/tasks/ios/build.rb
CHANGED
@@ -7,6 +7,23 @@ module Yolo
|
|
7
7
|
# @author [Alex Fish]
|
8
8
|
#
|
9
9
|
class Build < Yolo::Tasks::BaseTask
|
10
|
+
|
11
|
+
#
|
12
|
+
# Overrides the superclass build_opts_string method and appends skip code sign command
|
13
|
+
# if debug confid is defined
|
14
|
+
#
|
15
|
+
# @param additional_opts [Array] an array of additional options for the build command
|
16
|
+
#
|
17
|
+
# @return [String] the option string with additional options and test output
|
18
|
+
# pipe appended if defined
|
19
|
+
def build_opts_string(*additional_opts)
|
20
|
+
options = build_opts + additional_opts
|
21
|
+
if configuration == "Debug" or configuration.nil?
|
22
|
+
options = options << "CODE_SIGN_IDENTITY="" CODE_SIGNING_REQUIRED=NO"
|
23
|
+
end
|
24
|
+
return options.compact.join(" ")
|
25
|
+
end
|
26
|
+
|
10
27
|
#
|
11
28
|
# Defines rake tasks available to the Build class
|
12
29
|
#
|
data/lib/yolo/tools/git.rb
CHANGED
@@ -32,12 +32,10 @@ module Yolo
|
|
32
32
|
commit = latest_commit
|
33
33
|
if yaml_commit == commit
|
34
34
|
@formatter.no_new_commit
|
35
|
-
@commit = nil
|
36
35
|
false
|
37
36
|
else
|
38
37
|
@formatter.new_commit(commit)
|
39
38
|
update_commit(commit)
|
40
|
-
@commit = commit
|
41
39
|
true
|
42
40
|
end
|
43
41
|
end
|
@@ -52,12 +50,10 @@ module Yolo
|
|
52
50
|
tag = latest_tag
|
53
51
|
if yaml_tag == tag
|
54
52
|
@formatter.no_new_tag
|
55
|
-
@tag = nil
|
56
53
|
false
|
57
54
|
else
|
58
55
|
@formatter.new_tag(tag)
|
59
56
|
update_tag(tag)
|
60
|
-
@tag = tag
|
61
57
|
true
|
62
58
|
end
|
63
59
|
end
|
@@ -86,6 +82,7 @@ module Yolo
|
|
86
82
|
# @param new_tag [String] The new tag to store as the latest
|
87
83
|
#
|
88
84
|
def update_tag(new_tag)
|
85
|
+
@tag = new_tag
|
89
86
|
if @yaml[project_name]
|
90
87
|
@yaml[project_name]["tag"] = new_tag
|
91
88
|
else
|
@@ -99,6 +96,7 @@ module Yolo
|
|
99
96
|
# @param new_commit [String] The new commit hash to store as the latest
|
100
97
|
#
|
101
98
|
def update_commit(new_commit)
|
99
|
+
@commit = new_commit
|
102
100
|
if @yaml[project_name]
|
103
101
|
@yaml[project_name]["commit"] = new_commit
|
104
102
|
else
|
@@ -122,11 +120,11 @@ module Yolo
|
|
122
120
|
#
|
123
121
|
# @return [String] The tag
|
124
122
|
def latest_tag
|
125
|
-
match = log.scan(/tag:\
|
123
|
+
match = log.scan(/tag:\s(.+?),\s/).first
|
126
124
|
if match.nil?
|
127
125
|
""
|
128
126
|
else
|
129
|
-
match
|
127
|
+
match.first
|
130
128
|
end
|
131
129
|
end
|
132
130
|
|
@@ -20,7 +20,7 @@ module Yolo
|
|
20
20
|
begin
|
21
21
|
while line = io.readline
|
22
22
|
begin
|
23
|
-
|
23
|
+
puts line
|
24
24
|
rescue StandardError => e
|
25
25
|
puts "Error from output buffer: #{e.inspect}"
|
26
26
|
puts e.backtrace
|
@@ -29,7 +29,7 @@ module Yolo
|
|
29
29
|
rescue EOFError
|
30
30
|
end
|
31
31
|
end
|
32
|
-
$?.exitstatus
|
32
|
+
$?.exitstatus if $?
|
33
33
|
end
|
34
34
|
end
|
35
35
|
end
|
@@ -23,17 +23,13 @@ module Yolo
|
|
23
23
|
IO.popen("cd #{build_path} && gcovr --xml > #{output_dir}/coverage.xml") do |io|
|
24
24
|
begin
|
25
25
|
while line = io.readline
|
26
|
-
|
27
|
-
STDOUT << line
|
28
|
-
rescue StandardError => e
|
29
|
-
puts "Error from output buffer: #{e.inspect}"
|
30
|
-
puts e.backtrace
|
31
|
-
end
|
26
|
+
puts line
|
32
27
|
end
|
33
28
|
rescue EOFError
|
29
|
+
puts "Error while executing"
|
34
30
|
end
|
35
31
|
end
|
36
|
-
$?.exitstatus
|
32
|
+
$?.exitstatus if $?
|
37
33
|
end
|
38
34
|
end
|
39
35
|
end
|
data/lib/yolo/tools/ios/ipa.rb
CHANGED
@@ -17,24 +17,64 @@ module Yolo
|
|
17
17
|
def self.generate(app_path,dsym_path,output_directory, &block)
|
18
18
|
formatter = Yolo::Formatters::ProgressFormatter.new
|
19
19
|
formatter.generating_ipa
|
20
|
-
|
20
|
+
name = self.app_name(app_path)
|
21
|
+
# create directory
|
22
|
+
self.create_directory(output_directory)
|
23
|
+
# make ipa
|
24
|
+
`/usr/bin/xcrun -sdk iphoneos PackageApplication -v #{app_path} -o #{output_directory}/#{name}.ipa`
|
25
|
+
# move files
|
26
|
+
self.move_file(dsym_path,output_directory)
|
27
|
+
self.move_release_notes(output_directory)
|
28
|
+
|
29
|
+
formatter.ipa_generated("#{output_directory}/#{name}.ipa")
|
30
|
+
|
31
|
+
block.call("#{output_directory}/#{name}.ipa") if block
|
32
|
+
end
|
33
|
+
|
34
|
+
private
|
35
|
+
|
36
|
+
#
|
37
|
+
# Calculates the application name form the .app path
|
38
|
+
#
|
39
|
+
# @param app_path [String] The full path to the .app file
|
40
|
+
# @return [String] The name of the app
|
41
|
+
def self.app_name(app_path)
|
42
|
+
app_path.split("/").last.split(".").first
|
43
|
+
end
|
21
44
|
|
22
|
-
|
23
|
-
|
45
|
+
#
|
46
|
+
# Creates a directory if missing
|
47
|
+
# @param directory [String] The path to the directory to create
|
48
|
+
#
|
49
|
+
def self.create_directory(directory)
|
50
|
+
unless File.directory?(directory)
|
51
|
+
FileUtils.mkdir_p(directory)
|
24
52
|
end
|
53
|
+
end
|
25
54
|
|
26
|
-
|
27
|
-
|
55
|
+
#
|
56
|
+
# Moves a file to a location
|
57
|
+
# @param file [String] The path to the file to move
|
58
|
+
# @param directory [String] The path to the directory to move the file to
|
59
|
+
#
|
60
|
+
def self.move_file(file, directory)
|
28
61
|
# move dsym
|
29
|
-
FileUtils.cp_r(
|
62
|
+
FileUtils.cp_r(file, directory) if file
|
63
|
+
end
|
64
|
+
|
65
|
+
#
|
66
|
+
# Moves the projects releas notes file to a location
|
67
|
+
# @param output_directory [type] [description]
|
68
|
+
#
|
69
|
+
# @return [type] [description]
|
70
|
+
def self.move_release_notes(directory)
|
30
71
|
# move release notes
|
31
72
|
release_path = "#{Dir.pwd}/release_notes.md"
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
block.call("#{output_directory}/#{ipa_name}.ipa") if block
|
73
|
+
if File.exist?(directory) and File.exist?(release_path)
|
74
|
+
FileUtils.cp_r(release_path, directory)
|
75
|
+
end
|
37
76
|
end
|
77
|
+
|
38
78
|
end
|
39
79
|
end
|
40
80
|
end
|
data/lib/yolo/tools/ios/xcode.rb
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
require '
|
1
|
+
require 'cfpropertylist'
|
2
2
|
|
3
3
|
module Yolo
|
4
4
|
module Tools
|
@@ -17,17 +17,11 @@ module Yolo
|
|
17
17
|
#
|
18
18
|
# Creates a new instance of Xcode with the default preferences p list location loaded
|
19
19
|
#
|
20
|
+
# @param info_plist_path [String] The full path to an xcode projects info_plist
|
20
21
|
# @return [Xcode] An Xcode instance
|
21
|
-
def initialize
|
22
|
-
self.prefs_plist_path = "#{
|
23
|
-
|
24
|
-
|
25
|
-
#
|
26
|
-
# The current users home directory path
|
27
|
-
#
|
28
|
-
# @return [String] The path to the current users home directory, same as ~
|
29
|
-
def user_directory
|
30
|
-
File.expand_path('~')
|
22
|
+
def initialize(info_plist_path = "")
|
23
|
+
self.prefs_plist_path = "#{Dir.pwd}/Library/Preferences/com.apple.dt.Xcode.plist"
|
24
|
+
self.info_plist_path = info_plist_path
|
31
25
|
end
|
32
26
|
|
33
27
|
#
|
@@ -45,7 +39,7 @@ module Yolo
|
|
45
39
|
# @return [String] The full path to Xcode's build location
|
46
40
|
def build_path
|
47
41
|
path = prefs["IDECustomDerivedDataLocation"]
|
48
|
-
path = "#{
|
42
|
+
path = "#{Dir.pwd}/Library/Developer/Xcode/DerivedData" unless path
|
49
43
|
path
|
50
44
|
end
|
51
45
|
|
@@ -54,7 +48,7 @@ module Yolo
|
|
54
48
|
#
|
55
49
|
# @return [Hash] A hash representation of the instances info.plist
|
56
50
|
def info_plist
|
57
|
-
if info_plist_path
|
51
|
+
if info_plist_path
|
58
52
|
plist = CFPropertyList::List.new(:file => info_plist_path)
|
59
53
|
CFPropertyList.native_types(plist.value)
|
60
54
|
else
|
@@ -0,0 +1,128 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require "yolo/config/settings"
|
3
|
+
require 'yolo/formatters'
|
4
|
+
|
5
|
+
describe Yolo::Config::Settings do
|
6
|
+
|
7
|
+
before do
|
8
|
+
Yolo::Config::Settings.instance.stub(:yolo_dir){"test_dir"}
|
9
|
+
FileUtils.stub(:cp_r)
|
10
|
+
FileUtils.stub(:mkdir_p)
|
11
|
+
Yolo::Formatters::ProgressFormatter.any_instance.stub(:puts)
|
12
|
+
Yolo::Formatters::ErrorFormatter.any_instance.stub(:puts)
|
13
|
+
end
|
14
|
+
|
15
|
+
it "should be a singleton" do
|
16
|
+
Yolo::Config::Settings.instance.should_not eq(nil)
|
17
|
+
end
|
18
|
+
|
19
|
+
describe "when loading the config" do
|
20
|
+
it "should not load if already loaded" do
|
21
|
+
File.stub(:exist?){true}
|
22
|
+
File.stub(:directory?){true}
|
23
|
+
Yolo::Config::Settings.instance.should_not_receive(:load_config)
|
24
|
+
Yolo::Config::Settings.instance.check_config
|
25
|
+
end
|
26
|
+
|
27
|
+
it "should load if not loaded" do
|
28
|
+
File.stub(:exist?){false}
|
29
|
+
File.stub(:directory?){false}
|
30
|
+
Yolo::Config::Settings.instance.should_receive(:load_config)
|
31
|
+
Yolo::Config::Settings.instance.check_config
|
32
|
+
end
|
33
|
+
|
34
|
+
it "should create the yolo directory" do
|
35
|
+
File.stub(:directory?){false}
|
36
|
+
FileUtils.should_receive(:mkdir_p).with("test_dir")
|
37
|
+
Yolo::Config::Settings.instance.create_yolo_dir
|
38
|
+
end
|
39
|
+
|
40
|
+
it "should not create the yolo directory if it exists" do
|
41
|
+
File.stub(:directory?){true}
|
42
|
+
FileUtils.should_not_receive(:mkdir_p).with("test_dir")
|
43
|
+
Yolo::Config::Settings.instance.create_yolo_dir
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
describe "when updating the config" do
|
48
|
+
before do
|
49
|
+
File.stub(:open)
|
50
|
+
File.stub(:exist?){true}
|
51
|
+
File.stub(:directory?){true}
|
52
|
+
end
|
53
|
+
|
54
|
+
it "should add an api token if missing" do
|
55
|
+
@yaml = {"deployment" => {"api_token" => nil}}
|
56
|
+
YAML.stub(:load_file){@yaml}
|
57
|
+
Yolo::Config::Settings.instance.update_config
|
58
|
+
@yaml["deployment"]["api_token"].should eq("example")
|
59
|
+
end
|
60
|
+
|
61
|
+
it "should add an team token if missing" do
|
62
|
+
@yaml = {"deployment" => {"team_token" => nil}}
|
63
|
+
YAML.stub(:load_file){@yaml}
|
64
|
+
Yolo::Config::Settings.instance.update_config
|
65
|
+
@yaml["deployment"]["team_token"].should eq("example")
|
66
|
+
end
|
67
|
+
end
|
68
|
+
|
69
|
+
describe "when asked for settings" do
|
70
|
+
before do
|
71
|
+
@yaml = {
|
72
|
+
"paths" => {
|
73
|
+
"bundle_directory" => "test_directory"
|
74
|
+
},
|
75
|
+
"deployment" => {
|
76
|
+
"url" => "test_url",
|
77
|
+
"api_token" => "test_token",
|
78
|
+
"team_token" => "test_team_token",
|
79
|
+
},
|
80
|
+
"mail" => {
|
81
|
+
"account" => "test_account",
|
82
|
+
"password" => "test_password",
|
83
|
+
"port" => "test_port",
|
84
|
+
"host" => "test_host",
|
85
|
+
"from" => "test_from"
|
86
|
+
}
|
87
|
+
}
|
88
|
+
YAML.stub(:load_file){@yaml}
|
89
|
+
Yolo::Config::Settings.instance.load_yaml
|
90
|
+
end
|
91
|
+
|
92
|
+
it "should hold a bundle directory" do
|
93
|
+
Yolo::Config::Settings.instance.bundle_directory.should eq("test_directory")
|
94
|
+
end
|
95
|
+
|
96
|
+
it "should hold a deploy url" do
|
97
|
+
Yolo::Config::Settings.instance.deploy_url.should eq("test_url")
|
98
|
+
end
|
99
|
+
|
100
|
+
it "should hold a deploy token" do
|
101
|
+
Yolo::Config::Settings.instance.api_token.should eq("test_token")
|
102
|
+
end
|
103
|
+
|
104
|
+
it "should hold a deploy team token" do
|
105
|
+
Yolo::Config::Settings.instance.team_token.should eq("test_team_token")
|
106
|
+
end
|
107
|
+
|
108
|
+
it "should hold a mail account" do
|
109
|
+
Yolo::Config::Settings.instance.mail_account.should eq("test_account")
|
110
|
+
end
|
111
|
+
|
112
|
+
it "should hold a mail password" do
|
113
|
+
Yolo::Config::Settings.instance.mail_password.should eq("test_password")
|
114
|
+
end
|
115
|
+
|
116
|
+
it "should hold a mail port" do
|
117
|
+
Yolo::Config::Settings.instance.mail_port.should eq("test_port")
|
118
|
+
end
|
119
|
+
|
120
|
+
it "should hold a mail host" do
|
121
|
+
Yolo::Config::Settings.instance.mail_host.should eq("test_host")
|
122
|
+
end
|
123
|
+
|
124
|
+
it "should hold a mail from" do
|
125
|
+
Yolo::Config::Settings.instance.mail_from.should eq("test_from")
|
126
|
+
end
|
127
|
+
end
|
128
|
+
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require 'yolo/deployment'
|
3
|
+
require 'yolo/formatters'
|
4
|
+
require 'yolo/config'
|
5
|
+
|
6
|
+
describe Yolo::Deployment::BaseDeployer do
|
7
|
+
|
8
|
+
describe "when initilized" do
|
9
|
+
it "should load a deploy url from settings" do
|
10
|
+
Yolo::Config::Settings.instance.stub(:deploy_url){"test_url"}
|
11
|
+
@deployer = Yolo::Deployment::BaseDeployer.new
|
12
|
+
@deployer.url.should eq("test_url")
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
end
|
@@ -0,0 +1,109 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require 'yolo/deployment'
|
3
|
+
require 'yolo/formatters'
|
4
|
+
require 'yolo/config'
|
5
|
+
require 'json'
|
6
|
+
|
7
|
+
describe Yolo::Deployment::OTA do
|
8
|
+
|
9
|
+
before do
|
10
|
+
@error_formatter = Yolo::Formatters::ErrorFormatter.new
|
11
|
+
Yolo::Formatters::ErrorFormatter.stub(:new){@error_formatter}
|
12
|
+
|
13
|
+
Yolo::Formatters::ErrorFormatter.any_instance.stub(:puts)
|
14
|
+
Yolo::Formatters::ProgressFormatter.any_instance.stub(:puts)
|
15
|
+
Yolo::Formatters::ProgressFormatter.any_instance.stub(:deploying_ipa)
|
16
|
+
|
17
|
+
@ota = Yolo::Deployment::OTA.new
|
18
|
+
end
|
19
|
+
|
20
|
+
describe "when deploying" do
|
21
|
+
|
22
|
+
before do
|
23
|
+
@ota.stub(:upload)
|
24
|
+
end
|
25
|
+
|
26
|
+
after do
|
27
|
+
@ota = Yolo::Deployment::OTA.new
|
28
|
+
end
|
29
|
+
|
30
|
+
it "should deploy a package" do
|
31
|
+
@ota.should_receive(:upload)
|
32
|
+
@ota.url = "test"
|
33
|
+
@ota.deploy("test_path")
|
34
|
+
@ota.package_path.should eq("test_path")
|
35
|
+
end
|
36
|
+
|
37
|
+
it "should not deploy without a deploy url" do
|
38
|
+
@ota.should_not_receive(:upload)
|
39
|
+
@ota.url = nil
|
40
|
+
@ota.deploy("test_path")
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
describe "when packaging" do
|
45
|
+
it "should get the file name from the path" do
|
46
|
+
@ota.package_path = "path/to/filename.app"
|
47
|
+
@ota.package.should match(/\"fileName\": \"filename.app\"/)
|
48
|
+
end
|
49
|
+
|
50
|
+
it "should set an expiry date" do
|
51
|
+
@ota.package_path = "path/to/filename.app"
|
52
|
+
@ota.package.should match(/\"validUntil\"/)
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
56
|
+
describe "when uploading" do
|
57
|
+
before do
|
58
|
+
@io = mock(IO)
|
59
|
+
@io.stub(:readline)
|
60
|
+
@ota.stub(:package)
|
61
|
+
IO.stub(:popen).and_yield(@io)
|
62
|
+
end
|
63
|
+
|
64
|
+
it "should curl to the correct url" do
|
65
|
+
@ota.url = "test.com"
|
66
|
+
IO.should_receive(:popen).with(/curl test.com/)
|
67
|
+
@ota.upload
|
68
|
+
end
|
69
|
+
|
70
|
+
it "should catch EOFError exceptions" do
|
71
|
+
@io.stub(:readline).and_raise(EOFError)
|
72
|
+
@error_formatter.should_receive(:deploy_failed).at_least(1).times
|
73
|
+
@ota.upload
|
74
|
+
end
|
75
|
+
|
76
|
+
it "should parse the response" do
|
77
|
+
@io.stub(:readline).and_return("response string", nil)
|
78
|
+
@ota.should_receive(:upload_complete).with("response string")
|
79
|
+
@ota.upload
|
80
|
+
end
|
81
|
+
|
82
|
+
it "should not complete with a nil response" do
|
83
|
+
@io.should_not_receive(:upload_complete)
|
84
|
+
@ota.upload
|
85
|
+
end
|
86
|
+
end
|
87
|
+
|
88
|
+
describe "on completion" do
|
89
|
+
|
90
|
+
before do
|
91
|
+
@ota.stub(:upload)
|
92
|
+
@json = "{'link':'test_link','password','test_password'}"
|
93
|
+
end
|
94
|
+
|
95
|
+
it "should catch json parse errors" do
|
96
|
+
@error_formatter.should_receive(:deploy_failed)
|
97
|
+
@ota.upload_complete("json")
|
98
|
+
end
|
99
|
+
|
100
|
+
it "should parse the response" do
|
101
|
+
@ota.upload_complete(@json)
|
102
|
+
@ota.deploy("test", nil) do |url, password|
|
103
|
+
password.should eq("test_password")
|
104
|
+
url.should eq("test_link")
|
105
|
+
end
|
106
|
+
end
|
107
|
+
|
108
|
+
end
|
109
|
+
end
|
data/spec/spec_helper.rb
ADDED
@@ -0,0 +1,13 @@
|
|
1
|
+
require 'coveralls'
|
2
|
+
Coveralls.wear!
|
3
|
+
|
4
|
+
RSpec.configure do |config|
|
5
|
+
# Use color in STDOUT
|
6
|
+
config.color_enabled = true
|
7
|
+
|
8
|
+
# Use color not only in STDOUT but also in pagers and files
|
9
|
+
config.tty = true
|
10
|
+
|
11
|
+
# Use the specified formatter
|
12
|
+
config.formatter = :documentation # :progress, :html, :textmate
|
13
|
+
end
|
@@ -0,0 +1,123 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require 'yolo/tools/git'
|
3
|
+
require 'yolo/formatters'
|
4
|
+
|
5
|
+
describe Yolo::Tools::Git do
|
6
|
+
|
7
|
+
before do
|
8
|
+
@git = Yolo::Tools::Git.new
|
9
|
+
@git.project_name = "test"
|
10
|
+
YAML.stub!(:load_file){{}}
|
11
|
+
Yolo::Formatters::ProgressFormatter.any_instance.stub(:puts)
|
12
|
+
end
|
13
|
+
|
14
|
+
describe "when checking for new commits" do
|
15
|
+
before do
|
16
|
+
@git.stub(:update_commit)
|
17
|
+
end
|
18
|
+
|
19
|
+
it "should recognise new commits" do
|
20
|
+
Yolo::Tools::Git.any_instance.stub(:yaml_commit){"new"}
|
21
|
+
Yolo::Tools::Git.any_instance.stub(:latest_commit){"old"}
|
22
|
+
@git.has_new_commit("").should eq(true)
|
23
|
+
end
|
24
|
+
|
25
|
+
it "should recognise existing commits" do
|
26
|
+
Yolo::Tools::Git.any_instance.stub(:yaml_commit){"old"}
|
27
|
+
Yolo::Tools::Git.any_instance.stub(:latest_commit){"old"}
|
28
|
+
@git.has_new_commit("").should eq(false)
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
describe "when checking for new tags" do
|
33
|
+
before do
|
34
|
+
@git.stub(:update_tag)
|
35
|
+
end
|
36
|
+
|
37
|
+
it "should recognise new tags" do
|
38
|
+
Yolo::Tools::Git.any_instance.stub(:yaml_tag){"old"}
|
39
|
+
Yolo::Tools::Git.any_instance.stub(:latest_tag){"new"}
|
40
|
+
@git.has_new_tag("").should eq(true)
|
41
|
+
end
|
42
|
+
|
43
|
+
it "should recognise existing tags" do
|
44
|
+
Yolo::Tools::Git.any_instance.stub(:yaml_tag){"old"}
|
45
|
+
Yolo::Tools::Git.any_instance.stub(:latest_tag){"old"}
|
46
|
+
@git.has_new_tag("").should eq(false)
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
describe "when updating tags and commits" do
|
51
|
+
|
52
|
+
before do
|
53
|
+
@git.stub(:save_yaml)
|
54
|
+
end
|
55
|
+
|
56
|
+
it "should keep track of the latest tag" do
|
57
|
+
@git.instance_eval{update_tag("new tag")}
|
58
|
+
@git.tag.should match("new tag")
|
59
|
+
end
|
60
|
+
|
61
|
+
it "should keep track of the latest commit" do
|
62
|
+
@git.instance_eval{update_commit("new commit")}
|
63
|
+
@git.commit.should match("new commit")
|
64
|
+
end
|
65
|
+
|
66
|
+
it "should store the latest tag" do
|
67
|
+
@git.instance_eval{update_tag("new tag")}
|
68
|
+
@git.instance_eval{yaml_tag}.should match("new tag")
|
69
|
+
end
|
70
|
+
|
71
|
+
it "should store the latest commit" do
|
72
|
+
@git.instance_eval{update_commit("new commit")}
|
73
|
+
@git.instance_eval{yaml_commit}.should match("new commit")
|
74
|
+
end
|
75
|
+
|
76
|
+
end
|
77
|
+
|
78
|
+
describe "when saving data" do
|
79
|
+
it "should save data to disk" do
|
80
|
+
test_file = mock(File)
|
81
|
+
test_file.stub(:write)
|
82
|
+
File.stub(:open).and_yield(test_file)
|
83
|
+
test_file.should_receive(:write)
|
84
|
+
|
85
|
+
@git.instance_eval{save_yaml}
|
86
|
+
end
|
87
|
+
end
|
88
|
+
|
89
|
+
describe "when checking for new data" do
|
90
|
+
|
91
|
+
it "should use git log" do
|
92
|
+
@git.should_receive(:`).with(/git log/)
|
93
|
+
@git.instance_eval{log}
|
94
|
+
end
|
95
|
+
|
96
|
+
it "should get the latest tag" do
|
97
|
+
@git.stub(:log){"tag: v1.0, head, tag: v1.3.1"}
|
98
|
+
@git.instance_eval{latest_tag}.should eq("v1.0")
|
99
|
+
end
|
100
|
+
|
101
|
+
it "should recognise invalid tags" do
|
102
|
+
@git.stub(:log){"junk"}
|
103
|
+
@git.instance_eval{latest_tag}.should eq("")
|
104
|
+
end
|
105
|
+
|
106
|
+
it "should get the latest commit" do
|
107
|
+
@git.stub(:log){"0e4672b678"}
|
108
|
+
@git.instance_eval{latest_commit}.should eq("0e4672b678")
|
109
|
+
end
|
110
|
+
|
111
|
+
it "should recognise invalid commits" do
|
112
|
+
@git.stub(:log){"junk"}
|
113
|
+
@git.instance_eval{latest_commit}.should eq("")
|
114
|
+
end
|
115
|
+
|
116
|
+
it "should get the current branch" do
|
117
|
+
@git.stub(:`){
|
118
|
+
"branch\n* activebranch"
|
119
|
+
}
|
120
|
+
@git.instance_eval{current_branch}.should eq("activebranch")
|
121
|
+
end
|
122
|
+
end
|
123
|
+
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require 'yolo/tools/ios/calabash'
|
3
|
+
|
4
|
+
describe Yolo::Tools::Ios::Calabash do
|
5
|
+
|
6
|
+
before do
|
7
|
+
IO.stub(:popen)
|
8
|
+
end
|
9
|
+
|
10
|
+
describe "when running " do
|
11
|
+
|
12
|
+
it "should execute the cucumber command" do
|
13
|
+
IO.should_receive(:popen).with(/cucumber/)
|
14
|
+
Yolo::Tools::Ios::Calabash.run()
|
15
|
+
end
|
16
|
+
|
17
|
+
it "should pass junit as the default format" do
|
18
|
+
IO.should_receive(:popen).with(/--format junit/)
|
19
|
+
Yolo::Tools::Ios::Calabash.run()
|
20
|
+
end
|
21
|
+
|
22
|
+
it "pass test-reports/cucumber as the default output directory" do
|
23
|
+
IO.should_receive(:popen).with(/--out test-reports\/cucumber/)
|
24
|
+
Yolo::Tools::Ios::Calabash.run()
|
25
|
+
end
|
26
|
+
|
27
|
+
end
|
28
|
+
|
29
|
+
end
|
@@ -0,0 +1,52 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require 'yolo/tools/ios/coverage'
|
3
|
+
require 'yolo/formatters'
|
4
|
+
|
5
|
+
describe Yolo::Tools::Ios::Coverage do
|
6
|
+
|
7
|
+
before do
|
8
|
+
Yolo::Formatters::ErrorFormatter.any_instance.stub(:puts)
|
9
|
+
IO.stub(:popen)
|
10
|
+
end
|
11
|
+
|
12
|
+
describe "when calculating coverage" do
|
13
|
+
it "should require a build path" do
|
14
|
+
IO.should_not_receive(:popen)
|
15
|
+
Yolo::Tools::Ios::Coverage.calculate("","test")
|
16
|
+
end
|
17
|
+
|
18
|
+
it "should require a output path" do
|
19
|
+
IO.should_not_receive(:popen)
|
20
|
+
Yolo::Tools::Ios::Coverage.calculate("test","")
|
21
|
+
end
|
22
|
+
|
23
|
+
it "should execute gcovr" do
|
24
|
+
IO.should_receive(:popen).with(/gcovr/)
|
25
|
+
Yolo::Tools::Ios::Coverage.calculate("test","test")
|
26
|
+
end
|
27
|
+
|
28
|
+
it "should execute at the build path" do
|
29
|
+
IO.should_receive(:popen).with(/cd test/)
|
30
|
+
Yolo::Tools::Ios::Coverage.calculate("test","test")
|
31
|
+
end
|
32
|
+
|
33
|
+
it "should output xml to the output path" do
|
34
|
+
IO.should_receive(:popen).with(/--xml > test\/coverage.xml/)
|
35
|
+
Yolo::Tools::Ios::Coverage.calculate("test","test")
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
describe "when calculating coverage fails" do
|
40
|
+
|
41
|
+
before do
|
42
|
+
@io = mock(IO)
|
43
|
+
IO.stub(:popen).and_yield(@io)
|
44
|
+
end
|
45
|
+
|
46
|
+
it "should catch EOFError exceptions" do
|
47
|
+
@io.stub(:readline).and_raise(EOFError)
|
48
|
+
Yolo::Tools::Ios::Coverage.should_receive(:puts)
|
49
|
+
Yolo::Tools::Ios::Coverage.calculate("test","test")
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
@@ -0,0 +1,107 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require 'yolo/tools/ios/ipa'
|
3
|
+
require 'yolo/formatters'
|
4
|
+
|
5
|
+
describe Yolo::Tools::Ios::IPA do
|
6
|
+
|
7
|
+
before do
|
8
|
+
@ipa = Yolo::Tools::Ios::IPA
|
9
|
+
Yolo::Formatters::ProgressFormatter.any_instance.stub(:puts)
|
10
|
+
end
|
11
|
+
|
12
|
+
describe "when generating an ipa" do
|
13
|
+
before do
|
14
|
+
@ipa.stub(:`)
|
15
|
+
@ipa.stub(:move_file)
|
16
|
+
@ipa.stub(:move_release_notes)
|
17
|
+
FileUtils.stub(:mkdir_p)
|
18
|
+
end
|
19
|
+
|
20
|
+
it "should return the ipa path" do
|
21
|
+
@ipa.stub(:app_name){"name"}
|
22
|
+
@ipa.generate("","","output") do |ipa|
|
23
|
+
ipa.should eq("output/name.ipa")
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
it "should calculate the name from the app path" do
|
28
|
+
@ipa.app_name("/path/to/app/test.app").should eq("test")
|
29
|
+
end
|
30
|
+
|
31
|
+
describe "and executing" do
|
32
|
+
it "should execute xcrun" do
|
33
|
+
@ipa.stub(:app_name)
|
34
|
+
@ipa.should_receive(:`).with(/\/usr\/bin\/xcrun/)
|
35
|
+
@ipa.generate("","","")
|
36
|
+
end
|
37
|
+
|
38
|
+
it "should pacakge the app" do
|
39
|
+
@ipa.stub(:app_name)
|
40
|
+
@ipa.should_receive(:`).with(/PackageApplication -v app\/path/)
|
41
|
+
@ipa.generate("app/path","","")
|
42
|
+
end
|
43
|
+
|
44
|
+
it "should set the sdk to iphoneos" do
|
45
|
+
@ipa.stub(:app_name)
|
46
|
+
@ipa.should_receive(:`).with(/-sdk iphoneos/)
|
47
|
+
@ipa.generate("","","")
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
describe "and outputting the ipa" do
|
52
|
+
before do
|
53
|
+
@ipa.stub(:app_name)
|
54
|
+
end
|
55
|
+
|
56
|
+
it "should create an output directory if missing" do
|
57
|
+
File.stub(:directory?){false}
|
58
|
+
FileUtils.should_receive(:mkdir_p).with("output/path")
|
59
|
+
@ipa.create_directory("output/path")
|
60
|
+
end
|
61
|
+
|
62
|
+
it "should output to the output directory" do
|
63
|
+
@ipa.stub(:create_directory)
|
64
|
+
@ipa.stub(:app_name){"test"}
|
65
|
+
@ipa.should_receive(:`).with(/-o output\/path\/test.ipa/)
|
66
|
+
@ipa.generate("","","output/path")
|
67
|
+
end
|
68
|
+
|
69
|
+
it "should move files into place" do
|
70
|
+
@ipa.should_receive(:move_file)
|
71
|
+
@ipa.generate("","","")
|
72
|
+
end
|
73
|
+
|
74
|
+
it "should move release notes into place" do
|
75
|
+
@ipa.should_receive(:move_release_notes)
|
76
|
+
@ipa.generate("","","")
|
77
|
+
end
|
78
|
+
end
|
79
|
+
end
|
80
|
+
|
81
|
+
describe "when moving files" do
|
82
|
+
it "should move them" do
|
83
|
+
FileUtils.stub(:cp_r)
|
84
|
+
FileUtils.should_receive(:cp_r).with("file","dir")
|
85
|
+
@ipa.move_file("file","dir")
|
86
|
+
end
|
87
|
+
|
88
|
+
it "should not attempt to move nil files" do
|
89
|
+
FileUtils.should_not_receive(:cp_r)
|
90
|
+
@ipa.move_file(nil,"dir")
|
91
|
+
end
|
92
|
+
|
93
|
+
it "should move release notes" do
|
94
|
+
Dir.stub(:pwd){"path"}
|
95
|
+
File.stub("exist?"){true}
|
96
|
+
FileUtils.should_receive(:cp_r).with("path/release_notes.md", "dir")
|
97
|
+
@ipa.move_release_notes("dir")
|
98
|
+
end
|
99
|
+
|
100
|
+
it "should not attempt to move nil" do
|
101
|
+
File.stub("exist?"){false}
|
102
|
+
Dir.stub(:pwd){"path"}
|
103
|
+
FileUtils.should_not_receive(:cp_r)
|
104
|
+
@ipa.move_release_notes("dir")
|
105
|
+
end
|
106
|
+
end
|
107
|
+
end
|
@@ -0,0 +1,100 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require 'yolo/tools/ios/xcode'
|
3
|
+
require 'yolo/tools/ios/release_notes'
|
4
|
+
require 'yolo/formatters'
|
5
|
+
|
6
|
+
describe Yolo::Tools::Ios::ReleaseNotes do
|
7
|
+
|
8
|
+
before do
|
9
|
+
@xcode = Yolo::Tools::Ios::Xcode.new
|
10
|
+
Yolo::Tools::Ios::Xcode.stub(:new){@xcode}
|
11
|
+
@xcode.stub(:info_plist_path)
|
12
|
+
@xcode.stub(:version_number)
|
13
|
+
@xcode.stub(:build_number)
|
14
|
+
@release_notes = Yolo::Tools::Ios::ReleaseNotes
|
15
|
+
Yolo::Formatters::ErrorFormatter.any_instance.stub(:puts)
|
16
|
+
Yolo::Formatters::ProgressFormatter.any_instance.stub(:puts)
|
17
|
+
end
|
18
|
+
|
19
|
+
describe "When generating release notes" do
|
20
|
+
|
21
|
+
before do
|
22
|
+
Dir.stub(:pwd){"current_path"}
|
23
|
+
@file = mock(File)
|
24
|
+
@file.stub(:write)
|
25
|
+
File.stub(:open).and_yield(@file)
|
26
|
+
@release_notes.stub(:`)
|
27
|
+
end
|
28
|
+
|
29
|
+
it "should pass a plist path to xcode" do
|
30
|
+
@xcode.should_receive(:info_plist_path=).with("path")
|
31
|
+
@release_notes.generate("path")
|
32
|
+
end
|
33
|
+
|
34
|
+
it "should use the current directory" do
|
35
|
+
Dir.should_receive(:pwd)
|
36
|
+
@release_notes.generate("path")
|
37
|
+
end
|
38
|
+
|
39
|
+
it "should use the builds version number" do
|
40
|
+
@xcode.should_receive(:version_number)
|
41
|
+
@release_notes.generate("path")
|
42
|
+
end
|
43
|
+
|
44
|
+
it "should use the builds build number" do
|
45
|
+
@xcode.should_receive(:build_number)
|
46
|
+
@release_notes.generate("path")
|
47
|
+
end
|
48
|
+
|
49
|
+
it "should use the current time" do
|
50
|
+
@time = Time.new
|
51
|
+
Time.stub(:new){@time}
|
52
|
+
@time.should_receive(:day)
|
53
|
+
@time.should_receive(:month)
|
54
|
+
@time.should_receive(:year)
|
55
|
+
@time.should_receive(:hour)
|
56
|
+
@time.should_receive(:min)
|
57
|
+
@release_notes.generate("path")
|
58
|
+
end
|
59
|
+
|
60
|
+
it "should open the release notes after writting" do
|
61
|
+
@release_notes.should_receive(:`).with(/open current_path\/release_notes.md/)
|
62
|
+
@release_notes.generate("path")
|
63
|
+
end
|
64
|
+
end
|
65
|
+
|
66
|
+
describe "when parsing release notes to plain text" do
|
67
|
+
before do
|
68
|
+
Dir.stub(:pwd){"current_path"}
|
69
|
+
end
|
70
|
+
|
71
|
+
it "should not attempt to parse a nil file" do
|
72
|
+
File.stub(:exist?){false}
|
73
|
+
@release_notes.plaintext.should eq("")
|
74
|
+
end
|
75
|
+
|
76
|
+
it "should return the notes in plaintext" do
|
77
|
+
File.stub(:exist?){true}
|
78
|
+
@file = mock(File)
|
79
|
+
File.stub(:open){@file}
|
80
|
+
@file.stub(:read){"plaintext"}
|
81
|
+
@release_notes.plaintext.should eq("plaintext")
|
82
|
+
end
|
83
|
+
end
|
84
|
+
|
85
|
+
describe "when parsing release notes to html" do
|
86
|
+
|
87
|
+
it "should not attempt to parse a nil file" do
|
88
|
+
File.stub(:exist?){false}
|
89
|
+
@release_notes.plaintext.should eq("")
|
90
|
+
end
|
91
|
+
|
92
|
+
it "should return release notes in html format" do
|
93
|
+
File.stub(:exist?){true}
|
94
|
+
@file = mock(File)
|
95
|
+
File.stub(:open){@file}
|
96
|
+
@file.stub(:read){"# hello"}
|
97
|
+
@release_notes.html.should eq("<h1>hello</h1>\n")
|
98
|
+
end
|
99
|
+
end
|
100
|
+
end
|
@@ -0,0 +1,72 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require 'yolo/tools/ios/xcode'
|
3
|
+
require 'yolo/formatters'
|
4
|
+
|
5
|
+
describe Yolo::Tools::Ios::Xcode do
|
6
|
+
before do
|
7
|
+
@xcode = Yolo::Tools::Ios::Xcode.new
|
8
|
+
Yolo::Formatters::ErrorFormatter.any_instance.stub(:puts)
|
9
|
+
end
|
10
|
+
|
11
|
+
describe "on init" do
|
12
|
+
it "should load a preferences file path" do
|
13
|
+
@xcode.prefs_plist_path.should_not eq(nil)
|
14
|
+
end
|
15
|
+
|
16
|
+
it "should load an info plist path" do
|
17
|
+
xcode = Yolo::Tools::Ios::Xcode.new("path")
|
18
|
+
xcode.info_plist_path.should eq("path")
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
describe "when loading plists" do
|
23
|
+
it "shoud load xcode's preferences" do
|
24
|
+
@plist = ""
|
25
|
+
@plist.stub(:value)
|
26
|
+
@xcode.stub(:prefs_plist_path){"path"}
|
27
|
+
CFPropertyList::List.stub(:new){@plist}
|
28
|
+
CFPropertyList::List.should_receive(:new).with({:file => "path"})
|
29
|
+
@xcode.prefs
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
describe "when loading xcode preferences" do
|
34
|
+
it "should recognise a custom build folder location" do
|
35
|
+
@xcode.stub(:prefs){{"IDECustomDerivedDataLocation" => "path"}}
|
36
|
+
@xcode.build_path.should eq("path")
|
37
|
+
end
|
38
|
+
|
39
|
+
it "should recognise a default build folder location" do
|
40
|
+
@xcode.stub(:prefs){{}}
|
41
|
+
Dir.stub(:pwd){"path"}
|
42
|
+
@xcode.build_path.should eq("path/Library/Developer/Xcode/DerivedData")
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
describe "when loading the info.plist" do
|
47
|
+
it "should recognise if the plist path is not set" do
|
48
|
+
@xcode.info_plist_path = nil
|
49
|
+
Yolo::Formatters::ErrorFormatter.any_instance.should_receive(:info_plist_not_found)
|
50
|
+
@xcode.info_plist
|
51
|
+
end
|
52
|
+
|
53
|
+
it "should load the info plist" do
|
54
|
+
@plist = ""
|
55
|
+
@plist.stub(:value)
|
56
|
+
CFPropertyList::List.stub(:new){@plist}
|
57
|
+
@xcode.info_plist_path = "path"
|
58
|
+
CFPropertyList::List.should_receive(:new).with({:file => "path"})
|
59
|
+
@xcode.info_plist
|
60
|
+
end
|
61
|
+
|
62
|
+
it "should load the build number from the info plist" do
|
63
|
+
@xcode.stub(:info_plist){{"CFBundleVersion" => 10}}
|
64
|
+
@xcode.build_number.should eq(10)
|
65
|
+
end
|
66
|
+
|
67
|
+
it "should load the version number from the info plist" do
|
68
|
+
@xcode.stub(:info_plist){{"CFBundleShortVersionString" => 10}}
|
69
|
+
@xcode.version_number.should eq(10)
|
70
|
+
end
|
71
|
+
end
|
72
|
+
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: yolo
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.1.
|
4
|
+
version: 1.1.12
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2013-
|
12
|
+
date: 2013-05-01 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: xcodebuild-rb
|
@@ -116,6 +116,19 @@ files:
|
|
116
116
|
- lib/yolo/tools/ios.rb
|
117
117
|
- lib/yolo/tools.rb
|
118
118
|
- lib/yolo.rb
|
119
|
+
- spec/config/settings_spec.rb
|
120
|
+
- spec/deployment/base_deployer_spec.rb
|
121
|
+
- spec/deployment/ota_spec.rb
|
122
|
+
- spec/deployment/test_flight_spec.rb
|
123
|
+
- spec/notify/email_spec.rb
|
124
|
+
- spec/notify/ios/ota_email_spec.rb
|
125
|
+
- spec/spec_helper.rb
|
126
|
+
- spec/tools/git_spec.rb
|
127
|
+
- spec/tools/ios/calabash_spec.rb
|
128
|
+
- spec/tools/ios/coverage_spec.rb
|
129
|
+
- spec/tools/ios/ipa_spec.rb
|
130
|
+
- spec/tools/ios/release_notes_spec.rb
|
131
|
+
- spec/tools/ios/xcode_spec.rb
|
119
132
|
- README.md
|
120
133
|
homepage: http://rubygems.org/gems/yolo
|
121
134
|
licenses: []
|
@@ -137,7 +150,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
137
150
|
version: '0'
|
138
151
|
requirements: []
|
139
152
|
rubyforge_project:
|
140
|
-
rubygems_version: 1.8.
|
153
|
+
rubygems_version: 1.8.23
|
141
154
|
signing_key:
|
142
155
|
specification_version: 3
|
143
156
|
summary: YOLO!
|