@@ -25,11 +25,19 @@ impl Gemset {
25
25
. ok_or_else ( || format ! ( "Failed to convert path for '{bin_name}'" ) )
26
26
}
27
27
28
- pub fn gem_path_env ( & self ) -> Vec < ( String , String ) > {
29
- vec ! [ (
28
+ pub fn env ( & self , envs : Option < & [ ( & str , & str ) ] > ) -> Vec < ( String , String ) > {
29
+ let mut env_map: std:: collections:: HashMap < String , String > = envs
30
+ . unwrap_or ( & [ ] )
31
+ . iter ( )
32
+ . map ( |( k, v) | ( k. to_string ( ) , v. to_string ( ) ) )
33
+ . collect ( ) ;
34
+
35
+ env_map. insert (
30
36
"GEM_PATH" . to_string ( ) ,
31
37
format ! ( "{}:$GEM_PATH" , self . gem_home. display( ) ) ,
32
- ) ]
38
+ ) ;
39
+
40
+ env_map. into_iter ( ) . collect ( )
33
41
}
34
42
35
43
pub fn install_gem ( & self , name : & str ) -> Result < ( ) , String > {
@@ -217,17 +225,45 @@ mod tests {
217
225
}
218
226
219
227
#[ test]
220
- fn test_gem_path_env ( ) {
228
+ fn test_gem_env ( ) {
221
229
let gemset = Gemset :: new (
222
230
TEST_GEM_HOME . into ( ) ,
223
231
Box :: new ( MockGemCommandExecutor :: new ( ) ) ,
224
232
) ;
225
- let env = gemset. gem_path_env ( ) ;
233
+ let env = gemset. env ( None ) ;
226
234
assert_eq ! ( env. len( ) , 1 ) ;
227
235
assert_eq ! ( env[ 0 ] . 0 , "GEM_PATH" ) ;
228
236
assert_eq ! ( env[ 0 ] . 1 , "/test/gem_home:$GEM_PATH" ) ;
229
237
}
230
238
239
+ #[ test]
240
+ fn test_gem_env_with_env_vars ( ) {
241
+ let gemset = Gemset :: new (
242
+ TEST_GEM_HOME . into ( ) ,
243
+ Box :: new ( MockGemCommandExecutor :: new ( ) ) ,
244
+ ) ;
245
+ let env = gemset. env ( Some ( & [ ( "GEM_HOME" , "/home/user/.gem" ) ] ) ) ;
246
+ assert_eq ! ( env. len( ) , 2 ) ;
247
+
248
+ let env_map: std:: collections:: HashMap < String , String > = env. into_iter ( ) . collect ( ) ;
249
+ assert_eq ! ( env_map. get( "GEM_HOME" ) . unwrap( ) , "/home/user/.gem" ) ;
250
+ assert_eq ! ( env_map. get( "GEM_PATH" ) . unwrap( ) , "/test/gem_home:$GEM_PATH" ) ;
251
+ }
252
+
253
+ #[ test]
254
+ fn test_gem_env_with_env_vars_overwrite ( ) {
255
+ let gemset = Gemset :: new (
256
+ TEST_GEM_HOME . into ( ) ,
257
+ Box :: new ( MockGemCommandExecutor :: new ( ) ) ,
258
+ ) ;
259
+ let env = gemset. env ( Some ( & [ ( "GEM_PATH" , "/home/user/.gem" ) ] ) ) ;
260
+ assert_eq ! ( env. len( ) , 1 ) ;
261
+
262
+ // GEM_PATH should be overwritten with our value
263
+ let env_map: std:: collections:: HashMap < String , String > = env. into_iter ( ) . collect ( ) ;
264
+ assert_eq ! ( env_map. get( "GEM_PATH" ) . unwrap( ) , "/test/gem_home:$GEM_PATH" ) ;
265
+ }
266
+
231
267
#[ test]
232
268
fn test_install_gem_success ( ) {
233
269
let mock_executor = MockGemCommandExecutor :: new ( ) ;
0 commit comments