2222"""
2323
2424import typing
25- from dataclasses import dataclass
26- from numbers import Number
2725
2826import grpc
2927from google .protobuf .struct_pb2 import Struct
3634 ParseError ,
3735 TypeMismatchError ,
3836)
39- from openfeature .flag_evaluation import FlagEvaluationDetails
37+ from openfeature .flag_evaluation import FlagResolutionDetails
38+ from openfeature .provider .metadata import Metadata
4039from openfeature .provider .provider import AbstractProvider
4140
4241from .config import Config
4342from .flag_type import FlagType
4443from .proto .schema .v1 import schema_pb2 , schema_pb2_grpc
4544
46-
47- @dataclass
48- class Metadata :
49- name : str
45+ T = typing .TypeVar ("T" )
5046
5147
5248class FlagdProvider (AbstractProvider ):
@@ -78,85 +74,85 @@ def __init__(
7874 self .channel = channel_factory (f"{ self .config .host } :{ self .config .port } " )
7975 self .stub = schema_pb2_grpc .ServiceStub (self .channel )
8076
81- def shutdown (self ):
77+ def shutdown (self ) -> None :
8278 self .channel .close ()
8379
84- def get_metadata (self ):
80+ def get_metadata (self ) -> Metadata :
8581 """Returns provider metadata"""
8682 return Metadata (name = "FlagdProvider" )
8783
8884 def resolve_boolean_details (
8985 self ,
9086 key : str ,
9187 default_value : bool ,
92- evaluation_context : EvaluationContext = None ,
93- ):
88+ evaluation_context : typing . Optional [ EvaluationContext ] = None ,
89+ ) -> FlagResolutionDetails [ bool ] :
9490 return self ._resolve (key , FlagType .BOOLEAN , default_value , evaluation_context )
9591
9692 def resolve_string_details (
9793 self ,
9894 key : str ,
9995 default_value : str ,
100- evaluation_context : EvaluationContext = None ,
101- ):
96+ evaluation_context : typing . Optional [ EvaluationContext ] = None ,
97+ ) -> FlagResolutionDetails [ str ] :
10298 return self ._resolve (key , FlagType .STRING , default_value , evaluation_context )
10399
104100 def resolve_float_details (
105101 self ,
106102 key : str ,
107- default_value : Number ,
108- evaluation_context : EvaluationContext = None ,
109- ):
103+ default_value : float ,
104+ evaluation_context : typing . Optional [ EvaluationContext ] = None ,
105+ ) -> FlagResolutionDetails [ float ] :
110106 return self ._resolve (key , FlagType .FLOAT , default_value , evaluation_context )
111107
112108 def resolve_integer_details (
113109 self ,
114110 key : str ,
115- default_value : Number ,
116- evaluation_context : EvaluationContext = None ,
117- ):
111+ default_value : int ,
112+ evaluation_context : typing . Optional [ EvaluationContext ] = None ,
113+ ) -> FlagResolutionDetails [ int ] :
118114 return self ._resolve (key , FlagType .INTEGER , default_value , evaluation_context )
119115
120116 def resolve_object_details (
121117 self ,
122118 key : str ,
123119 default_value : typing .Union [dict , list ],
124- evaluation_context : EvaluationContext = None ,
125- ):
120+ evaluation_context : typing . Optional [ EvaluationContext ] = None ,
121+ ) -> FlagResolutionDetails [ typing . Union [ dict , list ]] :
126122 return self ._resolve (key , FlagType .OBJECT , default_value , evaluation_context )
127123
128124 def _resolve (
129125 self ,
130126 flag_key : str ,
131127 flag_type : FlagType ,
132- default_value : typing . Any ,
133- evaluation_context : EvaluationContext ,
134- ):
128+ default_value : T ,
129+ evaluation_context : typing . Optional [ EvaluationContext ] ,
130+ ) -> FlagResolutionDetails [ T ] :
135131 context = self ._convert_context (evaluation_context )
136132 call_args = {"timeout" : self .config .timeout }
137133 try :
138134 if flag_type == FlagType .BOOLEAN :
139- request = schema_pb2 .ResolveBooleanRequest (
135+ request = schema_pb2 .ResolveBooleanRequest ( # type:ignore[attr-defined]
140136 flag_key = flag_key , context = context
141137 )
142138 response = self .stub .ResolveBoolean (request , ** call_args )
143139 elif flag_type == FlagType .STRING :
144- request = schema_pb2 .ResolveStringRequest (
140+ request = schema_pb2 .ResolveStringRequest ( # type:ignore[attr-defined]
145141 flag_key = flag_key , context = context
146142 )
147143 response = self .stub .ResolveString (request , ** call_args )
148144 elif flag_type == FlagType .OBJECT :
149- request = schema_pb2 .ResolveObjectRequest (
145+ request = schema_pb2 .ResolveObjectRequest ( # type:ignore[attr-defined]
150146 flag_key = flag_key , context = context
151147 )
152148 response = self .stub .ResolveObject (request , ** call_args )
153149 elif flag_type == FlagType .FLOAT :
154- request = schema_pb2 .ResolveFloatRequest (
150+ request = schema_pb2 .ResolveFloatRequest ( # type:ignore[attr-defined]
155151 flag_key = flag_key , context = context
156152 )
157153 response = self .stub .ResolveFloat (request , ** call_args )
158154 elif flag_type == FlagType .INTEGER :
159- request = schema_pb2 .ResolveIntRequest (
155+ request = schema_pb2 .ResolveIntRequest ( # type:ignore[attr-defined]
160156 flag_key = flag_key , context = context
161157 )
162158 response = self .stub .ResolveInt (request , ** call_args )
@@ -176,14 +172,15 @@ def _resolve(
176172 raise GeneralError (message ) from e
177173
178174 # Got a valid flag and valid type. Return it.
179- return FlagEvaluationDetails (
180- flag_key = flag_key ,
175+ return FlagResolutionDetails (
181176 value = response .value ,
182177 reason = response .reason ,
183178 variant = response .variant ,
184179 )
185180
186- def _convert_context (self , evaluation_context : EvaluationContext ):
181+ def _convert_context (
182+ self , evaluation_context : typing .Optional [EvaluationContext ]
183+ ) -> Struct :
187184 s = Struct ()
188185 if evaluation_context :
189186 try :
0 commit comments