From 0883a91dfae2c2c8dc4d6223834bc0ee3535ab71 Mon Sep 17 00:00:00 2001 From: Tatsuya Otsuka Date: Thu, 6 Nov 2025 01:43:11 +0900 Subject: [PATCH 1/3] Add goos.environ() function --- goos/README.md | 8 ++++++++ goos/api.go | 13 +++++++++++++ goos/example_test.go | 24 ++++++++++++++++++++++++ goos/loader.go | 1 + goos/test/test_api.lua | 15 +++++++++++++++ 5 files changed, 61 insertions(+) diff --git a/goos/README.md b/goos/README.md index 729a47d..13b058b 100644 --- a/goos/README.md +++ b/goos/README.md @@ -26,4 +26,12 @@ if not(page_size > 0) then error("bad pagesize") end goos.mkdir_all("./test/test_dir/test_dir/all") local stat, err = goos.stat("./test/test_dir/test_dir/all") if err then error(err) end + +-- environ +local env = goos.environ() +print(env.PATH) -- prints the PATH environment variable +print(env.HOME) -- prints the HOME environment variable +for key, value in pairs(env) do + print(key .. "=" .. value) +end ``` diff --git a/goos/api.go b/goos/api.go index 1ab4ff3..cae1141 100644 --- a/goos/api.go +++ b/goos/api.go @@ -3,6 +3,7 @@ package goos import ( "os" + "strings" lua "github.com/yuin/gopher-lua" ) @@ -52,3 +53,15 @@ func MkdirAll(L *lua.LState) int { } return 0 } + +// Environ lua goos.environ() returns table +func Environ(L *lua.LState) int { + envVars := os.Environ() + result := L.NewTable() + for _, env := range envVars { + parts := strings.SplitN(env, "=", 2) + result.RawSetString(parts[0], lua.LString(parts[1])) + } + L.Push(result) + return 1 +} diff --git a/goos/example_test.go b/goos/example_test.go index 26360b9..61670b7 100644 --- a/goos/example_test.go +++ b/goos/example_test.go @@ -82,3 +82,27 @@ print(err == nil) // Output: // true } + +// goos.environ() +func ExampleEnviron() { + state := lua.NewState() + Preload(state) + source := ` +local goos = require("goos") +local env = goos.environ() +-- Check that we get a table +print(type(env) == "table") +-- Check that we have at least one environment variable +local count = 0 +for k, v in pairs(env) do + count = count + 1 +end +print(count > 0) + ` + if err := state.DoString(source); err != nil { + log.Fatal(err.Error()) + } + // Output: + // true + // true +} diff --git a/goos/loader.go b/goos/loader.go index 47fa25d..e0256a8 100644 --- a/goos/loader.go +++ b/goos/loader.go @@ -25,4 +25,5 @@ var api = map[string]lua.LGFunction{ "hostname": Hostname, "get_pagesize": Getpagesize, "mkdir_all": MkdirAll, + "environ": Environ, } diff --git a/goos/test/test_api.lua b/goos/test/test_api.lua index 362d997..762c6ce 100644 --- a/goos/test/test_api.lua +++ b/goos/test/test_api.lua @@ -19,3 +19,18 @@ end function Test_pagesize(t) assert(goos.get_pagesize() > 0, "pagesize") end + +function Test_environ(t) + local env = goos.environ() + assert(env, "environ should return table") + -- Check that we get a table with environment variables + local count = 0 + for k, v in pairs(env) do + count = count + 1 + assert(type(k) == "string", "key should be string") + assert(type(v) == "string", "value should be string") + end + assert(count > 0, "environ should return at least one environment variable") + -- PATH should exist on most systems + assert(env.PATH or env.Path, "PATH environment variable should exist") +end From ec482e297f0c5495b5832735cae9dd48c37290cd Mon Sep 17 00:00:00 2001 From: Tatsuya Otsuka Date: Thu, 6 Nov 2025 11:38:37 +0900 Subject: [PATCH 2/3] Add test for environment variable with equals in value --- goos/api_test.go | 7 ++++++- goos/test/test_api.lua | 2 ++ 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/goos/api_test.go b/goos/api_test.go index 9cc66dd..7ad5a16 100644 --- a/goos/api_test.go +++ b/goos/api_test.go @@ -1,14 +1,19 @@ package goos import ( + "os" + "testing" + "github.com/stretchr/testify/assert" "github.com/vadv/gopher-lua-libs/tests" - "testing" runtime "github.com/vadv/gopher-lua-libs/runtime" ) func TestApi(t *testing.T) { + os.Setenv("ENV_VAR", "TEST=1") + defer os.Unsetenv("ENV_VAR") + preload := tests.SeveralPreloadFuncs( runtime.Preload, Preload, diff --git a/goos/test/test_api.lua b/goos/test/test_api.lua index 762c6ce..10ed431 100644 --- a/goos/test/test_api.lua +++ b/goos/test/test_api.lua @@ -33,4 +33,6 @@ function Test_environ(t) assert(count > 0, "environ should return at least one environment variable") -- PATH should exist on most systems assert(env.PATH or env.Path, "PATH environment variable should exist") + -- Test environment variable with equals sign in value + assert(env.ENV_VAR == "TEST=1", "ENV_VAR should be TEST=1") end From fe3b24ab7d5c1fedd75e00485608b83580a03ded Mon Sep 17 00:00:00 2001 From: Tatsuya Otsuka Date: Thu, 6 Nov 2025 11:54:53 +0900 Subject: [PATCH 3/3] Add test for environment variable with empty value --- goos/api_test.go | 3 +++ goos/test/test_api.lua | 2 ++ 2 files changed, 5 insertions(+) diff --git a/goos/api_test.go b/goos/api_test.go index 7ad5a16..390fbe6 100644 --- a/goos/api_test.go +++ b/goos/api_test.go @@ -14,6 +14,9 @@ func TestApi(t *testing.T) { os.Setenv("ENV_VAR", "TEST=1") defer os.Unsetenv("ENV_VAR") + os.Setenv("EMPTY_VAR", "") + defer os.Unsetenv("EMPTY_VAR") + preload := tests.SeveralPreloadFuncs( runtime.Preload, Preload, diff --git a/goos/test/test_api.lua b/goos/test/test_api.lua index 10ed431..9546761 100644 --- a/goos/test/test_api.lua +++ b/goos/test/test_api.lua @@ -35,4 +35,6 @@ function Test_environ(t) assert(env.PATH or env.Path, "PATH environment variable should exist") -- Test environment variable with equals sign in value assert(env.ENV_VAR == "TEST=1", "ENV_VAR should be TEST=1") + -- Test environment variable with empty value + assert(env.EMPTY_VAR == "", "EMPTY_VAR should be empty string") end