applebot 0.0.1

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.
@@ -0,0 +1,66 @@
1
+ var require = patchRequire(require);
2
+
3
+ var fs = require('fs');
4
+ var AppleBot = require('applebot').AppleBot;
5
+ var CommandHandler = require('applebot').CommandHandler;
6
+
7
+ var commandHandler = new CommandHandler("list_app_id.js");
8
+
9
+ var userOptions = commandHandler.parseArgs();
10
+ var applebot = new AppleBot(commandHandler.getAuthFromArgs());
11
+
12
+ var searchInADC = function() {
13
+ var LOAD_URL = "https://developer.apple.com/account/ios/identifiers/bundle/bundleList.action";
14
+ applebot.openPage(LOAD_URL, function(page){
15
+ var appIds = {};
16
+ applebot.action("Grab app id info", function() {
17
+ appIds = page.evaluate(function() {
18
+ var appIds = {};
19
+ var ids = $(".ui-widget-content.jqgrow.ui-row-ltr");
20
+ ids.each(function() {
21
+ var $el = this;
22
+ var name = $(".ui-ellipsis.bold", $el).first().attr('title');
23
+ var appId = $(".ui-ellipsis", $el).last().attr("title");
24
+ appIds[appId] = name;
25
+ });
26
+ return appIds
27
+ });
28
+ });
29
+
30
+ applebot.action("Grab app id info");
31
+ applebot.result(appIds);
32
+ });
33
+ };
34
+
35
+ var searchInITC = function() {
36
+ var LOAD_URL = "https://itunesconnect.apple.com";
37
+ applebot.openPage(LOAD_URL, function(page){
38
+ var appIds = {};
39
+
40
+ applebot.action("Click the Add New App button", function() {
41
+ page.click('.upload-app-button a');
42
+ });
43
+
44
+ applebot.action("Grab app id info", function() {
45
+ appIds = applebot.shortcuts.filterBundleIdsFromItunesConnect(page, true);
46
+ });
47
+
48
+ applebot.step("Wait for Manage Your Apps", 'waitForText', 'Recent Activity', function() {
49
+ applebot.action("Click the Add New App button");
50
+ });
51
+
52
+ applebot.step("Wait for the New App Information page", 'waitForSelector', '#mainForm', function() {
53
+ applebot.action("Grab app id info");
54
+ applebot.result(appIds);
55
+ });
56
+
57
+ applebot.shortcuts.openManageApps(page);
58
+ });
59
+ };
60
+
61
+ if (userOptions.source === 'itc') {
62
+ searchInITC();
63
+ }
64
+ else {
65
+ searchInADC();
66
+ }
@@ -0,0 +1,23 @@
1
+ var require = patchRequire(require);
2
+
3
+ var fs = require('fs');
4
+ var AppleBot = require('applebot').AppleBot;
5
+ var CommandHandler = require('applebot').CommandHandler;
6
+
7
+ var commandHandler = new CommandHandler("list_profile.js");
8
+
9
+ var userOptions = commandHandler.parseArgs();
10
+ var applebot = new AppleBot(commandHandler.getAuthFromArgs());
11
+
12
+ var profileType = {
13
+ development: 'limited',
14
+ distribution: 'production'
15
+ }[userOptions.profile_type || "development"];
16
+
17
+ var LOAD_URL = "https://developer.apple.com/account/ios/profile/profileList.action?type=" + profileType;
18
+
19
+ applebot.openPage(LOAD_URL, function(page){
20
+ applebot.shortcuts.waitToParseProfiles(applebot, page, profileType, function(parsedProfiles) {
21
+ applebot.result(parsedProfiles);
22
+ });
23
+ });
@@ -0,0 +1,73 @@
1
+ var require = patchRequire(require);
2
+
3
+ var fs = require('fs');
4
+ var AppleBot = require('applebot').AppleBot;
5
+ var CommandHandler = require('applebot').CommandHandler;
6
+
7
+ var commandHandler = new CommandHandler("remove_from_sale_app.js");
8
+
9
+
10
+ var userOptions = commandHandler.parseArgs();
11
+ var applebot = new AppleBot(commandHandler.getAuthFromArgs());
12
+
13
+ var LOAD_URL = "https://itunesconnect.apple.com";
14
+ applebot.openPage(LOAD_URL, function(page){
15
+ applebot.action("Click current version", function() {
16
+ page.click(".version .column-container a.blue-btn");
17
+ });
18
+
19
+ applebot.action("Click next version", function() {
20
+ page.click(".version .column-container.right a.blue-btn");
21
+ });
22
+
23
+ applebot.action("Click Binary Details", function() {
24
+ var hrefSelector = applebot.shortcuts.findHrefSelector("Binary Details", page, '#versionInfoLightboxUpdate');
25
+ page.click(hrefSelector);
26
+ });
27
+
28
+ applebot.action("Click Reject Binary" ,function() {
29
+ page.click(".lightbox-button");
30
+ });
31
+
32
+
33
+ applebot.shortcuts.addStepsToSearchAndClickAppTitle(applebot, page, userOptions.title, function() {
34
+ if (userOptions.app_version) {
35
+ var actionName = page.evaluate(function(app_version) {
36
+ var nodes = document.querySelectorAll(".version-container p span");
37
+ var actionName = null;
38
+ for (var i = nodes.length - 1; i >= 0; i--) {
39
+ var node = nodes[i];
40
+ if (node.innerHTML == app_version) {
41
+ var relevantAncestor = node.parentElement.parentElement.parentElement.parentElement;
42
+ var classes = relevantAncestor.classList;
43
+ if (classes[1] === 'right') {
44
+ actionName = "Click next version";
45
+ }
46
+ else {
47
+ actionName = "Click current version";
48
+ }
49
+ }
50
+ };
51
+ return actionName;
52
+ }, userOptions.app_version);
53
+ applebot.action(actionName);
54
+ }
55
+ else {
56
+ applebot.action("Click current version");
57
+ }
58
+ });
59
+
60
+ applebot.step("Wait for version information page", 'waitForText', 'Version Information', function() {
61
+ applebot.action("Click Binary Details");
62
+ });
63
+
64
+ applebot.step("Wait for Binary Details page", 'waitForText', 'Supported Architectures', function() {
65
+ applebot.action("Click Reject Binary");
66
+ });
67
+
68
+ applebot.step("Wait for changes to save", 'waitForText', 'Supported Architectures', function() {
69
+ // done
70
+ });
71
+
72
+ applebot.shortcuts.openManageApps(page);
73
+ });
@@ -0,0 +1,50 @@
1
+ var require = patchRequire(require);
2
+
3
+ var fs = require('fs');
4
+ var AppleBot = require('applebot').AppleBot;
5
+ var CommandHandler = require('applebot').CommandHandler;
6
+
7
+ var commandHandler = new CommandHandler("remove_from_sale_app.js");
8
+
9
+
10
+ var userOptions = commandHandler.parseArgs();
11
+ var applebot = new AppleBot(commandHandler.getAuthFromArgs());
12
+
13
+ var LOAD_URL = "https://itunesconnect.apple.com";
14
+ applebot.openPage(LOAD_URL, function(page){
15
+ applebot.action("Click Rights and Pricing", function() {
16
+ var hrefSelector = applebot.shortcuts.findHrefSelector("Rights and Pricing", page, "#availableButtons");
17
+ page.click(hrefSelector);
18
+ });
19
+
20
+ applebot.action("Open Specific Territories", function() {
21
+ var hrefSelector = applebot.shortcuts.findHrefSelector("specific territories", page, '#hideCountriesOption');
22
+ page.click(hrefSelector);
23
+ });
24
+
25
+ applebot.action("Click Deselect All", function() {
26
+ var hrefSelector = applebot.shortcuts.findHrefSelector("Deselect All", page, '.country-check-all');
27
+ page.click(hrefSelector + ".right");
28
+ });
29
+
30
+ applebot.action("Click Save button", function() {
31
+ page.click('.saveChangesActionButton');
32
+ });
33
+
34
+
35
+ applebot.shortcuts.addStepsToSearchAndClickAppTitle(applebot, page, userOptions.title, function() {
36
+ applebot.action("Click Rights and Pricing");
37
+ });
38
+
39
+ applebot.step("Wait for Rights and Pricing page", 'waitForText', "Select the availability date", function() {
40
+ applebot.action("Open Specific Territories");
41
+ applebot.action("Click Deselect All");
42
+ applebot.action("Click Save button");
43
+ });
44
+
45
+ applebot.step("Wait for changes to save", 'waitForText', 'Your changes have been saved.', function() {
46
+ // done
47
+ });
48
+
49
+ applebot.shortcuts.openManageApps(page);
50
+ });
@@ -0,0 +1,309 @@
1
+ var require = patchRequire(require);
2
+
3
+ var fs = require('fs');
4
+ var AppleBot = require('applebot').AppleBot;
5
+ var CommandHandler = require('applebot').CommandHandler;
6
+
7
+ var commandHandler = new CommandHandler("update_app.js");
8
+
9
+
10
+ var userOptions = commandHandler.parseArgs();
11
+ var applebot = new AppleBot(commandHandler.getAuthFromArgs());
12
+
13
+ var LOAD_URL = "https://itunesconnect.apple.com";
14
+
15
+ applebot.openPage(LOAD_URL, function(page){
16
+ var findFieldName = applebot.shortcuts.findFieldName;
17
+ var updateAlreadyExists = false;
18
+
19
+ var addWaitForVersionInfoStep = function(callback) {
20
+ var callbackImpl = callback;
21
+ if (typeof callback === "string") {
22
+ callbackImpl = function() {
23
+ applebot.action(callback);
24
+ }
25
+ }
26
+ applebot.step("Wait for update version info screen", 'waitForText','App Store Contact Information', callbackImpl);
27
+ }
28
+ this.addWaitForVersionInfoStep = addWaitForVersionInfoStep;
29
+
30
+ var waitForMetadataToClose = function() {
31
+ applebot.step("Wait for metadata screen to close", 'waitWhileVisible', '#fileInput_35InchRetinaDisplayScreenshots');
32
+ }
33
+
34
+ this.handleLargeIcon = function() {
35
+ addWaitForVersionInfoStep("Click the Version Information edit button");
36
+ applebot.step("Wait for the app icon upload screen", 'waitForSelector', 'form[name="FileUploadForm_largeAppIcon"]', function() {
37
+ applebot.action("Update app icon");
38
+ });
39
+ applebot.step("Wait for the app icon to change", 'waitWhileVisible', '.lcUploaderImage .lcUploaderImageWellSpinner', function() {
40
+ applebot.action("Close app icon update screen");
41
+ })
42
+ applebot.step("Wait for Version Information screen to close", 'waitWhileVisible', 'form[name="FileUploadForm_largeAppIcon"]');
43
+ };
44
+
45
+ this.handleNewTitle = function() {
46
+ addWaitForVersionInfoStep("Click the Metadata edit button");
47
+ applebot.step("Wait for the app title upload screen", 'waitForSelector', '#fileInput_35InchRetinaDisplayScreenshots', function() {
48
+ applebot.action("Update app title");
49
+ });
50
+ applebot.step("Wait for the app title to confirm", 'waitWhileVisible', '#appNameUpdateSpinnerId', function() {
51
+ applebot.action("Save Metadata changes");
52
+ });
53
+ waitForMetadataToClose();
54
+ };
55
+
56
+
57
+ var waitForScreenshotsToBeEmpty = function(type, selectorId, callback) {
58
+ applebot.step("Wait for all " + type + " screenshots to be cleared", 'waitFor', function() {
59
+ var buttonCount = page.evaluate(function(selectorId) {
60
+ var screenshotContainer = Array.prototype.slice.call(document.querySelectorAll(".lcUploaderPictureSet")).filter(function(el) {
61
+ return el.id === selectorId;
62
+ })[0];
63
+ var deleteButtons = screenshotContainer.querySelectorAll(".lcUploaderImageDelete");
64
+ return deleteButtons.length;
65
+ }, selectorId);
66
+ return buttonCount === 0;
67
+ },callback);
68
+ }
69
+ this.handleScreenshots35 = function() {
70
+ addWaitForVersionInfoStep("Click the Metadata edit button");
71
+ applebot.step("Wait for the app title upload screen", 'waitForSelector', '#fileInput_35InchRetinaDisplayScreenshots', function() {
72
+ applebot.action("Clear 3.5in screenshots");
73
+ });
74
+ waitForScreenshotsToBeEmpty("3.5in", "35InchRetinaDisplayScreenshots", function() {
75
+ applebot.action("Upload next 3.5in screenshot");
76
+ });
77
+ var screenshotStepOption = {
78
+ key_path: 'screenshots_35',
79
+ selector: 'div.iPhoneScreenshot',
80
+ description: "3.5in",
81
+ next_step: "Save Metadata changes",
82
+ while_step: "Upload next 3.5in screenshot"
83
+ };
84
+ applebot.shortcuts.addStepsForScreenshotGroup(applebot, page, userOptions, screenshotStepOption);
85
+ waitForMetadataToClose();
86
+ };
87
+
88
+ this.handleScreenshots4 = function() {
89
+ addWaitForVersionInfoStep("Click the Metadata edit button");
90
+ applebot.step("Wait for the app title upload screen", 'waitForSelector', '#fileInput_35InchRetinaDisplayScreenshots', function() {
91
+ applebot.action("Clear 4in screenshots");
92
+ });
93
+
94
+ waitForScreenshotsToBeEmpty("4in", "iPhone5", function() {
95
+ applebot.action("Upload next 4in screenshot");
96
+ });
97
+ var screenshotStepOption = {
98
+ key_path: 'screenshots_4',
99
+ selector: 'div.SortedN41ScreenShot',
100
+ description: "4in",
101
+ next_step: "Save Metadata changes",
102
+ while_step: "Upload next 4in screenshot"
103
+ };
104
+ applebot.shortcuts.addStepsForScreenshotGroup(applebot, page, userOptions, screenshotStepOption);
105
+ waitForMetadataToClose();
106
+ };
107
+
108
+ applebot.action("Click the 'See All' link", function() {
109
+ page.click('.seeAll a');
110
+ });
111
+
112
+ applebot.action("Fill the apps search box", function() {
113
+ applebot.shortcuts.searchITCApps(page, {title: userOptions.title});
114
+ });
115
+
116
+ applebot.action("Upload next 3.5in screenshot", function() {
117
+ var screenshotPath = applebot.shortcuts.popScreenshotPaths(userOptions, 'screenshots_35');
118
+ page.fillSelectors('form[name="FileUploadForm_35InchRetinaDisplayScreenshots"]', {
119
+ '#fileInput_35InchRetinaDisplayScreenshots': screenshotPath
120
+ }, false);
121
+ });
122
+
123
+ applebot.action("Upload next 4in screenshot", function() {
124
+ var screenshotPath = applebot.shortcuts.popScreenshotPaths(userOptions, 'screenshots_4');
125
+ page.fillSelectors('form[name="FileUploadForm_iPhone5"]', {
126
+ '#fileInput_iPhone5': screenshotPath
127
+ }, false);
128
+ });
129
+
130
+ applebot.action('Find the add version button and click it', function() {
131
+ var hrefSelector = applebot.shortcuts.findHrefSelector('Add Version', page);
132
+ page.click(hrefSelector);
133
+ })
134
+
135
+ applebot.action('View details of pending update', function() {
136
+ var hrefSelector = applebot.shortcuts.findHrefSelector('View Details', page, '.column-container.right');
137
+ page.click(hrefSelector);
138
+ });
139
+
140
+ applebot.action('Fill initial update info form', function() {
141
+ var fillOptions = {};
142
+
143
+ var versionFieldName = findFieldName(page, "Version Number", '.middle > div');
144
+ fillOptions['input[name="' + versionFieldName + '"]'] = userOptions.app_version;
145
+
146
+ fillOptions['textarea'] = userOptions.update_description;
147
+
148
+ page.fillSelectors('#mainForm', fillOptions, false);
149
+
150
+ page.click('.saveChangesActionButton');
151
+ });
152
+
153
+ applebot.action('Click the Ready to Upload Binary button', function() {
154
+ try {
155
+ page.click(".customActionButton");
156
+ }
157
+ catch(err) {
158
+ // Button didn't exist, which means an update already
159
+ if (updateAlreadyExists) {
160
+ console.log("Finishing - binary was already ready to upload");
161
+ page.exit(0);
162
+ }
163
+ else {
164
+ page.die("Could not find the Ready To Upload button but an update was not already pending");
165
+ }
166
+ }
167
+ })
168
+
169
+ applebot.action("Click the Version Information edit button", function() {
170
+ page.click("h2 a");
171
+ });
172
+
173
+ applebot.action("Click the Metadata edit button", function() {
174
+ page.click("#localizationLightboxUpdate a");
175
+ });
176
+
177
+ applebot.action("Update app icon", function() {
178
+ page.fillSelectors('form[name="FileUploadForm_largeAppIcon"]', {
179
+ '#fileInput_largeAppIcon': userOptions.large_icon
180
+ }, false);
181
+ });
182
+
183
+ applebot.action("Save Metadata changes", function() {
184
+ page.click("#lightboxSaveButtonEnabled");
185
+ })
186
+
187
+ applebot.action('Close app icon update screen', function() {
188
+ page.click("#lightboxSaveButtonEnabled");
189
+ })
190
+
191
+ applebot.action("Update app title", function() {
192
+ var fillOptions = {};
193
+
194
+ page.evaluate(function(newTitle) {
195
+ document.querySelector('#appNameUpdateContainerId input').value = newTitle;
196
+ document.querySelector('#appNameUpdateContainerId input').onblur();
197
+ }, userOptions.new_title);
198
+ });
199
+
200
+ var clearScreenshots = function(selectorId) {
201
+ page.evaluate(function(selectorId) {
202
+ var screenshotContainer = Array.prototype.slice.call(document.querySelectorAll(".lcUploaderPictureSet")).filter(function(el) {
203
+ return el.id === selectorId;
204
+ })[0];
205
+ var deleteButtons = screenshotContainer.querySelectorAll(".lcUploaderImageDelete");
206
+ var buffer = "";
207
+ Array.prototype.forEach.call(
208
+ deleteButtons,
209
+ function(button) {
210
+ buffer += ("" + button);
211
+ var click_ev = document.createEvent("MouseEvent");
212
+ click_ev.initEvent("click", true /* bubble */, true /* cancelable */);
213
+
214
+ try {
215
+ button.dispatchEvent(click_ev);
216
+ }
217
+ catch (e) {
218
+ buffer += ("" + e);
219
+ }
220
+ }
221
+ );
222
+ }, selectorId);
223
+ }
224
+ applebot.action("Clear 3.5in screenshots", function() {
225
+ clearScreenshots("35InchRetinaDisplayScreenshots");
226
+ });
227
+
228
+ applebot.action("Clear 4in screenshots", function() {
229
+ clearScreenshots("iPhone5");
230
+ });
231
+
232
+ applebot.action('Fill export compliance page', function() {
233
+ applebot.shortcuts.safeFill(page, '#mainForm', {
234
+ 'encryptionHasChanged': "false",
235
+ 'ipContentsQuestionRadio': 'false',
236
+ 'booleanRadioButton': 'false',
237
+ 'hasLegalIssues': 'false'
238
+ }, false);
239
+ page.click('.continueActionButton');
240
+ });
241
+
242
+ applebot.action('Fill version release date page', function() {
243
+ page.fill("#mainForm", {
244
+ 'goLive': 'false'
245
+ }, false);
246
+ page.click('.saveChangesActionButton');
247
+ })
248
+
249
+
250
+
251
+ //////////////////////////
252
+ // Steps
253
+
254
+ //applebot.start("Click the 'Manage Your Apps' screen", applebot.shortcuts.openManageApps);
255
+
256
+ applebot.shortcuts.addStepsToSearchAndClickAppTitle(applebot, page, userOptions.title, function() {
257
+ try {
258
+ applebot.action('Find the add version button and click it');
259
+ }
260
+ catch(err) {
261
+ // Means there's already a submission pending
262
+ updateAlreadyExists = true;
263
+ applebot.action('View details of pending update');
264
+ };
265
+ })
266
+
267
+ applebot.step("Wait for the new version page", 'waitForText', 'New Version', function() {
268
+ applebot.action('Fill initial update info form');
269
+ }, {
270
+ onFail: function() {
271
+ if (updateAlreadyExists) {
272
+ return false;
273
+ }
274
+ }
275
+ })
276
+
277
+ var operations = [];
278
+ if (userOptions.new_title && (userOptions.new_title != userOptions.title)) {
279
+ operations.push('handleNewTitle');
280
+ }
281
+ if (userOptions.large_icon) {
282
+ operations.push('handleLargeIcon');
283
+ }
284
+ if (userOptions.screenshots_4) {
285
+ operations.push('handleScreenshots4');
286
+ }
287
+ if (userOptions.screenshots_35) {
288
+ operations.push('handleScreenshots35');
289
+ }
290
+
291
+ var length = operations.length;
292
+ for (var i = 0; i < length; i++) {
293
+ this[operations.pop()]();
294
+ }
295
+ addWaitForVersionInfoStep('Click the Ready to Upload Binary button');
296
+
297
+ applebot.step("Wait for the Export Compliance page", 'waitForText', 'Export Compliance', function() {
298
+ applebot.action('Fill export compliance page');
299
+ }, {
300
+ timeout: 10 * 1000
301
+ });
302
+
303
+ applebot.step("Wait release date page", 'waitForText', "You can control when this version of your app is released to the App Store", function() {
304
+ applebot.action('Fill version release date page');
305
+ });
306
+
307
+
308
+ applebot.shortcuts.openManageApps(page);
309
+ });
@@ -0,0 +1,9 @@
1
+ {
2
+ "username": "clay+applestore@usepropeller.com",
3
+ "password": "B0nnyB3ar",
4
+ "title": "Rebel Redefined",
5
+ "app_version": "1.5.1",
6
+ "update_description": "Interface adjustments, better performance, and bug fixes",
7
+ "screenshots_35": "[\"/Users/clayallsopp/Projects/Apptory/iOS/profiles/apps/37/screenshots/product_short.png\",\"/Users/clayallsopp/Projects/Apptory/iOS/profiles/apps/37/screenshots/menu_short.png\"]",
8
+ "screenshots_4": "[\"/Users/clayallsopp/Projects/Apptory/iOS/profiles/apps/37/screenshots/product.png\", \"/Users/clayallsopp/Projects/Apptory/iOS/profiles/apps/37/screenshots/menu.png\"]"
9
+ }
metadata ADDED
@@ -0,0 +1,143 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: applebot
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ platform: ruby
6
+ authors:
7
+ - Clay Allsopp
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2014-05-28 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: commander
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ~>
18
+ - !ruby/object:Gem::Version
19
+ version: 4.1.2
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ~>
25
+ - !ruby/object:Gem::Version
26
+ version: 4.1.2
27
+ - !ruby/object:Gem::Dependency
28
+ name: activesupport
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - '>='
32
+ - !ruby/object:Gem::Version
33
+ version: '3.2'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - '>='
39
+ - !ruby/object:Gem::Version
40
+ version: '3.2'
41
+ - !ruby/object:Gem::Dependency
42
+ name: terminal-table
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - '>='
46
+ - !ruby/object:Gem::Version
47
+ version: 1.4.0
48
+ type: :runtime
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - '>='
53
+ - !ruby/object:Gem::Version
54
+ version: 1.4.0
55
+ - !ruby/object:Gem::Dependency
56
+ name: rake
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - '>='
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - '>='
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
69
+ - !ruby/object:Gem::Dependency
70
+ name: dotenv
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - '>='
74
+ - !ruby/object:Gem::Version
75
+ version: '0'
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - '>='
81
+ - !ruby/object:Gem::Version
82
+ version: '0'
83
+ description: A robot for Apple Developer Center and iTunes Connect tasks
84
+ email: clay@usepropeller.com
85
+ executables:
86
+ - applebot
87
+ extensions: []
88
+ extra_rdoc_files: []
89
+ files:
90
+ - ./applebot.gemspec
91
+ - ./create_app_id_manifest.js
92
+ - ./create_manifest.js
93
+ - ./Gemfile
94
+ - ./Gemfile.lock
95
+ - ./lib/applebot/command_proxy.rb
96
+ - ./lib/applebot/commands.rb
97
+ - ./lib/applebot/error.rb
98
+ - ./lib/applebot/mkmf.rb
99
+ - ./lib/applebot/shell.rb
100
+ - ./lib/applebot/version.rb
101
+ - ./lib/applebot.rb
102
+ - ./LICENSE
103
+ - ./phantom/_commands.json
104
+ - ./phantom/applebot.js
105
+ - ./phantom/create_app.js
106
+ - ./phantom/create_app_id.js
107
+ - ./phantom/create_profile.js
108
+ - ./phantom/delete_app_id.js
109
+ - ./phantom/download_profile.js
110
+ - ./phantom/list_app_id.js
111
+ - ./phantom/list_profile.js
112
+ - ./phantom/reject_binary_app.js
113
+ - ./phantom/remove_from_sale_app.js
114
+ - ./phantom/update_app.js
115
+ - ./Rakefile
116
+ - ./README.md
117
+ - ./update_app_manifest.js
118
+ - bin/applebot
119
+ homepage: https://github.com/usepropeller/applebot
120
+ licenses:
121
+ - MIT
122
+ metadata: {}
123
+ post_install_message:
124
+ rdoc_options: []
125
+ require_paths:
126
+ - lib
127
+ required_ruby_version: !ruby/object:Gem::Requirement
128
+ requirements:
129
+ - - '>='
130
+ - !ruby/object:Gem::Version
131
+ version: '0'
132
+ required_rubygems_version: !ruby/object:Gem::Requirement
133
+ requirements:
134
+ - - '>='
135
+ - !ruby/object:Gem::Version
136
+ version: '0'
137
+ requirements: []
138
+ rubyforge_project:
139
+ rubygems_version: 2.0.3
140
+ signing_key:
141
+ specification_version: 4
142
+ summary: AppleBot
143
+ test_files: []