codes 0.4.1 → 0.4.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +3 -1
- data/bin/codes +7 -4
- data/lib/codes/itunes_connect/itunes_connect.rb +64 -0
- data/lib/codes/itunes_connect/itunes_connect_helper.rb +85 -0
- data/lib/codes/itunes_connect/itunes_connect_login.rb +65 -0
- data/lib/codes/version.rb +1 -1
- metadata +35 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 7e7bc733c50117a65733b35ff3397a09a5393ac4
|
4
|
+
data.tar.gz: a2c348bd2f3fac7d2d04bf318e3131967adcf650
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 82660fb3b949be5f0903be2fbd9c9acff071d079312e7013e505d7941067311bc78f160f2c14b72127ba3e289747701ff901dcc376d714a964b60f840d182d8a
|
7
|
+
data.tar.gz: 22870162284f11dae6016cd587699e5b2c13dd86264baa50eccc78a1775f391fb78a557f6e1e5cfaf3644cba4a9cf2c90933086e818a3ecefa163559ba497ede
|
data/README.md
CHANGED
@@ -22,7 +22,7 @@
|
|
22
22
|
-------
|
23
23
|
|
24
24
|
<p align="center">
|
25
|
-
|
25
|
+
<img src="assets/codes.png" height="110">
|
26
26
|
</p>
|
27
27
|
|
28
28
|
codes
|
@@ -36,6 +36,8 @@ codes
|
|
36
36
|
or
|
37
37
|
###### Automatically lose money by giving away your app for free...
|
38
38
|
|
39
|
+
## This tool is not maintained any more
|
40
|
+
|
39
41
|
|
40
42
|
##### This tool was sponsored by [Max Bäumle](http://maxbaeumle.com) and [Textastic Code Editor](http://www.textasticapp.com)
|
41
43
|
|
data/bin/codes
CHANGED
@@ -2,12 +2,15 @@
|
|
2
2
|
|
3
3
|
$:.push File.expand_path('../../lib', __FILE__)
|
4
4
|
|
5
|
-
require 'codes'
|
6
|
-
require 'commander'
|
7
|
-
require 'credentials_manager/appfile_config'
|
5
|
+
# require 'codes'
|
6
|
+
# require 'commander'
|
7
|
+
# require 'credentials_manager/appfile_config'
|
8
8
|
require 'fastlane_core'
|
9
9
|
|
10
|
-
HighLine.track_eof = false
|
10
|
+
# HighLine.track_eof = false
|
11
|
+
|
12
|
+
puts "This tool is currently not working due to the new iTunes Connect interface".red
|
13
|
+
raise "Error"
|
11
14
|
|
12
15
|
class CodesApplication
|
13
16
|
include Commander::Methods
|
@@ -0,0 +1,64 @@
|
|
1
|
+
require 'capybara'
|
2
|
+
require 'capybara/poltergeist'
|
3
|
+
require 'credentials_manager/password_manager'
|
4
|
+
require 'phantomjs/poltergeist' # this will download and store phantomjs
|
5
|
+
|
6
|
+
require 'fastlane_core/itunes_connect/itunes_connect_helper.rb'
|
7
|
+
require 'fastlane_core/itunes_connect/itunes_connect_login.rb'
|
8
|
+
require 'fastlane_core/itunes_connect/itunes_connect_apple_id.rb'
|
9
|
+
|
10
|
+
module Codes
|
11
|
+
# Everything that can't be achived using the {Codes::ItunesTransporter}
|
12
|
+
# will be scripted using the iTunesConnect frontend.
|
13
|
+
#
|
14
|
+
# Every method you call here, might take a time
|
15
|
+
class ItunesConnect
|
16
|
+
# This error occurs only if there is something wrong with the given login data
|
17
|
+
class ItunesConnectLoginError < StandardError
|
18
|
+
end
|
19
|
+
|
20
|
+
# This error can occur for many reaons. It is
|
21
|
+
# usually raised when an UI element could not be found
|
22
|
+
class ItunesConnectGeneralError < StandardError
|
23
|
+
end
|
24
|
+
|
25
|
+
include Capybara::DSL
|
26
|
+
|
27
|
+
ITUNESCONNECT_URL = "https://itunesconnect.apple.com/"
|
28
|
+
APP_DETAILS_URL = "https://itunesconnect.apple.com/WebObjects/iTunesConnect.woa/ra/ng/app/[[app_id]]"
|
29
|
+
|
30
|
+
BUTTON_STRING_NEW_VERSION = "New Version"
|
31
|
+
BUTTON_STRING_SUBMIT_FOR_REVIEW = "Submit for Review"
|
32
|
+
|
33
|
+
WAITING_FOR_REVIEW = "Waiting For Review"
|
34
|
+
|
35
|
+
def initialize
|
36
|
+
super
|
37
|
+
|
38
|
+
return if Helper.is_test?
|
39
|
+
|
40
|
+
Capybara.run_server = false
|
41
|
+
Capybara.default_driver = :poltergeist
|
42
|
+
Capybara.javascript_driver = :poltergeist
|
43
|
+
Capybara.current_driver = :poltergeist
|
44
|
+
Capybara.app_host = ITUNESCONNECT_URL
|
45
|
+
|
46
|
+
# Since Apple has some SSL errors, we have to configure the client properly:
|
47
|
+
# https://github.com/ariya/phantomjs/issues/11239
|
48
|
+
Capybara.register_driver :poltergeist do |a|
|
49
|
+
conf = ['--debug=no', '--ignore-ssl-errors=yes', '--ssl-protocol=TLSv1']
|
50
|
+
Capybara::Poltergeist::Driver.new(a, {
|
51
|
+
phantomjs: Phantomjs.path,
|
52
|
+
phantomjs_options: conf,
|
53
|
+
phantomjs_logger: File.open("/tmp/poltergeist_log.txt", "a"),
|
54
|
+
js_errors: false,
|
55
|
+
timeout: 90
|
56
|
+
})
|
57
|
+
end
|
58
|
+
|
59
|
+
page.driver.headers = { "Accept-Language" => "en" }
|
60
|
+
|
61
|
+
login
|
62
|
+
end
|
63
|
+
end
|
64
|
+
end
|
@@ -0,0 +1,85 @@
|
|
1
|
+
module Codes
|
2
|
+
class ItunesConnect
|
3
|
+
# All the private helpers
|
4
|
+
|
5
|
+
private
|
6
|
+
|
7
|
+
# Opens the app details page of the given app.
|
8
|
+
# @param app (Deliver::App) the app that should be opened
|
9
|
+
# @return (bool) true if everything worked fine
|
10
|
+
# @raise [ItunesConnectGeneralError] General error while executing
|
11
|
+
# this action
|
12
|
+
# @raise [ItunesConnectLoginError] Login data is wrong
|
13
|
+
def open_app_page(app)
|
14
|
+
verify_app(app)
|
15
|
+
|
16
|
+
Helper.log.info "Opening detail page for app #{app}"
|
17
|
+
|
18
|
+
visit APP_DETAILS_URL.gsub("[[app_id]]", app.apple_id.to_s)
|
19
|
+
|
20
|
+
wait_for_elements('.page-subnav')
|
21
|
+
sleep 5
|
22
|
+
|
23
|
+
if current_url.include? "wa/defaultError" # app could not be found
|
24
|
+
raise "Could not open app details for app '#{app}'. Make sure you're using the correct Apple ID and the correct Apple developer account (#{CredentialsManager::PasswordManager.shared_manager.username}).".red
|
25
|
+
end
|
26
|
+
|
27
|
+
true
|
28
|
+
rescue => ex
|
29
|
+
error_occured(ex)
|
30
|
+
end
|
31
|
+
|
32
|
+
def verify_app(app)
|
33
|
+
raise ItunesConnectGeneralError.new("No valid Deliver::App given") unless app.kind_of? Deliver::App
|
34
|
+
raise ItunesConnectGeneralError.new("App is missing information (apple_id not given)") unless (app.apple_id || '').to_s.length > 5
|
35
|
+
end
|
36
|
+
|
37
|
+
def error_occured(ex)
|
38
|
+
snap
|
39
|
+
raise ex # re-raise the error after saving the snapshot
|
40
|
+
end
|
41
|
+
|
42
|
+
def snap
|
43
|
+
path = File.expand_path("Error#{Time.now.to_i}.png")
|
44
|
+
# rubocop:disable Lint/Debugger
|
45
|
+
save_screenshot(path, full: true)
|
46
|
+
# rubocop:enable Lint/Debugger
|
47
|
+
system("open '#{path}'") unless ENV['SIGH_DISABLE_OPEN_ERROR']
|
48
|
+
end
|
49
|
+
|
50
|
+
# Since Apple takes for ages, after the upload is properly processed, we have to wait here
|
51
|
+
def wait_for_preprocessing
|
52
|
+
started = Time.now
|
53
|
+
|
54
|
+
# Wait, while iTunesConnect is processing the uploaded file
|
55
|
+
while page.has_content? "Uploaded"
|
56
|
+
# iTunesConnect is super slow... so we have to wait...
|
57
|
+
Helper.log.info("Sorry, we have to wait for iTunesConnect, since it's still processing the uploaded ipa file\n" \
|
58
|
+
"If this takes longer than 45 minutes, you have to re-upload the ipa file again.\n" \
|
59
|
+
"You can always open the browser page yourself: '#{current_url}'\n" \
|
60
|
+
"Passed time: ~#{((Time.now - started) / 60.0).to_i} minute(s)")
|
61
|
+
sleep 30
|
62
|
+
visit current_url
|
63
|
+
sleep 30
|
64
|
+
end
|
65
|
+
end
|
66
|
+
|
67
|
+
def wait_for_elements(name)
|
68
|
+
counter = 0
|
69
|
+
results = all(name)
|
70
|
+
while results.count == 0
|
71
|
+
# Helper.log.debug "Waiting for #{name}"
|
72
|
+
sleep 0.2
|
73
|
+
|
74
|
+
results = all(name)
|
75
|
+
|
76
|
+
counter += 1
|
77
|
+
if counter > 100
|
78
|
+
Helper.log.debug caller
|
79
|
+
raise ItunesConnectGeneralError.new("Couldn't find element '#{name}' after waiting for quite some time")
|
80
|
+
end
|
81
|
+
end
|
82
|
+
return results
|
83
|
+
end
|
84
|
+
end
|
85
|
+
end
|
@@ -0,0 +1,65 @@
|
|
1
|
+
module Codes
|
2
|
+
# Login code
|
3
|
+
class ItunesConnect
|
4
|
+
# Loggs in a user with the given login data on the iTC Frontend.
|
5
|
+
# You don't need to pass a username and password. It will
|
6
|
+
# Automatically be fetched using the {CredentialsManager::PasswordManager}.
|
7
|
+
# This method will also automatically be called when triggering other
|
8
|
+
# actions like {#open_app_page}
|
9
|
+
# @param user (String) (optional) The username/email address
|
10
|
+
# @param password (String) (optional) The password
|
11
|
+
# @return (bool) true if everything worked fine
|
12
|
+
# @raise [ItunesConnectGeneralError] General error while executing
|
13
|
+
# this action
|
14
|
+
# @raise [ItunesConnectLoginError] Login data is wrong
|
15
|
+
def login(user = nil, password = nil)
|
16
|
+
Helper.log.info "Logging into iTunesConnect"
|
17
|
+
|
18
|
+
user ||= CredentialsManager::PasswordManager.shared_manager.username
|
19
|
+
password ||= CredentialsManager::PasswordManager.shared_manager.password
|
20
|
+
|
21
|
+
result = visit ITUNESCONNECT_URL
|
22
|
+
raise "Could not open iTunesConnect" unless result['status'] == 'success'
|
23
|
+
|
24
|
+
sleep 3
|
25
|
+
|
26
|
+
if page.has_content? "My Apps"
|
27
|
+
# Already logged in
|
28
|
+
return true
|
29
|
+
end
|
30
|
+
|
31
|
+
begin
|
32
|
+
wait_for_elements('#accountpassword')
|
33
|
+
rescue
|
34
|
+
# when the user is already logged in, this will raise an exception
|
35
|
+
end
|
36
|
+
|
37
|
+
fill_in "accountname", with: user
|
38
|
+
fill_in "accountpassword", with: password
|
39
|
+
|
40
|
+
begin
|
41
|
+
page.evaluate_script "appleConnectForm.submit()"
|
42
|
+
sleep 7
|
43
|
+
|
44
|
+
if page.has_content? "My Apps"
|
45
|
+
# Everything looks good
|
46
|
+
else
|
47
|
+
visit current_url # iTC sometimes is super buggy, try reloading the site
|
48
|
+
sleep 3
|
49
|
+
unless page.has_content? "My Apps"
|
50
|
+
raise ItunesConnectLoginError.new("Looks like your login data was correct, but you do not have access to the apps.".red)
|
51
|
+
end
|
52
|
+
end
|
53
|
+
rescue => ex
|
54
|
+
Helper.log.debug(ex)
|
55
|
+
raise ItunesConnectLoginError.new("Error logging in user #{user} with the given password. Make sure you entered them correctly.".red)
|
56
|
+
end
|
57
|
+
|
58
|
+
Helper.log.info "Successfully logged into iTunesConnect"
|
59
|
+
|
60
|
+
true
|
61
|
+
rescue => ex
|
62
|
+
error_occured(ex)
|
63
|
+
end
|
64
|
+
end
|
65
|
+
end
|
data/lib/codes/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: codes
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.4.
|
4
|
+
version: 0.4.2
|
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-
|
11
|
+
date: 2015-11-08 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: fastlane_core
|
@@ -115,7 +115,7 @@ dependencies:
|
|
115
115
|
- !ruby/object:Gem::Version
|
116
116
|
version: 1.19.0
|
117
117
|
- !ruby/object:Gem::Dependency
|
118
|
-
name:
|
118
|
+
name: coveralls
|
119
119
|
requirement: !ruby/object:Gem::Requirement
|
120
120
|
requirements:
|
121
121
|
- - ">="
|
@@ -128,6 +128,34 @@ dependencies:
|
|
128
128
|
- - ">="
|
129
129
|
- !ruby/object:Gem::Version
|
130
130
|
version: '0'
|
131
|
+
- !ruby/object:Gem::Dependency
|
132
|
+
name: fastlane
|
133
|
+
requirement: !ruby/object:Gem::Requirement
|
134
|
+
requirements:
|
135
|
+
- - ">="
|
136
|
+
- !ruby/object:Gem::Version
|
137
|
+
version: '0'
|
138
|
+
type: :development
|
139
|
+
prerelease: false
|
140
|
+
version_requirements: !ruby/object:Gem::Requirement
|
141
|
+
requirements:
|
142
|
+
- - ">="
|
143
|
+
- !ruby/object:Gem::Version
|
144
|
+
version: '0'
|
145
|
+
- !ruby/object:Gem::Dependency
|
146
|
+
name: rubocop
|
147
|
+
requirement: !ruby/object:Gem::Requirement
|
148
|
+
requirements:
|
149
|
+
- - "~>"
|
150
|
+
- !ruby/object:Gem::Version
|
151
|
+
version: '0.34'
|
152
|
+
type: :development
|
153
|
+
prerelease: false
|
154
|
+
version_requirements: !ruby/object:Gem::Requirement
|
155
|
+
requirements:
|
156
|
+
- - "~>"
|
157
|
+
- !ruby/object:Gem::Version
|
158
|
+
version: '0.34'
|
131
159
|
description: Create promo codes for iOS Apps using the command line
|
132
160
|
email:
|
133
161
|
- codes@krausefx.com
|
@@ -143,6 +171,9 @@ files:
|
|
143
171
|
- lib/codes/codes_runner.rb
|
144
172
|
- lib/codes/dependency_checker.rb
|
145
173
|
- lib/codes/itunes_connect.rb
|
174
|
+
- lib/codes/itunes_connect/itunes_connect.rb
|
175
|
+
- lib/codes/itunes_connect/itunes_connect_helper.rb
|
176
|
+
- lib/codes/itunes_connect/itunes_connect_login.rb
|
146
177
|
- lib/codes/version.rb
|
147
178
|
homepage: https://fastlane.tools
|
148
179
|
licenses:
|
@@ -164,7 +195,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
164
195
|
version: '0'
|
165
196
|
requirements: []
|
166
197
|
rubyforge_project:
|
167
|
-
rubygems_version: 2.
|
198
|
+
rubygems_version: 2.5.0
|
168
199
|
signing_key:
|
169
200
|
specification_version: 4
|
170
201
|
summary: Create promo codes for iOS Apps using the command line
|