{ "cells": [ { "cell_type": "markdown", "id": "6e343341-abec-4eb3-ac26-7d18ecb1c5aa", "metadata": {}, "source": [ "# Multi-Environment Management Quick Start\n", "\n", "## 1. Installation and Setup\n", "\n", "The which_env library provides intelligent environment detection for multi-environment deployment strategies. Let's start by importing the necessary components." ] }, { "cell_type": "code", "execution_count": 1, "id": "61efe8dc-f9dc-43d0-a34f-139d6af414d8", "metadata": {}, "outputs": [], "source": [ "import os\n", "from which_runtime.api import runtime\n", "from which_env.api import (\n", " BaseEnvNameEnum,\n", " CommonEnvNameEnum,\n", " detect_current_env,\n", " validate_env_name,\n", " EnvNameValidationError,\n", " USER_ENV_NAME,\n", " ENV_NAME\n", ")" ] }, { "cell_type": "markdown", "id": "93bc0bcd-2f69-4431-8cb8-508f07e8e2a6", "metadata": {}, "source": [ "## 2. Understanding Environment Validation\n", "\n", "Environment names must follow specific naming conventions for consistency and safety. Let's explore the validation rules." ] }, { "cell_type": "code", "execution_count": 3, "id": "7c91cbfd-bbaf-4855-a04f-8cec8f7a28be", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Testing valid environment names:\n", "✅ 'dev' - Valid\n", "✅ 'prod' - Valid\n", "✅ 'staging' - Valid\n", "✅ 'test1' - Valid\n", "✅ 'sbx123' - Valid\n", "❌ 'Dev' - 'Dev' is an invalid env name, first letter of env_name has to be a-z!\n", "❌ 'prod-1' - 'prod-1' is an invalid env name, env_name can only has a-z, 0-9\n", "❌ '1test' - '1test' is an invalid env name, first letter of env_name has to be a-z!\n", "❌ 'test_env' - 'test_env' is an invalid env name, env_name can only has a-z, 0-9\n", "❌ 'dev.staging' - 'dev.staging' is an invalid env name, env_name can only has a-z, 0-9\n" ] } ], "source": [ "valid_names = [\n", " # valid names\n", " \"dev\", \"prod\", \"staging\", \"test1\", \"sbx123\",\n", " # invalid names\n", " \"Dev\", \"prod-1\", \"1test\", \"test_env\", \"dev.staging\",\n", "]\n", "\n", "print(\"Testing valid environment names:\")\n", "for name in valid_names:\n", " try:\n", " validate_env_name(name)\n", " print(f\"✅ '{name}' - Valid\")\n", " except EnvNameValidationError as e:\n", " print(f\"❌ '{name}' - {e}\")" ] }, { "cell_type": "markdown", "id": "6713d318-7d29-4423-99f7-09ba0d54cb69", "metadata": {}, "source": [ "## 3. Working with Common Environment Names\n", "\n", "The library provides predefined common environment names with emoji representations for better visualization." ] }, { "cell_type": "code", "execution_count": 7, "id": "ef6a35a8-4fc9-4c55-9979-b047c2d4f780", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Common Environment Names:\n", "========================================\n", "devops\n", "sbx\n", "dev\n", "tst\n", "stg\n", "qa\n", "preprd\n", "prd\n" ] } ], "source": [ "# Explore all common environment names\n", "print(\"Common Environment Names:\")\n", "print(\"=\" * 40)\n", "\n", "for env in CommonEnvNameEnum:\n", " print(f\"{env.value}\")" ] }, { "cell_type": "markdown", "id": "03696c07-5937-4b1b-b462-2a7b9d1291b9", "metadata": {}, "source": [ "## 4. Creating Custom Environment Enumerations\n", "\n", "Create your own environment enumeration by inheriting from BaseEnvNameEnum. Every custom enumeration must include at least 'devops', 'dev', and 'prd' environments." ] }, { "cell_type": "code", "execution_count": 11, "id": "c7c429bb-4e3c-44fe-bae3-21f70ebe13f7", "metadata": {}, "outputs": [], "source": [ "class MyProjectEnv(BaseEnvNameEnum):\n", " \"\"\"Custom environment enumeration for MyProject.\"\"\"\n", " devops = \"devops\" # Required: CI/CD environment\n", " sbx = \"sbx\" # Optional: Sandbox environment that can be destroy or recreat\n", " dev = \"dev\" # Required: Development environment\n", " tst = \"tst\" # Optional: Testing environment\n", " stg = \"stg\" # Optional: Staging environment\n", " prd = \"prd\" # Required: Production environment" ] }, { "cell_type": "code", "execution_count": 12, "id": "5abcff49-a7cf-4a23-9232-e5524e9a7307", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "✅ MyProjectEnv validation passed!\n" ] } ], "source": [ "MyProjectEnv.validate()\n", "print(\"✅ MyProjectEnv validation passed!\")" ] }, { "cell_type": "code", "execution_count": 13, "id": "32776e03-82dc-4946-af91-b224ee44b1fc", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\n", "MyProject Environments:\n", "🛠 devops (DEVOPS)\n", "🧰 sbx (SBX)\n", "💻 dev (DEV)\n", "🧪 tst (TST)\n", "🎸 stg (STG)\n", "🏭 prd (PRD)\n" ] } ], "source": [ "print(\"\\nMyProject Environments:\")\n", "for env in MyProjectEnv:\n", " print(f\"{env.emoji} {env.value} ({env.name.upper()})\")" ] }, { "cell_type": "markdown", "id": "3f4c62f2-3332-4499-8dff-965ffd095d32", "metadata": {}, "source": [ "## 5. Environment Detection in Different Runtime Contexts\n", "\n", "The detect_current_env function intelligently detects the current environment based on runtime context and environment variables." ] }, { "cell_type": "code", "execution_count": 14, "id": "365664cb-0909-4d54-96fc-4c83ff2c0e6a", "metadata": {}, "outputs": [], "source": [ "# Clean up any existing environment variables for demo\n", "if USER_ENV_NAME in os.environ:\n", " del os.environ[USER_ENV_NAME]\n", "if ENV_NAME in os.environ:\n", " del os.environ[ENV_NAME]" ] }, { "cell_type": "code", "execution_count": 15, "id": "3aee6cc4-16b2-4daf-8f84-2280cdd22581", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Scenario 1: Default environment detection\n", "Detected environment: dev\n", "Environment emoji: 💻\n", "\n", "==================================================\n" ] } ], "source": [ "# Scenario 1: Default behavior (typically returns 'dev' for local development)\n", "print(\"Scenario 1: Default environment detection\")\n", "current_env = detect_current_env(runtime, MyProjectEnv)\n", "print(f\"Detected environment: {current_env}\")\n", "print(f\"Environment emoji: {getattr(MyProjectEnv, current_env).emoji}\")\n", "\n", "print(\"\\n\" + \"=\"*50)" ] }, { "cell_type": "code", "execution_count": 16, "id": "697f1da2-bc43-4a77-a019-f42f7061752e", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Scenario 2: User environment override\n", "USER_ENV_NAME set to: tst\n", "Detected environment: tst\n", "Environment emoji: 🧪\n" ] } ], "source": [ "# Scenario 2: Using USER_ENV_NAME override\n", "print(\"Scenario 2: User environment override\")\n", "os.environ[USER_ENV_NAME] = \"tst\"\n", "current_env = detect_current_env(runtime, MyProjectEnv)\n", "print(f\"USER_ENV_NAME set to: {os.environ[USER_ENV_NAME]}\")\n", "print(f\"Detected environment: {current_env}\")\n", "print(f\"Environment emoji: {getattr(MyProjectEnv, current_env).emoji}\")\n", "\n", "# Clean up\n", "del os.environ[USER_ENV_NAME]" ] }, { "cell_type": "code", "execution_count": null, "id": "d7e5b261-a4f4-41e0-8bd8-e88303482f7d", "metadata": {}, "outputs": [], "source": [] } ], "metadata": { "kernelspec": { "display_name": "Python 3 (ipykernel)", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.11.8" } }, "nbformat": 4, "nbformat_minor": 5 }