Class: Fastlane::Wpmreleasetoolkit::EnvManager
- Inherits:
-
Object
- Object
- Fastlane::Wpmreleasetoolkit::EnvManager
- Defined in:
- lib/fastlane/plugin/wpmreleasetoolkit/env_manager/env_manager.rb
Overview
Manages loading of environment variables from a .env and accessing them in a user-friendly way.
Class Attribute Summary collapse
Instance Attribute Summary collapse
-
#env_example_path ⇒ Object
readonly
Returns the value of attribute env_example_path.
-
#env_path ⇒ Object
readonly
Returns the value of attribute env_path.
-
#print_error_lambda ⇒ Object
readonly
Returns the value of attribute print_error_lambda.
Class Method Summary collapse
-
.configured? ⇒ Boolean
Returns true if a default instance has been configured via ‘.set_up`.
- .default! ⇒ Object
- .get_required_env!(key) ⇒ Object
- .require_env_vars!(*keys) ⇒ Object
-
.reset! ⇒ Object
Clears the default instance, useful for test teardown.
-
.set_up(**args) ⇒ Object
Class-level convenience methods that delegate to a default instance.
Instance Method Summary collapse
- #branch_name ⇒ Object
-
#build_number ⇒ Object
CI environment helpers — read common metadata from the CI provider.
- #commit_hash ⇒ Object
-
#get_required_env!(key) ⇒ Object
Use this instead of getting values from ‘ENV` directly.
-
#initialize(env_file_name:, env_file_folder: File.join(Dir.home, '.a8c-apps'), example_env_file_path: 'fastlane/example.env', print_error_lambda: ->(message) { FastlaneCore::UI.user_error!(message) }, print_warning_lambda: ->(message) { FastlaneCore::UI.important(message) }) ⇒ EnvManager
constructor
Set up by loading the .env file with the given name.
-
#pr_number_or_branch_name ⇒ Object
Returns a human-readable label: “PR #123” for PR builds, or the branch name otherwise.
-
#pull_request_number ⇒ Object
Returns the PR number as an Integer, or nil if not running on a PR build.
-
#require_env_vars!(*keys) ⇒ Object
Use this to ensure all env vars a lane requires are set.
Constructor Details
#initialize(env_file_name:, env_file_folder: File.join(Dir.home, '.a8c-apps'), example_env_file_path: 'fastlane/example.env', print_error_lambda: ->(message) { FastlaneCore::UI.user_error!(message) }, print_warning_lambda: ->(message) { FastlaneCore::UI.important(message) }) ⇒ EnvManager
Set up by loading the .env file with the given name.
18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 |
# File 'lib/fastlane/plugin/wpmreleasetoolkit/env_manager/env_manager.rb', line 18 def initialize( env_file_name:, env_file_folder: File.join(Dir.home, '.a8c-apps'), example_env_file_path: 'fastlane/example.env', print_error_lambda: ->() { FastlaneCore::UI.user_error!() }, print_warning_lambda: ->() { FastlaneCore::UI.important() } ) @env_path = File.join(env_file_folder, env_file_name) @env_example_path = example_env_file_path @print_error_lambda = print_error_lambda @print_warning_lambda = print_warning_lambda unless File.exist?(@env_path) || running_on_ci? @print_warning_lambda.call("Warning: env file not found at #{@env_path}. Environment variables may not be loaded.") end # Parse rather than load so we don't mutate the global ENV. Each instance # gets its own view, and values from the process environment (e.g. set by # CI) still take precedence — see `env_value`. @loaded_env = File.exist?(@env_path) ? Dotenv.parse(@env_path) : {} end |
Class Attribute Details
.default_print_error_lambda ⇒ Object
156 157 158 |
# File 'lib/fastlane/plugin/wpmreleasetoolkit/env_manager/env_manager.rb', line 156 def self.default_print_error_lambda @default&.print_error_lambda || @default_print_error_lambda || ->() { FastlaneCore::UI.user_error!() } end |
Instance Attribute Details
#env_example_path ⇒ Object (readonly)
Returns the value of attribute env_example_path.
11 12 13 |
# File 'lib/fastlane/plugin/wpmreleasetoolkit/env_manager/env_manager.rb', line 11 def env_example_path @env_example_path end |
#env_path ⇒ Object (readonly)
Returns the value of attribute env_path.
11 12 13 |
# File 'lib/fastlane/plugin/wpmreleasetoolkit/env_manager/env_manager.rb', line 11 def env_path @env_path end |
#print_error_lambda ⇒ Object (readonly)
Returns the value of attribute print_error_lambda.
11 12 13 |
# File 'lib/fastlane/plugin/wpmreleasetoolkit/env_manager/env_manager.rb', line 11 def print_error_lambda @print_error_lambda end |
Class Method Details
.configured? ⇒ Boolean
Returns true if a default instance has been configured via ‘.set_up`.
144 145 146 |
# File 'lib/fastlane/plugin/wpmreleasetoolkit/env_manager/env_manager.rb', line 144 def self.configured? !@default.nil? end |
.default! ⇒ Object
148 149 150 151 152 153 154 |
# File 'lib/fastlane/plugin/wpmreleasetoolkit/env_manager/env_manager.rb', line 148 def self.default! return @default if configured? = 'EnvManager is not configured. Call `EnvManager.set_up(...)` first.' default_print_error_lambda.call() raise end |
.get_required_env!(key) ⇒ Object
130 131 132 |
# File 'lib/fastlane/plugin/wpmreleasetoolkit/env_manager/env_manager.rb', line 130 def self.get_required_env!(key) default!.get_required_env!(key) end |
.require_env_vars!(*keys) ⇒ Object
134 135 136 |
# File 'lib/fastlane/plugin/wpmreleasetoolkit/env_manager/env_manager.rb', line 134 def self.require_env_vars!(*keys) default!.require_env_vars!(*keys) end |
.reset! ⇒ Object
Clears the default instance, useful for test teardown.
139 140 141 |
# File 'lib/fastlane/plugin/wpmreleasetoolkit/env_manager/env_manager.rb', line 139 def self.reset! @default = nil end |
.set_up(**args) ⇒ Object
Class-level convenience methods that delegate to a default instance. This preserves the existing API: ‘EnvManager.set_up(…)` then `EnvManager.get_required_env!(…)`.
121 122 123 124 125 126 127 128 |
# File 'lib/fastlane/plugin/wpmreleasetoolkit/env_manager/env_manager.rb', line 121 def self.set_up(**args) if configured? default_print_error_lambda.call('EnvManager is already configured. Call `EnvManager.reset!` before calling `EnvManager.set_up(...)` again.') return @default end @default = new(**args) end |
Instance Method Details
#branch_name ⇒ Object
98 99 100 |
# File 'lib/fastlane/plugin/wpmreleasetoolkit/env_manager/env_manager.rb', line 98 def branch_name ENV.fetch('BUILDKITE_BRANCH', nil) end |
#build_number ⇒ Object
CI environment helpers — read common metadata from the CI provider.
Notice that given Buildkite is the only CI provider we use, they are Buildkite-dependent.
If this were to be adopted more broadly, we’d need a two-tier approach:
-
Detect which CI is in use
-
Use its specific env vars
-
Maybe fallback to best guess or outright error if no vendor detected
94 95 96 |
# File 'lib/fastlane/plugin/wpmreleasetoolkit/env_manager/env_manager.rb', line 94 def build_number ENV.fetch('BUILDKITE_BUILD_NUMBER', '0') end |
#commit_hash ⇒ Object
102 103 104 |
# File 'lib/fastlane/plugin/wpmreleasetoolkit/env_manager/env_manager.rb', line 102 def commit_hash ENV.fetch('BUILDKITE_COMMIT', nil) end |
#get_required_env!(key) ⇒ Object
Use this instead of getting values from ‘ENV` directly. It will throw an error if the requested value is missing or empty.
41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 |
# File 'lib/fastlane/plugin/wpmreleasetoolkit/env_manager/env_manager.rb', line 41 def get_required_env!(key) unless env_var_set?(key) = "Environment variable '#{key}' is not set." = if running_on_ci? elsif File.exist?(@env_path) "#{} Consider adding it to #{@env_path}." else env_file_dir = File.dirname(@env_path) env_file_name = File.basename(@env_path) <<~MSG #{env_file_name} not found in #{env_file_dir} while looking for env var #{key}. Please copy #{@env_example_path} to #{@env_path} and fill in the value for #{key}. mkdir -p #{Shellwords.shellescape(env_file_dir)} && cp #{Shellwords.shellescape(@env_example_path)} #{Shellwords.shellescape(@env_path)} MSG end @print_error_lambda.call() raise KeyError, end value = env_value(key) if value.to_s.empty? = "Env var for key #{key} is set but empty. Please set a value for #{key}." @print_error_lambda.call() raise ArgumentError, end value end |
#pr_number_or_branch_name ⇒ Object
Returns a human-readable label: “PR #123” for PR builds, or the branch name otherwise.
114 115 116 |
# File 'lib/fastlane/plugin/wpmreleasetoolkit/env_manager/env_manager.rb', line 114 def pr_number_or_branch_name pull_request_number&.then { |num| "PR ##{num}" } || branch_name end |
#pull_request_number ⇒ Object
Returns the PR number as an Integer, or nil if not running on a PR build. Buildkite sets BUILDKITE_PULL_REQUEST to ‘false’ (not nil) when not on a PR.
108 109 110 111 |
# File 'lib/fastlane/plugin/wpmreleasetoolkit/env_manager/env_manager.rb', line 108 def pull_request_number pr_num = ENV.fetch('BUILDKITE_PULL_REQUEST', 'false') pr_num == 'false' ? nil : Integer(pr_num) end |
#require_env_vars!(*keys) ⇒ Object
Use this to ensure all env vars a lane requires are set.
The best place to call this is at the start of a lane, to fail early.
81 82 83 |
# File 'lib/fastlane/plugin/wpmreleasetoolkit/env_manager/env_manager.rb', line 81 def require_env_vars!(*keys) keys.flatten.each { |key| get_required_env!(key) } end |