fastlane-plugin-rustore_distribute 0.2.2
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 +7 -0
- data/LICENSE +21 -0
- data/README.md +43 -0
- data/lib/fastlane/plugin/rustore_distribute/actions/rustore_distribute_publish_action.rb +72 -0
- data/lib/fastlane/plugin/rustore_distribute/helper/rustore_distribute_helper.rb +109 -0
- data/lib/fastlane/plugin/rustore_distribute/version.rb +5 -0
- data/lib/fastlane/plugin/rustore_distribute.rb +16 -0
- metadata +188 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: 2ef56d526df32c4176fa224448a7987ca1f76daa20388074d08c29f9ad6b10bc
|
4
|
+
data.tar.gz: a89de2f10e056cf64a632d40d6e2444ed08c4ffd9cf7396e3d9dcae05d65423f
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: e437d30902e3d0466d9b45f88c9eaff51c8d15284f8267fa4a916c824b790af228bfec95c2c76d4ed262e4009963c92d0fc71b36c9898c4f7095501b7d48a509
|
7
|
+
data.tar.gz: 6f8b1fc362d5efd1b0a3d44ad33d97d4ea261f129b6bfa64a571349933500fc5978fa1135ab73d14182bd19f92eb8469c17d842098827006d172b32302698a32
|
data/LICENSE
ADDED
@@ -0,0 +1,21 @@
|
|
1
|
+
The MIT License (MIT)
|
2
|
+
|
3
|
+
Copyright (c) 2023 Vladislav Onishchenko <pinkey.950@gmail.com>
|
4
|
+
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
7
|
+
in the Software without restriction, including without limitation the rights
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
10
|
+
furnished to do so, subject to the following conditions:
|
11
|
+
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
13
|
+
copies or substantial portions of the Software.
|
14
|
+
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
21
|
+
SOFTWARE.
|
data/README.md
ADDED
@@ -0,0 +1,43 @@
|
|
1
|
+
# Fastlane Rustore plugin
|
2
|
+
|
3
|
+
[](https://rubygems.org/gems/fastlane-plugin-rustore) [](https://github.com/mkenney/software-guides/blob/master/STABILITY-BADGES.md#work-in-progress)
|
4
|
+
|
5
|
+
## Дисклеймер
|
6
|
+
|
7
|
+
Пока что реализован базовый функционал с заливкой апк. Скриншоты, описание и прочие материалы наследуются от предыдущего релиза. Обработки ошибок нет. Если у вас уже есть черновик релиза, то скорей всего ничего не заработает. Черновик, созданный через апи, в админке отображаться не будет. Если случилась ошибка где-то на этапе заливки, то останется черновик, который будет мешать следующему запуску скрипта, удалить его лучше с помощью [питонскрипта](https://github.com/stfbee/python-rustore-api), а экшен удаления тут будет чуть позже.
|
8
|
+
|
9
|
+
Также есть признаки того, что заливать апк из вне РФ больше нельзя (смотри [#2](https://github.com/stfbee/fastlane-plugin-rustore/issues/2)), так что выбирайте раннер, где будет запускаться скрипт.
|
10
|
+
|
11
|
+
## Поехали
|
12
|
+
|
13
|
+
Для начала добавь плагин в ваш fastlane проект:
|
14
|
+
|
15
|
+
```bash
|
16
|
+
fastlane add_plugin rustore
|
17
|
+
```
|
18
|
+
|
19
|
+
После чего в каком-нибудь лейне дергай экшен плагина:
|
20
|
+
|
21
|
+
```
|
22
|
+
rustore_publish(
|
23
|
+
gms_apk: "../../app-release.apk",
|
24
|
+
hms_apk: "../../app-release-hms.apk",
|
25
|
+
package_name: "com.example.example",
|
26
|
+
publish_type: "MANUAL"
|
27
|
+
key_id: "123123",
|
28
|
+
private_key: "MIIE....."
|
29
|
+
)
|
30
|
+
```
|
31
|
+
|
32
|
+
- `gms_apk` - путь до .apk, который лучше скачать с гугл плея, у фастлейна даже есть для этого [инструмент](https://docs.fastlane.tools/actions/download_from_play_store/)
|
33
|
+
- `hms_apk` - путь до .apk с Huawei-сервисами (опционально). У Рустора пока все плохо с документацией об этом, но залить его можно, что получится - пока хз.
|
34
|
+
- `package_name` - название пакета
|
35
|
+
- `publish_type` - тип публикации (MANUAL - ручная, DELAYED - отложенная, INSTANTLY - автоматическая после модерации). По умолчанию - INSTANTLY.
|
36
|
+
- `key_id` и `private_key` надо взять в админке рустора, доступ к ним имеет только оунер.
|
37
|
+
|
38
|
+
## Ссылочки
|
39
|
+
|
40
|
+
- [_fastlane_](https://github.com/fastlane/fastlane)
|
41
|
+
- [Plugins Troubleshooting](https://docs.fastlane.tools/plugins/plugins-troubleshooting/)
|
42
|
+
- [Plugins documentation](https://docs.fastlane.tools/plugins/create-plugin/)
|
43
|
+
- [Rustore API](https://help.rustore.ru/rustore/for_developers/work_with_RuStore_API)
|
@@ -0,0 +1,72 @@
|
|
1
|
+
require 'fastlane/action'
|
2
|
+
require "fastlane_core/ui/ui"
|
3
|
+
|
4
|
+
module Fastlane
|
5
|
+
module Actions
|
6
|
+
class RustorePublishAction < Action
|
7
|
+
def self.authors
|
8
|
+
["Vladislav Onishchenko"]
|
9
|
+
end
|
10
|
+
|
11
|
+
def self.description
|
12
|
+
"Rustore fastlane integration plugin"
|
13
|
+
end
|
14
|
+
|
15
|
+
def self.run(params)
|
16
|
+
package_name = params[:package_name]
|
17
|
+
key_id = params[:key_id]
|
18
|
+
private_key = params[:private_key]
|
19
|
+
publish_type = params[:publish_type]
|
20
|
+
gms_apk = params[:gms_apk]
|
21
|
+
hms_apk = params[:hms_apk]
|
22
|
+
|
23
|
+
# Получение токена
|
24
|
+
token = Helper::RustoreHelper.get_token(key_id: key_id, private_key: private_key)
|
25
|
+
# Создание черновика
|
26
|
+
draft_id = Helper::RustoreHelper.create_draft(token, package_name, publish_type)
|
27
|
+
# Загрузка апк
|
28
|
+
Helper::RustoreHelper.upload_apk(token, draft_id, false, gms_apk, package_name)
|
29
|
+
# Если путь до хмс передали, то и его заливаем
|
30
|
+
unless hms_apk.nil?
|
31
|
+
Helper::RustoreHelper.upload_apk(token, draft_id, true, hms_apk, package_name)
|
32
|
+
end
|
33
|
+
# Отправка на модерацию
|
34
|
+
Helper::RustoreHelper.commit_version(token, draft_id, package_name)
|
35
|
+
|
36
|
+
end
|
37
|
+
|
38
|
+
def self.available_options
|
39
|
+
[
|
40
|
+
FastlaneCore::ConfigItem.new(key: :package_name,
|
41
|
+
env_name: "RUSTORE_PACKAGE_NAME",
|
42
|
+
description: "пакет приложения, например `com.example.example`",
|
43
|
+
optional: false),
|
44
|
+
FastlaneCore::ConfigItem.new(key: :key_id,
|
45
|
+
env_name: "RUSTORE_KEY_ID",
|
46
|
+
description: "айдишник компании в русторе",
|
47
|
+
optional: false),
|
48
|
+
FastlaneCore::ConfigItem.new(key: :private_key,
|
49
|
+
env_name: "RUSTORE_PRIVATE_KEY",
|
50
|
+
description: "приватный ключ в русторе",
|
51
|
+
optional: false),
|
52
|
+
FastlaneCore::ConfigItem.new(key: :publish_type,
|
53
|
+
env_name: "RUSTORE_PUBLISH_TYPE",
|
54
|
+
description: "Тип публикации (MANUAL, DELAYED, INSTANTLY). По умолчанию - INSTANTLY",
|
55
|
+
optional: true),
|
56
|
+
FastlaneCore::ConfigItem.new(key: :gms_apk,
|
57
|
+
env_name: "RUSTORE_GMS_APK",
|
58
|
+
description: "путь до апк с гуглсервисами",
|
59
|
+
optional: false),
|
60
|
+
FastlaneCore::ConfigItem.new(key: :hms_apk,
|
61
|
+
env_name: "RUSTORE_HMS_APK",
|
62
|
+
description: "путь до апк с хуавейсервисами (опционально)",
|
63
|
+
optional: true)
|
64
|
+
]
|
65
|
+
end
|
66
|
+
|
67
|
+
def self.is_supported?(platform)
|
68
|
+
[:android].include?(platform)
|
69
|
+
end
|
70
|
+
end
|
71
|
+
end
|
72
|
+
end
|
@@ -0,0 +1,109 @@
|
|
1
|
+
require 'fastlane_core/ui/ui'
|
2
|
+
require 'digest'
|
3
|
+
require 'json'
|
4
|
+
|
5
|
+
module Fastlane
|
6
|
+
UI = FastlaneCore::UI unless Fastlane.const_defined?("UI")
|
7
|
+
|
8
|
+
module Helper
|
9
|
+
class RustoreHelper
|
10
|
+
def self.connection
|
11
|
+
require 'faraday'
|
12
|
+
require 'faraday_middleware'
|
13
|
+
|
14
|
+
options = {
|
15
|
+
url: "https://public-api.rustore.ru"
|
16
|
+
}
|
17
|
+
|
18
|
+
logger = Logger.new($stderr)
|
19
|
+
logger.level = Logger::DEBUG
|
20
|
+
|
21
|
+
Faraday.new(options) do |builder|
|
22
|
+
builder.request(:multipart)
|
23
|
+
builder.request(:json)
|
24
|
+
builder.request(:url_encoded)
|
25
|
+
builder.response(:json, content_type: /\bjson$/)
|
26
|
+
builder.response(:logger, logger)
|
27
|
+
builder.use(FaradayMiddleware::FollowRedirects)
|
28
|
+
builder.adapter(:net_http)
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
def self.rsa_sign(timestamp, key_id, private_key)
|
33
|
+
key = OpenSSL::PKey::RSA.new("-----BEGIN RSA PRIVATE KEY-----\n#{private_key}\n-----END RSA PRIVATE KEY-----")
|
34
|
+
signature = key.sign(OpenSSL::Digest.new('SHA512'), key_id + timestamp)
|
35
|
+
Base64.encode64(signature)
|
36
|
+
end
|
37
|
+
|
38
|
+
def self.get_token(key_id:, private_key:)
|
39
|
+
timestamp = DateTime.now.iso8601(3)
|
40
|
+
signature = rsa_sign(timestamp, key_id, private_key)
|
41
|
+
url = "/public/auth/"
|
42
|
+
response = connection.post(url) do |req|
|
43
|
+
req.body = { keyId: key_id, timestamp: timestamp, signature: signature }
|
44
|
+
end
|
45
|
+
|
46
|
+
UI.message("Debug: response #{response.body}") if ENV['DEBUG']
|
47
|
+
|
48
|
+
response.body["body"]["jwe"]
|
49
|
+
end
|
50
|
+
|
51
|
+
def self.create_draft(token, package_name, publish_type)
|
52
|
+
url = "/public/v1/application/#{package_name}/version"
|
53
|
+
response = connection.post(url) do |req|
|
54
|
+
req.headers['Public-Token'] = token
|
55
|
+
req.body = {}
|
56
|
+
req.body['publishType'] = publish_type unless publish_type.nil?
|
57
|
+
end
|
58
|
+
|
59
|
+
UI.message("Debug: response #{response.body}") if ENV['DEBUG']
|
60
|
+
if response.body["body"]
|
61
|
+
# Если черновика не было, и мы создали новый, здесь будет draftId
|
62
|
+
return response.body["body"]
|
63
|
+
elsif response.body["message"]
|
64
|
+
# Если черновик уже существовал, в message будет ошибка вида
|
65
|
+
# "You already have draft version with ID = XXXXXXXXXX", откуда достаем ID существующего черновика.
|
66
|
+
return response.body["message"].scan(/\d+/).first.to_i
|
67
|
+
else
|
68
|
+
raise "Couldn't get draftId from RuStore"
|
69
|
+
end
|
70
|
+
end
|
71
|
+
|
72
|
+
def self.upload_apk(token, draft_id, is_hms, file_path, package_name)
|
73
|
+
if is_hms
|
74
|
+
apk_type = "HMS"
|
75
|
+
is_main = false
|
76
|
+
else
|
77
|
+
apk_type = "Unknown"
|
78
|
+
is_main = true
|
79
|
+
end
|
80
|
+
|
81
|
+
url = "/public/v1/application/#{package_name}/version/#{draft_id}/apk"
|
82
|
+
payload = {}
|
83
|
+
payload[:file] = Faraday::Multipart::FilePart.new(file_path, 'application/vnd.android.package-archive')
|
84
|
+
|
85
|
+
response = connection.post(url) do |req|
|
86
|
+
req.headers['Public-Token'] = token
|
87
|
+
req.params['servicesType'] = apk_type
|
88
|
+
req.params['isMainApk'] = is_main
|
89
|
+
req.body = payload
|
90
|
+
end
|
91
|
+
|
92
|
+
if response.body["message"] == "File was not uploaded successfully: The code of this version must be larger than that of the previous one"
|
93
|
+
raise "Build with this version code was already uploaded earlier"
|
94
|
+
end
|
95
|
+
|
96
|
+
UI.message("Debug: response #{response.body}") if ENV['DEBUG']
|
97
|
+
end
|
98
|
+
|
99
|
+
def self.commit_version(token, draft_id, package_name)
|
100
|
+
url = "/public/v1/application/#{package_name}/version/#{draft_id}/commit"
|
101
|
+
response = connection.post(url) do |req|
|
102
|
+
req.headers['Public-Token'] = token
|
103
|
+
end
|
104
|
+
|
105
|
+
UI.message("Debug: response #{response.body}") if ENV['DEBUG']
|
106
|
+
end
|
107
|
+
end
|
108
|
+
end
|
109
|
+
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
require 'fastlane/plugin/rustore/version'
|
2
|
+
|
3
|
+
module Fastlane
|
4
|
+
module Rustore
|
5
|
+
# Return all .rb files inside the "actions" and "helper" directory
|
6
|
+
def self.all_classes
|
7
|
+
Dir[File.expand_path('**/{actions,helper}/*.rb', File.dirname(__FILE__))]
|
8
|
+
end
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
12
|
+
# By default we want to import all available actions and helpers
|
13
|
+
# A plugin can contain any number of actions and plugins
|
14
|
+
Fastlane::Rustore.all_classes.each do |current|
|
15
|
+
require current
|
16
|
+
end
|
metadata
ADDED
@@ -0,0 +1,188 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: fastlane-plugin-rustore_distribute
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.2.2
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Vladimir Evstratov
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2024-08-27 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: bundler
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - ">="
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '0'
|
20
|
+
type: :development
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - ">="
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '0'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: fastlane
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - ">="
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: 2.214.0
|
34
|
+
type: :development
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - ">="
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: 2.214.0
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: pry
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - ">="
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '0'
|
48
|
+
type: :development
|
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: 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: rspec
|
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
|
+
- !ruby/object:Gem::Dependency
|
84
|
+
name: rspec_junit_formatter
|
85
|
+
requirement: !ruby/object:Gem::Requirement
|
86
|
+
requirements:
|
87
|
+
- - ">="
|
88
|
+
- !ruby/object:Gem::Version
|
89
|
+
version: '0'
|
90
|
+
type: :development
|
91
|
+
prerelease: false
|
92
|
+
version_requirements: !ruby/object:Gem::Requirement
|
93
|
+
requirements:
|
94
|
+
- - ">="
|
95
|
+
- !ruby/object:Gem::Version
|
96
|
+
version: '0'
|
97
|
+
- !ruby/object:Gem::Dependency
|
98
|
+
name: rubocop
|
99
|
+
requirement: !ruby/object:Gem::Requirement
|
100
|
+
requirements:
|
101
|
+
- - '='
|
102
|
+
- !ruby/object:Gem::Version
|
103
|
+
version: 1.12.1
|
104
|
+
type: :development
|
105
|
+
prerelease: false
|
106
|
+
version_requirements: !ruby/object:Gem::Requirement
|
107
|
+
requirements:
|
108
|
+
- - '='
|
109
|
+
- !ruby/object:Gem::Version
|
110
|
+
version: 1.12.1
|
111
|
+
- !ruby/object:Gem::Dependency
|
112
|
+
name: rubocop-performance
|
113
|
+
requirement: !ruby/object:Gem::Requirement
|
114
|
+
requirements:
|
115
|
+
- - ">="
|
116
|
+
- !ruby/object:Gem::Version
|
117
|
+
version: '0'
|
118
|
+
type: :development
|
119
|
+
prerelease: false
|
120
|
+
version_requirements: !ruby/object:Gem::Requirement
|
121
|
+
requirements:
|
122
|
+
- - ">="
|
123
|
+
- !ruby/object:Gem::Version
|
124
|
+
version: '0'
|
125
|
+
- !ruby/object:Gem::Dependency
|
126
|
+
name: rubocop-require_tools
|
127
|
+
requirement: !ruby/object:Gem::Requirement
|
128
|
+
requirements:
|
129
|
+
- - ">="
|
130
|
+
- !ruby/object:Gem::Version
|
131
|
+
version: '0'
|
132
|
+
type: :development
|
133
|
+
prerelease: false
|
134
|
+
version_requirements: !ruby/object:Gem::Requirement
|
135
|
+
requirements:
|
136
|
+
- - ">="
|
137
|
+
- !ruby/object:Gem::Version
|
138
|
+
version: '0'
|
139
|
+
- !ruby/object:Gem::Dependency
|
140
|
+
name: simplecov
|
141
|
+
requirement: !ruby/object:Gem::Requirement
|
142
|
+
requirements:
|
143
|
+
- - ">="
|
144
|
+
- !ruby/object:Gem::Version
|
145
|
+
version: '0'
|
146
|
+
type: :development
|
147
|
+
prerelease: false
|
148
|
+
version_requirements: !ruby/object:Gem::Requirement
|
149
|
+
requirements:
|
150
|
+
- - ">="
|
151
|
+
- !ruby/object:Gem::Version
|
152
|
+
version: '0'
|
153
|
+
description:
|
154
|
+
email: vladimir.evstratov@list.ru
|
155
|
+
executables: []
|
156
|
+
extensions: []
|
157
|
+
extra_rdoc_files: []
|
158
|
+
files:
|
159
|
+
- LICENSE
|
160
|
+
- README.md
|
161
|
+
- lib/fastlane/plugin/rustore_distribute.rb
|
162
|
+
- lib/fastlane/plugin/rustore_distribute/actions/rustore_distribute_publish_action.rb
|
163
|
+
- lib/fastlane/plugin/rustore_distribute/helper/rustore_distribute_helper.rb
|
164
|
+
- lib/fastlane/plugin/rustore_distribute/version.rb
|
165
|
+
homepage: https://github.com/vladimirevstratov/fastlane-plugin-rustore
|
166
|
+
licenses:
|
167
|
+
- MIT
|
168
|
+
metadata: {}
|
169
|
+
post_install_message:
|
170
|
+
rdoc_options: []
|
171
|
+
require_paths:
|
172
|
+
- lib
|
173
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
174
|
+
requirements:
|
175
|
+
- - ">="
|
176
|
+
- !ruby/object:Gem::Version
|
177
|
+
version: '2.6'
|
178
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
179
|
+
requirements:
|
180
|
+
- - ">="
|
181
|
+
- !ruby/object:Gem::Version
|
182
|
+
version: '0'
|
183
|
+
requirements: []
|
184
|
+
rubygems_version: 3.0.3.1
|
185
|
+
signing_key:
|
186
|
+
specification_version: 4
|
187
|
+
summary: Rustore fastlane integration plugin
|
188
|
+
test_files: []
|