Class: Fastlane::Wpmreleasetoolkit::EnvManager

Inherits:
Object
  • Object
show all
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

Class Method Summary collapse

Instance Method Summary collapse

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: ->(message) { FastlaneCore::UI.user_error!(message) },
  print_warning_lambda: ->(message) { FastlaneCore::UI.important(message) }
)
  @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_lambdaObject



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 || ->(message) { FastlaneCore::UI.user_error!(message) }
end

Instance Attribute Details

#env_example_pathObject (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_pathObject (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

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`.

Returns:

  • (Boolean)


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?

  message = 'EnvManager is not configured. Call `EnvManager.set_up(...)` first.'
  default_print_error_lambda.call(message)
  raise message
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_nameObject



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_numberObject

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:

  1. Detect which CI is in use

  2. Use its specific env vars

  3. 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_hashObject



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)
    message = "Environment variable '#{key}' is not set."

    error_message =
      if running_on_ci?
        message
      elsif File.exist?(@env_path)
        "#{message} 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(error_message)
    raise KeyError, error_message
  end

  value = env_value(key)

  if value.to_s.empty?
    empty_message = "Env var for key #{key} is set but empty. Please set a value for #{key}."
    @print_error_lambda.call(empty_message)
    raise ArgumentError, empty_message
  end

  value
end

#pr_number_or_branch_nameObject

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_numberObject

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