Commit 25773938 authored by Roman Alifanov's avatar Roman Alifanov

Add env.VAR syntax for environment variables

- Access env vars directly: env.HOME, env.USER, env.PATH - Generates ${VAR} without fork (no shell.capture needed) - Type is 'any', can be explicitly typed: port: int = env.PORT - Add 4 tests for env variables including int arithmetic - Update all documentation files
parent 5121e024
......@@ -961,6 +961,25 @@ count = args.count ()
arg = args.get (0)
```
### env (переменные окружения)
```
# Доступ к переменным окружения
home = env.HOME
user = env.USER
path = env.PATH
# С явной типизацией
port: int = env.PORT
debug: bool = env.DEBUG
# Арифметика с числовыми env
uid: int = env.UID
next_uid = uid + 1
```
Генерирует `${VAR}` напрямую — без fork.
### shell (выполнение команд)
```
......
......@@ -276,6 +276,7 @@ try {
| **Random** | `random()`, `random_range()` |
| **Args** | `args.count/get` |
| **Logger** | `logger.info/warn/error/debug` |
| **Env** | `env.HOME`, `env.USER`, `env.VAR` — environment variables |
## CLI Commands
......
......@@ -276,6 +276,7 @@ try {
| **Случайные числа** | `random()`, `random_range()` |
| **Аргументы** | `args.count/get` |
| **Логгер** | `logger.info/warn/error/debug` |
| **Окружение** | `env.HOME`, `env.USER`, `env.VAR` — переменные окружения |
## Команды CLI
......
......@@ -118,6 +118,9 @@ class DispatchMixin:
return expr.class_name
elif isinstance(expr, Lambda):
return "func"
elif isinstance(expr, MemberAccess):
if isinstance(expr.object, Identifier) and expr.object.name == "env":
return "any"
elif isinstance(expr, Identifier):
name = expr.name
if name in self.array_vars:
......
......@@ -434,6 +434,9 @@ class ExprMixin:
return None
def _generate_member_access(self, expr: MemberAccess) -> str:
if isinstance(expr.object, Identifier) and expr.object.name == "env":
return f'${{{expr.member}}}'
field_name = expr.member
is_array_field = any(
self.class_field_types.get((cls, field_name)) == "array"
......
......@@ -596,6 +596,41 @@ foreach i in range (1, 4) {
assert "3" in stdout
class TestEnvVariables:
def test_env_home(self):
code, stdout, _ = run_ct('''
home = env.HOME
print (home)
''')
assert code == 0
assert "/home" in stdout or "/Users" in stdout or "/root" in stdout
def test_env_user(self):
code, stdout, _ = run_ct('''
user = env.USER
print (user)
''')
assert code == 0
assert len(stdout.strip()) > 0
def test_env_typed(self):
code, stdout, _ = run_ct('''
home: string = env.HOME
print (home)
''')
assert code == 0
assert "/" in stdout
def test_env_int_arithmetic(self):
code, stdout, _ = run_ct('''
uid: int = env.UID
doubled = uid * 2
print (doubled)
''')
assert code == 0
assert int(stdout.strip()) > 0
class TestJson:
def test_json_parse(self):
code, stdout, _ = run_ct(r'''
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment