fastlane-plugin-wpmreleasetoolkit 14.3.1 → 14.4.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.
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 53fda01b5c9773e9763663cbce794b14dfc05895fd4811832244b10419b57290
|
|
4
|
+
data.tar.gz: 39baf709e7720943a6e403859515bc0dcfd5d8538afe74ae258d24d5586c7c0b
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 5bc8522d6cb6cde402d7cf99b629cc12fc2a407f13bcc908833440175a7a22a7dbb8aac2ed860dad902d10ef880c0d97478f12ada9d0dfccaaf651442b4e2d3c
|
|
7
|
+
data.tar.gz: 0b7bc991e3742c49e8b2717a2dc8207c0272c01cdda7110e99852ea52ff4651053c8d2dcd9372cba615a52b816dc829dc11f72db7c3fc6afc48061802a6e6f3b
|
|
@@ -0,0 +1,186 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require 'dotenv'
|
|
4
|
+
require 'shellwords'
|
|
5
|
+
require 'fastlane'
|
|
6
|
+
|
|
7
|
+
module Fastlane
|
|
8
|
+
module Wpmreleasetoolkit
|
|
9
|
+
# Manages loading of environment variables from a .env and accessing them in a user-friendly way.
|
|
10
|
+
class EnvManager
|
|
11
|
+
attr_reader :env_path, :env_example_path, :print_error_lambda
|
|
12
|
+
|
|
13
|
+
class << self
|
|
14
|
+
attr_writer :default_print_error_lambda
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
# Set up by loading the .env file with the given name.
|
|
18
|
+
def initialize(
|
|
19
|
+
env_file_name:,
|
|
20
|
+
env_file_folder: File.join(Dir.home, '.a8c-apps'),
|
|
21
|
+
example_env_file_path: 'fastlane/example.env',
|
|
22
|
+
print_error_lambda: ->(message) { FastlaneCore::UI.user_error!(message) },
|
|
23
|
+
print_warning_lambda: ->(message) { FastlaneCore::UI.important(message) }
|
|
24
|
+
)
|
|
25
|
+
@env_path = File.join(env_file_folder, env_file_name)
|
|
26
|
+
@env_example_path = example_env_file_path
|
|
27
|
+
@print_error_lambda = print_error_lambda
|
|
28
|
+
@print_warning_lambda = print_warning_lambda
|
|
29
|
+
|
|
30
|
+
unless File.exist?(@env_path) || running_on_ci?
|
|
31
|
+
@print_warning_lambda.call("Warning: env file not found at #{@env_path}. Environment variables may not be loaded.")
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
# Parse rather than load so we don't mutate the global ENV. Each instance
|
|
35
|
+
# gets its own view, and values from the process environment (e.g. set by
|
|
36
|
+
# CI) still take precedence — see `env_value`.
|
|
37
|
+
@loaded_env = File.exist?(@env_path) ? Dotenv.parse(@env_path) : {}
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
# Use this instead of getting values from `ENV` directly. It will throw an error if the requested value is missing or empty.
|
|
41
|
+
def get_required_env!(key)
|
|
42
|
+
unless env_var_set?(key)
|
|
43
|
+
message = "Environment variable '#{key}' is not set."
|
|
44
|
+
|
|
45
|
+
error_message =
|
|
46
|
+
if running_on_ci?
|
|
47
|
+
message
|
|
48
|
+
elsif File.exist?(@env_path)
|
|
49
|
+
"#{message} Consider adding it to #{@env_path}."
|
|
50
|
+
else
|
|
51
|
+
env_file_dir = File.dirname(@env_path)
|
|
52
|
+
env_file_name = File.basename(@env_path)
|
|
53
|
+
|
|
54
|
+
<<~MSG
|
|
55
|
+
#{env_file_name} not found in #{env_file_dir} while looking for env var #{key}.
|
|
56
|
+
|
|
57
|
+
Please copy #{@env_example_path} to #{@env_path} and fill in the value for #{key}.
|
|
58
|
+
|
|
59
|
+
mkdir -p #{Shellwords.shellescape(env_file_dir)} && cp #{Shellwords.shellescape(@env_example_path)} #{Shellwords.shellescape(@env_path)}
|
|
60
|
+
MSG
|
|
61
|
+
end
|
|
62
|
+
|
|
63
|
+
@print_error_lambda.call(error_message)
|
|
64
|
+
raise KeyError, error_message
|
|
65
|
+
end
|
|
66
|
+
|
|
67
|
+
value = env_value(key)
|
|
68
|
+
|
|
69
|
+
if value.to_s.empty?
|
|
70
|
+
empty_message = "Env var for key #{key} is set but empty. Please set a value for #{key}."
|
|
71
|
+
@print_error_lambda.call(empty_message)
|
|
72
|
+
raise ArgumentError, empty_message
|
|
73
|
+
end
|
|
74
|
+
|
|
75
|
+
value
|
|
76
|
+
end
|
|
77
|
+
|
|
78
|
+
# Use this to ensure all env vars a lane requires are set.
|
|
79
|
+
#
|
|
80
|
+
# The best place to call this is at the start of a lane, to fail early.
|
|
81
|
+
def require_env_vars!(*keys)
|
|
82
|
+
keys.flatten.each { |key| get_required_env!(key) }
|
|
83
|
+
end
|
|
84
|
+
|
|
85
|
+
# CI environment helpers — read common metadata from the CI provider.
|
|
86
|
+
#
|
|
87
|
+
# Notice that given Buildkite is the only CI provider we use, they are Buildkite-dependent.
|
|
88
|
+
#
|
|
89
|
+
# If this were to be adopted more broadly, we'd need a two-tier approach:
|
|
90
|
+
# 1. Detect which CI is in use
|
|
91
|
+
# 2. Use its specific env vars
|
|
92
|
+
# 3. Maybe fallback to best guess or outright error if no vendor detected
|
|
93
|
+
|
|
94
|
+
def build_number
|
|
95
|
+
ENV.fetch('BUILDKITE_BUILD_NUMBER', '0')
|
|
96
|
+
end
|
|
97
|
+
|
|
98
|
+
def branch_name
|
|
99
|
+
ENV.fetch('BUILDKITE_BRANCH', nil)
|
|
100
|
+
end
|
|
101
|
+
|
|
102
|
+
def commit_hash
|
|
103
|
+
ENV.fetch('BUILDKITE_COMMIT', nil)
|
|
104
|
+
end
|
|
105
|
+
|
|
106
|
+
# Returns the PR number as an Integer, or nil if not running on a PR build.
|
|
107
|
+
# Buildkite sets BUILDKITE_PULL_REQUEST to 'false' (not nil) when not on a PR.
|
|
108
|
+
def pull_request_number
|
|
109
|
+
pr_num = ENV.fetch('BUILDKITE_PULL_REQUEST', 'false')
|
|
110
|
+
pr_num == 'false' ? nil : Integer(pr_num)
|
|
111
|
+
end
|
|
112
|
+
|
|
113
|
+
# Returns a human-readable label: "PR #123" for PR builds, or the branch name otherwise.
|
|
114
|
+
def pr_number_or_branch_name
|
|
115
|
+
pull_request_number&.then { |num| "PR ##{num}" } || branch_name
|
|
116
|
+
end
|
|
117
|
+
|
|
118
|
+
# Class-level convenience methods that delegate to a default instance.
|
|
119
|
+
# This preserves the existing API: `EnvManager.set_up(...)` then `EnvManager.get_required_env!(...)`.
|
|
120
|
+
|
|
121
|
+
def self.set_up(**args)
|
|
122
|
+
if configured?
|
|
123
|
+
default_print_error_lambda.call('EnvManager is already configured. Call `EnvManager.reset!` before calling `EnvManager.set_up(...)` again.')
|
|
124
|
+
return @default
|
|
125
|
+
end
|
|
126
|
+
|
|
127
|
+
@default = new(**args)
|
|
128
|
+
end
|
|
129
|
+
|
|
130
|
+
def self.get_required_env!(key)
|
|
131
|
+
default!.get_required_env!(key)
|
|
132
|
+
end
|
|
133
|
+
|
|
134
|
+
def self.require_env_vars!(*keys)
|
|
135
|
+
default!.require_env_vars!(*keys)
|
|
136
|
+
end
|
|
137
|
+
|
|
138
|
+
# Clears the default instance, useful for test teardown.
|
|
139
|
+
def self.reset!
|
|
140
|
+
@default = nil
|
|
141
|
+
end
|
|
142
|
+
|
|
143
|
+
# Returns true if a default instance has been configured via `.set_up`.
|
|
144
|
+
def self.configured?
|
|
145
|
+
!@default.nil?
|
|
146
|
+
end
|
|
147
|
+
|
|
148
|
+
def self.default!
|
|
149
|
+
return @default if configured?
|
|
150
|
+
|
|
151
|
+
message = 'EnvManager is not configured. Call `EnvManager.set_up(...)` first.'
|
|
152
|
+
default_print_error_lambda.call(message)
|
|
153
|
+
raise message
|
|
154
|
+
end
|
|
155
|
+
|
|
156
|
+
def self.default_print_error_lambda
|
|
157
|
+
@default&.print_error_lambda || @default_print_error_lambda || ->(message) { FastlaneCore::UI.user_error!(message) }
|
|
158
|
+
end
|
|
159
|
+
|
|
160
|
+
private
|
|
161
|
+
|
|
162
|
+
# Process ENV takes precedence over values loaded from the .env file, matching
|
|
163
|
+
# the original `Dotenv.load` (no-override) semantics.
|
|
164
|
+
def env_var_set?(key)
|
|
165
|
+
ENV.key?(key) || @loaded_env.key?(key)
|
|
166
|
+
end
|
|
167
|
+
|
|
168
|
+
def env_value(key)
|
|
169
|
+
ENV.key?(key) ? ENV.fetch(key) : @loaded_env[key]
|
|
170
|
+
end
|
|
171
|
+
|
|
172
|
+
# Consider any non-empty, non-falsy value of `CI` to mean we're running on CI.
|
|
173
|
+
# Most CI providers set `CI=true`, but some use `CI=1`.
|
|
174
|
+
#
|
|
175
|
+
# Note: the CI helpers above (`build_number`, etc.) remain Buildkite-specific —
|
|
176
|
+
# see the block comment on them. Detection via `CI` is a de facto standard and
|
|
177
|
+
# cheap to generalize; value-fetching is not.
|
|
178
|
+
def running_on_ci?
|
|
179
|
+
value = ENV.fetch('CI', nil)
|
|
180
|
+
return false if value.nil? || value.empty?
|
|
181
|
+
|
|
182
|
+
!%w[false 0].include?(value.downcase)
|
|
183
|
+
end
|
|
184
|
+
end
|
|
185
|
+
end
|
|
186
|
+
end
|
|
@@ -4,9 +4,9 @@ require 'fastlane/plugin/wpmreleasetoolkit/version'
|
|
|
4
4
|
|
|
5
5
|
module Fastlane
|
|
6
6
|
module Wpmreleasetoolkit
|
|
7
|
-
# Return all .rb files inside the "actions", "helper" and "
|
|
7
|
+
# Return all .rb files inside the "actions", "env_manager", "helper", "models", and "versioning" directories
|
|
8
8
|
def self.all_classes
|
|
9
|
-
Dir[File.expand_path('**/{actions,helper,models,versioning}/**/*.rb', File.dirname(__FILE__))]
|
|
9
|
+
Dir[File.expand_path('**/{actions,env_manager,helper,models,versioning}/**/*.rb', File.dirname(__FILE__))]
|
|
10
10
|
end
|
|
11
11
|
end
|
|
12
12
|
end
|
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: 14.
|
|
4
|
+
version: 14.4.1
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Automattic
|
|
8
8
|
autorequire:
|
|
9
9
|
bindir: bin
|
|
10
10
|
cert_chain: []
|
|
11
|
-
date: 2026-
|
|
11
|
+
date: 2026-05-07 00:00:00.000000000 Z
|
|
12
12
|
dependencies:
|
|
13
13
|
- !ruby/object:Gem::Dependency
|
|
14
14
|
name: buildkit
|
|
@@ -52,6 +52,20 @@ dependencies:
|
|
|
52
52
|
- - "~>"
|
|
53
53
|
- !ruby/object:Gem::Version
|
|
54
54
|
version: '3.3'
|
|
55
|
+
- !ruby/object:Gem::Dependency
|
|
56
|
+
name: dotenv
|
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
|
58
|
+
requirements:
|
|
59
|
+
- - "~>"
|
|
60
|
+
- !ruby/object:Gem::Version
|
|
61
|
+
version: '2.8'
|
|
62
|
+
type: :runtime
|
|
63
|
+
prerelease: false
|
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
65
|
+
requirements:
|
|
66
|
+
- - "~>"
|
|
67
|
+
- !ruby/object:Gem::Version
|
|
68
|
+
version: '2.8'
|
|
55
69
|
- !ruby/object:Gem::Dependency
|
|
56
70
|
name: fastlane
|
|
57
71
|
requirement: !ruby/object:Gem::Requirement
|
|
@@ -114,14 +128,20 @@ dependencies:
|
|
|
114
128
|
requirements:
|
|
115
129
|
- - "~>"
|
|
116
130
|
- !ruby/object:Gem::Version
|
|
117
|
-
version: '1.
|
|
131
|
+
version: '1.19'
|
|
132
|
+
- - ">="
|
|
133
|
+
- !ruby/object:Gem::Version
|
|
134
|
+
version: 1.19.3
|
|
118
135
|
type: :runtime
|
|
119
136
|
prerelease: false
|
|
120
137
|
version_requirements: !ruby/object:Gem::Requirement
|
|
121
138
|
requirements:
|
|
122
139
|
- - "~>"
|
|
123
140
|
- !ruby/object:Gem::Version
|
|
124
|
-
version: '1.
|
|
141
|
+
version: '1.19'
|
|
142
|
+
- - ">="
|
|
143
|
+
- !ruby/object:Gem::Version
|
|
144
|
+
version: 1.19.3
|
|
125
145
|
- !ruby/object:Gem::Dependency
|
|
126
146
|
name: octokit
|
|
127
147
|
requirement: !ruby/object:Gem::Requirement
|
|
@@ -453,6 +473,7 @@ files:
|
|
|
453
473
|
- lib/fastlane/plugin/wpmreleasetoolkit/actions/ios/ios_send_app_size_metrics.rb
|
|
454
474
|
- lib/fastlane/plugin/wpmreleasetoolkit/actions/ios/ios_update_metadata_source.rb
|
|
455
475
|
- lib/fastlane/plugin/wpmreleasetoolkit/actions/ios/ios_update_release_notes.rb
|
|
476
|
+
- lib/fastlane/plugin/wpmreleasetoolkit/env_manager/env_manager.rb
|
|
456
477
|
- lib/fastlane/plugin/wpmreleasetoolkit/helper/android/android_emulator_helper.rb
|
|
457
478
|
- lib/fastlane/plugin/wpmreleasetoolkit/helper/android/android_localize_helper.rb
|
|
458
479
|
- lib/fastlane/plugin/wpmreleasetoolkit/helper/android/android_tools_path_helper.rb
|