From ab394ab6baaa80e0c9afb1a645cf48d88d373d86 Mon Sep 17 00:00:00 2001 From: Nicklas Lundin Date: Wed, 1 Oct 2025 09:28:27 +0200 Subject: [PATCH] feat: restructure Unity packages and add CI validation MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Split unity-sdk into two modular packages: - unity-openfeature-sdk: Pure OpenFeature implementation for Unity - unity-confidence-provider: Confidence platform integration Added unity-validation.yml workflow for CI testing and CLAUDE.md documentation. ๐Ÿค– Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude --- .github/workflows/unity-validation.yml | 198 +++++++++++++++++ CLAUDE.md | 207 ++++++++++++++++++ .../Sample3DGame/Packages/manifest.json | 3 +- unity-confidence-provider/README.md | 136 ++++++++++++ .../Runtime}/ConfidenceApiClient.cs | 0 .../Runtime}/ConfidenceApiClient.cs.meta | 0 .../Runtime/ConfidenceProvider.asmdef | 16 ++ .../Runtime}/ConfidenceProvider.cs | 0 .../Runtime}/ConfidenceProvider.cs.meta | 0 .../Runtime}/ObjectDictWrapper.cs | 0 .../Runtime}/ObjectDictWrapper.cs.meta | 0 unity-confidence-provider/build-test.sh | 109 +++++++++ unity-confidence-provider/package.json | 26 +++ unity-openfeature-sdk/README.md | 97 ++++++++ .../Runtime/Client/FeatureClient.cs | 0 .../Runtime/Client/FeatureClient.cs.meta | 0 .../Runtime/Client/IFeatureClient.cs | 0 .../Runtime/Client/IFeatureClient.cs.meta | 0 .../Runtime/Core/ErrorCode.cs | 0 .../Runtime/Core/ErrorCode.cs.meta | 0 .../Runtime/Core/EvaluationContext.cs | 0 .../Runtime/Core/EvaluationContext.cs.meta | 0 .../Runtime/Core/IFeatureProvider.cs | 0 .../Runtime/Core/IFeatureProvider.cs.meta | 0 .../Runtime/Core/IOpenFeatureAPI.cs | 0 .../Runtime/Core/IOpenFeatureAPI.cs.meta | 0 .../Runtime/Core/OpenFeatureAPI.cs | 0 .../Runtime/Core/OpenFeatureAPI.cs.meta | 0 .../Runtime/Core/Reason.cs | 0 .../Runtime/Core/Reason.cs.meta | 0 .../Runtime/Core/ResolutionDetails.cs | 0 .../Runtime/Core/ResolutionDetails.cs.meta | 0 .../Runtime/Providers/InMemoryProvider.cs | 0 .../Providers/InMemoryProvider.cs.meta | 0 .../Runtime/Unity/UnityOpenFeature.cs | 0 .../Runtime/Unity/UnityOpenFeature.cs.meta | 0 .../Runtime/UnityOpenFeature.asmdef | 2 +- .../build-test.sh | 0 .../package.json | 8 +- unity-sdk/README.md | 95 -------- unity-sdk/README.md.meta | 7 - unity-sdk/Runtime.meta | 8 - unity-sdk/Runtime/Client.meta | 2 - unity-sdk/Runtime/Core.meta | 2 - unity-sdk/Runtime/Providers.meta | 2 - unity-sdk/Runtime/Unity.meta | 2 - .../Runtime/UnityOpenFeature.asmdef.meta | 2 - unity-sdk/build-test.sh.meta | 7 - unity-sdk/package.json.meta | 7 - 49 files changed, 796 insertions(+), 140 deletions(-) create mode 100644 .github/workflows/unity-validation.yml create mode 100644 CLAUDE.md create mode 100644 unity-confidence-provider/README.md rename {unity-sdk/Runtime/Providers => unity-confidence-provider/Runtime}/ConfidenceApiClient.cs (100%) rename {unity-sdk/Runtime/Providers => unity-confidence-provider/Runtime}/ConfidenceApiClient.cs.meta (100%) create mode 100644 unity-confidence-provider/Runtime/ConfidenceProvider.asmdef rename {unity-sdk/Runtime/Providers => unity-confidence-provider/Runtime}/ConfidenceProvider.cs (100%) rename {unity-sdk/Runtime/Providers => unity-confidence-provider/Runtime}/ConfidenceProvider.cs.meta (100%) rename {unity-sdk/Runtime/Providers => unity-confidence-provider/Runtime}/ObjectDictWrapper.cs (100%) rename {unity-sdk/Runtime/Providers => unity-confidence-provider/Runtime}/ObjectDictWrapper.cs.meta (100%) create mode 100755 unity-confidence-provider/build-test.sh create mode 100644 unity-confidence-provider/package.json create mode 100644 unity-openfeature-sdk/README.md rename {unity-sdk => unity-openfeature-sdk}/Runtime/Client/FeatureClient.cs (100%) rename {unity-sdk => unity-openfeature-sdk}/Runtime/Client/FeatureClient.cs.meta (100%) rename {unity-sdk => unity-openfeature-sdk}/Runtime/Client/IFeatureClient.cs (100%) rename {unity-sdk => unity-openfeature-sdk}/Runtime/Client/IFeatureClient.cs.meta (100%) rename {unity-sdk => unity-openfeature-sdk}/Runtime/Core/ErrorCode.cs (100%) rename {unity-sdk => unity-openfeature-sdk}/Runtime/Core/ErrorCode.cs.meta (100%) rename {unity-sdk => unity-openfeature-sdk}/Runtime/Core/EvaluationContext.cs (100%) rename {unity-sdk => unity-openfeature-sdk}/Runtime/Core/EvaluationContext.cs.meta (100%) rename {unity-sdk => unity-openfeature-sdk}/Runtime/Core/IFeatureProvider.cs (100%) rename {unity-sdk => unity-openfeature-sdk}/Runtime/Core/IFeatureProvider.cs.meta (100%) rename {unity-sdk => unity-openfeature-sdk}/Runtime/Core/IOpenFeatureAPI.cs (100%) rename {unity-sdk => unity-openfeature-sdk}/Runtime/Core/IOpenFeatureAPI.cs.meta (100%) rename {unity-sdk => unity-openfeature-sdk}/Runtime/Core/OpenFeatureAPI.cs (100%) rename {unity-sdk => unity-openfeature-sdk}/Runtime/Core/OpenFeatureAPI.cs.meta (100%) rename {unity-sdk => unity-openfeature-sdk}/Runtime/Core/Reason.cs (100%) rename {unity-sdk => unity-openfeature-sdk}/Runtime/Core/Reason.cs.meta (100%) rename {unity-sdk => unity-openfeature-sdk}/Runtime/Core/ResolutionDetails.cs (100%) rename {unity-sdk => unity-openfeature-sdk}/Runtime/Core/ResolutionDetails.cs.meta (100%) rename {unity-sdk => unity-openfeature-sdk}/Runtime/Providers/InMemoryProvider.cs (100%) rename {unity-sdk => unity-openfeature-sdk}/Runtime/Providers/InMemoryProvider.cs.meta (100%) rename {unity-sdk => unity-openfeature-sdk}/Runtime/Unity/UnityOpenFeature.cs (100%) rename {unity-sdk => unity-openfeature-sdk}/Runtime/Unity/UnityOpenFeature.cs.meta (100%) rename {unity-sdk => unity-openfeature-sdk}/Runtime/UnityOpenFeature.asmdef (99%) rename {unity-sdk => unity-openfeature-sdk}/build-test.sh (100%) rename {unity-sdk => unity-openfeature-sdk}/package.json (82%) delete mode 100644 unity-sdk/README.md delete mode 100644 unity-sdk/README.md.meta delete mode 100644 unity-sdk/Runtime.meta delete mode 100644 unity-sdk/Runtime/Client.meta delete mode 100644 unity-sdk/Runtime/Core.meta delete mode 100644 unity-sdk/Runtime/Providers.meta delete mode 100644 unity-sdk/Runtime/Unity.meta delete mode 100644 unity-sdk/Runtime/UnityOpenFeature.asmdef.meta delete mode 100644 unity-sdk/build-test.sh.meta delete mode 100644 unity-sdk/package.json.meta diff --git a/.github/workflows/unity-validation.yml b/.github/workflows/unity-validation.yml new file mode 100644 index 0000000..fbc41c6 --- /dev/null +++ b/.github/workflows/unity-validation.yml @@ -0,0 +1,198 @@ +name: Unity Package Validation + +on: + pull_request: + branches: [ main ] + paths: + - 'unity-openfeature-sdk/**' + - 'unity-confidence-provider/**' + - 'examples/UnitySampleGame/**' + push: + branches: [ main ] + paths: + - 'unity-openfeature-sdk/**' + - 'unity-confidence-provider/**' + - 'examples/UnitySampleGame/**' + +jobs: + unity-build-test: + name: Test Unity Package Compilation + runs-on: ubuntu-latest + + steps: + - name: Checkout repository + uses: actions/checkout@v4 + + - name: Setup Unity + uses: game-ci/unity-builder@v4 + env: + UNITY_LICENSE: ${{ secrets.UNITY_LICENSE }} + UNITY_EMAIL: ${{ secrets.UNITY_EMAIL }} + UNITY_PASSWORD: ${{ secrets.UNITY_PASSWORD }} + with: + unityVersion: 2022.3.62f1 + targetPlatform: StandaloneLinux64 + projectPath: /dev/null # We'll create test projects + buildMethod: '' # No build method needed for compilation test + + - name: Test Unity OpenFeature SDK Compilation + working-directory: unity-openfeature-sdk + run: | + echo "๐Ÿ”จ Testing Unity OpenFeature SDK compilation..." + chmod +x build-test.sh + ./build-test.sh + + - name: Test Unity Confidence Provider Compilation + working-directory: unity-confidence-provider + run: | + echo "๐Ÿ”จ Testing Unity Confidence Provider compilation..." + chmod +x build-test.sh + ./build-test.sh + + - name: Validate Sample Game Project Structure + working-directory: examples/UnitySampleGame/Sample3DGame + run: | + echo "๐Ÿ“ฆ Validating Unity sample game package references..." + + # Check if manifest.json references both packages correctly + if ! grep -q "com.unity.openfeature.*unity-openfeature-sdk" Packages/manifest.json; then + echo "โŒ Unity OpenFeature SDK reference not found in manifest.json" + exit 1 + fi + + if ! grep -q "com.spotify.confidence.unity.*unity-confidence-provider" Packages/manifest.json; then + echo "โŒ Unity Confidence Provider reference not found in manifest.json" + exit 1 + fi + + echo "โœ… Sample game package references are correct" + + package-structure-validation: + name: Validate Package Structure + runs-on: ubuntu-latest + + steps: + - name: Checkout repository + uses: actions/checkout@v4 + + - name: Validate Unity OpenFeature SDK Structure + run: | + echo "๐Ÿ“ Validating Unity OpenFeature SDK structure..." + + # Check required files exist + required_files=( + "unity-openfeature-sdk/package.json" + "unity-openfeature-sdk/README.md" + "unity-openfeature-sdk/Runtime/UnityOpenFeature.asmdef" + "unity-openfeature-sdk/build-test.sh" + ) + + for file in "${required_files[@]}"; do + if [ ! -f "$file" ]; then + echo "โŒ Required file missing: $file" + exit 1 + fi + done + + # Validate package.json + if ! grep -q '"name": "com.unity.openfeature"' unity-openfeature-sdk/package.json; then + echo "โŒ Invalid package name in unity-openfeature-sdk/package.json" + exit 1 + fi + + echo "โœ… Unity OpenFeature SDK structure is valid" + + - name: Validate Unity Confidence Provider Structure + run: | + echo "๐Ÿ“ Validating Unity Confidence Provider structure..." + + # Check required files exist + required_files=( + "unity-confidence-provider/package.json" + "unity-confidence-provider/README.md" + "unity-confidence-provider/Runtime/ConfidenceProvider.asmdef" + "unity-confidence-provider/Runtime/ConfidenceProvider.cs" + "unity-confidence-provider/Runtime/ConfidenceApiClient.cs" + "unity-confidence-provider/build-test.sh" + ) + + for file in "${required_files[@]}"; do + if [ ! -f "$file" ]; then + echo "โŒ Required file missing: $file" + exit 1 + fi + done + + # Validate package.json + if ! grep -q '"name": "com.spotify.confidence.unity"' unity-confidence-provider/package.json; then + echo "โŒ Invalid package name in unity-confidence-provider/package.json" + exit 1 + fi + + # Validate assembly definition references + if ! grep -q '"UnityOpenFeature"' unity-confidence-provider/Runtime/ConfidenceProvider.asmdef; then + echo "โŒ Missing UnityOpenFeature reference in ConfidenceProvider.asmdef" + exit 1 + fi + + echo "โœ… Unity Confidence Provider structure is valid" + + - name: Validate No Old Unity SDK References + run: | + echo "๐Ÿ” Checking for old unity-sdk references..." + + # Check that old unity-sdk directory doesn't exist + if [ -d "unity-sdk" ]; then + echo "โŒ Old unity-sdk directory still exists" + exit 1 + fi + + # Check that no files reference the old path (excluding this workflow) + if grep -r "unity-sdk" --exclude="*.yml" --exclude="*.yaml" .; then + echo "โŒ Found references to old unity-sdk path" + exit 1 + fi + + echo "โœ… No old unity-sdk references found" + + documentation-check: + name: Validate Documentation + runs-on: ubuntu-latest + + steps: + - name: Checkout repository + uses: actions/checkout@v4 + + - name: Check README Completeness + run: | + echo "๐Ÿ“š Validating documentation completeness..." + + # Check Unity OpenFeature SDK README + if ! grep -q "Installation" unity-openfeature-sdk/README.md; then + echo "โŒ Unity OpenFeature SDK README missing installation instructions" + exit 1 + fi + + if ! grep -q "com.unity.openfeature" unity-openfeature-sdk/README.md; then + echo "โŒ Unity OpenFeature SDK README missing package name" + exit 1 + fi + + # Check Unity Confidence Provider README + if ! grep -q "Prerequisites" unity-confidence-provider/README.md; then + echo "โŒ Unity Confidence Provider README missing prerequisites" + exit 1 + fi + + if ! grep -q "com.spotify.confidence.unity" unity-confidence-provider/README.md; then + echo "โŒ Unity Confidence Provider README missing package name" + exit 1 + fi + + # Check CLAUDE.md was updated + if ! grep -q "unity-openfeature-sdk" CLAUDE.md; then + echo "โŒ CLAUDE.md not updated with new package structure" + exit 1 + fi + + echo "โœ… Documentation is complete and accurate" \ No newline at end of file diff --git a/CLAUDE.md b/CLAUDE.md new file mode 100644 index 0000000..18ed76c --- /dev/null +++ b/CLAUDE.md @@ -0,0 +1,207 @@ +# CLAUDE.md + +This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository. + +## Project Overview + +This is the Confidence SDK for .NET, providing feature flag and configuration management through both a native .NET SDK and OpenFeature integration. The SDK supports dot-notation for accessing nested flag properties and includes comprehensive logging and error handling. + +## Architecture + +### Core Components + +- **Spotify.Confidence.Sdk**: Core SDK with `IConfidenceClient` interface and `ConfidenceClient` implementation +- **Spotify.Confidence.OpenFeature**: OpenFeature provider implementation (`ConfidenceProvider`) +- **Two Integration Approaches**: + - Native SDK: Direct API access with `ConfidenceClient` + - OpenFeature: Standards-compliant integration through `ConfidenceProvider` + +### Key Features + +- **Dot-notation Support**: Access nested flag properties like `"flag.property.subproperty"` +- **Multi-target Framework**: Supports .NET 8.0 and .NET 9.0 +- **Comprehensive Logging**: Uses Microsoft.Extensions.Logging with configurable levels +- **Event Tracking**: Built-in analytics event tracking +- **Type-safe Flag Evaluation**: Support for boolean, string, numeric, integer, and JSON flags + +## Common Development Commands + +### Build and Test +```bash +# Restore dependencies +dotnet restore + +# Build entire solution +dotnet build + +# Build with warnings as errors (CI mode) +dotnet build --verbosity normal --no-restore /p:TreatWarningsAsErrors=true + +# Run all tests +dotnet test + +# Run tests for specific framework +dotnet test --framework net9.0 +dotnet test --framework net8.0 + +# Run tests without build +dotnet test --no-build --verbosity normal +``` + +### Individual Project Commands +```bash +# Build specific projects +dotnet build src/Spotify.Confidence.Sdk/ +dotnet build src/Spotify.Confidence.OpenFeature/ + +# Run specific test projects +dotnet test tests/Spotify.Confidence.Sdk.Tests/ +dotnet test tests/Spotify.Confidence.OpenFeature.Tests/ + +# Run examples +dotnet run --project examples/SimpleExample/ +dotnet run --project examples/OpenFeatureExample/ +``` + +## Code Quality and Standards + +### Static Analysis +The project uses multiple analyzers configured in project files: +- **StyleCop.Analyzers**: Code style enforcement +- **Roslynator.Analyzers**: Additional code analysis +- **SonarAnalyzer.CSharp**: Code quality and security analysis +- **Microsoft.VisualStudio.Threading.Analyzers**: Async/threading best practices +- **Built-in .NET Analysis**: `AnalysisMode=Recommended` and `AnalysisModeSecurity=All` + +### StyleCop Configuration +- Company name: "Spotify" +- Copyright format: "Copyright (c) {companyName}. All rights reserved." +- System using directives placed first, outside namespace +- File naming convention follows StyleCop standards + +### Code Style Requirements +- `EnforceCodeStyleInBuild=true` ensures style violations break the build +- All projects use `Nullable=enable` and `ImplicitUsings=enable` +- Latest C# language version for test projects + +## Project Structure + +### Source Projects +- `src/Spotify.Confidence.Sdk/`: Core SDK implementation +- `src/Spotify.Confidence.OpenFeature/`: OpenFeature provider +- Additional local provider projects may exist + +### Test Projects +- `tests/Spotify.Confidence.Sdk.Tests/`: Core SDK tests using xUnit and Moq +- `tests/Spotify.Confidence.OpenFeature.Tests/`: OpenFeature provider tests + +### Examples +- `examples/SimpleExample/`: Basic native SDK usage +- `examples/OpenFeatureExample/`: OpenFeature integration example +- `examples/UnitySampleGame/`: Unity 3D game demonstrating OpenFeature integration + +## Dependencies and Technologies + +### Core Dependencies +- **Microsoft.Extensions.Http/Polly**: HTTP client with retry policies +- **Microsoft.Extensions.Logging**: Logging abstractions and console output +- **System.Text.Json**: JSON serialization +- **OpenFeature**: Feature flag standard (OpenFeature projects only) + +### Test Dependencies +- **xUnit**: Testing framework +- **Moq**: Mocking framework +- **coverlet.collector**: Code coverage collection + +## Unity Integration (Experimental) + +### Unity Package Architecture +The project provides **two separate Unity packages** for modular OpenFeature integration: + +#### 1. Unity OpenFeature SDK (`unity-openfeature-sdk/`) +- **Package ID**: `com.unity.openfeature` +- **Purpose**: Pure OpenFeature standard implementation for Unity +- **Installation**: `https://github.com/spotify/confidence-sdk-dotnet.git?path=unity-openfeature-sdk` +- **Dependencies**: Newtonsoft.Json 3.0.2 +- **Components**: + - Core OpenFeature interfaces and implementations + - Generic InMemoryProvider for testing + - Unity-specific utilities and MonoBehaviour helpers + +#### 2. Unity Confidence Provider (`unity-confidence-provider/`) +- **Package ID**: `com.spotify.confidence.unity` +- **Purpose**: Confidence platform integration for Unity OpenFeature +- **Installation**: `https://github.com/spotify/confidence-sdk-dotnet.git?path=unity-confidence-provider` +- **Dependencies**: Unity OpenFeature SDK, UnityWebRequest +- **Components**: + - ConfidenceProvider implementing IFeatureProvider + - ConfidenceApiClient for HTTP communication + - Confidence-specific flag resolution and analytics + +### Unity Development Commands +```bash +# Test Unity OpenFeature SDK compilation +cd unity-openfeature-sdk +./build-test.sh + +# Test Unity Confidence Provider compilation (after restructure) +cd unity-confidence-provider +./build-test.sh + +# Build Unity library DLL for examples +cd examples/UnitySampleGame/UnityLibrary +dotnet build + +# Open Unity sample game in Unity Editor +# Navigate to examples/UnitySampleGame/Sample3DGame/ and open in Unity Hub +``` + +### Installation in Unity Projects +Add both packages to your Unity project's `Packages/manifest.json`: + +```json +{ + "dependencies": { + "com.unity.openfeature": "https://github.com/spotify/confidence-sdk-dotnet.git?path=unity-openfeature-sdk", + "com.spotify.confidence.unity": "https://github.com/spotify/confidence-sdk-dotnet.git?path=unity-confidence-provider", + "com.unity.nuget.newtonsoft-json": "3.0.2" + } +} +``` + +### Unity Key Components + +#### OpenFeature Core +- `UnityOpenFeature.Core.IFeatureProvider`: Provider interface +- `UnityOpenFeature.Core.OpenFeatureAPI`: Main API singleton +- `UnityOpenFeature.Client.IFeatureClient`: Client interface for flag evaluation +- `UnityOpenFeature.Unity.UnityOpenFeature`: MonoBehaviour singleton + +#### Confidence Integration +- `UnityOpenFeature.Providers.ConfidenceProvider`: Confidence platform provider +- `UnityOpenFeature.Providers.ConfidenceApiClient`: HTTP client with Unity coroutines +- Dot-notation support for nested flag properties +- Automatic flag analytics and checkpointing + +### Unity Sample Game Features +- **Modular Setup**: Demonstrates both OpenFeature SDK and Confidence Provider usage +- **PlayerController Integration**: Feature flags control movement speed (8x multiplier) +- **Confidence Provider Setup**: Example initialization with client secrets +- **Error Handling**: Comprehensive logging and exception handling +- **Coroutine Support**: Unity-friendly asynchronous operations + +### Important Unity Notes +- **Experimental Status**: Both Unity packages are experimental and subject to change +- **Modular Design**: Can use OpenFeature SDK with other providers besides Confidence +- **GitHub Distribution**: Packages distributed via Git URLs, not Unity Package Manager registry +- **Unity Version**: Supports Unity 2020.3+ (tested with 2022.3.62f1) +- **Target Framework**: .NET Standard 2.1 for Unity compatibility +- **Client Secret Required**: Must configure valid Confidence client secret in samples + +## Release and Versioning + +- Uses release-please for automated releases +- Version managed in project files with `` markers +- Packages published to NuGet with Apache 2.0 license +- Symbol packages (snupkg) included for debugging +- Unity package distributed via Git URL, not Unity Package Manager registry \ No newline at end of file diff --git a/examples/UnitySampleGame/Sample3DGame/Packages/manifest.json b/examples/UnitySampleGame/Sample3DGame/Packages/manifest.json index f58998a..bec0e40 100644 --- a/examples/UnitySampleGame/Sample3DGame/Packages/manifest.json +++ b/examples/UnitySampleGame/Sample3DGame/Packages/manifest.json @@ -1,6 +1,7 @@ { "dependencies": { - "com.unity.openfeature": "file:../../../../unity-sdk", + "com.unity.openfeature": "file:../../../../unity-openfeature-sdk", + "com.spotify.confidence.unity": "file:../../../../unity-confidence-provider", "com.unity.2d.sprite": "1.0.0", "com.unity.collab-proxy": "2.9.3", "com.unity.ide.rider": "3.0.36", diff --git a/unity-confidence-provider/README.md b/unity-confidence-provider/README.md new file mode 100644 index 0000000..912ac6b --- /dev/null +++ b/unity-confidence-provider/README.md @@ -0,0 +1,136 @@ +# Unity Confidence Provider + +โš ๏ธ **EXPERIMENTAL** - This provider is currently in experimental phase and is subject to change. + +A Confidence platform provider for the Unity OpenFeature SDK, enabling Unity games and applications to integrate with Spotify's Confidence feature flag platform. + +## Overview + +This provider implements the OpenFeature specification for the Confidence platform, providing feature flag evaluation, analytics tracking, and real-time configuration management for Unity projects. + +## Prerequisites + +This package requires the Unity OpenFeature SDK. Install both packages: + +```json +{ + "dependencies": { + "com.unity.openfeature": "https://github.com/spotify/confidence-sdk-dotnet.git?path=unity-openfeature-sdk", + "com.spotify.confidence.unity": "https://github.com/spotify/confidence-sdk-dotnet.git?path=unity-confidence-provider", + "com.unity.modules.unitywebrequest": "1.0.0" + } +} +``` + +## Quick Start + +```csharp +using UnityOpenFeature.Core; +using UnityOpenFeature.Providers; + +// Initialize Confidence provider +var provider = new ConfidenceProvider("your-client-secret"); +OpenFeatureAPI.Instance.SetProvider(provider); + +// Set evaluation context +var context = new EvaluationContext("user-123") + .SetAttribute("country", "SE") + .SetAttribute("premium", true); +OpenFeatureAPI.Instance.SetEvaluationContext(context); + +// Get the client and evaluate flags +var client = OpenFeatureAPI.Instance.GetClient(); +bool newFeatureEnabled = client.GetBooleanValue("new-feature.enabled", false); +``` + +## Features + +- **Confidence Platform Integration**: Direct connection to Confidence API +- **Dot-notation Support**: Access nested flag properties like `"flag.property.subproperty"` +- **Automatic Analytics**: Built-in flag application tracking +- **Unity Coroutines**: Async operations using Unity's coroutine system +- **Error Handling**: Comprehensive error handling and logging +- **Checkpointing**: Automatic batched analytics submission + +## Configuration + +### Getting a Client Secret + +1. Sign up for Confidence at [confidence.spotify.com](https://confidence.spotify.com) +2. Create a new project +3. Generate a client secret from your project settings + +### Provider Initialization + +```csharp +// Basic initialization +var provider = new ConfidenceProvider("your-client-secret"); + +// With callback handling +provider.Initialize((success, error) => { + if (success) { + Debug.Log("Confidence provider initialized successfully"); + } else { + Debug.LogError($"Failed to initialize: {error}"); + } +}); +``` + +## Advanced Usage + +### Dot-notation for Nested Properties + +```csharp +// Access nested properties directly +bool darkMode = client.GetBooleanValue("ui-config.theme.darkMode", false); +int timeout = client.GetIntegerValue("api-config.timeout", 5000); +string welcomeMessage = client.GetStringValue("messages.welcome.text", "Hello!"); +``` + +### Manual Flag Application + +```csharp +var provider = new ConfidenceProvider("your-client-secret"); +// Flags are automatically applied when evaluated +// Manual application is handled internally +``` + +## Testing and Compilation + +Test the provider compilation: + +```bash +cd unity-confidence-provider +./build-test.sh +``` + +## Package Structure + +``` +unity-confidence-provider/ +โ”œโ”€โ”€ Runtime/ +โ”‚ โ”œโ”€โ”€ ConfidenceProvider.cs # Main provider implementation +โ”‚ โ”œโ”€โ”€ ConfidenceApiClient.cs # HTTP client for Confidence API +โ”‚ โ””โ”€โ”€ ObjectDictWrapper.cs # Utility for object handling +โ”œโ”€โ”€ package.json # Unity package manifest +โ””โ”€โ”€ build-test.sh # Compilation test script +``` + +## Dependencies + +- Unity 2020.3+ +- Unity OpenFeature SDK +- UnityWebRequest (builtin) + +## Error Handling + +The provider includes comprehensive error handling: + +- Network failures gracefully fallback to default values +- Invalid client secrets are logged with clear error messages +- Flag parsing errors return default values with detailed logging +- Automatic retry logic for transient failures + +## Contributing + +This is an experimental provider. Please report any issues or suggestions through the main repository's issue tracker. \ No newline at end of file diff --git a/unity-sdk/Runtime/Providers/ConfidenceApiClient.cs b/unity-confidence-provider/Runtime/ConfidenceApiClient.cs similarity index 100% rename from unity-sdk/Runtime/Providers/ConfidenceApiClient.cs rename to unity-confidence-provider/Runtime/ConfidenceApiClient.cs diff --git a/unity-sdk/Runtime/Providers/ConfidenceApiClient.cs.meta b/unity-confidence-provider/Runtime/ConfidenceApiClient.cs.meta similarity index 100% rename from unity-sdk/Runtime/Providers/ConfidenceApiClient.cs.meta rename to unity-confidence-provider/Runtime/ConfidenceApiClient.cs.meta diff --git a/unity-confidence-provider/Runtime/ConfidenceProvider.asmdef b/unity-confidence-provider/Runtime/ConfidenceProvider.asmdef new file mode 100644 index 0000000..ed0fde6 --- /dev/null +++ b/unity-confidence-provider/Runtime/ConfidenceProvider.asmdef @@ -0,0 +1,16 @@ +{ + "name": "ConfidenceProvider", + "rootNamespace": "UnityOpenFeature.Providers", + "references": [ + "UnityOpenFeature" + ], + "includePlatforms": [], + "excludePlatforms": [], + "allowUnsafeCode": false, + "overrideReferences": false, + "precompiledReferences": [], + "autoReferenced": true, + "defineConstraints": [], + "versionDefines": [], + "noEngineReferences": false +} \ No newline at end of file diff --git a/unity-sdk/Runtime/Providers/ConfidenceProvider.cs b/unity-confidence-provider/Runtime/ConfidenceProvider.cs similarity index 100% rename from unity-sdk/Runtime/Providers/ConfidenceProvider.cs rename to unity-confidence-provider/Runtime/ConfidenceProvider.cs diff --git a/unity-sdk/Runtime/Providers/ConfidenceProvider.cs.meta b/unity-confidence-provider/Runtime/ConfidenceProvider.cs.meta similarity index 100% rename from unity-sdk/Runtime/Providers/ConfidenceProvider.cs.meta rename to unity-confidence-provider/Runtime/ConfidenceProvider.cs.meta diff --git a/unity-sdk/Runtime/Providers/ObjectDictWrapper.cs b/unity-confidence-provider/Runtime/ObjectDictWrapper.cs similarity index 100% rename from unity-sdk/Runtime/Providers/ObjectDictWrapper.cs rename to unity-confidence-provider/Runtime/ObjectDictWrapper.cs diff --git a/unity-sdk/Runtime/Providers/ObjectDictWrapper.cs.meta b/unity-confidence-provider/Runtime/ObjectDictWrapper.cs.meta similarity index 100% rename from unity-sdk/Runtime/Providers/ObjectDictWrapper.cs.meta rename to unity-confidence-provider/Runtime/ObjectDictWrapper.cs.meta diff --git a/unity-confidence-provider/build-test.sh b/unity-confidence-provider/build-test.sh new file mode 100755 index 0000000..44b5534 --- /dev/null +++ b/unity-confidence-provider/build-test.sh @@ -0,0 +1,109 @@ +#!/bin/bash + +# Unity Confidence Provider Build Test Script +echo "๐Ÿ”จ Testing Unity Confidence Provider compilation..." + +# Unity Editor path +# Allow override via environment variable for CI environments +# Try unity-editor first (available after unity-builder action), then fallback to local macOS path +if command -v unity-editor >/dev/null 2>&1; then + UNITY_PATH="unity-editor" +elif [ -n "$UNITY_PATH" ]; then + UNITY_PATH="$UNITY_PATH" +else + UNITY_PATH="/Applications/Unity/Hub/Editor/2022.3.62f1/Unity.app/Contents/MacOS/Unity" +fi + +# Check if Unity is installed +if ! command -v "$UNITY_PATH" >/dev/null 2>&1 && [ ! -f "$UNITY_PATH" ]; then + echo "โŒ Unity 2022.3.62f1 not found. Please install Unity or update the path." + echo " Tried: $UNITY_PATH" + echo " Available commands: $(which unity-editor 2>/dev/null || echo 'unity-editor not found')" + exit 1 +fi + +echo "โœ… Using Unity at: $UNITY_PATH" + +# Create test project directory +TEST_DIR="../test-unity-confidence-project" +echo "๐Ÿ“ Creating test project at $TEST_DIR..." + +# Clean up previous test if exists +rm -rf "$TEST_DIR" +mkdir -p "$TEST_DIR" + +# Create Unity project +echo "๐ŸŽฎ Creating Unity project..." +$UNITY_PATH -createProject "$(realpath $TEST_DIR)" -quit + +# Add our packages to the project +echo "๐Ÿ“ฆ Adding Unity OpenFeature SDK and Confidence Provider packages..." +cat > "$TEST_DIR/Packages/manifest.json" << EOF +{ + "dependencies": { + "com.unity.openfeature": "file:../../unity-openfeature-sdk", + "com.spotify.confidence.unity": "file:../../unity-confidence-provider", + "com.unity.toolchain.macos-arm64-linux-x86_64": "2.0.4", + "com.unity.modules.ai": "1.0.0", + "com.unity.modules.androidjni": "1.0.0", + "com.unity.modules.animation": "1.0.0", + "com.unity.modules.assetbundle": "1.0.0", + "com.unity.modules.audio": "1.0.0", + "com.unity.modules.cloth": "1.0.0", + "com.unity.modules.director": "1.0.0", + "com.unity.modules.imageconversion": "1.0.0", + "com.unity.modules.imgui": "1.0.0", + "com.unity.modules.jsonserialize": "1.0.0", + "com.unity.modules.particlesystem": "1.0.0", + "com.unity.modules.physics": "1.0.0", + "com.unity.modules.physics2d": "1.0.0", + "com.unity.modules.screencapture": "1.0.0", + "com.unity.modules.terrain": "1.0.0", + "com.unity.modules.terrainphysics": "1.0.0", + "com.unity.modules.tilemap": "1.0.0", + "com.unity.modules.ui": "1.0.0", + "com.unity.modules.uielements": "1.0.0", + "com.unity.modules.umbra": "1.0.0", + "com.unity.modules.unityanalytics": "1.0.0", + "com.unity.modules.unitywebrequest": "1.0.0", + "com.unity.modules.unitywebrequestassetbundle": "1.0.0", + "com.unity.modules.unitywebrequestaudio": "1.0.0", + "com.unity.modules.unitywebrequesttexture": "1.0.0", + "com.unity.modules.unitywebrequestwww": "1.0.0", + "com.unity.modules.vehicles": "1.0.0", + "com.unity.modules.video": "1.0.0", + "com.unity.modules.vr": "1.0.0", + "com.unity.modules.wind": "1.0.0", + "com.unity.modules.xr": "1.0.0" + } +} +EOF + +# Build and test compilation +echo "๐Ÿ”ง Testing compilation..." +LOG_FILE="$TEST_DIR/build.log" + +$UNITY_PATH -batchmode -quit -projectPath "$(realpath $TEST_DIR)" -logFile "$LOG_FILE" + +# Check results +if [ $? -eq 0 ]; then + echo "โœ… BUILD SUCCESSFUL! Unity Confidence Provider compiled without errors." + echo "๐Ÿ“ Build log saved to: $LOG_FILE" + + # Show any warnings (but not errors since build was successful) + if grep -q "warning" "$LOG_FILE"; then + echo "โš ๏ธ Warnings found:" + grep "warning" "$LOG_FILE" | head -5 + fi +else + echo "โŒ BUILD FAILED! Compilation errors found." + echo "๐Ÿ“ Error details:" + grep -A 3 -B 3 "error" "$LOG_FILE" | head -20 + exit 1 +fi + +# Clean up test project +echo "๐Ÿงน Cleaning up test project..." +rm -rf "$TEST_DIR" + +echo "๐ŸŽ‰ Unity Confidence Provider build test completed successfully!" \ No newline at end of file diff --git a/unity-confidence-provider/package.json b/unity-confidence-provider/package.json new file mode 100644 index 0000000..65f9801 --- /dev/null +++ b/unity-confidence-provider/package.json @@ -0,0 +1,26 @@ +{ + "name": "com.spotify.confidence.unity", + "version": "1.0.0", + "displayName": "Unity Confidence Provider", + "description": "Confidence provider for Unity OpenFeature SDK", + "unity": "2020.3", + "dependencies": { + "com.unity.modules.unitywebrequest": "1.0.0" + }, + "keywords": [ + "confidence", + "openfeature", + "feature-flags", + "unity", + "provider" + ], + "repository": { + "type": "git", + "url": "https://github.com/spotify/confidence-sdk-dotnet.git", + "directory": "unity-confidence-provider" + }, + "author": { + "name": "Spotify", + "email": "confidence@spotify.com" + } +} \ No newline at end of file diff --git a/unity-openfeature-sdk/README.md b/unity-openfeature-sdk/README.md new file mode 100644 index 0000000..0d43ab6 --- /dev/null +++ b/unity-openfeature-sdk/README.md @@ -0,0 +1,97 @@ +# Unity OpenFeature SDK + +โš ๏ธ **EXPERIMENTAL** - This SDK is currently in experimental phase and is subject to change. + +A Unity-compatible implementation of the OpenFeature specification for feature flag management in Unity games and applications. + +## Overview + +This SDK provides a Unity wrapper around the OpenFeature standard, enabling developers to use feature flags in their Unity projects with any OpenFeature-compatible provider. + +## Installation + +Add the package to your Unity project's `Packages/manifest.json`: + +```json +{ + "dependencies": { + "com.unity.openfeature": "https://github.com/spotify/confidence-sdk-dotnet.git?path=unity-openfeature-sdk", + "com.unity.nuget.newtonsoft-json": "3.0.2" + } +} +``` + +## Features + +- Unity-compatible OpenFeature implementation +- Support for boolean, string, number, and object flag types +- Asynchronous flag evaluation +- Unity coroutine support +- Provider-agnostic design +- Built-in InMemory provider for testing + +## Basic Usage + +```csharp +using UnityOpenFeature.Core; +using UnityOpenFeature.Providers; + +// Set up a provider (InMemory for testing) +var provider = new InMemoryProvider(); +provider.SetFlag("feature-enabled", true); +provider.SetFlag("max-players", 10); + +// Initialize OpenFeature API +OpenFeatureAPI.Instance.SetProvider(provider); +var client = OpenFeatureAPI.Instance.GetClient(); + +// Evaluate flags +bool featureEnabled = client.GetBooleanValue("feature-enabled", false); +int maxPlayers = client.GetIntegerValue("max-players", 5); +``` + +## Using with Providers + +This SDK is designed to work with OpenFeature providers. For Confidence platform integration, also install the Unity Confidence Provider: + +```json +{ + "dependencies": { + "com.unity.openfeature": "https://github.com/spotify/confidence-sdk-dotnet.git?path=unity-openfeature-sdk", + "com.spotify.confidence.unity": "https://github.com/spotify/confidence-sdk-dotnet.git?path=unity-confidence-provider" + } +} +``` + +## Testing and Compilation + +To test if the SDK compiles correctly with Unity: + +```bash +cd unity-openfeature-sdk +./build-test.sh +``` + +Ensure Unity 2022.3.62f1 is installed at `/Applications/Unity/Hub/Editor/2022.3.62f1/Unity.app/Contents/MacOS/Unity` + +## Package Structure + +``` +unity-openfeature-sdk/ +โ”œโ”€โ”€ Runtime/ +โ”‚ โ”œโ”€โ”€ Core/ # Core OpenFeature interfaces and classes +โ”‚ โ”œโ”€โ”€ Client/ # Feature client implementations +โ”‚ โ”œโ”€โ”€ Providers/ # InMemory provider for testing +โ”‚ โ””โ”€โ”€ Unity/ # Unity-specific utilities +โ”œโ”€โ”€ package.json # Unity package manifest +โ””โ”€โ”€ build-test.sh # Compilation test script +``` + +## Dependencies + +- Unity 2020.3+ +- com.unity.nuget.newtonsoft-json: 3.0.2 + +## Contributing + +This is an experimental SDK. Please report any issues or suggestions through the main repository's issue tracker. \ No newline at end of file diff --git a/unity-sdk/Runtime/Client/FeatureClient.cs b/unity-openfeature-sdk/Runtime/Client/FeatureClient.cs similarity index 100% rename from unity-sdk/Runtime/Client/FeatureClient.cs rename to unity-openfeature-sdk/Runtime/Client/FeatureClient.cs diff --git a/unity-sdk/Runtime/Client/FeatureClient.cs.meta b/unity-openfeature-sdk/Runtime/Client/FeatureClient.cs.meta similarity index 100% rename from unity-sdk/Runtime/Client/FeatureClient.cs.meta rename to unity-openfeature-sdk/Runtime/Client/FeatureClient.cs.meta diff --git a/unity-sdk/Runtime/Client/IFeatureClient.cs b/unity-openfeature-sdk/Runtime/Client/IFeatureClient.cs similarity index 100% rename from unity-sdk/Runtime/Client/IFeatureClient.cs rename to unity-openfeature-sdk/Runtime/Client/IFeatureClient.cs diff --git a/unity-sdk/Runtime/Client/IFeatureClient.cs.meta b/unity-openfeature-sdk/Runtime/Client/IFeatureClient.cs.meta similarity index 100% rename from unity-sdk/Runtime/Client/IFeatureClient.cs.meta rename to unity-openfeature-sdk/Runtime/Client/IFeatureClient.cs.meta diff --git a/unity-sdk/Runtime/Core/ErrorCode.cs b/unity-openfeature-sdk/Runtime/Core/ErrorCode.cs similarity index 100% rename from unity-sdk/Runtime/Core/ErrorCode.cs rename to unity-openfeature-sdk/Runtime/Core/ErrorCode.cs diff --git a/unity-sdk/Runtime/Core/ErrorCode.cs.meta b/unity-openfeature-sdk/Runtime/Core/ErrorCode.cs.meta similarity index 100% rename from unity-sdk/Runtime/Core/ErrorCode.cs.meta rename to unity-openfeature-sdk/Runtime/Core/ErrorCode.cs.meta diff --git a/unity-sdk/Runtime/Core/EvaluationContext.cs b/unity-openfeature-sdk/Runtime/Core/EvaluationContext.cs similarity index 100% rename from unity-sdk/Runtime/Core/EvaluationContext.cs rename to unity-openfeature-sdk/Runtime/Core/EvaluationContext.cs diff --git a/unity-sdk/Runtime/Core/EvaluationContext.cs.meta b/unity-openfeature-sdk/Runtime/Core/EvaluationContext.cs.meta similarity index 100% rename from unity-sdk/Runtime/Core/EvaluationContext.cs.meta rename to unity-openfeature-sdk/Runtime/Core/EvaluationContext.cs.meta diff --git a/unity-sdk/Runtime/Core/IFeatureProvider.cs b/unity-openfeature-sdk/Runtime/Core/IFeatureProvider.cs similarity index 100% rename from unity-sdk/Runtime/Core/IFeatureProvider.cs rename to unity-openfeature-sdk/Runtime/Core/IFeatureProvider.cs diff --git a/unity-sdk/Runtime/Core/IFeatureProvider.cs.meta b/unity-openfeature-sdk/Runtime/Core/IFeatureProvider.cs.meta similarity index 100% rename from unity-sdk/Runtime/Core/IFeatureProvider.cs.meta rename to unity-openfeature-sdk/Runtime/Core/IFeatureProvider.cs.meta diff --git a/unity-sdk/Runtime/Core/IOpenFeatureAPI.cs b/unity-openfeature-sdk/Runtime/Core/IOpenFeatureAPI.cs similarity index 100% rename from unity-sdk/Runtime/Core/IOpenFeatureAPI.cs rename to unity-openfeature-sdk/Runtime/Core/IOpenFeatureAPI.cs diff --git a/unity-sdk/Runtime/Core/IOpenFeatureAPI.cs.meta b/unity-openfeature-sdk/Runtime/Core/IOpenFeatureAPI.cs.meta similarity index 100% rename from unity-sdk/Runtime/Core/IOpenFeatureAPI.cs.meta rename to unity-openfeature-sdk/Runtime/Core/IOpenFeatureAPI.cs.meta diff --git a/unity-sdk/Runtime/Core/OpenFeatureAPI.cs b/unity-openfeature-sdk/Runtime/Core/OpenFeatureAPI.cs similarity index 100% rename from unity-sdk/Runtime/Core/OpenFeatureAPI.cs rename to unity-openfeature-sdk/Runtime/Core/OpenFeatureAPI.cs diff --git a/unity-sdk/Runtime/Core/OpenFeatureAPI.cs.meta b/unity-openfeature-sdk/Runtime/Core/OpenFeatureAPI.cs.meta similarity index 100% rename from unity-sdk/Runtime/Core/OpenFeatureAPI.cs.meta rename to unity-openfeature-sdk/Runtime/Core/OpenFeatureAPI.cs.meta diff --git a/unity-sdk/Runtime/Core/Reason.cs b/unity-openfeature-sdk/Runtime/Core/Reason.cs similarity index 100% rename from unity-sdk/Runtime/Core/Reason.cs rename to unity-openfeature-sdk/Runtime/Core/Reason.cs diff --git a/unity-sdk/Runtime/Core/Reason.cs.meta b/unity-openfeature-sdk/Runtime/Core/Reason.cs.meta similarity index 100% rename from unity-sdk/Runtime/Core/Reason.cs.meta rename to unity-openfeature-sdk/Runtime/Core/Reason.cs.meta diff --git a/unity-sdk/Runtime/Core/ResolutionDetails.cs b/unity-openfeature-sdk/Runtime/Core/ResolutionDetails.cs similarity index 100% rename from unity-sdk/Runtime/Core/ResolutionDetails.cs rename to unity-openfeature-sdk/Runtime/Core/ResolutionDetails.cs diff --git a/unity-sdk/Runtime/Core/ResolutionDetails.cs.meta b/unity-openfeature-sdk/Runtime/Core/ResolutionDetails.cs.meta similarity index 100% rename from unity-sdk/Runtime/Core/ResolutionDetails.cs.meta rename to unity-openfeature-sdk/Runtime/Core/ResolutionDetails.cs.meta diff --git a/unity-sdk/Runtime/Providers/InMemoryProvider.cs b/unity-openfeature-sdk/Runtime/Providers/InMemoryProvider.cs similarity index 100% rename from unity-sdk/Runtime/Providers/InMemoryProvider.cs rename to unity-openfeature-sdk/Runtime/Providers/InMemoryProvider.cs diff --git a/unity-sdk/Runtime/Providers/InMemoryProvider.cs.meta b/unity-openfeature-sdk/Runtime/Providers/InMemoryProvider.cs.meta similarity index 100% rename from unity-sdk/Runtime/Providers/InMemoryProvider.cs.meta rename to unity-openfeature-sdk/Runtime/Providers/InMemoryProvider.cs.meta diff --git a/unity-sdk/Runtime/Unity/UnityOpenFeature.cs b/unity-openfeature-sdk/Runtime/Unity/UnityOpenFeature.cs similarity index 100% rename from unity-sdk/Runtime/Unity/UnityOpenFeature.cs rename to unity-openfeature-sdk/Runtime/Unity/UnityOpenFeature.cs diff --git a/unity-sdk/Runtime/Unity/UnityOpenFeature.cs.meta b/unity-openfeature-sdk/Runtime/Unity/UnityOpenFeature.cs.meta similarity index 100% rename from unity-sdk/Runtime/Unity/UnityOpenFeature.cs.meta rename to unity-openfeature-sdk/Runtime/Unity/UnityOpenFeature.cs.meta diff --git a/unity-sdk/Runtime/UnityOpenFeature.asmdef b/unity-openfeature-sdk/Runtime/UnityOpenFeature.asmdef similarity index 99% rename from unity-sdk/Runtime/UnityOpenFeature.asmdef rename to unity-openfeature-sdk/Runtime/UnityOpenFeature.asmdef index c72a27d..a11f85f 100644 --- a/unity-sdk/Runtime/UnityOpenFeature.asmdef +++ b/unity-openfeature-sdk/Runtime/UnityOpenFeature.asmdef @@ -11,4 +11,4 @@ "defineConstraints": [], "versionDefines": [], "noEngineReferences": false -} +} \ No newline at end of file diff --git a/unity-sdk/build-test.sh b/unity-openfeature-sdk/build-test.sh similarity index 100% rename from unity-sdk/build-test.sh rename to unity-openfeature-sdk/build-test.sh diff --git a/unity-sdk/package.json b/unity-openfeature-sdk/package.json similarity index 82% rename from unity-sdk/package.json rename to unity-openfeature-sdk/package.json index b7ea6dd..9fd66cd 100644 --- a/unity-sdk/package.json +++ b/unity-openfeature-sdk/package.json @@ -15,10 +15,10 @@ "repository": { "type": "git", "url": "https://github.com/spotify/confidence-sdk-dotnet.git", - "directory": "unity-sdk" + "directory": "unity-openfeature-sdk" }, "author": { - "name": "Vahid Torkaman", - "email": "vahidt@spotify.com" + "name": "Spotify", + "email": "confidence@spotify.com" } -} +} \ No newline at end of file diff --git a/unity-sdk/README.md b/unity-sdk/README.md deleted file mode 100644 index 92b771c..0000000 --- a/unity-sdk/README.md +++ /dev/null @@ -1,95 +0,0 @@ -# Unity OpenFeature SDK - -โš ๏ธ **EXPERIMENTAL** - This SDK is currently in experimental phase and is subject to change. - -A Unity-compatible implementation of the OpenFeature specification for feature flag management in Unity games and applications. - -## Overview - -This SDK provides a Unity wrapper around the OpenFeature standard, enabling developers to use feature flags in their Unity projects. It integrates with the Confidence platform for flag evaluation and management. - -## Usage -The unity-sdk can be added to the package.json file like: -https://github.com/spotify/confidence-sdk-dotnet.git?path=unity-sdk - -## Features - -- Unity-compatible OpenFeature implementation -- Confidence provider integration -- Support for boolean, string, number, and object flag types -- Asynchronous flag evaluation -- Unity coroutine support - -## Testing and Compilation - -To test if the SDK compiles correctly with Unity: - -1. Ensure Unity 2022.3.62f1 is installed at `/Applications/Unity/Hub/Editor/2022.3.62f1/Unity.app/Contents/MacOS/Unity` - -## Package Structure - -``` -unity-sdk/ -โ”œโ”€โ”€ Runtime/ -โ”‚ โ”œโ”€โ”€ Client/ # Feature client implementations -โ”‚ โ”œโ”€โ”€ Core/ # Core OpenFeature interfaces and classes -โ”‚ โ”œโ”€โ”€ Providers/ # Provider implementations (Confidence, InMemory) -โ”‚ โ””โ”€โ”€ Unity/ # Unity-specific utilities -โ”œโ”€โ”€ package.json # Unity package manifest -โ””โ”€โ”€ build-test.sh # Compilation test script -``` - -## Usage - -1. Add the package to your Unity project's `Packages/manifest.json`: - ```json - { - "dependencies": { - "com.unity.openfeature": "file:../path/to/unity-sdk", - "com.unity.modules.unitywebrequest": "1.0.0" - } - } - ``` - -2. Initialize the provider in your scripts: - ```csharp - using UnityOpenFeature.Providers; - using UnityOpenFeature.Core; - - var provider = new ConfidenceProvider("your-client-secret"); - OpenFeatureAPI.Instance.SetProvider(provider); - var client = OpenFeatureAPI.Instance.GetClient(); - - // Use the client to evaluate flags - var flagValue = client.GetBooleanValue("my-feature-flag", false); - ``` - -## Dependencies - -- Unity 2020.3+ -- com.unity.nuget.newtonsoft-json: 3.0.2 -- UnityWebRequest 1.0.0 (Builtin) - - -## Compile check - -Run the build test script from the unity-sdk directory: - ```bash - ./build-test.sh - ``` - -The script will: -- Create a temporary Unity test project -- Add the Unity OpenFeature package as a local dependency -- Attempt to build the project -- Report success/failure and any warnings or errors -- Clean up the temporary project - -### Expected Output - -- โœ… BUILD SUCCESSFUL! - SDK compiled without errors -- โŒ BUILD FAILED! - Compilation errors found with details - -## Contributing - -This is an experimental SDK. Please report any issues or suggestions through the main repository's issue tracker. diff --git a/unity-sdk/README.md.meta b/unity-sdk/README.md.meta deleted file mode 100644 index 5ea1f92..0000000 --- a/unity-sdk/README.md.meta +++ /dev/null @@ -1,7 +0,0 @@ -fileFormatVersion: 2 -guid: 1e30c6c0aadf446e4ad8a0297cba063c -TextScriptImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/unity-sdk/Runtime.meta b/unity-sdk/Runtime.meta deleted file mode 100644 index 9e48eea..0000000 --- a/unity-sdk/Runtime.meta +++ /dev/null @@ -1,8 +0,0 @@ -fileFormatVersion: 2 -guid: 3f701c2665bc842739841a9cff2d0473 -folderAsset: yes -DefaultImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/unity-sdk/Runtime/Client.meta b/unity-sdk/Runtime/Client.meta deleted file mode 100644 index 0be32e8..0000000 --- a/unity-sdk/Runtime/Client.meta +++ /dev/null @@ -1,2 +0,0 @@ -fileFormatVersion: 2 -guid: 1d3a489fcc30542ca98e99d5184cdb98 \ No newline at end of file diff --git a/unity-sdk/Runtime/Core.meta b/unity-sdk/Runtime/Core.meta deleted file mode 100644 index 39f598b..0000000 --- a/unity-sdk/Runtime/Core.meta +++ /dev/null @@ -1,2 +0,0 @@ -fileFormatVersion: 2 -guid: 439f4f776cc7240049ae6ef3e1bed904 \ No newline at end of file diff --git a/unity-sdk/Runtime/Providers.meta b/unity-sdk/Runtime/Providers.meta deleted file mode 100644 index 765dda2..0000000 --- a/unity-sdk/Runtime/Providers.meta +++ /dev/null @@ -1,2 +0,0 @@ -fileFormatVersion: 2 -guid: ef3ac3ad8d9ec4a808867cc1d86581f6 \ No newline at end of file diff --git a/unity-sdk/Runtime/Unity.meta b/unity-sdk/Runtime/Unity.meta deleted file mode 100644 index 9b28d15..0000000 --- a/unity-sdk/Runtime/Unity.meta +++ /dev/null @@ -1,2 +0,0 @@ -fileFormatVersion: 2 -guid: 56a4bc4b4fc754817a84af8f1ead1347 \ No newline at end of file diff --git a/unity-sdk/Runtime/UnityOpenFeature.asmdef.meta b/unity-sdk/Runtime/UnityOpenFeature.asmdef.meta deleted file mode 100644 index 8dbddd8..0000000 --- a/unity-sdk/Runtime/UnityOpenFeature.asmdef.meta +++ /dev/null @@ -1,2 +0,0 @@ -fileFormatVersion: 2 -guid: 9ae8bb7bf716f445c96c0f8c515e6da3 \ No newline at end of file diff --git a/unity-sdk/build-test.sh.meta b/unity-sdk/build-test.sh.meta deleted file mode 100644 index 52f9141..0000000 --- a/unity-sdk/build-test.sh.meta +++ /dev/null @@ -1,7 +0,0 @@ -fileFormatVersion: 2 -guid: ead662d7af5da4baca353deedc019631 -DefaultImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/unity-sdk/package.json.meta b/unity-sdk/package.json.meta deleted file mode 100644 index 99002b1..0000000 --- a/unity-sdk/package.json.meta +++ /dev/null @@ -1,7 +0,0 @@ -fileFormatVersion: 2 -guid: d94c0d5605e6a480ca0c62100d9725bf -PackageManifestImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: