Skip to content

Commit

Permalink
Merge pull request #533 from writer/feat-feature-flags
Browse files Browse the repository at this point in the history
feat: Feature flags
  • Loading branch information
ramedina86 committed Aug 26, 2024
2 parents 91eeda2 + 35bd4a9 commit 70e6d04
Show file tree
Hide file tree
Showing 8 changed files with 46 additions and 8 deletions.
19 changes: 15 additions & 4 deletions src/ui/src/builder/BuilderHeader.vue
Original file line number Diff line number Diff line change
Expand Up @@ -82,16 +82,27 @@ const animate = () => {
};
const syncHealthStatus = () => {
let s = "";
switch (wf.syncHealth.value) {
case "offline":
return "Offline. Not syncing.";
s += "Offline. Not syncing.";
break;
case "connected":
return "Online. Syncing...";
s += "Online. Syncing...";
break;
case "idle":
return "Sync not initialised.";
s += "Sync not initialised.";
break;
case "suspended":
return "Sync suspended.";
s += "Sync suspended.";
break;
}
if (wf.featureFlags.value.length > 0) {
s += ` Feature flags: ${wf.featureFlags.value.join(", ")}`;
}
return s;
};
function showStateExplorer() {
Expand Down
5 changes: 4 additions & 1 deletion src/ui/src/core/index.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
/* eslint-disable @typescript-eslint/ban-types */
/* eslint-disable @typescript-eslint/no-explicit-any */
import { ref, Ref } from "vue";
import { readonly, ref, Ref, shallowRef } from "vue";
import {
Component,
ComponentMap,
Expand All @@ -24,6 +24,7 @@ export function generateCore() {
let sessionId: string = null;
const sessionTimestamp: Ref<number> = ref(null);
const mode: Ref<"run" | "edit"> = ref(null);
const featureFlags = shallowRef<string[]>([]);
const runCode: Ref<string> = ref(null);
const components: Ref<ComponentMap> = ref({});
const userFunctions: Ref<UserFunction[]> = ref([]);
Expand Down Expand Up @@ -98,6 +99,7 @@ export function generateCore() {
collateMail(initData.mail);
sessionId = initData.sessionId;
sessionTimestamp.value = new Date().getTime();
featureFlags.value = initData.featureFlags;

// Only returned for edit (Builder) mode

Expand Down Expand Up @@ -594,6 +596,7 @@ export function generateCore() {
getSessionTimestamp,
getUserState,
isChildOf,
featureFlags: readonly(featureFlags),
};

return core;
Expand Down
3 changes: 2 additions & 1 deletion src/writer/app_runner.py
Original file line number Diff line number Diff line change
Expand Up @@ -150,7 +150,8 @@ def _handle_session_init(self, payload: InitSessionRequestPayload) -> InitSessio
sessionId=session.session_id,
mail=session.session_state.mail,
components=session.session_component_tree.to_dict(),
userFunctions=self._get_user_functions()
userFunctions=self._get_user_functions(),
featureFlags=writer.Config.feature_flags
)

session.session_state.clear_mail()
Expand Down
1 change: 1 addition & 0 deletions src/writer/core.py
Original file line number Diff line number Diff line change
Expand Up @@ -131,6 +131,7 @@ class Config:
is_mail_enabled_for_log: bool = False
mode: str = "run"
logger: Optional[logging.Logger] = None
feature_flags: list[str] = []

@dataclasses.dataclass
class MutationSubscription:
Expand Down
6 changes: 4 additions & 2 deletions src/writer/serve.py
Original file line number Diff line number Diff line change
Expand Up @@ -149,7 +149,8 @@ def _get_run_starter_pack(payload: InitSessionResponsePayload):
mail=payload.mail,
components=payload.components,
userFunctions=payload.userFunctions,
extensionPaths=cached_extension_paths
extensionPaths=cached_extension_paths,
featureFlags=payload.featureFlags
)

def _get_edit_starter_pack(payload: InitSessionResponsePayload):
Expand All @@ -163,7 +164,8 @@ def _get_edit_starter_pack(payload: InitSessionResponsePayload):
components=payload.components,
userFunctions=payload.userFunctions,
runCode=run_code,
extensionPaths=cached_extension_paths
extensionPaths=cached_extension_paths,
featureFlags=payload.featureFlags
)

@app.get("/api/health")
Expand Down
2 changes: 2 additions & 0 deletions src/writer/ss_types.py
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,7 @@ class InitResponseBody(BaseModel):
components: Dict
userFunctions: List[Dict]
extensionPaths: List
featureFlags: List[str]


class InitResponseBodyRun(InitResponseBody):
Expand Down Expand Up @@ -129,6 +130,7 @@ class InitSessionResponsePayload(BaseModel):
mail: List
userFunctions: List[Dict]
components: Dict
featureFlags: List[str]


class InitSessionResponse(AppProcessServerResponse):
Expand Down
16 changes: 16 additions & 0 deletions tests/backend/test_serve.py
Original file line number Diff line number Diff line change
Expand Up @@ -169,3 +169,19 @@ def test_server_setup_hook_is_ignored_when_its_disabled(self):
with fastapi.testclient.TestClient(asgi_app) as client:
res = client.get("/probes/healthcheck")
assert res.status_code == 404

def test_feature_flags(self):
"""
This test verifies that feature flags are carried to the frontend.
"""
asgi_app: fastapi.FastAPI = writer.serve.get_asgi_app(
test_app_dir, "run")
with fastapi.testclient.TestClient(asgi_app) as client:
res = client.post("/api/init", json={
"proposedSessionId": None
}, headers={
"Content-Type": "application/json"
})
feature_flags = res.json().get("featureFlags")
assert feature_flags == ["flag_one", "flag_two"]
2 changes: 2 additions & 0 deletions tests/backend/testapp/main.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,8 @@
import writer as wf
import writer.core

writer.Config.feature_flags.append("flag_one")
writer.Config.feature_flags.append("flag_two")

@wf.middleware()
def my_middleware(state):
Expand Down

0 comments on commit 70e6d04

Please sign in to comment.