fastlane-plugin-amazon_appstore 1.1.0 → 1.3.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
  SHA256:
3
- metadata.gz: eda405ecfd4552721a5fad15738d20f2923b56007d2bf902f0777675bf407e66
4
- data.tar.gz: e14898796f4aa0effa8e460adeaebb85bb3a2987db1695110ab505d9cd7ad60a
3
+ metadata.gz: 21d358d66c528f38a3ad99d3b980b4c8e2d57b83e57bfcd5a459384e458f6822
4
+ data.tar.gz: 49e5ad56a1c3757f61cc8c8db28904e46ee463eee4d6baf2a18369da56edc1fd
5
5
  SHA512:
6
- metadata.gz: fe5a72a6bd0931931f8c7d3a0e2e25a80d487d7a370489fbf8f370c358882c4a225d48c38bdb8130c4bb62b2ebdbf4c299bb08b6b7b90c3086a1e132ee1a7c63
7
- data.tar.gz: f3768bf3ffe9364a0f922b7756452c547b365ab8a2e5d57a78980ecc628cf4afb5cf6ec3cf620a25b0d09db34277a4d13996c624282d092d7a3539afdd08d4bc
6
+ metadata.gz: 5c7ed8b749f7e73584a502de0603bcf8d11038ea3d20319af5d548f0af753d9438ac8ad3d4c3a0814826469e4bc1a1b068501b837fb58c70e6936f1215e1cf22
7
+ data.tar.gz: f2d7560dec9330c9cc110f00efe6b4db5d0a41b4cdf986567a2cee0c3932e2b5edb9ed19bd578e12ff72e68942dd6b649e39ef80318aef3efd35a4f9420c18e7
data/README.md CHANGED
@@ -15,8 +15,6 @@ fastlane add_plugin amazon_appstore
15
15
 
16
16
  Upload the apk to the Amazon Appstore using the [App Submission API](https://developer.amazon.com/docs/app-submission-api/overview.html).
17
17
 
18
- In the future, it would be nice to be able to use it to update store information like `upload_to_play_store`, but for now, it only supports replacing apk and submitting it for review.
19
-
20
18
  ## Usage
21
19
 
22
20
  Following the [guide](https://developer.amazon.com/docs/app-submission-api/auth.html), you will need to generate `client_id` and `client_secret` to access the console in advance.
@@ -35,7 +33,8 @@ upload_to_amazon_appstore(
35
33
  | Key | Description | Default |
36
34
  | --------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------ | --------------------------- |
37
35
  | package_name | The package name of the application to use | * |
38
- | apk | Path to the APK file to upload | |
36
+ | apk | Path to the APK file to upload (optional if apk_paths is provided) | |
37
+ | apk_paths | An array of paths to APK files to upload (optional if apk is provided) | |
39
38
  | client_id | The client ID you saved | |
40
39
  | client_secret | The client secret you saved | |
41
40
  | skip_upload_changelogs | Whether to skip uploading changelogs | false |
@@ -48,7 +47,9 @@ upload_to_amazon_appstore(
48
47
  ### Changelogs
49
48
 
50
49
  You can update the release notes by adding a file under `changelogs/` in the same way as [supply](https://docs.fastlane.tools/actions/upload_to_play_store/).
51
- The filename should exactly match the version code of the APK that it represents. You can also provide default notes that will be used if no files match the version code by adding a default.txt file.
50
+ The filename should exactly match the version code of the APK that it represents. You can also provide default notes that will be used if no files match the version code by adding a default.txt file.
51
+
52
+ When uploading multiple APKs with different version codes, the plugin will use the changelog from the highest version code, following the same approach as Fastlane's `upload_to_play_store` action.
52
53
 
53
54
  ```
54
55
  └── fastlane
@@ -46,27 +46,40 @@ module Fastlane
46
46
  end
47
47
  UI.abort_with_message!("Failed to get edit_id") if edit_id.nil?
48
48
 
49
- UI.message("Replacing apk...")
49
+ apks = []
50
+ apks << params[:apk] if params[:apk]
51
+ apks += params[:apk_paths] if params[:apk_paths]
52
+
53
+ if apks.empty?
54
+ UI.abort_with_message!("No APK files provided. Please provide either 'apk' or 'apk_paths' parameter")
55
+ end
56
+
57
+ UI.message("Replacing APKs with #{apks.length} file(s)...")
50
58
  begin
51
- version_code = Helper::AmazonAppstoreHelper.replace_apk(
52
- local_apk_path: params[:apk],
59
+ apk_results = Helper::AmazonAppstoreHelper.replace_apks(
60
+ apk_paths: apks,
53
61
  app_id: params[:package_name],
54
62
  edit_id: edit_id,
55
63
  token: token
56
64
  )
57
65
  rescue StandardError => e
58
66
  UI.error(e.message)
59
- UI.abort_with_message!("Failed to replace apk")
67
+ UI.abort_with_message!("Failed to replace APKs")
68
+ end
69
+
70
+ # Extract version codes and display results
71
+ version_codes = apk_results.map { |result| result[:version_code] }
72
+ apk_results.each_with_index do |result, index|
73
+ UI.message("Successfully processed APK #{index + 1} with version code: #{result[:version_code]}")
60
74
  end
61
- UI.abort_with_message!("Failed to get version_code") if version_code.nil?
62
75
 
63
76
  UI.message("Updating release notes...")
64
77
  begin
65
- Helper::AmazonAppstoreHelper.update_listings(
78
+ Helper::AmazonAppstoreHelper.update_listings_for_multiple_apks(
66
79
  app_id: params[:package_name],
67
80
  edit_id: edit_id,
68
81
  token: token,
69
- version_code: version_code,
82
+ version_codes: version_codes,
70
83
  skip_upload_changelogs: params[:skip_upload_changelogs],
71
84
  metadata_path: params[:metadata_path]
72
85
  )
@@ -132,8 +145,13 @@ module Fastlane
132
145
  FastlaneCore::ConfigItem.new(key: :apk,
133
146
  env_name: "AMAZON_APPSTORE_APK",
134
147
  description: "The path of the apk file",
135
- optional: false,
148
+ optional: true,
136
149
  type: String),
150
+ FastlaneCore::ConfigItem.new(key: :apk_paths,
151
+ env_name: "AMAZON_APPSTORE_APK_PATHS",
152
+ description: "An array of paths to APK files to upload",
153
+ optional: true,
154
+ type: Array),
137
155
  FastlaneCore::ConfigItem.new(key: :skip_upload_changelogs,
138
156
  env_name: "AMAZON_APPSTORE_SKIP_UPLOAD_CHANGELOGS",
139
157
  description: "Whether to skip uploading changelogs",
@@ -148,7 +166,7 @@ module Fastlane
148
166
  type: String),
149
167
  FastlaneCore::ConfigItem.new(key: :changes_not_sent_for_review,
150
168
  env_name: "AMAZON_APPSTORE_CHANGES_NOT_SENT_FOR_REVIEW",
151
- description: "Indices that the changes in this edit will not be reviewed until they are explicitly sent for review from the Amazon Appstore Console UI",
169
+ description: "Indicates that the changes in this edit will not be reviewed until they are explicitly sent for review from the Amazon Appstore Console UI",
152
170
  default_value: false,
153
171
  optional: true,
154
172
  type: Boolean),
@@ -65,17 +65,99 @@ module Fastlane
65
65
  raise StandardError, delete_edits_response.body unless delete_edits_response.success?
66
66
  end
67
67
 
68
- def self.replace_apk(local_apk_path:, app_id:, edit_id:, token:)
68
+ def self.upload_apk(local_apk_path:, app_id:, edit_id:, token:)
69
+ upload_apk_path = "api/appstore/v1/applications/#{app_id}/edits/#{edit_id}/apks/upload"
70
+ upload_apk_response = api_client.post(upload_apk_path) do |request|
71
+ request.body = Faraday::UploadIO.new(local_apk_path, 'application/vnd.android.package-archive')
72
+ request.headers['Content-Length'] = request.body.stat.size.to_s
73
+ request.headers['Content-Type'] = 'application/vnd.android.package-archive'
74
+ request.headers['Authorization'] = "Bearer #{token}"
75
+ end
76
+ raise StandardError, upload_apk_response.body unless upload_apk_response.success?
77
+
78
+ {
79
+ version_code: upload_apk_response.body[:versionCode],
80
+ apk_id: upload_apk_response.body[:id]
81
+ }
82
+ end
83
+
84
+ def self.replace_apks(apk_paths:, app_id:, edit_id:, token:)
85
+ # Get existing APKs in the edit
69
86
  get_apks_path = "api/appstore/v1/applications/#{app_id}/edits/#{edit_id}/apks"
70
87
  get_apks_response = api_client.get(get_apks_path) do |request|
71
88
  request.headers['Authorization'] = "Bearer #{token}"
72
89
  end
73
90
  raise StandardError, get_apks_response.body unless get_apks_response.success?
74
91
 
75
- first_apk = get_apks_response.body[0]
76
- apk_id = first_apk[:id]
77
- raise StandardError, 'apk_id is nil' if apk_id.nil?
92
+ existing_apks = get_apks_response.body
93
+ raise StandardError, 'No existing APKs found in edit' if existing_apks.empty?
94
+
95
+ version_codes = []
96
+ apk_results = []
97
+
98
+ apk_paths.each_with_index do |apk_path, index|
99
+ if index < existing_apks.length
100
+ # Replace existing APK at the specified index
101
+ apk_id = existing_apks[index][:id]
102
+ raise StandardError, "apk_id is nil for index #{index}" if apk_id.nil?
103
+
104
+ # Get ETag for the specific APK
105
+ get_etag_path = "api/appstore/v1/applications/#{app_id}/edits/#{edit_id}/apks/#{apk_id}"
106
+ etag_response = api_client.get(get_etag_path) do |request|
107
+ request.headers['Authorization'] = "Bearer #{token}"
108
+ end
109
+ raise StandardError, etag_response.body unless etag_response.success?
78
110
 
111
+ etag = etag_response.headers['Etag']
112
+
113
+ # Replace the APK
114
+ replace_apk_path = "api/appstore/v1/applications/#{app_id}/edits/#{edit_id}/apks/#{apk_id}/replace"
115
+ replace_apk_response = api_client.put(replace_apk_path) do |request|
116
+ request.body = Faraday::UploadIO.new(apk_path, 'application/vnd.android.package-archive')
117
+ request.headers['Content-Length'] = request.body.stat.size.to_s
118
+ request.headers['Content-Type'] = 'application/vnd.android.package-archive'
119
+ request.headers['Authorization'] = "Bearer #{token}"
120
+ request.headers['If-Match'] = etag
121
+ end
122
+ raise StandardError, replace_apk_response.body unless replace_apk_response.success?
123
+
124
+ version_code = replace_apk_response.body[:versionCode]
125
+ version_codes << version_code
126
+ apk_results << { version_code: version_code, apk_id: apk_id }
127
+ else
128
+ # Upload new APK if there are more APK paths than existing APKs
129
+ result = upload_apk(
130
+ local_apk_path: apk_path,
131
+ app_id: app_id,
132
+ edit_id: edit_id,
133
+ token: token
134
+ )
135
+ version_codes << result[:version_code]
136
+ apk_results << result
137
+ end
138
+ end
139
+
140
+ # Delete remaining APKs if there are more existing APKs than specified APK paths
141
+ if existing_apks.length > apk_paths.length
142
+ remaining_apks = existing_apks[apk_paths.length..]
143
+ UI.message("Deleting #{remaining_apks.length} remaining APK(s)...")
144
+
145
+ remaining_apks.each_with_index do |apk, index|
146
+ delete_apk(
147
+ app_id: app_id,
148
+ edit_id: edit_id,
149
+ apk_id: apk[:id],
150
+ token: token
151
+ )
152
+ UI.message("Deleted APK ID: #{apk[:id]} (position #{apk_paths.length + index + 1})")
153
+ end
154
+ end
155
+
156
+ apk_results
157
+ end
158
+
159
+ def self.delete_apk(app_id:, edit_id:, apk_id:, token:)
160
+ # Get ETag for the APK to be deleted
79
161
  get_etag_path = "api/appstore/v1/applications/#{app_id}/edits/#{edit_id}/apks/#{apk_id}"
80
162
  etag_response = api_client.get(get_etag_path) do |request|
81
163
  request.headers['Authorization'] = "Bearer #{token}"
@@ -84,17 +166,57 @@ module Fastlane
84
166
 
85
167
  etag = etag_response.headers['Etag']
86
168
 
87
- replace_apk_path = "api/appstore/v1/applications/#{app_id}/edits/#{edit_id}/apks/#{apk_id}/replace"
88
- replace_apk_response = api_client.put(replace_apk_path) do |request|
89
- request.body = Faraday::UploadIO.new(local_apk_path, 'application/vnd.android.package-archive')
90
- request.headers['Content-Length'] = request.body.stat.size.to_s
91
- request.headers['Content-Type'] = 'application/vnd.android.package-archive'
169
+ # Delete the APK
170
+ delete_apk_path = "api/appstore/v1/applications/#{app_id}/edits/#{edit_id}/apks/#{apk_id}"
171
+ delete_apk_response = api_client.delete(delete_apk_path) do |request|
92
172
  request.headers['Authorization'] = "Bearer #{token}"
93
173
  request.headers['If-Match'] = etag
94
174
  end
95
- raise StandardError, replace_apk_response.body unless replace_apk_response.success?
175
+ raise StandardError, delete_apk_response.body unless delete_apk_response.success?
96
176
 
97
- replace_apk_response.body[:versionCode]
177
+ UI.message("Successfully deleted APK #{apk_id}")
178
+ end
179
+
180
+ def self.update_listings_for_multiple_apks(app_id:, edit_id:, token:, version_codes:, skip_upload_changelogs:, metadata_path:)
181
+ return if skip_upload_changelogs
182
+
183
+ UI.message("Updating listings for #{version_codes.length} version codes: #{version_codes.join(', ')}")
184
+
185
+ # Get listings once with ETag
186
+ listings_path = "api/appstore/v1/applications/#{app_id}/edits/#{edit_id}/listings"
187
+ listings_response = api_client.get(listings_path) do |request|
188
+ request.headers['Authorization'] = "Bearer #{token}"
189
+ end
190
+ raise StandardError, listings_response.body unless listings_response.success?
191
+
192
+ # Process each language once
193
+ listings_response.body[:listings].each do |lang, listing|
194
+ # Get fresh ETag for each language update to avoid conflicts
195
+ etag_response = api_client.get(listings_path) do |request|
196
+ request.headers['Authorization'] = "Bearer #{token}"
197
+ end
198
+ raise StandardError, etag_response.body unless etag_response.success?
199
+
200
+ etag = etag_response.headers['Etag']
201
+
202
+ # Find the best changelog for multiple version codes
203
+ recent_changes = find_changelog_for_multiple_version_codes(
204
+ language: listing[:language],
205
+ version_codes: version_codes,
206
+ metadata_path: metadata_path
207
+ )
208
+ listing[:recentChanges] = recent_changes
209
+
210
+ # Update listings once per language
211
+ update_listings_path = "api/appstore/v1/applications/#{app_id}/edits/#{edit_id}/listings/#{lang}"
212
+ update_listings_response = api_client.put(update_listings_path) do |request|
213
+ request.body = listing.to_json
214
+ request.headers['Authorization'] = "Bearer #{token}"
215
+ request.headers['If-Match'] = etag
216
+ end
217
+ raise StandardError, update_listings_response.body unless update_listings_response.success?
218
+ end
219
+ nil
98
220
  end
99
221
 
100
222
  def self.update_listings(app_id:, edit_id:, token:, version_code:, skip_upload_changelogs:, metadata_path:)
@@ -173,6 +295,18 @@ module Fastlane
173
295
  end
174
296
  private_class_method :auth_client
175
297
 
298
+ def self.find_changelog_for_multiple_version_codes(language:, version_codes:, metadata_path:)
299
+ # Use the highest version code's changelog (same as Fastlane's approach)
300
+ max_version_code = version_codes.max
301
+ UI.message("Using changelog for highest version code: #{max_version_code}")
302
+ find_changelog(
303
+ language: language,
304
+ version_code: max_version_code,
305
+ skip_upload_changelogs: false,
306
+ metadata_path: metadata_path
307
+ )
308
+ end
309
+
176
310
  def self.find_changelog(language:, version_code:, skip_upload_changelogs:, metadata_path:)
177
311
  # The Amazon appstore requires you to enter changelogs before reviewing.
178
312
  # Therefore, if there is no metadata, hyphen text is returned.
@@ -180,14 +314,14 @@ module Fastlane
180
314
  return changelog_text if skip_upload_changelogs
181
315
 
182
316
  path = File.join(metadata_path, language, 'changelogs', "#{version_code}.txt")
183
- if File.exist?(path) && !File.zero?(path)
317
+ if File.exist?(path) && !File.empty?(path)
184
318
  UI.message("Updating changelog for '#{version_code}' and language '#{language}'...")
185
319
  changelog_text = File.read(path, encoding: 'UTF-8')
186
320
  else
187
- defalut_changelog_path = File.join(metadata_path, language, 'changelogs', 'default.txt')
188
- if File.exist?(defalut_changelog_path) && !File.zero?(defalut_changelog_path)
321
+ default_changelog_path = File.join(metadata_path, language, 'changelogs', 'default.txt')
322
+ if File.exist?(default_changelog_path) && !File.empty?(default_changelog_path)
189
323
  UI.message("Updating changelog for '#{version_code}' and language '#{language}' to default changelog...")
190
- changelog_text = File.read(defalut_changelog_path, encoding: 'UTF-8')
324
+ changelog_text = File.read(default_changelog_path, encoding: 'UTF-8')
191
325
  else
192
326
  UI.message("Could not find changelog for '#{version_code}' and language '#{language}' at path #{path}...")
193
327
  end
@@ -1,5 +1,5 @@
1
1
  module Fastlane
2
2
  module AmazonAppstore
3
- VERSION = "1.1.0"
3
+ VERSION = "1.3.0"
4
4
  end
5
5
  end
metadata CHANGED
@@ -1,57 +1,63 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: fastlane-plugin-amazon_appstore
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.1.0
4
+ version: 1.3.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - ntsk
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2025-03-23 00:00:00.000000000 Z
11
+ date: 2025-08-24 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: faraday
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
- - - ">="
17
+ - - "~>"
18
18
  - !ruby/object:Gem::Version
19
- version: '0'
19
+ version: '1.0'
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
- - - ">="
24
+ - - "~>"
25
25
  - !ruby/object:Gem::Version
26
- version: '0'
26
+ version: '1.0'
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: faraday_middleware
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
- - - ">="
31
+ - - "~>"
32
32
  - !ruby/object:Gem::Version
33
- version: '0'
33
+ version: '1.0'
34
34
  type: :runtime
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
- - - ">="
38
+ - - "~>"
39
39
  - !ruby/object:Gem::Version
40
- version: '0'
40
+ version: '1.0'
41
41
  - !ruby/object:Gem::Dependency
42
42
  name: bundler
43
43
  requirement: !ruby/object:Gem::Requirement
44
44
  requirements:
45
45
  - - ">="
46
46
  - !ruby/object:Gem::Version
47
- version: '0'
47
+ version: 1.12.0
48
+ - - "<"
49
+ - !ruby/object:Gem::Version
50
+ version: 3.0.0
48
51
  type: :development
49
52
  prerelease: false
50
53
  version_requirements: !ruby/object:Gem::Requirement
51
54
  requirements:
52
55
  - - ">="
53
56
  - !ruby/object:Gem::Version
54
- version: '0'
57
+ version: 1.12.0
58
+ - - "<"
59
+ - !ruby/object:Gem::Version
60
+ version: 3.0.0
55
61
  - !ruby/object:Gem::Dependency
56
62
  name: fastlane
57
63
  requirement: !ruby/object:Gem::Requirement
@@ -70,114 +76,120 @@ dependencies:
70
76
  name: pry
71
77
  requirement: !ruby/object:Gem::Requirement
72
78
  requirements:
73
- - - ">="
79
+ - - "~>"
74
80
  - !ruby/object:Gem::Version
75
- version: '0'
81
+ version: '0.14'
76
82
  type: :development
77
83
  prerelease: false
78
84
  version_requirements: !ruby/object:Gem::Requirement
79
85
  requirements:
80
- - - ">="
86
+ - - "~>"
81
87
  - !ruby/object:Gem::Version
82
- version: '0'
88
+ version: '0.14'
83
89
  - !ruby/object:Gem::Dependency
84
90
  name: rake
85
91
  requirement: !ruby/object:Gem::Requirement
86
92
  requirements:
87
- - - ">="
93
+ - - "~>"
88
94
  - !ruby/object:Gem::Version
89
- version: '0'
95
+ version: '13.0'
90
96
  type: :development
91
97
  prerelease: false
92
98
  version_requirements: !ruby/object:Gem::Requirement
93
99
  requirements:
94
- - - ">="
100
+ - - "~>"
95
101
  - !ruby/object:Gem::Version
96
- version: '0'
102
+ version: '13.0'
97
103
  - !ruby/object:Gem::Dependency
98
104
  name: rspec
99
105
  requirement: !ruby/object:Gem::Requirement
100
106
  requirements:
101
- - - ">="
107
+ - - "~>"
102
108
  - !ruby/object:Gem::Version
103
- version: '0'
109
+ version: '3.12'
104
110
  type: :development
105
111
  prerelease: false
106
112
  version_requirements: !ruby/object:Gem::Requirement
107
113
  requirements:
108
- - - ">="
114
+ - - "~>"
109
115
  - !ruby/object:Gem::Version
110
- version: '0'
116
+ version: '3.12'
111
117
  - !ruby/object:Gem::Dependency
112
118
  name: rspec_junit_formatter
113
119
  requirement: !ruby/object:Gem::Requirement
114
120
  requirements:
115
- - - ">="
121
+ - - "~>"
116
122
  - !ruby/object:Gem::Version
117
- version: '0'
123
+ version: '0.6'
118
124
  type: :development
119
125
  prerelease: false
120
126
  version_requirements: !ruby/object:Gem::Requirement
121
127
  requirements:
122
- - - ">="
128
+ - - "~>"
123
129
  - !ruby/object:Gem::Version
124
- version: '0'
130
+ version: '0.6'
125
131
  - !ruby/object:Gem::Dependency
126
132
  name: rubocop
127
133
  requirement: !ruby/object:Gem::Requirement
128
134
  requirements:
129
- - - '='
135
+ - - "~>"
130
136
  - !ruby/object:Gem::Version
131
- version: 1.25.0
137
+ version: '1.50'
138
+ - - "<"
139
+ - !ruby/object:Gem::Version
140
+ version: '1.51'
132
141
  type: :development
133
142
  prerelease: false
134
143
  version_requirements: !ruby/object:Gem::Requirement
135
144
  requirements:
136
- - - '='
145
+ - - "~>"
146
+ - !ruby/object:Gem::Version
147
+ version: '1.50'
148
+ - - "<"
137
149
  - !ruby/object:Gem::Version
138
- version: 1.25.0
150
+ version: '1.51'
139
151
  - !ruby/object:Gem::Dependency
140
152
  name: rubocop-performance
141
153
  requirement: !ruby/object:Gem::Requirement
142
154
  requirements:
143
- - - ">="
155
+ - - "~>"
144
156
  - !ruby/object:Gem::Version
145
- version: '0'
157
+ version: '1.17'
146
158
  type: :development
147
159
  prerelease: false
148
160
  version_requirements: !ruby/object:Gem::Requirement
149
161
  requirements:
150
- - - ">="
162
+ - - "~>"
151
163
  - !ruby/object:Gem::Version
152
- version: '0'
164
+ version: '1.17'
153
165
  - !ruby/object:Gem::Dependency
154
166
  name: rubocop-require_tools
155
167
  requirement: !ruby/object:Gem::Requirement
156
168
  requirements:
157
- - - ">="
169
+ - - "~>"
158
170
  - !ruby/object:Gem::Version
159
- version: '0'
171
+ version: '0.1'
160
172
  type: :development
161
173
  prerelease: false
162
174
  version_requirements: !ruby/object:Gem::Requirement
163
175
  requirements:
164
- - - ">="
176
+ - - "~>"
165
177
  - !ruby/object:Gem::Version
166
- version: '0'
178
+ version: '0.1'
167
179
  - !ruby/object:Gem::Dependency
168
180
  name: simplecov
169
181
  requirement: !ruby/object:Gem::Requirement
170
182
  requirements:
171
- - - ">="
183
+ - - "~>"
172
184
  - !ruby/object:Gem::Version
173
- version: '0'
185
+ version: '0.22'
174
186
  type: :development
175
187
  prerelease: false
176
188
  version_requirements: !ruby/object:Gem::Requirement
177
189
  requirements:
178
- - - ">="
190
+ - - "~>"
179
191
  - !ruby/object:Gem::Version
180
- version: '0'
192
+ version: '0.22'
181
193
  description:
182
194
  email: contact@ntsk.jp
183
195
  executables: []
@@ -203,14 +215,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
203
215
  requirements:
204
216
  - - ">="
205
217
  - !ruby/object:Gem::Version
206
- version: '2.5'
218
+ version: '2.6'
207
219
  required_rubygems_version: !ruby/object:Gem::Requirement
208
220
  requirements:
209
221
  - - ">="
210
222
  - !ruby/object:Gem::Version
211
223
  version: '0'
212
224
  requirements: []
213
- rubygems_version: 3.5.9
225
+ rubygems_version: 3.5.22
214
226
  signing_key:
215
227
  specification_version: 4
216
228
  summary: Upload apps to Amazon Appstore