terrestrial-cli 0.6.5 → 0.6.6
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/circle.yml +2 -1
- data/lib/terrestrial/cli/ignite.rb +27 -45
- data/lib/terrestrial/cli/init.rb +31 -31
- data/lib/terrestrial/cli/language_name.rb +1 -1
- data/lib/terrestrial/cli/photoshoot.rb +26 -47
- data/lib/terrestrial/cli/pull.rb +9 -1
- data/lib/terrestrial/cli/simulator_launcher.rb +135 -0
- data/lib/terrestrial/cli/unity_parser.rb +1 -0
- data/lib/terrestrial/cli/version.rb +1 -1
- data/lib/terrestrial/cli/version_checker.rb +38 -4
- data/lib/terrestrial/cli.rb +1 -0
- data/lib/terrestrial/web.rb +4 -0
- 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: fc57490459267dbe6b4c2df4e559a120027a12be
|
4
|
+
data.tar.gz: d27387494081c26bea5e60c1855af88882918eff
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 93030b56a6442be1d388838042a35cbf9cae43de63a2e8f1abbcdab21a9f4f3df24f35e7783abf6ab5850341da3a30d81fd5d31afe8954039272e78ade245c6e
|
7
|
+
data.tar.gz: c684228655afbef79bd750e03c5e810ef064935a12eb3540215b8dae1c36e59d5a88805c3e7a723f8c0393250e817c793f8cab927d886f5897a19563dbfd64a3
|
data/circle.yml
CHANGED
@@ -7,9 +7,32 @@ module Terrestrial
|
|
7
7
|
def run
|
8
8
|
Config.load!
|
9
9
|
MixpanelClient.track("cli-ignite-command")
|
10
|
-
lang = opts[:language]
|
11
|
-
scheme = opts[:scheme]
|
10
|
+
@lang = opts[:language]
|
11
|
+
@scheme = opts[:scheme]
|
12
12
|
|
13
|
+
validate_inputs!
|
14
|
+
print_progress_message
|
15
|
+
|
16
|
+
TerminalUI.show_spinner do
|
17
|
+
launcher = SimulatorLauncher.new(scheme: scheme, args: {
|
18
|
+
'AppleLanguages' => "(#{lang})",
|
19
|
+
})
|
20
|
+
|
21
|
+
launcher.run
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
private
|
26
|
+
|
27
|
+
def lang
|
28
|
+
@lang
|
29
|
+
end
|
30
|
+
|
31
|
+
def scheme
|
32
|
+
@scheme
|
33
|
+
end
|
34
|
+
|
35
|
+
def validate_inputs!
|
13
36
|
if Config[:platform] != "ios"
|
14
37
|
abort "Unfortunately launching your app in a locale via 'ignite' is only supported on iOS at this time."
|
15
38
|
end
|
@@ -17,55 +40,14 @@ module Terrestrial
|
|
17
40
|
if lang.nil? || lang.empty?
|
18
41
|
abort "Please provide a locale to launch the simulator in.\n e.g. 'terrestrial ignite es'"
|
19
42
|
end
|
43
|
+
end
|
20
44
|
|
45
|
+
def print_progress_message
|
21
46
|
if scheme
|
22
47
|
puts "Starting simulator in locale \"#{lang}\" with scheme \"#{scheme}\"..."
|
23
48
|
else
|
24
49
|
puts "Starting simulator in locale \"#{lang}\"..."
|
25
50
|
end
|
26
|
-
|
27
|
-
TerminalUI.show_spinner do
|
28
|
-
ensure_var_folder_exists
|
29
|
-
|
30
|
-
workspace = Dir["#{Config[:directory]}/*.xcworkspace"][0]
|
31
|
-
project = Dir["#{Config[:directory]}/*.xcodeproj"][0]
|
32
|
-
|
33
|
-
# Kill simulator and
|
34
|
-
system("killall \"Simulator\" &> /dev/null")
|
35
|
-
`rm -rf #{WORKING_DIR}`
|
36
|
-
|
37
|
-
if workspace
|
38
|
-
# If a workspace exists we want to build it instead of the project.
|
39
|
-
# We assume the scheme we want to use is simply the application name
|
40
|
-
app_name = File.basename(workspace).split(".").first
|
41
|
-
`xcodebuild -workspace "#{workspace}" -destination 'platform=iOS Simulator,name=iPhone 6s' -scheme #{scheme || app_name} -configuration Debug clean build CONFIGURATION_BUILD_DIR=#{WORKING_DIR}`
|
42
|
-
else
|
43
|
-
app_name = File.basename(project).split(".").first
|
44
|
-
`xcodebuild -project "#{project}" -destination 'platform=iOS Simulator,name=iPhone 6s' -scheme #{scheme || app_name} -configuration Debug clean build CONFIGURATION_BUILD_DIR=#{WORKING_DIR}`
|
45
|
-
end
|
46
|
-
`open /Applications/Xcode.app/Contents/Developer/Applications/Simulator.app`
|
47
|
-
|
48
|
-
# Here we literally sleep until the Simulator has been booted
|
49
|
-
wait_until_booted = %{
|
50
|
-
count=`xcrun simctl list | grep Booted | wc -l | sed -e 's/ //g'`
|
51
|
-
while [ $count -lt 1 ]
|
52
|
-
do
|
53
|
-
sleep 1
|
54
|
-
count=`xcrun simctl list | grep Booted | wc -l | sed -e 's/ //g'`
|
55
|
-
done
|
56
|
-
}
|
57
|
-
`#{wait_until_booted}`
|
58
|
-
|
59
|
-
# Here we magically find the bundle identifier of the app
|
60
|
-
command = "defaults read \"#{Dir[WORKING_DIR + '/*.app/Info.plist'].first}\" CFBundleIdentifier"
|
61
|
-
bundle_name = `#{command}`.chop
|
62
|
-
|
63
|
-
# Reinstall the app,
|
64
|
-
# Run it with the locale we want
|
65
|
-
`xcrun simctl uninstall booted #{bundle_name}`
|
66
|
-
`xcrun simctl install booted "#{Dir[WORKING_DIR + "/" + app_name + ".app"].first}"`
|
67
|
-
`xcrun simctl launch booted #{bundle_name} --args -AppleLanguages \\(#{lang}\\)`
|
68
|
-
end
|
69
51
|
end
|
70
52
|
|
71
53
|
def ensure_var_folder_exists
|
data/lib/terrestrial/cli/init.rb
CHANGED
@@ -8,48 +8,48 @@ module Terrestrial
|
|
8
8
|
Config.load!({}, project: false)
|
9
9
|
|
10
10
|
if Config.project_config_exist?
|
11
|
-
abort
|
11
|
+
abort 'Looks like there already exists a project in this directory. Are you in the correct folder?'
|
12
12
|
end
|
13
13
|
|
14
14
|
check_arguments
|
15
15
|
detect_platform
|
16
16
|
|
17
|
-
puts
|
18
|
-
puts
|
17
|
+
puts '-- Terrestrial Initializing'
|
18
|
+
puts 'Adding new app! Searching for localization files...'
|
19
19
|
|
20
20
|
TerminalUI.show_spinner do
|
21
21
|
# Otherwise the whole process is too quick for the eye
|
22
22
|
sleep 2 unless Config.testing?
|
23
23
|
end
|
24
|
-
puts
|
24
|
+
puts ''
|
25
25
|
|
26
26
|
select_translation_files
|
27
27
|
create_app_in_web
|
28
28
|
|
29
29
|
if @response.success?
|
30
30
|
update_config
|
31
|
-
MixpanelClient.track(
|
31
|
+
MixpanelClient.track('cli-init-command')
|
32
32
|
|
33
|
-
puts
|
34
|
-
puts
|
35
|
-
puts
|
36
|
-
puts
|
33
|
+
puts '-- Success!'
|
34
|
+
puts 'App platform added to project! You can view your app at https://mission.terrestrial.io/'
|
35
|
+
puts ''
|
36
|
+
puts '-- What to do next?'
|
37
37
|
|
38
38
|
if @translation_files.any?
|
39
|
-
puts
|
40
|
-
puts
|
41
|
-
elsif @translation_files.none? && @platform ==
|
42
|
-
puts
|
43
|
-
puts
|
44
|
-
elsif @translation_files.none? && @platform ==
|
45
|
-
puts
|
46
|
-
puts
|
47
|
-
puts
|
39
|
+
puts 'Run "terrestrial scan" to see which strings Terrestrial is currently tracking.'
|
40
|
+
puts 'When you\'re ready to upload your strings for translation, run "terrestrial push"!'
|
41
|
+
elsif @translation_files.none? && @platform == 'ios'
|
42
|
+
puts 'To get started localizing your app, run "terrestrial flight".'
|
43
|
+
puts 'Terrestrial will scan your code for strings, and generate the necessary localization files.'
|
44
|
+
elsif @translation_files.none? && @platform == 'android'
|
45
|
+
puts 'Looks like Terrestrial does not know which strings.xml files to track.'
|
46
|
+
puts 'To continue, add your base language strings.xml file to terrestrial.yml.'
|
47
|
+
puts 'When you\'re ready, run "terrestrial scan" to see which strings Terrestrial is tracking, and "terrestrial push" to upload.'
|
48
48
|
end
|
49
|
-
puts
|
50
|
-
puts
|
49
|
+
puts ''
|
50
|
+
puts 'For more information, see http://docs.terrestrial.io or jump on Slack at https://terrestrial-slack.herokuapp.com/ if you have any questions.'
|
51
51
|
else
|
52
|
-
puts
|
52
|
+
puts 'Oh snap. There was an error initializing your project.'
|
53
53
|
puts @response.body.inspect
|
54
54
|
abort
|
55
55
|
end
|
@@ -70,16 +70,16 @@ module Terrestrial
|
|
70
70
|
puts "Tracking #{@translation_files.count} files!"
|
71
71
|
end
|
72
72
|
else
|
73
|
-
puts
|
73
|
+
puts 'Could not find any localization files to track.'
|
74
74
|
end
|
75
75
|
end
|
76
76
|
|
77
77
|
def find_platform_translation_files
|
78
|
-
if @platform ==
|
79
|
-
Dir[Config[:directory] +
|
80
|
-
elsif @platform ==
|
81
|
-
Dir[Config[:directory] +
|
82
|
-
elsif @platform ==
|
78
|
+
if @platform == 'ios'
|
79
|
+
Dir[Config[:directory] + '/**/*.strings'].map {|f| relative_path(f) }
|
80
|
+
elsif @platform == 'android'
|
81
|
+
Dir[Config[:directory] + '/**/*/res/values/strings.xml'].map {|f| relative_path(f) }
|
82
|
+
elsif @platform == 'unity'
|
83
83
|
[] # Not tracking files now
|
84
84
|
else
|
85
85
|
raise "Unknown platform #{@platform}"
|
@@ -88,7 +88,7 @@ module Terrestrial
|
|
88
88
|
|
89
89
|
def update_config
|
90
90
|
Terrestrial::Config.load({
|
91
|
-
app_id: @response.body[
|
91
|
+
app_id: @response.body['data']['id'],
|
92
92
|
project_id: @project_id,
|
93
93
|
platform: @platform,
|
94
94
|
api_key: @api_key,
|
@@ -106,11 +106,11 @@ module Terrestrial
|
|
106
106
|
|
107
107
|
def check_arguments
|
108
108
|
@api_key = opts[:api_key] || Config[:api_key] ||
|
109
|
-
abort(
|
109
|
+
abort('No api key provided. You can find your API key at https://mission.terrestrial.io/.')
|
110
110
|
|
111
111
|
@project_id = opts.fetch(:project_id) { abort(
|
112
|
-
|
113
|
-
|
112
|
+
'No project ID provided. Terrestrial needs to know which project this app belongs to.\n' +
|
113
|
+
'Visit https://mission.terrestrial.io to find your project ID.'
|
114
114
|
)}
|
115
115
|
end
|
116
116
|
|
@@ -2,66 +2,45 @@ module Terrestrial
|
|
2
2
|
module Cli
|
3
3
|
class Photoshoot < Command
|
4
4
|
|
5
|
-
WORKING_DIR = '/usr/local/var/terrestrial'
|
6
|
-
|
7
5
|
def run
|
8
6
|
Config.load!
|
9
7
|
MixpanelClient.track("cli-photoshoot-command")
|
10
|
-
scheme = opts[:scheme]
|
8
|
+
@scheme = opts[:scheme]
|
9
|
+
|
10
|
+
validate_inputs!
|
11
|
+
print_progress_message
|
12
|
+
|
13
|
+
TerminalUI.show_spinner do
|
14
|
+
launcher = SimulatorLauncher.new(scheme: scheme, args: {
|
15
|
+
'TerrestrialScreenShotMode' => true,
|
16
|
+
'TerrestrialAPIToken' => Config[:api_key],
|
17
|
+
'TerrestrialAppId' => Config[:app_id],
|
18
|
+
'TerrestrialProjectId' => Config[:project_id],
|
19
|
+
'TerrestrialURL' => Config[:api_url]
|
20
|
+
})
|
21
|
+
|
22
|
+
launcher.run
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
private
|
11
27
|
|
28
|
+
def scheme
|
29
|
+
@scheme
|
30
|
+
end
|
31
|
+
|
32
|
+
def validate_inputs!
|
12
33
|
if Config[:platform] != "ios"
|
13
34
|
abort "Unfortunately photoshoot mode is only supported on iOS at this time."
|
14
35
|
end
|
36
|
+
end
|
15
37
|
|
38
|
+
def print_progress_message
|
16
39
|
if scheme
|
17
40
|
puts "Starting simulator in photoshoot mode with scheme \"#{scheme}\"..."
|
18
41
|
else
|
19
42
|
puts "Starting simulator in photoshoot mode..."
|
20
43
|
end
|
21
|
-
ensure_var_folder_exists
|
22
|
-
|
23
|
-
workspace = Dir["#{Config[:directory]}/*.xcworkspace"][0]
|
24
|
-
project = Dir["#{Config[:directory]}/*.xcodeproj"][0]
|
25
|
-
|
26
|
-
# Kill simulator and
|
27
|
-
system("killall \"Simulator\" &> /dev/null")
|
28
|
-
`rm -rf #{WORKING_DIR}`
|
29
|
-
|
30
|
-
if workspace
|
31
|
-
# If a workspace exists we want to build it instead of the project.
|
32
|
-
# We assume the scheme we want to use is simply the application name
|
33
|
-
app_name = File.basename(workspace).split(".").first
|
34
|
-
`xcodebuild -workspace "#{workspace}" -destination 'platform=iOS Simulator,name=iPhone 6s' -scheme #{scheme || app_name} -configuration Debug clean build CONFIGURATION_BUILD_DIR=#{WORKING_DIR}`
|
35
|
-
else
|
36
|
-
app_name = File.basename(project).split(".").first
|
37
|
-
`xcodebuild -project "#{project}" -destination 'platform=iOS Simulator,name=iPhone 6s' -scheme #{scheme || app_name} -configuration Debug clean build CONFIGURATION_BUILD_DIR=#{WORKING_DIR}`
|
38
|
-
end
|
39
|
-
`open /Applications/Xcode.app/Contents/Developer/Applications/Simulator.app`
|
40
|
-
|
41
|
-
# Here we literally sleep until the Simulator has been booted
|
42
|
-
wait_until_booted = %{
|
43
|
-
count=`xcrun simctl list | grep Booted | wc -l | sed -e 's/ //g'`
|
44
|
-
while [ $count -lt 1 ]
|
45
|
-
do
|
46
|
-
sleep 1
|
47
|
-
count=`xcrun simctl list | grep Booted | wc -l | sed -e 's/ //g'`
|
48
|
-
done
|
49
|
-
}
|
50
|
-
`#{wait_until_booted}`
|
51
|
-
|
52
|
-
# Here we magically find the bundle identifier of the app
|
53
|
-
command = "defaults read \"#{Dir[WORKING_DIR + '/*.app/Info.plist'].first}\" CFBundleIdentifier"
|
54
|
-
bundle_name = `#{command}`.chop
|
55
|
-
|
56
|
-
# Reinstall the app,
|
57
|
-
# Run it with the locale we want
|
58
|
-
`xcrun simctl uninstall booted #{bundle_name}`
|
59
|
-
`xcrun simctl install booted "#{Dir[WORKING_DIR + "/" + app_name + ".app"].first}"`
|
60
|
-
`xcrun simctl launch booted #{bundle_name} --args -TerrestrialScreenShotMode YES -TerrestrialAPIToken "#{Config[:api_key]}" -TerrestrialAppId "#{Config[:app_id]}" -TerrestrialProjectId "#{Config[:project_id]}" -TerrestrialURL "#{Config[:api_url]}"`
|
61
|
-
end
|
62
|
-
|
63
|
-
def ensure_var_folder_exists
|
64
|
-
`mkdir -p #{WORKING_DIR}`
|
65
44
|
end
|
66
45
|
end
|
67
46
|
end
|
data/lib/terrestrial/cli/pull.rb
CHANGED
@@ -42,7 +42,7 @@ module Terrestrial
|
|
42
42
|
elsif Config[:platform] == "android"
|
43
43
|
android_translation_file_path(language)
|
44
44
|
elsif Config[:platform] == "unity"
|
45
|
-
|
45
|
+
unity_translation_file_path(language)
|
46
46
|
end
|
47
47
|
end
|
48
48
|
|
@@ -66,6 +66,14 @@ module Terrestrial
|
|
66
66
|
folder + "/strings.xml"
|
67
67
|
end
|
68
68
|
|
69
|
+
def unity_translation_file_path(language)
|
70
|
+
folder = Pathname.new(Config[:directory] + "/" + Config[:translation_files].first)
|
71
|
+
.parent
|
72
|
+
.to_s
|
73
|
+
|
74
|
+
folder + "/" + human_readable_language_name(language) + ".xml"
|
75
|
+
end
|
76
|
+
|
69
77
|
def write_translation_file(path, translations)
|
70
78
|
File.open(path, "w+") do |f|
|
71
79
|
if Config[:platform] == "ios"
|
@@ -0,0 +1,135 @@
|
|
1
|
+
module Terrestrial
|
2
|
+
module Cli
|
3
|
+
class SimulatorLauncher
|
4
|
+
|
5
|
+
WORKING_DIR = '/usr/local/var/terrestrial'
|
6
|
+
|
7
|
+
def initialize(args: nil, scheme: nil)
|
8
|
+
@scheme = scheme
|
9
|
+
@args = args
|
10
|
+
end
|
11
|
+
|
12
|
+
def run
|
13
|
+
cleanup_simulator
|
14
|
+
build_app
|
15
|
+
launch_simulator
|
16
|
+
wait_until_simulator_booted
|
17
|
+
|
18
|
+
reinstall_app
|
19
|
+
launch_app_with_args
|
20
|
+
end
|
21
|
+
|
22
|
+
private
|
23
|
+
|
24
|
+
def cleanup_simulator
|
25
|
+
ensure_var_folder_exists
|
26
|
+
|
27
|
+
system("killall \"Simulator\" &> /dev/null")
|
28
|
+
`rm -rf #{WORKING_DIR}`
|
29
|
+
end
|
30
|
+
|
31
|
+
def build_app
|
32
|
+
c = "xcodebuild #{is_workspace? ? '-workspace' : '-project' } \"#{project_path}\" " +
|
33
|
+
"-destination 'platform=iOS Simulator,name=iPhone 6s' " +
|
34
|
+
"-scheme #{scheme} " +
|
35
|
+
"-configuration Debug clean build CONFIGURATION_BUILD_DIR=#{WORKING_DIR}"
|
36
|
+
|
37
|
+
`#{c}`
|
38
|
+
end
|
39
|
+
|
40
|
+
def launch_simulator
|
41
|
+
`open /Applications/Xcode.app/Contents/Developer/Applications/Simulator.app`
|
42
|
+
end
|
43
|
+
|
44
|
+
def wait_until_simulator_booted
|
45
|
+
wait_until_booted = %{
|
46
|
+
count=`xcrun simctl list | grep Booted | wc -l | sed -e 's/ //g'`
|
47
|
+
while [ $count -lt 1 ]
|
48
|
+
do
|
49
|
+
sleep 1
|
50
|
+
count=`xcrun simctl list | grep Booted | wc -l | sed -e 's/ //g'`
|
51
|
+
done
|
52
|
+
}
|
53
|
+
`#{wait_until_booted}`
|
54
|
+
end
|
55
|
+
|
56
|
+
def reinstall_app
|
57
|
+
`xcrun simctl uninstall booted #{bundle_identifer}`
|
58
|
+
`xcrun simctl install booted "#{Dir[WORKING_DIR + "/" + (bundle_name) + ".app"].first}"`
|
59
|
+
end
|
60
|
+
|
61
|
+
def launch_app_with_args
|
62
|
+
c = "xcrun simctl launch booted #{bundle_identifer} --args " + LaunchArgsBuilder.build(args)
|
63
|
+
|
64
|
+
`#{c}`
|
65
|
+
end
|
66
|
+
|
67
|
+
def project_path
|
68
|
+
# Try to find a workspace, fall back to project, finally fail
|
69
|
+
@project_path ||= Dir["#{Config[:directory]}/*.xcworkspace"][0] ||
|
70
|
+
Dir["#{Config[:directory]}/*.xcodeproj"][0] ||
|
71
|
+
raise('Could not find workspace or project in folder')
|
72
|
+
end
|
73
|
+
|
74
|
+
def scheme
|
75
|
+
@scheme || app_name
|
76
|
+
end
|
77
|
+
|
78
|
+
def app_name
|
79
|
+
@app_name ||= File.basename(project_path).split(".").first
|
80
|
+
end
|
81
|
+
|
82
|
+
def args
|
83
|
+
@args ||= {}
|
84
|
+
end
|
85
|
+
|
86
|
+
def is_workspace?
|
87
|
+
project_path.end_with?('xcworkspace')
|
88
|
+
end
|
89
|
+
|
90
|
+
def ensure_var_folder_exists
|
91
|
+
`mkdir -p #{WORKING_DIR}`
|
92
|
+
end
|
93
|
+
|
94
|
+
def bundle_identifer
|
95
|
+
# Fetch the bundle identifier from the project's Info.plist folder
|
96
|
+
@bundle_identifer ||= `defaults read \"#{Dir[WORKING_DIR + '/*.app/Info.plist'].first}\" CFBundleIdentifier`.chomp
|
97
|
+
end
|
98
|
+
|
99
|
+
def bundle_name
|
100
|
+
# Fetch the bundle display name from the project's Info.plist folder
|
101
|
+
@bundle_name ||= `defaults read \"#{Dir[WORKING_DIR + '/*.app/Info.plist'].first}\" CFBundleName`.chomp
|
102
|
+
end
|
103
|
+
end
|
104
|
+
end
|
105
|
+
end
|
106
|
+
|
107
|
+
module Terrestrial
|
108
|
+
module Cli
|
109
|
+
class SimulatorLauncher
|
110
|
+
class LaunchArgsBuilder
|
111
|
+
|
112
|
+
def self.build(args)
|
113
|
+
result = []
|
114
|
+
|
115
|
+
args.each do |key, value|
|
116
|
+
result << "-#{key}"
|
117
|
+
result << build_value(value)
|
118
|
+
end
|
119
|
+
|
120
|
+
result.join(" ")
|
121
|
+
end
|
122
|
+
|
123
|
+
def self.build_value(value)
|
124
|
+
if value.class == TrueClass
|
125
|
+
'YES'
|
126
|
+
elsif value.class == FalseClass
|
127
|
+
'NO'
|
128
|
+
else
|
129
|
+
"\"#{value}\""
|
130
|
+
end
|
131
|
+
end
|
132
|
+
end
|
133
|
+
end
|
134
|
+
end
|
135
|
+
end
|
@@ -1,23 +1,57 @@
|
|
1
1
|
require 'json'
|
2
|
+
require 'net/http'
|
3
|
+
require 'uri'
|
2
4
|
|
3
5
|
module Terrestrial
|
4
6
|
module Cli
|
5
7
|
class VersionChecker
|
6
8
|
|
7
|
-
URL = 'https://api.github.com/repos/terrestrial-io/terrestrial-cli/releases/latest'
|
9
|
+
URL = URI('https://api.github.com/repos/terrestrial-io/terrestrial-cli/releases/latest')
|
8
10
|
|
9
11
|
def self.run
|
10
|
-
|
12
|
+
http = Net::HTTP.new(URL.host, URL.port)
|
13
|
+
http.read_timeout = 3
|
14
|
+
http.open_timeout = 3
|
15
|
+
|
16
|
+
response = http.start() {|client|
|
17
|
+
client.get(URL.path)
|
18
|
+
}
|
19
|
+
|
11
20
|
json = JSON.load(response.body)
|
12
21
|
|
13
22
|
# Ignore the "v" in "v1.1.1"
|
14
|
-
|
23
|
+
begin
|
24
|
+
version = json["tag_name"][1..-1]
|
25
|
+
rescue NoMethodError => e
|
26
|
+
# Github ratelimiting will change the JSON response.
|
27
|
+
# Keep calm and carry on.
|
28
|
+
|
29
|
+
version = Terrestrial::Cli::VERSION
|
30
|
+
end
|
15
31
|
|
16
|
-
if version
|
32
|
+
if higher_version?(version, Terrestrial::Cli::VERSION)
|
17
33
|
puts "There is an update for Terrestrial: #{version} (your version: #{Terrestrial::Cli::VERSION})"
|
18
34
|
puts "Run 'gem update terrestrial-cli' to update."
|
19
35
|
puts ""
|
20
36
|
end
|
37
|
+
rescue JSON::ParserError => e
|
38
|
+
# Don't worry about JSON parsing errors - just carry on
|
39
|
+
rescue SocketError, Timeout::Error, Errno::EINVAL, Errno::ECONNRESET, EOFError,
|
40
|
+
Net::HTTPBadResponse, Net::HTTPHeaderSyntaxError, Net::ProtocolError => e
|
41
|
+
# Don't worry about Net HTTP errors - just carry on
|
42
|
+
end
|
43
|
+
|
44
|
+
def self.higher_version?(v1, v2)
|
45
|
+
# Is v1 a higher semantic versioning number than v2?
|
46
|
+
v1 = v1.split('.').reject {|i| i.to_i.to_s != i }.map(&:to_i)
|
47
|
+
v2 = v2.split('.').reject {|i| i.to_i.to_s != i }.map(&:to_i)
|
48
|
+
|
49
|
+
v1.each_with_index do |e, i|
|
50
|
+
if e > v2[i]
|
51
|
+
return true
|
52
|
+
end
|
53
|
+
end
|
54
|
+
false
|
21
55
|
end
|
22
56
|
end
|
23
57
|
end
|
data/lib/terrestrial/cli.rb
CHANGED
@@ -5,6 +5,7 @@ require "terrestrial/cli/scan"
|
|
5
5
|
require "terrestrial/cli/ignite"
|
6
6
|
require "terrestrial/cli/push"
|
7
7
|
require "terrestrial/cli/pull"
|
8
|
+
require "terrestrial/cli/simulator_launcher"
|
8
9
|
require "terrestrial/cli/photoshoot"
|
9
10
|
require "terrestrial/cli/version_checker"
|
10
11
|
require "terrestrial/cli/version"
|
data/lib/terrestrial/web.rb
CHANGED
@@ -52,6 +52,8 @@ module Terrestrial
|
|
52
52
|
request["AUTHENTICATE"] = @token
|
53
53
|
|
54
54
|
Response.new(http.request(request))
|
55
|
+
rescue Errno::ECONNREFUSED, SocketError
|
56
|
+
abort 'Unable to connect to Terrestrial Mission Control. Are you connected to the internet?'
|
55
57
|
end
|
56
58
|
|
57
59
|
def get(path)
|
@@ -63,6 +65,8 @@ module Terrestrial
|
|
63
65
|
request["AUTHENTICATE"] = @token
|
64
66
|
|
65
67
|
Response.new(http.request(request))
|
68
|
+
rescue Errno::ECONNREFUSED, SocketError
|
69
|
+
abort 'Unable to connect to Terrestrial Mission Control. Are you connected to the internet?'
|
66
70
|
end
|
67
71
|
|
68
72
|
def base_url
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: terrestrial-cli
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.6.
|
4
|
+
version: 0.6.6
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Niklas Begley
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2016-
|
11
|
+
date: 2016-04-06 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: terminal-table
|
@@ -153,6 +153,7 @@ files:
|
|
153
153
|
- lib/terrestrial/cli/pull/processes_translations.rb
|
154
154
|
- lib/terrestrial/cli/push.rb
|
155
155
|
- lib/terrestrial/cli/scan.rb
|
156
|
+
- lib/terrestrial/cli/simulator_launcher.rb
|
156
157
|
- lib/terrestrial/cli/string_registry.rb
|
157
158
|
- lib/terrestrial/cli/terminal_ui.rb
|
158
159
|
- lib/terrestrial/cli/unity_formatter.rb
|