run_loop 2.7.1 → 3.0.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -94,27 +94,23 @@ module RunLoop
94
94
  # @return [RunLoop::Device] A device that matches `udid_or_name`.
95
95
  # @raise [ArgumentError] If no matching device can be found.
96
96
  def self.device_with_identifier(udid_or_name, options={})
97
- if options.is_a?(RunLoop::SimControl)
98
- raise ArgumentError, %q[Support for the 'sim_control' argument has been
99
- removed (1.5.0). It has been replaced by an options hash with two keys:
100
- :simctl and :instruments. Please update your sources.))]
97
+ if options[:xcode]
98
+ RunLoop.log_warn("device_with_identifier no longer uses :xcode option")
101
99
  end
102
100
 
103
101
  default_options = {
104
102
  :simctl => RunLoop::Simctl.new,
105
103
  :instruments => RunLoop::Instruments.new,
106
- :xcode => RunLoop::Xcode.new
107
104
  }
108
105
 
109
106
  merged_options = default_options.merge(options)
110
107
 
111
108
  instruments = merged_options[:instruments]
112
109
  simctl = merged_options[:simctl]
113
- xcode = merged_options[:xcode]
114
110
 
115
111
  simulator = simctl.simulators.detect do |sim|
116
- sim.instruments_identifier(xcode) == udid_or_name ||
117
- sim.udid == udid_or_name
112
+ sim.udid == udid_or_name ||
113
+ sim.simulator_instruments_identifier_same_as?(udid_or_name)
118
114
  end
119
115
 
120
116
  return simulator if !simulator.nil?
@@ -129,6 +125,22 @@ removed (1.5.0). It has been replaced by an options hash with two keys:
129
125
  raise ArgumentError, "Could not find a device with a UDID or name matching '#{udid_or_name}'"
130
126
  end
131
127
 
128
+ # iPhone 8 10.3.1 is the same as iPhone 10.3 when comparing identifiers
129
+ def simulator_instruments_identifier_same_as?(identifier)
130
+ instruments_id = instruments_identifier
131
+ return true if instruments_id == identifier
132
+
133
+ model_part = identifier.split(" (").first
134
+ return false if model_part != name
135
+
136
+ version_part = RunLoop::Version.new(identifier[RunLoop::Regex::VERSION_REGEX])
137
+
138
+ return false if version.major != version_part.major
139
+ return false if version.minor != version_part.minor
140
+
141
+ true
142
+ end
143
+
132
144
  # @!visibility private
133
145
  #
134
146
  # Please don't call this method. It is for internal use only. The behavior
@@ -187,21 +199,21 @@ removed (1.5.0). It has been replaced by an options hash with two keys:
187
199
  # @return [String] An instruments-ready device identifier.
188
200
  # @raise [RuntimeError] If trying to obtain a instruments-ready identifier
189
201
  # for a simulator when Xcode < 6.
190
- def instruments_identifier(xcode)
202
+ def instruments_identifier(xcode=nil)
203
+ if xcode
204
+ RunLoop.deprecated("3.0.0",
205
+ "instruments_identifier no longer takes an argument")
206
+ end
191
207
  if physical_device?
192
208
  udid
193
209
  else
194
- if version == RunLoop::Version.new('7.0.3')
195
- version_part = version.to_s
210
+ if version.patch
211
+ version_part = "#{version.major}.#{version.minor}.#{version.patch}"
196
212
  else
197
213
  version_part = "#{version.major}.#{version.minor}"
198
214
  end
199
215
 
200
- if xcode.version_gte_7?
201
- "#{name} (#{version_part})"
202
- else
203
- "#{name} (#{version_part} Simulator)"
204
- end
216
+ "#{name} (#{version_part})"
205
217
  end
206
218
  end
207
219
 
@@ -392,6 +404,7 @@ version: #{version}
392
404
  RunLoop.log_debug("Waited for #{elapsed} seconds for simulator to stabilize")
393
405
  else
394
406
  RunLoop.log_debug("Timed out after #{timeout} seconds waiting for simulator to stabilize")
407
+ RunLoop.log_debug("These simulator processes did not start: #{required.join(",")}")
395
408
  end
396
409
  end
397
410
 
@@ -613,11 +626,19 @@ Could not update the Simulator languages.
613
626
 
614
627
  # @!visibility private
615
628
  def simulator_required_child_processes
629
+ # required: ["SimulatorBridge", "medialibraryd"]
616
630
  @simulator_required_child_processes ||= begin
617
- required = ["backboardd", "installd", "SimulatorBridge", "SpringBoard"]
631
+ if xcode.version_gte_100?
632
+ required = ["backboardd", "installd", "SpringBoard"]
633
+ elsif xcode.version_gte_83? && version.major > 10
634
+ required = ["backboardd", "installd", "SpringBoard", "suggestd"]
635
+ else
636
+ required = ["backboardd", "installd", "SimulatorBridge", "SpringBoard"]
637
+ end
638
+
618
639
  if xcode.version_gte_90?
619
640
  required << "filecoordinationd"
620
- elsif xcode.version_gte_8? && version.major > 8
641
+ elsif xcode.version_gte_8? && (version.major > 8 && version.major < 11)
621
642
  required << "medialibraryd"
622
643
  end
623
644
 
@@ -45,6 +45,9 @@ module RunLoop
45
45
  # printf("\"%s\",", [langCode cStringUsingEncoding:NSUTF8StringEncoding]);
46
46
  # }
47
47
  LANGUAGE_CODES = {
48
+ RunLoop::Version.new("12.0") => [
49
+ "af","af-NA","af-ZA","agq","agq-CM","ak","ak-GH","am","am-ET","ar","ar-001","ar-AE","ar-BH","ar-DJ","ar-DZ","ar-EG","ar-EH","ar-ER","ar-IL","ar-IQ","ar-JO","ar-KM","ar-KW","ar-LB","ar-LY","ar-MA","ar-MR","ar-OM","ar-PS","ar-QA","ar-SA","ar-SD","ar-SO","ar-SS","ar-SY","ar-TD","ar-TN","ar-YE","as","as-IN","asa","asa-TZ","ast","ast-ES","az","az-Cyrl","az-Cyrl-AZ","az-AZ","bas","bas-CM","be","be-BY","bem","bem-ZM","bez","bez-TZ","bg","bg-BG","bm","bm-ML","bn","bn-BD","bn-IN","bo","bo-CN","bo-IN","br","br-FR","brx","brx-IN","bs","bs-Cyrl","bs-Cyrl-BA","bs-BA","ca","ca-AD","ca-ES","ca-FR","ca-IT","ce","ce-RU","cgg","cgg-UG","chr","chr-US","ckb","ckb-IQ","ckb-IR","cs","cs-CZ","cy","cy-GB","da","da-DK","da-GL","dav","dav-KE","de","de-AT","de-BE","de-CH","de-DE","de-IT","de-LI","de-LU","dje","dje-NE","dsb","dsb-DE","dua","dua-CM","dyo","dyo-SN","dz","dz-BT","ebu","ebu-KE","ee","ee-GH","ee-TG","el","el-CY","el-GR","en","en-001","en-150","en-AD","en-AG","en-AI","en-AL","en-AR","en-AS","en-AT","en-AU","en-BA","en-BB","en-BD","en-BE","en-BG","en-BI","en-BM","en-BR","en-BS","en-BW","en-BZ","en-CA","en-CC","en-CH","en-CK","en-CM","en-CN","en-CX","en-CY","en-CZ","en-DE","en-DG","en-DK","en-DM","en-EE","en-ER","en-ES","en-FI","en-FJ","en-FK","en-FM","en-FR","en-GB","en-GD","en-GG","en-GH","en-GI","en-GM","en-GR","en-GU","en-GY","en-HK","en-HR","en-HU","en-ID","en-IE","en-IL","en-IM","en-IN","en-IO","en-IS","en-IT","en-JE","en-JM","en-JP","en-KE","en-KI","en-KN","en-KR","en-KY","en-LC","en-LR","en-LS","en-LT","en-LU","en-LV","en-ME","en-MG","en-MH","en-MO","en-MP","en-MS","en-MT","en-MU","en-MV","en-MW","en-MY","en-NA","en-NF","en-NG","en-NL","en-NO","en-NR","en-NU","en-NZ","en-PG","en-PH","en-PK","en-PL","en-PN","en-PR","en-PT","en-PW","en-RO","en-RU","en-RW","en-SA","en-SB","en-SC","en-SD","en-SE","en-SG","en-SH","en-SI","en-SK","en-SL","en-SS","en-SX","en-SZ","en-TC","en-TH","en-TK","en-TO","en-TR","en-TT","en-TV","en-TW","en-TZ","en-UG","en-UM","en-US","en-US-POSIX","en-VC","en-VG","en-VI","en-VU","en-WS","en-ZA","en-ZM","en-ZW","eo","es","es-419","es-AG","es-AI","es-AR","es-AW","es-BB","es-BL","es-BM","es-BO","es-BQ","es-BR","es-BS","es-BZ","es-CA","es-CL","es-CO","es-CR","es-CU","es-CW","es-DM","es-DO","es-EA","es-EC","es-ES","es-FK","es-GD","es-GF","es-GL","es-GP","es-GQ","es-GT","es-GY","es-HN","es-HT","es-IC","es-KN","es-KY","es-LC","es-MF","es-MQ","es-MS","es-MX","es-NI","es-PA","es-PE","es-PH","es-PM","es-PR","es-PY","es-SR","es-SV","es-SX","es-TC","es-TT","es-US","es-UY","es-VC","es-VE","es-VG","es-VI","et","et-EE","eu","eu-ES","ewo","ewo-CM","fa","fa-AF","fa-IR","ff","ff-CM","ff-GN","ff-MR","ff-SN","fi","fi-FI","fil","fil-PH","fo","fo-DK","fo-FO","fr","fr-BE","fr-BF","fr-BI","fr-BJ","fr-BL","fr-CA","fr-CD","fr-CF","fr-CG","fr-CH","fr-CI","fr-CM","fr-DJ","fr-DZ","fr-FR","fr-GA","fr-GF","fr-GN","fr-GP","fr-GQ","fr-HT","fr-KM","fr-LU","fr-MA","fr-MC","fr-MF","fr-MG","fr-ML","fr-MQ","fr-MR","fr-MU","fr-NC","fr-NE","fr-PF","fr-PM","fr-RE","fr-RW","fr-SC","fr-SN","fr-SY","fr-TD","fr-TG","fr-TN","fr-VU","fr-WF","fr-YT","fur","fur-IT","fy","fy-NL","ga","ga-IE","gd","gd-GB","gl","gl-ES","gsw","gsw-CH","gsw-FR","gsw-LI","gu","gu-IN","guz","guz-KE","gv","gv-IM","ha","ha-GH","ha-NE","ha-NG","haw","haw-US","he","he-IL","hi","hi-IN","hr","hr-BA","hr-HR","hsb","hsb-DE","hu","hu-HU","hy","hy-AM","id","id-ID","ig","ig-NG","ii","ii-CN","is","is-IS","it","it-CH","it-IT","it-SM","it-VA","iu","iu-CA","ja","ja-JP","jgo","jgo-CM","jmc","jmc-TZ","ka","ka-GE","kab","kab-DZ","kam","kam-KE","kde","kde-TZ","kea","kea-CV","khq","khq-ML","ki","ki-KE","kk","kk-KZ","kkj","kkj-CM","kl","kl-GL","kln","kln-KE","km","km-KH","kn","kn-IN","ko","ko-KP","ko-KR","kok","kok-IN","ks","ks-IN","ksb","ksb-TZ","ksf","ksf-CM","ksh","ksh-DE","kw","kw-GB","ky","ky-KG","lag","lag-TZ","lb","lb-LU","lg","lg-UG","lkt","lkt-US","ln","ln-AO","ln-CD","ln-CF","ln-CG","lo","lo-LA","lrc","lrc-IQ","lrc-IR","lt","lt-LT","lu","lu-CD","luo","luo-KE","luy","luy-KE","lv","lv-LV","mas","mas-KE","mas-TZ","mer","mer-KE","mfe","mfe-MU","mg","mg-MG","mgh","mgh-MZ","mgo","mgo-CM","mk","mk-MK","ml","ml-IN","mn","mn-MN","mr","mr-IN","ms","ms-Arab","ms-Arab-BN","ms-Arab-MY","ms-BN","ms-MY","ms-SG","mt","mt-MT","mua","mua-CM","my","my-MM","mzn","mzn-IR","naq","naq-NA","nb","nb-NO","nb-SJ","nd","nd-ZW","nds","nds-DE","nds-NL","ne","ne-IN","ne-NP","nl","nl-AW","nl-BE","nl-BQ","nl-CW","nl-NL","nl-SR","nl-SX","nmg","nmg-CM","nn","nn-NO","nnh","nnh-CM","nus","nus-SS","nyn","nyn-UG","om","om-ET","om-KE","or","or-IN","os","os-GE","os-RU","pa","pa-Arab","pa-Arab-PK","pa-IN","pl","pl-PL","ps","ps-AF","pt","pt-AO","pt-BR","pt-CH","pt-CV","pt-FR","pt-GQ","pt-GW","pt-LU","pt-MO","pt-MZ","pt-PT","pt-ST","pt-TL","qu","qu-BO","qu-EC","qu-PE","rm","rm-CH","rn","rn-BI","ro","ro-MD","ro-RO","rof","rof-TZ","ru","ru-BY","ru-KG","ru-KZ","ru-MD","ru-RU","ru-UA","rw","rw-RW","rwk","rwk-TZ","sah","sah-RU","saq","saq-KE","sbp","sbp-TZ","se","se-FI","se-NO","se-SE","seh","seh-MZ","ses","ses-ML","sg","sg-CF","shi","shi-MA","shi-Tfng","shi-Tfng-MA","si","si-LK","sk","sk-SK","sl","sl-SI","smn","smn-FI","sn","sn-ZW","so","so-DJ","so-ET","so-KE","so-SO","sq","sq-AL","sq-MK","sq-XK","sr","sr-BA","sr-ME","sr-RS","sr-XK","sr-Latn","sr-Latn-BA","sr-Latn-ME","sr-Latn-RS","sr-Latn-XK","sv","sv-AX","sv-FI","sv-SE","sw","sw-CD","sw-KE","sw-TZ","sw-UG","ta","ta-IN","ta-LK","ta-MY","ta-SG","te","te-IN","teo","teo-KE","teo-UG","tg","tg-TJ","th","th-TH","ti","ti-ER","ti-ET","tk","tk-TM","to","to-TO","tr","tr-CY","tr-TR","twq","twq-NE","tzm","tzm-MA","ug","ug-CN","uk","uk-UA","ur","ur-IN","ur-PK","uz","uz-Arab","uz-Arab-AF","uz-UZ","uz-Latn","uz-Latn-UZ","vai","vai-Latn","vai-Latn-LR","vai-LR","vi","vi-VN","vun","vun-TZ","wae","wae-CH","xog","xog-UG","yav","yav-CM","yi","yi-001","yo","yo-BJ","yo-NG","yue","yue-Hans","yue-Hans-CN","yue-Hant","yue-Hant-HK","zgh","zgh-MA","zh","zh-Hans","zh-Hans-CN","zh-Hans-HK","zh-Hans-MO","zh-Hans-SG","zh-Hant","zh-Hant-HK","zh-Hant-MO","zh-Hant-TW","zu","zu-ZA"
50
+ ],
48
51
  RunLoop::Version.new("11.0") => [
49
52
  "af","af-NA","af-ZA","agq","agq-CM","ak","ak-GH","am","am-ET","ar","ar-001","ar-AE","ar-BH","ar-DJ","ar-DZ","ar-EG","ar-EH","ar-ER","ar-IL","ar-IQ","ar-JO","ar-KM","ar-KW","ar-LB","ar-LY","ar-MA","ar-MR","ar-OM","ar-PS","ar-QA","ar-SA","ar-SD","ar-SO","ar-SS","ar-SY","ar-TD","ar-TN","ar-YE","as","as-IN","asa","asa-TZ","ast","ast-ES","az","az-Cyrl","az-Cyrl-AZ","az-AZ","bas","bas-CM","be","be-BY","bem","bem-ZM","bez","bez-TZ","bg","bg-BG","bm","bm-ML","bn","bn-BD","bn-IN","bo","bo-CN","bo-IN","br","br-FR","brx","brx-IN","bs","bs-Cyrl","bs-Cyrl-BA","bs-BA","ca","ca-AD","ca-ES","ca-FR","ca-IT","ce","ce-RU","cgg","cgg-UG","chr","chr-US","ckb","ckb-IQ","ckb-IR","cs","cs-CZ","cy","cy-GB","da","da-DK","da-GL","dav","dav-KE","de","de-AT","de-BE","de-CH","de-DE","de-IT","de-LI","de-LU","dje","dje-NE","dsb","dsb-DE","dua","dua-CM","dyo","dyo-SN","dz","dz-BT","ebu","ebu-KE","ee","ee-GH","ee-TG","el","el-CY","el-GR","en","en-001","en-150","en-AD","en-AG","en-AI","en-AL","en-AR","en-AS","en-AT","en-AU","en-BA","en-BB","en-BD","en-BE","en-BG","en-BI","en-BM","en-BR","en-BS","en-BW","en-BZ","en-CA","en-CC","en-CH","en-CK","en-CM","en-CN","en-CX","en-CY","en-CZ","en-DE","en-DG","en-DK","en-DM","en-EE","en-ER","en-ES","en-FI","en-FJ","en-FK","en-FM","en-FR","en-GB","en-GD","en-GG","en-GH","en-GI","en-GM","en-GR","en-GU","en-GY","en-HK","en-HR","en-HU","en-ID","en-IE","en-IL","en-IM","en-IN","en-IO","en-IS","en-IT","en-JE","en-JM","en-JP","en-KE","en-KI","en-KN","en-KR","en-KY","en-LC","en-LR","en-LS","en-LT","en-LU","en-LV","en-ME","en-MG","en-MH","en-MO","en-MP","en-MS","en-MT","en-MU","en-MV","en-MW","en-MY","en-NA","en-NF","en-NG","en-NL","en-NO","en-NR","en-NU","en-NZ","en-PG","en-PH","en-PK","en-PL","en-PN","en-PR","en-PT","en-PW","en-RO","en-RU","en-RW","en-SA","en-SB","en-SC","en-SD","en-SE","en-SG","en-SH","en-SI","en-SK","en-SL","en-SS","en-SX","en-SZ","en-TC","en-TH","en-TK","en-TO","en-TR","en-TT","en-TV","en-TW","en-TZ","en-UG","en-UM","en-US","en-US-POSIX","en-VC","en-VG","en-VI","en-VU","en-WS","en-ZA","en-ZM","en-ZW","eo","es","es-419","es-AG","es-AI","es-AR","es-AW","es-BB","es-BL","es-BM","es-BO","es-BQ","es-BR","es-BS","es-BZ","es-CL","es-CO","es-CR","es-CU","es-CW","es-DM","es-DO","es-EA","es-EC","es-ES","es-FK","es-GD","es-GF","es-GL","es-GP","es-GQ","es-GT","es-GY","es-HN","es-HT","es-IC","es-KN","es-KY","es-LC","es-MF","es-MQ","es-MS","es-MX","es-NI","es-PA","es-PE","es-PH","es-PM","es-PR","es-PY","es-SR","es-SV","es-SX","es-TC","es-TT","es-US","es-UY","es-VC","es-VE","es-VG","es-VI","et","et-EE","eu","eu-ES","ewo","ewo-CM","fa","fa-AF","fa-IR","ff","ff-CM","ff-GN","ff-MR","ff-SN","fi","fi-FI","fil","fil-PH","fo","fo-DK","fo-FO","fr","fr-BE","fr-BF","fr-BI","fr-BJ","fr-BL","fr-CA","fr-CD","fr-CF","fr-CG","fr-CH","fr-CI","fr-CM","fr-DJ","fr-DZ","fr-FR","fr-GA","fr-GF","fr-GN","fr-GP","fr-GQ","fr-HT","fr-KM","fr-LU","fr-MA","fr-MC","fr-MF","fr-MG","fr-ML","fr-MQ","fr-MR","fr-MU","fr-NC","fr-NE","fr-PF","fr-PM","fr-RE","fr-RW","fr-SC","fr-SN","fr-SY","fr-TD","fr-TG","fr-TN","fr-VU","fr-WF","fr-YT","fur","fur-IT","fy","fy-NL","ga","ga-IE","gd","gd-GB","gl","gl-ES","gsw","gsw-CH","gsw-FR","gsw-LI","gu","gu-IN","guz","guz-KE","gv","gv-IM","ha","ha-GH","ha-NE","ha-NG","haw","haw-US","he","he-IL","hi","hi-IN","hr","hr-BA","hr-HR","hsb","hsb-DE","hu","hu-HU","hy","hy-AM","id","id-ID","ig","ig-NG","ii","ii-CN","is","is-IS","it","it-CH","it-IT","it-SM","it-VA","iu","iu-CA","ja","ja-JP","jgo","jgo-CM","jmc","jmc-TZ","ka","ka-GE","kab","kab-DZ","kam","kam-KE","kde","kde-TZ","kea","kea-CV","khq","khq-ML","ki","ki-KE","kk","kk-KZ","kkj","kkj-CM","kl","kl-GL","kln","kln-KE","km","km-KH","kn","kn-IN","ko","ko-KP","ko-KR","kok","kok-IN","ks","ks-IN","ksb","ksb-TZ","ksf","ksf-CM","ksh","ksh-DE","kw","kw-GB","ky","ky-KG","lag","lag-TZ","lb","lb-LU","lg","lg-UG","lkt","lkt-US","ln","ln-AO","ln-CD","ln-CF","ln-CG","lo","lo-LA","lrc","lrc-IQ","lrc-IR","lt","lt-LT","lu","lu-CD","luo","luo-KE","luy","luy-KE","lv","lv-LV","mas","mas-KE","mas-TZ","mer","mer-KE","mfe","mfe-MU","mg","mg-MG","mgh","mgh-MZ","mgo","mgo-CM","mk","mk-MK","ml","ml-IN","mn","mn-MN","mr","mr-IN","ms","ms-Arab","ms-Arab-BN","ms-Arab-MY","ms-BN","ms-MY","ms-SG","mt","mt-MT","mua","mua-CM","my","my-MM","mzn","mzn-IR","naq","naq-NA","nb","nb-NO","nb-SJ","nd","nd-ZW","nds","nds-DE","nds-NL","ne","ne-IN","ne-NP","nl","nl-AW","nl-BE","nl-BQ","nl-CW","nl-NL","nl-SR","nl-SX","nmg","nmg-CM","nn","nn-NO","nnh","nnh-CM","nus","nus-SS","nyn","nyn-UG","om","om-ET","om-KE","or","or-IN","os","os-GE","os-RU","pa","pa-Arab","pa-Arab-PK","pa-IN","pl","pl-PL","ps","ps-AF","pt","pt-AO","pt-BR","pt-CH","pt-CV","pt-FR","pt-GQ","pt-GW","pt-LU","pt-MO","pt-MZ","pt-PT","pt-ST","pt-TL","qu","qu-BO","qu-EC","qu-PE","rm","rm-CH","rn","rn-BI","ro","ro-MD","ro-RO","rof","rof-TZ","ru","ru-BY","ru-KG","ru-KZ","ru-MD","ru-RU","ru-UA","rw","rw-RW","rwk","rwk-TZ","sah","sah-RU","saq","saq-KE","sbp","sbp-TZ","se","se-FI","se-NO","se-SE","seh","seh-MZ","ses","ses-ML","sg","sg-CF","shi","shi-MA","shi-Tfng","shi-Tfng-MA","si","si-LK","sk","sk-SK","sl","sl-SI","smn","smn-FI","sn","sn-ZW","so","so-DJ","so-ET","so-KE","so-SO","sq","sq-AL","sq-MK","sq-XK","sr","sr-BA","sr-ME","sr-RS","sr-XK","sr-Latn","sr-Latn-BA","sr-Latn-ME","sr-Latn-RS","sr-Latn-XK","sv","sv-AX","sv-FI","sv-SE","sw","sw-CD","sw-KE","sw-TZ","sw-UG","ta","ta-IN","ta-LK","ta-MY","ta-SG","te","te-IN","teo","teo-KE","teo-UG","tg","tg-TJ","th","th-TH","ti","ti-ER","ti-ET","tk","tk-TM","to","to-TO","tr","tr-CY","tr-TR","twq","twq-NE","tzm","tzm-MA","ug","ug-CN","uk","uk-UA","ur","ur-IN","ur-PK","uz","uz-Arab","uz-Arab-AF","uz-UZ","uz-Latn","uz-Latn-UZ","vai","vai-Latn","vai-Latn-LR","vai-LR","vi","vi-VN","vun","vun-TZ","wae","wae-CH","xog","xog-UG","yav","yav-CM","yi","yi-001","yo","yo-BJ","yo-NG","yue","yue-Hans","yue-Hans-CN","yue-Hant","yue-Hant-HK","zgh","zgh-MA","zh","zh-Hans","zh-Hans-CN","zh-Hans-HK","zh-Hans-MO","zh-Hans-SG","zh-Hant","zh-Hant-HK","zh-Hant-MO","zh-Hant-TW","zu","zu-ZA"
50
53
  ],
@@ -84,6 +84,9 @@ module RunLoop
84
84
  # value:localeId] cStringUsingEncoding:NSUTF8StringEncoding]);
85
85
  # }
86
86
  LOCALES = {
87
+ RunLoop::Version.new("12.0") => {
88
+ "af" => "Afrikaans","af_NA" => "Afrikaans (Namibia)","af_ZA" => "Afrikaans (South Africa)","agq" => "Aghem","agq_CM" => "Aghem (Cameroon)","ak" => "Akan","ak_GH" => "Akan (Ghana)","am" => "Amharic","am_ET" => "Amharic (Ethiopia)","ar" => "Arabic","ar_001" => "Arabic (World)","ar_AE" => "Arabic (United Arab Emirates)","ar_BH" => "Arabic (Bahrain)","ar_DJ" => "Arabic (Djibouti)","ar_DZ" => "Arabic (Algeria)","ar_EG" => "Arabic (Egypt)","ar_EH" => "Arabic (Western Sahara)","ar_ER" => "Arabic (Eritrea)","ar_IL" => "Arabic (Israel)","ar_IQ" => "Arabic (Iraq)","ar_JO" => "Arabic (Jordan)","ar_KM" => "Arabic (Comoros)","ar_KW" => "Arabic (Kuwait)","ar_LB" => "Arabic (Lebanon)","ar_LY" => "Arabic (Libya)","ar_MA" => "Arabic (Morocco)","ar_MR" => "Arabic (Mauritania)","ar_OM" => "Arabic (Oman)","ar_PS" => "Arabic (Palestinian Territories)","ar_QA" => "Arabic (Qatar)","ar_SA" => "Arabic (Saudi Arabia)","ar_SD" => "Arabic (Sudan)","ar_SO" => "Arabic (Somalia)","ar_SS" => "Arabic (South Sudan)","ar_SY" => "Arabic (Syria)","ar_TD" => "Arabic (Chad)","ar_TN" => "Arabic (Tunisia)","ar_YE" => "Arabic (Yemen)","as" => "Assamese","as_IN" => "Assamese (India)","asa" => "Asu","asa_TZ" => "Asu (Tanzania)","ast" => "Asturian","ast_ES" => "Asturian (Spain)","az" => "Azerbaijani","az_Cyrl" => "Azerbaijani (Cyrillic)","az_Cyrl_AZ" => "Azerbaijani (Cyrillic, Azerbaijan)","az_Latn" => "Azerbaijani (Latin)","az_Latn_AZ" => "Azerbaijani (Latin, Azerbaijan)","bas" => "Basaa","bas_CM" => "Basaa (Cameroon)","be" => "Belarusian","be_BY" => "Belarusian (Belarus)","bem" => "Bemba","bem_ZM" => "Bemba (Zambia)","bez" => "Bena","bez_TZ" => "Bena (Tanzania)","bg" => "Bulgarian","bg_BG" => "Bulgarian (Bulgaria)","bm" => "Bambara","bm_ML" => "Bambara (Mali)","bn" => "Bangla","bn_BD" => "Bangla (Bangladesh)","bn_IN" => "Bangla (India)","bo" => "Tibetan","bo_CN" => "Tibetan (China)","bo_IN" => "Tibetan (India)","br" => "Breton","br_FR" => "Breton (France)","brx" => "Bodo","brx_IN" => "Bodo (India)","bs" => "Bosnian","bs_Cyrl" => "Bosnian (Cyrillic)","bs_Cyrl_BA" => "Bosnian (Cyrillic, Bosnia & Herzegovina)","bs_Latn" => "Bosnian (Latin)","bs_Latn_BA" => "Bosnian (Latin, Bosnia & Herzegovina)","ca" => "Catalan","ca_AD" => "Catalan (Andorra)","ca_ES" => "Catalan (Spain)","ca_FR" => "Catalan (France)","ca_IT" => "Catalan (Italy)","ce" => "Chechen","ce_RU" => "Chechen (Russia)","cgg" => "Chiga","cgg_UG" => "Chiga (Uganda)","chr" => "Cherokee","chr_US" => "Cherokee (United States)","ckb" => "Central Kurdish","ckb_IQ" => "Central Kurdish (Iraq)","ckb_IR" => "Central Kurdish (Iran)","cs" => "Czech","cs_CZ" => "Czech (Czechia)","cy" => "Welsh","cy_GB" => "Welsh (United Kingdom)","da" => "Danish","da_DK" => "Danish (Denmark)","da_GL" => "Danish (Greenland)","dav" => "Taita","dav_KE" => "Taita (Kenya)","de" => "German","de_AT" => "German (Austria)","de_BE" => "German (Belgium)","de_CH" => "German (Switzerland)","de_DE" => "German (Germany)","de_IT" => "German (Italy)","de_LI" => "German (Liechtenstein)","de_LU" => "German (Luxembourg)","dje" => "Zarma","dje_NE" => "Zarma (Niger)","dsb" => "Lower Sorbian","dsb_DE" => "Lower Sorbian (Germany)","dua" => "Duala","dua_CM" => "Duala (Cameroon)","dyo" => "Jola-Fonyi","dyo_SN" => "Jola-Fonyi (Senegal)","dz" => "Dzongkha","dz_BT" => "Dzongkha (Bhutan)","ebu" => "Embu","ebu_KE" => "Embu (Kenya)","ee" => "Ewe","ee_GH" => "Ewe (Ghana)","ee_TG" => "Ewe (Togo)","el" => "Greek","el_CY" => "Greek (Cyprus)","el_GR" => "Greek (Greece)","en" => "English","en_001" => "English (World)","en_150" => "English (Europe)","en_AD" => "English (Andorra)","en_AG" => "English (Antigua & Barbuda)","en_AI" => "English (Anguilla)","en_AL" => "English (Albania)","en_AR" => "English (Argentina)","en_AS" => "English (American Samoa)","en_AT" => "English (Austria)","en_AU" => "English (Australia)","en_BA" => "English (Bosnia & Herzegovina)","en_BB" => "English (Barbados)","en_BD" => "English (Bangladesh)","en_BE" => "English (Belgium)","en_BG" => "English (Bulgaria)","en_BI" => "English (Burundi)","en_BM" => "English (Bermuda)","en_BR" => "English (Brazil)","en_BS" => "English (Bahamas)","en_BW" => "English (Botswana)","en_BZ" => "English (Belize)","en_CA" => "English (Canada)","en_CC" => "English (Cocos [Keeling] Islands)","en_CH" => "English (Switzerland)","en_CK" => "English (Cook Islands)","en_CM" => "English (Cameroon)","en_CN" => "English (China)","en_CX" => "English (Christmas Island)","en_CY" => "English (Cyprus)","en_CZ" => "English (Czechia)","en_DE" => "English (Germany)","en_DG" => "English (Diego Garcia)","en_DK" => "English (Denmark)","en_DM" => "English (Dominica)","en_EE" => "English (Estonia)","en_ER" => "English (Eritrea)","en_ES" => "English (Spain)","en_FI" => "English (Finland)","en_FJ" => "English (Fiji)","en_FK" => "English (Falkland Islands)","en_FM" => "English (Micronesia)","en_FR" => "English (France)","en_GB" => "English (United Kingdom)","en_GD" => "English (Grenada)","en_GG" => "English (Guernsey)","en_GH" => "English (Ghana)","en_GI" => "English (Gibraltar)","en_GM" => "English (Gambia)","en_GR" => "English (Greece)","en_GU" => "English (Guam)","en_GY" => "English (Guyana)","en_HK" => "English (Hong Kong [China])","en_HR" => "English (Croatia)","en_HU" => "English (Hungary)","en_ID" => "English (Indonesia)","en_IE" => "English (Ireland)","en_IL" => "English (Israel)","en_IM" => "English (Isle of Man)","en_IN" => "English (India)","en_IO" => "English (British Indian Ocean Territory)","en_IS" => "English (Iceland)","en_IT" => "English (Italy)","en_JE" => "English (Jersey)","en_JM" => "English (Jamaica)","en_JP" => "English (Japan)","en_KE" => "English (Kenya)","en_KI" => "English (Kiribati)","en_KN" => "English (St. Kitts & Nevis)","en_KR" => "English (South Korea)","en_KY" => "English (Cayman Islands)","en_LC" => "English (St. Lucia)","en_LR" => "English (Liberia)","en_LS" => "English (Lesotho)","en_LT" => "English (Lithuania)","en_LU" => "English (Luxembourg)","en_LV" => "English (Latvia)","en_ME" => "English (Montenegro)","en_MG" => "English (Madagascar)","en_MH" => "English (Marshall Islands)","en_MO" => "English (Macau [China])","en_MP" => "English (Northern Mariana Islands)","en_MS" => "English (Montserrat)","en_MT" => "English (Malta)","en_MU" => "English (Mauritius)","en_MV" => "English (Maldives)","en_MW" => "English (Malawi)","en_MY" => "English (Malaysia)","en_NA" => "English (Namibia)","en_NF" => "English (Norfolk Island)","en_NG" => "English (Nigeria)","en_NL" => "English (Netherlands)","en_NO" => "English (Norway)","en_NR" => "English (Nauru)","en_NU" => "English (Niue)","en_NZ" => "English (New Zealand)","en_PG" => "English (Papua New Guinea)","en_PH" => "English (Philippines)","en_PK" => "English (Pakistan)","en_PL" => "English (Poland)","en_PN" => "English (Pitcairn Islands)","en_PR" => "English (Puerto Rico)","en_PT" => "English (Portugal)","en_PW" => "English (Palau)","en_RO" => "English (Romania)","en_RU" => "English (Russia)","en_RW" => "English (Rwanda)","en_SA" => "English (Saudi Arabia)","en_SB" => "English (Solomon Islands)","en_SC" => "English (Seychelles)","en_SD" => "English (Sudan)","en_SE" => "English (Sweden)","en_SG" => "English (Singapore)","en_SH" => "English (St. Helena)","en_SI" => "English (Slovenia)","en_SK" => "English (Slovakia)","en_SL" => "English (Sierra Leone)","en_SS" => "English (South Sudan)","en_SX" => "English (Sint Maarten)","en_SZ" => "English (Swaziland)","en_TC" => "English (Turks & Caicos Islands)","en_TH" => "English (Thailand)","en_TK" => "English (Tokelau)","en_TO" => "English (Tonga)","en_TR" => "English (Turkey)","en_TT" => "English (Trinidad & Tobago)","en_TV" => "English (Tuvalu)","en_TW" => "English (Taiwan)","en_TZ" => "English (Tanzania)","en_UG" => "English (Uganda)","en_UM" => "English (U.S. Outlying Islands)","en_US" => "English (United States)","en_US_POSIX" => "English (United States, Computer)","en_VC" => "English (St. Vincent & Grenadines)","en_VG" => "English (British Virgin Islands)","en_VI" => "English (U.S. Virgin Islands)","en_VU" => "English (Vanuatu)","en_WS" => "English (Samoa)","en_ZA" => "English (South Africa)","en_ZM" => "English (Zambia)","en_ZW" => "English (Zimbabwe)","eo" => "Esperanto","es" => "Spanish","es_419" => "Spanish (Latin America)","es_AG" => "Spanish (Antigua & Barbuda)","es_AI" => "Spanish (Anguilla)","es_AR" => "Spanish (Argentina)","es_AW" => "Spanish (Aruba)","es_BB" => "Spanish (Barbados)","es_BL" => "Spanish (St. Barthélemy)","es_BM" => "Spanish (Bermuda)","es_BO" => "Spanish (Bolivia)","es_BQ" => "Spanish (Caribbean Netherlands)","es_BR" => "Spanish (Brazil)","es_BS" => "Spanish (Bahamas)","es_BZ" => "Spanish (Belize)","es_CA" => "Spanish (Canada)","es_CL" => "Spanish (Chile)","es_CO" => "Spanish (Colombia)","es_CR" => "Spanish (Costa Rica)","es_CU" => "Spanish (Cuba)","es_CW" => "Spanish (Curaçao)","es_DM" => "Spanish (Dominica)","es_DO" => "Spanish (Dominican Republic)","es_EA" => "Spanish (Ceuta & Melilla)","es_EC" => "Spanish (Ecuador)","es_ES" => "Spanish (Spain)","es_FK" => "Spanish (Falkland Islands)","es_GD" => "Spanish (Grenada)","es_GF" => "Spanish (French Guiana)","es_GL" => "Spanish (Greenland)","es_GP" => "Spanish (Guadeloupe)","es_GQ" => "Spanish (Equatorial Guinea)","es_GT" => "Spanish (Guatemala)","es_GY" => "Spanish (Guyana)","es_HN" => "Spanish (Honduras)","es_HT" => "Spanish (Haiti)","es_IC" => "Spanish (Canary Islands)","es_KN" => "Spanish (St. Kitts & Nevis)","es_KY" => "Spanish (Cayman Islands)","es_LC" => "Spanish (St. Lucia)","es_MF" => "Spanish (St. Martin)","es_MQ" => "Spanish (Martinique)","es_MS" => "Spanish (Montserrat)","es_MX" => "Spanish (Mexico)","es_NI" => "Spanish (Nicaragua)","es_PA" => "Spanish (Panama)","es_PE" => "Spanish (Peru)","es_PH" => "Spanish (Philippines)","es_PM" => "Spanish (St. Pierre & Miquelon)","es_PR" => "Spanish (Puerto Rico)","es_PY" => "Spanish (Paraguay)","es_SR" => "Spanish (Suriname)","es_SV" => "Spanish (El Salvador)","es_SX" => "Spanish (Sint Maarten)","es_TC" => "Spanish (Turks & Caicos Islands)","es_TT" => "Spanish (Trinidad & Tobago)","es_US" => "Spanish (United States)","es_UY" => "Spanish (Uruguay)","es_VC" => "Spanish (St. Vincent & Grenadines)","es_VE" => "Spanish (Venezuela)","es_VG" => "Spanish (British Virgin Islands)","es_VI" => "Spanish (U.S. Virgin Islands)","et" => "Estonian","et_EE" => "Estonian (Estonia)","eu" => "Basque","eu_ES" => "Basque (Spain)","ewo" => "Ewondo","ewo_CM" => "Ewondo (Cameroon)","fa" => "Persian","fa_AF" => "Persian (Afghanistan)","fa_IR" => "Persian (Iran)","ff" => "Fulah","ff_CM" => "Fulah (Cameroon)","ff_GN" => "Fulah (Guinea)","ff_MR" => "Fulah (Mauritania)","ff_SN" => "Fulah (Senegal)","fi" => "Finnish","fi_FI" => "Finnish (Finland)","fil" => "Filipino","fil_PH" => "Filipino (Philippines)","fo" => "Faroese","fo_DK" => "Faroese (Denmark)","fo_FO" => "Faroese (Faroe Islands)","fr" => "French","fr_BE" => "French (Belgium)","fr_BF" => "French (Burkina Faso)","fr_BI" => "French (Burundi)","fr_BJ" => "French (Benin)","fr_BL" => "French (St. Barthélemy)","fr_CA" => "French (Canada)","fr_CD" => "French (Congo - Kinshasa)","fr_CF" => "French (Central African Republic)","fr_CG" => "French (Congo - Brazzaville)","fr_CH" => "French (Switzerland)","fr_CI" => "French (Côte d’Ivoire)","fr_CM" => "French (Cameroon)","fr_DJ" => "French (Djibouti)","fr_DZ" => "French (Algeria)","fr_FR" => "French (France)","fr_GA" => "French (Gabon)","fr_GF" => "French (French Guiana)","fr_GN" => "French (Guinea)","fr_GP" => "French (Guadeloupe)","fr_GQ" => "French (Equatorial Guinea)","fr_HT" => "French (Haiti)","fr_KM" => "French (Comoros)","fr_LU" => "French (Luxembourg)","fr_MA" => "French (Morocco)","fr_MC" => "French (Monaco)","fr_MF" => "French (St. Martin)","fr_MG" => "French (Madagascar)","fr_ML" => "French (Mali)","fr_MQ" => "French (Martinique)","fr_MR" => "French (Mauritania)","fr_MU" => "French (Mauritius)","fr_NC" => "French (New Caledonia)","fr_NE" => "French (Niger)","fr_PF" => "French (French Polynesia)","fr_PM" => "French (St. Pierre & Miquelon)","fr_RE" => "French (Réunion)","fr_RW" => "French (Rwanda)","fr_SC" => "French (Seychelles)","fr_SN" => "French (Senegal)","fr_SY" => "French (Syria)","fr_TD" => "French (Chad)","fr_TG" => "French (Togo)","fr_TN" => "French (Tunisia)","fr_VU" => "French (Vanuatu)","fr_WF" => "French (Wallis & Futuna)","fr_YT" => "French (Mayotte)","fur" => "Friulian","fur_IT" => "Friulian (Italy)","fy" => "Western Frisian","fy_NL" => "Western Frisian (Netherlands)","ga" => "Irish","ga_IE" => "Irish (Ireland)","gd" => "Scottish Gaelic","gd_GB" => "Scottish Gaelic (United Kingdom)","gl" => "Galician","gl_ES" => "Galician (Spain)","gsw" => "Swiss German","gsw_CH" => "Swiss German (Switzerland)","gsw_FR" => "Swiss German (France)","gsw_LI" => "Swiss German (Liechtenstein)","gu" => "Gujarati","gu_IN" => "Gujarati (India)","guz" => "Gusii","guz_KE" => "Gusii (Kenya)","gv" => "Manx","gv_IM" => "Manx (Isle of Man)","ha" => "Hausa","ha_GH" => "Hausa (Ghana)","ha_NE" => "Hausa (Niger)","ha_NG" => "Hausa (Nigeria)","haw" => "Hawaiian","haw_US" => "Hawaiian (United States)","he" => "Hebrew","he_IL" => "Hebrew (Israel)","hi" => "Hindi","hi_IN" => "Hindi (India)","hr" => "Croatian","hr_BA" => "Croatian (Bosnia & Herzegovina)","hr_HR" => "Croatian (Croatia)","hsb" => "Upper Sorbian","hsb_DE" => "Upper Sorbian (Germany)","hu" => "Hungarian","hu_HU" => "Hungarian (Hungary)","hy" => "Armenian","hy_AM" => "Armenian (Armenia)","id" => "Indonesian","id_ID" => "Indonesian (Indonesia)","ig" => "Igbo","ig_NG" => "Igbo (Nigeria)","ii" => "Sichuan Yi","ii_CN" => "Sichuan Yi (China)","is" => "Icelandic","is_IS" => "Icelandic (Iceland)","it" => "Italian","it_CH" => "Italian (Switzerland)","it_IT" => "Italian (Italy)","it_SM" => "Italian (San Marino)","it_VA" => "Italian (Vatican City)","iu" => "Inuktitut","iu_CA" => "Inuktitut (Canada)","ja" => "Japanese","ja_JP" => "Japanese (Japan)","jgo" => "Ngomba","jgo_CM" => "Ngomba (Cameroon)","jmc" => "Machame","jmc_TZ" => "Machame (Tanzania)","ka" => "Georgian","ka_GE" => "Georgian (Georgia)","kab" => "Kabyle","kab_DZ" => "Kabyle (Algeria)","kam" => "Kamba","kam_KE" => "Kamba (Kenya)","kde" => "Makonde","kde_TZ" => "Makonde (Tanzania)","kea" => "Kabuverdianu","kea_CV" => "Kabuverdianu (Cape Verde)","khq" => "Koyra Chiini","khq_ML" => "Koyra Chiini (Mali)","ki" => "Kikuyu","ki_KE" => "Kikuyu (Kenya)","kk" => "Kazakh","kk_KZ" => "Kazakh (Kazakhstan)","kkj" => "Kako","kkj_CM" => "Kako (Cameroon)","kl" => "Kalaallisut","kl_GL" => "Kalaallisut (Greenland)","kln" => "Kalenjin","kln_KE" => "Kalenjin (Kenya)","km" => "Khmer","km_KH" => "Khmer (Cambodia)","kn" => "Kannada","kn_IN" => "Kannada (India)","ko" => "Korean","ko_KP" => "Korean (North Korea)","ko_KR" => "Korean (South Korea)","kok" => "Konkani","kok_IN" => "Konkani (India)","ks" => "Kashmiri","ks_IN" => "Kashmiri (India)","ksb" => "Shambala","ksb_TZ" => "Shambala (Tanzania)","ksf" => "Bafia","ksf_CM" => "Bafia (Cameroon)","ksh" => "Colognian","ksh_DE" => "Colognian (Germany)","kw" => "Cornish","kw_GB" => "Cornish (United Kingdom)","ky" => "Kyrgyz","ky_KG" => "Kyrgyz (Kyrgyzstan)","lag" => "Langi","lag_TZ" => "Langi (Tanzania)","lb" => "Luxembourgish","lb_LU" => "Luxembourgish (Luxembourg)","lg" => "Ganda","lg_UG" => "Ganda (Uganda)","lkt" => "Lakota","lkt_US" => "Lakota (United States)","ln" => "Lingala","ln_AO" => "Lingala (Angola)","ln_CD" => "Lingala (Congo - Kinshasa)","ln_CF" => "Lingala (Central African Republic)","ln_CG" => "Lingala (Congo - Brazzaville)","lo" => "Lao","lo_LA" => "Lao (Laos)","lrc" => "Northern Luri","lrc_IQ" => "Northern Luri (Iraq)","lrc_IR" => "Northern Luri (Iran)","lt" => "Lithuanian","lt_LT" => "Lithuanian (Lithuania)","lu" => "Luba-Katanga","lu_CD" => "Luba-Katanga (Congo - Kinshasa)","luo" => "Luo","luo_KE" => "Luo (Kenya)","luy" => "Luyia","luy_KE" => "Luyia (Kenya)","lv" => "Latvian","lv_LV" => "Latvian (Latvia)","mas" => "Masai","mas_KE" => "Masai (Kenya)","mas_TZ" => "Masai (Tanzania)","mer" => "Meru","mer_KE" => "Meru (Kenya)","mfe" => "Morisyen","mfe_MU" => "Morisyen (Mauritius)","mg" => "Malagasy","mg_MG" => "Malagasy (Madagascar)","mgh" => "Makhuwa-Meetto","mgh_MZ" => "Makhuwa-Meetto (Mozambique)","mgo" => "Metaʼ","mgo_CM" => "Metaʼ (Cameroon)","mk" => "Macedonian","mk_MK" => "Macedonian (Macedonia)","ml" => "Malayalam","ml_IN" => "Malayalam (India)","mn" => "Mongolian","mn_MN" => "Mongolian (Mongolia)","mr" => "Marathi","mr_IN" => "Marathi (India)","ms" => "Malay","ms_Arab" => "Malay (Arabic)","ms_Arab_BN" => "Malay (Arabic, Brunei)","ms_Arab_MY" => "Malay (Arabic, Malaysia)","ms_BN" => "Malay (Brunei)","ms_MY" => "Malay (Malaysia)","ms_SG" => "Malay (Singapore)","mt" => "Maltese","mt_MT" => "Maltese (Malta)","mua" => "Mundang","mua_CM" => "Mundang (Cameroon)","my" => "Burmese","my_MM" => "Burmese (Myanmar [Burma])","mzn" => "Mazanderani","mzn_IR" => "Mazanderani (Iran)","naq" => "Nama","naq_NA" => "Nama (Namibia)","nb" => "Norwegian Bokmål","nb_NO" => "Norwegian Bokmål (Norway)","nb_SJ" => "Norwegian Bokmål (Svalbard & Jan Mayen)","nd" => "North Ndebele","nd_ZW" => "North Ndebele (Zimbabwe)","nds" => "Low German","nds_DE" => "Low German (Germany)","nds_NL" => "Low German (Netherlands)","ne" => "Nepali","ne_IN" => "Nepali (India)","ne_NP" => "Nepali (Nepal)","nl" => "Dutch","nl_AW" => "Dutch (Aruba)","nl_BE" => "Dutch (Belgium)","nl_BQ" => "Dutch (Caribbean Netherlands)","nl_CW" => "Dutch (Curaçao)","nl_NL" => "Dutch (Netherlands)","nl_SR" => "Dutch (Suriname)","nl_SX" => "Dutch (Sint Maarten)","nmg" => "Kwasio","nmg_CM" => "Kwasio (Cameroon)","nn" => "Norwegian Nynorsk","nn_NO" => "Norwegian Nynorsk (Norway)","nnh" => "Ngiemboon","nnh_CM" => "Ngiemboon (Cameroon)","nus" => "Nuer","nus_SS" => "Nuer (South Sudan)","nyn" => "Nyankole","nyn_UG" => "Nyankole (Uganda)","om" => "Oromo","om_ET" => "Oromo (Ethiopia)","om_KE" => "Oromo (Kenya)","or" => "Odia","or_IN" => "Odia (India)","os" => "Ossetic","os_GE" => "Ossetic (Georgia)","os_RU" => "Ossetic (Russia)","pa" => "Punjabi","pa_Arab" => "Punjabi (Arabic)","pa_Arab_PK" => "Punjabi (Arabic, Pakistan)","pa_Guru" => "Punjabi (Gurmukhi)","pa_Guru_IN" => "Punjabi (Gurmukhi, India)","pl" => "Polish","pl_PL" => "Polish (Poland)","ps" => "Pashto","ps_AF" => "Pashto (Afghanistan)","pt" => "Portuguese","pt_AO" => "Portuguese (Angola)","pt_BR" => "Portuguese (Brazil)","pt_CH" => "Portuguese (Switzerland)","pt_CV" => "Portuguese (Cape Verde)","pt_FR" => "Portuguese (France)","pt_GQ" => "Portuguese (Equatorial Guinea)","pt_GW" => "Portuguese (Guinea-Bissau)","pt_LU" => "Portuguese (Luxembourg)","pt_MO" => "Portuguese (Macau [China])","pt_MZ" => "Portuguese (Mozambique)","pt_PT" => "Portuguese (Portugal)","pt_ST" => "Portuguese (São Tomé & Príncipe)","pt_TL" => "Portuguese (Timor-Leste)","qu" => "Quechua","qu_BO" => "Quechua (Bolivia)","qu_EC" => "Quechua (Ecuador)","qu_PE" => "Quechua (Peru)","rm" => "Romansh","rm_CH" => "Romansh (Switzerland)","rn" => "Rundi","rn_BI" => "Rundi (Burundi)","ro" => "Romanian","ro_MD" => "Romanian (Moldova)","ro_RO" => "Romanian (Romania)","rof" => "Rombo","rof_TZ" => "Rombo (Tanzania)","ru" => "Russian","ru_BY" => "Russian (Belarus)","ru_KG" => "Russian (Kyrgyzstan)","ru_KZ" => "Russian (Kazakhstan)","ru_MD" => "Russian (Moldova)","ru_RU" => "Russian (Russia)","ru_UA" => "Russian (Ukraine)","rw" => "Kinyarwanda","rw_RW" => "Kinyarwanda (Rwanda)","rwk" => "Rwa","rwk_TZ" => "Rwa (Tanzania)","sah" => "Sakha","sah_RU" => "Sakha (Russia)","saq" => "Samburu","saq_KE" => "Samburu (Kenya)","sbp" => "Sangu","sbp_TZ" => "Sangu (Tanzania)","se" => "Northern Sami","se_FI" => "Northern Sami (Finland)","se_NO" => "Northern Sami (Norway)","se_SE" => "Northern Sami (Sweden)","seh" => "Sena","seh_MZ" => "Sena (Mozambique)","ses" => "Koyraboro Senni","ses_ML" => "Koyraboro Senni (Mali)","sg" => "Sango","sg_CF" => "Sango (Central African Republic)","shi" => "Tachelhit","shi_Latn" => "Tachelhit (Latin)","shi_Latn_MA" => "Tachelhit (Latin, Morocco)","shi_Tfng" => "Tachelhit (Tifinagh)","shi_Tfng_MA" => "Tachelhit (Tifinagh, Morocco)","si" => "Sinhala","si_LK" => "Sinhala (Sri Lanka)","sk" => "Slovak","sk_SK" => "Slovak (Slovakia)","sl" => "Slovenian","sl_SI" => "Slovenian (Slovenia)","smn" => "Inari Sami","smn_FI" => "Inari Sami (Finland)","sn" => "Shona","sn_ZW" => "Shona (Zimbabwe)","so" => "Somali","so_DJ" => "Somali (Djibouti)","so_ET" => "Somali (Ethiopia)","so_KE" => "Somali (Kenya)","so_SO" => "Somali (Somalia)","sq" => "Albanian","sq_AL" => "Albanian (Albania)","sq_MK" => "Albanian (Macedonia)","sq_XK" => "Albanian (Kosovo)","sr" => "Serbian","sr_Cyrl" => "Serbian (Cyrillic)","sr_Cyrl_BA" => "Serbian (Cyrillic, Bosnia & Herzegovina)","sr_Cyrl_ME" => "Serbian (Cyrillic, Montenegro)","sr_Cyrl_RS" => "Serbian (Cyrillic, Serbia)","sr_Cyrl_XK" => "Serbian (Cyrillic, Kosovo)","sr_Latn" => "Serbian (Latin)","sr_Latn_BA" => "Serbian (Latin, Bosnia & Herzegovina)","sr_Latn_ME" => "Serbian (Latin, Montenegro)","sr_Latn_RS" => "Serbian (Latin, Serbia)","sr_Latn_XK" => "Serbian (Latin, Kosovo)","sv" => "Swedish","sv_AX" => "Swedish (Åland Islands)","sv_FI" => "Swedish (Finland)","sv_SE" => "Swedish (Sweden)","sw" => "Swahili","sw_CD" => "Swahili (Congo - Kinshasa)","sw_KE" => "Swahili (Kenya)","sw_TZ" => "Swahili (Tanzania)","sw_UG" => "Swahili (Uganda)","ta" => "Tamil","ta_IN" => "Tamil (India)","ta_LK" => "Tamil (Sri Lanka)","ta_MY" => "Tamil (Malaysia)","ta_SG" => "Tamil (Singapore)","te" => "Telugu","te_IN" => "Telugu (India)","teo" => "Teso","teo_KE" => "Teso (Kenya)","teo_UG" => "Teso (Uganda)","tg" => "Tajik","tg_TJ" => "Tajik (Tajikistan)","th" => "Thai","th_TH" => "Thai (Thailand)","ti" => "Tigrinya","ti_ER" => "Tigrinya (Eritrea)","ti_ET" => "Tigrinya (Ethiopia)","tk" => "Turkmen","tk_TM" => "Turkmen (Turkmenistan)","to" => "Tongan","to_TO" => "Tongan (Tonga)","tr" => "Turkish","tr_CY" => "Turkish (Cyprus)","tr_TR" => "Turkish (Turkey)","twq" => "Tasawaq","twq_NE" => "Tasawaq (Niger)","tzm" => "Central Atlas Tamazight","tzm_MA" => "Central Atlas Tamazight (Morocco)","ug" => "Uyghur","ug_CN" => "Uyghur (China)","uk" => "Ukrainian","uk_UA" => "Ukrainian (Ukraine)","ur" => "Urdu","ur_IN" => "Urdu (India)","ur_PK" => "Urdu (Pakistan)","uz" => "Uzbek","uz_Arab" => "Uzbek (Arabic)","uz_Arab_AF" => "Uzbek (Arabic, Afghanistan)","uz_Cyrl" => "Uzbek (Cyrillic)","uz_Cyrl_UZ" => "Uzbek (Cyrillic, Uzbekistan)","uz_Latn" => "Uzbek (Latin)","uz_Latn_UZ" => "Uzbek (Latin, Uzbekistan)","vai" => "Vai","vai_Latn" => "Vai (Latin)","vai_Latn_LR" => "Vai (Latin, Liberia)","vai_Vaii" => "Vai (Vai)","vai_Vaii_LR" => "Vai (Vai, Liberia)","vi" => "Vietnamese","vi_VN" => "Vietnamese (Vietnam)","vun" => "Vunjo","vun_TZ" => "Vunjo (Tanzania)","wae" => "Walser","wae_CH" => "Walser (Switzerland)","xog" => "Soga","xog_UG" => "Soga (Uganda)","yav" => "Yangben","yav_CM" => "Yangben (Cameroon)","yi" => "Yiddish","yi_001" => "Yiddish (World)","yo" => "Yoruba","yo_BJ" => "Yoruba (Benin)","yo_NG" => "Yoruba (Nigeria)","yue" => "Cantonese","yue_Hans" => "Cantonese (Simplified)","yue_Hans_CN" => "Cantonese (Simplified, China)","yue_Hant" => "Cantonese (Traditional)","yue_Hant_HK" => "Cantonese (Traditional, Hong Kong [China])","zgh" => "Standard Moroccan Tamazight","zgh_MA" => "Standard Moroccan Tamazight (Morocco)","zh" => "Chinese","zh_Hans" => "Chinese (Simplified)","zh_Hans_CN" => "Chinese (Simplified, China)","zh_Hans_HK" => "Chinese (Simplified, Hong Kong [China])","zh_Hans_MO" => "Chinese (Simplified, Macau [China])","zh_Hans_SG" => "Chinese (Simplified, Singapore)","zh_Hant" => "Chinese (Traditional)","zh_Hant_HK" => "Chinese (Traditional, Hong Kong [China])","zh_Hant_MO" => "Chinese (Traditional, Macau [China])","zh_Hant_TW" => "Chinese (Traditional, Taiwan)","zu" => "Zulu","zu_ZA" => "Zulu (South Africa)"
89
+ },
87
90
  RunLoop::Version.new("11.0") => {
88
91
  "af" => "Afrikaans","af_NA" => "Afrikaans (Namibia)","af_ZA" => "Afrikaans (South Africa)","agq" => "Aghem","agq_CM" => "Aghem (Cameroon)","ak" => "Akan","ak_GH" => "Akan (Ghana)","am" => "Amharic","am_ET" => "Amharic (Ethiopia)","ar" => "Arabic","ar_001" => "Arabic (World)","ar_AE" => "Arabic (United Arab Emirates)","ar_BH" => "Arabic (Bahrain)","ar_DJ" => "Arabic (Djibouti)","ar_DZ" => "Arabic (Algeria)","ar_EG" => "Arabic (Egypt)","ar_EH" => "Arabic (Western Sahara)","ar_ER" => "Arabic (Eritrea)","ar_IL" => "Arabic (Israel)","ar_IQ" => "Arabic (Iraq)","ar_JO" => "Arabic (Jordan)","ar_KM" => "Arabic (Comoros)","ar_KW" => "Arabic (Kuwait)","ar_LB" => "Arabic (Lebanon)","ar_LY" => "Arabic (Libya)","ar_MA" => "Arabic (Morocco)","ar_MR" => "Arabic (Mauritania)","ar_OM" => "Arabic (Oman)","ar_PS" => "Arabic (Palestinian Territories)","ar_QA" => "Arabic (Qatar)","ar_SA" => "Arabic (Saudi Arabia)","ar_SD" => "Arabic (Sudan)","ar_SO" => "Arabic (Somalia)","ar_SS" => "Arabic (South Sudan)","ar_SY" => "Arabic (Syria)","ar_TD" => "Arabic (Chad)","ar_TN" => "Arabic (Tunisia)","ar_YE" => "Arabic (Yemen)","as" => "Assamese","as_IN" => "Assamese (India)","asa" => "Asu","asa_TZ" => "Asu (Tanzania)","ast" => "Asturian","ast_ES" => "Asturian (Spain)","az" => "Azerbaijani","az_Cyrl" => "Azerbaijani (Cyrillic)","az_Cyrl_AZ" => "Azerbaijani (Cyrillic, Azerbaijan)","az_Latn" => "Azerbaijani (Latin)","az_Latn_AZ" => "Azerbaijani (Latin, Azerbaijan)","bas" => "Basaa","bas_CM" => "Basaa (Cameroon)","be" => "Belarusian","be_BY" => "Belarusian (Belarus)","bem" => "Bemba","bem_ZM" => "Bemba (Zambia)","bez" => "Bena","bez_TZ" => "Bena (Tanzania)","bg" => "Bulgarian","bg_BG" => "Bulgarian (Bulgaria)","bm" => "Bambara","bm_ML" => "Bambara (Mali)","bn" => "Bangla","bn_BD" => "Bangla (Bangladesh)","bn_IN" => "Bangla (India)","bo" => "Tibetan","bo_CN" => "Tibetan (China)","bo_IN" => "Tibetan (India)","br" => "Breton","br_FR" => "Breton (France)","brx" => "Bodo","brx_IN" => "Bodo (India)","bs" => "Bosnian","bs_Cyrl" => "Bosnian (Cyrillic)","bs_Cyrl_BA" => "Bosnian (Cyrillic, Bosnia & Herzegovina)","bs_Latn" => "Bosnian (Latin)","bs_Latn_BA" => "Bosnian (Latin, Bosnia & Herzegovina)","ca" => "Catalan","ca_AD" => "Catalan (Andorra)","ca_ES" => "Catalan (Spain)","ca_FR" => "Catalan (France)","ca_IT" => "Catalan (Italy)","ce" => "Chechen","ce_RU" => "Chechen (Russia)","cgg" => "Chiga","cgg_UG" => "Chiga (Uganda)","chr" => "Cherokee","chr_US" => "Cherokee (United States)","ckb" => "Central Kurdish","ckb_IQ" => "Central Kurdish (Iraq)","ckb_IR" => "Central Kurdish (Iran)","cs" => "Czech","cs_CZ" => "Czech (Czechia)","cy" => "Welsh","cy_GB" => "Welsh (United Kingdom)","da" => "Danish","da_DK" => "Danish (Denmark)","da_GL" => "Danish (Greenland)","dav" => "Taita","dav_KE" => "Taita (Kenya)","de" => "German","de_AT" => "German (Austria)","de_BE" => "German (Belgium)","de_CH" => "German (Switzerland)","de_DE" => "German (Germany)","de_IT" => "German (Italy)","de_LI" => "German (Liechtenstein)","de_LU" => "German (Luxembourg)","dje" => "Zarma","dje_NE" => "Zarma (Niger)","dsb" => "Lower Sorbian","dsb_DE" => "Lower Sorbian (Germany)","dua" => "Duala","dua_CM" => "Duala (Cameroon)","dyo" => "Jola-Fonyi","dyo_SN" => "Jola-Fonyi (Senegal)","dz" => "Dzongkha","dz_BT" => "Dzongkha (Bhutan)","ebu" => "Embu","ebu_KE" => "Embu (Kenya)","ee" => "Ewe","ee_GH" => "Ewe (Ghana)","ee_TG" => "Ewe (Togo)","el" => "Greek","el_CY" => "Greek (Cyprus)","el_GR" => "Greek (Greece)","en" => "English","en_001" => "English (World)","en_150" => "English (Europe)","en_AD" => "English (Andorra)","en_AG" => "English (Antigua & Barbuda)","en_AI" => "English (Anguilla)","en_AL" => "English (Albania)","en_AR" => "English (Argentina)","en_AS" => "English (American Samoa)","en_AT" => "English (Austria)","en_AU" => "English (Australia)","en_BA" => "English (Bosnia & Herzegovina)","en_BB" => "English (Barbados)","en_BD" => "English (Bangladesh)","en_BE" => "English (Belgium)","en_BG" => "English (Bulgaria)","en_BI" => "English (Burundi)","en_BM" => "English (Bermuda)","en_BR" => "English (Brazil)","en_BS" => "English (Bahamas)","en_BW" => "English (Botswana)","en_BZ" => "English (Belize)","en_CA" => "English (Canada)","en_CC" => "English (Cocos [Keeling] Islands)","en_CH" => "English (Switzerland)","en_CK" => "English (Cook Islands)","en_CM" => "English (Cameroon)","en_CN" => "English (China)","en_CX" => "English (Christmas Island)","en_CY" => "English (Cyprus)","en_CZ" => "English (Czechia)","en_DE" => "English (Germany)","en_DG" => "English (Diego Garcia)","en_DK" => "English (Denmark)","en_DM" => "English (Dominica)","en_EE" => "English (Estonia)","en_ER" => "English (Eritrea)","en_ES" => "English (Spain)","en_FI" => "English (Finland)","en_FJ" => "English (Fiji)","en_FK" => "English (Falkland Islands)","en_FM" => "English (Micronesia)","en_FR" => "English (France)","en_GB" => "English (United Kingdom)","en_GD" => "English (Grenada)","en_GG" => "English (Guernsey)","en_GH" => "English (Ghana)","en_GI" => "English (Gibraltar)","en_GM" => "English (Gambia)","en_GR" => "English (Greece)","en_GU" => "English (Guam)","en_GY" => "English (Guyana)","en_HK" => "English (Hong Kong [China])","en_HR" => "English (Croatia)","en_HU" => "English (Hungary)","en_ID" => "English (Indonesia)","en_IE" => "English (Ireland)","en_IL" => "English (Israel)","en_IM" => "English (Isle of Man)","en_IN" => "English (India)","en_IO" => "English (British Indian Ocean Territory)","en_IS" => "English (Iceland)","en_IT" => "English (Italy)","en_JE" => "English (Jersey)","en_JM" => "English (Jamaica)","en_JP" => "English (Japan)","en_KE" => "English (Kenya)","en_KI" => "English (Kiribati)","en_KN" => "English (St. Kitts & Nevis)","en_KR" => "English (South Korea)","en_KY" => "English (Cayman Islands)","en_LC" => "English (St. Lucia)","en_LR" => "English (Liberia)","en_LS" => "English (Lesotho)","en_LT" => "English (Lithuania)","en_LU" => "English (Luxembourg)","en_LV" => "English (Latvia)","en_ME" => "English (Montenegro)","en_MG" => "English (Madagascar)","en_MH" => "English (Marshall Islands)","en_MO" => "English (Macau [China])","en_MP" => "English (Northern Mariana Islands)","en_MS" => "English (Montserrat)","en_MT" => "English (Malta)","en_MU" => "English (Mauritius)","en_MV" => "English (Maldives)","en_MW" => "English (Malawi)","en_MY" => "English (Malaysia)","en_NA" => "English (Namibia)","en_NF" => "English (Norfolk Island)","en_NG" => "English (Nigeria)","en_NL" => "English (Netherlands)","en_NO" => "English (Norway)","en_NR" => "English (Nauru)","en_NU" => "English (Niue)","en_NZ" => "English (New Zealand)","en_PG" => "English (Papua New Guinea)","en_PH" => "English (Philippines)","en_PK" => "English (Pakistan)","en_PL" => "English (Poland)","en_PN" => "English (Pitcairn Islands)","en_PR" => "English (Puerto Rico)","en_PT" => "English (Portugal)","en_PW" => "English (Palau)","en_RO" => "English (Romania)","en_RU" => "English (Russia)","en_RW" => "English (Rwanda)","en_SA" => "English (Saudi Arabia)","en_SB" => "English (Solomon Islands)","en_SC" => "English (Seychelles)","en_SD" => "English (Sudan)","en_SE" => "English (Sweden)","en_SG" => "English (Singapore)","en_SH" => "English (St. Helena)","en_SI" => "English (Slovenia)","en_SK" => "English (Slovakia)","en_SL" => "English (Sierra Leone)","en_SS" => "English (South Sudan)","en_SX" => "English (Sint Maarten)","en_SZ" => "English (Swaziland)","en_TC" => "English (Turks & Caicos Islands)","en_TH" => "English (Thailand)","en_TK" => "English (Tokelau)","en_TO" => "English (Tonga)","en_TR" => "English (Turkey)","en_TT" => "English (Trinidad & Tobago)","en_TV" => "English (Tuvalu)","en_TW" => "English (Taiwan)","en_TZ" => "English (Tanzania)","en_UG" => "English (Uganda)","en_UM" => "English (U.S. Outlying Islands)","en_US" => "English (United States)","en_US_POSIX" => "English (United States, Computer)","en_VC" => "English (St. Vincent & Grenadines)","en_VG" => "English (British Virgin Islands)","en_VI" => "English (U.S. Virgin Islands)","en_VU" => "English (Vanuatu)","en_WS" => "English (Samoa)","en_ZA" => "English (South Africa)","en_ZM" => "English (Zambia)","en_ZW" => "English (Zimbabwe)","eo" => "Esperanto","es" => "Spanish","es_419" => "Spanish (Latin America)","es_AG" => "Spanish (Antigua & Barbuda)","es_AI" => "Spanish (Anguilla)","es_AR" => "Spanish (Argentina)","es_AW" => "Spanish (Aruba)","es_BB" => "Spanish (Barbados)","es_BL" => "Spanish (St. Barthélemy)","es_BM" => "Spanish (Bermuda)","es_BO" => "Spanish (Bolivia)","es_BQ" => "Spanish (Caribbean Netherlands)","es_BR" => "Spanish (Brazil)","es_BS" => "Spanish (Bahamas)","es_BZ" => "Spanish (Belize)","es_CL" => "Spanish (Chile)","es_CO" => "Spanish (Colombia)","es_CR" => "Spanish (Costa Rica)","es_CU" => "Spanish (Cuba)","es_CW" => "Spanish (Curaçao)","es_DM" => "Spanish (Dominica)","es_DO" => "Spanish (Dominican Republic)","es_EA" => "Spanish (Ceuta & Melilla)","es_EC" => "Spanish (Ecuador)","es_ES" => "Spanish (Spain)","es_FK" => "Spanish (Falkland Islands)","es_GD" => "Spanish (Grenada)","es_GF" => "Spanish (French Guiana)","es_GL" => "Spanish (Greenland)","es_GP" => "Spanish (Guadeloupe)","es_GQ" => "Spanish (Equatorial Guinea)","es_GT" => "Spanish (Guatemala)","es_GY" => "Spanish (Guyana)","es_HN" => "Spanish (Honduras)","es_HT" => "Spanish (Haiti)","es_IC" => "Spanish (Canary Islands)","es_KN" => "Spanish (St. Kitts & Nevis)","es_KY" => "Spanish (Cayman Islands)","es_LC" => "Spanish (St. Lucia)","es_MF" => "Spanish (St. Martin)","es_MQ" => "Spanish (Martinique)","es_MS" => "Spanish (Montserrat)","es_MX" => "Spanish (Mexico)","es_NI" => "Spanish (Nicaragua)","es_PA" => "Spanish (Panama)","es_PE" => "Spanish (Peru)","es_PH" => "Spanish (Philippines)","es_PM" => "Spanish (St. Pierre & Miquelon)","es_PR" => "Spanish (Puerto Rico)","es_PY" => "Spanish (Paraguay)","es_SR" => "Spanish (Suriname)","es_SV" => "Spanish (El Salvador)","es_SX" => "Spanish (Sint Maarten)","es_TC" => "Spanish (Turks & Caicos Islands)","es_TT" => "Spanish (Trinidad & Tobago)","es_US" => "Spanish (United States)","es_UY" => "Spanish (Uruguay)","es_VC" => "Spanish (St. Vincent & Grenadines)","es_VE" => "Spanish (Venezuela)","es_VG" => "Spanish (British Virgin Islands)","es_VI" => "Spanish (U.S. Virgin Islands)","et" => "Estonian","et_EE" => "Estonian (Estonia)","eu" => "Basque","eu_ES" => "Basque (Spain)","ewo" => "Ewondo","ewo_CM" => "Ewondo (Cameroon)","fa" => "Persian","fa_AF" => "Persian (Afghanistan)","fa_IR" => "Persian (Iran)","ff" => "Fulah","ff_CM" => "Fulah (Cameroon)","ff_GN" => "Fulah (Guinea)","ff_MR" => "Fulah (Mauritania)","ff_SN" => "Fulah (Senegal)","fi" => "Finnish","fi_FI" => "Finnish (Finland)","fil" => "Filipino","fil_PH" => "Filipino (Philippines)","fo" => "Faroese","fo_DK" => "Faroese (Denmark)","fo_FO" => "Faroese (Faroe Islands)","fr" => "French","fr_BE" => "French (Belgium)","fr_BF" => "French (Burkina Faso)","fr_BI" => "French (Burundi)","fr_BJ" => "French (Benin)","fr_BL" => "French (St. Barthélemy)","fr_CA" => "French (Canada)","fr_CD" => "French (Congo - Kinshasa)","fr_CF" => "French (Central African Republic)","fr_CG" => "French (Congo - Brazzaville)","fr_CH" => "French (Switzerland)","fr_CI" => "French (Côte d’Ivoire)","fr_CM" => "French (Cameroon)","fr_DJ" => "French (Djibouti)","fr_DZ" => "French (Algeria)","fr_FR" => "French (France)","fr_GA" => "French (Gabon)","fr_GF" => "French (French Guiana)","fr_GN" => "French (Guinea)","fr_GP" => "French (Guadeloupe)","fr_GQ" => "French (Equatorial Guinea)","fr_HT" => "French (Haiti)","fr_KM" => "French (Comoros)","fr_LU" => "French (Luxembourg)","fr_MA" => "French (Morocco)","fr_MC" => "French (Monaco)","fr_MF" => "French (St. Martin)","fr_MG" => "French (Madagascar)","fr_ML" => "French (Mali)","fr_MQ" => "French (Martinique)","fr_MR" => "French (Mauritania)","fr_MU" => "French (Mauritius)","fr_NC" => "French (New Caledonia)","fr_NE" => "French (Niger)","fr_PF" => "French (French Polynesia)","fr_PM" => "French (St. Pierre & Miquelon)","fr_RE" => "French (Réunion)","fr_RW" => "French (Rwanda)","fr_SC" => "French (Seychelles)","fr_SN" => "French (Senegal)","fr_SY" => "French (Syria)","fr_TD" => "French (Chad)","fr_TG" => "French (Togo)","fr_TN" => "French (Tunisia)","fr_VU" => "French (Vanuatu)","fr_WF" => "French (Wallis & Futuna)","fr_YT" => "French (Mayotte)","fur" => "Friulian","fur_IT" => "Friulian (Italy)","fy" => "Western Frisian","fy_NL" => "Western Frisian (Netherlands)","ga" => "Irish","ga_IE" => "Irish (Ireland)","gd" => "Scottish Gaelic","gd_GB" => "Scottish Gaelic (United Kingdom)","gl" => "Galician","gl_ES" => "Galician (Spain)","gsw" => "Swiss German","gsw_CH" => "Swiss German (Switzerland)","gsw_FR" => "Swiss German (France)","gsw_LI" => "Swiss German (Liechtenstein)","gu" => "Gujarati","gu_IN" => "Gujarati (India)","guz" => "Gusii","guz_KE" => "Gusii (Kenya)","gv" => "Manx","gv_IM" => "Manx (Isle of Man)","ha" => "Hausa","ha_GH" => "Hausa (Ghana)","ha_NE" => "Hausa (Niger)","ha_NG" => "Hausa (Nigeria)","haw" => "Hawaiian","haw_US" => "Hawaiian (United States)","he" => "Hebrew","he_IL" => "Hebrew (Israel)","hi" => "Hindi","hi_IN" => "Hindi (India)","hr" => "Croatian","hr_BA" => "Croatian (Bosnia & Herzegovina)","hr_HR" => "Croatian (Croatia)","hsb" => "Upper Sorbian","hsb_DE" => "Upper Sorbian (Germany)","hu" => "Hungarian","hu_HU" => "Hungarian (Hungary)","hy" => "Armenian","hy_AM" => "Armenian (Armenia)","id" => "Indonesian","id_ID" => "Indonesian (Indonesia)","ig" => "Igbo","ig_NG" => "Igbo (Nigeria)","ii" => "Sichuan Yi","ii_CN" => "Sichuan Yi (China)","is" => "Icelandic","is_IS" => "Icelandic (Iceland)","it" => "Italian","it_CH" => "Italian (Switzerland)","it_IT" => "Italian (Italy)","it_SM" => "Italian (San Marino)","it_VA" => "Italian (Vatican City)","iu" => "Inuktitut","iu_CA" => "Inuktitut (Canada)","ja" => "Japanese","ja_JP" => "Japanese (Japan)","jgo" => "Ngomba","jgo_CM" => "Ngomba (Cameroon)","jmc" => "Machame","jmc_TZ" => "Machame (Tanzania)","ka" => "Georgian","ka_GE" => "Georgian (Georgia)","kab" => "Kabyle","kab_DZ" => "Kabyle (Algeria)","kam" => "Kamba","kam_KE" => "Kamba (Kenya)","kde" => "Makonde","kde_TZ" => "Makonde (Tanzania)","kea" => "Kabuverdianu","kea_CV" => "Kabuverdianu (Cape Verde)","khq" => "Koyra Chiini","khq_ML" => "Koyra Chiini (Mali)","ki" => "Kikuyu","ki_KE" => "Kikuyu (Kenya)","kk" => "Kazakh","kk_KZ" => "Kazakh (Kazakhstan)","kkj" => "Kako","kkj_CM" => "Kako (Cameroon)","kl" => "Kalaallisut","kl_GL" => "Kalaallisut (Greenland)","kln" => "Kalenjin","kln_KE" => "Kalenjin (Kenya)","km" => "Khmer","km_KH" => "Khmer (Cambodia)","kn" => "Kannada","kn_IN" => "Kannada (India)","ko" => "Korean","ko_KP" => "Korean (North Korea)","ko_KR" => "Korean (South Korea)","kok" => "Konkani","kok_IN" => "Konkani (India)","ks" => "Kashmiri","ks_IN" => "Kashmiri (India)","ksb" => "Shambala","ksb_TZ" => "Shambala (Tanzania)","ksf" => "Bafia","ksf_CM" => "Bafia (Cameroon)","ksh" => "Colognian","ksh_DE" => "Colognian (Germany)","kw" => "Cornish","kw_GB" => "Cornish (United Kingdom)","ky" => "Kyrgyz","ky_KG" => "Kyrgyz (Kyrgyzstan)","lag" => "Langi","lag_TZ" => "Langi (Tanzania)","lb" => "Luxembourgish","lb_LU" => "Luxembourgish (Luxembourg)","lg" => "Ganda","lg_UG" => "Ganda (Uganda)","lkt" => "Lakota","lkt_US" => "Lakota (United States)","ln" => "Lingala","ln_AO" => "Lingala (Angola)","ln_CD" => "Lingala (Congo - Kinshasa)","ln_CF" => "Lingala (Central African Republic)","ln_CG" => "Lingala (Congo - Brazzaville)","lo" => "Lao","lo_LA" => "Lao (Laos)","lrc" => "Northern Luri","lrc_IQ" => "Northern Luri (Iraq)","lrc_IR" => "Northern Luri (Iran)","lt" => "Lithuanian","lt_LT" => "Lithuanian (Lithuania)","lu" => "Luba-Katanga","lu_CD" => "Luba-Katanga (Congo - Kinshasa)","luo" => "Luo","luo_KE" => "Luo (Kenya)","luy" => "Luyia","luy_KE" => "Luyia (Kenya)","lv" => "Latvian","lv_LV" => "Latvian (Latvia)","mas" => "Masai","mas_KE" => "Masai (Kenya)","mas_TZ" => "Masai (Tanzania)","mer" => "Meru","mer_KE" => "Meru (Kenya)","mfe" => "Morisyen","mfe_MU" => "Morisyen (Mauritius)","mg" => "Malagasy","mg_MG" => "Malagasy (Madagascar)","mgh" => "Makhuwa-Meetto","mgh_MZ" => "Makhuwa-Meetto (Mozambique)","mgo" => "Metaʼ","mgo_CM" => "Metaʼ (Cameroon)","mk" => "Macedonian","mk_MK" => "Macedonian (Macedonia)","ml" => "Malayalam","ml_IN" => "Malayalam (India)","mn" => "Mongolian","mn_MN" => "Mongolian (Mongolia)","mr" => "Marathi","mr_IN" => "Marathi (India)","ms" => "Malay","ms_Arab" => "Malay (Arabic)","ms_Arab_BN" => "Malay (Arabic, Brunei)","ms_Arab_MY" => "Malay (Arabic, Malaysia)","ms_BN" => "Malay (Brunei)","ms_MY" => "Malay (Malaysia)","ms_SG" => "Malay (Singapore)","mt" => "Maltese","mt_MT" => "Maltese (Malta)","mua" => "Mundang","mua_CM" => "Mundang (Cameroon)","my" => "Burmese","my_MM" => "Burmese (Myanmar [Burma])","mzn" => "Mazanderani","mzn_IR" => "Mazanderani (Iran)","naq" => "Nama","naq_NA" => "Nama (Namibia)","nb" => "Norwegian Bokmål","nb_NO" => "Norwegian Bokmål (Norway)","nb_SJ" => "Norwegian Bokmål (Svalbard & Jan Mayen)","nd" => "North Ndebele","nd_ZW" => "North Ndebele (Zimbabwe)","nds" => "Low German","nds_DE" => "Low German (Germany)","nds_NL" => "Low German (Netherlands)","ne" => "Nepali","ne_IN" => "Nepali (India)","ne_NP" => "Nepali (Nepal)","nl" => "Dutch","nl_AW" => "Dutch (Aruba)","nl_BE" => "Dutch (Belgium)","nl_BQ" => "Dutch (Caribbean Netherlands)","nl_CW" => "Dutch (Curaçao)","nl_NL" => "Dutch (Netherlands)","nl_SR" => "Dutch (Suriname)","nl_SX" => "Dutch (Sint Maarten)","nmg" => "Kwasio","nmg_CM" => "Kwasio (Cameroon)","nn" => "Norwegian Nynorsk","nn_NO" => "Norwegian Nynorsk (Norway)","nnh" => "Ngiemboon","nnh_CM" => "Ngiemboon (Cameroon)","nus" => "Nuer","nus_SS" => "Nuer (South Sudan)","nyn" => "Nyankole","nyn_UG" => "Nyankole (Uganda)","om" => "Oromo","om_ET" => "Oromo (Ethiopia)","om_KE" => "Oromo (Kenya)","or" => "Odia","or_IN" => "Odia (India)","os" => "Ossetic","os_GE" => "Ossetic (Georgia)","os_RU" => "Ossetic (Russia)","pa" => "Punjabi","pa_Arab" => "Punjabi (Arabic)","pa_Arab_PK" => "Punjabi (Arabic, Pakistan)","pa_Guru" => "Punjabi (Gurmukhi)","pa_Guru_IN" => "Punjabi (Gurmukhi, India)","pl" => "Polish","pl_PL" => "Polish (Poland)","ps" => "Pashto","ps_AF" => "Pashto (Afghanistan)","pt" => "Portuguese","pt_AO" => "Portuguese (Angola)","pt_BR" => "Portuguese (Brazil)","pt_CH" => "Portuguese (Switzerland)","pt_CV" => "Portuguese (Cape Verde)","pt_FR" => "Portuguese (France)","pt_GQ" => "Portuguese (Equatorial Guinea)","pt_GW" => "Portuguese (Guinea-Bissau)","pt_LU" => "Portuguese (Luxembourg)","pt_MO" => "Portuguese (Macau [China])","pt_MZ" => "Portuguese (Mozambique)","pt_PT" => "Portuguese (Portugal)","pt_ST" => "Portuguese (São Tomé & Príncipe)","pt_TL" => "Portuguese (Timor-Leste)","qu" => "Quechua","qu_BO" => "Quechua (Bolivia)","qu_EC" => "Quechua (Ecuador)","qu_PE" => "Quechua (Peru)","rm" => "Romansh","rm_CH" => "Romansh (Switzerland)","rn" => "Rundi","rn_BI" => "Rundi (Burundi)","ro" => "Romanian","ro_MD" => "Romanian (Moldova)","ro_RO" => "Romanian (Romania)","rof" => "Rombo","rof_TZ" => "Rombo (Tanzania)","ru" => "Russian","ru_BY" => "Russian (Belarus)","ru_KG" => "Russian (Kyrgyzstan)","ru_KZ" => "Russian (Kazakhstan)","ru_MD" => "Russian (Moldova)","ru_RU" => "Russian (Russia)","ru_UA" => "Russian (Ukraine)","rw" => "Kinyarwanda","rw_RW" => "Kinyarwanda (Rwanda)","rwk" => "Rwa","rwk_TZ" => "Rwa (Tanzania)","sah" => "Sakha","sah_RU" => "Sakha (Russia)","saq" => "Samburu","saq_KE" => "Samburu (Kenya)","sbp" => "Sangu","sbp_TZ" => "Sangu (Tanzania)","se" => "Northern Sami","se_FI" => "Northern Sami (Finland)","se_NO" => "Northern Sami (Norway)","se_SE" => "Northern Sami (Sweden)","seh" => "Sena","seh_MZ" => "Sena (Mozambique)","ses" => "Koyraboro Senni","ses_ML" => "Koyraboro Senni (Mali)","sg" => "Sango","sg_CF" => "Sango (Central African Republic)","shi" => "Tachelhit","shi_Latn" => "Tachelhit (Latin)","shi_Latn_MA" => "Tachelhit (Latin, Morocco)","shi_Tfng" => "Tachelhit (Tifinagh)","shi_Tfng_MA" => "Tachelhit (Tifinagh, Morocco)","si" => "Sinhala","si_LK" => "Sinhala (Sri Lanka)","sk" => "Slovak","sk_SK" => "Slovak (Slovakia)","sl" => "Slovenian","sl_SI" => "Slovenian (Slovenia)","smn" => "Inari Sami","smn_FI" => "Inari Sami (Finland)","sn" => "Shona","sn_ZW" => "Shona (Zimbabwe)","so" => "Somali","so_DJ" => "Somali (Djibouti)","so_ET" => "Somali (Ethiopia)","so_KE" => "Somali (Kenya)","so_SO" => "Somali (Somalia)","sq" => "Albanian","sq_AL" => "Albanian (Albania)","sq_MK" => "Albanian (Macedonia)","sq_XK" => "Albanian (Kosovo)","sr" => "Serbian","sr_Cyrl" => "Serbian (Cyrillic)","sr_Cyrl_BA" => "Serbian (Cyrillic, Bosnia & Herzegovina)","sr_Cyrl_ME" => "Serbian (Cyrillic, Montenegro)","sr_Cyrl_RS" => "Serbian (Cyrillic, Serbia)","sr_Cyrl_XK" => "Serbian (Cyrillic, Kosovo)","sr_Latn" => "Serbian (Latin)","sr_Latn_BA" => "Serbian (Latin, Bosnia & Herzegovina)","sr_Latn_ME" => "Serbian (Latin, Montenegro)","sr_Latn_RS" => "Serbian (Latin, Serbia)","sr_Latn_XK" => "Serbian (Latin, Kosovo)","sv" => "Swedish","sv_AX" => "Swedish (Åland Islands)","sv_FI" => "Swedish (Finland)","sv_SE" => "Swedish (Sweden)","sw" => "Swahili","sw_CD" => "Swahili (Congo - Kinshasa)","sw_KE" => "Swahili (Kenya)","sw_TZ" => "Swahili (Tanzania)","sw_UG" => "Swahili (Uganda)","ta" => "Tamil","ta_IN" => "Tamil (India)","ta_LK" => "Tamil (Sri Lanka)","ta_MY" => "Tamil (Malaysia)","ta_SG" => "Tamil (Singapore)","te" => "Telugu","te_IN" => "Telugu (India)","teo" => "Teso","teo_KE" => "Teso (Kenya)","teo_UG" => "Teso (Uganda)","tg" => "Tajik","tg_TJ" => "Tajik (Tajikistan)","th" => "Thai","th_TH" => "Thai (Thailand)","ti" => "Tigrinya","ti_ER" => "Tigrinya (Eritrea)","ti_ET" => "Tigrinya (Ethiopia)","tk" => "Turkmen","tk_TM" => "Turkmen (Turkmenistan)","to" => "Tongan","to_TO" => "Tongan (Tonga)","tr" => "Turkish","tr_CY" => "Turkish (Cyprus)","tr_TR" => "Turkish (Turkey)","twq" => "Tasawaq","twq_NE" => "Tasawaq (Niger)","tzm" => "Central Atlas Tamazight","tzm_MA" => "Central Atlas Tamazight (Morocco)","ug" => "Uyghur","ug_CN" => "Uyghur (China)","uk" => "Ukrainian","uk_UA" => "Ukrainian (Ukraine)","ur" => "Urdu","ur_IN" => "Urdu (India)","ur_PK" => "Urdu (Pakistan)","uz" => "Uzbek","uz_Arab" => "Uzbek (Arabic)","uz_Arab_AF" => "Uzbek (Arabic, Afghanistan)","uz_Cyrl" => "Uzbek (Cyrillic)","uz_Cyrl_UZ" => "Uzbek (Cyrillic, Uzbekistan)","uz_Latn" => "Uzbek (Latin)","uz_Latn_UZ" => "Uzbek (Latin, Uzbekistan)","vai" => "Vai","vai_Latn" => "Vai (Latin)","vai_Latn_LR" => "Vai (Latin, Liberia)","vai_Vaii" => "Vai (Vai)","vai_Vaii_LR" => "Vai (Vai, Liberia)","vi" => "Vietnamese","vi_VN" => "Vietnamese (Vietnam)","vun" => "Vunjo","vun_TZ" => "Vunjo (Tanzania)","wae" => "Walser","wae_CH" => "Walser (Switzerland)","xog" => "Soga","xog_UG" => "Soga (Uganda)","yav" => "Yangben","yav_CM" => "Yangben (Cameroon)","yi" => "Yiddish","yi_001" => "Yiddish (World)","yo" => "Yoruba","yo_BJ" => "Yoruba (Benin)","yo_NG" => "Yoruba (Nigeria)","yue" => "Cantonese","yue_Hans" => "Cantonese (Simplified)","yue_Hans_CN" => "Cantonese (Simplified, China)","yue_Hant" => "Cantonese (Traditional)","yue_Hant_HK" => "Cantonese (Traditional, Hong Kong [China])","zgh" => "Standard Moroccan Tamazight","zgh_MA" => "Standard Moroccan Tamazight (Morocco)","zh" => "Chinese","zh_Hans" => "Chinese (Simplified)","zh_Hans_CN" => "Chinese (Simplified, China)","zh_Hans_HK" => "Chinese (Simplified, Hong Kong [China])","zh_Hans_MO" => "Chinese (Simplified, Macau [China])","zh_Hans_SG" => "Chinese (Simplified, Singapore)","zh_Hant" => "Chinese (Traditional)","zh_Hant_HK" => "Chinese (Traditional, Hong Kong [China])","zh_Hant_MO" => "Chinese (Traditional, Macau [China])","zh_Hant_TW" => "Chinese (Traditional, Taiwan)","zu" => "Zulu","zu_ZA" => "Zulu (South Africa)"
89
92
  },
@@ -113,7 +113,6 @@ module RunLoop
113
113
  # @param [RunLoop::Device] device The device under test.
114
114
  # @return [String] The path to the .app bundle if it exists; nil otherwise.
115
115
  def app_container(device, bundle_id)
116
- return nil if !xcode.version_gte_7?
117
116
  cmd = ["simctl", "get_app_container", device.udid, bundle_id]
118
117
  hash = shell_out_with_xcrun(cmd, DEFAULTS)
119
118
 
@@ -152,8 +151,8 @@ module RunLoop
152
151
 
153
152
  exit_status = hash[:exit_status]
154
153
  if exit_status != 0
155
-
156
- if simulator_state_as_int(device) == SIM_STATES["Shutdown"]
154
+ if simulator_state_as_int(device) == SIM_STATES["Shutdown"] ||
155
+ hash[:out][/Unable to shutdown device in current state: Shutdown/]
157
156
  RunLoop.log_debug("simctl shutdown called when state is 'Shutdown'; ignoring error")
158
157
  else
159
158
  raise RuntimeError,
@@ -208,6 +207,49 @@ $ bundle exec run-loop simctl manage-processes
208
207
  in_state
209
208
  end
210
209
 
210
+ def boot(device)
211
+ if simulator_state_as_int(device) == SIM_STATES["Booted"]
212
+ RunLoop.log_debug("Simulator is already Booted")
213
+ true
214
+ else
215
+ cmd = ["simctl", "boot", device.udid]
216
+ hash = shell_out_with_xcrun(cmd, DEFAULTS)
217
+
218
+ exit_status = hash[:exit_status]
219
+ if exit_status != 0
220
+ if simulator_state_as_int(device) == SIM_STATES["Booted"]
221
+ RunLoop.log_debug("simctl boot called when state is 'Booted'; ignoring error")
222
+ else
223
+ raise RuntimeError,
224
+ %Q[Could not boot the simulator:
225
+
226
+ command: xcrun #{cmd.join(" ")}
227
+ simulator: #{device}
228
+ state: #{device.state}
229
+
230
+ #{hash[:out]}
231
+
232
+ This usually means your CoreSimulator processes need to be restarted.
233
+
234
+ You can restart the CoreSimulator processes with this command:
235
+
236
+ $ bundle exec run-loop simctl manage-processes
237
+
238
+ ]
239
+ end
240
+ end
241
+ true
242
+ end
243
+ end
244
+
245
+ # @!visibility private
246
+ def reboot(device)
247
+ shutdown(device)
248
+ wait_for_shutdown(device, DEFAULTS[:timeout], 1.0)
249
+ boot(device)
250
+ device.simulator_wait_for_stable_state
251
+ end
252
+
211
253
  # @!visibility private
212
254
  # Erases the simulator.
213
255
  #
@@ -224,6 +266,10 @@ $ bundle exec run-loop simctl manage-processes
224
266
  shutdown(device)
225
267
  wait_for_shutdown(device, wait_timeout, wait_delay)
226
268
 
269
+ # TODO: when we encounter a "data couldn't be removed because you don't
270
+ # have permission to access it" error" it is possible we can ignore the
271
+ # error.
272
+
227
273
  cmd = ["simctl", "erase", device.udid]
228
274
  hash = shell_out_with_xcrun(cmd, DEFAULTS)
229
275
 
@@ -235,7 +281,7 @@ $ bundle exec run-loop simctl manage-processes
235
281
  command: xcrun #{cmd.join(" ")}
236
282
  simulator: #{device}
237
283
 
238
- #{hash[:out]}
284
+ #{hash[:out]}
239
285
 
240
286
  This usually means your CoreSimulator processes need to be restarted.
241
287
 
@@ -332,6 +378,23 @@ $ bundle exec run-loop simctl manage-processes
332
378
 
333
379
  ]
334
380
  end
381
+
382
+ app_container = app_container(device, app.bundle_identifier)
383
+ if app_container
384
+ RunLoop.log_debug("After uninstall, simctl thinks app container exists")
385
+ if File.exist?(app_container)
386
+ RunLoop.log_debug("App container _does_ exist on disk; deleting it")
387
+ FileUtils.rm_rf(app_container)
388
+ else
389
+ RunLoop.log_debug("App container does _not_ exist on disk")
390
+ end
391
+ RunLoop.log_debug("Rebooting the device")
392
+ reboot(device)
393
+ if app_container(device, app.bundle_identifier)
394
+ raise "simctl uninstall succeeded, but simctl says app is still installed"
395
+ end
396
+ end
397
+
335
398
  true
336
399
  end
337
400
 
@@ -353,11 +416,32 @@ $ bundle exec run-loop simctl manage-processes
353
416
  options = DEFAULTS.dup
354
417
  options[:timeout] = timeout
355
418
 
356
- hash = shell_out_with_xcrun(cmd, options)
419
+ success = false
420
+ tries = 5
421
+ hash = nil
422
+ tries.times do |try|
423
+ hash = shell_out_with_xcrun(cmd, options)
424
+ exit_status = hash[:exit_status]
425
+ if exit_status == 0
426
+ RunLoop.log_debug("Successful install on #{try + 1} of #{tries} attempts")
427
+ success = true
428
+ break
429
+ else
430
+ out = hash[:out]
431
+ if out[/This app could not be installed at this time/]
432
+ RunLoop.log_debug("Install failed on attempt #{try + 1} of #{tries}")
433
+ sleep(1.0)
434
+ else
435
+ # Any other error, fail.
436
+ success = false
437
+ break
438
+ end
439
+ end
440
+ end
357
441
 
358
- exit_status = hash[:exit_status]
359
- if exit_status != 0
360
- raise RuntimeError,
442
+ return true if success
443
+
444
+ raise RuntimeError,
361
445
  %Q[Could not install app on simulator:
362
446
 
363
447
  command: xcrun #{cmd.join(" ")}
@@ -373,29 +457,18 @@ You can restart the CoreSimulator processes with this command:
373
457
  $ bundle exec run-loop simctl manage-processes
374
458
 
375
459
  ]
376
- end
377
- true
378
460
  end
379
461
 
462
+ private
463
+
380
464
  # @!visibility private
381
- #
382
- # SimControl compatibility
383
- def ensure_accessibility(device)
384
- sim_control.ensure_accessibility(device)
385
- end
465
+ attr_reader :ios_devices, :tvos_devices, :watchos_devices, :pbuddy
386
466
 
387
467
  # @!visibility private
388
- #
389
- # TODO Make this private again; exposed for SimControl compatibility.
390
468
  def xcode
391
469
  @xcode ||= RunLoop::Xcode.new
392
470
  end
393
471
 
394
- private
395
-
396
- # @!visibility private
397
- attr_reader :ios_devices, :tvos_devices, :watchos_devices, :pbuddy
398
-
399
472
  # @!visibility private
400
473
  def pbuddy
401
474
  @pbuddy ||= RunLoop::PlistBuddy.new
@@ -430,14 +503,6 @@ $ bundle exec run-loop simctl manage-processes
430
503
  # `@watchos_devices`. Callers should check for existing devices to avoid
431
504
  # the overhead of calling `simctl list devices --json`.
432
505
  def fetch_devices!
433
- if !xcode.version_gte_7?
434
- return {
435
- :ios => sim_control.simulators,
436
- :tvos => [],
437
- :watchos => []
438
- }
439
- end
440
-
441
506
  @ios_devices = []
442
507
  @tvos_devices = []
443
508
  @watchos_devices = []
@@ -564,12 +629,5 @@ is not an iOS, tvOS, or watchOS device"
564
629
  def xcrun
565
630
  @xcrun ||= RunLoop::Xcrun.new
566
631
  end
567
-
568
- # @!visibility private
569
- # Support for Xcode < 7 when trying to collect simulators. Xcode 7 allows
570
- # a --json option which is much easier to parse.
571
- def sim_control
572
- @sim_control ||= RunLoop::SimControl.new
573
- end
574
632
  end
575
633
  end
@@ -48,6 +48,21 @@ must exist and not be a directory.
48
48
  end
49
49
  end
50
50
 
51
+ # @!visibility private
52
+ #
53
+ # @return [RunLoop::Version] A version instance or nil if the file
54
+ # at path does not contain server version information.
55
+ def server_id
56
+ regex = /LPSERVERID=[a-f0-9]{40}(-dirty)?/
57
+ match = dump[regex, 0]
58
+
59
+ if match
60
+ match.split("=")[1]
61
+ else
62
+ nil
63
+ end
64
+ end
65
+
51
66
  private
52
67
 
53
68
  # @!visibility private
@@ -1,5 +1,5 @@
1
1
  module RunLoop
2
- VERSION = "2.7.1"
2
+ VERSION = "3.0.0"
3
3
 
4
4
  # A model of a software release version that can be used to compare two versions.
5
5
  #
@@ -26,6 +26,14 @@ module RunLoop
26
26
  to_s
27
27
  end
28
28
 
29
+ # Returns a version instance for Xcode 10.0; used to check for the
30
+ # availability of features and paths to various items on the filesystem
31
+ #
32
+ # @return [RunLoop::Version] 10.0
33
+ def v100
34
+ fetch_version(:v100)
35
+ end
36
+
29
37
  # Returns a version instance for Xcode 9.4; used to check for the
30
38
  # availability of features and paths to various items on the filesystem
31
39
  #
@@ -98,97 +106,16 @@ module RunLoop
98
106
  fetch_version(:v80)
99
107
  end
100
108
 
101
- # Returns a version instance for `Xcode 7.3`; used to check for the
102
- # availability of features and paths to various items on the filesystem.
103
- #
104
- # @return [RunLoop::Version] 7.3
105
- def v73
106
- fetch_version(:v73)
107
- end
108
-
109
- # Returns a version instance for `Xcode 7.2`; used to check for the
110
- # availability of features and paths to various items on the filesystem.
111
- #
112
- # @return [RunLoop::Version] 7.2
113
- def v72
114
- fetch_version(:v72)
115
- end
116
-
117
- # Returns a version instance for `Xcode 7.1`; used to check for the
118
- # availability of features and paths to various items on the filesystem.
119
- #
120
- # @return [RunLoop::Version] 7.1
121
- def v71
122
- fetch_version(:v71)
123
- end
124
-
125
- # Returns a version instance for `Xcode 7.0`; used to check for the
126
- # availability of features and paths to various items on the filesystem.
127
- #
128
- # @return [RunLoop::Version] 7.0
129
- def v70
130
- fetch_version(:v70)
131
- end
132
-
133
- # Returns a version instance for `Xcode 6.4`; used to check for the
134
- # availability of features and paths to various items on the filesystem.
135
- #
136
- # @return [RunLoop::Version] 6.4
137
- def v64
138
- fetch_version(:v64)
139
- end
140
-
141
- # Returns a version instance for `Xcode 6.3`; used to check for the
142
- # availability of features and paths to various items on the filesystem.
109
+ # Is the active Xcode version 10.0 or above?
143
110
  #
144
- # @return [RunLoop::Version] 6.3
145
- def v63
146
- fetch_version(:v63)
111
+ # @return [Boolean] `true` if the current Xcode version is >= 10.0
112
+ def version_gte_100?
113
+ version >= v100
147
114
  end
148
115
 
149
- # Returns a version instance for `Xcode 6.2`; used to check for the
150
- # availability of features and paths to various items on the filesystem.
151
- #
152
- # @return [RunLoop::Version] 6.2
153
- def v62
154
- fetch_version(:v62)
155
- end
156
-
157
- # Returns a version instance for `Xcode 6.1`; used to check for the
158
- # availability of features and paths to various items on the filesystem.
159
- #
160
- # @return [RunLoop::Version] 6.1
161
- def v61
162
- fetch_version(:v61)
163
- end
164
-
165
- # Returns a version instance for `Xcode 6.0`; used to check for the
166
- # availability of features and paths to various items on the filesystem.
167
- #
168
- # @return [RunLoop::Version] 6.0
169
- def v60
170
- fetch_version(:v60)
171
- end
172
-
173
- # Returns a version instance for `Xcode 5.1`; used to check for the
174
- # availability of features and paths to various items on the filesystem.
175
- #
176
- # @return [RunLoop::Version] 5.1
177
- def v51
178
- fetch_version(:v51)
179
- end
180
-
181
- # Returns a version instance for `Xcode 5.0`; used to check for the
182
- # availability of features and paths to various items on the filesystem.
116
+ # Is the active Xcode version 9.4 or above?
183
117
  #
184
- # @return [RunLoop::Version] 5.0
185
- def v50
186
- fetch_version(:v50)
187
- end
188
-
189
- # Is the active Xcode version 9.3 or above?
190
- #
191
- # @return [Boolean] `true` if the current Xcode version is >= 9.3
118
+ # @return [Boolean] `true` if the current Xcode version is >= 9.4
192
119
  def version_gte_94?
193
120
  version >= v94
194
121
  end
@@ -249,78 +176,6 @@ module RunLoop
249
176
  version >= v80
250
177
  end
251
178
 
252
- # Is the active Xcode version 7.3 or above?
253
- #
254
- # @return [Boolean] `true` if the current Xcode version is >= 7.3
255
- def version_gte_73?
256
- version >= v73
257
- end
258
-
259
- # Is the active Xcode version 7.2 or above?
260
- #
261
- # @return [Boolean] `true` if the current Xcode version is >= 7.2
262
- def version_gte_72?
263
- version >= v72
264
- end
265
-
266
- # Is the active Xcode version 7.1 or above?
267
- #
268
- # @return [Boolean] `true` if the current Xcode version is >= 7.1
269
- def version_gte_71?
270
- version >= v71
271
- end
272
-
273
- # Is the active Xcode version 7 or above?
274
- #
275
- # @return [Boolean] `true` if the current Xcode version is >= 7.0
276
- def version_gte_7?
277
- version >= v70
278
- end
279
-
280
- # Is the active Xcode version 6.4 or above?
281
- #
282
- # @return [Boolean] `true` if the current Xcode version is >= 6.4
283
- def version_gte_64?
284
- version >= v64
285
- end
286
-
287
- # Is the active Xcode version 6.3 or above?
288
- #
289
- # @return [Boolean] `true` if the current Xcode version is >= 6.3
290
- def version_gte_63?
291
- version >= v63
292
- end
293
-
294
- # Is the active Xcode version 6.2 or above?
295
- #
296
- # @return [Boolean] `true` if the current Xcode version is >= 6.2
297
- def version_gte_62?
298
- version >= v62
299
- end
300
-
301
- # Is the active Xcode version 6.1 or above?
302
- #
303
- # @return [Boolean] `true` if the current Xcode version is >= 6.1
304
- def version_gte_61?
305
- version >= v61
306
- end
307
-
308
- # Is the active Xcode version 6 or above?
309
- #
310
- # @return [Boolean] `true` if the current Xcode version is >= 6.0
311
- def version_gte_6?
312
- version >= v60
313
- end
314
-
315
- # @deprecated 2.1.0
316
- # Is the active Xcode version 5.1 or above?
317
- #
318
- # @return [Boolean] `true` if the current Xcode version is >= 5.1
319
- def version_gte_51?
320
- #RunLoop.deprecated("2.1.0", "No replacement")
321
- version >= v51
322
- end
323
-
324
179
  # Returns the current version of Xcode.
325
180
  #
326
181
  # @return [RunLoop::Version] The current version of Xcode as reported by
@@ -427,7 +282,7 @@ $ man xcode-select
427
282
 
428
283
  string = key.to_s
429
284
  string[0] = ''
430
- version_string = string.split(/(?!^)/).join('.')
285
+ version_string = string.split(/^(10)*|(?!^)/).reject(&:empty?).join('.')
431
286
  version = RunLoop::Version.new(version_string)
432
287
  xcode_versions[key] = version
433
288
  version
@@ -435,19 +290,31 @@ $ man xcode-select
435
290
 
436
291
  def ensure_valid_version_key(key)
437
292
  string = key.to_s
438
- if string.length != 3
439
- raise "Expected version key '#{key}' to have exactly 3 characters"
293
+
294
+ if !string.start_with?("v")
295
+ raise "Expected version key to start with 'v'"
440
296
  end
441
297
 
442
- unless string[/v\d{2}/, 0]
443
- raise "Expected version key '#{key}' to match vXX pattern"
298
+ if string.start_with?("v10")
299
+ expected_length = 4
300
+ regex = /v\d{3}/
301
+ else
302
+ expected_length = 3
303
+ regex = /v\d{2}/
304
+ end
305
+
306
+ if string.length != expected_length
307
+ raise "Expected version key '#{key}' to be exactly #{expected_length} chars long"
308
+ end
309
+
310
+ if !string[regex]
311
+ raise "Expected version key '#{key}' to match this pattern: #{regex}"
444
312
  end
445
313
  end
446
314
 
447
315
  def xcode_select_path
448
- Open3.popen3('xcode-select', '--print-path') do |_, stdout, _, _|
449
- stdout.read.chomp
450
- end
316
+ hash = run_shell_command(["xcode-select", "--print-path"], {log_cmd: true})
317
+ hash[:out].chomp
451
318
  end
452
319
  end
453
320
  end