fastlane 2.52.0 → 2.53.0.beta.20170810010003

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: c7f3c794df6dc0a5cd82ae0ed33a3cd555c58e02
4
- data.tar.gz: bfc83e409c4b6daa53a5be411be8b9f645353c49
3
+ metadata.gz: 35a5438c6cd747913c5a9cf28d576bc5a5604257
4
+ data.tar.gz: 04ae63f0cce1d058af9dbe12d473540f6f30c422
5
5
  SHA512:
6
- metadata.gz: 5aa6e50c5bf45bb129d1e0978d46ffad40feef098efb8d01e1d986b19563ddff192e19544f91948ab83e841719b4323ae3eb97ae3d39fc17165677df27a89e58
7
- data.tar.gz: 0bd5fe9a8a057d0bf66678614c74066f42a4e355a2c8361dace35878ae7dcac8760c70f810cfac31c21e71ee6680b095405d6cd43dbc304d632c886b8aee606d
6
+ metadata.gz: 545f1f6239c5c61ee479f347419427e3b39c3825f465c09d6a9cbf28b561c6fe1e68366ed057239aa17917789da028bee547690fc8999dbc96b7e91b2324b9a2
7
+ data.tar.gz: cd58ec8f522573c123eb187e283b51cbd7d534690f713ff276b97c9058fd9edab45183139c8084ebc51f41c6edfc497b57cb4e7ad87e28c723a9f0dc57fc7bde
@@ -0,0 +1,157 @@
1
+ module Fastlane
2
+ module Actions
3
+ class ModifyServicesAction < Action
4
+ def self.run(params)
5
+ require 'produce'
6
+
7
+ return if Helper.test?
8
+
9
+ Produce.config = params
10
+
11
+ Dir.chdir(FastlaneCore::FastlaneFolder.path || Dir.pwd) do
12
+ require 'produce/service'
13
+ services = params[:services]
14
+
15
+ enabled_services = services.reject { |k, v| v == 'off' }
16
+ disabled_services = services.select { |k, v| v == 'off' }
17
+
18
+ enabled_services_object = self.service_object
19
+ enabled_services.each do |k, v|
20
+ enabled_services_object.__hash__[k] = true
21
+ enabled_services_object.send("#{k}=", v)
22
+ end
23
+ Produce::Service.enable(enabled_services_object, nil) unless enabled_services.empty?
24
+
25
+ disabled_services_object = self.service_object
26
+ disabled_services.each do |k, v|
27
+ disabled_services_object.__hash__[k] = true
28
+ disabled_services_object.send("#{k}=", v)
29
+ end
30
+ Produce::Service.disable(disabled_services_object, nil) unless disabled_services.empty?
31
+ end
32
+ end
33
+
34
+ def self.service_object
35
+ service_object = Object.new
36
+ service_object.class.module_eval { attr_accessor :__hash__ }
37
+ service_object.__hash__ = {}
38
+ Produce::DeveloperCenter::ALLOWED_SERVICES.keys.each do |service|
39
+ name = self.services_mapping[service]
40
+ service_object.class.module_eval { attr_accessor :"#{name}" }
41
+ end
42
+ service_object
43
+ end
44
+
45
+ def self.services_mapping
46
+ {
47
+ app_group: 'app_group',
48
+ apple_pay: 'apple_pay',
49
+ associated_domains: 'associated_domains',
50
+ data_protection: 'data_protection',
51
+ game_center: 'game_center',
52
+ health_kit: 'healthkit',
53
+ home_kit: 'homekit',
54
+ wireless_accessory: 'wireless_conf',
55
+ icloud: 'icloud',
56
+ in_app_purchase: 'in_app_purchase',
57
+ inter_app_audio: 'inter_app_audio',
58
+ passbook: 'passbook',
59
+ push_notification: 'push_notification',
60
+ siri_kit: 'sirikit',
61
+ vpn_configuration: 'vpn_conf'
62
+ }
63
+ end
64
+
65
+ def self.allowed_services_description
66
+ return Produce::DeveloperCenter::ALLOWED_SERVICES.map do |k, v|
67
+ "#{k}: (#{v.join('|')})"
68
+ end.join(", ")
69
+ end
70
+
71
+ def self.description
72
+ 'Modifies the services of the app created on Developer Portal'
73
+ end
74
+
75
+ def self.details
76
+ [
77
+ "Options are same as 'enable_services' in produce action",
78
+ "https://github.com/fastlane/fastlane/tree/master/produce"
79
+ ].join("\n")
80
+ end
81
+
82
+ def self.available_options
83
+ require 'produce'
84
+ user = CredentialsManager::AppfileConfig.try_fetch_value(:apple_dev_portal_id)
85
+ user ||= CredentialsManager::AppfileConfig.try_fetch_value(:apple_id)
86
+ [
87
+ FastlaneCore::ConfigItem.new(key: :username,
88
+ short_option: "-u",
89
+ env_name: "PRODUCE_USERNAME",
90
+ description: "Your Apple ID Username",
91
+ default_value: user),
92
+ FastlaneCore::ConfigItem.new(key: :app_identifier,
93
+ env_name: "PRODUCE_APP_IDENTIFIER",
94
+ short_option: "-a",
95
+ description: "App Identifier (Bundle ID, e.g. com.krausefx.app)",
96
+ default_value: CredentialsManager::AppfileConfig.try_fetch_value(:app_identifier)),
97
+ FastlaneCore::ConfigItem.new(key: :services,
98
+ display_in_shell: false,
99
+ env_name: "PRODUCE_ENABLE_SERVICES",
100
+ description: "Array with Spaceship App Services (e.g. #{allowed_services_description})",
101
+ is_string: false,
102
+ default_value: {},
103
+ verify_block: proc do |value|
104
+ allowed_keys = Produce::DeveloperCenter::ALLOWED_SERVICES.keys
105
+ UI.user_error!("enable_services has to be of type Hash") unless value.kind_of?(Hash)
106
+ value.each do |key, v|
107
+ UI.user_error!("The key: '#{key}' is not supported in `enable_services' - following keys are available: [#{allowed_keys.join(',')}]") unless allowed_keys.include? key.to_sym
108
+ end
109
+ end),
110
+ FastlaneCore::ConfigItem.new(key: :team_id,
111
+ short_option: "-b",
112
+ env_name: "PRODUCE_TEAM_ID",
113
+ description: "The ID of your Developer Portal team if you're in multiple teams",
114
+ optional: true,
115
+ default_value: CredentialsManager::AppfileConfig.try_fetch_value(:team_id),
116
+ verify_block: proc do |value|
117
+ ENV["FASTLANE_TEAM_ID"] = value.to_s
118
+ end),
119
+ FastlaneCore::ConfigItem.new(key: :team_name,
120
+ short_option: "-l",
121
+ env_name: "PRODUCE_TEAM_NAME",
122
+ description: "The name of your Developer Portal team if you're in multiple teams",
123
+ optional: true,
124
+ default_value: CredentialsManager::AppfileConfig.try_fetch_value(:team_name),
125
+ verify_block: proc do |value|
126
+ ENV["FASTLANE_TEAM_NAME"] = value.to_s
127
+ end)
128
+ ]
129
+ end
130
+
131
+ def self.author
132
+ "bhimsenpadalkar"
133
+ end
134
+
135
+ def self.is_supported?(platform)
136
+ platform == :ios
137
+ end
138
+
139
+ def self.example_code
140
+ [
141
+ 'modify_services(
142
+ username: "test.account@gmail.com",
143
+ app_identifier: "com.someorg.app",
144
+ services: {
145
+ push_notifications: "on",
146
+ associated_domains: "off"
147
+ }
148
+ )'
149
+ ]
150
+ end
151
+
152
+ def self.category
153
+ :misc
154
+ end
155
+ end
156
+ end
157
+ end
@@ -1,5 +1,5 @@
1
1
  module Fastlane
2
- VERSION = '2.52.0'.freeze
2
+ VERSION = '2.53.0.beta.20170810010003'.freeze
3
3
  DESCRIPTION = "The easiest way to automate beta deployments and releases for your iOS and Android apps".freeze
4
4
  MINIMUM_XCODE_RELEASE = "7.0".freeze
5
5
  end
@@ -60,7 +60,7 @@ module FastlaneCore
60
60
  end
61
61
 
62
62
  def command(message)
63
- log.info("$ #{message}".cyan.underline)
63
+ log.info("$ #{message}".cyan)
64
64
  end
65
65
 
66
66
  def command_output(message)
data/frameit/README.md CHANGED
@@ -141,7 +141,8 @@ Use it to define the general information:
141
141
  "background": "./background.jpg",
142
142
  "padding": 50,
143
143
  "show_complete_frame": false,
144
- "stack_title" : false
144
+ "stack_title" : false,
145
+ "title_below_image": true
145
146
  },
146
147
 
147
148
  "data": [
@@ -176,6 +177,8 @@ The `stack_title` value specifies whether `frameit` should display the keyword a
176
177
 
177
178
  The `show_complete_frame` value specifies whether `frameit` should shrink the device and frame so that they show in full in the framed screenshot. If it is false, then they can hang over the bottom of the screenshot.
178
179
 
180
+ The `title_below_image` value specifies whether `frameit` should place the title below the screenshot. If it is false, it will be placed above the screenshot.
181
+
179
182
  The `filter` value is a part of the screenshot named for which the given option should be used. If a screenshot is named `iPhone5_Brainstorming.png` the first entry in the `data` array will be used.
180
183
 
181
184
  You can find a more complex [configuration](https://github.com/fastlane/examples/blob/master/MindNode/screenshots/Framefile.json) to also support Chinese, Japanese and Korean languages.
@@ -83,8 +83,8 @@ module Frameit
83
83
  unless value.kind_of?(Integer) || value.split('x').length == 2 || (value.end_with?('%') && value.to_f > 0)
84
84
  UI.user_error!("padding must be type integer or pair of integers of format 'AxB' or a percentage of screen size")
85
85
  end
86
- when 'show_complete_frame'
87
- UI.user_error! "show_complete_frame must be a Boolean" unless [true, false].include?(value)
86
+ when 'show_complete_frame', 'title_below_image'
87
+ UI.user_error! "'#{key}' must be a Boolean" unless [true, false].include?(value)
88
88
  when 'font_scale_factor'
89
89
  UI.user_error!("font_scale_factor must be numeric") unless value.kind_of?(Numeric)
90
90
  end
@@ -3,7 +3,7 @@ module Frameit
3
3
  attr_accessor :screenshot # reference to the screenshot object to fetch the path, title, etc.
4
4
  attr_accessor :frame # the frame of the device
5
5
  attr_accessor :image # the current image used for editing
6
- attr_accessor :top_space_above_device
6
+ attr_accessor :space_to_device
7
7
 
8
8
  def frame!(screenshot)
9
9
  self.screenshot = screenshot
@@ -104,7 +104,7 @@ module Frameit
104
104
  def complex_framing
105
105
  background = generate_background
106
106
 
107
- self.top_space_above_device = vertical_frame_padding
107
+ self.space_to_device = vertical_frame_padding
108
108
 
109
109
  if fetch_config['title']
110
110
  background = put_title_into_background(background, fetch_config['stack_title'])
@@ -116,7 +116,7 @@ module Frameit
116
116
 
117
117
  # Decrease the size of the framed screenshot to fit into the defined padding + background
118
118
  frame_width = background.width - horizontal_frame_padding * 2
119
- frame_height = background.height - top_space_above_device - vertical_frame_padding
119
+ frame_height = background.height - space_to_device - vertical_frame_padding
120
120
 
121
121
  if fetch_config['show_complete_frame']
122
122
  # calculate the final size of the screenshot to resize in one go
@@ -177,10 +177,17 @@ module Frameit
177
177
 
178
178
  def put_device_into_background(background)
179
179
  left_space = (background.width / 2.0 - image.width / 2.0).round
180
+ title_below_image = fetch_config['title_below_image']
180
181
 
181
182
  @image = background.composite(image, "png") do |c|
182
183
  c.compose "Over"
183
- c.geometry "+#{left_space}+#{top_space_above_device}"
184
+ if title_below_image
185
+ show_complete_frame = fetch_config['show_complete_frame']
186
+ c.geometry "+#{left_space}+#{background.height - image.height - space_to_device}" unless show_complete_frame
187
+ c.geometry "+#{left_space}+#{vertical_frame_padding}" if show_complete_frame
188
+ else
189
+ c.geometry "+#{left_space}+#{space_to_device}"
190
+ end
184
191
  end
185
192
 
186
193
  return image
@@ -205,8 +212,8 @@ module Frameit
205
212
  text.resize "#{(smaller * text.width).round}x"
206
213
  end
207
214
  end
208
- # Add the title above the device
209
215
 
216
+ # Add the title above or below the device
210
217
  def put_title_into_background_stacked(background, title, keyword)
211
218
  resize_text(title)
212
219
  resize_text(keyword)
@@ -222,16 +229,20 @@ module Frameit
222
229
  title_left_space = (background.width / 2.0 - title_width / 2.0).round
223
230
  keyword_left_space = (background.width / 2.0 - keyword_width / 2.0).round
224
231
 
225
- self.top_space_above_device += title.height + keyword.height + spacing_between_title_and_keyword + vertical_padding
232
+ self.space_to_device += title.height + keyword.height + spacing_between_title_and_keyword + vertical_padding
233
+ title_below_image = fetch_config['title_below_image']
226
234
  # keyword
227
235
  background = background.composite(keyword, "png") do |c|
228
236
  c.compose "Over"
229
- c.geometry "+#{keyword_left_space}+#{keyword_top_space}"
237
+ c.geometry "+#{keyword_left_space}+#{keyword_top_space}" unless title_below_image
238
+ c.geometry "+#{keyword_left_space}+#{background.height - space_to_device + keyword_top_space}" if title_below_image
230
239
  end
231
240
  # Then, put the title on top of the screenshot next to the keyword
241
+ # Then, put the title above/below of the screenshot next to the keyword
232
242
  background = background.composite(title, "png") do |c|
233
243
  c.compose "Over"
234
- c.geometry "+#{title_left_space}+#{title_top_space}"
244
+ c.geometry "+#{title_left_space}+#{title_top_space}" unless title_below_image
245
+ c.geometry "+#{title_left_space}+#{background.height - space_to_device + title_top_space}" if title_below_image
235
246
  end
236
247
  background
237
248
  end
@@ -268,14 +279,16 @@ module Frameit
268
279
  vertical_padding = vertical_frame_padding
269
280
  top_space = vertical_padding + (actual_font_size - title.height) / 2
270
281
  left_space = (background.width / 2.0 - sum_width / 2.0).round
282
+ title_below_image = fetch_config['title_below_image']
271
283
 
272
- self.top_space_above_device += actual_font_size + vertical_padding
284
+ self.space_to_device += actual_font_size + vertical_padding
273
285
 
274
286
  # First, put the keyword on top of the screenshot, if we have one
275
287
  if keyword
276
288
  background = background.composite(keyword, "png") do |c|
277
289
  c.compose "Over"
278
- c.geometry "+#{left_space}+#{top_space}"
290
+ c.geometry "+#{left_space}+#{top_space}" unless title_below_image
291
+ c.geometry "+#{left_space}+#{background.height - space_to_device + top_space}" if title_below_image
279
292
  end
280
293
 
281
294
  left_space += keyword.width + (keyword_padding * smaller)
@@ -284,7 +297,8 @@ module Frameit
284
297
  # Then, put the title on top of the screenshot next to the keyword
285
298
  background = background.composite(title, "png") do |c|
286
299
  c.compose "Over"
287
- c.geometry "+#{left_space}+#{top_space}"
300
+ c.geometry "+#{left_space}+#{top_space}" unless title_below_image
301
+ c.geometry "+#{left_space}+#{background.height - space_to_device + top_space}" if title_below_image
288
302
  end
289
303
  background
290
304
  end
data/produce/README.md CHANGED
@@ -109,6 +109,7 @@ To get a list of all available parameters:
109
109
  -c, --company_name STRING The name of your company. Only required if it's the first app you create (PRODUCE_COMPANY_NAME)
110
110
  -i, --skip_itc [VALUE] Skip the creation of the app on iTunes Connect (PRODUCE_SKIP_ITC)
111
111
  -d, --skip_devcenter [VALUE] Skip the creation of the app on the Apple Developer Portal (PRODUCE_SKIP_DEVCENTER)
112
+ -s, --itc_users ARRAY Array of iTunes Connect users. If provided, you can limit access to this newly created app for users with the App Manager, Developer, Marketer or Sales roles (ITC_USERS)
112
113
  -b, --team_id STRING The ID of your Developer Portal team if you're in multiple teams (PRODUCE_TEAM_ID)
113
114
  -l, --team_name STRING The name of your Developer Portal team if you're in multiple teams (PRODUCE_TEAM_NAME)
114
115
  -k, --itc_team_id [VALUE] The ID of your iTunes Connect team if you're in multiple teams (PRODUCE_ITC_TEAM_ID)
@@ -21,14 +21,14 @@ module Produce
21
21
  UI.success "Creating new app '#{Produce.config[:app_name]}' on iTunes Connect"
22
22
 
23
23
  Produce.config[:bundle_identifier_suffix] = '' unless wildcard_bundle?
24
-
25
24
  generated_app = Spaceship::Tunes::Application.create!(name: Produce.config[:app_name],
26
25
  primary_language: language,
27
26
  sku: Produce.config[:sku].to_s, # might be an int
28
27
  bundle_id: app_identifier,
29
28
  bundle_id_suffix: Produce.config[:bundle_identifier_suffix],
30
29
  company_name: Produce.config[:company_name],
31
- platform: Produce.config[:platform])
30
+ platform: Produce.config[:platform],
31
+ itunes_connect_users: Produce.config[:itc_users])
32
32
 
33
33
  UI.crash!("Something went wrong when creating the new app on iTC") if generated_app["adamId"].to_s.empty?
34
34
 
@@ -65,7 +65,13 @@ module Produce
65
65
  description: "Skip the creation of the app on iTunes Connect",
66
66
  is_string: false,
67
67
  default_value: false),
68
-
68
+ FastlaneCore::ConfigItem.new(key: :itc_users,
69
+ short_option: "-s",
70
+ env_name: "ITC_USERS",
71
+ optional: true,
72
+ type: Array,
73
+ description: "Array of iTunes Connect users. If provided, you can limit access to this newly created app for users with the App Manager, Developer, Marketer or Sales roles",
74
+ is_string: false),
69
75
  # Deprecating this in favor of a rename from "enabled_features" to "enable_services"
70
76
  FastlaneCore::ConfigItem.new(key: :enabled_features,
71
77
  deprecated: "Please use `enable_services` instead",
@@ -77,7 +77,7 @@ module Spaceship
77
77
  # @param platform (String): Platform one of (ios,osx)
78
78
  # should it be an ios or an osx app
79
79
 
80
- def create!(name: nil, primary_language: nil, version: nil, sku: nil, bundle_id: nil, bundle_id_suffix: nil, company_name: nil, platform: nil)
80
+ def create!(name: nil, primary_language: nil, version: nil, sku: nil, bundle_id: nil, bundle_id_suffix: nil, company_name: nil, platform: nil, itunes_connect_users: nil)
81
81
  puts "The `version` parameter is deprecated. Use `ensure_version!` method instead" if version
82
82
  client.create_application!(name: name,
83
83
  primary_language: primary_language,
@@ -85,7 +85,8 @@ module Spaceship
85
85
  bundle_id: bundle_id,
86
86
  bundle_id_suffix: bundle_id_suffix,
87
87
  company_name: company_name,
88
- platform: platform)
88
+ platform: platform,
89
+ itunes_connect_users: itunes_connect_users)
89
90
  end
90
91
  end
91
92
 
@@ -210,7 +210,7 @@ module Spaceship
210
210
  # @param sku (String): A unique ID for your app that is not visible on the App Store.
211
211
  # @param bundle_id (String): The bundle ID must match the one you used in Xcode. It
212
212
  # can't be changed after you submit your first build.
213
- def create_application!(name: nil, primary_language: nil, version: nil, sku: nil, bundle_id: nil, bundle_id_suffix: nil, company_name: nil, platform: nil)
213
+ def create_application!(name: nil, primary_language: nil, version: nil, sku: nil, bundle_id: nil, bundle_id_suffix: nil, company_name: nil, platform: nil, itunes_connect_users: nil)
214
214
  puts "The `version` parameter is deprecated. Use `Spaceship::Tunes::Application.ensure_version!` method instead" if version
215
215
 
216
216
  # First, we need to fetch the data from Apple, which we then modify with the user's values
@@ -233,6 +233,11 @@ module Spaceship
233
233
  data['initialPlatform'] = platform
234
234
  data['enabledPlatformsForCreation'] = { value: [platform] }
235
235
 
236
+ unless itunes_connect_users.nil?
237
+ data['iTunesConnectUsers']['grantedAllUsers'] = false
238
+ data['iTunesConnectUsers']['grantedUsers'] = data['iTunesConnectUsers']['availableUsers'].select { |user| itunes_connect_users.include? user['username'] }
239
+ end
240
+
236
241
  # Now send back the modified hash
237
242
  r = request(:post) do |req|
238
243
  req.url 'ra/apps/create/v2'
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: fastlane
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.52.0
4
+ version: 2.53.0.beta.20170810010003
5
5
  platform: ruby
6
6
  authors:
7
7
  - Felix Krause
@@ -15,7 +15,7 @@ authors:
15
15
  autorequire:
16
16
  bindir: bin
17
17
  cert_chain: []
18
- date: 2017-08-09 00:00:00.000000000 Z
18
+ date: 2017-08-10 00:00:00.000000000 Z
19
19
  dependencies:
20
20
  - !ruby/object:Gem::Dependency
21
21
  name: slack-notifier
@@ -830,7 +830,6 @@ files:
830
830
  - fastlane/lib/assets/s3_plist_template.erb
831
831
  - fastlane/lib/assets/s3_version_template.erb
832
832
  - fastlane/lib/fastlane.rb
833
- - fastlane/lib/fastlane/.DS_Store
834
833
  - fastlane/lib/fastlane/action.rb
835
834
  - fastlane/lib/fastlane/action_collector.rb
836
835
  - fastlane/lib/fastlane/actions/README.md
@@ -932,6 +931,7 @@ files:
932
931
  - fastlane/lib/fastlane/actions/mailgun.rb
933
932
  - fastlane/lib/fastlane/actions/make_changelog_from_jenkins.rb
934
933
  - fastlane/lib/fastlane/actions/match.rb
934
+ - fastlane/lib/fastlane/actions/modify_services.rb
935
935
  - fastlane/lib/fastlane/actions/nexus_upload.rb
936
936
  - fastlane/lib/fastlane/actions/notification.rb
937
937
  - fastlane/lib/fastlane/actions/notify.rb
@@ -1406,24 +1406,24 @@ metadata:
1406
1406
  post_install_message:
1407
1407
  rdoc_options: []
1408
1408
  require_paths:
1409
- - cert/lib
1410
- - credentials_manager/lib
1411
- - deliver/lib
1409
+ - spaceship/lib
1410
+ - scan/lib
1411
+ - sigh/lib
1412
+ - snapshot/lib
1413
+ - screengrab/lib
1412
1414
  - fastlane/lib
1413
- - fastlane_core/lib
1414
- - frameit/lib
1415
+ - cert/lib
1416
+ - pem/lib
1415
1417
  - gym/lib
1418
+ - produce/lib
1419
+ - deliver/lib
1420
+ - supply/lib
1416
1421
  - match/lib
1417
- - pem/lib
1422
+ - frameit/lib
1423
+ - credentials_manager/lib
1418
1424
  - pilot/lib
1419
1425
  - precheck/lib
1420
- - produce/lib
1421
- - scan/lib
1422
- - screengrab/lib
1423
- - sigh/lib
1424
- - snapshot/lib
1425
- - spaceship/lib
1426
- - supply/lib
1426
+ - fastlane_core/lib
1427
1427
  required_ruby_version: !ruby/object:Gem::Requirement
1428
1428
  requirements:
1429
1429
  - - ">="
@@ -1431,15 +1431,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
1431
1431
  version: 2.0.0
1432
1432
  required_rubygems_version: !ruby/object:Gem::Requirement
1433
1433
  requirements:
1434
- - - ">="
1434
+ - - ">"
1435
1435
  - !ruby/object:Gem::Version
1436
- version: '0'
1436
+ version: 1.3.1
1437
1437
  requirements: []
1438
1438
  rubyforge_project:
1439
- rubygems_version: 2.6.8
1439
+ rubygems_version: 2.4.5.1
1440
1440
  signing_key:
1441
1441
  specification_version: 4
1442
1442
  summary: The easiest way to automate beta deployments and releases for your iOS and
1443
1443
  Android apps
1444
1444
  test_files: []
1445
- has_rdoc:
Binary file