From 43a853e9f306e686fdfd510309f7955b46919372 Mon Sep 17 00:00:00 2001 From: wadii Date: Wed, 21 Oct 2026 12:38:11 +0100 Subject: [PATCH] ci: Run the Flagsmith SDK behavioural spec --- .github/workflows/sdk-spec.yml | 17 +++++++++++++++++ renovate.json | 23 +++++++++++++++++++++++ sdk-spec/Dockerfile | 15 +++++++++++++++ sdk-spec/steps.dart | 34 ++++++++++++++++++++++++++++++++++ 4 files changed, 89 insertions(+) create mode 100644 .github/workflows/sdk-spec.yml create mode 100644 renovate.json create mode 100644 sdk-spec/Dockerfile create mode 100644 sdk-spec/steps.dart diff --git a/.github/workflows/sdk-spec.yml b/.github/workflows/sdk-spec.yml new file mode 100644 index 0000000..cd80000 --- /dev/null +++ b/.github/workflows/sdk-spec.yml @@ -0,0 +1,17 @@ +name: SDK spec + +on: + pull_request: + push: + branches: [main] + +permissions: + contents: read + +jobs: + sdk-spec: + # Keep the ref in `uses:` and `spec-ref` in sync. + uses: Flagsmith/sdk-spec/.github/workflows/run-spec.yml@v0.5.0 + with: + spec-ref: v0.5.0 + language: dart diff --git a/renovate.json b/renovate.json new file mode 100644 index 0000000..4e0498d --- /dev/null +++ b/renovate.json @@ -0,0 +1,23 @@ +{ + "$schema": "https://docs.renovatebot.com/renovate-schema.json", + "extends": ["config:recommended"], + "enabledManagers": ["custom.regex"], + "customManagers": [ + { + "customType": "regex", + "managerFilePatterns": ["/^\\.github/workflows/sdk-spec\\.yml$/"], + "matchStrings": [ + "uses: Flagsmith/sdk-spec/\\.github/workflows/run-spec\\.yml@(?v[\\d.]+)", + "spec-ref: (?v[\\d.]+)" + ], + "depNameTemplate": "Flagsmith/sdk-spec", + "datasourceTemplate": "github-tags" + } + ], + "packageRules": [ + { + "matchPackageNames": ["Flagsmith/sdk-spec"], + "groupName": "SDK spec" + } + ] +} diff --git a/sdk-spec/Dockerfile b/sdk-spec/Dockerfile new file mode 100644 index 0000000..44ab867 --- /dev/null +++ b/sdk-spec/Dockerfile @@ -0,0 +1,15 @@ +# Runs this SDK, built from source, under the Flagsmith SDK behavioural spec. +# docker build -f sdk-spec/Dockerfile --build-context harness=/harness/dart . +FROM ghcr.io/cirruslabs/flutter:3.44.0 + +WORKDIR /sdk +COPY . . +COPY --from=harness . /harness +RUN flutter pub get \ + && dart /harness/build.dart -o sdk-spec/harness_main.dart sdk-spec/steps.dart \ + && flutter build bundle --debug --target sdk-spec/harness_main.dart \ + && ln -s "$(find "$(dirname "$(readlink -f "$(command -v flutter)")")/cache/artifacts/engine" \ + -path '*/linux-*/flutter_tester' -print -quit)" /usr/local/bin/flutter_tester + +# The SDK needs Flutter, so run on the headless engine that `flutter test` uses. +ENTRYPOINT ["flutter_tester", "--non-interactive", "--disable-vm-service", "build/flutter_assets/kernel_blob.bin"] diff --git a/sdk-spec/steps.dart b/sdk-spec/steps.dart new file mode 100644 index 0000000..5605845 --- /dev/null +++ b/sdk-spec/steps.dart @@ -0,0 +1,34 @@ +// Steps for the Flagsmith SDK behavioural spec: https://github.com/Flagsmith/sdk-spec +import 'package:flagsmith/flagsmith.dart'; + +// Create the SDK client +Future createClient(String environmentKey, String apiUrl) => + FlagsmithClient.init( + apiKey: environmentKey, + config: FlagsmithConfig(baseURI: apiUrl), + ); + +// When the application gets the environment flags +Future>> getEnvironmentFlags( + FlagsmithClient flagsmith) async => + asSpecFlags(await flagsmith.getFeatureFlags()); + +// When the application gets the flags for identity "{identifier}" with traits: +Future>> getIdentityFlags(FlagsmithClient flagsmith, + String identifier, Map traits) async => + asSpecFlags(await flagsmith.getFeatureFlags( + user: Identity(identifier: identifier), + traits: [ + for (final MapEntry(:key, :value) in traits.entries) + Trait(key: key, value: value), + ], + )); + +List> asSpecFlags(List flags) => [ + for (final flag in flags) + { + 'feature': flag.feature.name, + 'enabled': flag.enabled, + 'value': flag.value, + }, + ];