yolo 1.3.5 → 1.3.6
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/README.md +1 -1
- data/lib/yolo/deployment/test_flight.rb +29 -3
- data/lib/yolo/tasks/ios/release.rb +31 -0
- data/spec/deployment/test_flight_spec.rb +15 -11
- data/spec/tasks/ios/release_spec.rb +25 -0
- metadata +12 -23
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: e0da37b6adffca283ebb6a6803aef9d2597c1d27
|
4
|
+
data.tar.gz: c94d40d0f05cbc2af77ef2e201e72eccad46934d
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 371989a66dc466306acb36a6221defcf6f5fe3ae215255782feb08b4ebb0c25567d4fc52e61ea1a25f49aef437c36b676b668dd9acb95d07ec425962e343d995
|
7
|
+
data.tar.gz: 64ed3c0ebba731fbbf991092bdd093cf573700a9da4761fac5a6c3de09236df30f3cc751754aafcf8fb88414e7b8dddee1b071d56618fd4fdfefe4a74493786b
|
data/README.md
CHANGED
@@ -2,7 +2,7 @@ yolo
|
|
2
2
|
====
|
3
3
|
|
4
4
|
[![Coverage Status](https://coveralls.io/repos/alexfish/yolo/badge.png)](https://coveralls.io/r/alexfish/yolo)
|
5
|
-
[![Build Status](https://travis-ci.org/alexfish/yolo.png)](https://travis-ci.org/
|
5
|
+
[![Build Status](https://travis-ci.org/alexfish/yolo.png)](https://travis-ci.org/alexfish/yolo)
|
6
6
|
[![Gem Version](https://badge.fury.io/rb/yolo.png)](http://badge.fury.io/rb/yolo)
|
7
7
|
|
8
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.
|
@@ -1,3 +1,5 @@
|
|
1
|
+
require "zip/zip"
|
2
|
+
|
1
3
|
module Yolo
|
2
4
|
module Deployment
|
3
5
|
|
@@ -20,7 +22,9 @@ module Yolo
|
|
20
22
|
@progress_formatter = Yolo::Formatters::ProgressFormatter.new
|
21
23
|
@progress_formatter.deploying_ipa(package_path)
|
22
24
|
|
23
|
-
|
25
|
+
dsym_zip_path = generate_dsym_zip(package_path)
|
26
|
+
|
27
|
+
IO.popen(curl_string(package_path, dsym_zip_path, opts)) do |io|
|
24
28
|
begin
|
25
29
|
while line = io.readline
|
26
30
|
response << line
|
@@ -122,19 +126,41 @@ module Yolo
|
|
122
126
|
notes
|
123
127
|
end
|
124
128
|
|
129
|
+
#
|
130
|
+
# Generates a zip file containing the dsym folder.
|
131
|
+
# The zip file is uploaded to test flight to help with debugging
|
132
|
+
# @param package_path The path to the package
|
133
|
+
#
|
134
|
+
# @return [String] The dSYM zip file location
|
135
|
+
def generate_dsym_zip(package_path)
|
136
|
+
dsym_path = package_path.sub(%r[\.ipa$],'.app.dSYM')
|
137
|
+
|
138
|
+
dsym_zip = File.path(dsym_path) + ".zip"
|
139
|
+
FileUtils.rm dsym_zip, :force => true
|
140
|
+
|
141
|
+
Zip::ZipFile.open(dsym_zip, 'w') do |zipfile|
|
142
|
+
Dir["#{dsym_path}/**/**"].reject{|f|f==dsym_zip}.each do |file|
|
143
|
+
zipfile.add(file.sub(dsym_path+'/',''),file)
|
144
|
+
end
|
145
|
+
return dsym_zip
|
146
|
+
end
|
147
|
+
|
148
|
+
end
|
149
|
+
|
125
150
|
#
|
126
151
|
# Generates the CURL command string for test flight distribution
|
127
152
|
# @param package_path The path to the package
|
128
153
|
# @param opts [Hash] The options array
|
129
154
|
#
|
130
155
|
# @return [String] The CURL command
|
131
|
-
def curl_string(package_path, opts)
|
156
|
+
def curl_string(package_path, dsym_zip_path, opts)
|
132
157
|
string = "curl http://testflightapp.com/api/builds.json -X POST -# "
|
133
158
|
string = string + "-F file=@#{package_path} "
|
159
|
+
string = string + "-F dsym=@#{dsym_zip_path} "
|
134
160
|
string = string + "-F api_token='#{api_token}' " if api_token.length > 0
|
135
161
|
string = string + "-F team_token='#{team_token}' " if team_token.length > 0
|
136
162
|
string = string + "-F notes='#{notes}' " if notes.length > 0
|
137
|
-
string = string + "-F notify=#{notify(opts)}" if opts
|
163
|
+
string = string + "-F notify=#{notify(opts)} " if opts
|
138
164
|
string = string + "-F distribution_lists=#{distribution_lists(opts)}" if opts and distribution_lists(opts).length > 0
|
139
165
|
string
|
140
166
|
end
|
@@ -32,6 +32,37 @@ module Yolo
|
|
32
32
|
super
|
33
33
|
end
|
34
34
|
|
35
|
+
#
|
36
|
+
# Returns the release class's mail_to attribute,
|
37
|
+
# if no attribute is set then check for the config env var
|
38
|
+
#
|
39
|
+
# @return The release class's mail_to attribute
|
40
|
+
def mail_to
|
41
|
+
mail_to = @mail_to
|
42
|
+
|
43
|
+
if !mail_to
|
44
|
+
mail_to = ENV['YOLO_RELEASE_MAIL_TO']
|
45
|
+
mail_to = mail_to.split(",")
|
46
|
+
end
|
47
|
+
|
48
|
+
return mail_to
|
49
|
+
end
|
50
|
+
|
51
|
+
#
|
52
|
+
# Returns the release class's configuration attribute,
|
53
|
+
# if no attribute is set then check for the config env var
|
54
|
+
#
|
55
|
+
# @return The release class's configuration attribute
|
56
|
+
def configuration
|
57
|
+
config = @configuration
|
58
|
+
|
59
|
+
if !config
|
60
|
+
config = ENV['YOLO_RELEASE_CONFIG']
|
61
|
+
end
|
62
|
+
|
63
|
+
return config
|
64
|
+
end
|
65
|
+
|
35
66
|
#
|
36
67
|
# Uses Xcode to find the full path to generated app file
|
37
68
|
#
|
@@ -109,47 +109,51 @@ describe Yolo::Deployment::TestFlight do
|
|
109
109
|
end
|
110
110
|
|
111
111
|
it "should use curl" do
|
112
|
-
@tf.instance_eval{curl_string("test", nil)}.should match(/curl/)
|
112
|
+
@tf.instance_eval{curl_string("test", "testdsym", nil)}.should match(/curl/)
|
113
113
|
end
|
114
114
|
|
115
115
|
it "should set the correct URL" do
|
116
|
-
@tf.instance_eval{curl_string("test", nil)}.should match(/http:\/\/testflightapp.com\/api\/builds.json/)
|
116
|
+
@tf.instance_eval{curl_string("test", "testdsym", nil)}.should match(/http:\/\/testflightapp.com\/api\/builds.json/)
|
117
117
|
end
|
118
118
|
|
119
119
|
it "should be a post request" do
|
120
|
-
@tf.instance_eval{curl_string("test", nil)}.should match(/-X POST -#/)
|
120
|
+
@tf.instance_eval{curl_string("test", "testdsym", nil)}.should match(/-X POST -#/)
|
121
121
|
end
|
122
122
|
|
123
123
|
it "should set the file path" do
|
124
|
-
@tf.instance_eval{curl_string("test", nil)}.should match(/-F file=@test/)
|
124
|
+
@tf.instance_eval{curl_string("test", "testdsym", nil)}.should match(/-F file=@test/)
|
125
|
+
end
|
126
|
+
|
127
|
+
it "should set dsym zip path" do
|
128
|
+
@tf.instance_eval{curl_string("test", "testdsym", nil)}.should match(/-F dsym=@testdsym/)
|
125
129
|
end
|
126
130
|
|
127
131
|
it "should set the api token" do
|
128
|
-
@tf.instance_eval{curl_string("test", nil)}.should match(/-F api_token='apitoken'/)
|
132
|
+
@tf.instance_eval{curl_string("test", "testdsym", nil)}.should match(/-F api_token='apitoken'/)
|
129
133
|
end
|
130
134
|
|
131
135
|
it "should set the team token" do
|
132
|
-
@tf.instance_eval{curl_string("test", nil)}.should match(/-F team_token='teamtoken'/)
|
136
|
+
@tf.instance_eval{curl_string("test", "testdsym", nil)}.should match(/-F team_token='teamtoken'/)
|
133
137
|
end
|
134
138
|
|
135
139
|
it "should set the notes" do
|
136
|
-
@tf.instance_eval{curl_string("test", nil)}.should match(/-F notes='notes'/)
|
140
|
+
@tf.instance_eval{curl_string("test", "testdsym", nil)}.should match(/-F notes='notes'/)
|
137
141
|
end
|
138
142
|
|
139
143
|
it "should set the notify string" do
|
140
|
-
@tf.instance_eval{curl_string("test", {})}.should match(/-F notify=notify/)
|
144
|
+
@tf.instance_eval{curl_string("test", "testdsym", {})}.should match(/-F notify=notify/)
|
141
145
|
end
|
142
146
|
|
143
147
|
it "should set the distribution lists" do
|
144
|
-
@tf.instance_eval{curl_string("test", {})}.should match(/-F distribution_lists=list/)
|
148
|
+
@tf.instance_eval{curl_string("test", "testdsym", {})}.should match(/-F distribution_lists=list/)
|
145
149
|
end
|
146
150
|
|
147
151
|
it "should not set notify with no options" do
|
148
|
-
@tf.instance_eval{curl_string("test", nil)}.should_not match(/-F notify=notify/)
|
152
|
+
@tf.instance_eval{curl_string("test", "testdsym", nil)}.should_not match(/-F notify=notify/)
|
149
153
|
end
|
150
154
|
|
151
155
|
it "should not set distribution lists with no options" do
|
152
|
-
@tf.instance_eval{curl_string("test", nil)}.should_not match(/-F distribution_lists=list/)
|
156
|
+
@tf.instance_eval{curl_string("test", "testdsym", nil)}.should_not match(/-F distribution_lists=list/)
|
153
157
|
end
|
154
158
|
end
|
155
159
|
end
|
@@ -185,5 +185,30 @@ describe Yolo::Tasks::Ios::Release do
|
|
185
185
|
})
|
186
186
|
@release.deploy("")
|
187
187
|
end
|
188
|
+
|
189
|
+
it "should use the config env var if no config is set" do
|
190
|
+
config = "TEST_CONFIG"
|
191
|
+
ENV['YOLO_RELEASE_CONFIG'] = config
|
192
|
+
@release.configuration.should eq(config)
|
193
|
+
end
|
194
|
+
|
195
|
+
it "should use the config if it is set" do
|
196
|
+
config = "TEST_CONFIG"
|
197
|
+
@release.configuration = config
|
198
|
+
@release.configuration.should eq(config)
|
199
|
+
end
|
200
|
+
|
201
|
+
it "should use the mail_to env var if no config is set" do
|
202
|
+
mail_to = "TEST_MAIL_TO"
|
203
|
+
ENV['YOLO_RELEASE_MAIL_TO'] = mail_to
|
204
|
+
@release.mail_to.should eq([mail_to])
|
205
|
+
end
|
206
|
+
|
207
|
+
it "should use the mail_to if it is set" do
|
208
|
+
mail_to = "TEST_MAIL_TO"
|
209
|
+
@release.mail_to = mail_to
|
210
|
+
@release.mail_to.should eq(mail_to)
|
211
|
+
end
|
212
|
+
|
188
213
|
end
|
189
214
|
end
|
metadata
CHANGED
@@ -1,20 +1,18 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: yolo
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.3.
|
5
|
-
prerelease:
|
4
|
+
version: 1.3.6
|
6
5
|
platform: ruby
|
7
6
|
authors:
|
8
7
|
- Alex Fish
|
9
8
|
autorequire:
|
10
9
|
bindir: bin
|
11
10
|
cert_chain: []
|
12
|
-
date: 2014-
|
11
|
+
date: 2014-05-02 00:00:00.000000000 Z
|
13
12
|
dependencies:
|
14
13
|
- !ruby/object:Gem::Dependency
|
15
14
|
name: xcodebuild-rb
|
16
15
|
requirement: !ruby/object:Gem::Requirement
|
17
|
-
none: false
|
18
16
|
requirements:
|
19
17
|
- - '='
|
20
18
|
- !ruby/object:Gem::Version
|
@@ -22,7 +20,6 @@ dependencies:
|
|
22
20
|
type: :runtime
|
23
21
|
prerelease: false
|
24
22
|
version_requirements: !ruby/object:Gem::Requirement
|
25
|
-
none: false
|
26
23
|
requirements:
|
27
24
|
- - '='
|
28
25
|
- !ruby/object:Gem::Version
|
@@ -30,7 +27,6 @@ dependencies:
|
|
30
27
|
- !ruby/object:Gem::Dependency
|
31
28
|
name: ocunit2junit
|
32
29
|
requirement: !ruby/object:Gem::Requirement
|
33
|
-
none: false
|
34
30
|
requirements:
|
35
31
|
- - '='
|
36
32
|
- !ruby/object:Gem::Version
|
@@ -38,7 +34,6 @@ dependencies:
|
|
38
34
|
type: :runtime
|
39
35
|
prerelease: false
|
40
36
|
version_requirements: !ruby/object:Gem::Requirement
|
41
|
-
none: false
|
42
37
|
requirements:
|
43
38
|
- - '='
|
44
39
|
- !ruby/object:Gem::Version
|
@@ -46,39 +41,34 @@ dependencies:
|
|
46
41
|
- !ruby/object:Gem::Dependency
|
47
42
|
name: calabash-cucumber
|
48
43
|
requirement: !ruby/object:Gem::Requirement
|
49
|
-
none: false
|
50
44
|
requirements:
|
51
|
-
- -
|
45
|
+
- - '>='
|
52
46
|
- !ruby/object:Gem::Version
|
53
47
|
version: '0'
|
54
48
|
type: :runtime
|
55
49
|
prerelease: false
|
56
50
|
version_requirements: !ruby/object:Gem::Requirement
|
57
|
-
none: false
|
58
51
|
requirements:
|
59
|
-
- -
|
52
|
+
- - '>='
|
60
53
|
- !ruby/object:Gem::Version
|
61
54
|
version: '0'
|
62
55
|
- !ruby/object:Gem::Dependency
|
63
56
|
name: redcarpet
|
64
57
|
requirement: !ruby/object:Gem::Requirement
|
65
|
-
none: false
|
66
58
|
requirements:
|
67
|
-
- -
|
59
|
+
- - '>='
|
68
60
|
- !ruby/object:Gem::Version
|
69
61
|
version: '0'
|
70
62
|
type: :runtime
|
71
63
|
prerelease: false
|
72
64
|
version_requirements: !ruby/object:Gem::Requirement
|
73
|
-
none: false
|
74
65
|
requirements:
|
75
|
-
- -
|
66
|
+
- - '>='
|
76
67
|
- !ruby/object:Gem::Version
|
77
68
|
version: '0'
|
78
69
|
- !ruby/object:Gem::Dependency
|
79
70
|
name: rubyzip
|
80
71
|
requirement: !ruby/object:Gem::Requirement
|
81
|
-
none: false
|
82
72
|
requirements:
|
83
73
|
- - ~>
|
84
74
|
- !ruby/object:Gem::Version
|
@@ -86,7 +76,6 @@ dependencies:
|
|
86
76
|
type: :runtime
|
87
77
|
prerelease: false
|
88
78
|
version_requirements: !ruby/object:Gem::Requirement
|
89
|
-
none: false
|
90
79
|
requirements:
|
91
80
|
- - ~>
|
92
81
|
- !ruby/object:Gem::Version
|
@@ -161,26 +150,26 @@ files:
|
|
161
150
|
homepage: http://rubygems.org/gems/yolo
|
162
151
|
licenses:
|
163
152
|
- MIT
|
153
|
+
metadata: {}
|
164
154
|
post_install_message:
|
165
155
|
rdoc_options: []
|
166
156
|
require_paths:
|
167
157
|
- lib
|
168
158
|
required_ruby_version: !ruby/object:Gem::Requirement
|
169
|
-
none: false
|
170
159
|
requirements:
|
171
|
-
- -
|
160
|
+
- - '>='
|
172
161
|
- !ruby/object:Gem::Version
|
173
162
|
version: '0'
|
174
163
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
175
|
-
none: false
|
176
164
|
requirements:
|
177
|
-
- -
|
165
|
+
- - '>='
|
178
166
|
- !ruby/object:Gem::Version
|
179
167
|
version: '0'
|
180
168
|
requirements: []
|
181
169
|
rubyforge_project:
|
182
|
-
rubygems_version:
|
170
|
+
rubygems_version: 2.0.3
|
183
171
|
signing_key:
|
184
|
-
specification_version:
|
172
|
+
specification_version: 4
|
185
173
|
summary: YOLO!
|
186
174
|
test_files: []
|
175
|
+
has_rdoc:
|