cupertino 0.8.1 → 0.9.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 0f34dafa2ee7735e8e2cfbbf1c288646d89d2630
4
- data.tar.gz: 6cfae45ba3385252735c66ead7b958e48c8b2ebd
3
+ metadata.gz: f2fe21bc508207cbfaf9d5a89cec2ff1b4371126
4
+ data.tar.gz: 87a5b6c64e5e0282986bcc0da0b47aa04dcf6d4c
5
5
  SHA512:
6
- metadata.gz: ce67fee76f47e88958ad9be8e82cfc35032153ab25e30f98ce93d162d3c300a91d6c0b5bc9e56885fbd588845725a61f6a1eedd1823be9be9e5902b002b90a58
7
- data.tar.gz: fe06155709eeda1854b2c490ad0c644d506b04958f8b8ef09e573753c651e486e6c4fb1663417c5892148b0bc24adba8b9d2af713661577827c021459e9e61b2
6
+ metadata.gz: e1cd6cc09b28b4aeee344a2727f53fc51edab09162811708614f66f64263277edca0fc958c23ef366c0a7d946e162ad70490cc377eca534d05691f16ce210193
7
+ data.tar.gz: f9a84ebc0faf92930ec89ab5e08f7c8659140d1193c5d7528d0b7d2b297f146bb3dec5890f9fd2b92909fa5c83ca76fdeee5025660a607e0e3a4527c12795143
data/Gemfile.lock CHANGED
@@ -1,10 +1,11 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- cupertino (0.8.1)
4
+ cupertino (0.9.0)
5
5
  certified (>= 0.1.0)
6
6
  commander (~> 4.1.2)
7
7
  mechanize (~> 2.5.1)
8
+ nokogiri (~> 1.5.9)
8
9
  security (~> 0.1.2)
9
10
  shenzhen (>= 0.0.1)
10
11
  term-ansicolor (~> 1.0.7)
@@ -14,16 +15,17 @@ GEM
14
15
  remote: https://rubygems.org/
15
16
  specs:
16
17
  certified (0.1.1)
17
- commander (4.1.3)
18
+ commander (4.1.5)
18
19
  highline (~> 1.6.11)
19
- domain_name (0.5.7)
20
- unf (~> 0.0.3)
21
- faraday (0.8.7)
22
- multipart-post (~> 1.1)
23
- faraday_middleware (0.8.8)
20
+ domain_name (0.5.12)
21
+ unf (>= 0.0.5, < 1.0.0)
22
+ dotenv (0.9.0)
23
+ faraday (0.8.8)
24
+ multipart-post (~> 1.2.0)
25
+ faraday_middleware (0.9.0)
24
26
  faraday (>= 0.7.4, < 0.9)
25
- highline (1.6.18)
26
- json (1.7.7)
27
+ highline (1.6.19)
28
+ json (1.8.0)
27
29
  mechanize (2.5.1)
28
30
  domain_name (~> 0.5, >= 0.5.1)
29
31
  mime-types (~> 1.17, >= 1.17.2)
@@ -32,26 +34,27 @@ GEM
32
34
  nokogiri (~> 1.4)
33
35
  ntlm-http (~> 0.1, >= 0.1.1)
34
36
  webrobots (~> 0.0, >= 0.0.9)
35
- mime-types (1.23)
37
+ mime-types (1.25)
36
38
  multipart-post (1.2.0)
37
- net-http-digest_auth (1.2.1)
39
+ net-http-digest_auth (1.3)
38
40
  net-http-persistent (2.8)
39
- nokogiri (1.5.9)
41
+ nokogiri (1.5.10)
40
42
  ntlm-http (0.1.1)
41
43
  rake (0.9.2.2)
42
44
  rspec (0.6.4)
43
45
  security (0.1.2)
44
- shenzhen (0.3.0)
45
- commander (~> 4.1.2)
46
- faraday (~> 0.8.0)
47
- faraday_middleware (~> 0.8.7)
48
- json (~> 1.7.3)
46
+ shenzhen (0.4.0)
47
+ commander (~> 4.1)
48
+ dotenv (~> 0.7)
49
+ faraday (~> 0.8)
50
+ faraday_middleware (~> 0.9)
51
+ json (~> 1.8)
49
52
  term-ansicolor (1.0.7)
50
53
  terminal-table (1.4.5)
51
- unf (0.0.5)
54
+ unf (0.1.1)
52
55
  unf_ext
53
- unf_ext (0.0.5)
54
- webrobots (0.0.13)
56
+ unf_ext (0.0.6)
57
+ webrobots (0.1.1)
55
58
 
56
59
  PLATFORMS
57
60
  ruby
data/README.md CHANGED
@@ -1,5 +1,4 @@
1
- # Cupertino
2
- **CLI for the Apple Dev Center**
1
+ ![Cupertino](https://raw.github.com/mattt/nomad-cli.com/assets/cupertino-banner.png)
3
2
 
4
3
  Automate administrative tasks that you would normally have to do through the Apple Dev Center websites. Life's too short to manage device identifiers by hand!
5
4
 
@@ -100,6 +99,7 @@ _Removes (without an editor) a list of devices from a provisioning profile_
100
99
  - `profiles:manage:devices:add`
101
100
  - `profiles:manage:devices:remove`
102
101
  - `profiles:download`
102
+ - `profiles:download:all`
103
103
  - `certificates:list [development|distribution]`
104
104
  - `certificates:download`
105
105
  - `app_ids:list`
@@ -114,6 +114,10 @@ _Removes (without an editor) a list of devices from a provisioning profile_
114
114
  - `pass_type_ids:certificates:add`
115
115
  - `pass_type_ids:certificates:download`
116
116
 
117
+ ## Proxies
118
+
119
+ Cupertino will access the provisioning portal through a proxy if the `HTTP_PROXY` environment variable is set, with optional credentials `HTTP_PROXY_USER` and `HTTP_PROXY_PASSWORD`.
120
+
117
121
  ## Contact
118
122
 
119
123
  Mattt Thompson
data/cupertino.gemspec CHANGED
@@ -1,5 +1,6 @@
1
1
  # -*- encoding: utf-8 -*-
2
2
  $:.push File.expand_path("../lib", __FILE__)
3
+
3
4
  require "cupertino"
4
5
 
5
6
  Gem::Specification.new do |s|
@@ -17,6 +18,7 @@ Gem::Specification.new do |s|
17
18
  s.add_dependency "terminal-table", "~> 1.4.5"
18
19
  s.add_dependency "term-ansicolor", "~> 1.0.7"
19
20
  s.add_dependency "mechanize", "~> 2.5.1"
21
+ s.add_dependency "nokogiri", "~> 1.5.9"
20
22
  s.add_dependency "security", "~> 0.1.2"
21
23
  s.add_dependency "shenzhen", ">= 0.0.1"
22
24
  s.add_dependency "certified", ">= 0.1.0"
@@ -1,5 +1,6 @@
1
1
  require 'mechanize'
2
2
  require 'security'
3
+ require 'uri'
3
4
  require 'json'
4
5
 
5
6
  module Cupertino
@@ -9,8 +10,17 @@ module Cupertino
9
10
 
10
11
  def initialize
11
12
  super
13
+
12
14
  self.user_agent_alias = 'Mac Safari'
13
15
 
16
+ if ENV['HTTP_PROXY']
17
+ uri = URI.parse(ENV['HTTP_PROXY'])
18
+ user = ENV['HTTP_PROXY_USER'] if ENV['HTTP_PROXY_USER']
19
+ password = ENV['HTTP_PROXY_PASSWORD'] if ENV['HTTP_PROXY_PASSWORD']
20
+
21
+ set_proxy(uri.host, uri.port, user || uri.user, password || uri.password)
22
+ end
23
+
14
24
  pw = Security::InternetPassword.find(:server => Cupertino::ProvisioningPortal::HOST)
15
25
  @username, @password = pw.attributes['acct'], pw.password if pw
16
26
  end
@@ -24,12 +34,12 @@ module Cupertino
24
34
  return page unless page.respond_to?(:title)
25
35
 
26
36
  case page.title
27
- when /Sign in with your Apple ID/
28
- login! and redo
29
- when /Select Team/
30
- select_team! and redo
31
- else
32
- return page
37
+ when /Sign in with your Apple ID/
38
+ login! and redo
39
+ when /Select Team/
40
+ select_team! and redo
41
+ else
42
+ return page
33
43
  end
34
44
  end
35
45
 
@@ -38,13 +48,13 @@ module Cupertino
38
48
 
39
49
  def list_certificates(type = :development)
40
50
  url = case type
41
- when :development
42
- "https://developer.apple.com/account/ios/certificate/certificateList.action?type=development"
43
- when :distribution
44
- "https://developer.apple.com/account/ios/certificate/certificateList.action?type=distribution"
45
- else
46
- raise ArgumentError, "Certificate type must be :development or :distribution"
47
- end
51
+ when :development
52
+ "https://developer.apple.com/account/ios/certificate/certificateList.action?type=development"
53
+ when :distribution
54
+ "https://developer.apple.com/account/ios/certificate/certificateList.action?type=distribution"
55
+ else
56
+ raise ArgumentError, "Certificate type must be :development or :distribution"
57
+ end
48
58
 
49
59
  get(url)
50
60
 
@@ -59,7 +69,7 @@ module Cupertino
59
69
 
60
70
  certificate_data_url += certificate_request_types + certificate_statuses
61
71
 
62
- get(certificate_data_url)
72
+ post(certificate_data_url)
63
73
  certificate_data = page.content
64
74
  parsed_certificate_data = JSON.parse(certificate_data)
65
75
 
@@ -81,7 +91,7 @@ module Cupertino
81
91
  list_certificates(certificate.type)
82
92
 
83
93
  self.pluggable_parser.default = Mechanize::Download
84
- download = get(certificate.download_url)
94
+ download = post(certificate.download_url)
85
95
  download.save
86
96
  download.filename
87
97
  end
@@ -92,7 +102,8 @@ module Cupertino
92
102
  regex = /deviceDataURL = "([^"]*)"/
93
103
  device_data_url = (page.body.match regex or raise UnexpectedContentError)[1]
94
104
 
95
- get(device_data_url)
105
+ post(device_data_url)
106
+
96
107
  device_data = page.content
97
108
  parsed_device_data = JSON.parse(device_data)
98
109
 
@@ -101,6 +112,7 @@ module Cupertino
101
112
  device = Device.new
102
113
  device.name = row['name']
103
114
  device.udid = row['deviceNumber'] # Apple doesn't provide the UDID on this page anymore
115
+ device.enabled = (row['status'] == 'c' ? 'Y' : 'N')
104
116
  devices << device
105
117
  end
106
118
 
@@ -153,6 +165,7 @@ module Cupertino
153
165
  raise ArgumentError, 'Provisioning profile type must be :development or :distribution'
154
166
  end
155
167
 
168
+ self.pluggable_parser.default = Mechanize::File
156
169
  get(url)
157
170
 
158
171
  regex = /profileDataURL = "([^"]*)"/
@@ -165,7 +178,8 @@ module Cupertino
165
178
  '&type=production'
166
179
  end
167
180
 
168
- get(profile_data_url)
181
+ post(profile_data_url)
182
+
169
183
  profile_data = page.content
170
184
  parsed_profile_data = JSON.parse(profile_data)
171
185
 
@@ -236,7 +250,7 @@ module Cupertino
236
250
  regex = /bundleDataURL = "([^"]*)"/
237
251
  bundle_data_url = (page.body.match regex or raise UnexpectedContentError)[1]
238
252
 
239
- get(bundle_data_url)
253
+ post(bundle_data_url)
240
254
  bundle_data = page.content
241
255
  parsed_bundle_data = JSON.parse(bundle_data)
242
256
 
@@ -277,7 +291,6 @@ module Cupertino
277
291
 
278
292
  def select_team!
279
293
  if form = page.form_with(:name => 'saveTeamSelection')
280
- # self.team now stores team ID, not name
281
294
  team_option = form.radiobutton_with(:value => self.team)
282
295
  team_option.check
283
296
 
@@ -9,17 +9,19 @@ command :'devices:list' do |c|
9
9
  number_of_devices = devices.compact.length
10
10
  number_of_additional_devices = devices.length - number_of_devices
11
11
 
12
- title = "Listing #{pluralize(number_of_devices, 'device')}. "
13
- title += "You can register #{pluralize(number_of_additional_devices, 'additional device')}." if number_of_additional_devices > 0
12
+ title = "Listing #{pluralize(number_of_devices, 'device')} "
13
+ title += "(You can register #{pluralize(number_of_additional_devices, 'additional device')})" if number_of_additional_devices > 0
14
14
 
15
15
  table = Terminal::Table.new :title => title do |t|
16
- t << ["Device Name", "Device Identifier"]
16
+ t << ["Device Name", "Device Identifier", "Enabled"]
17
17
  t.add_separator
18
18
  devices.compact.each do |device|
19
- t << [device.name, device.udid]
19
+ t << [device.name, device.udid, device.enabled]
20
20
  end
21
21
  end
22
22
 
23
+ table.align_column 2, :center
24
+
23
25
  puts table
24
26
  end
25
27
  end
@@ -40,11 +42,12 @@ command :'devices:add' do |c|
40
42
  device = Device.new
41
43
  device.name = components.first
42
44
  device.udid = components.last
45
+ say_warning "Invalid UDID: #{device.udid}" and next unless /\h{40}/ === device.udid
43
46
  devices << device
44
47
  end
45
48
 
46
49
  agent.add_devices(*devices)
47
50
 
48
- say_ok "Added #{devices.length} #{devices.length == 1 ? 'device' : 'devices'}"
51
+ say_ok "Added #{pluralize(devices.length, 'device')}"
49
52
  end
50
53
  end
@@ -1,11 +1,13 @@
1
1
  command :'profiles:list' do |c|
2
- c.syntax = 'ios profiles:list [development|distribution]'
2
+ c.syntax = 'ios profiles:list'
3
3
  c.summary = 'Lists the Provisioning Profiles'
4
4
  c.description = ''
5
5
 
6
+ c.option '-t', '--type [TYPE]', [:development, :distribution], "Type of profile"
7
+
6
8
  c.action do |args, options|
7
- type = args.first.downcase.to_sym rescue nil
8
- profiles = try{agent.list_profiles(type ||= :development)}
9
+ type = options.type || :development
10
+ profiles = try{agent.list_profiles(type)}
9
11
 
10
12
  say_warning "No #{type} provisioning profiles found." and abort if profiles.empty?
11
13
 
@@ -31,17 +33,24 @@ end
31
33
  alias_command :profiles, :'profiles:list'
32
34
 
33
35
  command :'profiles:download' do |c|
34
- c.syntax = 'ios profiles:download'
36
+ c.syntax = 'ios profiles:download [PROFILE_NAME]'
35
37
  c.summary = 'Downloads the Provisioning Profiles'
36
38
  c.description = ''
37
39
 
40
+ c.option '-t', '--type [TYPE]', [:development, :distribution], "Type of profile"
41
+
38
42
  c.action do |args, options|
39
- type = args.first.downcase.to_sym rescue nil
40
- profiles = try{agent.list_profiles(type ||= :development)}
41
- profiles = profiles.find_all{|profile| profile.status == 'Active'}
43
+ type = options.type || :development
44
+ profiles = try{agent.list_profiles(type)}
45
+ profiles = profiles.select{|profile| profile.status == 'Active'}
42
46
 
43
47
  say_warning "No active #{type} profiles found." and abort if profiles.empty?
44
- profile = choose "Select a profile to download:", *profiles
48
+
49
+ name = args.join(" ")
50
+ unless profile = profiles.detect{|p| p.name == name}
51
+ profile = choose "Select a profile to download:", *profiles
52
+ end
53
+
45
54
  if filename = agent.download_profile(profile)
46
55
  say_ok "Successfully downloaded: '#{filename}'"
47
56
  else
@@ -50,16 +59,43 @@ command :'profiles:download' do |c|
50
59
  end
51
60
  end
52
61
 
62
+ command :'profiles:download:all' do |c|
63
+ c.syntax = 'ios profiles:download:all'
64
+ c.summary = 'Downloads all the active Provisioning Profiles'
65
+ c.description = ''
66
+
67
+ c.option '-t', '--type [TYPE]', [:development, :distribution], "Type of profile"
68
+
69
+ c.action do |args, options|
70
+ type = options.type || :development
71
+ profiles = try{agent.list_profiles(type)}
72
+ profiles = profiles.select{|profile| profile.status == 'Active'}
73
+
74
+ say_warning "No active #{type} profiles found." and abort if profiles.empty?
75
+ profiles.each do |profile|
76
+ if filename = agent.download_profile(profile)
77
+ say_ok "Successfully downloaded: '#{filename}'"
78
+ else
79
+ say_error "Could not download profile: '#{profile.name}'"
80
+ end
81
+ end
82
+ end
83
+ end
84
+
53
85
  command :'profiles:manage:devices' do |c|
54
86
  c.syntax = 'ios profiles:manage:devices'
55
87
  c.summary = 'Manage active devices for a development provisioning profile'
56
88
  c.description = ''
57
89
 
90
+ c.option '-t', '--type [TYPE]', [:development, :distribution], "Type of profile"
91
+
58
92
  c.action do |args, options|
59
- type = args.first.downcase.to_sym rescue nil
60
- profiles = try{agent.list_profiles(type ||= :development)}
93
+ type = options.type || :development
94
+ profiles = try{agent.list_profiles(type)}
61
95
 
62
- say_warning "No #{type} provisioning profiles found." and abort if profiles.empty?
96
+ profiles.delete_if{|profile| profile.status == "Invalid"}
97
+
98
+ say_warning "No valid #{type} provisioning profiles found." and abort if profiles.empty?
63
99
 
64
100
  profile = choose "Select a provisioning profile to manage:", *profiles
65
101
 
@@ -99,16 +135,16 @@ command :'profiles:manage:devices:add' do |c|
99
135
 
100
136
  say_warning "No provisioning profiles named #{args.first} were found." and abort unless profile
101
137
 
102
- devices = []
103
- args[1..-1].each do |arg|
104
- components = arg.strip.gsub(/\"/, '').split(/\=/)
105
- device = Device.new
106
- device.name = components.first
107
- device.udid = components.last
108
- devices << device
109
- end
110
-
111
138
  agent.manage_devices_for_profile(profile) do |on, off|
139
+ names = args[1..-1].collect{|arg| arg.sub /\=.*/, ''}
140
+ devices = []
141
+
142
+ names.each do |name|
143
+ device = (on + off).detect{|d| d.name === name}
144
+ say_warning "No device named #{name} was found." and abort unless device
145
+ devices << Device.new(name, device.udid)
146
+ end
147
+
112
148
  on + devices
113
149
  end
114
150
 
@@ -129,17 +165,10 @@ command :'profiles:manage:devices:remove' do |c|
129
165
 
130
166
  say_warning "No provisioning profiles named #{args.first} were found." and abort unless profile
131
167
 
132
- devices = []
133
- args[1..-1].each do |arg|
134
- components = arg.strip.gsub(/\"/, '').split(/\=/)
135
- device = Device.new
136
- device.name = components.first
137
- device.udid = components.last
138
- devices << device
139
- end
168
+ names = args[1..-1].collect{|arg| arg.gsub /\=.*/, ''}
140
169
 
141
170
  agent.manage_devices_for_profile(profile) do |on, off|
142
- on.delete_if {|active| devices.any? {|inactive| inactive.udid == active.udid }}
171
+ on.delete_if{|active| names.include?(active.name)}
143
172
  end
144
173
 
145
174
  say_ok "Successfully removed devices from #{args.first}."
@@ -1,6 +1,10 @@
1
1
  include Cupertino::ProvisioningPortal
2
2
  include Cupertino::ProvisioningPortal::Helpers
3
3
 
4
+ global_option('-u', '--username USER', 'Username') { |arg| agent.username = arg unless arg.nil? }
5
+ global_option('-p', '--password PASSWORD', 'Password') { |arg| agent.password = arg unless arg.nil? }
6
+ global_option('-tm', '--team TEAM', 'Team') { |arg| agent.team = arg unless arg.nil? }
7
+
4
8
  require 'cupertino/provisioning_portal/commands/certificates'
5
9
  require 'cupertino/provisioning_portal/commands/devices'
6
10
  require 'cupertino/provisioning_portal/commands/profiles'
@@ -24,14 +24,14 @@ module Cupertino
24
24
  end
25
25
 
26
26
  def team
27
- teams_by_name = {}
27
+ teams = []
28
28
  page.form_with(:name => 'saveTeamSelection').radiobuttons.each do |radio|
29
29
  name = page.search("label[for=\"#{radio.dom_id}\"]").first.text.strip
30
- teams_by_name[name] = radio.value
30
+ teams << [name, radio.value]
31
31
  end
32
32
 
33
- name = choose "Select a team:", *teams_by_name.keys
34
- @team ||= teams_by_name[name]
33
+ name = choose "Select a team:", *teams.collect(&:first)
34
+ @team ||= teams.detect{|e| e.first == name}.last
35
35
  end
36
36
  end
37
37
  end
@@ -8,9 +8,9 @@ module Cupertino
8
8
  class UnsuccessfulAuthenticationError < RuntimeError; end
9
9
  class UnexpectedContentError < RuntimeError; end
10
10
 
11
- class Device < Struct.new(:name, :udid)
11
+ class Device < Struct.new(:name, :udid, :enabled)
12
12
  def to_s
13
- "#{self.name} #{self.udid}"
13
+ "#{self.name} #{self.udid} #{self.enabled}"
14
14
  end
15
15
  end
16
16
 
data/lib/cupertino.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module Cupertino
2
- VERSION = '0.8.1'
2
+ VERSION = '0.9.0'
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: cupertino
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.8.1
4
+ version: 0.9.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Mattt Thompson
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2013-05-02 00:00:00.000000000 Z
11
+ date: 2013-10-04 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: commander
@@ -66,6 +66,20 @@ dependencies:
66
66
  - - ~>
67
67
  - !ruby/object:Gem::Version
68
68
  version: 2.5.1
69
+ - !ruby/object:Gem::Dependency
70
+ name: nokogiri
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - ~>
74
+ - !ruby/object:Gem::Version
75
+ version: 1.5.9
76
+ type: :runtime
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - ~>
81
+ - !ruby/object:Gem::Version
82
+ version: 1.5.9
69
83
  - !ruby/object:Gem::Dependency
70
84
  name: security
71
85
  requirement: !ruby/object:Gem::Requirement
@@ -84,56 +98,56 @@ dependencies:
84
98
  name: shenzhen
85
99
  requirement: !ruby/object:Gem::Requirement
86
100
  requirements:
87
- - - ! '>='
101
+ - - '>='
88
102
  - !ruby/object:Gem::Version
89
103
  version: 0.0.1
90
104
  type: :runtime
91
105
  prerelease: false
92
106
  version_requirements: !ruby/object:Gem::Requirement
93
107
  requirements:
94
- - - ! '>='
108
+ - - '>='
95
109
  - !ruby/object:Gem::Version
96
110
  version: 0.0.1
97
111
  - !ruby/object:Gem::Dependency
98
112
  name: certified
99
113
  requirement: !ruby/object:Gem::Requirement
100
114
  requirements:
101
- - - ! '>='
115
+ - - '>='
102
116
  - !ruby/object:Gem::Version
103
117
  version: 0.1.0
104
118
  type: :runtime
105
119
  prerelease: false
106
120
  version_requirements: !ruby/object:Gem::Requirement
107
121
  requirements:
108
- - - ! '>='
122
+ - - '>='
109
123
  - !ruby/object:Gem::Version
110
124
  version: 0.1.0
111
125
  - !ruby/object:Gem::Dependency
112
126
  name: rspec
113
127
  requirement: !ruby/object:Gem::Requirement
114
128
  requirements:
115
- - - ! '>='
129
+ - - '>='
116
130
  - !ruby/object:Gem::Version
117
131
  version: '0'
118
132
  type: :development
119
133
  prerelease: false
120
134
  version_requirements: !ruby/object:Gem::Requirement
121
135
  requirements:
122
- - - ! '>='
136
+ - - '>='
123
137
  - !ruby/object:Gem::Version
124
138
  version: '0'
125
139
  - !ruby/object:Gem::Dependency
126
140
  name: rake
127
141
  requirement: !ruby/object:Gem::Requirement
128
142
  requirements:
129
- - - ! '>='
143
+ - - '>='
130
144
  - !ruby/object:Gem::Version
131
145
  version: '0'
132
146
  type: :development
133
147
  prerelease: false
134
148
  version_requirements: !ruby/object:Gem::Requirement
135
149
  requirements:
136
- - - ! '>='
150
+ - - '>='
137
151
  - !ruby/object:Gem::Version
138
152
  version: '0'
139
153
  description: A command-line interface for the iOS Provisioning Portal
@@ -171,12 +185,12 @@ require_paths:
171
185
  - lib
172
186
  required_ruby_version: !ruby/object:Gem::Requirement
173
187
  requirements:
174
- - - ! '>='
188
+ - - '>='
175
189
  - !ruby/object:Gem::Version
176
190
  version: '0'
177
191
  required_rubygems_version: !ruby/object:Gem::Requirement
178
192
  requirements:
179
- - - ! '>='
193
+ - - '>='
180
194
  - !ruby/object:Gem::Version
181
195
  version: '0'
182
196
  requirements: []