pem 0.3.3 → 0.3.4

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 19138a0a09162ae6c18b6a176bdeb92f1b1021b6
4
- data.tar.gz: 0814e925bb65d0defb24b03ab3056415ba1e3c88
3
+ metadata.gz: ac3066ee25047a3d83151ec0832384b64d004b51
4
+ data.tar.gz: 55e0c443e90906bd180e20d11bab3291c4560d9a
5
5
  SHA512:
6
- metadata.gz: ac61aa4ce7cfd887d912936decfeaf2d335535e2b9219d839b6460b4fa75a55bdaa84713d71aad265ae2375cccc2d93399d465f45f4ec6f66fba14571ab0968a
7
- data.tar.gz: e86ff985ea138a13af7015c0b16d0a824cac035a7b80fd6056352ceb1c2410b4e12b80beaed334db0403dba9423188f30514fd69f2410c604ee29d6a7937e011
6
+ metadata.gz: fb43e922dc627c97cba4805a06df6395de73e4afba158d06515d9501e8cde1019dc6aaf50085ce8f205bd544bf8bd14b8e8ec307530b5eb37e7033d5cb75938b
7
+ data.tar.gz: a690f2b0e4d4c18a9d396b6b7d003ec76f05f25bf52e7bbe3ea41bc1bbe87b95ce31eb9cc45754804e8a8abfb0e86b4bc0b51473c01a0c4c4f23e6600b9e4b14
data/README.md CHANGED
@@ -50,6 +50,8 @@ Alexander Schuch ([@schuchalexander](https://twitter.com/schuchalexander)) who a
50
50
 
51
51
  -------
52
52
 
53
+ <h5 align="center"><code>PEM</code> is part of <a href="http://fastlane.tools">fastlane</a>: connect all deployment tools into one streamlined workflow.</h5>
54
+
53
55
  # Features
54
56
  Well, it's actually just one: Generate the ```pem``` file for your server.
55
57
 
@@ -65,8 +67,6 @@ Make sure, you have the latest version of the Xcode command line tools installed
65
67
 
66
68
  xcode-select --install
67
69
 
68
- If you don't already have homebrew installed, [install it here](http://brew.sh/).
69
-
70
70
  # Usage
71
71
 
72
72
  pem
data/lib/pem.rb CHANGED
@@ -1,19 +1,18 @@
1
- require 'json'
2
1
  require 'pem/version'
3
- require 'pem/helper'
4
2
  require 'pem/dependency_checker'
5
3
  require 'pem/developer_center'
6
- require 'pem/update_checker'
7
4
  require 'pem/cert_manager'
8
5
  require 'pem/signing_request'
9
6
 
10
- # Third Party code
11
- require 'phantomjs/poltergeist'
12
- require 'colored'
7
+ require 'fastlane_core'
13
8
 
14
9
  module PEM
15
10
  TMP_FOLDER = "/tmp/PEM/"
16
11
 
17
- PEM::UpdateChecker.verify_latest_version
12
+ ENV['FASTLANE_TEAM_ID'] ||= ENV["PEM_TEAM_ID"]
13
+
14
+ Helper = FastlaneCore::Helper # you gotta love Ruby: Helper.* should use the Helper class contained in FastlaneCore
15
+
16
+ FastlaneCore::UpdateChecker.verify_latest_version('pem', PEM::VERSION)
18
17
  DependencyChecker.check_dependencies
19
18
  end
@@ -7,7 +7,7 @@ module PEM
7
7
 
8
8
  Helper.log.info "Refreshing push notification profiles for app '#{app_identifier}'"
9
9
 
10
- dev = PEM::DeveloperCenter.new
10
+ dev = FastlaneCore::DeveloperCenter.new
11
11
 
12
12
  cert_file = dev.fetch_cer_file(app_identifier, production)
13
13
  rsa_file = File.join(TMP_FOLDER, 'private_key.key')
@@ -1,160 +1,10 @@
1
- require 'credentials_manager/password_manager'
2
- require 'open-uri'
3
- require 'openssl'
1
+ require 'fastlane_core/developer_center/developer_center'
4
2
 
5
- require 'capybara'
6
- require 'capybara/poltergeist'
7
- require 'phantomjs/poltergeist'
8
-
9
- module PEM
3
+ module FastlaneCore
10
4
  class DeveloperCenter
11
- # This error occurs only if there is something wrong with the given login data
12
- class DeveloperCenterLoginError < StandardError
13
- end
14
-
15
- # This error can occur for many reaons. It is
16
- # usually raised when a UI element could not be found
17
- class DeveloperCenterGeneralError < StandardError
18
- end
19
-
20
- include Capybara::DSL
21
-
22
- DEVELOPER_CENTER_URL = "https://developer.apple.com/devcenter/ios/index.action"
23
5
  APP_IDS_URL = "https://developer.apple.com/account/ios/identifiers/bundle/bundleList.action"
24
6
 
25
- # Strings
26
- PRODUCTION_SSL_CERTIFICATE_TITLE = "Production SSL Certificate"
27
- DEVELOPMENT_SSL_CERTIFICATE_TITLE = "Development SSL Certificate"
28
-
29
- def initialize
30
- FileUtils.mkdir_p TMP_FOLDER
31
-
32
- Capybara.run_server = false
33
- Capybara.default_driver = :poltergeist
34
- Capybara.javascript_driver = :poltergeist
35
- Capybara.current_driver = :poltergeist
36
- Capybara.app_host = DEVELOPER_CENTER_URL
37
-
38
- # Since Apple has some SSL errors, we have to configure the client properly:
39
- # https://github.com/ariya/phantomjs/issues/11239
40
- Capybara.register_driver :poltergeist do |a|
41
- conf = ['--debug=no', '--ignore-ssl-errors=yes', '--ssl-protocol=TLSv1']
42
- Capybara::Poltergeist::Driver.new(a, {
43
- phantomjs: Phantomjs.path,
44
- phantomjs_options: conf,
45
- phantomjs_logger: File.open("#{TMP_FOLDER}/poltergeist_log.txt", "a"),
46
- js_errors: false
47
- })
48
- end
49
-
50
- page.driver.headers = { "Accept-Language" => "en" }
51
-
52
- self.login
53
- end
54
-
55
- # Loggs in a user with the given login data on the Dev Center Frontend.
56
- # You don't need to pass a username and password. It will
57
- # Automatically be fetched using the {CredentialsManager::PasswordManager}.
58
- # This method will also automatically be called when triggering other
59
- # actions like {#open_app_page}
60
- # @param user (String) (optional) The username/email address
61
- # @param password (String) (optional) The password
62
- # @return (bool) true if everything worked fine
63
- # @raise [DeveloperCenterGeneralError] General error while executing
64
- # this action
65
- # @raise [DeveloperCenterLoginError] Login data is wrong
66
- def login(user = nil, password = nil)
67
- begin
68
- Helper.log.info "Login into iOS Developer Center"
69
-
70
- user ||= CredentialsManager::PasswordManager.shared_manager.username
71
- password ||= CredentialsManager::PasswordManager.shared_manager.password
72
-
73
- result = visit APP_IDS_URL
74
- raise "Could not open Developer Center" unless result['status'] == 'success'
75
-
76
- wait_for_elements(".button.blue").first.click
77
-
78
- (wait_for_elements('#accountpassword') rescue nil) # when the user is already logged in, this will raise an exception
79
-
80
- if page.has_content?"My Apps"
81
- # Already logged in
82
- return true
83
- end
84
-
85
- fill_in "accountname", with: user
86
- fill_in "accountpassword", with: password
87
-
88
- all(".button.large.blue.signin-button").first.click
89
-
90
- begin
91
- if page.has_content?"Select Team" # If the user is not on multiple teams
92
- select_team
93
- end
94
- rescue => ex
95
- Helper.log.debug ex
96
- raise DeveloperCenterLoginError.new("Error loggin in user #{user}. User is on multiple teams and we were unable to correctly retrieve them.")
97
- end
98
-
99
- begin
100
- visit APP_IDS_URL
101
- wait_for_elements('.ios.bundles.gridList')
102
- rescue => ex
103
- Helper.log.debug ex
104
- raise DeveloperCenterLoginError.new("Error logging in user #{user} with the given password. Make sure you entered them correctly.")
105
- end
106
-
107
- Helper.log.info "Login successful"
108
-
109
- true
110
- rescue => ex
111
- error_occured(ex)
112
- end
113
- end
114
-
115
- def select_team
116
- team_id = ENV["PEM_TEAM_ID"]
117
- team_id = nil if team_id.to_s.length == 0
118
-
119
- unless team_id
120
- Helper.log.info "You can store you preferred team using the environment variable `PEM_TEAM_ID`".green
121
- Helper.log.info "Your ID belongs to the following teams:".green
122
- end
123
-
124
- available_options = []
125
-
126
- teams = find("div.input").all('.team-value') # Grab all the teams data
127
- teams.each_with_index do |val, index|
128
- current_team_id = '"' + val.find("input").value + '"'
129
- team_text = val.find(".label-primary").text
130
- description_text = val.find(".label-secondary").text
131
- description_text = "(#{description_text})" unless description_text.empty? # Include the team description if any
132
- index_text = (index + 1).to_s + "."
133
-
134
- available_options << [index_text, current_team_id, team_text, description_text].join(" ")
135
- end
136
-
137
- unless team_id
138
- puts available_options.join("\n").green
139
- team_index = ask("Please select the team number you would like to access: ".green)
140
- team_id = teams[team_index.to_i - 1].find(".radio").value
141
- end
142
-
143
- team_button = first(:xpath, "//input[@type='radio' and @value='#{team_id}']") # Select the desired team
144
- if team_button
145
- team_button.click
146
- else
147
- Helper.log.fatal "Could not find given Team. Available options: ".red
148
- puts available_options.join("\n").yellow
149
- raise DeveloperCenterLoginError.new("Error finding given team #{team_id}.".red)
150
- end
151
-
152
- all(".button.large.blue.submit").first.click
153
-
154
- result = visit APP_IDS_URL
155
- raise "Could not open Developer Center" unless result['status'] == 'success'
156
- end
157
-
7
+
158
8
  # This method will enable push for the given app
159
9
  # and download the cer file in any case, no matter if it existed before or not
160
10
  # @return the path to the push file
@@ -187,6 +37,10 @@ module PEM
187
37
  visit APP_IDS_URL
188
38
  sleep 5
189
39
 
40
+ wait_for_elements(".toolbar-button.search").first.click
41
+ fill_in "bundle-list-search", with: app_identifier
42
+ sleep 5
43
+
190
44
  apps = all(:xpath, "//td[@title='#{app_identifier}']")
191
45
  if apps.count == 1
192
46
  apps.first.click
@@ -258,43 +112,12 @@ module PEM
258
112
  raise "Can't write to #{TMP_FOLDER}"
259
113
  end
260
114
 
261
- Helper.log.info "Successfully downloaded latest .cer file."
115
+ Helper.log.info "Successfully downloaded latest .cer file to '#{path}'".green
262
116
  return path
263
117
  end
264
118
 
265
-
266
- private
267
119
  def click_next
268
120
  wait_for_elements('.button.small.blue.right.submit').last.click
269
121
  end
270
-
271
- def error_occured(ex)
272
- snap
273
- raise ex # re-raise the error after saving the snapshot
274
- end
275
-
276
- def snap
277
- path = "Error#{Time.now.to_i}.png"
278
- save_screenshot(path, :full => true)
279
- system("open '#{path}'")
280
- end
281
-
282
- def wait_for_elements(name)
283
- counter = 0
284
- results = all(name)
285
- while results.count == 0
286
- # Helper.log.debug "Waiting for #{name}"
287
- sleep 0.2
288
-
289
- results = all(name)
290
-
291
- counter += 1
292
- if counter > 100
293
- Helper.log.debug caller
294
- raise DeveloperCenterGeneralError.new("Couldn't find element '#{name}' after waiting for quite some time")
295
- end
296
- end
297
- return results
298
- end
299
122
  end
300
123
  end
@@ -1,3 +1,3 @@
1
1
  module PEM
2
- VERSION = "0.3.3"
2
+ VERSION = "0.3.4"
3
3
  end
metadata CHANGED
@@ -1,17 +1,17 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: pem
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.3
4
+ version: 0.3.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - Felix Krause
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-02-12 00:00:00.000000000 Z
11
+ date: 2015-02-18 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
- name: json
14
+ name: fastlane_core
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
17
  - - '>='
@@ -24,104 +24,6 @@ dependencies:
24
24
  - - '>='
25
25
  - !ruby/object:Gem::Version
26
26
  version: '0'
27
- - !ruby/object:Gem::Dependency
28
- name: highline
29
- requirement: !ruby/object:Gem::Requirement
30
- requirements:
31
- - - ~>
32
- - !ruby/object:Gem::Version
33
- version: 1.6.21
34
- type: :runtime
35
- prerelease: false
36
- version_requirements: !ruby/object:Gem::Requirement
37
- requirements:
38
- - - ~>
39
- - !ruby/object:Gem::Version
40
- version: 1.6.21
41
- - !ruby/object:Gem::Dependency
42
- name: colored
43
- requirement: !ruby/object:Gem::Requirement
44
- requirements:
45
- - - '>='
46
- - !ruby/object:Gem::Version
47
- version: '0'
48
- type: :runtime
49
- prerelease: false
50
- version_requirements: !ruby/object:Gem::Requirement
51
- requirements:
52
- - - '>='
53
- - !ruby/object:Gem::Version
54
- version: '0'
55
- - !ruby/object:Gem::Dependency
56
- name: commander
57
- requirement: !ruby/object:Gem::Requirement
58
- requirements:
59
- - - ~>
60
- - !ruby/object:Gem::Version
61
- version: 4.2.0
62
- type: :runtime
63
- prerelease: false
64
- version_requirements: !ruby/object:Gem::Requirement
65
- requirements:
66
- - - ~>
67
- - !ruby/object:Gem::Version
68
- version: 4.2.0
69
- - !ruby/object:Gem::Dependency
70
- name: credentials_manager
71
- requirement: !ruby/object:Gem::Requirement
72
- requirements:
73
- - - '>='
74
- - !ruby/object:Gem::Version
75
- version: '0'
76
- type: :runtime
77
- prerelease: false
78
- version_requirements: !ruby/object:Gem::Requirement
79
- requirements:
80
- - - '>='
81
- - !ruby/object:Gem::Version
82
- version: '0'
83
- - !ruby/object:Gem::Dependency
84
- name: phantomjs
85
- requirement: !ruby/object:Gem::Requirement
86
- requirements:
87
- - - ~>
88
- - !ruby/object:Gem::Version
89
- version: 1.9.8
90
- type: :runtime
91
- prerelease: false
92
- version_requirements: !ruby/object:Gem::Requirement
93
- requirements:
94
- - - ~>
95
- - !ruby/object:Gem::Version
96
- version: 1.9.8
97
- - !ruby/object:Gem::Dependency
98
- name: capybara
99
- requirement: !ruby/object:Gem::Requirement
100
- requirements:
101
- - - ~>
102
- - !ruby/object:Gem::Version
103
- version: 2.4.3
104
- type: :runtime
105
- prerelease: false
106
- version_requirements: !ruby/object:Gem::Requirement
107
- requirements:
108
- - - ~>
109
- - !ruby/object:Gem::Version
110
- version: 2.4.3
111
- - !ruby/object:Gem::Dependency
112
- name: poltergeist
113
- requirement: !ruby/object:Gem::Requirement
114
- requirements:
115
- - - ~>
116
- - !ruby/object:Gem::Version
117
- version: 1.5.1
118
- type: :runtime
119
- prerelease: false
120
- version_requirements: !ruby/object:Gem::Requirement
121
- requirements:
122
- - - ~>
123
- - !ruby/object:Gem::Version
124
- version: 1.5.1
125
27
  - !ruby/object:Gem::Dependency
126
28
  name: bundler
127
29
  requirement: !ruby/object:Gem::Requirement
@@ -235,9 +137,7 @@ files:
235
137
  - lib/pem/cert_manager.rb
236
138
  - lib/pem/dependency_checker.rb
237
139
  - lib/pem/developer_center.rb
238
- - lib/pem/helper.rb
239
140
  - lib/pem/signing_request.rb
240
- - lib/pem/update_checker.rb
241
141
  - lib/pem/version.rb
242
142
  homepage: http://fastlane.tools
243
143
  licenses:
@@ -1,49 +0,0 @@
1
- require 'logger'
2
-
3
- module PEM
4
- module Helper
5
-
6
- # Logging happens using this method
7
- def self.log
8
- if is_test?
9
- @@log ||= Logger.new(nil) # don't show any logs when running tests
10
- else
11
- @@log ||= Logger.new(STDOUT)
12
- end
13
-
14
- @@log.formatter = proc do |severity, datetime, progname, msg|
15
- string = "#{severity} [#{datetime.strftime('%Y-%m-%d %H:%M:%S.%2N')}]: "
16
- second = "#{msg}\n"
17
-
18
- if severity == "DEBUG"
19
- string = string.magenta
20
- elsif severity == "INFO"
21
- string = string.white
22
- elsif severity == "WARN"
23
- string = string.yellow
24
- elsif severity == "ERROR"
25
- string = string.red
26
- elsif severity == "FATAL"
27
- string = string.red.bold
28
- end
29
-
30
-
31
- [string, second].join("")
32
- end
33
-
34
- @@log
35
- end
36
-
37
- # @return true if the currently running program is a unit test
38
- def self.is_test?
39
- defined?SpecHelper
40
- end
41
-
42
- # @return the full path to the Xcode developer tools of the currently
43
- # running system
44
- def self.xcode_path
45
- return "" if self.is_test? and not OS.mac?
46
- `xcode-select -p`.gsub("\n", '') + "/"
47
- end
48
- end
49
- end
@@ -1,44 +0,0 @@
1
- require 'open-uri'
2
-
3
- module PEM
4
- # Verifies, the user runs the latest version of this gem
5
- class UpdateChecker
6
- # This method will check if the latest version is installed and show a warning if that's not the case
7
- def self.verify_latest_version
8
- if self.update_available?
9
- v = fetch_latest
10
- puts '#######################################################################'.green
11
- puts "# PEM #{v} is available.".green
12
- puts "# It is recommended to use the latest version.".green
13
- puts "# Update using '(sudo) gem update PEM'.".green
14
- puts "# To see what's new, open https://github.com/KrauseFx/PEM/releases.".green
15
- puts '#######################################################################'.green
16
- return true
17
- end
18
- false
19
- end
20
-
21
- # Is a new official release available (this does not include pre-releases)
22
- def self.update_available?
23
- begin
24
- latest = fetch_latest
25
- if latest and Gem::Version.new(latest) > Gem::Version.new(current_version)
26
- return true
27
- end
28
- rescue => ex
29
- Helper.log.error("Could not check if 'PEM' is up to date.")
30
- end
31
- return false
32
- end
33
-
34
- # The currently used version of this gem
35
- def self.current_version
36
- PEM::VERSION
37
- end
38
-
39
- private
40
- def self.fetch_latest
41
- JSON.parse(open("http://rubygems.org/api/v1/gems/pem.json").read)["version"]
42
- end
43
- end
44
- end