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: 9ab881ca2ace19096ebd20f3fd2360b3b1292193de386d1af5d911b2962f5f15
4
- data.tar.gz: 53f1bdd9b33fd1e77c7f8024aa8c135cf4449d4ccf50ab4a09e4c47e11133d3b
3
+ metadata.gz: 53fda01b5c9773e9763663cbce794b14dfc05895fd4811832244b10419b57290
4
+ data.tar.gz: 39baf709e7720943a6e403859515bc0dcfd5d8538afe74ae258d24d5586c7c0b
5
5
  SHA512:
6
- metadata.gz: 7582dc3820b054a40ffb705d8a47468384ce6cbb1bc1ef12b4b21c3989dd275b8ef70251dfbd1721650ea3839566fdc2858434c8b62f76b831ff49c332b76b57
7
- data.tar.gz: d89204a2d5e4c52dae4ce2cb45e46464ae2cdd8d76b94987303366fffeb6db126301823a19c3128d9f16ccf9a72c24d6007757e84d1f112a88511490b3e168a4
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
@@ -3,6 +3,6 @@
3
3
  module Fastlane
4
4
  module Wpmreleasetoolkit
5
5
  NAME = 'fastlane-plugin-wpmreleasetoolkit'
6
- VERSION = '14.3.1'
6
+ VERSION = '14.4.1'
7
7
  end
8
8
  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 "models" directories
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.3.1
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-03-31 00:00:00.000000000 Z
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.11'
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.11'
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