Skip to content

Commit 8443f68

Browse files
committed
added more tests
1 parent 6ecace9 commit 8443f68

File tree

7 files changed

+851
-63
lines changed

7 files changed

+851
-63
lines changed

osbot_fast_api/api/routes/Fast_API__Route__Parser.py

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -21,17 +21,17 @@ def parse_route_path(self, function : Callable
2121

2222
@type_safe
2323
def extract_param_names(self, function : Callable # Function to extract params from
24-
) -> Set[str]: # Returns set of param names
25-
sig = inspect.signature(function) # Get function signature
24+
) -> Set[str]: # Returns set of param names
25+
sig = inspect.signature(function) # Get function signature
2626
param_names = set(sig.parameters.keys()) # Get all parameter names
2727
param_names.discard('self') # Remove 'self' if present
2828
return param_names
2929

3030
@type_safe
3131
def parse_function_name_segments(self, function_name : str , # Function name to parse
32-
param_names : Set[str] # Set of parameter names
33-
) -> list: # Returns list of path segments
34-
parts = function_name.split('__') # Split on double underscore
32+
param_names : Set[str] # Set of parameter names
33+
) -> list: # Returns list of path segments
34+
parts = function_name.split('__') # Split on double underscore
3535
segments = [] # Initialize segments list
3636

3737
for i, part in enumerate(parts): # Process each part
@@ -47,7 +47,7 @@ def parse_function_name_segments(self, function_name : str ,
4747
@type_safe
4848
def parse_part_with_params(self, part : str , # Part to parse
4949
param_names : Set[str] # Set of parameter names
50-
) -> list: # Returns list of segments
50+
) -> list: # Returns list of segments
5151
if '_' in part: # Part contains underscore
5252
return self.parse_part_with_underscore(part, param_names) # Handle mixed param/literal
5353
else: # Part has no underscore

osbot_fast_api/api/routes/Type_Safe__Route__Registration.py

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -19,10 +19,10 @@ def __init__(self, **kwargs):
1919
self.wrapper_creator.converter = self.converter # Wire up dependencies
2020

2121
@type_safe
22-
def register_route(self, router : Router , # FastAPI router to register on
23-
function : Callable , # Function to register
24-
methods : List[str] # HTTP methods (GET, POST, etc)
25-
): # Register a route with full Type_Safe support
22+
def register_route(self, router : Router , # FastAPI router to register on
23+
function : Callable , # Function to register
24+
methods : List[str] # HTTP methods (GET, POST, etc)
25+
): # Register a route with full Type_Safe support
2626

2727
signature = self.analyzer.analyze_function (function ) # Analyze function signature
2828
signature = self.converter.enrich_signature_with_conversions(signature ) # Add conversion metadata
@@ -39,7 +39,7 @@ def register_route(self, router : Router , # FastAPI
3939
@type_safe
4040
def register_route_any(self, router : Router , # FastAPI router
4141
function : Callable , # Function to register
42-
path : str = None # Optional explicit path
42+
path : str = None # Optional explicit path
4343
): # Register route accepting ANY HTTP method
4444

4545
methods = ['GET', 'POST', 'PUT', 'DELETE', 'PATCH', 'HEAD', 'OPTIONS']

osbot_fast_api/api/routes/Type_Safe__Route__Wrapper.py

Lines changed: 32 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -13,26 +13,26 @@ class Type_Safe__Route__Wrapper(Type_Safe): # Create
1313
converter : Type_Safe__Route__Converter
1414

1515
@type_safe
16-
def create_wrapper(self, function : Callable ,# Original function to wrap
17-
signature : Schema__Route__Signature # Signature with conversion info
18-
) -> Callable: # Returns wrapper function
16+
def create_wrapper(self, function : Callable , # Original function to wrap
17+
signature : Schema__Route__Signature # Signature with conversion info
18+
) -> Callable: # Returns wrapper function
1919

2020
if not signature.primitive_conversions and not signature.type_safe_conversions and not signature.return_needs_conversion:
21-
return function # No conversion needed - return original
21+
return function # No conversion needed - return original
2222

23-
if signature.has_body_params: # Different wrappers for different scenarios
23+
if signature.has_body_params: # Different wrappers for different scenarios
2424
return self.create_body_wrapper(function, signature)
2525
else:
2626
return self.create_query_wrapper(function, signature)
2727

2828
@type_safe
29-
def create_body_wrapper(self, function : Callable ,# Function to wrap
30-
signature : Schema__Route__Signature # Signature info
31-
) -> Callable: # Returns wrapper for POST/PUT/DELETE routes
29+
def create_body_wrapper(self, function : Callable , # Function to wrap
30+
signature : Schema__Route__Signature # Signature info
31+
) -> Callable: # Returns wrapper for POST/PUT/DELETE routes
3232

3333
@functools.wraps(function)
3434
def wrapper(**kwargs):
35-
converted_kwargs = {} # Convert each parameter
35+
converted_kwargs = {} # Convert each parameter
3636

3737
for param_name, param_value in kwargs.items():
3838
converted_value = self.converter.convert_parameter_value(param_name, param_value, signature)
@@ -49,54 +49,52 @@ def wrapper(**kwargs):
4949

5050
return self.converter.convert_return_value(result, signature)# Convert return value
5151

52-
new_params = self.build_wrapper_parameters(function, signature) # Update function signature for FastAPI
52+
new_params = self.build_wrapper_parameters(function, signature) # Update function signature for FastAPI
5353
wrapper.__signature__ = inspect.Signature(parameters=new_params)
5454
wrapper.__annotations__ = self.build_wrapper_annotations(function, signature)
5555

5656
return wrapper
5757

5858
@type_safe
59-
def create_query_wrapper(self, function : Callable ,# Function to wrap
60-
signature : Schema__Route__Signature # Signature info
61-
) -> Callable: # Returns wrapper for GET routes
59+
def create_query_wrapper(self, function : Callable , # Function to wrap
60+
signature : Schema__Route__Signature # Signature info
61+
) -> Callable: # Returns wrapper for GET routes
6262

6363
@functools.wraps(function)
6464
def wrapper(*args, **kwargs):
6565
converted_kwargs = {}
6666
validation_errors = []
6767

68-
for param_name, param_value in kwargs.items(): # Convert parameters with validation error tracking
68+
for param_name, param_value in kwargs.items(): # Convert parameters with validation error tracking
6969
try:
7070
converted_value = self.converter.convert_parameter_value(param_name, param_value, signature)
7171
converted_kwargs[param_name] = converted_value
7272
except (ValueError, TypeError) as e:
73-
validation_errors.append({ # Format as FastAPI validation error
74-
'type' : 'value_error' ,
75-
'loc' : ('query', param_name),
76-
'msg' : str(e) ,
77-
'input': param_value
78-
})
79-
80-
if validation_errors: # Raise validation errors
73+
validation_errors.append({ 'type' : 'value_error' , # Format as FastAPI validation error
74+
'loc' : ('query', param_name),
75+
'msg' : str(e) ,
76+
'input': param_value })
77+
78+
if validation_errors: # Raise validation errors
8179
raise RequestValidationError(validation_errors)
8280

83-
if args: # Call with positional args if present
81+
if args: # Call with positional args if present
8482
result = function(*args, **converted_kwargs)
8583
else:
8684
result = function(**converted_kwargs)
8785

8886
return self.converter.convert_return_value(result, signature)# Convert return value
8987

90-
new_params = self.build_wrapper_parameters(function, signature) # Update function signature
88+
new_params = self.build_wrapper_parameters(function, signature) # Update function signature
9189
wrapper.__signature__ = inspect.Signature(parameters=new_params)
9290
wrapper.__annotations__ = self.build_wrapper_annotations(function, signature)
9391

9492
return wrapper
9593

9694
@type_safe
97-
def build_wrapper_parameters(self, function : Callable ,# Original function
98-
signature : Schema__Route__Signature# Signature info
99-
): # Returns list of inspect.Parameter
95+
def build_wrapper_parameters(self, function : Callable , # Original function
96+
signature : Schema__Route__Signature # Signature info
97+
): # Returns list of inspect.Parameter
10098

10199
sig = inspect.signature(function)
102100
new_params = []
@@ -115,21 +113,19 @@ def build_wrapper_parameters(self, function : Callable ,# Original
115113
else:
116114
new_param_type = param.annotation
117115

118-
new_params.append(inspect.Parameter(
119-
name = param.name ,
120-
kind = param.kind ,
121-
default = param.default ,
122-
annotation = new_param_type
123-
))
116+
new_params.append(inspect.Parameter(name = param.name ,
117+
kind = param.kind ,
118+
default = param.default ,
119+
annotation = new_param_type))
124120
else:
125121
new_params.append(param) # Keep unchanged
126122

127123
return new_params
128124

129125
@type_safe
130-
def build_wrapper_annotations(self, function : Callable ,# Original function
131-
signature : Schema__Route__Signature# Signature info
132-
) -> dict: # Returns annotations dict
126+
def build_wrapper_annotations(self, function : Callable , # Original function
127+
signature : Schema__Route__Signature # Signature info
128+
) -> dict: # Returns annotations dict
133129

134130
from typing import get_type_hints
135131

0 commit comments

Comments
 (0)