@@ -4,14 +4,14 @@ use pyo3::intern;
44use pyo3:: prelude:: * ;
55use pyo3:: types:: { PyDict , PyList , PyString , PyTuple } ;
66
7- use ahash:: AHashSet ;
7+ use ahash:: { AHashSet , AHashMap } ;
88use pyo3:: IntoPyObjectExt ;
99
1010use crate :: build_tools:: py_schema_err;
1111use crate :: build_tools:: { schema_or_config_same, ExtraBehavior } ;
1212use crate :: errors:: { ErrorTypeDefaults , ValError , ValLineError , ValResult } ;
1313use crate :: input:: { Arguments , BorrowInput , Input , KeywordArgs , PositionalArgs , ValidationMatch } ;
14- use crate :: lookup_key:: { get_lookup_key, LookupKey } ;
14+ use crate :: lookup_key:: get_lookup_key;
1515use crate :: tools:: SchemaDict ;
1616
1717use super :: validation_state:: ValidationState ;
@@ -42,9 +42,10 @@ impl FromStr for VarKwargsMode {
4242struct Parameter {
4343 positional : bool ,
4444 name : String ,
45- kw_lookup_key : Option < LookupKey > ,
4645 kwarg_key : Option < Py < PyString > > ,
4746 validator : CombinedValidator ,
47+ alias : Option < Py < PyAny > > ,
48+ mode : String
4849}
4950
5051#[ derive( Debug ) ]
@@ -56,6 +57,8 @@ pub struct ArgumentsValidator {
5657 var_kwargs_validator : Option < Box < CombinedValidator > > ,
5758 loc_by_alias : bool ,
5859 extra : ExtraBehavior ,
60+ validate_by_alias : bool ,
61+ validate_by_name : bool ,
5962}
6063
6164impl BuildValidator for ArgumentsValidator {
@@ -75,10 +78,6 @@ impl BuildValidator for ArgumentsValidator {
7578 let mut had_default_arg = false ;
7679 let mut had_keyword_only = false ;
7780
78- let validate_by_name = schema_or_config_same ( schema, config, intern ! ( py, "validate_by_name" ) ) ?. unwrap_or ( false ) ;
79- let validate_by_alias =
80- schema_or_config_same ( schema, config, intern ! ( py, "validate_by_alias" ) ) ?. unwrap_or ( true ) ;
81-
8281 for ( arg_index, arg) in arguments_schema. iter ( ) . enumerate ( ) {
8382 let arg = arg. downcast :: < PyDict > ( ) ?;
8483
@@ -99,19 +98,10 @@ impl BuildValidator for ArgumentsValidator {
9998 had_keyword_only = true ;
10099 }
101100
102- let mut kw_lookup_key = None ;
103- let mut kwarg_key = None ;
104- if mode == "keyword_only" || mode == "positional_or_keyword" {
105- let validation_alias = arg. get_item ( intern ! ( py, "alias" ) ) ?;
106- kw_lookup_key = Some ( get_lookup_key (
107- py,
108- validation_alias,
109- validate_by_name,
110- validate_by_alias,
111- name. as_str ( ) ,
112- ) ?) ;
113- kwarg_key = Some ( py_name. unbind ( ) ) ;
114- }
101+ let kwarg_key = match mode == "keyword_only" || mode == "positional_or_keyword" {
102+ true => Some ( py_name. unbind ( ) ) ,
103+ false => None ,
104+ } ;
115105
116106 let schema = arg. get_as_req ( intern ! ( py, "schema" ) ) ?;
117107
@@ -138,9 +128,10 @@ impl BuildValidator for ArgumentsValidator {
138128 parameters. push ( Parameter {
139129 positional,
140130 name,
141- kw_lookup_key,
142131 kwarg_key,
143132 validator,
133+ alias : arg. get_item ( intern ! ( py, "alias" ) ) ?. map ( |v| v. into ( ) ) ,
134+ mode : mode. to_string ( )
144135 } ) ;
145136 }
146137
@@ -171,6 +162,8 @@ impl BuildValidator for ArgumentsValidator {
171162 var_kwargs_validator,
172163 loc_by_alias : config. get_as ( intern ! ( py, "loc_by_alias" ) ) ?. unwrap_or ( true ) ,
173164 extra : ExtraBehavior :: from_schema_or_config ( py, schema, config, ExtraBehavior :: Forbid ) ?,
165+ validate_by_alias : schema_or_config_same ( schema, config, intern ! ( py, "validate_by_alias" ) ) ?. unwrap_or ( true ) ,
166+ validate_by_name : schema_or_config_same ( schema, config, intern ! ( py, "validate_by_name" ) ) ?. unwrap_or ( false ) ,
174167 }
175168 . into ( ) )
176169 }
@@ -201,6 +194,18 @@ impl Validator for ArgumentsValidator {
201194 let mut errors: Vec < ValLineError > = Vec :: new ( ) ;
202195 let mut used_kwargs: AHashSet < & str > = AHashSet :: with_capacity ( self . parameters . len ( ) ) ;
203196
197+ let validate_by_alias = state. validate_by_alias_or ( self . validate_by_alias ) ;
198+ let validate_by_name = state. validate_by_name_or ( self . validate_by_name ) ;
199+
200+ let mut lookup_keys = AHashMap :: with_capacity ( self . parameters . len ( ) ) ;
201+ for param in & self . parameters {
202+ if param. mode == "keyword_only" || param. mode == "positional_or_keyword" {
203+ let param_name = param. name . as_str ( ) ;
204+ let lookup_key = get_lookup_key ( py, & param. alias , validate_by_name, validate_by_alias, param_name) ?;
205+ lookup_keys. insert ( param_name, lookup_key) ;
206+ }
207+ }
208+
204209 // go through arguments getting the value from args or kwargs and validating it
205210 for ( index, parameter) in self . parameters . iter ( ) . enumerate ( ) {
206211 let mut pos_value = None ;
@@ -210,8 +215,10 @@ impl Validator for ArgumentsValidator {
210215 }
211216 }
212217 let mut kw_value = None ;
218+ let kw_lookup_key = lookup_keys. get ( parameter. name . as_str ( ) ) ;
219+
213220 if let Some ( kwargs) = args. kwargs ( ) {
214- if let Some ( ref lookup_key) = parameter . kw_lookup_key {
221+ if let Some ( lookup_key) = kw_lookup_key {
215222 if let Some ( ( lookup_path, value) ) = kwargs. get_item ( lookup_key) ? {
216223 used_kwargs. insert ( lookup_path. first_key ( ) ) ;
217224 kw_value = Some ( ( lookup_path, value) ) ;
@@ -257,7 +264,7 @@ impl Validator for ArgumentsValidator {
257264 } else {
258265 output_args. push ( value) ;
259266 }
260- } else if let Some ( ref lookup_key) = parameter . kw_lookup_key {
267+ } else if let Some ( lookup_key) = kw_lookup_key {
261268 let error_type = if parameter. positional {
262269 ErrorTypeDefaults :: MissingArgument
263270 } else {
0 commit comments