Skip to main content

Switcher Client SDK for Python

Project description


Switcher Client SDK
A Python SDK for Switcher API

Master CI Quality Gate Status Pypi: switcher-client Conda: switcher-client Python: 3.9+ License: MIT Slack: Switcher-HQ


Switcher API: Python Client: Cloud-based Feature Flag API


Table of Contents


About

The Switcher Client SDK for Python provides seamless integration with Switcher-API, enabling powerful feature flag management in your Python applications.

Key Features

  • Clean & Maintainable: Flexible and robust functions that keep your code organized
  • Local Mode: Work offline using snapshot files from your Switcher-API Domain
  • Silent Mode: Hybrid configuration with automatic fallback for connectivity issues
  • Built-in Mocking: Easy implementation of automated testing with mock support
  • Zero Latency: Local snapshot execution for high-performance scenarios
  • Secure: Built-in protection against ReDoS attacks with regex safety features
  • Monitoring: Comprehensive logging and error handling capabilities

Quick Start

Get up and running in just a few lines of code:

from switcher_client import Client

# Initialize the client
Client.build_context(
    domain='My Domain',
    url='https://api.switcherapi.com',
    api_key='[YOUR_API_KEY]',
    component='MyApp',
    environment='default'
)

# Use feature flags
switcher = Client.get_switcher()
if switcher.is_on('FEATURE_TOGGLE'):
    print("Feature is enabled!")

Installation

Install the Switcher Client SDK:

# Pip
pip install switcher-client
# Conda
conda install switcherapi::switcher-client

System Requirements

  • Python: 3.9+ (supports 3.9, 3.10, 3.11, 3.12, 3.13, 3.14)
  • Operating System: Cross-platform (Windows, macOS, Linux)

Configuration

Basic Setup

Initialize the Switcher Client with your domain configuration:

from switcher_client import Client

Client.build_context(
    domain='My Domain',                 # Your Switcher domain name
    url='https://api.switcherapi.com',  # Switcher-API endpoint (optional)
    api_key='[YOUR_API_KEY]',           # Your component's API key (optional)
    component='MyApp',                  # Your application name (optional)
    environment='default'               # Environment ('default' for production)
)

switcher = Client.get_switcher()

Configuration Parameters

Parameter Required Description Default
domain Your Switcher domain name -
url Switcher-API endpoint https://api.switcherapi.com
api_key API key for your component -
component Your application identifier -
environment Target environment default

Advanced Configuration

Enable additional features like local mode, silent mode, and security options:

from switcher_client import Client, ContextOptions

Client.build_context(
    domain='My Domain',
    url='https://api.switcherapi.com',
    api_key='[YOUR_API_KEY]',
    component='MyApp',
    environment='default',
    options=ContextOptions(
        local=True,
        logger=True,
        freeze=True,
        snapshot_location='./snapshot/',
        snapshot_auto_update_interval=3,
        silent_mode='5m',
        restrict_relay=True,
        throttle_max_workers=2,
        regex_max_black_list=10,
        regex_max_time_limit=100,
        cert_path='./certs/ca.pem'
    )
)

switcher = Client.get_switcher()

Advanced Options Reference

Option Type Description Default
local bool Use local snapshot files only (zero latency) False
logger bool Enable logging/caching of feature flag evaluations False
freeze bool Enable cache-immutability responses for consistent results False
snapshot_location str Directory for snapshot files './snapshot/'
snapshot_auto_update_interval int Auto-update interval in seconds (0 = disabled) 0
silent_mode str Silent mode retry time (e.g., '5m' for 5 minutes) None
restrict_relay bool Enable relay restrictions in local mode True
throttle_max_workers int Max workers for throttling feature checks None
regex_max_black_list int Max cached entries for failed regex 100
regex_max_time_limit int Regex execution time limit (ms) 3000
cert_path str Path to custom certificate for secure API connections None

Security Features

  • ReDoS Protection: Built-in ReDoS attack prevention with regex safety features
  • Time Limits: Configurable timeouts prevent long-running regex operations
  • Certificate Support: Use custom certificates for secure API connections

Usage Examples

Basic Feature Flag Checking

The simplest way to check if a feature is enabled:

switcher = Client.get_switcher()

# Simple boolean check
if switcher.is_on('FEATURE_LOGIN_V2'):
    # Use new login system
    new_login()
else:
    # Use legacy login
    legacy_login()

Detailed Response Information

Get comprehensive information about the feature flag evaluation:

response = switcher.is_on_with_details('FEATURE_LOGIN_V2')

print(f"Feature enabled: {response.result}")     # True or False
print(f"Reason: {response.reason}")              # Evaluation reason
print(f"Metadata: {response.metadata}")          # Additional context

Strategy-Based Feature Flags

Method 1: Prepare and Execute

Load validation data separately, useful for complex applications:

# Prepare the validation context
switcher.check_value('USER_123').prepare('USER_FEATURE')

# Execute when ready
if switcher.is_on():
    enable_user_feature()

Method 2: All-in-One Execution

Chain multiple validation strategies for comprehensive feature control:

is_enabled = switcher \
                    # VALUE strategy
                    .check_value('premium_user') \
                    # NETWORK strategy
                    .check_network('192.168.1.0/24') \
                    # Fallback value if API fails
                    .default_result(True) \
                    # Cache result for 1 second
                    .throttle(1000) \
                    .is_on('PREMIUM_FEATURES')

if is_enabled:
    show_premium_dashboard()

Error Handling

Subscribe to error notifications for robust error management:

# Set up error handling
Client.subscribe_notify_error(lambda error: print(f"Switcher Error: {error}"))

Advanced Features

Throttling

# Zero-latency async execution
switcher.throttle(1000).is_on('FEATURE01')

Hybrid Mode

# Force remote resolution for specific features
switcher.remote().is_on('FEATURE01')

Snapshot Management

Loading Snapshots

Load configuration snapshots from the API for local/offline usage:

# Download and save snapshot from API
Client.load_snapshot()

Version Management

Check your current snapshot version:

# Verify snapshot version
version_info = Client.check_snapshot()
print(f"Current snapshot version: {Client.snapshot_version()}")

Automated Updates

Schedule automatic snapshot updates for zero-latency local mode:

Client.schedule_snapshot_auto_update(
    interval=60,
    callback=lambda error, updated: (
        print(f"Snapshot updated to version: {Client.snapshot_version()}") if updated else None
    )
)

Snapshot Monitoring

# Watch for snapshot file changes
Client.watch_snapshot(WatchSnapshotCallback(
    success=lambda: print("✅ Snapshot loaded successfully"),
    reject=lambda e: print(f"❌ Error loading snapshot: {e}")
))

Testing & Development

Built-in Mocking (Coming Soon)

🚧 Note: The mocking features are currently under development

The SDK will include powerful mocking capabilities for testing:

# 🚧 TODO: Mock feature states for testing
Client.assume('FEATURE01').true()
assert switcher.is_on('FEATURE01') == True

Client.forget('FEATURE01')  # Reset to normal behavior

# 🚧 TODO: Mock with metadata
Client.assume('FEATURE01').false().with_metadata({
    'message': 'Feature is disabled'
})
response = switcher.is_on_with_details('FEATURE01')
assert response.result == False
assert response.metadata['message'] == 'Feature is disabled'

Test Mode Configuration

# 🚧 TODO: Enable test mode to prevent file locking
Client.enable_test_mode()

Configuration Validation

Validate your feature flag configuration before deployment:

# Verify that all required switchers are configured
try:
    Client.check_switchers(['FEATURE_LOGIN', 'FEATURE_DASHBOARD', 'FEATURE_PAYMENTS'])
    print("✅ All switchers are properly configured")
except Exception as e:
    print(f"❌ Configuration error: {e}")

This validation helps prevent deployment issues by ensuring all required feature flags are properly set up in your Switcher domain.

Contributing

We welcome contributions to the Switcher Client SDK for Python! If you have suggestions, improvements, or bug fixes, please follow these steps:

  1. Fork the repository.
  2. Create a new branch for your feature or bug fix.
  3. Make your changes and commit them with clear messages.
  4. Submit a pull request detailing your changes and the problem they solve.

Thank you for helping us improve the Switcher Client SDK!

Requirements

  • Python 3.9 or higher
  • Virtualenv - pip install virtualenv
  • Create a virtual environment - python3 -m venv .venv
  • Install Pipenv - pip install pipenv
  • Check Makefile for all available commands

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

switcher_client-0.1.2.tar.gz (37.6 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

switcher_client-0.1.2-py3-none-any.whl (35.6 kB view details)

Uploaded Python 3

File details

Details for the file switcher_client-0.1.2.tar.gz.

File metadata

  • Download URL: switcher_client-0.1.2.tar.gz
  • Upload date:
  • Size: 37.6 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for switcher_client-0.1.2.tar.gz
Algorithm Hash digest
SHA256 4dd9bc6bab846e51f66a0b1372acd8973e3aedea2f5d58ef51d837159936894e
MD5 99daff4d9e4bbedf5facfbb0ba9ffeef
BLAKE2b-256 8eebe5809bb85b614d838365beee13aceeec74793faa9c4909a6a186ace100fc

See more details on using hashes here.

Provenance

The following attestation bundles were made for switcher_client-0.1.2.tar.gz:

Publisher: release.yml on switcherapi/switcher-client-py

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file switcher_client-0.1.2-py3-none-any.whl.

File metadata

  • Download URL: switcher_client-0.1.2-py3-none-any.whl
  • Upload date:
  • Size: 35.6 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for switcher_client-0.1.2-py3-none-any.whl
Algorithm Hash digest
SHA256 478e2a8b5e15b4adb7545013d6eff516b00a6fcb93ab2434044bcad2518f5dc9
MD5 0594f845908ebbbc4aedd02f9c8a962f
BLAKE2b-256 339bedf80927fb299d91525f1fea0f9d39d45d65046eb6a6fc88a3d53f71a8cf

See more details on using hashes here.

Provenance

The following attestation bundles were made for switcher_client-0.1.2-py3-none-any.whl:

Publisher: release.yml on switcherapi/switcher-client-py

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page