1
- # Copyright 2017 Google Inc.
1
+ # Copyright 2024 Google Inc.
2
2
#
3
3
# Licensed under the Apache License, Version 2.0 (the "License");
4
4
# you may not use this file except in compliance with the License.
@@ -185,21 +185,19 @@ def __init__(self, config_values):
185
185
self ._config_values = config_values # dictionary of param key to values
186
186
187
187
def get_boolean (self , key ):
188
- return self .get_value (key ).as_boolean ()
188
+ return self ._get_value (key ).as_boolean ()
189
189
190
190
def get_string (self , key ):
191
- return self .get_value (key ).as_string ()
191
+ return self ._get_value (key ).as_string ()
192
192
193
193
def get_int (self , key ):
194
- return self .get_value (key ).as_int ()
194
+ return self ._get_value (key ).as_int ()
195
195
196
196
def get_float (self , key ):
197
- return self .get_value (key ).as_float ()
197
+ return self ._get_value (key ).as_float ()
198
198
199
- def get_value (self , key ):
200
- if self ._config_values [key ]:
201
- return self ._config_values [key ]
202
- return _Value ('static' )
199
+ def _get_value (self , key ):
200
+ return self ._config_values .get (key , _Value ('static' ))
203
201
204
202
205
203
class _RemoteConfigService :
@@ -421,11 +419,11 @@ def evaluate_percent_condition(self, percent_condition,
421
419
422
420
hash64 = self .hash_seeded_randomization_id (string_to_hash )
423
421
instance_micro_percentile = hash64 % (100 * 1000000 )
424
- if percent_operator == PercentConditionOperator .LESS_OR_EQUAL :
422
+ if percent_operator == PercentConditionOperator .LESS_OR_EQUAL . value :
425
423
return instance_micro_percentile <= norm_micro_percent
426
- if percent_operator == PercentConditionOperator .GREATER_THAN :
424
+ if percent_operator == PercentConditionOperator .GREATER_THAN . value :
427
425
return instance_micro_percentile > norm_micro_percent
428
- if percent_operator == PercentConditionOperator .BETWEEN :
426
+ if percent_operator == PercentConditionOperator .BETWEEN . value :
429
427
return norm_percent_lower_bound < instance_micro_percentile <= norm_percent_upper_bound
430
428
logger .warning ("Unknown percent operator: %s" , percent_operator )
431
429
return False
@@ -454,10 +452,10 @@ def evaluate_custom_signal_condition(self, custom_signal_condition,
454
452
Returns:
455
453
True if the condition is met, False otherwise.
456
454
"""
457
- custom_signal_operator = custom_signal_condition .get ('custom_signal_operator ' ) or {}
458
- custom_signal_key = custom_signal_condition .get ('custom_signal_key ' ) or {}
455
+ custom_signal_operator = custom_signal_condition .get ('customSignalOperator ' ) or {}
456
+ custom_signal_key = custom_signal_condition .get ('customSignalKey ' ) or {}
459
457
target_custom_signal_values = (
460
- custom_signal_condition .get ('target_custom_signal_values ' ) or {})
458
+ custom_signal_condition .get ('targetCustomSignalValues ' ) or {})
461
459
462
460
if not all ([custom_signal_operator , custom_signal_key , target_custom_signal_values ]):
463
461
logger .warning ("Missing operator, key, or target values for custom signal condition." )
@@ -471,71 +469,71 @@ def evaluate_custom_signal_condition(self, custom_signal_condition,
471
469
logger .warning ("Custom signal value not found in context: %s" , custom_signal_key )
472
470
return False
473
471
474
- if custom_signal_operator == CustomSignalOperator .STRING_CONTAINS :
472
+ if custom_signal_operator == CustomSignalOperator .STRING_CONTAINS . value :
475
473
return self ._compare_strings (target_custom_signal_values ,
476
474
actual_custom_signal_value ,
477
475
lambda target , actual : target in actual )
478
- if custom_signal_operator == CustomSignalOperator .STRING_DOES_NOT_CONTAIN :
476
+ if custom_signal_operator == CustomSignalOperator .STRING_DOES_NOT_CONTAIN . value :
479
477
return not self ._compare_strings (target_custom_signal_values ,
480
478
actual_custom_signal_value ,
481
479
lambda target , actual : target in actual )
482
- if custom_signal_operator == CustomSignalOperator .STRING_EXACTLY_MATCHES :
480
+ if custom_signal_operator == CustomSignalOperator .STRING_EXACTLY_MATCHES . value :
483
481
return self ._compare_strings (target_custom_signal_values ,
484
482
actual_custom_signal_value ,
485
483
lambda target , actual : target .strip () == actual .strip ())
486
- if custom_signal_operator == CustomSignalOperator .STRING_CONTAINS_REGEX :
484
+ if custom_signal_operator == CustomSignalOperator .STRING_CONTAINS_REGEX . value :
487
485
return self ._compare_strings (target_custom_signal_values ,
488
486
actual_custom_signal_value ,
489
487
re .search )
490
488
491
489
# For numeric operators only one target value is allowed.
492
- if custom_signal_operator == CustomSignalOperator .NUMERIC_LESS_THAN :
490
+ if custom_signal_operator == CustomSignalOperator .NUMERIC_LESS_THAN . value :
493
491
return self ._compare_numbers (target_custom_signal_values [0 ],
494
492
actual_custom_signal_value ,
495
493
lambda r : r < 0 )
496
- if custom_signal_operator == CustomSignalOperator .NUMERIC_LESS_EQUAL :
494
+ if custom_signal_operator == CustomSignalOperator .NUMERIC_LESS_EQUAL . value :
497
495
return self ._compare_numbers (target_custom_signal_values [0 ],
498
496
actual_custom_signal_value ,
499
497
lambda r : r <= 0 )
500
- if custom_signal_operator == CustomSignalOperator .NUMERIC_EQUAL :
498
+ if custom_signal_operator == CustomSignalOperator .NUMERIC_EQUAL . value :
501
499
return self ._compare_numbers (target_custom_signal_values [0 ],
502
500
actual_custom_signal_value ,
503
501
lambda r : r == 0 )
504
- if custom_signal_operator == CustomSignalOperator .NUMERIC_NOT_EQUAL :
502
+ if custom_signal_operator == CustomSignalOperator .NUMERIC_NOT_EQUAL . value :
505
503
return self ._compare_numbers (target_custom_signal_values [0 ],
506
504
actual_custom_signal_value ,
507
505
lambda r : r != 0 )
508
- if custom_signal_operator == CustomSignalOperator .NUMERIC_GREATER_THAN :
506
+ if custom_signal_operator == CustomSignalOperator .NUMERIC_GREATER_THAN . value :
509
507
return self ._compare_numbers (target_custom_signal_values [0 ],
510
508
actual_custom_signal_value ,
511
509
lambda r : r > 0 )
512
- if custom_signal_operator == CustomSignalOperator .NUMERIC_GREATER_EQUAL :
510
+ if custom_signal_operator == CustomSignalOperator .NUMERIC_GREATER_EQUAL . value :
513
511
return self ._compare_numbers (target_custom_signal_values [0 ],
514
512
actual_custom_signal_value ,
515
513
lambda r : r >= 0 )
516
514
517
515
# For semantic operators only one target value is allowed.
518
- if custom_signal_operator == CustomSignalOperator .SEMANTIC_VERSION_LESS_THAN :
516
+ if custom_signal_operator == CustomSignalOperator .SEMANTIC_VERSION_LESS_THAN . value :
519
517
return self ._compare_semantic_versions (target_custom_signal_values [0 ],
520
518
actual_custom_signal_value ,
521
519
lambda r : r < 0 )
522
- if custom_signal_operator == CustomSignalOperator .SEMANTIC_VERSION_LESS_EQUAL :
520
+ if custom_signal_operator == CustomSignalOperator .SEMANTIC_VERSION_LESS_EQUAL . value :
523
521
return self ._compare_semantic_versions (target_custom_signal_values [0 ],
524
522
actual_custom_signal_value ,
525
523
lambda r : r <= 0 )
526
- if custom_signal_operator == CustomSignalOperator .SEMANTIC_VERSION_EQUAL :
524
+ if custom_signal_operator == CustomSignalOperator .SEMANTIC_VERSION_EQUAL . value :
527
525
return self ._compare_semantic_versions (target_custom_signal_values [0 ],
528
526
actual_custom_signal_value ,
529
527
lambda r : r == 0 )
530
- if custom_signal_operator == CustomSignalOperator .SEMANTIC_VERSION_NOT_EQUAL :
528
+ if custom_signal_operator == CustomSignalOperator .SEMANTIC_VERSION_NOT_EQUAL . value :
531
529
return self ._compare_semantic_versions (target_custom_signal_values [0 ],
532
530
actual_custom_signal_value ,
533
531
lambda r : r != 0 )
534
- if custom_signal_operator == CustomSignalOperator .SEMANTIC_VERSION_GREATER_THAN :
532
+ if custom_signal_operator == CustomSignalOperator .SEMANTIC_VERSION_GREATER_THAN . value :
535
533
return self ._compare_semantic_versions (target_custom_signal_values [0 ],
536
534
actual_custom_signal_value ,
537
535
lambda r : r > 0 )
538
- if custom_signal_operator == CustomSignalOperator .SEMANTIC_VERSION_GREATER_EQUAL :
536
+ if custom_signal_operator == CustomSignalOperator .SEMANTIC_VERSION_GREATER_EQUAL . value :
539
537
return self ._compare_semantic_versions (target_custom_signal_values [0 ],
540
538
actual_custom_signal_value ,
541
539
lambda r : r >= 0 )
@@ -589,25 +587,27 @@ def _compare_semantic_versions(self, target_value, actual_value, predicate_fn) -
589
587
return self ._compare_versions (str (actual_value ),
590
588
str (target_value ), predicate_fn )
591
589
592
- def _compare_versions (self , version1 , version2 , predicate_fn ) -> bool :
590
+ def _compare_versions (self , sem_version_1 , sem_version_2 , predicate_fn ) -> bool :
593
591
"""Compares two semantic version strings.
594
592
595
593
Args:
596
- version1 : The first semantic version string.
597
- version2 : The second semantic version string.
598
- predicate_fn: A function that takes an integer and returns a boolean.
594
+ sem_version_1 : The first semantic version string.
595
+ sem_version_2 : The second semantic version string.
596
+ predicate_fn: A function that takes an integer and returns a boolean.
599
597
600
598
Returns:
601
599
bool: The result of the predicate function.
602
600
"""
603
601
try :
604
- v1_parts = [int (part ) for part in version1 .split ('.' )]
605
- v2_parts = [int (part ) for part in version2 .split ('.' )]
602
+ v1_parts = [int (part ) for part in sem_version_1 .split ('.' )]
603
+ v2_parts = [int (part ) for part in sem_version_2 .split ('.' )]
606
604
max_length = max (len (v1_parts ), len (v2_parts ))
607
605
v1_parts .extend ([0 ] * (max_length - len (v1_parts )))
608
606
v2_parts .extend ([0 ] * (max_length - len (v2_parts )))
609
607
610
608
for part1 , part2 in zip (v1_parts , v2_parts ):
609
+ if any ((part1 < 0 , part2 < 0 )):
610
+ raise ValueError
611
611
if part1 < part2 :
612
612
return predicate_fn (- 1 )
613
613
if part1 > part2 :
@@ -674,7 +674,7 @@ def as_string(self) -> str:
674
674
"""Returns the value as a string."""
675
675
if self .source == 'static' :
676
676
return self .DEFAULT_VALUE_FOR_STRING
677
- return self .value
677
+ return str ( self .value )
678
678
679
679
def as_boolean (self ) -> bool :
680
680
"""Returns the value as a boolean."""
@@ -686,13 +686,19 @@ def as_int(self) -> float:
686
686
"""Returns the value as a number."""
687
687
if self .source == 'static' :
688
688
return self .DEFAULT_VALUE_FOR_INTEGER
689
- return self .value
689
+ try :
690
+ return int (self .value )
691
+ except ValueError :
692
+ return self .DEFAULT_VALUE_FOR_INTEGER
690
693
691
694
def as_float (self ) -> float :
692
695
"""Returns the value as a number."""
693
696
if self .source == 'static' :
694
697
return self .DEFAULT_VALUE_FOR_FLOAT_NUMBER
695
- return float (self .value )
698
+ try :
699
+ return float (self .value )
700
+ except ValueError :
701
+ return self .DEFAULT_VALUE_FOR_FLOAT_NUMBER
696
702
697
703
def get_source (self ) -> ValueSource :
698
704
"""Returns the source of the value."""
0 commit comments