Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

draft: feat: Unleash as env variable processor #60

Closed

Conversation

ybenhssaien
Copy link

@ybenhssaien ybenhssaien commented Mar 1, 2024

Description

Make it possible to use unleash as an Environment variable in a config file (Yaml, XML, PHP)

This is a simple not tested version stand alone (but the env var processor is tested in a real professional project)

Type of change

Please delete options that are not relevant.

  • Bug fix (non-breaking change which fixes an issue)
  • New feature (non-breaking change which adds functionality)
  • Breaking change (fix or feature that would cause existing functionality to not work as expected)
  • This change requires a documentation update

How Has This Been Tested?

Please describe the tests that you ran to verify your changes.

  • Unit tests
  • Spec Tests
  • Integration tests / Manual Tests

Checklist:

  • I have performed a self-review of my own code
  • I have commented my code, particularly in hard-to-understand areas
  • I have made corresponding changes to the documentation
  • My changes generate no new warnings
  • I have added tests that prove my fix is effective or that my feature works
  • New and existing unit tests pass locally with my changes
  • Any dependent changes have been merged and published in downstream modules

src/DependencyInjection/UnleashEnvVarProcessor.php Outdated Show resolved Hide resolved
$this->client = $client;
}

public function getEnv(string $prefix, string $name, \Closure $getEnv): bool
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Please import the \Closure to be consistent with the rest of the codebase.

src/Resources/config/services.yaml Show resolved Hide resolved
Comment on lines 23 to 24
$container->registerForAutoconfiguration(UnleashEnvVarProcessor::class)
->addTag('container.env_var_processor');
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Please remove these changes, the tag should be added in the yaml configuration.

ybenhssaien and others added 3 commits March 7, 2024 17:27
Co-authored-by: Rikudou_Sage <dominik@chrastecky.cz>
Co-authored-by: Rikudou_Sage <dominik@chrastecky.cz>
Comment on lines +17 to +22
$value = $this->client->isEnabled($name);

// Env vars declared from yaml/xml files have string type
// 1 : Use unleash value first
// 2 : Retrieve the value of declared/default env var of unleash value is false or not retrieved
return $value || filter_var($getEnv($name), FILTER_VALIDATE_BOOL);
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Looking at this here, I don't think this is the correct approach... There should be some differentiation between Unleash returning false and the feature not existing. What happens here is that when the feature is evaluated to false a default is used, which IMO is not correct.

What do you think @sighphyre?

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@RikudouSage Absolutely agree, PHP SDK does support default value as part of the isEnabled call, which is probably a better place for it. That should mean the fallback is only used when the toggle is missing, which is generally the correct flow for an SDK

Side note, if this isn't already using a context provider, I'd consider passing a context as well. Some toggle configurations, like a gradual rollout with a custom stickiness will always resolve (or should, I haven't checked) to false without a context, which is usually not what one wants

Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@sighphyre This uses an instance provided by the Symfony dependency injection, meaning it already has the correct context.

@ybenhssaien Can you use the default value in the call to isEnabled()? It should be something like this:

Suggested change
$value = $this->client->isEnabled($name);
// Env vars declared from yaml/xml files have string type
// 1 : Use unleash value first
// 2 : Retrieve the value of declared/default env var of unleash value is false or not retrieved
return $value || filter_var($getEnv($name), FILTER_VALIDATE_BOOL);
return $this->client->isEnabled($name, default: filter_var($getEnv($name), FILTER_VALIDATE_BOOL));

Copy link

stale bot commented Apr 13, 2024

This pull request has been automatically marked as stale because it has not had recent activity. It will be closed if no further activity occurs. Thank you for your contributions.

@stale stale bot added the stale label Apr 13, 2024
@stale stale bot closed this Apr 25, 2024
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
Status: Done
Development

Successfully merging this pull request may close these issues.

None yet

3 participants