TestFlightExporter 0.2.1 → 0.2.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +12 -0
- data/bin/tfexporter +15 -0
- data/lib/deploygate_uploader.rb +91 -0
- data/lib/testflight_exporter.rb +1 -1
- data/lib/testflight_exporter/version.rb +1 -1
- metadata +3 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 58e49943cdcd3495dd08f0e3bafbd05dfe93e1b5
|
4
|
+
data.tar.gz: 0cbc459eba012e0c4d6e65d67664edc1d29c122a
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: f9e6c5d02bbdb97978968a3517c5cdb6490ae5598d4651f14be155ef84ba44257a769bf2aa41a55ea8fe9b59109e3558bc2806ab7c790ca7725342a6cd4b1caa
|
7
|
+
data.tar.gz: 114d0d7a42dae44298370ce615e76b36dd49815fe0df7136e93797c87a6d6fdf184d198da3e5ccafa9829858170ee2477c92e91976ffdf1026ea3a9efb6ddd83
|
data/README.md
CHANGED
@@ -43,6 +43,18 @@ To get a list of available options, execute:
|
|
43
43
|
|
44
44
|
$ tfexporter hockeyapp --help
|
45
45
|
|
46
|
+
### DeployGate integration
|
47
|
+
|
48
|
+
Since version 0.2.2 TestFlight exporter supports the upload of your downloaded binaries on DeployGate platform.
|
49
|
+
Execute the following command in your terminal:
|
50
|
+
|
51
|
+
$ tfexporter deploygate --username [YOUR_USERNAME] --token [YOUR_API_TOKEN] --input [YOUR_BINARIES_PATH]
|
52
|
+
|
53
|
+
|
54
|
+
To get a list of available options, execute:
|
55
|
+
|
56
|
+
$ tfexporter deploygate --help
|
57
|
+
|
46
58
|
## How does this thing work?
|
47
59
|
|
48
60
|
TestFlight doesn't provide any API to perform such task like exporting your .ipa's. TestFlight Exporter uses [mechanize](https://github.com/sparklemotion/mechanize) to automatically find and follow the download links on the TestFlight website.
|
data/bin/tfexporter
CHANGED
@@ -7,6 +7,7 @@ require 'highline'
|
|
7
7
|
require_relative '../lib/testflight_exporter/version'
|
8
8
|
require_relative '../lib/testflight_exporter'
|
9
9
|
require_relative '../lib/hockeyapp_uploader'
|
10
|
+
require_relative '../lib/deploygate_uploader'
|
10
11
|
|
11
12
|
HighLine.track_eof = false
|
12
13
|
|
@@ -55,6 +56,20 @@ class TestFlightExporterApplication
|
|
55
56
|
end
|
56
57
|
end
|
57
58
|
|
59
|
+
command :deploygate do |c|
|
60
|
+
c.syntax = 'tfexporter deploygate'
|
61
|
+
c.description = 'Upload your binaries to DeployGate platform (API TOKEN and USERNAME required).'
|
62
|
+
c.option '--token STRING', String, 'Your DeployGate token'
|
63
|
+
c.option '--input FOLDER', String, 'Your binaries folder'
|
64
|
+
c.option '--username STRING', String, "Your deploygate username"
|
65
|
+
|
66
|
+
c.action do |args, options|
|
67
|
+
ENV['VERBOSE_MODE'] = 'true' if options.verbose
|
68
|
+
|
69
|
+
TestFlightExporter::DeployGateUploader.run(options)
|
70
|
+
end
|
71
|
+
end
|
72
|
+
|
58
73
|
default_command :help
|
59
74
|
|
60
75
|
run!
|
@@ -0,0 +1,91 @@
|
|
1
|
+
# TODO: Workaround, since deploygate.rb from shenzhen includes the code for commander
|
2
|
+
def command(_param)
|
3
|
+
end
|
4
|
+
|
5
|
+
module TestFlightExporter
|
6
|
+
|
7
|
+
class DeployGateUploader
|
8
|
+
DEPLOYGATE_URL_BASE = 'https://deploygate.com'
|
9
|
+
|
10
|
+
def self.run(params)
|
11
|
+
Helper.exit_with_error "Invalid user. Use --username to specify a valid username" if params.username.nil?
|
12
|
+
Helper.exit_with_error "Invalid API token. Use --token to specify your DeployGate API token" if params.token.nil?
|
13
|
+
Helper.exit_with_error "Invalid input folder. Use --input to specify an input folder" if params.input.nil?
|
14
|
+
|
15
|
+
username = params.username
|
16
|
+
token = params.token
|
17
|
+
directory = params.input
|
18
|
+
|
19
|
+
require 'shenzhen'
|
20
|
+
require 'shenzhen/plugins/deploygate'
|
21
|
+
|
22
|
+
|
23
|
+
Helper.log.info 'Starting with ipa upload to DeployGate... this could take some time ⏳'.green
|
24
|
+
|
25
|
+
|
26
|
+
client = Shenzhen::Plugins::DeployGate::Client.new(
|
27
|
+
token,
|
28
|
+
username
|
29
|
+
)
|
30
|
+
|
31
|
+
number_of_builds = 0
|
32
|
+
|
33
|
+
Dir.glob("#{directory}/**/*.ipa") { |filename|
|
34
|
+
|
35
|
+
Helper.log.debug "Starting with #{filename} upload to DeployGate...".magenta
|
36
|
+
|
37
|
+
notes = filename.gsub(/.ipa/,'.txt')
|
38
|
+
|
39
|
+
# Available options: https://deploygate.com/docs/api
|
40
|
+
options = nil
|
41
|
+
File.open(notes) do |file|
|
42
|
+
options = { message: File.read(file) }
|
43
|
+
end
|
44
|
+
|
45
|
+
response = client.upload_build(filename, options)
|
46
|
+
if parse_response(response)
|
47
|
+
Helper.log.debug"Public Download URL: #{@url_success}".white if @url_success
|
48
|
+
Helper.log.debug "Build successfully uploaded to DeployGate!".green
|
49
|
+
number_of_builds = number_of_builds + 1
|
50
|
+
else
|
51
|
+
Helper.exit_with_error 'Error when trying to upload ipa to DeployGate'.red
|
52
|
+
end
|
53
|
+
}
|
54
|
+
Helper.log.info "Uploaded #{number_of_builds} binaries on DeployGate platform!".blue
|
55
|
+
|
56
|
+
end
|
57
|
+
|
58
|
+
def self.parse_response(response)
|
59
|
+
if response.body && response.body.key?('error')
|
60
|
+
unless response.body['error']
|
61
|
+
res = response.body['results']
|
62
|
+
url = DEPLOYGATE_URL_BASE + res['path']
|
63
|
+
|
64
|
+
@url_success = url
|
65
|
+
else
|
66
|
+
Helper.log.error "Error uploading to DeployGate: #{response.body['message']}".red
|
67
|
+
help_message(response)
|
68
|
+
return
|
69
|
+
end
|
70
|
+
else
|
71
|
+
Helper.exit_with_error "Error uploading to DeployGate: #{response.body}".red
|
72
|
+
end
|
73
|
+
true
|
74
|
+
end
|
75
|
+
private_class_method :parse_response
|
76
|
+
|
77
|
+
def self.help_message(response)
|
78
|
+
message =
|
79
|
+
case response.body['message']
|
80
|
+
when 'you are not authenticated'
|
81
|
+
'Invalid API Token specified.'
|
82
|
+
when 'application create error: permit'
|
83
|
+
'Access denied: May be trying to upload to wrong user or updating app you join as a tester?'
|
84
|
+
when 'application create error: limit'
|
85
|
+
'Plan limit: You have reached to the limit of current plan or your plan was expired.'
|
86
|
+
end
|
87
|
+
Helper.log.error message.red if message
|
88
|
+
end
|
89
|
+
private_class_method :help_message
|
90
|
+
end
|
91
|
+
end
|
data/lib/testflight_exporter.rb
CHANGED
@@ -20,7 +20,7 @@ module TestFlightExporter
|
|
20
20
|
@username = options.username
|
21
21
|
@password = options.password
|
22
22
|
@team = options.team
|
23
|
-
@path = options.
|
23
|
+
@path = options.output
|
24
24
|
@max = options.max
|
25
25
|
@username = ask("Enter your TestFlight username: ") { |q| q.echo = true } if @username.nil?
|
26
26
|
@password = ask("Enter your TestFlight password: ") { |q| q.echo = "*" } if @password.nil?
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: TestFlightExporter
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.2.
|
4
|
+
version: 0.2.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Fabio Milano
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-02-
|
11
|
+
date: 2015-02-21 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: mechanize
|
@@ -123,6 +123,7 @@ files:
|
|
123
123
|
- Rakefile
|
124
124
|
- assets/tw_logo.png
|
125
125
|
- bin/tfexporter
|
126
|
+
- lib/deploygate_uploader.rb
|
126
127
|
- lib/helpers.rb
|
127
128
|
- lib/hockeyapp_uploader.rb
|
128
129
|
- lib/testflight_exporter.rb
|