@@ -27,10 +27,13 @@ def initialize(http_client)
2727 # @param skip_unique_validation [Boolean] in recursive mode, duplicate keys
2828 # across folders are collapsed to one secret per key (last occurrence
2929 # wins) unless this is true, in which case all of them are kept
30+ # @param attach_to_process_env [Boolean] export each fetched secret into
31+ # the process environment (ENV), without overriding variables that are
32+ # already set
3033 # @return [Array<Models::Secret>]
3134 # @raise [APIError] if the API rejects the request
3235 def list ( project_id :, environment :, secret_path : "/" , include_imports : true , recursive : false ,
33- skip_unique_validation : false )
36+ skip_unique_validation : false , attach_to_process_env : false )
3437 response = @http_client . get (
3538 BASE_PATH ,
3639 params : {
@@ -45,7 +48,9 @@ def list(project_id:, environment:, secret_path: "/", include_imports: true, rec
4548 secrets = Array ( response [ "secrets" ] ) . map { |secret | Models ::Secret . from_api ( secret ) }
4649 secrets = ensure_unique_secrets_by_key ( secrets , skip_unique_validation ) if recursive
4750 secrets = merge_imported_secrets ( secrets , response [ "imports" ] ) if include_imports
48- secrets . sort_by ( &:secret_key )
51+ secrets = secrets . sort_by ( &:secret_key )
52+ attach_to_env ( secrets ) if attach_to_process_env
53+ secrets
4954 end
5055
5156 # Fetches a single secret by name.
@@ -80,17 +85,21 @@ def get(secret_name, project_id:, environment:, secret_path: "/", include_import
8085 # @param environment [String] environment slug, e.g. "dev"
8186 # @param secret_path [String] folder path to create the secret at
8287 # @param secret_comment [String, nil] optional comment stored with the secret
88+ # @param skip_multiline_encoding [Boolean, nil] disable the API's encoding
89+ # of multi-line values; omitted from the request when nil
8390 # @return [Models::Secret] the created secret
8491 # @raise [APIError] if the API rejects the request, e.g. the name is taken
85- def create ( secret_name , secret_value , project_id :, environment :, secret_path : "/" , secret_comment : nil )
92+ def create ( secret_name , secret_value , project_id :, environment :, secret_path : "/" , secret_comment : nil ,
93+ skip_multiline_encoding : nil )
8694 response = @http_client . post (
8795 secret_path_for ( secret_name ) ,
8896 body : {
8997 projectId : project_id ,
9098 environment : environment ,
9199 secretPath : secret_path ,
92100 secretValue : secret_value ,
93- secretComment : secret_comment
101+ secretComment : secret_comment ,
102+ skipMultilineEncoding : skip_multiline_encoding
94103 } . compact
95104 )
96105
@@ -105,10 +114,13 @@ def create(secret_name, secret_value, project_id:, environment:, secret_path: "/
105114 # @param secret_value [String, nil] new value, if changing it
106115 # @param new_secret_name [String, nil] new key, if renaming
107116 # @param secret_path [String] folder path the secret lives at
117+ # @param skip_multiline_encoding [Boolean, nil] disable the API's encoding
118+ # of multi-line values; omitted from the request when nil
108119 # @return [Models::Secret] the updated secret
109120 # @raise [ArgumentError] if neither secret_value nor new_secret_name is given
110121 # @raise [NotFoundError] if no such secret exists
111- def update ( secret_name , project_id :, environment :, secret_value : nil , new_secret_name : nil , secret_path : "/" )
122+ def update ( secret_name , project_id :, environment :, secret_value : nil , new_secret_name : nil , secret_path : "/" ,
123+ skip_multiline_encoding : nil )
112124 if secret_value . nil? && new_secret_name . nil?
113125 raise ArgumentError , "update requires at least one of secret_value: or new_secret_name:"
114126 end
@@ -120,7 +132,8 @@ def update(secret_name, project_id:, environment:, secret_value: nil, new_secret
120132 environment : environment ,
121133 secretPath : secret_path ,
122134 secretValue : secret_value ,
123- newSecretName : new_secret_name
135+ newSecretName : new_secret_name ,
136+ skipMultilineEncoding : skip_multiline_encoding
124137 } . compact
125138 )
126139
@@ -181,6 +194,15 @@ def merge_imported_secrets(secrets, import_blocks)
181194 merged
182195 end
183196
197+ # Exports secrets into the process environment. A variable that already
198+ # has a non-empty value is left untouched; an empty value counts as
199+ # unset, matching the Go SDK.
200+ def attach_to_env ( secrets )
201+ secrets . each do |secret |
202+ ENV [ secret . secret_key ] = secret . secret_value if ENV [ secret . secret_key ] . to_s . empty?
203+ end
204+ end
205+
184206 # Escapes a secret name for safe use as a single URI path segment, so
185207 # names containing "/", "?", "#", or "%" can't be misread as path
186208 # separators or query-string tokens.
0 commit comments