Skip to content

Commit e6dc78b

Browse files
committed
feat: extended Phase to utilize all phase_io utils
1 parent d16f42d commit e6dc78b

File tree

2 files changed

+120
-26
lines changed

2 files changed

+120
-26
lines changed

src/phase/__init__.py

Lines changed: 18 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,19 @@
1-
from .phase import Phase
1+
from .phase import (
2+
Phase,
3+
GetSecretOptions,
4+
GetAllSecretsOptions,
5+
CreateSecretsOptions,
6+
SecretUpdateOptions,
7+
DeleteSecretOptions,
8+
PhaseSecret
9+
)
210

3-
__all__ = ['Phase']
11+
__all__ = [
12+
'Phase',
13+
'GetSecretOptions',
14+
'GetAllSecretsOptions',
15+
'CreateSecretsOptions',
16+
'SecretUpdateOptions',
17+
'DeleteSecretOptions',
18+
'PhaseSecret'
19+
]

src/phase/phase.py

Lines changed: 102 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -1,29 +1,89 @@
1-
from dataclasses import dataclass
1+
from dataclasses import dataclass, field
22
from typing import List, Dict, Optional
33
from .utils.phase_io import Phase as PhaseIO
44
from .utils.secret_referencing import resolve_all_secrets
55

6+
@dataclass
7+
class GetSecretOptions:
8+
env_name: str
9+
app_name: str
10+
key_to_find: Optional[str] = None
11+
tag: Optional[str] = None
12+
secret_path: str = "/"
13+
14+
@dataclass
15+
class GetAllSecretsOptions:
16+
env_name: str
17+
app_name: str
18+
tag: Optional[str] = None
19+
secret_path: str = "/"
20+
21+
@dataclass
22+
class CreateSecretsOptions:
23+
env_name: str
24+
app_name: str
25+
key_value_pairs: List[Dict[str, str]]
26+
secret_path: str = "/"
27+
28+
@dataclass
29+
class SecretUpdateOptions:
30+
env_name: str
31+
app_name: str
32+
key: str
33+
value: Optional[str] = None
34+
secret_path: str = "/"
35+
destination_path: Optional[str] = None
36+
override: bool = False
37+
toggle_override: bool = False
38+
39+
@dataclass
40+
class DeleteSecretOptions:
41+
env_name: str
42+
app_name: str
43+
key_to_delete: str
44+
secret_path: str = "/"
45+
646
@dataclass
747
class PhaseSecret:
848
key: str
949
value: str
10-
comment: str
11-
path: str
12-
tags: List[str]
13-
overridden: bool
50+
comment: str = ""
51+
path: str = "/"
52+
tags: List[str] = field(default_factory=list)
53+
overridden: bool = False
1454

1555
class Phase:
1656
def __init__(self, init=True, pss=None, host=None):
1757
self._phase_io = PhaseIO(init=init, pss=pss, host=host)
1858

19-
def create(self, env_name: str, app_name: str, secrets: List[PhaseSecret], path: str = '/') -> str:
20-
key_value_pairs = [(secret.key, secret.value) for secret in secrets]
21-
response = self._phase_io.create(key_value_pairs, env_name, app_name, path)
22-
return "Success" if response.status_code == 200 else f"Error: {response.status_code}"
59+
def get_secret(self, options: GetSecretOptions) -> Optional[PhaseSecret]:
60+
secrets = self._phase_io.get(
61+
env_name=options.env_name,
62+
keys=[options.key_to_find] if options.key_to_find else None,
63+
app_name=options.app_name,
64+
tag=options.tag,
65+
path=options.secret_path
66+
)
67+
if secrets:
68+
secret = secrets[0]
69+
return PhaseSecret(
70+
key=secret['key'],
71+
value=secret['value'],
72+
comment=secret.get('comment', ''),
73+
path=secret.get('path', '/'),
74+
tags=secret.get('tags', []),
75+
overridden=secret.get('overridden', False)
76+
)
77+
return None
2378

24-
def get(self, env_name: str, keys: List[str] = None, app_name: str = None, tag: str = None, path: str = '') -> List[PhaseSecret]:
25-
secrets = self._phase_io.get(env_name, keys, app_name, tag, path)
26-
phase_secrets = [
79+
def get_all_secrets(self, options: GetAllSecretsOptions) -> List[PhaseSecret]:
80+
secrets = self._phase_io.get(
81+
env_name=options.env_name,
82+
app_name=options.app_name,
83+
tag=options.tag,
84+
path=options.secret_path
85+
)
86+
return [
2787
PhaseSecret(
2888
key=secret['key'],
2989
value=secret['value'],
@@ -34,22 +94,40 @@ def get(self, env_name: str, keys: List[str] = None, app_name: str = None, tag:
3494
)
3595
for secret in secrets
3696
]
37-
return self._resolve_references(phase_secrets, env_name, app_name)
3897

39-
def update(self, env_name: str, secret: PhaseSecret, app_name: str = None) -> str:
40-
response = self._phase_io.update(
41-
env_name,
42-
secret.key,
43-
secret.value,
44-
app_name,
45-
source_path=secret.path
98+
def create_secrets(self, options: CreateSecretsOptions) -> str:
99+
# Convert the list of dictionaries to a list of tuples
100+
key_value_tuples = [(list(item.keys())[0], list(item.values())[0]) for item in options.key_value_pairs]
101+
102+
response = self._phase_io.create(
103+
key_value_pairs=key_value_tuples,
104+
env_name=options.env_name,
105+
app_name=options.app_name,
106+
path=options.secret_path
107+
)
108+
return "Success" if response.status_code == 200 else f"Error: {response.status_code}"
109+
110+
def update_secret(self, options: SecretUpdateOptions) -> str:
111+
return self._phase_io.update(
112+
env_name=options.env_name,
113+
key=options.key,
114+
value=options.value,
115+
app_name=options.app_name,
116+
source_path=options.secret_path,
117+
destination_path=options.destination_path,
118+
override=options.override,
119+
toggle_override=options.toggle_override
46120
)
47-
return response
48121

49-
def delete(self, env_name: str, keys: List[str], app_name: str = None, path: str = None) -> List[str]:
50-
return self._phase_io.delete(env_name, keys, app_name, path)
122+
def delete_secret(self, options: DeleteSecretOptions) -> List[str]:
123+
return self._phase_io.delete(
124+
env_name=options.env_name,
125+
keys_to_delete=[options.key_to_delete],
126+
app_name=options.app_name,
127+
path=options.secret_path
128+
)
51129

52-
def _resolve_references(self, secrets: List[PhaseSecret], env_name: str, app_name: str) -> List[PhaseSecret]:
130+
def resolve_references(self, secrets: List[PhaseSecret], env_name: str, app_name: str) -> List[PhaseSecret]:
53131
all_secrets = [
54132
{
55133
'environment': env_name,

0 commit comments

Comments
 (0)