@@ -13,7 +13,7 @@ use crate::errors::{ErrorTypeDefaults, ValError, ValLineError, ValResult};
13
13
use crate :: input:: {
14
14
Arguments , BorrowInput , Input , KeywordArgs , PositionalArgs , ValidatedDict , ValidatedTuple , ValidationMatch ,
15
15
} ;
16
- use crate :: lookup_key:: LookupKey ;
16
+ use crate :: lookup_key:: LookupKeyCollection ;
17
17
use crate :: tools:: SchemaDict ;
18
18
19
19
use super :: validation_state:: ValidationState ;
@@ -49,7 +49,7 @@ impl FromStr for ParameterMode {
49
49
struct Parameter {
50
50
name : String ,
51
51
mode : ParameterMode ,
52
- lookup_key : LookupKey ,
52
+ lookup_key_collection : LookupKeyCollection ,
53
53
validator : CombinedValidator ,
54
54
}
55
55
@@ -70,6 +70,8 @@ pub struct ArgumentsV3Validator {
70
70
positional_params_count : usize ,
71
71
loc_by_alias : bool ,
72
72
extra : ExtraBehavior ,
73
+ validate_by_alias : Option < bool > ,
74
+ validate_by_name : Option < bool > ,
73
75
}
74
76
75
77
impl BuildValidator for ArgumentsV3Validator {
@@ -82,8 +84,6 @@ impl BuildValidator for ArgumentsV3Validator {
82
84
) -> PyResult < CombinedValidator > {
83
85
let py = schema. py ( ) ;
84
86
85
- let populate_by_name = schema_or_config_same ( schema, config, intern ! ( py, "populate_by_name" ) ) ?. unwrap_or ( false ) ;
86
-
87
87
let arguments_schema: Bound < ' _ , PyList > = schema. get_as_req ( intern ! ( py, "arguments_schema" ) ) ?;
88
88
let mut parameters: Vec < Parameter > = Vec :: with_capacity ( arguments_schema. len ( ) ) ;
89
89
@@ -113,14 +113,6 @@ impl BuildValidator for ArgumentsV3Validator {
113
113
had_keyword_only = true ;
114
114
}
115
115
116
- let lookup_key = match arg. get_item ( intern ! ( py, "alias" ) ) ? {
117
- Some ( alias) => {
118
- let alt_alias = if populate_by_name { Some ( name. as_str ( ) ) } else { None } ;
119
- LookupKey :: from_py ( py, & alias, alt_alias) ?
120
- }
121
- None => LookupKey :: from_string ( py, & name) ,
122
- } ;
123
-
124
116
let schema = arg. get_as_req ( intern ! ( py, "schema" ) ) ?;
125
117
126
118
let validator = match build_validator ( & schema, config, definitions) {
@@ -143,10 +135,14 @@ impl BuildValidator for ArgumentsV3Validator {
143
135
} else if has_default {
144
136
had_default_arg = true ;
145
137
}
138
+
139
+ let validation_alias = arg. get_item ( intern ! ( py, "alias" ) ) ?;
140
+ let lookup_key_collection = LookupKeyCollection :: new ( py, validation_alias, name. as_str ( ) ) ?;
141
+
146
142
parameters. push ( Parameter {
147
143
name,
148
144
mode,
149
- lookup_key ,
145
+ lookup_key_collection ,
150
146
validator,
151
147
} ) ;
152
148
}
@@ -166,6 +162,8 @@ impl BuildValidator for ArgumentsV3Validator {
166
162
positional_params_count,
167
163
loc_by_alias : config. get_as ( intern ! ( py, "loc_by_alias" ) ) ?. unwrap_or ( true ) ,
168
164
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" ) ) ?,
166
+ validate_by_name : schema_or_config_same ( schema, config, intern ! ( py, "validate_by_name" ) ) ?,
169
167
}
170
168
. into ( ) )
171
169
}
@@ -194,9 +192,15 @@ impl ArgumentsV3Validator {
194
192
let output_kwargs = PyDict :: new ( py) ;
195
193
let mut errors: Vec < ValLineError > = Vec :: new ( ) ;
196
194
195
+ let validate_by_alias = state. validate_by_alias_or ( self . validate_by_alias ) ;
196
+ let validate_by_name = state. validate_by_name_or ( self . validate_by_name ) ;
197
+
197
198
for parameter in self . parameters . iter ( ) {
199
+ let lookup_key = parameter
200
+ . lookup_key_collection
201
+ . select ( validate_by_alias, validate_by_name) ?;
198
202
// A value is present in the mapping:
199
- if let Some ( ( lookup_path, dict_value) ) = mapping. get_item ( & parameter . lookup_key ) ? {
203
+ if let Some ( ( lookup_path, dict_value) ) = mapping. get_item ( & lookup_key) ? {
200
204
match parameter. mode {
201
205
ParameterMode :: PositionalOnly | ParameterMode :: PositionalOrKeyword => {
202
206
match parameter. validator . validate ( py, dict_value. borrow_input ( ) , state) {
@@ -327,7 +331,7 @@ impl ArgumentsV3Validator {
327
331
_ => unreachable ! ( ) ,
328
332
} ;
329
333
330
- errors. push ( parameter . lookup_key . error (
334
+ errors. push ( lookup_key. error (
331
335
error_type,
332
336
original_input,
333
337
self . loc_by_alias ,
@@ -367,8 +371,15 @@ impl ArgumentsV3Validator {
367
371
let mut errors: Vec < ValLineError > = Vec :: new ( ) ;
368
372
let mut used_kwargs: AHashSet < & str > = AHashSet :: with_capacity ( self . parameters . len ( ) ) ;
369
373
374
+ let validate_by_alias = state. validate_by_alias_or ( self . validate_by_alias ) ;
375
+ let validate_by_name = state. validate_by_name_or ( self . validate_by_name ) ;
376
+
370
377
// go through non variadic arguments, getting the value from args or kwargs and validating it
371
378
for ( index, parameter) in self . parameters . iter ( ) . filter ( |p| !p. is_variadic ( ) ) . enumerate ( ) {
379
+ let lookup_key = parameter
380
+ . lookup_key_collection
381
+ . select ( validate_by_alias, validate_by_name) ?;
382
+
372
383
let mut pos_value = None ;
373
384
if let Some ( args) = args_kwargs. args ( ) {
374
385
if matches ! (
@@ -385,7 +396,7 @@ impl ArgumentsV3Validator {
385
396
parameter. mode,
386
397
ParameterMode :: PositionalOrKeyword | ParameterMode :: KeywordOnly
387
398
) {
388
- if let Some ( ( lookup_path, value) ) = kwargs. get_item ( & parameter . lookup_key ) ? {
399
+ if let Some ( ( lookup_path, value) ) = kwargs. get_item ( & lookup_key) ? {
389
400
used_kwargs. insert ( lookup_path. first_key ( ) ) ;
390
401
kw_value = Some ( ( lookup_path, value) ) ;
391
402
}
@@ -446,15 +457,15 @@ impl ArgumentsV3Validator {
446
457
) ) ;
447
458
}
448
459
ParameterMode :: PositionalOrKeyword => {
449
- errors. push ( parameter . lookup_key . error (
460
+ errors. push ( lookup_key. error (
450
461
ErrorTypeDefaults :: MissingArgument ,
451
462
original_input,
452
463
self . loc_by_alias ,
453
464
& parameter. name ,
454
465
) ) ;
455
466
}
456
467
ParameterMode :: KeywordOnly => {
457
- errors. push ( parameter . lookup_key . error (
468
+ errors. push ( lookup_key. error (
458
469
ErrorTypeDefaults :: MissingKeywordOnlyArgument ,
459
470
original_input,
460
471
self . loc_by_alias ,
0 commit comments