DiamondLightSource / blueapi

Apache License 2.0
2 stars 5 forks source link

Support a trunk based development like Hyperion does with feature flags #534

Open stan-dot opened 3 days ago

stan-dot commented 3 days ago

Would allow us a gradual rollout of features using env flags with a fine-grained control between beamlines, with all of them being potentially on the latest version of the main flow.

@DominicOram , @dperl-dls please send some pointers

stan-dot commented 3 days ago

example implementation

from dotenv import load_dotenv
import os

load_dotenv()  # Load environment variables from .env file

class Settings(BaseSettings):
    secret_route_enabled: bool = os.getenv('SECRET_ROUTE_ENABLED', 'False').lower() in ('true', '1', 't')

settings = Settings()

settings = Settings()
def feature_flag_enabled(feature_name: str):
    def decorator(func):
        @wraps(func)
        async def wrapper(*args, **kwargs):
            if feature_name == 'secret_route' and not settings.secret_route_enabled:
                raise HTTPException(status_code=404, detail="Not Found")
            return await func(*args, **kwargs)
        return wrapper
    return decorator

@app.get("/secret", response_class=HTMLResponse)
@feature_flag_enabled('for-i22-November')
async def secret_route(request: Request):