Python SDK for OpenFeature
Go to file
Federico Bond 291581fbce
fix: object client methods can receive dict or list as default_value (#134)
Signed-off-by: Federico Bond <federicobond@gmail.com>
2023-07-06 11:38:22 -04:00
.github/workflows chore(deps): update codecov/codecov-action digest to eaaf4be (#118) 2023-05-23 08:08:30 +00:00
open_feature fix: object client methods can receive dict or list as default_value (#134) 2023-07-06 11:38:22 -04:00
tests fix: object client methods can receive dict or list as default_value (#134) 2023-07-06 11:38:22 -04:00
.env.template python-sdk: Move exceptions to a single file 2022-06-16 14:47:30 +04:00
.flake8 Restructure modules (#3) 2022-06-30 21:35:41 +04:00
.gitignore feat: process flag evaluation options in client (#31) 2022-12-02 08:07:39 -05:00
.pre-commit-config.yaml python-sdk: Fix issues raised in code review to match a more pythonic style 2022-05-30 15:13:10 +04:00
.release-please-manifest.json chore(main): release 0.0.9 (#70) 2023-01-27 09:37:51 -05:00
CHANGELOG.md chore(main): release 0.0.9 (#70) 2023-01-27 09:37:51 -05:00
CONTRIBUTING.md feat: process flag evaluation options in client (#31) 2022-12-02 08:07:39 -05:00
LICENSE python-sdk: Work in progress initial commit of a python sdk 2022-05-12 16:11:40 +04:00
Makefile feat!: EvaluationDetails.reason should be a string, Reason enum should export default reasons per spec (#126) 2023-06-28 14:21:34 -04:00
pyproject.toml chore(main): release 0.0.9 (#70) 2023-01-27 09:37:51 -05:00
readme.md chore: Update readme with standard format and examples (#130) 2023-06-29 23:18:31 -04:00
release-please-config.json chore: updated release please readme config 2022-11-22 08:25:38 -05:00
renovate.json chore: Configure Renovate auto merge (#76) 2023-01-04 10:37:54 -05:00
requirements-dev.in Pypi publish (#22) 2022-10-13 15:39:47 +04:00
requirements-dev.txt chore(deps): update dependency typing-extensions to v4.6.3 (#123) 2023-06-07 22:37:50 +00:00
requirements.in python-sdk: Remove dependency on provider 2022-06-09 16:59:20 +04:00
requirements.txt Pypi publish (#22) 2022-10-13 15:39:47 +04:00

readme.md

OpenFeature Logo

OpenFeature Python SDK

PyPI version Python 3.8+ Project Status: WIP – Initial development is in progress, but there has not yet been a stable, usable release suitable for the public. Specification on-merge codecov

⚠️ Initial development is in progress, but there has not yet been a stable, usable release suitable for the public. ⚠️

This is the Python implementation of OpenFeature, a vendor-agnostic abstraction library for evaluating feature flags.

We support multiple data types for flags (numbers, strings, booleans, objects) as well as hooks, which can alter the lifecycle of a flag evaluation.

This library is intended to be used in server-side contexts and has not been evaluated for use in mobile devices.

🔍 Requirements:

  • Python 3.8+

📦 Installation:

Add it to your build

Pip install

pip install openfeature-sdk==0.0.9

requirements.txt

openfeature-sdk==0.0.9
pip install requirements.txt

🌟 Features:

  • support for various backend providers
  • easy integration and extension via hooks
  • bool, string, numeric, and object flag types
  • context-aware evaluation

🚀 Usage:

Configure it

In order to use the sdk there is some minor configuration. Follow the script below:

from open_feature import open_feature_api
from open_feature.provider.no_op_provider import NoOpProvider

open_feature_api.set_provider(NoOpProvider())
open_feature_client = open_feature_api.get_client()

Basics:

While Boolean provides the simplest introduction, we offer a variety of flag types.

# Depending on the flag type, use one of the methods below
flag_key = "PROVIDER_FLAG"
boolean_result = open_feature_client.get_boolean_value(key=flag_key,default_value=False)
integer_result = open_feature_client.get_integer_value(key=flag_key,default_value=-1)
float_result = open_feature_client.get_float_value(key=flag_key,default_value=-1)
string_result = open_feature_client.get_string_value(key=flag_key,default_value="")
object_result = open_feature_client.get_object_value(key=flag_key,default_value={})

You can also bind a provider to a specific client by name instead of setting that provider globally:


open_feature_api.set_provider(NoOpProvider())

Each provider class may have further setup required i.e. secret keys, environment variables etc

Context-aware evaluation:

Sometimes the value of a flag must take into account some dynamic criteria about the application or user, such as the user location, IP, email address, or the location of the server. In OpenFeature, we refer to this as targeting. If the flag system you're using supports targeting, you can provide the input data using the EvaluationContext.

from open_feature.open_feature_api import get_client, get_provider, set_provider
from open_feature.open_feature_evaluation_context import (
    api_evaluation_context,
    set_api_evaluation_context,
)

global_context = EvaluationContext(
    targeting_key="targeting_key1", attributes={"application": "value1"}
)
request_context = EvaluationContext(
    targeting_key="targeting_key2", attributes={"email": request.form['email']}
)

## set global context
set_api_evaluation_context(first_context)

# merge second context
client = get_client(name="No-op Provider", version="0.5.2")
client.get_string_value("email", None, request_context)

Events

TBD (See Issue #131)

Providers:

To develop a provider, you need to create a new project and include the OpenFeature SDK as a dependency. This can be a new repository or included in the existing contrib repository available under the OpenFeature organization. Finally, youll then need to write the provider itself. This can be accomplished by implementing the Provider interface exported by the OpenFeature SDK.

See here for a catalog of available providers.

Hooks:

TBD (See Issue #72)

See here for a catalog of available hooks.

Logging:

TBD

Support the project

🤝 Contributing

Interested in contributing? Great, we'd love your help! To get started, take a look at the CONTRIBUTING guide.

Thanks to everyone that has already contributed

Pictures of the folks who have contributed to the project

Made with contrib.rocks.

Contacting us

We hold regular meetings which you can see here.

We are also present on the #openfeature channel in the CNCF slack.

📜 License

Apache License 2.0