Skip to content

feat: Add Config.with_wrapper_information - #501

Merged
kinyoklion merged 2 commits into
mainfrom
devin/config-with-wrapper-information
Aug 20, 2026
Merged

feat: Add Config.with_wrapper_information#501
kinyoklion merged 2 commits into
mainfrom
devin/config-with-wrapper-information

Conversation

@kinyoklion

@kinyoklion kinyoklion commented Aug 19, 2026

Copy link
Copy Markdown
Member

Adds Config.with_wrapper_information, so wrapper libraries can derive a config that identifies themselves without reaching into Config internals.

  • New public method returning a copy of the config with wrapper_name/wrapper_version replaced
  • The original config is left unmodified
  • Mirrors Configuration.Builder(config).WrapperInfo(...) in .NET and LDConfig.Builder.fromConfig(config).wrapper(...) in Java

Requirements

  • I have added test coverage for new or changed functionality
  • I have followed the repository's pull request submission guidelines
  • I have validated my changes against all supported platform versions
Implementation details

Related issues

Needed by openfeature-python-server#51, where the OpenFeature provider must report itself as the wrapper. Wrapper information can only be supplied to the Config constructor today, so a provider that accepts an application-supplied Config has no supported way to add it. The .NET and Java providers do this through their SDK's builder-from-config API; Python has no equivalent.

copy_with_new_sdk_key is the closest existing method, but it is deprecated and rebuilds the config by hand, so it silently drops anything added since it was written (application, hooks, plugins, datasystem_config, and others).

Describe the solution you've provided

def with_wrapper_information(self, wrapper_name, wrapper_version=None) -> 'Config':
    updated = copy.copy(self)
    updated.__wrapper_name = wrapper_name
    updated.__wrapper_version = wrapper_version

    return updated

Shallow-copying avoids the maintenance hazard of re-listing every constructor parameter: fields added later are carried over automatically. Component references (feature store, hooks, plugins) are shared with the original config, which matches how a config is used — the derived config is what gets handed to LDClient, and the original is not used to build a second client.

Describe alternatives you've considered

  • A general copy_with(**kwargs): broader surface area than needed, and re-exposes the constructor's parameter list to the same drift problem.
  • A Config.Builder-style API matching .NET/Java: a much larger change to a long-standing public API, and not required to unblock the providers.
  • Letting wrappers keep assigning the name-mangled private fields: works, but depends on implementation details of the SDK.

Testing

test_with_wrapper_information covers replacing both fields while leaving unrelated settings and the original config intact; test_with_wrapper_information_defaults_the_version covers omitting the version.

Link to Devin session: https://app.devin.ai/sessions/0c452d209ec54b068ba120b4c92b8f6c
Requested by: @kinyoklion


Note

Overview
Adds Config.with_wrapper_information so wrapper libraries (e.g. OpenFeature providers) can stamp wrapper_name / wrapper_version onto an application-supplied config without reconstructing it or touching private fields.

The method shallow-copies the existing Config, replaces those two fields, and leaves the original instance unchanged. Shared objects such as the feature store and HTTP config are not cloned. Tests cover replacement of both fields and omitting the version.

Reviewed by Cursor Bugbot for commit 6db02bf. Bugbot is set up for automated code reviews on this repo. Configure here.

Co-Authored-By: rlamb@launchdarkly.com <4955475+kinyoklion@users.noreply.github.com>
@kinyoklion kinyoklion self-assigned this Aug 19, 2026
@devin-ai-integration

Copy link
Copy Markdown
Contributor

🤖 Devin AI Engineer

I'll be helping with this pull request! Here's what you should know:

✅ I will automatically:

  • Address comments on this PR. Add '(aside)' to your comment to have me ignore it.
  • Look at CI failures and help fix them

Note: I can only respond to comments from users who have write access to this repository.

⚙️ Control Options:

  • Disable automatic comment, CI, and merge conflict monitoring

@devin-ai-integration

Copy link
Copy Markdown
Contributor

@cursor review

Co-Authored-By: rlamb@launchdarkly.com <4955475+kinyoklion@users.noreply.github.com>
@kinyoklion
kinyoklion merged commit 8a98583 into main Aug 20, 2026
15 checks passed
@kinyoklion
kinyoklion deleted the devin/config-with-wrapper-information branch August 20, 2026 17:30
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants