fastlane-plugin-wpmreleasetoolkit 6.0.0 → 6.2.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/fastlane/plugin/wpmreleasetoolkit/actions/android/android_firebase_test.rb +31 -4
- data/lib/fastlane/plugin/wpmreleasetoolkit/actions/common/create_release_action.rb +9 -1
- data/lib/fastlane/plugin/wpmreleasetoolkit/actions/common/promo_screenshots_action.rb +14 -9
- data/lib/fastlane/plugin/wpmreleasetoolkit/helper/github_helper.rb +3 -2
- data/lib/fastlane/plugin/wpmreleasetoolkit/helper/promo_screenshots_helper.rb +58 -10
- data/lib/fastlane/plugin/wpmreleasetoolkit/version.rb +1 -1
- metadata +2 -16
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: d68a9310585fca22170859bab407386c1bf42287036832a08bdd0e55c3027522
|
4
|
+
data.tar.gz: 297c23c5ffb14516663422be411ad163f16ce6620e88c5216bf76e8649350bb1
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: ca46edc69be727e82bd611707d1ed2f49efdeee160709712909ea48d7da03b6518bdff0bbbd8fd8bd3e5a75c1f1b770e353a71d0fadb654f66941b33a0262aec
|
7
|
+
data.tar.gz: c043ac3b847ef8d5bc37a94803227dc8f39579ac3f7ec6957377969f5143e2a80c4e7eef8b04debba54a70439ca48d0f7cbaabcc598f3f9dc0b58bea896e35dc
|
@@ -3,8 +3,9 @@ require 'securerandom'
|
|
3
3
|
module Fastlane
|
4
4
|
module Actions
|
5
5
|
module SharedValues
|
6
|
-
FIREBASE_TEST_RESULT = :FIREBASE_TEST_LOG_FILE
|
6
|
+
FIREBASE_TEST_RESULT = :FIREBASE_TEST_LOG_FILE # FirebaseTestLabResult object, for internal consumption
|
7
7
|
FIREBASE_TEST_LOG_FILE_PATH = :FIREBASE_TEST_LOG_FILE_PATH
|
8
|
+
FIREBASE_TEST_MORE_DETAILS_URL = :FIREBASE_TEST_MORE_DETAILS_URL
|
8
9
|
end
|
9
10
|
|
10
11
|
class AndroidFirebaseTestAction < Action
|
@@ -45,13 +46,20 @@ module Fastlane
|
|
45
46
|
key_file_path: params[:key_file]
|
46
47
|
)
|
47
48
|
|
48
|
-
|
49
|
+
Fastlane::Actions.lane_context[SharedValues::FIREBASE_TEST_MORE_DETAILS_URL] = result.more_details_url
|
49
50
|
|
50
|
-
|
51
|
+
if result.success?
|
52
|
+
UI.success 'Firebase Tests Complete'
|
53
|
+
return true
|
54
|
+
else
|
55
|
+
ui_method = params[:crash_on_test_failure] ? :test_failure! : :error
|
56
|
+
FastlaneCore::UI.send(ui_method, "Firebase Tests failed – more information can be found at #{result.more_details_url}")
|
57
|
+
return false
|
58
|
+
end
|
51
59
|
end
|
52
60
|
|
53
61
|
# Fastlane doesn't eagerly validate options for us, so we'll do it first to have control over
|
54
|
-
# when they're
|
62
|
+
# when they're evaluated.
|
55
63
|
def self.validate_options(params)
|
56
64
|
available_options
|
57
65
|
.reject { |opt| opt.optional || !opt.default_value.nil? }
|
@@ -180,9 +188,28 @@ module Fastlane
|
|
180
188
|
optional: true,
|
181
189
|
type: String
|
182
190
|
),
|
191
|
+
FastlaneCore::ConfigItem.new(
|
192
|
+
key: :crash_on_test_failure,
|
193
|
+
description: 'If set to `true` (the default), will stop fastlane with `test_failure!`. ' \
|
194
|
+
+ 'If `false`, the action will return the test status, without interrupting the rest of your Fastlane run on failure, letting the caller handle the failure on their side',
|
195
|
+
optional: true,
|
196
|
+
type: Boolean,
|
197
|
+
default_value: true
|
198
|
+
),
|
183
199
|
]
|
184
200
|
end
|
185
201
|
|
202
|
+
def self.output
|
203
|
+
[
|
204
|
+
['FIREBASE_TEST_LOG_FILE_PATH', 'Path to the `output.log` file containing the logs or invoking the tests'],
|
205
|
+
['FIREBASE_TEST_MORE_DETAILS_URL', 'URL to the Firebase Console dashboard showing the details of the test run (and failures, if any)'],
|
206
|
+
]
|
207
|
+
end
|
208
|
+
|
209
|
+
def self.return_value
|
210
|
+
'True if the test succeeded, false if they failed'
|
211
|
+
end
|
212
|
+
|
186
213
|
def self.authors
|
187
214
|
['Automattic']
|
188
215
|
end
|
@@ -14,6 +14,7 @@ module Fastlane
|
|
14
14
|
# Replace full URLS to PRs/Issues with shorthand, because GitHub does not render them properly otherwise.
|
15
15
|
release_notes.gsub!(%r{https://github.com/([^/]*/[^/]*)/(pulls?|issues?)/([0-9]*)}, '\1#\3')
|
16
16
|
prerelease = params[:prerelease]
|
17
|
+
is_draft = params[:is_draft]
|
17
18
|
|
18
19
|
UI.message("Creating draft release #{version} in #{repository}.")
|
19
20
|
# Verify assets
|
@@ -28,7 +29,8 @@ module Fastlane
|
|
28
29
|
target: params[:target],
|
29
30
|
description: release_notes,
|
30
31
|
assets: assets,
|
31
|
-
prerelease: prerelease
|
32
|
+
prerelease: prerelease,
|
33
|
+
is_draft: is_draft
|
32
34
|
)
|
33
35
|
UI.message('Done')
|
34
36
|
end
|
@@ -83,6 +85,12 @@ module Fastlane
|
|
83
85
|
optional: true,
|
84
86
|
default_value: false,
|
85
87
|
is_string: false),
|
88
|
+
FastlaneCore::ConfigItem.new(key: :is_draft,
|
89
|
+
env_name: 'GHHELPER_CREATE_RELEASE_IS_DRAFT',
|
90
|
+
description: 'True to create the GitHub release as a draft (instead of publishing it immediately)',
|
91
|
+
optional: true,
|
92
|
+
default_value: true,
|
93
|
+
type: Boolean),
|
86
94
|
Fastlane::Helper::GithubHelper.github_token_config_item,
|
87
95
|
]
|
88
96
|
end
|
@@ -11,7 +11,9 @@ module Fastlane
|
|
11
11
|
UI.message "#{self.check_path(params[:orig_folder])} Original Screenshot Source: #{params[:orig_folder]}"
|
12
12
|
UI.message "#{self.check_path(params[:metadata_folder])} Translation source: #{params[:metadata_folder]}"
|
13
13
|
|
14
|
-
config = helper.
|
14
|
+
config = helper.read_config(params[:config_file])
|
15
|
+
|
16
|
+
helper.check_fonts_installed!(config: config) unless params[:skip_font_check]
|
15
17
|
|
16
18
|
translationDirectories = subdirectories_for_path(params[:metadata_folder])
|
17
19
|
imageDirectories = subdirectories_for_path(params[:orig_folder])
|
@@ -141,31 +143,34 @@ module Fastlane
|
|
141
143
|
env_name: 'PROMOSS_ORIG',
|
142
144
|
description: 'The directory containing the original screenshots',
|
143
145
|
optional: false,
|
144
|
-
|
146
|
+
type: String),
|
145
147
|
FastlaneCore::ConfigItem.new(key: :output_folder,
|
146
148
|
env_name: 'PROMOSS_OUTPUT',
|
147
149
|
description: 'The path of the folder to save the promo screenshots',
|
148
150
|
optional: false,
|
149
|
-
|
150
|
-
|
151
|
+
type: String),
|
151
152
|
FastlaneCore::ConfigItem.new(key: :metadata_folder,
|
152
153
|
env_name: 'PROMOSS_METADATA_FOLDER',
|
153
154
|
description: 'The directory containing the translation data',
|
154
155
|
optional: false,
|
155
|
-
|
156
|
-
|
156
|
+
type: String),
|
157
157
|
FastlaneCore::ConfigItem.new(key: :config_file,
|
158
158
|
env_name: 'PROMOSS_CONFIG_FILE',
|
159
159
|
description: 'The path to the file containing the promo screenshot configuration',
|
160
160
|
optional: true,
|
161
|
-
|
161
|
+
type: String,
|
162
162
|
default_value: 'screenshots.json'),
|
163
|
-
|
164
163
|
FastlaneCore::ConfigItem.new(key: :force,
|
165
164
|
env_name: 'PROMOSS_FORCE_CREATION',
|
166
165
|
description: 'Overwrite existing promo screenshots without asking first?',
|
167
166
|
optional: true,
|
168
|
-
|
167
|
+
type: Boolean,
|
168
|
+
default_value: false),
|
169
|
+
FastlaneCore::ConfigItem.new(key: :skip_font_check,
|
170
|
+
env_name: 'PROMOSS_SKIP_FONT_CHECK',
|
171
|
+
description: 'Skip the check verifying that needed fonts are installed and active',
|
172
|
+
optional: true,
|
173
|
+
type: Boolean,
|
169
174
|
default_value: false),
|
170
175
|
]
|
171
176
|
end
|
@@ -119,15 +119,16 @@ module Fastlane
|
|
119
119
|
# @param [String] description The text to use as the release's body / description (typically the release notes)
|
120
120
|
# @param [Array<String>] assets List of file paths to attach as assets to the release
|
121
121
|
# @param [TrueClass|FalseClass] prerelease Indicates if this should be created as a pre-release (i.e. for alpha/beta)
|
122
|
+
# @param [TrueClass|FalseClass] is_draft Indicates if this should be created as a draft release
|
122
123
|
#
|
123
|
-
def create_release(repository:, version:, target: nil, description:, assets:, prerelease:)
|
124
|
+
def create_release(repository:, version:, target: nil, description:, assets:, prerelease:, is_draft:)
|
124
125
|
release = client.create_release(
|
125
126
|
repository,
|
126
127
|
version, # tag name
|
127
128
|
name: version, # release name
|
128
129
|
target_commitish: target || Git.open(Dir.pwd).log.first.sha,
|
129
|
-
draft: true,
|
130
130
|
prerelease: prerelease,
|
131
|
+
draft: is_draft,
|
131
132
|
body: description
|
132
133
|
)
|
133
134
|
assets.each do |file_path|
|
@@ -7,11 +7,11 @@ rescue LoadError
|
|
7
7
|
end
|
8
8
|
require 'json'
|
9
9
|
require 'tempfile'
|
10
|
+
require 'open3'
|
10
11
|
require 'optparse'
|
11
12
|
require 'pathname'
|
12
13
|
require 'progress_bar'
|
13
14
|
require 'parallel'
|
14
|
-
require 'jsonlint'
|
15
15
|
require 'chroma'
|
16
16
|
require 'securerandom'
|
17
17
|
|
@@ -32,17 +32,65 @@ module Fastlane
|
|
32
32
|
UI.user_error!('`drawText` not found – install it using `brew install automattic/build-tools/drawText`.') unless system('command -v drawText')
|
33
33
|
end
|
34
34
|
|
35
|
-
def
|
35
|
+
def read_config(configFilePath)
|
36
36
|
configFilePath = resolve_path(configFilePath)
|
37
37
|
|
38
38
|
begin
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
39
|
+
# NOTE: While JSON is a subset of YAML and thus YAML.load_file would technically cover both cases at once, in practice
|
40
|
+
# `JSON.parse` is more lenient with JSON files than `YAML.load_file` is — especially, it accepts `// comments` in the
|
41
|
+
# JSON file, despite this not being allowed in the spec — hence why we still try with `JSON.parse` for `.json` files.
|
42
|
+
return File.extname(configFilePath) == '.json' ? JSON.parse(File.read(configFilePath)) : YAML.load_file(configFilePath)
|
43
|
+
rescue StandardError => e
|
44
|
+
UI.error(e)
|
45
|
+
UI.user_error!('Invalid JSON/YAML configuration. Please lint your config file to check for syntax errors.')
|
46
|
+
end
|
47
|
+
end
|
44
48
|
|
45
|
-
|
49
|
+
# Checks that all required fonts are installed
|
50
|
+
# - Visits the JSON config to find all the stylesheets referenced in it
|
51
|
+
# - For each stylesheet, extract the first font of each `font-family` attribute found
|
52
|
+
# - Finally, for each of those fonts, check that they exist and are activated.
|
53
|
+
#
|
54
|
+
# @param [Hash] config The promo screenshots configuration, as returned by #read_config
|
55
|
+
# @raise [UserError] Raises if at least one font is missing.
|
56
|
+
#
|
57
|
+
def check_fonts_installed!(config:)
|
58
|
+
# Find all stylesheets in the config
|
59
|
+
all_stylesheets = ([config['stylesheet']] + config['entries'].flat_map do |entry|
|
60
|
+
entry['attachments']&.map { |att| att['stylesheet'] }
|
61
|
+
end).compact.uniq
|
62
|
+
|
63
|
+
# Parse the first font in each `font-family` attribute found in all found CSS files.
|
64
|
+
# Only the first in each `font-family` font list matters, as others are fallbacks we don't want to use anyway.
|
65
|
+
font_families = all_stylesheets.flat_map do |s|
|
66
|
+
File.readlines(s).flat_map do |line|
|
67
|
+
attr = line.match(/font-family: (.*);/)&.captures&.first
|
68
|
+
attr.split(',').first.strip.gsub(/'(.*)'/, '\1').gsub(/"(.*)"/, '\1') unless attr.nil?
|
69
|
+
end
|
70
|
+
end.compact.uniq
|
71
|
+
|
72
|
+
# Verify that all fonts exists and are active—using a small swift script as there's no nice CLI for that
|
73
|
+
swift_script = <<~SWIFT
|
74
|
+
import AppKit
|
75
|
+
|
76
|
+
var exitCode: Int32 = 0
|
77
|
+
for fontName in CommandLine.arguments.dropFirst() {
|
78
|
+
if NSFont(name: fontName, size: NSFont.systemFontSize) != nil {
|
79
|
+
print(" ✅ Font \\"\\(fontName)\\" found and active")
|
80
|
+
} else {
|
81
|
+
print(" ❌ Font \\"\\(fontName)\\" not found, it is either not installed or disabled. Please install it using FontBook first.")
|
82
|
+
exitCode = 1
|
83
|
+
}
|
84
|
+
}
|
85
|
+
exit(exitCode)
|
86
|
+
SWIFT
|
87
|
+
|
88
|
+
Tempfile.create(['fonts-check-', '.swift']) do |f|
|
89
|
+
f.write(swift_script)
|
90
|
+
f.close
|
91
|
+
oe, s = Open3.capture2e('/usr/bin/env', 'xcrun', 'swift', f.path, *font_families)
|
92
|
+
UI.command_output(oe)
|
93
|
+
UI.user_error!('Some fonts required by your stylesheets are missing. Please install them and try again.') unless s.success?
|
46
94
|
end
|
47
95
|
end
|
48
96
|
|
@@ -343,8 +391,8 @@ module Fastlane
|
|
343
391
|
def open_image(path)
|
344
392
|
path = resolve_path(path)
|
345
393
|
|
346
|
-
Magick::Image.read(path)
|
347
|
-
|
394
|
+
Magick::Image.read(path) do |image|
|
395
|
+
image.background_color = 'transparent'
|
348
396
|
end.first
|
349
397
|
end
|
350
398
|
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: fastlane-plugin-wpmreleasetoolkit
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 6.
|
4
|
+
version: 6.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Automattic
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2022-
|
11
|
+
date: 2022-12-14 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activesupport
|
@@ -80,20 +80,6 @@ dependencies:
|
|
80
80
|
- - "~>"
|
81
81
|
- !ruby/object:Gem::Version
|
82
82
|
version: '1.3'
|
83
|
-
- !ruby/object:Gem::Dependency
|
84
|
-
name: jsonlint
|
85
|
-
requirement: !ruby/object:Gem::Requirement
|
86
|
-
requirements:
|
87
|
-
- - "~>"
|
88
|
-
- !ruby/object:Gem::Version
|
89
|
-
version: '0.3'
|
90
|
-
type: :runtime
|
91
|
-
prerelease: false
|
92
|
-
version_requirements: !ruby/object:Gem::Requirement
|
93
|
-
requirements:
|
94
|
-
- - "~>"
|
95
|
-
- !ruby/object:Gem::Version
|
96
|
-
version: '0.3'
|
97
83
|
- !ruby/object:Gem::Dependency
|
98
84
|
name: nokogiri
|
99
85
|
requirement: !ruby/object:Gem::Requirement
|