|
| 1 | +## Local setup |
| 2 | + |
| 3 | +Clone the reposistory to your machine and install the required dependencies. |
| 4 | + |
| 5 | +### Create a virtual environment |
| 6 | + |
| 7 | +```fish |
| 8 | +python3 -m venv.venv |
| 9 | +``` |
| 10 | + |
| 11 | +### Install dependencies |
| 12 | + |
| 13 | +```fish |
| 14 | +pip install -r requirements.txt |
| 15 | +``` |
| 16 | + |
| 17 | +### Demo script |
| 18 | + |
| 19 | +This demo python script will create, read, update and delete secrets via the SDK. Just update the host, app, env and token constants at the top. |
| 20 | + |
| 21 | +```python |
| 22 | +from src.phase import Phase, CreateSecretsOptions, GetAllSecretsOptions, UpdateSecretOptions, DeleteSecretOptions |
| 23 | + |
| 24 | +CONSOLE_HOST = 'https://console.phase.dev' |
| 25 | +APP_NAME = '<app-name>' |
| 26 | +ENV_NAME = "<env-name>" |
| 27 | +TOKEN = '<service-token>' |
| 28 | + |
| 29 | +# Initialize the Phase object with host and service token |
| 30 | +phase = Phase(init=False, |
| 31 | + pss=TOKEN, |
| 32 | + host=CONSOLE_HOST) |
| 33 | + |
| 34 | +# Create secrets with references |
| 35 | +create_options = CreateSecretsOptions( |
| 36 | + env_name=ENV_NAME, |
| 37 | + app_name=APP_NAME, |
| 38 | + key_value_pairs=[ |
| 39 | + {"BASE_URL": "https://api.example.com"}, |
| 40 | + {"API_ENDPOINT": "${BASE_URL}/v1/data"}, |
| 41 | + {"NESTED_REF": "Nested ${API_ENDPOINT}"} |
| 42 | + ] |
| 43 | +) |
| 44 | +create_result = phase.create_secrets(create_options) |
| 45 | +print(f"Create secrets result: {create_result}") |
| 46 | + |
| 47 | +# Read and resolve references |
| 48 | +get_options = GetAllSecretsOptions( |
| 49 | + env_name=ENV_NAME, |
| 50 | + app_name=APP_NAME |
| 51 | +) |
| 52 | +secrets = phase.get_all_secrets(get_options) |
| 53 | + |
| 54 | +resolved_secrets = phase.resolve_references(secrets, ENV_NAME, APP_NAME) |
| 55 | + |
| 56 | +print("\nResolved Secrets:") |
| 57 | +print("----------------") |
| 58 | +for secret in resolved_secrets: |
| 59 | + print(f"{secret.key}: {secret.value}") |
| 60 | + |
| 61 | +# Update secrets |
| 62 | +update_options = UpdateSecretOptions( |
| 63 | + env_name=ENV_NAME, |
| 64 | + app_name=APP_NAME, |
| 65 | + key="BASE_URL", |
| 66 | + value="https://api.acme.com", |
| 67 | + secret_path="/", |
| 68 | + destination_path="/", # Optional: move secret to a new path |
| 69 | + override=False, # Optional: create a personal override |
| 70 | + toggle_override=False # Optional: toggle personal override |
| 71 | +) |
| 72 | +update_result = phase.update_secret(update_options) |
| 73 | + |
| 74 | +print(f"\nUpdate secrets result: {update_result}") |
| 75 | +print("----------------") |
| 76 | + |
| 77 | + |
| 78 | +## Refetch secrets |
| 79 | +secrets = phase.get_all_secrets(get_options) |
| 80 | + |
| 81 | +resolved_secrets = phase.resolve_references(secrets, ENV_NAME, APP_NAME) |
| 82 | + |
| 83 | +print("\nResolved Secrets:") |
| 84 | +print("----------------") |
| 85 | +for secret in resolved_secrets: |
| 86 | + print(f"{secret.key}: {secret.value}") |
| 87 | + |
| 88 | + |
| 89 | +# Delete secrets |
| 90 | +delete_options = DeleteSecretOptions( |
| 91 | + env_name=ENV_NAME, |
| 92 | + app_name=APP_NAME, |
| 93 | + key_to_delete="BASE_URL", |
| 94 | + secret_path="/" |
| 95 | +) |
| 96 | +result = phase.delete_secret(delete_options) |
| 97 | +print(f"Delete result: {result}") |
| 98 | + |
| 99 | +## Refetch secrets |
| 100 | +secrets = phase.get_all_secrets(get_options) |
| 101 | + |
| 102 | +resolved_secrets = phase.resolve_references(secrets, ENV_NAME, APP_NAME) |
| 103 | + |
| 104 | +print("\nResolved Secrets:") |
| 105 | +print("----------------") |
| 106 | +for secret in resolved_secrets: |
| 107 | + print(f"{secret.key}: {secret.value}") |
| 108 | +``` |
| 109 | + |
| 110 | +## Running Tests |
| 111 | + |
| 112 | +Run the test suite with: |
| 113 | + |
| 114 | +```fish |
| 115 | +python -m pytest -v tests/ |
| 116 | +``` |
0 commit comments