Add configuration validation to your resources to catch errors early and provide helpful feedback to users.
🤖 AI-Generated Content
This documentation was generated with AI assistance and is still being audited. Some, or potentially a lot, of this information may be inaccurate. Learn more.
asyncdef_validate_config(self,config:ServerConfig)->list[str]:"""Validate configuration before applying."""errors=[]iflen(config.name)<3:errors.append("Name must be at least 3 characters")ifconfig.port<1orconfig.port>65535:errors.append("Port must be between 1 and 65535")returnerrors
asyncdef_validate_config(self,config:Config)->list[str]:errors=[]# Minimum lengthiflen(config.name)<3:errors.append("Name must be at least 3 characters")# Maximum lengthiflen(config.description)>256:errors.append("Description cannot exceed 256 characters")# Exact lengthiflen(config.code)!=8:errors.append("Code must be exactly 8 characters")returnerrors
importreasyncdef_validate_config(self,config:Config)->list[str]:errors=[]# Email formatemail_pattern=r'^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$'ifnotre.match(email_pattern,config.email):errors.append("Invalid email format")# URL formaturl_pattern=r'^https?://.+'ifnotre.match(url_pattern,config.webhook_url):errors.append("URL must start with http:// or https://")# Alphanumeric onlyifnotconfig.identifier.isalnum():errors.append("Identifier must be alphanumeric")returnerrors
asyncdef_validate_config(self,config:Config)->list[str]:errors=[]# Range checkifconfig.port<1024orconfig.port>65535:errors.append("Port must be between 1024 and 65535")# Minimum valueifconfig.timeout<1:errors.append("Timeout must be at least 1 second")# Maximum valueifconfig.max_connections>10000:errors.append("Max connections cannot exceed 10000")# Positive numbers onlyifconfig.retry_count<0:errors.append("Retry count must be non-negative")returnerrors
asyncdef_validate_config(self,config:Config)->list[str]:errors=[]# Valid choicesvalid_regions=["us-east-1","us-west-2","eu-west-1"]ifconfig.regionnotinvalid_regions:errors.append(f"Region must be one of: {', '.join(valid_regions)}")# Valid protocolsvalid_protocols={"http","https","tcp","udp"}ifconfig.protocolnotinvalid_protocols:errors.append(f"Protocol must be one of: {', '.join(valid_protocols)}")returnerrors
asyncdef_validate_config(self,config:Config)->list[str]:errors=[]# Prevent path traversalif".."inconfig.path:errors.append("Path cannot contain '..'")# Require absolute pathfrompathlibimportPathifnotPath(config.path).is_absolute():errors.append("Path must be absolute")# Restrict to specific directoryallowed_base=Path("/var/app")try:resolved=Path(config.path).resolve()ifnotstr(resolved).startswith(str(allowed_base)):errors.append(f"Path must be under {allowed_base}")exceptException:errors.append("Invalid path format")returnerrors
asyncdef_validate_config(self,config:Config)->list[str]:errors=[]# Non-empty listifnotconfig.tags:errors.append("At least one tag is required")# List size limitsiflen(config.items)>100:errors.append("Cannot have more than 100 items")# Validate each itemforiteminconfig.allowed_ips:ifnotis_valid_ip(item):errors.append(f"Invalid IP address: {item}")# No duplicatesiflen(config.names)!=len(set(config.names)):errors.append("Names must be unique")returnerrors
asyncdef_validate_config(self,config:Config)->list[str]:errors=[]# If-then validationifconfig.use_sslandnotconfig.certificate_path:errors.append("Certificate path required when SSL is enabled")# Mutual exclusivityifconfig.use_passwordandconfig.use_key:errors.append("Cannot use both password and key authentication")# Required togetherifconfig.usernameandnotconfig.password:errors.append("Password required when username is provided")returnerrors
asyncdef_validate_config(self,config:Config)->list[str]:errors=[]# Compare fieldsifconfig.min_size>config.max_size:errors.append("Min size cannot be greater than max size")# Date rangesifconfig.start_dateandconfig.end_date:ifconfig.start_date>=config.end_date:errors.append("Start date must be before end date")# Port rangesifconfig.port_range_start>config.port_range_end:errors.append("Invalid port range")returnerrors
importhttpxasyncdef_validate_config(self,config:Config)->list[str]:errors=[]# Check if username is availableasyncwithhttpx.AsyncClient()asclient:try:response=awaitclient.get(f"https://api.example.com/users/{config.username}/exists")ifresponse.json()["exists"]:errors.append(f"Username '{config.username}' is already taken")exceptExceptionase:errors.append(f"Failed to validate username: {e}")returnerrors
asyncdef_validate_config(self,config:Config)->list[str]:errors=[]# Check if email is uniqueasyncwithget_db_connection()asdb:exists=awaitdb.fetchval("SELECT EXISTS(SELECT 1 FROM users WHERE email = $1)",config.email)ifexists:errors.append(f"Email '{config.email}' is already registered")returnerrors
asyncdef_validate_config(self,config:Config)->list[str]:errors=[]# Check required fields firstifnotconfig.name:errors.append("Name is required")returnerrors# Stop early if critical field missing# Then validate formatiflen(config.name)<3:errors.append("Name must be at least 3 characters")returnerrors
asyncdef_validate_config(self,config:Config)->list[str]:errors=[]# Collect all errors instead of returning after first oneiflen(config.name)<3:errors.append("Name too short")ifnotconfig.email:errors.append("Email required")ifconfig.port<1024:errors.append("Port too low")# Return all errors at oncereturnerrors
asyncdef_validate_config(self,config:Config)->list[str]:errors=[]# Quick checks first (no API calls)ifnotconfig.name:errors.append("Name required")returnerrors# Expensive checks only if basic validation passesasyncwithhttpx.AsyncClient()asclient:response=awaitclient.get(f"/validate/{config.name}")ifnotresponse.json()["valid"]:errors.append("Name not available")returnerrors
importpytestfrommy_provider.resources.serverimportServer,ServerConfig@pytest.mark.asyncioasyncdeftest_name_validation():server=Server()# Test too shortconfig=ServerConfig(name="ab",port=8080)errors=awaitserver._validate_config(config)assert"Name must be at least 3 characters"inerrors# Test validconfig=ServerConfig(name="server1",port=8080)errors=awaitserver._validate_config(config)assertlen(errors)==0@pytest.mark.asyncioasyncdeftest_port_validation():server=Server()# Test invalid portconfig=ServerConfig(name="server1",port=99999)errors=awaitserver._validate_config(config)assert"Port must be between"inerrors[0]