From 5a8ca3c475bd83ba8713ef3641b08ca49ce1e2dd Mon Sep 17 00:00:00 2001 From: Iliyan Angelov Date: Sat, 6 Dec 2025 03:27:35 +0200 Subject: [PATCH] updates --- .env | 5 + .../alembic/__pycache__/env.cpython-312.pyc | Bin 2719 -> 2480 bytes Backend/alembic/env.py | 10 +- ...54e4d0db31a3_create_user_sessions_table.py | 92 + ...31_add_mfa_fields_to_users.cpython-312.pyc | Bin 1439 -> 1439 bytes ...erms_refunds_to_page_type_.cpython-312.pyc | Bin 1208 -> 1208 bytes ...tle_fields_to_page_content.cpython-312.pyc | Bin 21992 -> 21992 bytes ...e93_add_page_content_table.cpython-312.pyc | Bin 5897 -> 5897 bytes ...ry_section_fields_to_page_.cpython-312.pyc | Bin 2142 -> 2142 bytes ...wsletter_subscribers_table.cpython-312.pyc | Bin 3830 -> 3830 bytes ...create_user_sessions_table.cpython-312.pyc | Bin 0 -> 5587 bytes ...gration_create_all_tables_.cpython-312.pyc | Bin 24795 -> 24795 bytes ...ty_room_size_view_to_rooms.cpython-312.pyc | Bin 1421 -> 1421 bytes ...add_anonymous_gdpr_support.cpython-312.pyc | Bin 2969 -> 2969 bytes ..._comprehensive_gdpr_tables.cpython-312.pyc | Bin 16672 -> 16672 bytes ...ecipient_type_to_campaigns.cpython-312.pyc | Bin 1713 -> 1713 bytes ..._add_system_settings_table.cpython-312.pyc | Bin 3450 -> 3450 bytes ...tion_accessibility_faq_to_.cpython-312.pyc | Bin 1266 -> 1266 bytes .../add_about_page_fields.cpython-312.pyc | Bin 2044 -> 2044 bytes ...add_badges_to_page_content.cpython-312.pyc | Bin 902 -> 902 bytes .../add_blog_posts_table.cpython-312.pyc | Bin 4726 -> 4726 bytes .../add_borica_payment_method.cpython-312.pyc | Bin 1376 -> 1376 bytes ...right_text_to_page_content.cpython-312.pyc | Bin 907 -> 907 bytes .../add_enterprise_features.cpython-312.pyc | Bin 21408 -> 21408 bytes ...age_fields_to_page_content.cpython-312.pyc | Bin 8929 -> 8929 bytes .../add_group_booking_tables.cpython-312.pyc | Bin 18482 -> 18482 bytes ...d_guest_profile_crm_tables.cpython-312.pyc | Bin 12179 -> 12179 bytes .../add_guest_requests_table.cpython-312.pyc | Bin 5363 -> 5363 bytes ...nventory_management_tables.cpython-312.pyc | Bin 14712 -> 14712 bytes .../add_loyalty_system_tables.cpython-312.pyc | Bin 20228 -> 20228 bytes ...otos_to_housekeeping_tasks.cpython-312.pyc | Bin 1121 -> 1121 bytes ...d_rate_plan_id_to_bookings.cpython-312.pyc | Bin 1699 -> 1699 bytes ...add_sections_to_blog_posts.cpython-312.pyc | Bin 1092 -> 1092 bytes .../add_service_detail_fields.cpython-312.pyc | Bin 2841 -> 2841 bytes .../add_staff_shifts_tables.cpython-312.pyc | Bin 9091 -> 9091 bytes .../add_stripe_payment_method.cpython-312.pyc | Bin 1336 -> 1336 bytes ...prise_promotion_conditions.cpython-312.pyc | Bin 4858 -> 4858 bytes ...omotion_fields_to_bookings.cpython-312.pyc | Bin 1794 -> 1794 bytes ...ry_content_fields_to_page_.cpython-312.pyc | Bin 4154 -> 4154 bytes ...dd_map_url_to_page_content.cpython-312.pyc | Bin 928 -> 928 bytes ...inancial_audit_trail_table.cpython-312.pyc | Bin 6619 -> 6619 bytes ...create_gdpr_requests_table.cpython-312.pyc | Bin 0 -> 7643 bytes ..._add_paypal_payment_method.cpython-312.pyc | Bin 1356 -> 1356 bytes ...erge_enterprise_and_borica.cpython-312.pyc | Bin 815 -> 815 bytes ...dd_is_proforma_to_invoices.cpython-312.pyc | Bin 929 -> 929 bytes ...fication_and_enhance_user_.cpython-312.pyc | Bin 0 -> 7136 bytes ...y_sections_to_page_content.cpython-312.pyc | Bin 2805 -> 2805 bytes ...nt_lockout_fields_to_users.cpython-312.pyc | Bin 1365 -> 1365 bytes ...d709b14aa24a_create_gdpr_requests_table.py | 114 + ...dd_email_verification_and_enhance_user_.py | 110 + Backend/seeders/__init__.py | 2 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 156 bytes .../__pycache__/banner_seeder.cpython-312.pyc | Bin 0 -> 10869 bytes .../homepage_seeder.cpython-312.pyc | Bin 0 -> 22724 bytes .../__pycache__/user_seeder.cpython-312.pyc | Bin 0 -> 8225 bytes Backend/seeders/about_seeder.py | 318 +++ Backend/seeders/accessibility_seeder.py | 200 ++ Backend/seeders/banner_seeder.py | 315 +++ Backend/seeders/blog_seeder.py | 320 +++ Backend/seeders/cancellation_seeder.py | 221 ++ Backend/seeders/contact_seeder.py | 167 ++ Backend/seeders/faq_seeder.py | 192 ++ Backend/seeders/footer_seeder.py | 173 ++ Backend/seeders/homepage_seeder.py | 596 ++++ Backend/seeders/privacy_seeder.py | 172 ++ Backend/seeders/refunds_seeder.py | 193 ++ Backend/seeders/room_seeder.py | 473 ++++ Backend/seeders/run_seeder.py | 184 ++ Backend/seeders/service_seeder.py | 413 +++ Backend/seeders/settings_seeder.py | 339 +++ Backend/seeders/terms_seeder.py | 178 ++ Backend/seeders/user_seeder.py | 198 ++ .../add_accountant_role.cpython-312.pyc | Bin 2772 -> 0 bytes .../__pycache__/seed_bookings.cpython-312.pyc | Bin 10874 -> 0 bytes .../seed_homepage_footer.cpython-312.pyc | Bin 19790 -> 0 bytes .../seed_initial_data.cpython-312.pyc | Bin 7239 -> 0 bytes Backend/seeds_data/add_accountant_role.py | 57 - Backend/seeds_data/add_housekeeping_role.py | 59 - Backend/seeds_data/add_housekeeping_user.py | 81 - .../seeds_data/assign_housekeeping_tasks.py | 149 - Backend/seeds_data/fix_blog_dates.py | 50 - Backend/seeds_data/seed_about_page.py | 201 -- Backend/seeds_data/seed_all_test_data.py | 154 - Backend/seeds_data/seed_banners_company.py | 70 - Backend/seeds_data/seed_blog_posts.py | 1262 --------- Backend/seeds_data/seed_bookings.py | 329 --- Backend/seeds_data/seed_homepage_footer.py | 392 --- Backend/seeds_data/seed_initial_data.py | 163 -- Backend/seeds_data/seed_loyalty_rewards.py | 303 -- Backend/seeds_data/seed_luxury_content.py | 42 - Backend/seeds_data/seed_policy_pages.py | 517 ---- Backend/seeds_data/seed_promotions.py | 157 -- Backend/seeds_data/seed_rooms.py | 141 - Backend/seeds_data/seed_services.py | 218 -- .../seeds_data/seed_services_enterprise.py | 756 ----- Backend/seeds_data/seed_users.py | 194 -- .../src/__pycache__/__init__.cpython-312.pyc | Bin 152 -> 152 bytes Backend/src/__pycache__/main.cpython-312.pyc | Bin 28153 -> 28268 bytes .../ai/__pycache__/__init__.cpython-312.pyc | Bin 155 -> 155 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 162 -> 162 bytes .../ai_conversation.cpython-312.pyc | Bin 7264 -> 7264 bytes .../models/__pycache__/chat.cpython-312.pyc | Bin 2793 -> 2793 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 162 -> 162 bytes .../ai_assistant_routes.cpython-312.pyc | Bin 14092 -> 14092 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 164 -> 164 bytes .../ai_assistant_service.cpython-312.pyc | Bin 24945 -> 24945 bytes .../ai_chat_service.cpython-312.pyc | Bin 54556 -> 54556 bytes .../ai_knowledge_base.cpython-312.pyc | Bin 13131 -> 13131 bytes .../ai_learning_service.cpython-312.pyc | Bin 37642 -> 37642 bytes .../ai_role_access_service.cpython-312.pyc | Bin 21925 -> 21925 bytes .../ai_training_scheduler.cpython-312.pyc | Bin 8227 -> 8227 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 162 -> 162 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 169 -> 169 bytes .../__pycache__/audit_log.cpython-312.pyc | Bin 1633 -> 1633 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 169 -> 169 bytes .../analytics_routes.cpython-312.pyc | Bin 13767 -> 13767 bytes .../__pycache__/audit_routes.cpython-312.pyc | Bin 10970 -> 10970 bytes .../__pycache__/report_routes.cpython-312.pyc | Bin 38361 -> 38361 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 171 -> 171 bytes .../analytics_service.cpython-312.pyc | Bin 40241 -> 40241 bytes .../__pycache__/audit_service.cpython-312.pyc | Bin 2253 -> 2253 bytes .../auth/__pycache__/__init__.cpython-312.pyc | Bin 157 -> 157 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 164 -> 164 bytes .../email_verification_token.cpython-312.pyc | Bin 0 -> 1418 bytes .../password_history.cpython-312.pyc | Bin 0 -> 1115 bytes .../password_reset_token.cpython-312.pyc | Bin 1326 -> 1326 bytes .../__pycache__/refresh_token.cpython-312.pyc | Bin 1145 -> 1145 bytes .../models/__pycache__/role.cpython-312.pyc | Bin 1169 -> 1169 bytes .../models/__pycache__/user.cpython-312.pyc | Bin 3699 -> 4078 bytes .../__pycache__/user_session.cpython-312.pyc | Bin 2353 -> 2421 bytes .../auth/models/email_verification_token.py | 17 + Backend/src/auth/models/password_history.py | 13 + Backend/src/auth/models/user.py | 8 +- Backend/src/auth/models/user_session.py | 4 +- .../__pycache__/__init__.cpython-312.pyc | Bin 164 -> 164 bytes .../__pycache__/auth_routes.cpython-312.pyc | Bin 30662 -> 36471 bytes .../session_routes.cpython-312.pyc | Bin 7502 -> 7502 bytes .../__pycache__/user_routes.cpython-312.pyc | Bin 19501 -> 20816 bytes Backend/src/auth/routes/auth_routes.py | 138 +- Backend/src/auth/routes/user_routes.py | 50 +- .../__pycache__/__init__.cpython-312.pyc | Bin 165 -> 165 bytes .../schemas/__pycache__/auth.cpython-312.pyc | Bin 10101 -> 10101 bytes .../schemas/__pycache__/user.cpython-312.pyc | Bin 3216 -> 3216 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 166 -> 166 bytes .../__pycache__/auth_service.cpython-312.pyc | Bin 27370 -> 41347 bytes .../__pycache__/mfa_service.cpython-312.pyc | Bin 8728 -> 8728 bytes .../__pycache__/oauth_service.cpython-312.pyc | Bin 9452 -> 9452 bytes .../session_service.cpython-312.pyc | Bin 6584 -> 7036 bytes Backend/src/auth/services/auth_service.py | 301 +- Backend/src/auth/services/session_service.py | 16 +- .../__pycache__/__init__.cpython-312.pyc | Bin 161 -> 161 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 168 -> 168 bytes .../__pycache__/booking.cpython-312.pyc | Bin 3283 -> 3283 bytes .../checkin_checkout.cpython-312.pyc | Bin 1878 -> 1878 bytes .../__pycache__/group_booking.cpython-312.pyc | Bin 8689 -> 8689 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 168 -> 168 bytes .../booking_routes.cpython-312.pyc | Bin 113565 -> 113584 bytes .../group_booking_routes.cpython-312.pyc | Bin 31001 -> 31001 bytes .../__pycache__/upsell_routes.cpython-312.pyc | Bin 4426 -> 4426 bytes Backend/src/bookings/routes/booking_routes.py | 5 +- .../__pycache__/__init__.cpython-312.pyc | Bin 360 -> 360 bytes .../__pycache__/admin_booking.cpython-312.pyc | Bin 5688 -> 5688 bytes .../__pycache__/booking.cpython-312.pyc | Bin 8693 -> 8693 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 170 -> 170 bytes .../group_booking_service.cpython-312.pyc | Bin 23142 -> 23142 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 205 -> 205 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 806 -> 806 bytes .../__pycache__/consent.cpython-312.pyc | Bin 3017 -> 3017 bytes .../__pycache__/data_breach.cpython-312.pyc | Bin 3235 -> 3235 bytes .../data_processing_record.cpython-312.pyc | Bin 3280 -> 3280 bytes .../data_retention.cpython-312.pyc | Bin 3171 -> 3171 bytes .../__pycache__/gdpr_request.cpython-312.pyc | Bin 2981 -> 2981 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 212 -> 212 bytes .../gdpr_admin_routes.cpython-312.pyc | Bin 15837 -> 15837 bytes .../__pycache__/gdpr_routes.cpython-312.pyc | Bin 30118 -> 30118 bytes .../breach_service.cpython-312.pyc | Bin 7615 -> 7615 bytes .../consent_service.cpython-312.pyc | Bin 7837 -> 7837 bytes .../data_processing_service.cpython-312.pyc | Bin 5750 -> 5750 bytes .../__pycache__/gdpr_service.cpython-312.pyc | Bin 44126 -> 44126 bytes .../retention_service.cpython-312.pyc | Bin 5812 -> 5812 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 160 -> 160 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 167 -> 167 bytes .../models/__pycache__/banner.cpython-312.pyc | Bin 1960 -> 1960 bytes .../models/__pycache__/blog.cpython-312.pyc | Bin 1938 -> 1938 bytes .../cookie_integration_config.cpython-312.pyc | Bin 1315 -> 1315 bytes .../__pycache__/cookie_policy.cpython-312.pyc | Bin 1318 -> 1318 bytes .../__pycache__/page_content.cpython-312.pyc | Bin 7607 -> 7607 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 167 -> 167 bytes .../__pycache__/about_routes.cpython-312.pyc | Bin 4564 -> 4564 bytes .../accessibility_routes.cpython-312.pyc | Bin 3399 -> 3399 bytes .../admin_privacy_routes.cpython-312.pyc | Bin 3956 -> 3956 bytes .../__pycache__/banner_routes.cpython-312.pyc | Bin 14598 -> 14598 bytes .../__pycache__/blog_routes.cpython-312.pyc | Bin 34286 -> 34286 bytes .../cancellation_routes.cpython-312.pyc | Bin 3398 -> 3398 bytes .../contact_content_routes.cpython-312.pyc | Bin 3717 -> 3717 bytes .../contact_routes.cpython-312.pyc | Bin 4265 -> 4265 bytes .../__pycache__/faq_routes.cpython-312.pyc | Bin 3298 -> 3298 bytes .../__pycache__/footer_routes.cpython-312.pyc | Bin 3331 -> 3331 bytes .../__pycache__/home_routes.cpython-312.pyc | Bin 10624 -> 10624 bytes .../page_content_routes.cpython-312.pyc | Bin 28494 -> 28494 bytes .../privacy_routes.cpython-312.pyc | Bin 7127 -> 7127 bytes .../refunds_routes.cpython-312.pyc | Bin 3366 -> 3366 bytes .../__pycache__/terms_routes.cpython-312.pyc | Bin 3348 -> 3348 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 168 -> 168 bytes .../__pycache__/admin_privacy.cpython-312.pyc | Bin 2691 -> 2691 bytes .../schemas/__pycache__/blog.cpython-312.pyc | Bin 3652 -> 3652 bytes .../__pycache__/page_content.cpython-312.pyc | Bin 10567 -> 10567 bytes .../__pycache__/privacy.cpython-312.pyc | Bin 2356 -> 2356 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 169 -> 169 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 176 -> 176 bytes .../guest_communication.cpython-312.pyc | Bin 2325 -> 2325 bytes .../guest_complaint.cpython-312.pyc | Bin 4937 -> 4937 bytes .../__pycache__/guest_note.cpython-312.pyc | Bin 1480 -> 1480 bytes .../guest_preference.cpython-312.pyc | Bin 1970 -> 1970 bytes .../__pycache__/guest_segment.cpython-312.pyc | Bin 1783 -> 1783 bytes .../__pycache__/guest_tag.cpython-312.pyc | Bin 1562 -> 1562 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 176 -> 176 bytes .../complaint_routes.cpython-312.pyc | Bin 26891 -> 26891 bytes .../guest_profile_routes.cpython-312.pyc | Bin 31340 -> 31340 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 177 -> 177 bytes .../__pycache__/complaint.cpython-312.pyc | Bin 6315 -> 6315 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 178 -> 178 bytes .../guest_profile_service.cpython-312.pyc | Bin 18307 -> 18307 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 167 -> 167 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 964 -> 964 bytes .../__pycache__/guest_request.cpython-312.pyc | Bin 3465 -> 3465 bytes .../housekeeping_task.cpython-312.pyc | Bin 3164 -> 3164 bytes .../inventory_item.cpython-312.pyc | Bin 3427 -> 3427 bytes .../inventory_reorder_request.cpython-312.pyc | Bin 2801 -> 2801 bytes ...inventory_task_consumption.cpython-312.pyc | Bin 1564 -> 1564 bytes .../inventory_transaction.cpython-312.pyc | Bin 2222 -> 2222 bytes .../__pycache__/service.cpython-312.pyc | Bin 1846 -> 1846 bytes .../service_booking.cpython-312.pyc | Bin 4393 -> 4393 bytes .../__pycache__/service_usage.cpython-312.pyc | Bin 1621 -> 1621 bytes .../__pycache__/staff_shift.cpython-312.pyc | Bin 5604 -> 5604 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 281 -> 281 bytes .../guest_request_routes.cpython-312.pyc | Bin 27300 -> 27300 bytes .../inventory_routes.cpython-312.pyc | Bin 28204 -> 28204 bytes .../service_booking_routes.cpython-312.pyc | Bin 16940 -> 16940 bytes .../service_routes.cpython-312.pyc | Bin 17023 -> 17023 bytes .../staff_shift_routes.cpython-312.pyc | Bin 26479 -> 26479 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 175 -> 175 bytes .../service_booking.cpython-312.pyc | Bin 3098 -> 3098 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 176 -> 176 bytes .../__pycache__/task_service.cpython-312.pyc | Bin 17911 -> 17911 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 229 -> 229 bytes .../__pycache__/api_key.cpython-312.pyc | Bin 2448 -> 2448 bytes .../__pycache__/webhook.cpython-312.pyc | Bin 4024 -> 4024 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 236 -> 236 bytes .../api_key_routes.cpython-312.pyc | Bin 8078 -> 8078 bytes .../webhook_routes.cpython-312.pyc | Bin 10061 -> 10061 bytes .../api_key_service.cpython-312.pyc | Bin 5975 -> 5975 bytes .../webhook_service.cpython-312.pyc | Bin 9666 -> 9666 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 160 -> 160 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 167 -> 167 bytes .../loyalty_point_transaction.cpython-312.pyc | Bin 2387 -> 2387 bytes .../loyalty_reward.cpython-312.pyc | Bin 4139 -> 4139 bytes .../__pycache__/loyalty_tier.cpython-312.pyc | Bin 2076 -> 2076 bytes .../__pycache__/package.cpython-312.pyc | Bin 4236 -> 4236 bytes .../__pycache__/promotion.cpython-312.pyc | Bin 4769 -> 4769 bytes .../__pycache__/referral.cpython-312.pyc | Bin 2140 -> 2140 bytes .../reward_redemption.cpython-312.pyc | Bin 2252 -> 2252 bytes .../__pycache__/user_loyalty.cpython-312.pyc | Bin 2258 -> 2258 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 167 -> 167 bytes .../loyalty_routes.cpython-312.pyc | Bin 45550 -> 45550 bytes .../package_routes.cpython-312.pyc | Bin 24621 -> 24621 bytes .../promotion_routes.cpython-312.pyc | Bin 25726 -> 25726 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 168 -> 168 bytes .../__pycache__/promotion.cpython-312.pyc | Bin 9110 -> 9110 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 169 -> 169 bytes .../loyalty_service.cpython-312.pyc | Bin 32311 -> 32311 bytes Backend/src/main.py | 3 +- .../__pycache__/__init__.cpython-312.pyc | Bin 8342 -> 8342 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 166 -> 166 bytes Backend/src/notifications/models/__init__.py | 24 + .../__pycache__/__init__.cpython-312.pyc | Bin 173 -> 574 bytes .../email_campaign.cpython-312.pyc | Bin 13727 -> 13727 bytes .../__pycache__/notification.cpython-312.pyc | Bin 7216 -> 7216 bytes .../__pycache__/team_chat.cpython-312.pyc | Bin 0 -> 7319 bytes Backend/src/notifications/models/team_chat.py | 159 ++ .../__pycache__/__init__.cpython-312.pyc | Bin 173 -> 173 bytes .../__pycache__/chat_routes.cpython-312.pyc | Bin 32426 -> 32426 bytes .../email_campaign_routes.cpython-312.pyc | Bin 36213 -> 36213 bytes .../notification_routes.cpython-312.pyc | Bin 27374 -> 27374 bytes .../team_chat_routes.cpython-312.pyc | Bin 0 -> 44123 bytes .../notifications/routes/team_chat_routes.py | 857 ++++++ .../__pycache__/__init__.cpython-312.pyc | Bin 175 -> 175 bytes .../email_campaign_service.cpython-312.pyc | Bin 24345 -> 24345 bytes .../notification_service.cpython-312.pyc | Bin 17134 -> 17134 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 161 -> 161 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 168 -> 168 bytes .../accountant_session.cpython-312.pyc | Bin 3772 -> 3772 bytes .../chart_of_accounts.cpython-312.pyc | Bin 3061 -> 3061 bytes .../financial_approval.cpython-312.pyc | Bin 4137 -> 4137 bytes .../financial_audit_trail.cpython-312.pyc | Bin 3329 -> 3329 bytes .../__pycache__/fiscal_period.cpython-312.pyc | Bin 2356 -> 2356 bytes .../__pycache__/invoice.cpython-312.pyc | Bin 5142 -> 5142 bytes .../__pycache__/journal_entry.cpython-312.pyc | Bin 4451 -> 4451 bytes .../__pycache__/payment.cpython-312.pyc | Bin 3069 -> 3069 bytes .../reconciliation_exception.cpython-312.pyc | Bin 3834 -> 3834 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 168 -> 168 bytes ...accountant_security_routes.cpython-312.pyc | Bin 12665 -> 12665 bytes .../approval_routes.cpython-312.pyc | Bin 20472 -> 20472 bytes .../audit_trail_routes.cpython-312.pyc | Bin 22880 -> 22880 bytes .../financial_routes.cpython-312.pyc | Bin 32082 -> 32082 bytes .../__pycache__/gl_routes.cpython-312.pyc | Bin 12264 -> 12264 bytes .../invoice_routes.cpython-312.pyc | Bin 19225 -> 19281 bytes .../payment_routes.cpython-312.pyc | Bin 84594 -> 84594 bytes .../reconciliation_routes.cpython-312.pyc | Bin 11285 -> 11285 bytes Backend/src/payments/routes/invoice_routes.py | 1 + .../__pycache__/__init__.cpython-312.pyc | Bin 169 -> 169 bytes .../__pycache__/invoice.cpython-312.pyc | Bin 3719 -> 3719 bytes .../__pycache__/payment.cpython-312.pyc | Bin 7912 -> 7912 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 170 -> 170 bytes ...ccountant_security_service.cpython-312.pyc | Bin 10638 -> 10638 bytes .../approval_service.cpython-312.pyc | Bin 11657 -> 11657 bytes .../borica_service.cpython-312.pyc | Bin 18588 -> 18588 bytes .../financial_audit_service.cpython-312.pyc | Bin 5805 -> 5805 bytes .../__pycache__/gl_service.cpython-312.pyc | Bin 14600 -> 14600 bytes .../invoice_service.cpython-312.pyc | Bin 24043 -> 24043 bytes .../paypal_service.cpython-312.pyc | Bin 24320 -> 24320 bytes .../reconciliation_service.cpython-312.pyc | Bin 14333 -> 14333 bytes .../stripe_service.cpython-312.pyc | Bin 24576 -> 24576 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 160 -> 160 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 167 -> 167 bytes .../__pycache__/favorite.cpython-312.pyc | Bin 1216 -> 1216 bytes .../models/__pycache__/review.cpython-312.pyc | Bin 1902 -> 1902 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 167 -> 167 bytes .../favorite_routes.cpython-312.pyc | Bin 10585 -> 10585 bytes .../__pycache__/review_routes.cpython-312.pyc | Bin 21973 -> 21973 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 168 -> 168 bytes .../__pycache__/review.cpython-312.pyc | Bin 1092 -> 1092 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 158 -> 158 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 165 -> 165 bytes .../__pycache__/rate_plan.cpython-312.pyc | Bin 4907 -> 4907 bytes .../models/__pycache__/room.cpython-312.pyc | Bin 2678 -> 2678 bytes .../room_attribute.cpython-312.pyc | Bin 1642 -> 1642 bytes .../room_inspection.cpython-312.pyc | Bin 3240 -> 3240 bytes .../room_maintenance.cpython-312.pyc | Bin 3116 -> 3116 bytes .../__pycache__/room_type.cpython-312.pyc | Bin 1491 -> 1491 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 165 -> 165 bytes .../advanced_room_routes.cpython-312.pyc | Bin 62971 -> 62971 bytes .../rate_plan_routes.cpython-312.pyc | Bin 27748 -> 27748 bytes .../__pycache__/room_routes.cpython-312.pyc | Bin 63373 -> 75954 bytes Backend/src/rooms/routes/room_routes.py | 256 +- .../__pycache__/__init__.cpython-312.pyc | Bin 303 -> 303 bytes .../schemas/__pycache__/room.cpython-312.pyc | Bin 6208 -> 8480 bytes Backend/src/rooms/schemas/room.py | 48 + .../__pycache__/__init__.cpython-312.pyc | Bin 167 -> 167 bytes .../room_assignment_service.cpython-312.pyc | Bin 11049 -> 11049 bytes .../__pycache__/room_service.cpython-312.pyc | Bin 9783 -> 9783 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 161 -> 161 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 172 -> 172 bytes .../admin_ip_whitelist.cpython-312.pyc | Bin 6150 -> 6150 bytes .../__pycache__/auth.cpython-312.pyc | Bin 9785 -> 9785 bytes .../__pycache__/csrf.cpython-312.pyc | Bin 6074 -> 6074 bytes .../role_based_rate_limit.cpython-312.pyc | Bin 2283 -> 2283 bytes .../__pycache__/security.cpython-312.pyc | Bin 2495 -> 2495 bytes .../__pycache__/step_up_auth.cpython-312.pyc | Bin 5923 -> 5923 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 168 -> 168 bytes .../gdpr_compliance.cpython-312.pyc | Bin 4684 -> 4667 bytes .../security_event.cpython-312.pyc | Bin 7024 -> 7024 bytes .../src/security/models/gdpr_compliance.py | 2 +- .../__pycache__/__init__.cpython-312.pyc | Bin 290 -> 290 bytes .../compliance_routes.cpython-312.pyc | Bin 10157 -> 10157 bytes .../security_routes.cpython-312.pyc | Bin 33370 -> 33370 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 170 -> 170 bytes .../encryption_service.cpython-312.pyc | Bin 4896 -> 4896 bytes .../__pycache__/gdpr_service.cpython-312.pyc | Bin 13075 -> 13075 bytes .../privacy_admin_service.cpython-312.pyc | Bin 4616 -> 4616 bytes ...ecurity_monitoring_service.cpython-312.pyc | Bin 9003 -> 9003 bytes .../security_scan_service.cpython-312.pyc | Bin 14311 -> 14311 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 159 -> 159 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 166 -> 166 bytes .../__pycache__/database.cpython-312.pyc | Bin 2344 -> 2344 bytes .../logging_config.cpython-312.pyc | Bin 3455 -> 3455 bytes .../__pycache__/settings.cpython-312.pyc | Bin 15416 -> 15846 bytes Backend/src/shared/config/settings.py | 3 + .../__pycache__/__init__.cpython-312.pyc | Bin 170 -> 170 bytes .../api_versioning.cpython-312.pyc | Bin 2696 -> 2696 bytes .../cookie_consent.cpython-312.pyc | Bin 3648 -> 3648 bytes .../__pycache__/error_handler.cpython-312.pyc | Bin 7947 -> 7947 bytes .../__pycache__/request_id.cpython-312.pyc | Bin 2787 -> 2787 bytes .../request_size_limit.cpython-312.pyc | Bin 2747 -> 2747 bytes .../__pycache__/timeout.cpython-312.pyc | Bin 1969 -> 1969 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 165 -> 165 bytes .../currency_helpers.cpython-312.pyc | Bin 803 -> 803 bytes .../email_templates.cpython-312.pyc | Bin 24925 -> 29152 bytes .../file_validation.cpython-312.pyc | Bin 5236 -> 5236 bytes .../image_optimization.cpython-312.pyc | Bin 7468 -> 7468 bytes .../utils/__pycache__/mailer.cpython-312.pyc | Bin 6389 -> 6389 bytes .../request_helpers.cpython-312.pyc | Bin 820 -> 820 bytes .../response_helpers.cpython-312.pyc | Bin 2361 -> 2361 bytes .../__pycache__/role_helpers.cpython-312.pyc | Bin 9555 -> 9528 bytes .../__pycache__/sanitization.cpython-312.pyc | Bin 5861 -> 5861 bytes Backend/src/shared/utils/email_templates.py | 62 + Backend/src/shared/utils/role_helpers.py | 4 +- .../approval_workflow.cpython-312.pyc | Bin 2887 -> 2887 bytes .../system_settings.cpython-312.pyc | Bin 1256 -> 1256 bytes .../__pycache__/workflow.cpython-312.pyc | Bin 7130 -> 7130 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 462 -> 462 bytes .../approval_routes.cpython-312.pyc | Bin 9829 -> 9829 bytes .../__pycache__/backup_routes.cpython-312.pyc | Bin 6953 -> 6953 bytes .../system_settings_routes.cpython-312.pyc | Bin 81691 -> 81691 bytes .../__pycache__/task_routes.cpython-312.pyc | Bin 20347 -> 20347 bytes .../workflow_routes.cpython-312.pyc | Bin 15034 -> 15034 bytes .../approval_service.cpython-312.pyc | Bin 9063 -> 9063 bytes .../backup_service.cpython-312.pyc | Bin 11175 -> 11175 bytes .../workflow_service.cpython-312.pyc | Bin 14966 -> 14966 bytes .../AvifImagePlugin.cpython-312.pyc | Bin 11542 -> 11542 bytes .../BlpImagePlugin.cpython-312.pyc | Bin 24096 -> 24096 bytes .../BmpImagePlugin.cpython-312.pyc | Bin 18064 -> 18064 bytes .../BufrStubImagePlugin.cpython-312.pyc | Bin 2669 -> 2669 bytes .../CurImagePlugin.cpython-312.pyc | Bin 2353 -> 2353 bytes .../DcxImagePlugin.cpython-312.pyc | Bin 2894 -> 2894 bytes .../DdsImagePlugin.cpython-312.pyc | Bin 24433 -> 24433 bytes .../EpsImagePlugin.cpython-312.pyc | Bin 15956 -> 15956 bytes .../PIL/__pycache__/ExifTags.cpython-312.pyc | Bin 11560 -> 11560 bytes .../FitsImagePlugin.cpython-312.pyc | Bin 6040 -> 6040 bytes .../FliImagePlugin.cpython-312.pyc | Bin 7178 -> 7178 bytes .../FpxImagePlugin.cpython-312.pyc | Bin 7723 -> 7723 bytes .../FtexImagePlugin.cpython-312.pyc | Bin 5310 -> 5310 bytes .../GbrImagePlugin.cpython-312.pyc | Bin 3687 -> 3687 bytes .../GifImagePlugin.cpython-312.pyc | Bin 45519 -> 45519 bytes .../GimpGradientFile.cpython-312.pyc | Bin 5541 -> 5541 bytes .../GimpPaletteFile.cpython-312.pyc | Bin 2749 -> 2749 bytes .../GribStubImagePlugin.cpython-312.pyc | Bin 2757 -> 2757 bytes .../Hdf5StubImagePlugin.cpython-312.pyc | Bin 2675 -> 2675 bytes .../IcnsImagePlugin.cpython-312.pyc | Bin 16843 -> 16843 bytes .../IcoImagePlugin.cpython-312.pyc | Bin 15300 -> 15300 bytes .../__pycache__/ImImagePlugin.cpython-312.pyc | Bin 13101 -> 13101 bytes .../PIL/__pycache__/Image.cpython-312.pyc | Bin 174857 -> 174857 bytes .../__pycache__/ImageChops.cpython-312.pyc | Bin 11239 -> 11239 bytes .../__pycache__/ImageColor.cpython-312.pyc | Bin 12488 -> 12488 bytes .../PIL/__pycache__/ImageDraw.cpython-312.pyc | Bin 38638 -> 38638 bytes .../PIL/__pycache__/ImageFile.cpython-312.pyc | Bin 35642 -> 35642 bytes .../PIL/__pycache__/ImageFont.cpython-312.pyc | Bin 67996 -> 67996 bytes .../PIL/__pycache__/ImageMath.cpython-312.pyc | Bin 14458 -> 14458 bytes .../PIL/__pycache__/ImageMode.cpython-312.pyc | Bin 2583 -> 2583 bytes .../PIL/__pycache__/ImageOps.cpython-312.pyc | Bin 30395 -> 30395 bytes .../__pycache__/ImagePalette.cpython-312.pyc | Bin 12169 -> 12169 bytes .../__pycache__/ImageSequence.cpython-312.pyc | Bin 3416 -> 3416 bytes .../PIL/__pycache__/ImageText.cpython-312.pyc | Bin 12669 -> 12669 bytes .../ImtImagePlugin.cpython-312.pyc | Bin 2548 -> 2548 bytes .../IptcImagePlugin.cpython-312.pyc | Bin 8092 -> 8092 bytes .../Jpeg2KImagePlugin.cpython-312.pyc | Bin 18272 -> 18272 bytes .../JpegImagePlugin.cpython-312.pyc | Bin 33431 -> 33431 bytes .../__pycache__/JpegPresets.cpython-312.pyc | Bin 8128 -> 8128 bytes .../McIdasImagePlugin.cpython-312.pyc | Bin 2226 -> 2226 bytes .../MicImagePlugin.cpython-312.pyc | Bin 3667 -> 3667 bytes .../MpegImagePlugin.cpython-312.pyc | Bin 3628 -> 3628 bytes .../MpoImagePlugin.cpython-312.pyc | Bin 8786 -> 8786 bytes .../MspImagePlugin.cpython-312.pyc | Bin 5996 -> 5996 bytes .../__pycache__/PaletteFile.cpython-312.pyc | Bin 1931 -> 1931 bytes .../PalmImagePlugin.cpython-312.pyc | Bin 9166 -> 9166 bytes .../PcdImagePlugin.cpython-312.pyc | Bin 2472 -> 2472 bytes .../PcxImagePlugin.cpython-312.pyc | Bin 7408 -> 7408 bytes .../PdfImagePlugin.cpython-312.pyc | Bin 9745 -> 9745 bytes .../PIL/__pycache__/PdfParser.cpython-312.pyc | Bin 52857 -> 52857 bytes .../PixarImagePlugin.cpython-312.pyc | Bin 1966 -> 1966 bytes .../PngImagePlugin.cpython-312.pyc | Bin 62367 -> 62367 bytes .../PpmImagePlugin.cpython-312.pyc | Bin 14196 -> 14196 bytes .../PsdImagePlugin.cpython-312.pyc | Bin 11047 -> 11047 bytes .../QoiImagePlugin.cpython-312.pyc | Bin 11320 -> 11320 bytes .../SgiImagePlugin.cpython-312.pyc | Bin 8029 -> 8029 bytes .../SpiderImagePlugin.cpython-312.pyc | Bin 12476 -> 12476 bytes .../SunImagePlugin.cpython-312.pyc | Bin 3420 -> 3420 bytes .../TgaImagePlugin.cpython-312.pyc | Bin 8096 -> 8096 bytes .../TiffImagePlugin.cpython-312.pyc | Bin 101758 -> 101758 bytes .../PIL/__pycache__/TiffTags.cpython-312.pyc | Bin 18962 -> 18962 bytes .../WebPImagePlugin.cpython-312.pyc | Bin 13169 -> 13169 bytes .../WmfImagePlugin.cpython-312.pyc | Bin 6379 -> 6379 bytes .../XVThumbImagePlugin.cpython-312.pyc | Bin 2632 -> 2632 bytes .../XbmImagePlugin.cpython-312.pyc | Bin 4109 -> 4109 bytes .../XpmImagePlugin.cpython-312.pyc | Bin 6159 -> 6159 bytes .../PIL/__pycache__/__init__.cpython-312.pyc | Bin 2045 -> 2045 bytes .../PIL/__pycache__/_binary.cpython-312.pyc | Bin 3436 -> 3436 bytes .../__pycache__/_deprecate.cpython-312.pyc | Bin 2510 -> 2510 bytes .../PIL/__pycache__/_typing.cpython-312.pyc | Bin 1624 -> 1624 bytes .../PIL/__pycache__/_util.cpython-312.pyc | Bin 1580 -> 1580 bytes .../PIL/__pycache__/_version.cpython-312.pyc | Bin 265 -> 265 bytes .../PIL/__pycache__/features.cpython-312.pyc | Bin 13514 -> 13514 bytes .../__pycache__/png.cpython-312.pyc | Bin 87963 -> 87963 bytes .../__pycache__/py.cpython-312.pyc | Bin 0 -> 415 bytes .../__pycache__/six.cpython-312.pyc | Bin 41413 -> 41413 bytes .../typing_extensions.cpython-312.pyc | Bin 163758 -> 163758 bytes .../site-packages/_pytest/__init__.py | 8 +- .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 425 bytes .../__pycache__/_argcomplete.cpython-312.pyc | Bin 0 -> 4962 bytes .../__pycache__/_version.cpython-312.pyc | Bin 0 -> 592 bytes .../__pycache__/cacheprovider.cpython-312.pyc | Bin 0 -> 30595 bytes .../__pycache__/capture.cpython-312.pyc | Bin 0 -> 53953 bytes .../__pycache__/compat.cpython-312.pyc | Bin 0 -> 15287 bytes .../__pycache__/debugging.cpython-312.pyc | Bin 0 -> 18110 bytes .../__pycache__/deprecated.cpython-312.pyc | Bin 0 -> 4699 bytes .../__pycache__/doctest.cpython-312.pyc | Bin 0 -> 34174 bytes .../__pycache__/faulthandler.cpython-312.pyc | Bin 0 -> 4331 bytes .../__pycache__/fixtures.cpython-312.pyc | Bin 0 -> 71919 bytes .../freeze_support.cpython-312.pyc | Bin 0 -> 1873 bytes .../__pycache__/helpconfig.cpython-312.pyc | Bin 0 -> 12167 bytes .../__pycache__/hookspec.cpython-312.pyc | Bin 0 -> 35122 bytes .../__pycache__/junitxml.cpython-312.pyc | Bin 0 -> 34416 bytes .../__pycache__/legacypath.cpython-312.pyc | Bin 0 -> 25026 bytes .../__pycache__/logging.cpython-312.pyc | Bin 0 -> 45236 bytes .../_pytest/__pycache__/main.cpython-312.pyc | Bin 0 -> 39767 bytes .../__pycache__/monkeypatch.cpython-312.pyc | Bin 0 -> 16805 bytes .../_pytest/__pycache__/nodes.cpython-312.pyc | Bin 0 -> 31293 bytes .../_pytest/__pycache__/nose.cpython-312.pyc | Bin 0 -> 2018 bytes .../__pycache__/outcomes.cpython-312.pyc | Bin 0 -> 12180 bytes .../__pycache__/pastebin.cpython-312.pyc | Bin 0 -> 5715 bytes .../__pycache__/pathlib.cpython-312.pyc | Bin 0 -> 33921 bytes .../__pycache__/pytester.cpython-312.pyc | Bin 0 -> 85237 bytes .../pytester_assertions.cpython-312.pyc | Bin 0 -> 2491 bytes .../__pycache__/python.cpython-312.pyc | Bin 0 -> 82073 bytes .../__pycache__/python_api.cpython-312.pyc | Bin 0 -> 43210 bytes .../__pycache__/python_path.cpython-312.pyc | Bin 0 -> 1587 bytes .../__pycache__/recwarn.cpython-312.pyc | Bin 0 -> 13888 bytes .../__pycache__/reports.cpython-312.pyc | Bin 0 -> 25036 bytes .../__pycache__/runner.cpython-312.pyc | Bin 0 -> 23059 bytes .../_pytest/__pycache__/scope.cpython-312.pyc | Bin 0 -> 3753 bytes .../__pycache__/setuponly.cpython-312.pyc | Bin 0 -> 4942 bytes .../__pycache__/setupplan.cpython-312.pyc | Bin 0 -> 1950 bytes .../__pycache__/skipping.cpython-312.pyc | Bin 0 -> 13503 bytes .../_pytest/__pycache__/stash.cpython-312.pyc | Bin 0 -> 4448 bytes .../__pycache__/stepwise.cpython-312.pyc | Bin 0 -> 5758 bytes .../__pycache__/terminal.cpython-312.pyc | Bin 0 -> 72330 bytes .../threadexception.cpython-312.pyc | Bin 0 -> 4537 bytes .../__pycache__/timing.cpython-312.pyc | Bin 0 -> 592 bytes .../__pycache__/tmpdir.cpython-312.pyc | Bin 0 -> 13166 bytes .../__pycache__/unittest.cpython-312.pyc | Bin 0 -> 18266 bytes .../unraisableexception.cpython-312.pyc | Bin 0 -> 4567 bytes .../__pycache__/warning_types.cpython-312.pyc | Bin 0 -> 6931 bytes .../__pycache__/warnings.cpython-312.pyc | Bin 0 -> 6656 bytes .../site-packages/_pytest/_argcomplete.py | 11 +- .../site-packages/_pytest/_code/__init__.py | 12 +- .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 643 bytes .../_code/__pycache__/code.cpython-312.pyc | Bin 0 -> 60144 bytes .../_code/__pycache__/source.cpython-312.pyc | Bin 0 -> 11426 bytes .../site-packages/_pytest/_code/code.py | 666 ++--- .../site-packages/_pytest/_code/source.py | 74 +- .../site-packages/_pytest/_io/__init__.py | 2 - .../_io/__pycache__/__init__.cpython-312.pyc | Bin 0 -> 334 bytes .../_io/__pycache__/saferepr.cpython-312.pyc | Bin 0 -> 7557 bytes .../terminalwriter.cpython-312.pyc | Bin 0 -> 10097 bytes .../_io/__pycache__/wcwidth.cpython-312.pyc | Bin 0 -> 1675 bytes .../site-packages/_pytest/_io/pprint.py | 673 ----- .../site-packages/_pytest/_io/saferepr.py | 66 +- .../_pytest/_io/terminalwriter.py | 149 +- .../site-packages/_pytest/_io/wcwidth.py | 4 +- .../_py/__pycache__/__init__.cpython-312.pyc | Bin 0 -> 194 bytes .../_py/__pycache__/error.cpython-312.pyc | Bin 0 -> 4798 bytes .../_py/__pycache__/path.cpython-312.pyc | Bin 0 -> 68782 bytes .../site-packages/_pytest/_py/error.py | 22 +- .../site-packages/_pytest/_py/path.py | 92 +- .../site-packages/_pytest/_version.py | 26 +- .../_pytest/assertion/__init__.py | 67 +- .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 9189 bytes .../__pycache__/rewrite.cpython-312.pyc | Bin 0 -> 62503 bytes .../__pycache__/truncate.cpython-312.pyc | Bin 0 -> 3663 bytes .../__pycache__/util.cpython-312.pyc | Bin 0 -> 21235 bytes .../_pytest/assertion/rewrite.py | 443 +-- .../_pytest/assertion/truncate.py | 78 +- .../site-packages/_pytest/assertion/util.py | 329 +-- .../site-packages/_pytest/cacheprovider.py | 224 +- .../site-packages/_pytest/capture.py | 286 +- .../site-packages/_pytest/compat.py | 259 +- .../site-packages/_pytest/config/__init__.py | 1302 ++++----- .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 76105 bytes .../__pycache__/argparsing.cpython-312.pyc | Bin 0 -> 26880 bytes .../config/__pycache__/compat.cpython-312.pyc | Bin 0 -> 2914 bytes .../__pycache__/exceptions.cpython-312.pyc | Bin 0 -> 766 bytes .../__pycache__/findpaths.cpython-312.pyc | Bin 0 -> 9208 bytes .../_pytest/config/argparsing.py | 451 ++- .../site-packages/_pytest/config/compat.py | 45 +- .../_pytest/config/exceptions.py | 6 +- .../site-packages/_pytest/config/findpaths.py | 234 +- .../site-packages/_pytest/debugging.py | 128 +- .../site-packages/_pytest/deprecated.py | 91 +- .../site-packages/_pytest/doctest.py | 277 +- .../site-packages/_pytest/faulthandler.py | 55 +- .../site-packages/_pytest/fixtures.py | 2010 ++++++------- .../site-packages/_pytest/freeze_support.py | 13 +- .../site-packages/_pytest/helpconfig.py | 157 +- .../site-packages/_pytest/hookspec.py | 707 ++--- .../site-packages/_pytest/junitxml.py | 111 +- .../site-packages/_pytest/legacypath.py | 65 +- .../site-packages/_pytest/logging.py | 244 +- .../python3.12/site-packages/_pytest/main.py | 1000 +++---- .../site-packages/_pytest/mark/__init__.py | 122 +- .../mark/__pycache__/__init__.cpython-312.pyc | Bin 0 -> 11604 bytes .../__pycache__/expression.cpython-312.pyc | Bin 0 -> 11489 bytes .../__pycache__/structures.cpython-312.pyc | Bin 0 -> 26337 bytes .../site-packages/_pytest/mark/expression.py | 231 +- .../site-packages/_pytest/mark/structures.py | 282 +- .../site-packages/_pytest/monkeypatch.py | 88 +- .../python3.12/site-packages/_pytest/nodes.py | 347 +-- .../python3.12/site-packages/_pytest/nose.py | 50 + .../site-packages/_pytest/outcomes.py | 249 +- .../site-packages/_pytest/pastebin.py | 25 +- .../site-packages/_pytest/pathlib.py | 549 +--- .../site-packages/_pytest/pytester.py | 412 ++- .../_pytest/pytester_assertions.py | 21 +- .../site-packages/_pytest/python.py | 1229 ++++---- .../site-packages/_pytest/python_api.py | 476 +++- .../site-packages/_pytest/python_path.py | 24 + .../site-packages/_pytest/raises.py | 1517 ---------- .../site-packages/_pytest/recwarn.py | 250 +- .../site-packages/_pytest/reports.py | 268 +- .../site-packages/_pytest/runner.py | 219 +- .../python3.12/site-packages/_pytest/scope.py | 30 +- .../site-packages/_pytest/setuponly.py | 69 +- .../site-packages/_pytest/setupplan.py | 9 +- .../site-packages/_pytest/skipping.py | 106 +- .../python3.12/site-packages/_pytest/stash.py | 12 +- .../site-packages/_pytest/stepwise.py | 135 +- .../site-packages/_pytest/subtests.py | 411 --- .../site-packages/_pytest/terminal.py | 723 ++--- .../site-packages/_pytest/threadexception.py | 206 +- .../site-packages/_pytest/timing.py | 83 - .../site-packages/_pytest/tmpdir.py | 102 +- .../site-packages/_pytest/tracemalloc.py | 24 - .../site-packages/_pytest/unittest.py | 609 ++-- .../_pytest/unraisableexception.py | 222 +- .../site-packages/_pytest/warning_types.py | 42 +- .../site-packages/_pytest/warnings.py | 145 +- .../__pycache__/__init__.cpython-312.pyc | Bin 528 -> 528 bytes .../aiofiles/__pycache__/base.cpython-312.pyc | Bin 6432 -> 6432 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 8390 -> 8390 bytes .../__pycache__/temptypes.cpython-312.pyc | Bin 3754 -> 3754 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 4579 -> 4579 bytes .../__pycache__/binary.cpython-312.pyc | Bin 2896 -> 2896 bytes .../__pycache__/text.cpython-312.pyc | Bin 1542 -> 1542 bytes .../__pycache__/utils.cpython-312.pyc | Bin 3931 -> 3931 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 1360 -> 1360 bytes .../__pycache__/api.cpython-312.pyc | Bin 6939 -> 6939 bytes .../__pycache__/auth.cpython-312.pyc | Bin 2733 -> 2733 bytes .../__pycache__/email.cpython-312.pyc | Bin 7419 -> 7419 bytes .../__pycache__/errors.cpython-312.pyc | Bin 5246 -> 5246 bytes .../__pycache__/esmtp.cpython-312.pyc | Bin 2560 -> 2560 bytes .../__pycache__/protocol.cpython-312.pyc | Bin 17934 -> 17934 bytes .../__pycache__/response.cpython-312.pyc | Bin 1386 -> 1386 bytes .../__pycache__/smtp.cpython-312.pyc | Bin 61624 -> 61624 bytes .../__pycache__/typing.cpython-312.pyc | Bin 2107 -> 2107 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 302 -> 302 bytes .../__pycache__/command.cpython-312.pyc | Bin 27371 -> 27371 bytes .../__pycache__/config.cpython-312.pyc | Bin 23070 -> 23070 bytes .../__pycache__/context.cpython-312.pyc | Bin 381 -> 381 bytes .../alembic/__pycache__/op.cpython-312.pyc | Bin 363 -> 363 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 629 -> 629 bytes .../__pycache__/api.cpython-312.pyc | Bin 22246 -> 22246 bytes .../__pycache__/compare.cpython-312.pyc | Bin 48838 -> 48838 bytes .../__pycache__/render.cpython-312.pyc | Bin 44953 -> 44953 bytes .../__pycache__/rewriter.cpython-312.pyc | Bin 9177 -> 9177 bytes .../ddl/__pycache__/__init__.cpython-312.pyc | Bin 391 -> 391 bytes .../ddl/__pycache__/base.cpython-312.pyc | Bin 15542 -> 15542 bytes .../ddl/__pycache__/impl.cpython-312.pyc | Bin 30495 -> 30495 bytes .../ddl/__pycache__/mssql.cpython-312.pyc | Bin 16070 -> 16070 bytes .../ddl/__pycache__/mysql.cpython-312.pyc | Bin 15902 -> 15902 bytes .../ddl/__pycache__/oracle.cpython-312.pyc | Bin 8520 -> 8520 bytes .../__pycache__/postgresql.cpython-312.pyc | Bin 31178 -> 31178 bytes .../ddl/__pycache__/sqlite.cpython-312.pyc | Bin 7514 -> 7514 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 491 -> 491 bytes .../__pycache__/base.cpython-312.pyc | Bin 76001 -> 76001 bytes .../__pycache__/batch.cpython-312.pyc | Bin 31473 -> 31473 bytes .../__pycache__/ops.cpython-312.pyc | Bin 108712 -> 108712 bytes .../__pycache__/schemaobj.cpython-312.pyc | Bin 11872 -> 11872 bytes .../__pycache__/toimpl.cpython-312.pyc | Bin 11157 -> 11157 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 198 -> 198 bytes .../__pycache__/environment.cpython-312.pyc | Bin 43648 -> 43648 bytes .../__pycache__/migration.cpython-312.pyc | Bin 58805 -> 58805 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 311 -> 311 bytes .../script/__pycache__/base.cpython-312.pyc | Bin 43592 -> 43592 bytes .../__pycache__/revision.cpython-312.pyc | Bin 61907 -> 61907 bytes .../__pycache__/write_hooks.cpython-312.pyc | Bin 6589 -> 6589 bytes .../util/__pycache__/__init__.cpython-312.pyc | Bin 1446 -> 1446 bytes .../util/__pycache__/compat.cpython-312.pyc | Bin 3233 -> 3233 bytes .../util/__pycache__/editor.cpython-312.pyc | Bin 3245 -> 3245 bytes .../util/__pycache__/exc.cpython-312.pyc | Bin 535 -> 535 bytes .../__pycache__/langhelpers.cpython-312.pyc | Bin 12473 -> 12473 bytes .../__pycache__/messaging.cpython-312.pyc | Bin 4840 -> 4840 bytes .../util/__pycache__/pyfiles.cpython-312.pyc | Bin 5142 -> 5142 bytes .../__pycache__/sqla_compat.cpython-312.pyc | Bin 24767 -> 24767 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 260 -> 260 bytes .../__pycache__/main.cpython-312.pyc | Bin 1908 -> 1908 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 18629 -> 18629 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 3526 -> 3526 bytes .../__pycache__/from_thread.cpython-312.pyc | Bin 22868 -> 22868 bytes .../__pycache__/lowlevel.cpython-312.pyc | Bin 7272 -> 7272 bytes .../__pycache__/to_thread.cpython-312.pyc | Bin 2819 -> 2819 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 198 -> 198 bytes .../__pycache__/_asyncio.cpython-312.pyc | Bin 101195 -> 101195 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 194 -> 194 bytes .../_core/__pycache__/_compat.cpython-312.pyc | Bin 9852 -> 9852 bytes .../__pycache__/_eventloop.cpython-312.pyc | Bin 5914 -> 5914 bytes .../__pycache__/_exceptions.cpython-312.pyc | Bin 5540 -> 5540 bytes .../_core/__pycache__/_fileio.cpython-312.pyc | Bin 34894 -> 34894 bytes .../__pycache__/_resources.cpython-312.pyc | Bin 947 -> 947 bytes .../__pycache__/_signals.cpython-312.pyc | Bin 1231 -> 1231 bytes .../__pycache__/_sockets.cpython-312.pyc | Bin 24454 -> 24454 bytes .../__pycache__/_streams.cpython-312.pyc | Bin 2064 -> 2064 bytes .../__pycache__/_subprocesses.cpython-312.pyc | Bin 6617 -> 6617 bytes .../_synchronization.cpython-312.pyc | Bin 25208 -> 25208 bytes .../_core/__pycache__/_tasks.cpython-312.pyc | Bin 7789 -> 7789 bytes .../__pycache__/_testing.cpython-312.pyc | Bin 3741 -> 3741 bytes .../__pycache__/_typedattr.cpython-312.pyc | Bin 3894 -> 3894 bytes .../abc/__pycache__/__init__.cpython-312.pyc | Bin 2087 -> 2087 bytes .../__pycache__/_resources.cpython-312.pyc | Bin 1614 -> 1614 bytes .../abc/__pycache__/_sockets.cpython-312.pyc | Bin 8146 -> 8146 bytes .../abc/__pycache__/_streams.cpython-312.pyc | Bin 8417 -> 8417 bytes .../__pycache__/_subprocesses.cpython-312.pyc | Bin 3249 -> 3249 bytes .../abc/__pycache__/_tasks.cpython-312.pyc | Bin 4874 -> 4874 bytes .../abc/__pycache__/_testing.cpython-312.pyc | Bin 3033 -> 3033 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 196 -> 196 bytes .../__pycache__/memory.cpython-312.pyc | Bin 12922 -> 12922 bytes .../__pycache__/stapled.cpython-312.pyc | Bin 7524 -> 7524 bytes .../streams/__pycache__/tls.cpython-312.pyc | Bin 16939 -> 16939 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 583 -> 583 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 3871 -> 3871 bytes .../__pycache__/callbacks.cpython-312.pyc | Bin 1274 -> 1274 bytes .../__pycache__/html5lib_shim.cpython-312.pyc | Bin 18728 -> 18728 bytes .../__pycache__/linkifier.cpython-312.pyc | Bin 18371 -> 18371 bytes .../__pycache__/parse_shim.cpython-312.pyc | Bin 247 -> 247 bytes .../__pycache__/sanitizer.cpython-312.pyc | Bin 17928 -> 17928 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 197 -> 197 bytes .../_vendor/__pycache__/parse.cpython-312.pyc | Bin 43429 -> 43429 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 1328 -> 1328 bytes .../__pycache__/_inputstream.cpython-312.pyc | Bin 35323 -> 35323 bytes .../__pycache__/_tokenizer.cpython-312.pyc | Bin 87200 -> 87200 bytes .../__pycache__/_utils.cpython-312.pyc | Bin 6695 -> 6695 bytes .../__pycache__/constants.cpython-312.pyc | Bin 117443 -> 117443 bytes .../__pycache__/html5parser.cpython-312.pyc | Bin 155917 -> 155917 bytes .../__pycache__/serializer.cpython-312.pyc | Bin 15846 -> 15846 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 378 -> 378 bytes .../_trie/__pycache__/_base.cpython-312.pyc | Bin 1969 -> 1969 bytes .../_trie/__pycache__/py.cpython-312.pyc | Bin 3660 -> 3660 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 214 -> 214 bytes .../filters/__pycache__/base.cpython-312.pyc | Bin 1020 -> 1020 bytes .../__pycache__/sanitizer.cpython-312.pyc | Bin 28524 -> 28524 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 3716 -> 3716 bytes .../__pycache__/base.cpython-312.pyc | Bin 16075 -> 16075 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 5648 -> 5648 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 317 -> 317 bytes .../certifi/__pycache__/core.cpython-312.pyc | Bin 2064 -> 2064 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 1783 -> 1783 bytes .../__pycache__/api.cpython-312.pyc | Bin 18194 -> 18194 bytes .../__pycache__/cd.cpython-312.pyc | Bin 13299 -> 13299 bytes .../__pycache__/constant.cpython-312.pyc | Bin 40813 -> 40813 bytes .../__pycache__/legacy.cpython-312.pyc | Bin 3013 -> 3013 bytes .../__pycache__/models.cpython-312.pyc | Bin 17130 -> 17130 bytes .../__pycache__/utils.cpython-312.pyc | Bin 13759 -> 13759 bytes .../__pycache__/version.cpython-312.pyc | Bin 385 -> 385 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 4074 -> 4074 bytes .../click/__pycache__/_compat.cpython-312.pyc | Bin 24196 -> 24196 bytes .../click/__pycache__/_utils.cpython-312.pyc | Bin 1202 -> 1202 bytes .../click/__pycache__/core.cpython-312.pyc | Bin 134668 -> 134668 bytes .../__pycache__/decorators.cpython-312.pyc | Bin 22139 -> 22139 bytes .../__pycache__/exceptions.cpython-312.pyc | Bin 14778 -> 14778 bytes .../__pycache__/formatting.cpython-312.pyc | Bin 13674 -> 13674 bytes .../click/__pycache__/globals.cpython-312.pyc | Bin 2967 -> 2967 bytes .../click/__pycache__/parser.cpython-312.pyc | Bin 20444 -> 20444 bytes .../click/__pycache__/termui.cpython-312.pyc | Bin 34653 -> 34653 bytes .../click/__pycache__/types.cpython-312.pyc | Bin 50040 -> 50040 bytes .../click/__pycache__/utils.cpython-312.pyc | Bin 24881 -> 24881 bytes .../__pycache__/__about__.cpython-312.pyc | Bin 467 -> 467 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 377 -> 377 bytes .../__pycache__/exceptions.cpython-312.pyc | Bin 2391 -> 2391 bytes .../__pycache__/fernet.cpython-312.pyc | Bin 11141 -> 11141 bytes .../__pycache__/utils.cpython-312.pyc | Bin 6567 -> 6567 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 258 -> 258 bytes .../hazmat/__pycache__/_oid.cpython-312.pyc | Bin 21048 -> 21048 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 508 -> 508 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 374 -> 374 bytes .../__pycache__/backend.cpython-312.pyc | Bin 13516 -> 13516 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 211 -> 211 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 219 -> 219 bytes .../__pycache__/_conditional.cpython-312.pyc | Bin 5795 -> 5795 bytes .../__pycache__/binding.cpython-312.pyc | Bin 5620 -> 5620 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 262 -> 262 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 270 -> 270 bytes .../__pycache__/algorithms.cpython-312.pyc | Bin 4802 -> 4802 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 213 -> 213 bytes .../__pycache__/_asymmetric.cpython-312.pyc | Bin 819 -> 819 bytes .../_cipheralgorithm.cpython-312.pyc | Bin 2499 -> 2499 bytes .../_serialization.cpython-312.pyc | Bin 7043 -> 7043 bytes .../__pycache__/constant_time.cpython-312.pyc | Bin 679 -> 679 bytes .../__pycache__/hashes.cpython-312.pyc | Bin 8283 -> 8283 bytes .../__pycache__/hmac.cpython-312.pyc | Bin 600 -> 600 bytes .../__pycache__/keywrap.cpython-312.pyc | Bin 7477 -> 7477 bytes .../__pycache__/padding.cpython-312.pyc | Bin 3264 -> 3264 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 224 -> 224 bytes .../asymmetric/__pycache__/dh.cpython-312.pyc | Bin 6086 -> 6086 bytes .../__pycache__/dsa.cpython-312.pyc | Bin 6932 -> 6932 bytes .../asymmetric/__pycache__/ec.cpython-312.pyc | Bin 17840 -> 17840 bytes .../__pycache__/ed25519.cpython-312.pyc | Bin 5620 -> 5620 bytes .../__pycache__/ed448.cpython-312.pyc | Bin 5663 -> 5663 bytes .../__pycache__/padding.cpython-312.pyc | Bin 4834 -> 4834 bytes .../__pycache__/rsa.cpython-312.pyc | Bin 10449 -> 10449 bytes .../__pycache__/types.cpython-312.pyc | Bin 3173 -> 3173 bytes .../__pycache__/utils.cpython-312.pyc | Bin 1338 -> 1338 bytes .../__pycache__/x25519.cpython-312.pyc | Bin 5417 -> 5417 bytes .../__pycache__/x448.cpython-312.pyc | Bin 5458 -> 5458 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 652 -> 652 bytes .../ciphers/__pycache__/aead.cpython-312.pyc | Bin 842 -> 842 bytes .../__pycache__/algorithms.cpython-312.pyc | Bin 4918 -> 4918 bytes .../ciphers/__pycache__/base.cpython-312.pyc | Bin 7099 -> 7099 bytes .../ciphers/__pycache__/modes.cpython-312.pyc | Bin 11811 -> 11811 bytes .../kdf/__pycache__/__init__.cpython-312.pyc | Bin 1260 -> 1260 bytes .../kdf/__pycache__/pbkdf2.cpython-312.pyc | Bin 2739 -> 2739 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 1392 -> 1392 bytes .../__pycache__/base.cpython-312.pyc | Bin 857 -> 857 bytes .../__pycache__/ssh.cpython-312.pyc | Bin 67207 -> 67207 bytes .../x509/__pycache__/__init__.cpython-312.pyc | Bin 8455 -> 8455 bytes .../x509/__pycache__/base.cpython-312.pyc | Bin 33525 -> 33525 bytes .../certificate_transparency.cpython-312.pyc | Bin 1421 -> 1421 bytes .../__pycache__/extensions.cpython-312.pyc | Bin 112578 -> 112578 bytes .../__pycache__/general_name.cpython-312.pyc | Bin 13100 -> 13100 bytes .../x509/__pycache__/name.cpython-312.pyc | Bin 23233 -> 23233 bytes .../x509/__pycache__/oid.cpython-312.pyc | Bin 774 -> 774 bytes .../__pycache__/verification.cpython-312.pyc | Bin 1020 -> 1020 bytes .../__pycache__/ElementTree.cpython-312.pyc | Bin 5198 -> 5198 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 1607 -> 1607 bytes .../__pycache__/common.cpython-312.pyc | Bin 5931 -> 5931 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 633 -> 633 bytes .../__pycache__/classic.cpython-312.pyc | Bin 12058 -> 12058 bytes .../__pycache__/params.cpython-312.pyc | Bin 4195 -> 4195 bytes .../__pycache__/sphinx.cpython-312.pyc | Bin 11566 -> 11566 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 1698 -> 1698 bytes .../dotenv/__pycache__/main.cpython-312.pyc | Bin 16171 -> 16171 bytes .../dotenv/__pycache__/parser.cpython-312.pyc | Bin 10004 -> 10004 bytes .../__pycache__/variables.cpython-312.pyc | Bin 5035 -> 5035 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 1004 -> 1004 bytes .../exceptions_types.cpython-312.pyc | Bin 6145 -> 6145 bytes .../__pycache__/rfc_constants.cpython-312.pyc | Bin 1778 -> 1778 bytes .../__pycache__/syntax.cpython-312.pyc | Bin 16441 -> 16441 bytes .../validate_email.cpython-312.pyc | Bin 4752 -> 4752 bytes .../__pycache__/version.cpython-312.pyc | Bin 223 -> 223 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 1105 -> 1105 bytes .../__pycache__/applications.cpython-312.pyc | Bin 86444 -> 86444 bytes .../__pycache__/background.cpython-312.pyc | Bin 2403 -> 2403 bytes .../__pycache__/concurrency.cpython-312.pyc | Bin 1679 -> 1679 bytes .../datastructures.cpython-312.pyc | Bin 8171 -> 8171 bytes .../__pycache__/encoders.cpython-312.pyc | Bin 11300 -> 11300 bytes .../exception_handlers.cpython-312.pyc | Bin 2032 -> 2032 bytes .../__pycache__/exceptions.cpython-312.pyc | Bin 7470 -> 7470 bytes .../__pycache__/logger.cpython-312.pyc | Bin 292 -> 292 bytes .../param_functions.cpython-312.pyc | Bin 36251 -> 36251 bytes .../__pycache__/params.cpython-312.pyc | Bin 24274 -> 24274 bytes .../__pycache__/requests.cpython-312.pyc | Bin 281 -> 281 bytes .../__pycache__/responses.cpython-312.pyc | Bin 2409 -> 2409 bytes .../__pycache__/routing.cpython-312.pyc | Bin 86074 -> 86074 bytes .../__pycache__/staticfiles.cpython-312.pyc | Bin 253 -> 253 bytes .../temp_pydantic_v1_params.cpython-312.pyc | Bin 22925 -> 22925 bytes .../fastapi/__pycache__/types.cpython-312.pyc | Bin 898 -> 898 bytes .../fastapi/__pycache__/utils.cpython-312.pyc | Bin 9534 -> 9534 bytes .../__pycache__/websockets.cpython-312.pyc | Bin 330 -> 330 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 2124 -> 2124 bytes .../_compat/__pycache__/main.cpython-312.pyc | Bin 12146 -> 12146 bytes .../__pycache__/may_v1.cpython-312.pyc | Bin 5092 -> 5092 bytes .../__pycache__/model_field.cpython-312.pyc | Bin 2571 -> 2571 bytes .../__pycache__/shared.cpython-312.pyc | Bin 8866 -> 8866 bytes .../_compat/__pycache__/v1.cpython-312.pyc | Bin 11111 -> 11111 bytes .../_compat/__pycache__/v2.cpython-312.pyc | Bin 20260 -> 20260 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 203 -> 203 bytes .../__pycache__/models.cpython-312.pyc | Bin 5836 -> 5836 bytes .../__pycache__/utils.cpython-312.pyc | Bin 40360 -> 40360 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 259 -> 259 bytes .../asyncexitstack.cpython-312.pyc | Bin 1511 -> 1511 bytes .../__pycache__/cors.cpython-312.pyc | Bin 264 -> 264 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 198 -> 198 bytes .../__pycache__/constants.cpython-312.pyc | Bin 368 -> 368 bytes .../openapi/__pycache__/docs.cpython-312.pyc | Bin 10850 -> 10850 bytes .../__pycache__/models.cpython-312.pyc | Bin 23134 -> 23134 bytes .../openapi/__pycache__/utils.cpython-312.pyc | Bin 20847 -> 20847 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 855 -> 855 bytes .../__pycache__/api_key.cpython-312.pyc | Bin 10521 -> 10521 bytes .../security/__pycache__/base.cpython-312.pyc | Bin 517 -> 517 bytes .../security/__pycache__/http.cpython-312.pyc | Bin 14591 -> 14591 bytes .../__pycache__/oauth2.cpython-312.pyc | Bin 19320 -> 19320 bytes .../open_id_connect_url.cpython-312.pyc | Bin 3803 -> 3803 bytes .../__pycache__/utils.cpython-312.pyc | Bin 610 -> 610 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 1077 -> 1077 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 343 -> 343 bytes .../__pycache__/_version.cpython-312.pyc | Bin 220 -> 220 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 433 -> 433 bytes .../parser/__pycache__/errors.cpython-312.pyc | Bin 1217 -> 1217 bytes .../__pycache__/protocol.cpython-312.pyc | Bin 1821 -> 1821 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 2127 -> 2127 bytes .../__pycache__/__version__.cpython-312.pyc | Bin 317 -> 317 bytes .../httpx/__pycache__/_api.cpython-312.pyc | Bin 10352 -> 10352 bytes .../httpx/__pycache__/_auth.cpython-312.pyc | Bin 15604 -> 15604 bytes .../httpx/__pycache__/_client.cpython-312.pyc | Bin 64189 -> 64189 bytes .../httpx/__pycache__/_config.cpython-312.pyc | Bin 10985 -> 10985 bytes .../__pycache__/_content.cpython-312.pyc | Bin 10410 -> 10410 bytes .../__pycache__/_decoders.cpython-312.pyc | Bin 16762 -> 16762 bytes .../__pycache__/_exceptions.cpython-312.pyc | Bin 12087 -> 12087 bytes .../httpx/__pycache__/_main.cpython-312.pyc | Bin 20625 -> 20625 bytes .../httpx/__pycache__/_models.cpython-312.pyc | Bin 58599 -> 58599 bytes .../__pycache__/_multipart.cpython-312.pyc | Bin 13610 -> 13610 bytes .../__pycache__/_status_codes.cpython-312.pyc | Bin 7197 -> 7197 bytes .../httpx/__pycache__/_types.cpython-312.pyc | Bin 3829 -> 3829 bytes .../__pycache__/_urlparse.cpython-312.pyc | Bin 17490 -> 17490 bytes .../httpx/__pycache__/_urls.cpython-312.pyc | Bin 27933 -> 27933 bytes .../httpx/__pycache__/_utils.cpython-312.pyc | Bin 9366 -> 9366 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 446 -> 446 bytes .../__pycache__/asgi.cpython-312.pyc | Bin 7583 -> 7583 bytes .../__pycache__/base.cpython-312.pyc | Bin 3876 -> 3876 bytes .../__pycache__/default.cpython-312.pyc | Bin 17129 -> 17129 bytes .../__pycache__/mock.cpython-312.pyc | Bin 1944 -> 1944 bytes .../__pycache__/wsgi.cpython-312.pyc | Bin 6818 -> 6818 bytes .../idna/__pycache__/__init__.cpython-312.pyc | Bin 885 -> 885 bytes .../idna/__pycache__/core.cpython-312.pyc | Bin 16197 -> 16197 bytes .../idna/__pycache__/idnadata.cpython-312.pyc | Bin 100914 -> 100914 bytes .../__pycache__/intranges.cpython-312.pyc | Bin 2637 -> 2637 bytes .../__pycache__/package_data.cpython-312.pyc | Bin 216 -> 216 bytes .../__pycache__/uts46data.cpython-312.pyc | Bin 161844 -> 161844 bytes .../jose/__pycache__/__init__.cpython-312.pyc | Bin 491 -> 491 bytes .../__pycache__/constants.cpython-312.pyc | Bin 3163 -> 3163 bytes .../__pycache__/exceptions.cpython-312.pyc | Bin 2284 -> 2284 bytes .../jose/__pycache__/jwk.cpython-312.pyc | Bin 2468 -> 2468 bytes .../jose/__pycache__/jws.cpython-312.pyc | Bin 9770 -> 9770 bytes .../jose/__pycache__/jwt.cpython-312.pyc | Bin 20708 -> 20708 bytes .../jose/__pycache__/utils.cpython-312.pyc | Bin 6836 -> 6836 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 1031 -> 1031 bytes .../backends/__pycache__/base.cpython-312.pyc | Bin 3606 -> 3606 bytes .../cryptography_backend.cpython-312.pyc | Bin 32594 -> 32594 bytes .../__pycache__/native.cpython-312.pyc | Bin 3752 -> 3752 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 877 -> 877 bytes .../__pycache__/_version.cpython-312.pyc | Bin 797 -> 797 bytes .../limits/__pycache__/errors.cpython-312.pyc | Bin 1599 -> 1599 bytes .../limits/__pycache__/limits.cpython-312.pyc | Bin 7825 -> 7825 bytes .../__pycache__/strategies.cpython-312.pyc | Bin 11720 -> 11720 bytes .../limits/__pycache__/typing.cpython-312.pyc | Bin 5816 -> 5816 bytes .../limits/__pycache__/util.cpython-312.pyc | Bin 8202 -> 8202 bytes .../aio/__pycache__/__init__.cpython-312.pyc | Bin 343 -> 343 bytes .../__pycache__/strategies.cpython-312.pyc | Bin 12982 -> 12982 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 813 -> 813 bytes .../storage/__pycache__/base.cpython-312.pyc | Bin 9293 -> 9293 bytes .../__pycache__/memory.cpython-312.pyc | Bin 16536 -> 16536 bytes .../__pycache__/mongodb.cpython-312.pyc | Bin 17244 -> 17244 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 9176 -> 9176 bytes .../__pycache__/bridge.cpython-312.pyc | Bin 4226 -> 4226 bytes .../__pycache__/emcache.cpython-312.pyc | Bin 7538 -> 7538 bytes .../__pycache__/memcachio.cpython-312.pyc | Bin 6913 -> 6913 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 18691 -> 18691 bytes .../redis/__pycache__/bridge.cpython-312.pyc | Bin 6094 -> 6094 bytes .../redis/__pycache__/coredis.cpython-312.pyc | Bin 12866 -> 12866 bytes .../redis/__pycache__/redispy.cpython-312.pyc | Bin 13662 -> 13662 bytes .../redis/__pycache__/valkey.cpython-312.pyc | Bin 796 -> 796 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 3088 -> 3088 bytes .../storage/__pycache__/base.cpython-312.pyc | Bin 9964 -> 9964 bytes .../__pycache__/memcached.cpython-312.pyc | Bin 13420 -> 13420 bytes .../__pycache__/memory.cpython-312.pyc | Bin 14035 -> 14035 bytes .../__pycache__/mongodb.cpython-312.pyc | Bin 15922 -> 15922 bytes .../storage/__pycache__/redis.cpython-312.pyc | Bin 14364 -> 14364 bytes .../__pycache__/redis_cluster.cpython-312.pyc | Bin 6151 -> 6151 bytes .../redis_sentinel.cpython-312.pyc | Bin 5910 -> 5910 bytes .../__pycache__/registry.cpython-312.pyc | Bin 1217 -> 1217 bytes .../mako/__pycache__/__init__.cpython-312.pyc | Bin 216 -> 216 bytes .../__pycache__/_ast_util.cpython-312.pyc | Bin 36426 -> 36426 bytes .../mako/__pycache__/ast.cpython-312.pyc | Bin 7500 -> 7500 bytes .../mako/__pycache__/cache.cpython-312.pyc | Bin 8499 -> 8499 bytes .../mako/__pycache__/codegen.cpython-312.pyc | Bin 59074 -> 59074 bytes .../mako/__pycache__/compat.cpython-312.pyc | Bin 3076 -> 3076 bytes .../__pycache__/exceptions.cpython-312.pyc | Bin 14787 -> 14787 bytes .../mako/__pycache__/filters.cpython-312.pyc | Bin 6708 -> 6708 bytes .../mako/__pycache__/lexer.cpython-312.pyc | Bin 20347 -> 20347 bytes .../__pycache__/parsetree.cpython-312.pyc | Bin 29974 -> 29974 bytes .../mako/__pycache__/pygen.cpython-312.pyc | Bin 11056 -> 11056 bytes .../mako/__pycache__/pyparser.cpython-312.pyc | Bin 12290 -> 12290 bytes .../mako/__pycache__/runtime.cpython-312.pyc | Bin 39115 -> 39115 bytes .../mako/__pycache__/template.cpython-312.pyc | Bin 26801 -> 26801 bytes .../mako/__pycache__/util.cpython-312.pyc | Bin 20381 -> 20381 bytes .../ext/__pycache__/__init__.cpython-312.pyc | Bin 191 -> 191 bytes .../__pycache__/pygmentplugin.cpython-312.pyc | Bin 5921 -> 5921 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 20968 -> 20968 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 557 -> 557 bytes .../__pycache__/_structures.cpython-312.pyc | Bin 3240 -> 3240 bytes .../__pycache__/version.cpython-312.pyc | Bin 20467 -> 20467 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 280 -> 280 bytes .../__pycache__/config.cpython-312.pyc | Bin 925 -> 925 bytes .../core/__pycache__/__init__.cpython-312.pyc | Bin 526 -> 526 bytes .../__pycache__/access_token.cpython-312.pyc | Bin 1262 -> 1262 bytes .../access_token_request.cpython-312.pyc | Bin 1016 -> 1016 bytes .../__pycache__/environment.cpython-312.pyc | Bin 2446 -> 2446 bytes .../paypal_http_client.cpython-312.pyc | Bin 3052 -> 3052 bytes .../refresh_token_request.cpython-312.pyc | Bin 903 -> 903 bytes .../core/__pycache__/util.cpython-312.pyc | Bin 430 -> 430 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 582 -> 582 bytes .../orders_authorize_request.cpython-312.pyc | Bin 2098 -> 2098 bytes .../orders_capture_request.cpython-312.pyc | Bin 2040 -> 2040 bytes .../orders_create_request.cpython-312.pyc | Bin 1617 -> 1617 bytes .../orders_get_request.cpython-312.pyc | Bin 1106 -> 1106 bytes .../orders_patch_request.cpython-312.pyc | Bin 2423 -> 2423 bytes .../orders_validate_request.cpython-312.pyc | Bin 1640 -> 1640 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 689 -> 689 bytes ...orizations_capture_request.cpython-312.pyc | Bin 1863 -> 1863 bytes ...authorizations_get_request.cpython-312.pyc | Bin 1186 -> 1186 bytes ...ations_reauthorize_request.cpython-312.pyc | Bin 2565 -> 2565 bytes ...uthorizations_void_request.cpython-312.pyc | Bin 1272 -> 1272 bytes .../captures_get_request.cpython-312.pyc | Bin 1133 -> 1133 bytes .../captures_refund_request.cpython-312.pyc | Bin 1939 -> 1939 bytes .../refunds_get_request.cpython-312.pyc | Bin 1115 -> 1115 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 517 -> 517 bytes .../__pycache__/encoder.cpython-312.pyc | Bin 2775 -> 2775 bytes .../__pycache__/environment.cpython-312.pyc | Bin 533 -> 533 bytes .../__pycache__/file.cpython-312.pyc | Bin 1858 -> 1858 bytes .../__pycache__/http_client.cpython-312.pyc | Bin 4778 -> 4778 bytes .../__pycache__/http_error.cpython-312.pyc | Bin 823 -> 823 bytes .../__pycache__/http_response.cpython-312.pyc | Bin 3003 -> 3003 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 570 -> 570 bytes .../form_encoded_serializer.cpython-312.pyc | Bin 1370 -> 1370 bytes .../__pycache__/form_part.cpython-312.pyc | Bin 1046 -> 1046 bytes .../json_serializer.cpython-312.pyc | Bin 935 -> 935 bytes .../multipart_serializer.cpython-312.pyc | Bin 5512 -> 5512 bytes .../text_serializer.cpython-312.pyc | Bin 841 -> 841 bytes .../pip/__pycache__/__init__.cpython-312.pyc | Bin 659 -> 659 bytes .../pip/__pycache__/__main__.cpython-312.pyc | Bin 851 -> 851 bytes .../__pip-runner__.cpython-312.pyc | Bin 0 -> 2214 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 761 -> 761 bytes .../__pycache__/build_env.cpython-312.pyc | Bin 18234 -> 18234 bytes .../__pycache__/cache.cpython-312.pyc | Bin 12376 -> 12376 bytes .../__pycache__/configuration.cpython-312.pyc | Bin 18287 -> 18287 bytes .../__pycache__/exceptions.cpython-312.pyc | Bin 40608 -> 40608 bytes .../__pycache__/main.cpython-312.pyc | Bin 0 -> 644 bytes .../__pycache__/pyproject.cpython-312.pyc | Bin 4107 -> 4107 bytes .../self_outdated_check.cpython-312.pyc | Bin 10277 -> 10277 bytes .../__pycache__/wheel_builder.cpython-312.pyc | Bin 10724 -> 10724 bytes .../cli/__pycache__/__init__.cpython-312.pyc | Bin 285 -> 285 bytes .../autocompletion.cpython-312.pyc | Bin 9135 -> 9135 bytes .../__pycache__/base_command.cpython-312.pyc | Bin 10602 -> 10602 bytes .../__pycache__/cmdoptions.cpython-312.pyc | Bin 30353 -> 30353 bytes .../command_context.cpython-312.pyc | Bin 1830 -> 1830 bytes .../__pycache__/index_command.cpython-312.pyc | Bin 7218 -> 7218 bytes .../cli/__pycache__/main.cpython-312.pyc | Bin 2269 -> 2269 bytes .../__pycache__/main_parser.cpython-312.pyc | Bin 4843 -> 4843 bytes .../cli/__pycache__/parser.cpython-312.pyc | Bin 14869 -> 14869 bytes .../__pycache__/progress_bars.cpython-312.pyc | Bin 6114 -> 6114 bytes .../__pycache__/req_command.cpython-312.pyc | Bin 13865 -> 13865 bytes .../cli/__pycache__/spinners.cpython-312.pyc | Bin 11272 -> 11272 bytes .../__pycache__/status_codes.cpython-312.pyc | Bin 385 -> 385 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 4127 -> 4127 bytes .../__pycache__/cache.cpython-312.pyc | Bin 0 -> 10182 bytes .../__pycache__/check.cpython-312.pyc | Bin 0 -> 2590 bytes .../__pycache__/completion.cpython-312.pyc | Bin 0 -> 5435 bytes .../__pycache__/configuration.cpython-312.pyc | Bin 0 -> 13414 bytes .../__pycache__/debug.cpython-312.pyc | Bin 0 -> 10017 bytes .../__pycache__/download.cpython-312.pyc | Bin 0 -> 7271 bytes .../__pycache__/freeze.cpython-312.pyc | Bin 4300 -> 4300 bytes .../commands/__pycache__/hash.cpython-312.pyc | Bin 0 -> 2958 bytes .../commands/__pycache__/help.cpython-312.pyc | Bin 0 -> 1648 bytes .../__pycache__/index.cpython-312.pyc | Bin 0 -> 7270 bytes .../__pycache__/inspect.cpython-312.pyc | Bin 0 -> 3955 bytes .../__pycache__/install.cpython-312.pyc | Bin 29802 -> 29802 bytes .../commands/__pycache__/list.cpython-312.pyc | Bin 17034 -> 17034 bytes .../commands/__pycache__/lock.cpython-312.pyc | Bin 0 -> 7907 bytes .../__pycache__/search.cpython-312.pyc | Bin 0 -> 7643 bytes .../commands/__pycache__/show.cpython-312.pyc | Bin 11213 -> 11213 bytes .../__pycache__/uninstall.cpython-312.pyc | Bin 0 -> 4708 bytes .../__pycache__/wheel.cpython-312.pyc | Bin 0 -> 8367 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 951 -> 951 bytes .../__pycache__/base.cpython-312.pyc | Bin 2929 -> 2929 bytes .../__pycache__/installed.cpython-312.pyc | Bin 1779 -> 1779 bytes .../__pycache__/sdist.cpython-312.pyc | Bin 8387 -> 8387 bytes .../__pycache__/wheel.cpython-312.pyc | Bin 2328 -> 2328 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 239 -> 239 bytes .../__pycache__/collector.cpython-312.pyc | Bin 21236 -> 21236 bytes .../package_finder.cpython-312.pyc | Bin 42145 -> 42145 bytes .../index/__pycache__/sources.cpython-312.pyc | Bin 12333 -> 12333 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 15327 -> 15327 bytes .../__pycache__/_distutils.cpython-312.pyc | Bin 0 -> 6784 bytes .../__pycache__/_sysconfig.cpython-312.pyc | Bin 7935 -> 7935 bytes .../__pycache__/base.cpython-312.pyc | Bin 3718 -> 3718 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 6784 -> 6784 bytes .../__pycache__/_json.cpython-312.pyc | Bin 2887 -> 2887 bytes .../metadata/__pycache__/base.cpython-312.pyc | Bin 34471 -> 34471 bytes .../__pycache__/pkg_resources.cpython-312.pyc | Bin 0 -> 15815 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 368 -> 368 bytes .../__pycache__/_compat.cpython-312.pyc | Bin 4247 -> 4247 bytes .../__pycache__/_dists.cpython-312.pyc | Bin 12827 -> 12827 bytes .../__pycache__/_envs.cpython-312.pyc | Bin 8052 -> 8052 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 273 -> 273 bytes .../__pycache__/candidate.cpython-312.pyc | Bin 1614 -> 1614 bytes .../__pycache__/direct_url.cpython-312.pyc | Bin 10508 -> 10508 bytes .../format_control.cpython-312.pyc | Bin 4138 -> 4138 bytes .../models/__pycache__/index.cpython-312.pyc | Bin 1704 -> 1704 bytes .../installation_report.cpython-312.pyc | Bin 2295 -> 2295 bytes .../models/__pycache__/link.cpython-312.pyc | Bin 26653 -> 26653 bytes .../models/__pycache__/pylock.cpython-312.pyc | Bin 0 -> 7869 bytes .../models/__pycache__/scheme.cpython-312.pyc | Bin 1033 -> 1033 bytes .../__pycache__/search_scope.cpython-312.pyc | Bin 4971 -> 4971 bytes .../selection_prefs.cpython-312.pyc | Bin 1888 -> 1888 bytes .../__pycache__/target_python.cpython-312.pyc | Bin 4865 -> 4865 bytes .../models/__pycache__/wheel.cpython-312.pyc | Bin 4678 -> 4678 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 261 -> 261 bytes .../network/__pycache__/auth.cpython-312.pyc | Bin 21482 -> 21482 bytes .../network/__pycache__/cache.cpython-312.pyc | Bin 8012 -> 8012 bytes .../__pycache__/download.cpython-312.pyc | Bin 16099 -> 16099 bytes .../__pycache__/lazy_wheel.cpython-312.pyc | Bin 11624 -> 11624 bytes .../__pycache__/session.cpython-312.pyc | Bin 19216 -> 19216 bytes .../network/__pycache__/utils.cpython-312.pyc | Bin 2267 -> 2267 bytes .../__pycache__/xmlrpc.cpython-312.pyc | Bin 0 -> 2940 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 207 -> 207 bytes .../__pycache__/check.cpython-312.pyc | Bin 7216 -> 7216 bytes .../__pycache__/freeze.cpython-312.pyc | Bin 10258 -> 10258 bytes .../__pycache__/prepare.cpython-312.pyc | Bin 26671 -> 26671 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 273 -> 273 bytes .../install/__pycache__/wheel.cpython-312.pyc | Bin 34225 -> 34225 bytes .../req/__pycache__/__init__.cpython-312.pyc | Bin 4029 -> 4029 bytes .../__pycache__/constructors.cpython-312.pyc | Bin 21694 -> 21694 bytes .../req_dependency_group.cpython-312.pyc | Bin 4025 -> 4025 bytes .../req/__pycache__/req_file.cpython-312.pyc | Bin 23816 -> 23816 bytes .../__pycache__/req_install.cpython-312.pyc | Bin 34675 -> 34675 bytes .../req/__pycache__/req_set.cpython-312.pyc | Bin 5434 -> 5434 bytes .../__pycache__/req_uninstall.cpython-312.pyc | Bin 31768 -> 31768 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 207 -> 207 bytes .../__pycache__/base.cpython-312.pyc | Bin 1178 -> 1178 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 214 bytes .../__pycache__/resolver.cpython-312.pyc | Bin 0 -> 22562 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 218 -> 218 bytes .../__pycache__/base.cpython-312.pyc | Bin 7992 -> 7992 bytes .../__pycache__/candidates.cpython-312.pyc | Bin 29463 -> 29463 bytes .../__pycache__/factory.cpython-312.pyc | Bin 33851 -> 33851 bytes .../found_candidates.cpython-312.pyc | Bin 6755 -> 6755 bytes .../__pycache__/provider.cpython-312.pyc | Bin 11648 -> 11648 bytes .../__pycache__/reporter.cpython-312.pyc | Bin 5815 -> 5815 bytes .../__pycache__/requirements.cpython-312.pyc | Bin 14762 -> 14762 bytes .../__pycache__/resolver.cpython-312.pyc | Bin 12401 -> 12401 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 202 -> 202 bytes .../__pycache__/_jaraco_text.cpython-312.pyc | Bin 0 -> 4542 bytes .../utils/__pycache__/_log.cpython-312.pyc | Bin 1873 -> 1873 bytes .../utils/__pycache__/appdirs.cpython-312.pyc | Bin 2462 -> 2462 bytes .../utils/__pycache__/compat.cpython-312.pyc | Bin 3029 -> 3029 bytes .../compatibility_tags.cpython-312.pyc | Bin 6648 -> 6648 bytes .../__pycache__/datetime.cpython-312.pyc | Bin 0 -> 686 bytes .../__pycache__/deprecation.cpython-312.pyc | Bin 4215 -> 4215 bytes .../direct_url_helpers.cpython-312.pyc | Bin 3546 -> 3546 bytes .../__pycache__/egg_link.cpython-312.pyc | Bin 3171 -> 3171 bytes .../__pycache__/entrypoints.cpython-312.pyc | Bin 4062 -> 4062 bytes .../__pycache__/filesystem.cpython-312.pyc | Bin 7996 -> 7996 bytes .../__pycache__/filetypes.cpython-312.pyc | Bin 1136 -> 1136 bytes .../utils/__pycache__/glibc.cpython-312.pyc | Bin 2357 -> 2357 bytes .../utils/__pycache__/hashes.cpython-312.pyc | Bin 7475 -> 7475 bytes .../utils/__pycache__/logging.cpython-312.pyc | Bin 13870 -> 13870 bytes .../utils/__pycache__/misc.cpython-312.pyc | Bin 32707 -> 32707 bytes .../__pycache__/packaging.cpython-312.pyc | Bin 1892 -> 1892 bytes .../utils/__pycache__/retry.cpython-312.pyc | Bin 1979 -> 1979 bytes .../__pycache__/subprocess.cpython-312.pyc | Bin 8539 -> 8539 bytes .../__pycache__/temp_dir.cpython-312.pyc | Bin 11954 -> 11954 bytes .../__pycache__/unpacking.cpython-312.pyc | Bin 14351 -> 14351 bytes .../utils/__pycache__/urls.cpython-312.pyc | Bin 2088 -> 2088 bytes .../__pycache__/virtualenv.cpython-312.pyc | Bin 4401 -> 4401 bytes .../utils/__pycache__/wheel.cpython-312.pyc | Bin 5869 -> 5869 bytes .../vcs/__pycache__/__init__.cpython-312.pyc | Bin 541 -> 541 bytes .../vcs/__pycache__/bazaar.cpython-312.pyc | Bin 5169 -> 5169 bytes .../vcs/__pycache__/git.cpython-312.pyc | Bin 19928 -> 19928 bytes .../vcs/__pycache__/mercurial.cpython-312.pyc | Bin 7774 -> 7774 bytes .../__pycache__/subversion.cpython-312.pyc | Bin 12348 -> 12348 bytes .../versioncontrol.cpython-312.pyc | Bin 28748 -> 28748 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 4604 -> 4604 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 913 -> 913 bytes .../__pycache__/_cmd.cpython-312.pyc | Bin 0 -> 2657 bytes .../__pycache__/adapter.cpython-312.pyc | Bin 6722 -> 6722 bytes .../__pycache__/cache.cpython-312.pyc | Bin 3820 -> 3820 bytes .../__pycache__/controller.cpython-312.pyc | Bin 16464 -> 16464 bytes .../__pycache__/filewrapper.cpython-312.pyc | Bin 4358 -> 4358 bytes .../__pycache__/heuristics.cpython-312.pyc | Bin 0 -> 6708 bytes .../__pycache__/serialize.cpython-312.pyc | Bin 5276 -> 5276 bytes .../__pycache__/wrapper.cpython-312.pyc | Bin 1685 -> 1685 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 446 -> 446 bytes .../__pycache__/file_cache.cpython-312.pyc | Bin 7063 -> 7063 bytes .../__pycache__/redis_cache.cpython-312.pyc | Bin 2749 -> 2749 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 329 -> 329 bytes .../__pycache__/__main__.cpython-312.pyc | Bin 0 -> 656 bytes .../certifi/__pycache__/core.cpython-312.pyc | Bin 2093 -> 2093 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 388 -> 388 bytes .../__pycache__/__main__.cpython-312.pyc | Bin 0 -> 2710 bytes .../_implementation.cpython-312.pyc | Bin 9662 -> 9662 bytes .../_lint_dependency_groups.cpython-312.pyc | Bin 0 -> 2875 bytes .../__pycache__/_pip_wrapper.cpython-312.pyc | Bin 0 -> 3442 bytes .../__pycache__/_toml_compat.cpython-312.pyc | Bin 0 -> 489 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 1280 -> 1280 bytes .../__pycache__/compat.cpython-312.pyc | Bin 45611 -> 45611 bytes .../__pycache__/resources.cpython-312.pyc | Bin 17336 -> 17336 bytes .../__pycache__/scripts.cpython-312.pyc | Bin 19791 -> 19791 bytes .../distlib/__pycache__/util.cpython-312.pyc | Bin 88285 -> 88285 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 971 -> 971 bytes .../__pycache__/__main__.cpython-312.pyc | Bin 0 -> 303 bytes .../distro/__pycache__/distro.cpython-312.pyc | Bin 53856 -> 53856 bytes .../idna/__pycache__/__init__.cpython-312.pyc | Bin 897 -> 897 bytes .../idna/__pycache__/codec.cpython-312.pyc | Bin 0 -> 4997 bytes .../idna/__pycache__/compat.cpython-312.pyc | Bin 0 -> 901 bytes .../idna/__pycache__/core.cpython-312.pyc | Bin 16187 -> 16187 bytes .../idna/__pycache__/idnadata.cpython-312.pyc | Bin 99487 -> 99487 bytes .../__pycache__/intranges.cpython-312.pyc | Bin 2649 -> 2649 bytes .../__pycache__/package_data.cpython-312.pyc | Bin 228 -> 228 bytes .../__pycache__/uts46data.cpython-312.pyc | Bin 0 -> 158857 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 1750 -> 1750 bytes .../__pycache__/exceptions.cpython-312.pyc | Bin 2036 -> 2036 bytes .../msgpack/__pycache__/ext.cpython-312.pyc | Bin 8304 -> 8304 bytes .../__pycache__/fallback.cpython-312.pyc | Bin 41530 -> 41530 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 569 -> 569 bytes .../__pycache__/_elffile.cpython-312.pyc | Bin 5034 -> 5034 bytes .../__pycache__/_manylinux.cpython-312.pyc | Bin 9762 -> 9762 bytes .../__pycache__/_musllinux.cpython-312.pyc | Bin 4580 -> 4580 bytes .../__pycache__/_parser.cpython-312.pyc | Bin 14009 -> 14009 bytes .../__pycache__/_structures.cpython-312.pyc | Bin 3252 -> 3252 bytes .../__pycache__/_tokenizer.cpython-312.pyc | Bin 7959 -> 7959 bytes .../__pycache__/markers.cpython-312.pyc | Bin 12776 -> 12776 bytes .../__pycache__/metadata.cpython-312.pyc | Bin 0 -> 27261 bytes .../__pycache__/requirements.cpython-312.pyc | Bin 4421 -> 4421 bytes .../__pycache__/specifiers.cpython-312.pyc | Bin 39075 -> 39075 bytes .../__pycache__/tags.cpython-312.pyc | Bin 24827 -> 24827 bytes .../__pycache__/utils.cpython-312.pyc | Bin 6646 -> 6646 bytes .../__pycache__/version.cpython-312.pyc | Bin 20491 -> 20491 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 4140 bytes .../__pycache__/_spdx.cpython-312.pyc | Bin 0 -> 47375 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 161524 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 19858 -> 19858 bytes .../__pycache__/__main__.cpython-312.pyc | Bin 0 -> 1979 bytes .../__pycache__/android.cpython-312.pyc | Bin 0 -> 10706 bytes .../__pycache__/api.cpython-312.pyc | Bin 13371 -> 13371 bytes .../__pycache__/macos.cpython-312.pyc | Bin 0 -> 9014 bytes .../__pycache__/unix.cpython-312.pyc | Bin 14757 -> 14757 bytes .../__pycache__/version.cpython-312.pyc | Bin 814 -> 814 bytes .../__pycache__/windows.cpython-312.pyc | Bin 0 -> 13684 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 3500 -> 3500 bytes .../__pycache__/__main__.cpython-312.pyc | Bin 0 -> 746 bytes .../__pycache__/console.cpython-312.pyc | Bin 0 -> 2645 bytes .../__pycache__/filter.cpython-312.pyc | Bin 3238 -> 3238 bytes .../__pycache__/formatter.cpython-312.pyc | Bin 0 -> 4732 bytes .../__pycache__/lexer.cpython-312.pyc | Bin 38477 -> 38477 bytes .../__pycache__/modeline.cpython-312.pyc | Bin 1581 -> 1581 bytes .../__pycache__/plugin.cpython-312.pyc | Bin 2640 -> 2640 bytes .../__pycache__/regexopt.cpython-312.pyc | Bin 4093 -> 4093 bytes .../__pycache__/scanner.cpython-312.pyc | Bin 0 -> 4768 bytes .../__pycache__/sphinxext.cpython-312.pyc | Bin 0 -> 12153 bytes .../__pycache__/style.cpython-312.pyc | Bin 6729 -> 6729 bytes .../__pycache__/token.cpython-312.pyc | Bin 8206 -> 8206 bytes .../__pycache__/unistring.cpython-312.pyc | Bin 0 -> 33023 bytes .../pygments/__pycache__/util.cpython-312.pyc | Bin 14095 -> 14095 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 37991 -> 37991 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 6965 bytes .../__pycache__/_mapping.cpython-312.pyc | Bin 0 -> 4227 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 14747 -> 14747 bytes .../__pycache__/_mapping.cpython-312.pyc | Bin 69856 -> 69856 bytes .../lexers/__pycache__/python.cpython-312.pyc | Bin 0 -> 42986 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 2683 -> 2683 bytes .../__pycache__/_mapping.cpython-312.pyc | Bin 3660 -> 3660 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 759 -> 759 bytes .../__pycache__/_impl.cpython-312.pyc | Bin 18091 -> 18091 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 1088 -> 1088 bytes .../__pycache__/_in_process.cpython-312.pyc | Bin 0 -> 15370 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 5265 -> 5265 bytes .../__pycache__/__version__.cpython-312.pyc | Bin 596 -> 596 bytes .../_internal_utils.cpython-312.pyc | Bin 2036 -> 2036 bytes .../__pycache__/adapters.cpython-312.pyc | Bin 27884 -> 27884 bytes .../requests/__pycache__/api.cpython-312.pyc | Bin 7216 -> 7216 bytes .../requests/__pycache__/auth.cpython-312.pyc | Bin 13935 -> 13935 bytes .../__pycache__/certs.cpython-312.pyc | Bin 690 -> 690 bytes .../__pycache__/compat.cpython-312.pyc | Bin 1997 -> 1997 bytes .../__pycache__/cookies.cpython-312.pyc | Bin 25288 -> 25288 bytes .../__pycache__/exceptions.cpython-312.pyc | Bin 7610 -> 7610 bytes .../requests/__pycache__/help.cpython-312.pyc | Bin 0 -> 4240 bytes .../__pycache__/hooks.cpython-312.pyc | Bin 1064 -> 1064 bytes .../__pycache__/models.cpython-312.pyc | Bin 35585 -> 35585 bytes .../__pycache__/packages.cpython-312.pyc | Bin 1299 -> 1299 bytes .../__pycache__/sessions.cpython-312.pyc | Bin 27902 -> 27902 bytes .../__pycache__/status_codes.cpython-312.pyc | Bin 6043 -> 6043 bytes .../__pycache__/structures.cpython-312.pyc | Bin 5629 -> 5629 bytes .../__pycache__/utils.cpython-312.pyc | Bin 36202 -> 36202 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 646 -> 646 bytes .../__pycache__/providers.cpython-312.pyc | Bin 10135 -> 10135 bytes .../__pycache__/reporters.cpython-312.pyc | Bin 3301 -> 3301 bytes .../__pycache__/structs.cpython-312.pyc | Bin 12462 -> 12462 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 751 -> 751 bytes .../__pycache__/abstract.cpython-312.pyc | Bin 2457 -> 2457 bytes .../__pycache__/criterion.cpython-312.pyc | Bin 3282 -> 3282 bytes .../__pycache__/exceptions.cpython-312.pyc | Bin 4092 -> 4092 bytes .../__pycache__/resolution.cpython-312.pyc | Bin 25178 -> 25178 bytes .../rich/__pycache__/__init__.cpython-312.pyc | Bin 7027 -> 7027 bytes .../rich/__pycache__/__main__.cpython-312.pyc | Bin 0 -> 9562 bytes .../__pycache__/_cell_widths.cpython-312.pyc | Bin 7884 -> 7884 bytes .../__pycache__/_emoji_codes.cpython-312.pyc | Bin 205988 -> 205988 bytes .../_emoji_replace.cpython-312.pyc | Bin 1741 -> 1741 bytes .../_export_format.cpython-312.pyc | Bin 2361 -> 2361 bytes .../__pycache__/_extension.cpython-312.pyc | Bin 549 -> 549 bytes .../rich/__pycache__/_fileno.cpython-312.pyc | Bin 867 -> 867 bytes .../rich/__pycache__/_inspect.cpython-312.pyc | Bin 0 -> 12039 bytes .../__pycache__/_log_render.cpython-312.pyc | Bin 4159 -> 4159 bytes .../rich/__pycache__/_loop.cpython-312.pyc | Bin 1897 -> 1897 bytes .../__pycache__/_null_file.cpython-312.pyc | Bin 3641 -> 3641 bytes .../__pycache__/_palettes.cpython-312.pyc | Bin 5172 -> 5172 bytes .../rich/__pycache__/_pick.cpython-312.pyc | Bin 738 -> 738 bytes .../rich/__pycache__/_ratio.cpython-312.pyc | Bin 6442 -> 6442 bytes .../__pycache__/_spinners.cpython-312.pyc | Bin 13191 -> 13191 bytes .../rich/__pycache__/_stack.cpython-312.pyc | Bin 0 -> 977 bytes .../rich/__pycache__/_timer.cpython-312.pyc | Bin 0 -> 877 bytes .../_win32_console.cpython-312.pyc | Bin 0 -> 28823 bytes .../rich/__pycache__/_windows.cpython-312.pyc | Bin 0 -> 2502 bytes .../_windows_renderer.cpython-312.pyc | Bin 0 -> 3585 bytes .../rich/__pycache__/_wrap.cpython-312.pyc | Bin 3348 -> 3348 bytes .../rich/__pycache__/abc.cpython-312.pyc | Bin 1620 -> 1620 bytes .../rich/__pycache__/align.cpython-312.pyc | Bin 12291 -> 12291 bytes .../rich/__pycache__/ansi.cpython-312.pyc | Bin 9133 -> 9133 bytes .../rich/__pycache__/bar.cpython-312.pyc | Bin 0 -> 4284 bytes .../rich/__pycache__/box.cpython-312.pyc | Bin 11723 -> 11723 bytes .../rich/__pycache__/cells.cpython-312.pyc | Bin 5590 -> 5590 bytes .../rich/__pycache__/color.cpython-312.pyc | Bin 26565 -> 26565 bytes .../__pycache__/color_triplet.cpython-312.pyc | Bin 1713 -> 1713 bytes .../rich/__pycache__/columns.cpython-312.pyc | Bin 8599 -> 8599 bytes .../rich/__pycache__/console.cpython-312.pyc | Bin 115312 -> 115312 bytes .../__pycache__/constrain.cpython-312.pyc | Bin 2270 -> 2270 bytes .../__pycache__/containers.cpython-312.pyc | Bin 9243 -> 9243 bytes .../rich/__pycache__/control.cpython-312.pyc | Bin 10796 -> 10796 bytes .../default_styles.cpython-312.pyc | Bin 10540 -> 10540 bytes .../rich/__pycache__/diagnose.cpython-312.pyc | Bin 0 -> 1532 bytes .../rich/__pycache__/emoji.cpython-312.pyc | Bin 4090 -> 4090 bytes .../rich/__pycache__/errors.cpython-312.pyc | Bin 1857 -> 1857 bytes .../__pycache__/file_proxy.cpython-312.pyc | Bin 3589 -> 3589 bytes .../rich/__pycache__/filesize.cpython-312.pyc | Bin 3069 -> 3069 bytes .../__pycache__/highlighter.cpython-312.pyc | Bin 9912 -> 9912 bytes .../rich/__pycache__/json.cpython-312.pyc | Bin 0 -> 6047 bytes .../rich/__pycache__/jupyter.cpython-312.pyc | Bin 5221 -> 5221 bytes .../rich/__pycache__/layout.cpython-312.pyc | Bin 0 -> 20232 bytes .../rich/__pycache__/live.cpython-312.pyc | Bin 20144 -> 20144 bytes .../__pycache__/live_render.cpython-312.pyc | Bin 4762 -> 4762 bytes .../rich/__pycache__/logging.cpython-312.pyc | Bin 14086 -> 14086 bytes .../rich/__pycache__/markup.cpython-312.pyc | Bin 9602 -> 9602 bytes .../rich/__pycache__/measure.cpython-312.pyc | Bin 6388 -> 6388 bytes .../rich/__pycache__/padding.cpython-312.pyc | Bin 6955 -> 6955 bytes .../rich/__pycache__/pager.cpython-312.pyc | Bin 1832 -> 1832 bytes .../rich/__pycache__/palette.cpython-312.pyc | Bin 5326 -> 5326 bytes .../rich/__pycache__/panel.cpython-312.pyc | Bin 12741 -> 12741 bytes .../rich/__pycache__/pretty.cpython-312.pyc | Bin 40645 -> 40645 bytes .../rich/__pycache__/progress.cpython-312.pyc | Bin 75135 -> 75135 bytes .../__pycache__/progress_bar.cpython-312.pyc | Bin 10401 -> 10401 bytes .../rich/__pycache__/prompt.cpython-312.pyc | Bin 0 -> 16009 bytes .../rich/__pycache__/protocol.cpython-312.pyc | Bin 1804 -> 1804 bytes .../rich/__pycache__/region.cpython-312.pyc | Bin 579 -> 579 bytes .../rich/__pycache__/repr.cpython-312.pyc | Bin 6636 -> 6636 bytes .../rich/__pycache__/rule.cpython-312.pyc | Bin 0 -> 6580 bytes .../rich/__pycache__/scope.cpython-312.pyc | Bin 3842 -> 3842 bytes .../rich/__pycache__/screen.cpython-312.pyc | Bin 2496 -> 2496 bytes .../rich/__pycache__/segment.cpython-312.pyc | Bin 28595 -> 28595 bytes .../rich/__pycache__/spinner.cpython-312.pyc | Bin 5937 -> 5937 bytes .../rich/__pycache__/status.cpython-312.pyc | Bin 0 -> 6080 bytes .../rich/__pycache__/style.cpython-312.pyc | Bin 33443 -> 33443 bytes .../rich/__pycache__/styled.cpython-312.pyc | Bin 2151 -> 2151 bytes .../rich/__pycache__/syntax.cpython-312.pyc | Bin 41004 -> 41004 bytes .../rich/__pycache__/table.cpython-312.pyc | Bin 43894 -> 43894 bytes .../terminal_theme.cpython-312.pyc | Bin 3360 -> 3360 bytes .../rich/__pycache__/text.cpython-312.pyc | Bin 61266 -> 61266 bytes .../rich/__pycache__/theme.cpython-312.pyc | Bin 6344 -> 6344 bytes .../rich/__pycache__/themes.cpython-312.pyc | Bin 326 -> 326 bytes .../__pycache__/traceback.cpython-312.pyc | Bin 36252 -> 36252 bytes .../rich/__pycache__/tree.cpython-312.pyc | Bin 0 -> 11808 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 350 bytes .../tomli/__pycache__/_parser.cpython-312.pyc | Bin 0 -> 29453 bytes .../tomli/__pycache__/_re.cpython-312.pyc | Bin 0 -> 4088 bytes .../tomli/__pycache__/_types.cpython-312.pyc | Bin 0 -> 378 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 339 bytes .../__pycache__/_writer.cpython-312.pyc | Bin 0 -> 10381 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 1464 -> 1464 bytes .../__pycache__/_api.cpython-312.pyc | Bin 17557 -> 17557 bytes .../__pycache__/_macos.cpython-312.pyc | Bin 0 -> 19004 bytes .../__pycache__/_openssl.cpython-312.pyc | Bin 2278 -> 2278 bytes .../_ssl_constants.cpython-312.pyc | Bin 1111 -> 1111 bytes .../__pycache__/_windows.cpython-312.pyc | Bin 0 -> 15787 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 3417 -> 3417 bytes .../__pycache__/_collections.cpython-312.pyc | Bin 16500 -> 16500 bytes .../__pycache__/_version.cpython-312.pyc | Bin 230 -> 230 bytes .../__pycache__/connection.cpython-312.pyc | Bin 20419 -> 20419 bytes .../connectionpool.cpython-312.pyc | Bin 36555 -> 36555 bytes .../__pycache__/exceptions.cpython-312.pyc | Bin 13505 -> 13505 bytes .../__pycache__/fields.cpython-312.pyc | Bin 10425 -> 10425 bytes .../__pycache__/filepost.cpython-312.pyc | Bin 4030 -> 4030 bytes .../__pycache__/poolmanager.cpython-312.pyc | Bin 20484 -> 20484 bytes .../__pycache__/request.cpython-312.pyc | Bin 7306 -> 7306 bytes .../__pycache__/response.cpython-312.pyc | Bin 33980 -> 33980 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 210 -> 210 bytes .../_appengine_environ.cpython-312.pyc | Bin 1860 -> 1860 bytes .../__pycache__/appengine.cpython-312.pyc | Bin 0 -> 11576 bytes .../__pycache__/ntlmpool.cpython-312.pyc | Bin 0 -> 5731 bytes .../__pycache__/pyopenssl.cpython-312.pyc | Bin 0 -> 24462 bytes .../securetransport.cpython-312.pyc | Bin 0 -> 35565 bytes .../contrib/__pycache__/socks.cpython-312.pyc | Bin 7523 -> 7523 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 227 bytes .../__pycache__/bindings.cpython-312.pyc | Bin 0 -> 17439 bytes .../__pycache__/low_level.cpython-312.pyc | Bin 0 -> 14813 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 211 -> 211 bytes .../packages/__pycache__/six.cpython-312.pyc | Bin 41331 -> 41331 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 221 bytes .../__pycache__/makefile.cpython-312.pyc | Bin 0 -> 1837 bytes .../weakref_finalize.cpython-312.pyc | Bin 0 -> 7343 bytes .../util/__pycache__/__init__.cpython-312.pyc | Bin 1158 -> 1158 bytes .../__pycache__/connection.cpython-312.pyc | Bin 4768 -> 4768 bytes .../util/__pycache__/proxy.cpython-312.pyc | Bin 1564 -> 1564 bytes .../util/__pycache__/queue.cpython-312.pyc | Bin 1364 -> 1364 bytes .../util/__pycache__/request.cpython-312.pyc | Bin 4195 -> 4195 bytes .../util/__pycache__/response.cpython-312.pyc | Bin 3001 -> 3001 bytes .../util/__pycache__/retry.cpython-312.pyc | Bin 21730 -> 21730 bytes .../util/__pycache__/ssl_.cpython-312.pyc | Bin 15389 -> 15389 bytes .../ssl_match_hostname.cpython-312.pyc | Bin 5083 -> 5083 bytes .../__pycache__/ssltransport.cpython-312.pyc | Bin 10784 -> 10784 bytes .../util/__pycache__/timeout.cpython-312.pyc | Bin 11151 -> 11151 bytes .../util/__pycache__/url.cpython-312.pyc | Bin 15807 -> 15807 bytes .../util/__pycache__/wait.cpython-312.pyc | Bin 4415 -> 4415 bytes .../venv/lib/python3.12/site-packages/py.py | 5 - .../pydantic-2.12.5.dist-info/METADATA | 1029 ------- .../pydantic-2.12.5.dist-info/RECORD | 217 -- .../INSTALLER | 0 .../pydantic-2.5.0.dist-info/METADATA | 1464 ++++++++++ .../pydantic-2.5.0.dist-info/RECORD | 196 ++ .../REQUESTED | 0 .../WHEEL | 2 +- .../licenses/LICENSE | 0 .../site-packages/pydantic/__init__.py | 353 +-- .../__pycache__/__init__.cpython-312.pyc | Bin 14436 -> 8954 bytes .../__pycache__/_migration.cpython-312.pyc | Bin 11029 -> 10887 bytes .../alias_generators.cpython-312.pyc | Bin 3296 -> 2493 bytes .../__pycache__/aliases.cpython-312.pyc | Bin 6578 -> 0 bytes .../annotated_handlers.cpython-312.pyc | Bin 5502 -> 5552 bytes .../class_validators.cpython-312.pyc | Bin 376 -> 376 bytes .../__pycache__/color.cpython-312.pyc | Bin 30159 -> 30188 bytes .../__pycache__/config.cpython-312.pyc | Bin 7508 -> 3387 bytes .../__pycache__/dataclasses.cpython-312.pyc | Bin 17349 -> 12605 bytes .../datetime_parse.cpython-312.pyc | Bin 376 -> 376 bytes .../__pycache__/decorator.cpython-312.pyc | Bin 366 -> 366 bytes .../__pycache__/env_settings.cpython-312.pyc | Bin 372 -> 372 bytes .../error_wrappers.cpython-312.pyc | Bin 376 -> 376 bytes .../__pycache__/errors.cpython-312.pyc | Bin 7637 -> 6029 bytes .../__pycache__/fields.cpython-312.pyc | Bin 72950 -> 50481 bytes .../functional_serializers.cpython-312.pyc | Bin 17939 -> 12646 bytes .../functional_validators.cpython-312.pyc | Bin 34748 -> 26752 bytes .../__pycache__/generics.cpython-312.pyc | Bin 364 -> 364 bytes .../pydantic/__pycache__/json.cpython-312.pyc | Bin 356 -> 356 bytes .../__pycache__/json_schema.cpython-312.pyc | Bin 120165 -> 100955 bytes .../pydantic/__pycache__/main.cpython-312.pyc | Bin 77344 -> 63573 bytes .../pydantic/__pycache__/mypy.cpython-312.pyc | Bin 61805 -> 57714 bytes .../__pycache__/networks.cpython-312.pyc | Bin 50227 -> 17602 bytes .../__pycache__/parse.cpython-312.pyc | Bin 358 -> 358 bytes .../__pycache__/root_model.cpython-312.pyc | Bin 7819 -> 6743 bytes .../__pycache__/schema.cpython-312.pyc | Bin 360 -> 360 bytes .../__pycache__/tools.cpython-312.pyc | Bin 358 -> 358 bytes .../__pycache__/type_adapter.cpython-312.pyc | Bin 35560 -> 19492 bytes .../__pycache__/types.cpython-312.pyc | Bin 96795 -> 81154 bytes .../__pycache__/typing.cpython-312.pyc | Bin 356 -> 356 bytes .../__pycache__/utils.cpython-312.pyc | Bin 358 -> 358 bytes .../validate_call_decorator.cpython-312.pyc | Bin 5454 -> 2570 bytes .../__pycache__/validators.cpython-312.pyc | Bin 368 -> 368 bytes .../__pycache__/version.cpython-312.pyc | Bin 4806 -> 3484 bytes .../__pycache__/warnings.cpython-312.pyc | Bin 7220 -> 3359 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 201 -> 201 bytes .../__pycache__/_config.cpython-312.pyc | Bin 15668 -> 13726 bytes .../_core_metadata.cpython-312.pyc | Bin 4621 -> 3912 bytes .../__pycache__/_core_utils.cpython-312.pyc | Bin 7731 -> 27174 bytes .../__pycache__/_dataclasses.cpython-312.pyc | Bin 13433 -> 11631 bytes .../__pycache__/_decorators.cpython-312.pyc | Bin 36775 -> 34570 bytes .../_decorators_v1.cpython-312.pyc | Bin 8602 -> 8622 bytes .../_discriminated_union.cpython-312.pyc | Bin 20867 -> 22270 bytes .../_docs_extraction.cpython-312.pyc | Bin 5314 -> 0 bytes .../__pycache__/_fields.cpython-312.pyc | Bin 24373 -> 11960 bytes .../__pycache__/_forward_ref.cpython-312.pyc | Bin 1310 -> 1310 bytes .../_generate_schema.cpython-312.pyc | Bin 130703 -> 102251 bytes .../__pycache__/_generics.cpython-312.pyc | Bin 24361 -> 23429 bytes .../__pycache__/_git.cpython-312.pyc | Bin 1516 -> 0 bytes .../__pycache__/_import_utils.cpython-312.pyc | Bin 829 -> 0 bytes .../_internal_dataclass.cpython-312.pyc | Bin 350 -> 476 bytes .../_known_annotated_metadata.cpython-312.pyc | Bin 14253 -> 16963 bytes .../__pycache__/_mock_val_ser.cpython-312.pyc | Bin 11111 -> 5716 bytes .../_model_construction.cpython-312.pyc | Bin 35125 -> 26423 bytes .../_namespace_utils.cpython-312.pyc | Bin 12312 -> 0 bytes .../__pycache__/_repr.cpython-312.pyc | Bin 7859 -> 6808 bytes .../_schema_gather.cpython-312.pyc | Bin 7701 -> 0 bytes .../_schema_generation_shared.cpython-312.pyc | Bin 6227 -> 6385 bytes .../__pycache__/_serializers.cpython-312.pyc | Bin 2122 -> 0 bytes .../__pycache__/_signature.cpython-312.pyc | Bin 6770 -> 0 bytes .../_std_types_schema.cpython-312.pyc | Bin 0 -> 34175 bytes .../__pycache__/_typing_extra.cpython-312.pyc | Bin 28253 -> 18842 bytes .../__pycache__/_utils.cpython-312.pyc | Bin 19799 -> 14766 bytes .../_validate_call.cpython-312.pyc | Bin 6988 -> 6871 bytes .../__pycache__/_validators.cpython-312.pyc | Bin 22958 -> 11655 bytes .../pydantic/_internal/_config.py | 163 +- .../pydantic/_internal/_core_metadata.py | 139 +- .../pydantic/_internal/_core_utils.py | 535 +++- .../pydantic/_internal/_dataclasses.py | 366 ++- .../pydantic/_internal/_decorators.py | 226 +- .../pydantic/_internal/_decorators_v1.py | 33 +- .../_internal/_discriminated_union.py | 86 +- .../pydantic/_internal/_docs_extraction.py | 113 - .../pydantic/_internal/_fields.py | 611 +--- .../pydantic/_internal/_generate_schema.py | 2485 ++++++----------- .../pydantic/_internal/_generics.py | 246 +- .../site-packages/pydantic/_internal/_git.py | 27 - .../pydantic/_internal/_import_utils.py | 20 - .../pydantic/_internal/_internal_dataclass.py | 3 + .../_internal/_known_annotated_metadata.py | 423 +-- .../pydantic/_internal/_mock_val_ser.py | 180 +- .../pydantic/_internal/_model_construction.py | 518 +--- .../pydantic/_internal/_namespace_utils.py | 293 -- .../site-packages/pydantic/_internal/_repr.py | 41 +- .../pydantic/_internal/_schema_gather.py | 209 -- .../_internal/_schema_generation_shared.py | 31 +- .../pydantic/_internal/_serializers.py | 53 - .../pydantic/_internal/_signature.py | 188 -- .../pydantic/_internal/_std_types_schema.py | 714 +++++ .../pydantic/_internal/_typing_extra.py | 736 ++--- .../pydantic/_internal/_utils.py | 155 +- .../pydantic/_internal/_validate_call.py | 189 +- .../pydantic/_internal/_validators.py | 451 +-- .../site-packages/pydantic/_migration.py | 16 +- .../pydantic/alias_generators.py | 24 +- .../site-packages/pydantic/aliases.py | 135 - .../pydantic/annotated_handlers.py | 24 +- .../pydantic/class_validators.py | 1 - .../site-packages/pydantic/color.py | 15 +- .../site-packages/pydantic/config.py | 914 ++---- .../site-packages/pydantic/dataclasses.py | 293 +- .../site-packages/pydantic/datetime_parse.py | 1 - .../site-packages/pydantic/decorator.py | 1 - .../__pycache__/__init__.cpython-312.pyc | Bin 202 -> 202 bytes .../class_validators.cpython-312.pyc | Bin 11738 -> 11580 bytes .../__pycache__/config.cpython-312.pyc | Bin 4079 -> 4048 bytes .../copy_internals.cpython-312.pyc | Bin 8652 -> 8685 bytes .../__pycache__/decorator.cpython-312.pyc | Bin 14040 -> 14074 bytes .../__pycache__/json.cpython-312.pyc | Bin 6198 -> 6221 bytes .../__pycache__/parse.cpython-312.pyc | Bin 3408 -> 3402 bytes .../__pycache__/tools.cpython-312.pyc | Bin 3544 -> 3513 bytes .../pydantic/deprecated/class_validators.py | 67 +- .../pydantic/deprecated/config.py | 15 +- .../pydantic/deprecated/copy_internals.py | 16 +- .../pydantic/deprecated/decorator.py | 77 +- .../site-packages/pydantic/deprecated/json.py | 37 +- .../pydantic/deprecated/parse.py | 8 +- .../pydantic/deprecated/tools.py | 25 +- .../site-packages/pydantic/env_settings.py | 1 - .../site-packages/pydantic/error_wrappers.py | 1 - .../site-packages/pydantic/errors.py | 46 +- .../pydantic/experimental/__init__.py | 1 - .../__pycache__/__init__.cpython-312.pyc | Bin 316 -> 0 bytes .../arguments_schema.cpython-312.pyc | Bin 2408 -> 0 bytes .../missing_sentinel.cpython-312.pyc | Bin 357 -> 0 bytes .../__pycache__/pipeline.cpython-312.pyc | Bin 34469 -> 0 bytes .../pydantic/experimental/arguments_schema.py | 44 - .../pydantic/experimental/missing_sentinel.py | 5 - .../pydantic/experimental/pipeline.py | 654 ----- .../site-packages/pydantic/fields.py | 1424 +++------- .../pydantic/functional_serializers.py | 339 +-- .../pydantic/functional_validators.py | 494 +--- .../site-packages/pydantic/generics.py | 1 - .../python3.12/site-packages/pydantic/json.py | 1 - .../site-packages/pydantic/json_schema.py | 1181 +++----- .../python3.12/site-packages/pydantic/main.py | 1330 ++++----- .../python3.12/site-packages/pydantic/mypy.py | 526 ++-- .../site-packages/pydantic/networks.py | 1363 +++------ .../site-packages/pydantic/parse.py | 1 - .../site-packages/pydantic/plugin/__init__.py | 41 +- .../__pycache__/__init__.cpython-312.pyc | Bin 8944 -> 7677 bytes .../__pycache__/_loader.cpython-312.pyc | Bin 2444 -> 2239 bytes .../_schema_validator.cpython-312.pyc | Bin 6944 -> 6875 bytes .../site-packages/pydantic/plugin/_loader.py | 22 +- .../pydantic/plugin/_schema_validator.py | 10 +- .../site-packages/pydantic/root_model.py | 64 +- .../site-packages/pydantic/schema.py | 1 - .../site-packages/pydantic/tools.py | 1 - .../site-packages/pydantic/type_adapter.py | 714 ++--- .../site-packages/pydantic/types.py | 1045 ++----- .../site-packages/pydantic/typing.py | 1 - .../site-packages/pydantic/utils.py | 1 - .../site-packages/pydantic/v1/__init__.py | 45 +- .../v1/__pycache__/__init__.cpython-312.pyc | Bin 2523 -> 2046 bytes .../_hypothesis_plugin.cpython-312.pyc | Bin 20547 -> 20544 bytes .../annotated_types.cpython-312.pyc | Bin 3878 -> 3839 bytes .../class_validators.cpython-312.pyc | Bin 19677 -> 19589 bytes .../v1/__pycache__/color.cpython-312.pyc | Bin 25832 -> 25795 bytes .../v1/__pycache__/config.cpython-312.pyc | Bin 8405 -> 8339 bytes .../__pycache__/dataclasses.cpython-312.pyc | Bin 22775 -> 21857 bytes .../datetime_parse.cpython-312.pyc | Bin 10351 -> 10340 bytes .../v1/__pycache__/decorator.cpython-312.pyc | Bin 13934 -> 13860 bytes .../__pycache__/env_settings.cpython-312.pyc | Bin 17741 -> 17666 bytes .../error_wrappers.cpython-312.pyc | Bin 8934 -> 8862 bytes .../v1/__pycache__/errors.cpython-312.pyc | Bin 29603 -> 29588 bytes .../v1/__pycache__/fields.cpython-312.pyc | Bin 57432 -> 57263 bytes .../v1/__pycache__/generics.cpython-312.pyc | Bin 16998 -> 16913 bytes .../v1/__pycache__/json.cpython-312.pyc | Bin 5235 -> 5190 bytes .../v1/__pycache__/main.cpython-312.pyc | Bin 48275 -> 48002 bytes .../v1/__pycache__/mypy.cpython-312.pyc | Bin 46438 -> 46283 bytes .../v1/__pycache__/networks.cpython-312.pyc | Bin 29564 -> 29485 bytes .../v1/__pycache__/parse.cpython-312.pyc | Bin 2752 -> 2745 bytes .../v1/__pycache__/schema.cpython-312.pyc | Bin 48504 -> 48349 bytes .../v1/__pycache__/tools.cpython-312.pyc | Bin 3885 -> 3834 bytes .../v1/__pycache__/types.cpython-312.pyc | Bin 48507 -> 48419 bytes .../v1/__pycache__/typing.cpython-312.pyc | Bin 22663 -> 22087 bytes .../v1/__pycache__/utils.cpython-312.pyc | Bin 35289 -> 35152 bytes .../v1/__pycache__/validators.cpython-312.pyc | Bin 30903 -> 30506 bytes .../v1/__pycache__/version.cpython-312.pyc | Bin 1964 -> 1964 bytes .../pydantic/v1/_hypothesis_plugin.py | 2 +- .../pydantic/v1/annotated_types.py | 6 +- .../pydantic/v1/class_validators.py | 14 +- .../site-packages/pydantic/v1/color.py | 6 +- .../site-packages/pydantic/v1/config.py | 10 +- .../site-packages/pydantic/v1/dataclasses.py | 44 +- .../pydantic/v1/datetime_parse.py | 2 +- .../site-packages/pydantic/v1/decorator.py | 14 +- .../site-packages/pydantic/v1/env_settings.py | 12 +- .../pydantic/v1/error_wrappers.py | 11 +- .../site-packages/pydantic/v1/errors.py | 6 +- .../site-packages/pydantic/v1/fields.py | 33 +- .../site-packages/pydantic/v1/generics.py | 12 +- .../site-packages/pydantic/v1/json.py | 8 +- .../site-packages/pydantic/v1/main.py | 40 +- .../site-packages/pydantic/v1/mypy.py | 31 +- .../site-packages/pydantic/v1/networks.py | 12 +- .../site-packages/pydantic/v1/parse.py | 2 +- .../site-packages/pydantic/v1/schema.py | 29 +- .../site-packages/pydantic/v1/tools.py | 10 +- .../site-packages/pydantic/v1/types.py | 21 +- .../site-packages/pydantic/v1/typing.py | 33 +- .../site-packages/pydantic/v1/utils.py | 25 +- .../site-packages/pydantic/v1/validators.py | 23 +- .../site-packages/pydantic/v1/version.py | 2 +- .../pydantic/validate_call_decorator.py | 88 +- .../site-packages/pydantic/validators.py | 1 - .../site-packages/pydantic/version.py | 76 +- .../site-packages/pydantic/warnings.py | 73 +- .../INSTALLER | 0 .../METADATA | 76 +- .../pydantic_core-2.14.1.dist-info/RECORD | 12 + .../WHEEL | 2 +- .../license_files}/LICENSE | 0 .../pydantic_core-2.41.5.dist-info/RECORD | 12 - .../site-packages/pydantic_core/__init__.py | 42 +- .../__pycache__/__init__.cpython-312.pyc | Bin 3157 -> 3072 bytes .../__pycache__/core_schema.cpython-312.pyc | Bin 155144 -> 135553 bytes ...antic_core.cpython-312-x86_64-linux-gnu.so | Bin 4883472 -> 5179648 bytes .../pydantic_core/_pydantic_core.pyi | 780 ++---- .../pydantic_core/core_schema.py | 1062 ++----- .../__pycache__/__init__.cpython-312.pyc | Bin 587 -> 587 bytes .../__pycache__/main.cpython-312.pyc | Bin 6523 -> 6523 bytes .../__pycache__/sources.cpython-312.pyc | Bin 29763 -> 29763 bytes .../__pycache__/utils.cpython-312.pyc | Bin 974 -> 974 bytes .../__pycache__/version.cpython-312.pyc | Bin 221 -> 221 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 3464 -> 3464 bytes .../__pycache__/filter.cpython-312.pyc | Bin 3226 -> 3226 bytes .../__pycache__/formatter.cpython-312.pyc | Bin 4696 -> 4696 bytes .../__pycache__/lexer.cpython-312.pyc | Bin 38760 -> 38760 bytes .../__pycache__/modeline.cpython-312.pyc | Bin 1569 -> 1569 bytes .../__pycache__/plugin.cpython-312.pyc | Bin 2628 -> 2628 bytes .../__pycache__/regexopt.cpython-312.pyc | Bin 4081 -> 4081 bytes .../__pycache__/style.cpython-312.pyc | Bin 6705 -> 6705 bytes .../__pycache__/token.cpython-312.pyc | Bin 8194 -> 8194 bytes .../__pycache__/unistring.cpython-312.pyc | Bin 33011 -> 33011 bytes .../pygments/__pycache__/util.cpython-312.pyc | Bin 14083 -> 14083 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 37931 -> 37931 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 6917 -> 6917 bytes .../__pycache__/_mapping.cpython-312.pyc | Bin 4215 -> 4215 bytes .../__pycache__/html.cpython-312.pyc | Bin 41377 -> 41377 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 14687 -> 14687 bytes .../__pycache__/_css_builtins.cpython-312.pyc | Bin 9395 -> 9395 bytes .../__pycache__/_lua_builtins.cpython-312.pyc | Bin 8397 -> 8397 bytes .../__pycache__/_mapping.cpython-312.pyc | Bin 66961 -> 66961 bytes .../_scheme_builtins.cpython-312.pyc | Bin 23183 -> 23183 bytes .../__pycache__/actionscript.cpython-312.pyc | Bin 11125 -> 11125 bytes .../lexers/__pycache__/agile.cpython-312.pyc | Bin 1316 -> 1316 bytes .../lexers/__pycache__/css.cpython-312.pyc | Bin 22114 -> 22114 bytes .../lexers/__pycache__/d.cpython-312.pyc | Bin 8343 -> 8343 bytes .../lexers/__pycache__/data.cpython-312.pyc | Bin 21177 -> 21177 bytes .../lexers/__pycache__/factor.cpython-312.pyc | Bin 16937 -> 16937 bytes .../lexers/__pycache__/html.cpython-312.pyc | Bin 20742 -> 20742 bytes .../lexers/__pycache__/iolang.cpython-312.pyc | Bin 2224 -> 2224 bytes .../__pycache__/javascript.cpython-312.pyc | Bin 57008 -> 57008 bytes .../lexers/__pycache__/jvm.cpython-312.pyc | Bin 63885 -> 63885 bytes .../lexers/__pycache__/lisp.cpython-312.pyc | Bin 121654 -> 121654 bytes .../lexers/__pycache__/perl.cpython-312.pyc | Bin 39029 -> 39029 bytes .../lexers/__pycache__/php.cpython-312.pyc | Bin 14334 -> 14334 bytes .../lexers/__pycache__/python.cpython-312.pyc | Bin 42926 -> 42926 bytes .../lexers/__pycache__/ruby.cpython-312.pyc | Bin 22602 -> 22602 bytes .../__pycache__/scripting.cpython-312.pyc | Bin 71852 -> 71852 bytes .../lexers/__pycache__/tcl.cpython-312.pyc | Bin 5160 -> 5160 bytes .../lexers/__pycache__/web.cpython-312.pyc | Bin 1331 -> 1331 bytes .../__pycache__/webmisc.cpython-312.pyc | Bin 43558 -> 43558 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 2635 -> 2635 bytes .../__pycache__/_mapping.cpython-312.pyc | Bin 3648 -> 3648 bytes .../__pycache__/default.cpython-312.pyc | Bin 3219 -> 3219 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 5098 -> 5098 bytes .../pymysql/__pycache__/_auth.cpython-312.pyc | Bin 10022 -> 10022 bytes .../__pycache__/charset.cpython-312.pyc | Bin 16806 -> 16806 bytes .../__pycache__/connections.cpython-312.pyc | Bin 59573 -> 59573 bytes .../__pycache__/converters.cpython-312.pyc | Bin 13591 -> 13591 bytes .../__pycache__/cursors.cpython-312.pyc | Bin 22425 -> 22425 bytes .../pymysql/__pycache__/err.cpython-312.pyc | Bin 6550 -> 6550 bytes .../__pycache__/optionfile.cpython-312.pyc | Bin 1602 -> 1602 bytes .../__pycache__/protocol.cpython-312.pyc | Bin 18742 -> 18742 bytes .../pymysql/__pycache__/times.cpython-312.pyc | Bin 930 -> 930 bytes .../__pycache__/CLIENT.cpython-312.pyc | Bin 1044 -> 1044 bytes .../__pycache__/COMMAND.cpython-312.pyc | Bin 1139 -> 1139 bytes .../constants/__pycache__/CR.cpython-312.pyc | Bin 3141 -> 3141 bytes .../constants/__pycache__/ER.cpython-312.pyc | Bin 17441 -> 17441 bytes .../__pycache__/FIELD_TYPE.cpython-312.pyc | Bin 853 -> 853 bytes .../__pycache__/SERVER_STATUS.cpython-312.pyc | Bin 643 -> 643 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 200 -> 200 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 4294 -> 4294 bytes .../pyotp/__pycache__/compat.cpython-312.pyc | Bin 350 -> 350 bytes .../pyotp/__pycache__/hotp.cpython-312.pyc | Bin 3750 -> 3750 bytes .../pyotp/__pycache__/otp.cpython-312.pyc | Bin 3454 -> 3454 bytes .../pyotp/__pycache__/totp.cpython-312.pyc | Bin 5970 -> 5970 bytes .../pyotp/__pycache__/utils.cpython-312.pyc | Bin 3725 -> 3725 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 234 -> 234 bytes .../contrib/__pycache__/steam.cpython-312.pyc | Bin 2171 -> 2171 bytes .../INSTALLER | 0 .../LICENSE | 0 .../METADATA | 78 +- .../pytest-7.4.3.dist-info/RECORD | 154 + .../REQUESTED | 0 .../WHEEL | 2 +- .../entry_points.txt | 0 .../top_level.txt | 0 .../pytest-9.0.1.dist-info/RECORD | 158 -- .../python3.12/site-packages/pytest-cov.pth | 1 + .../site-packages/pytest/__init__.py | 101 +- .../site-packages/pytest/__main__.py | 4 - .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 4388 bytes .../__pycache__/__main__.cpython-312.pyc | Bin 0 -> 389 bytes .../INSTALLER | 0 .../LICENSE | 0 .../METADATA | 54 +- .../pytest_asyncio-0.21.1.dist-info/RECORD | 15 + .../REQUESTED | 0 .../WHEEL | 2 +- .../entry_points.txt | 0 .../top_level.txt | 0 .../pytest_asyncio-1.3.0.dist-info/RECORD | 13 - .../site-packages/pytest_asyncio/__init__.py | 12 +- .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 378 bytes .../__pycache__/_version.cpython-312.pyc | Bin 0 -> 314 bytes .../__pycache__/plugin.cpython-312.pyc | Bin 0 -> 25430 bytes .../site-packages/pytest_asyncio/_version.py | 4 + .../site-packages/pytest_asyncio/plugin.py | 1034 +++---- .../AUTHORS.rst | 16 +- .../INSTALLER | 0 .../LICENSE | 0 .../METADATA | 214 +- .../pytest_cov-4.1.0.dist-info/RECORD | 20 + .../REQUESTED | 0 .../WHEEL | 2 +- .../entry_points.txt | 0 .../pytest_cov-4.1.0.dist-info/top_level.txt | 1 + .../pytest_cov-7.0.0.dist-info/RECORD | 14 - .../site-packages/pytest_cov/__init__.py | 41 +- .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 301 bytes .../__pycache__/compat.cpython-312.pyc | Bin 0 -> 1325 bytes .../__pycache__/embed.cpython-312.pyc | Bin 0 -> 4382 bytes .../__pycache__/engine.cpython-312.pyc | Bin 0 -> 22513 bytes .../__pycache__/plugin.cpython-312.pyc | Bin 0 -> 20620 bytes .../site-packages/pytest_cov/compat.py | 24 + .../site-packages/pytest_cov/embed.py | 122 + .../site-packages/pytest_cov/engine.py | 311 +-- .../site-packages/pytest_cov/plugin.py | 328 +-- .../INSTALLER | 0 .../LICENSE | 0 .../METADATA | 28 +- .../pytest_mock-3.12.0.dist-info/RECORD | 17 + .../pytest_mock-3.12.0.dist-info/REQUESTED | 0 .../WHEEL | 3 +- .../entry_points.txt | 0 .../top_level.txt | 0 .../pytest_mock-3.15.1.dist-info/RECORD | 17 - .../site-packages/pytest_mock/__init__.py | 8 +- .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 651 bytes .../__pycache__/_util.cpython-312.pyc | Bin 0 -> 1341 bytes .../__pycache__/_version.cpython-312.pyc | Bin 0 -> 597 bytes .../__pycache__/plugin.cpython-312.pyc | Bin 0 -> 27900 bytes .../site-packages/pytest_mock/_version.py | 26 +- .../site-packages/pytest_mock/plugin.py | 205 +- .../__pycache__/__init__.cpython-312.pyc | Bin 591 -> 591 bytes .../__pycache__/decoders.cpython-312.pyc | Bin 8339 -> 8339 bytes .../__pycache__/exceptions.cpython-312.pyc | Bin 1760 -> 1760 bytes .../__pycache__/multipart.cpython-312.pyc | Bin 67821 -> 67821 bytes .../qrcode/__pycache__/LUT.cpython-312.pyc | Bin 1729 -> 1729 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 1082 -> 1082 bytes .../qrcode/__pycache__/base.cpython-312.pyc | Bin 9420 -> 9420 bytes .../__pycache__/constants.cpython-312.pyc | Bin 311 -> 311 bytes .../__pycache__/exceptions.cpython-312.pyc | Bin 385 -> 385 bytes .../qrcode/__pycache__/main.cpython-312.pyc | Bin 23067 -> 23067 bytes .../qrcode/__pycache__/util.cpython-312.pyc | Bin 22825 -> 22825 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 196 -> 196 bytes .../compat/__pycache__/pil.cpython-312.pyc | Bin 424 -> 424 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 195 -> 195 bytes .../image/__pycache__/base.cpython-312.pyc | Bin 7861 -> 7861 bytes .../image/__pycache__/pure.cpython-312.pyc | Bin 3033 -> 3033 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 202 -> 202 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 556 -> 556 bytes .../__pycache__/base.cpython-312.pyc | Bin 1829 -> 1829 bytes .../__pycache__/pil.cpython-312.pyc | Bin 16590 -> 16590 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 5420 -> 5420 bytes .../__pycache__/__version__.cpython-312.pyc | Bin 584 -> 584 bytes .../_internal_utils.cpython-312.pyc | Bin 2024 -> 2024 bytes .../__pycache__/adapters.cpython-312.pyc | Bin 27811 -> 27811 bytes .../requests/__pycache__/api.cpython-312.pyc | Bin 7204 -> 7204 bytes .../requests/__pycache__/auth.cpython-312.pyc | Bin 13923 -> 13923 bytes .../__pycache__/certs.cpython-312.pyc | Bin 666 -> 666 bytes .../__pycache__/compat.cpython-312.pyc | Bin 2380 -> 2380 bytes .../__pycache__/cookies.cpython-312.pyc | Bin 25276 -> 25276 bytes .../__pycache__/exceptions.cpython-312.pyc | Bin 7585 -> 7585 bytes .../__pycache__/hooks.cpython-312.pyc | Bin 1052 -> 1052 bytes .../__pycache__/models.cpython-312.pyc | Bin 35501 -> 35501 bytes .../__pycache__/packages.cpython-312.pyc | Bin 1139 -> 1139 bytes .../__pycache__/sessions.cpython-312.pyc | Bin 27890 -> 27890 bytes .../__pycache__/status_codes.cpython-312.pyc | Bin 6031 -> 6031 bytes .../__pycache__/structures.cpython-312.pyc | Bin 5617 -> 5617 bytes .../__pycache__/utils.cpython-312.pyc | Bin 36178 -> 36178 bytes .../rich/__pycache__/__init__.cpython-312.pyc | Bin 6991 -> 6991 bytes .../__pycache__/_cell_widths.cpython-312.pyc | Bin 7872 -> 7872 bytes .../__pycache__/_emoji_codes.cpython-312.pyc | Bin 205976 -> 205976 bytes .../_emoji_replace.cpython-312.pyc | Bin 1729 -> 1729 bytes .../_export_format.cpython-312.pyc | Bin 2349 -> 2349 bytes .../__pycache__/_extension.cpython-312.pyc | Bin 513 -> 513 bytes .../rich/__pycache__/_fileno.cpython-312.pyc | Bin 855 -> 855 bytes .../__pycache__/_log_render.cpython-312.pyc | Bin 4135 -> 4135 bytes .../rich/__pycache__/_loop.cpython-312.pyc | Bin 1885 -> 1885 bytes .../__pycache__/_null_file.cpython-312.pyc | Bin 3629 -> 3629 bytes .../__pycache__/_palettes.cpython-312.pyc | Bin 5160 -> 5160 bytes .../rich/__pycache__/_pick.cpython-312.pyc | Bin 726 -> 726 bytes .../rich/__pycache__/_ratio.cpython-312.pyc | Bin 6430 -> 6430 bytes .../__pycache__/_spinners.cpython-312.pyc | Bin 13179 -> 13179 bytes .../rich/__pycache__/_wrap.cpython-312.pyc | Bin 3336 -> 3336 bytes .../rich/__pycache__/abc.cpython-312.pyc | Bin 1596 -> 1596 bytes .../rich/__pycache__/align.cpython-312.pyc | Bin 12243 -> 12243 bytes .../rich/__pycache__/ansi.cpython-312.pyc | Bin 9121 -> 9121 bytes .../rich/__pycache__/box.cpython-312.pyc | Bin 11675 -> 11675 bytes .../rich/__pycache__/cells.cpython-312.pyc | Bin 5578 -> 5578 bytes .../rich/__pycache__/color.cpython-312.pyc | Bin 26553 -> 26553 bytes .../__pycache__/color_triplet.cpython-312.pyc | Bin 1701 -> 1701 bytes .../rich/__pycache__/console.cpython-312.pyc | Bin 115240 -> 115240 bytes .../__pycache__/constrain.cpython-312.pyc | Bin 2258 -> 2258 bytes .../__pycache__/containers.cpython-312.pyc | Bin 9231 -> 9231 bytes .../rich/__pycache__/control.cpython-312.pyc | Bin 10772 -> 10772 bytes .../default_styles.cpython-312.pyc | Bin 10492 -> 10492 bytes .../rich/__pycache__/emoji.cpython-312.pyc | Bin 4054 -> 4054 bytes .../rich/__pycache__/errors.cpython-312.pyc | Bin 1845 -> 1845 bytes .../__pycache__/file_proxy.cpython-312.pyc | Bin 3577 -> 3577 bytes .../rich/__pycache__/filesize.cpython-312.pyc | Bin 3057 -> 3057 bytes .../__pycache__/highlighter.cpython-312.pyc | Bin 9900 -> 9900 bytes .../rich/__pycache__/jupyter.cpython-312.pyc | Bin 5197 -> 5197 bytes .../rich/__pycache__/live.cpython-312.pyc | Bin 20132 -> 20132 bytes .../__pycache__/live_render.cpython-312.pyc | Bin 4750 -> 4750 bytes .../rich/__pycache__/markup.cpython-312.pyc | Bin 9566 -> 9566 bytes .../rich/__pycache__/measure.cpython-312.pyc | Bin 6376 -> 6376 bytes .../rich/__pycache__/padding.cpython-312.pyc | Bin 6931 -> 6931 bytes .../rich/__pycache__/pager.cpython-312.pyc | Bin 1820 -> 1820 bytes .../rich/__pycache__/palette.cpython-312.pyc | Bin 5242 -> 5242 bytes .../rich/__pycache__/panel.cpython-312.pyc | Bin 12729 -> 12729 bytes .../rich/__pycache__/pretty.cpython-312.pyc | Bin 40609 -> 40609 bytes .../rich/__pycache__/progress.cpython-312.pyc | Bin 75123 -> 75123 bytes .../__pycache__/progress_bar.cpython-312.pyc | Bin 10389 -> 10389 bytes .../rich/__pycache__/protocol.cpython-312.pyc | Bin 1780 -> 1780 bytes .../rich/__pycache__/region.cpython-312.pyc | Bin 567 -> 567 bytes .../rich/__pycache__/repr.cpython-312.pyc | Bin 6612 -> 6612 bytes .../rich/__pycache__/scope.cpython-312.pyc | Bin 3818 -> 3818 bytes .../rich/__pycache__/screen.cpython-312.pyc | Bin 2472 -> 2472 bytes .../rich/__pycache__/segment.cpython-312.pyc | Bin 28547 -> 28547 bytes .../rich/__pycache__/spinner.cpython-312.pyc | Bin 5925 -> 5925 bytes .../rich/__pycache__/style.cpython-312.pyc | Bin 33431 -> 33431 bytes .../rich/__pycache__/styled.cpython-312.pyc | Bin 2115 -> 2115 bytes .../rich/__pycache__/syntax.cpython-312.pyc | Bin 40884 -> 40884 bytes .../rich/__pycache__/table.cpython-312.pyc | Bin 43858 -> 43858 bytes .../terminal_theme.cpython-312.pyc | Bin 3348 -> 3348 bytes .../rich/__pycache__/text.cpython-312.pyc | Bin 61242 -> 61242 bytes .../rich/__pycache__/theme.cpython-312.pyc | Bin 6332 -> 6332 bytes .../rich/__pycache__/themes.cpython-312.pyc | Bin 314 -> 314 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 311 -> 311 bytes .../__pycache__/errors.cpython-312.pyc | Bin 1249 -> 1249 bytes .../__pycache__/extension.cpython-312.pyc | Bin 36356 -> 36356 bytes .../slowapi/__pycache__/util.cpython-312.pyc | Bin 1324 -> 1324 bytes .../__pycache__/wrappers.cpython-312.pyc | Bin 5333 -> 5333 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 466 -> 466 bytes .../sniffio/__pycache__/_impl.cpython-312.pyc | Bin 3177 -> 3177 bytes .../__pycache__/_version.cpython-312.pyc | Bin 218 -> 218 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 9478 -> 9478 bytes .../__pycache__/events.cpython-312.pyc | Bin 566 -> 566 bytes .../__pycache__/exc.cpython-312.pyc | Bin 31228 -> 31228 bytes .../__pycache__/inspection.cpython-312.pyc | Bin 6629 -> 6629 bytes .../__pycache__/log.cpython-312.pyc | Bin 11627 -> 11627 bytes .../__pycache__/schema.cpython-312.pyc | Bin 2345 -> 2345 bytes .../__pycache__/types.cpython-312.pyc | Bin 2293 -> 2293 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 605 -> 605 bytes .../__pycache__/pyodbc.cpython-312.pyc | Bin 9382 -> 9382 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 205 -> 205 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 1894 -> 1894 bytes .../__pycache__/_typing.cpython-312.pyc | Bin 903 -> 903 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 1966 -> 1966 bytes .../__pycache__/aiomysql.cpython-312.pyc | Bin 16177 -> 16177 bytes .../mysql/__pycache__/asyncmy.cpython-312.pyc | Bin 16663 -> 16663 bytes .../mysql/__pycache__/base.cpython-312.pyc | Bin 136794 -> 136794 bytes .../mysql/__pycache__/cymysql.cpython-312.pyc | Bin 3148 -> 3148 bytes .../mysql/__pycache__/dml.cpython-312.pyc | Bin 8221 -> 8221 bytes .../__pycache__/enumerated.cpython-312.pyc | Bin 10199 -> 10199 bytes .../__pycache__/expression.cpython-312.pyc | Bin 5027 -> 5027 bytes .../mysql/__pycache__/json.cpython-312.pyc | Bin 3452 -> 3452 bytes .../mariadbconnector.cpython-312.pyc | Bin 11908 -> 11908 bytes .../mysqlconnector.cpython-312.pyc | Bin 9094 -> 9094 bytes .../mysql/__pycache__/mysqldb.cpython-312.pyc | Bin 12083 -> 12083 bytes .../mysql/__pycache__/pymysql.cpython-312.pyc | Bin 5274 -> 5274 bytes .../mysql/__pycache__/pyodbc.cpython-312.pyc | Bin 5270 -> 5270 bytes .../__pycache__/reflection.cpython-312.pyc | Bin 23948 -> 23948 bytes .../reserved_words.cpython-312.pyc | Bin 4378 -> 4378 bytes .../mysql/__pycache__/types.cpython-312.pyc | Bin 30402 -> 30402 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 3341 -> 3341 bytes .../_psycopg_common.cpython-312.pyc | Bin 7709 -> 7709 bytes .../__pycache__/array.cpython-312.pyc | Bin 16588 -> 16588 bytes .../__pycache__/asyncpg.cpython-312.pyc | Bin 56603 -> 56603 bytes .../__pycache__/base.cpython-312.pyc | Bin 200794 -> 200794 bytes .../__pycache__/dml.cpython-312.pyc | Bin 11617 -> 11617 bytes .../__pycache__/ext.cpython-312.pyc | Bin 19254 -> 19254 bytes .../__pycache__/hstore.cpython-312.pyc | Bin 15368 -> 15368 bytes .../__pycache__/json.cpython-312.pyc | Bin 13561 -> 13561 bytes .../__pycache__/named_types.cpython-312.pyc | Bin 22272 -> 22272 bytes .../__pycache__/operators.cpython-312.pyc | Bin 2166 -> 2166 bytes .../__pycache__/pg8000.cpython-312.pyc | Bin 30067 -> 30067 bytes .../__pycache__/pg_catalog.cpython-312.pyc | Bin 10466 -> 10466 bytes .../__pycache__/psycopg.cpython-312.pyc | Bin 35921 -> 35921 bytes .../__pycache__/psycopg2.cpython-312.pyc | Bin 35693 -> 35693 bytes .../__pycache__/psycopg2cffi.cpython-312.pyc | Bin 2173 -> 2173 bytes .../__pycache__/ranges.cpython-312.pyc | Bin 31586 -> 31586 bytes .../__pycache__/types.cpython-312.pyc | Bin 11055 -> 11055 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 2284 -> 2284 bytes .../_py_processors.cpython-312.pyc | Bin 4507 -> 4507 bytes .../engine/__pycache__/base.cpython-312.pyc | Bin 129679 -> 129679 bytes .../characteristics.cpython-312.pyc | Bin 3751 -> 3751 bytes .../engine/__pycache__/create.cpython-312.pyc | Bin 33701 -> 33701 bytes .../engine/__pycache__/cursor.cpython-312.pyc | Bin 77372 -> 77372 bytes .../__pycache__/default.cpython-312.pyc | Bin 86726 -> 86726 bytes .../engine/__pycache__/events.cpython-312.pyc | Bin 39917 -> 39917 bytes .../__pycache__/interfaces.cpython-312.pyc | Bin 99386 -> 99386 bytes .../engine/__pycache__/mock.cpython-312.pyc | Bin 5707 -> 5707 bytes .../__pycache__/processors.cpython-312.pyc | Bin 1298 -> 1298 bytes .../__pycache__/reflection.cpython-312.pyc | Bin 80323 -> 80323 bytes .../engine/__pycache__/result.cpython-312.pyc | Bin 91275 -> 91275 bytes .../engine/__pycache__/row.cpython-312.pyc | Bin 17440 -> 17440 bytes .../__pycache__/strategies.cpython-312.pyc | Bin 567 -> 567 bytes .../engine/__pycache__/url.cpython-312.pyc | Bin 34316 -> 34316 bytes .../engine/__pycache__/util.cpython-312.pyc | Bin 6624 -> 6624 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 847 -> 847 bytes .../event/__pycache__/api.cpython-312.pyc | Bin 9205 -> 9205 bytes .../event/__pycache__/attr.cpython-312.pyc | Bin 29895 -> 29895 bytes .../event/__pycache__/base.cpython-312.pyc | Bin 19614 -> 19614 bytes .../event/__pycache__/legacy.cpython-312.pyc | Bin 9394 -> 9394 bytes .../__pycache__/registry.cpython-312.pyc | Bin 12622 -> 12622 bytes .../ext/__pycache__/__init__.cpython-312.pyc | Bin 360 -> 360 bytes .../ext/__pycache__/compiler.cpython-312.pyc | Bin 20657 -> 20657 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 2019 -> 2019 bytes .../__pycache__/extensions.cpython-312.pyc | Bin 21302 -> 21302 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 470 -> 470 bytes .../future/__pycache__/engine.cpython-312.pyc | Bin 403 -> 403 bytes .../orm/__pycache__/__init__.cpython-312.pyc | Bin 6351 -> 6351 bytes .../_orm_constructors.cpython-312.pyc | Bin 101643 -> 101643 bytes .../orm/__pycache__/_typing.cpython-312.pyc | Bin 6722 -> 6722 bytes .../__pycache__/attributes.cpython-312.pyc | Bin 99788 -> 99788 bytes .../orm/__pycache__/base.cpython-312.pyc | Bin 30177 -> 30177 bytes .../bulk_persistence.cpython-312.pyc | Bin 63261 -> 63261 bytes .../__pycache__/clsregistry.cpython-312.pyc | Bin 23820 -> 23820 bytes .../__pycache__/collections.cpython-312.pyc | Bin 61894 -> 61894 bytes .../orm/__pycache__/context.cpython-312.pyc | Bin 100377 -> 100377 bytes .../orm/__pycache__/decl_api.cpython-312.pyc | Bin 66298 -> 66298 bytes .../orm/__pycache__/decl_base.cpython-312.pyc | Bin 68143 -> 68143 bytes .../__pycache__/dependency.cpython-312.pyc | Bin 43351 -> 43351 bytes .../descriptor_props.cpython-312.pyc | Bin 48905 -> 48905 bytes .../orm/__pycache__/dynamic.cpython-312.pyc | Bin 12916 -> 12916 bytes .../orm/__pycache__/evaluator.cpython-312.pyc | Bin 16184 -> 16184 bytes .../orm/__pycache__/events.cpython-312.pyc | Bin 136703 -> 136703 bytes .../orm/__pycache__/exc.cpython-312.pyc | Bin 9853 -> 9853 bytes .../orm/__pycache__/identity.cpython-312.pyc | Bin 12633 -> 12633 bytes .../instrumentation.cpython-312.pyc | Bin 31230 -> 31230 bytes .../__pycache__/interfaces.cpython-312.pyc | Bin 53668 -> 53668 bytes .../orm/__pycache__/loading.cpython-312.pyc | Bin 46539 -> 46539 bytes .../mapped_collection.cpython-312.pyc | Bin 21913 -> 21913 bytes .../orm/__pycache__/mapper.cpython-312.pyc | Bin 168320 -> 168320 bytes .../__pycache__/path_registry.cpython-312.pyc | Bin 31466 -> 31466 bytes .../__pycache__/persistence.cpython-312.pyc | Bin 48324 -> 48324 bytes .../__pycache__/properties.cpython-312.pyc | Bin 32862 -> 32862 bytes .../orm/__pycache__/query.cpython-312.pyc | Bin 127584 -> 127584 bytes .../__pycache__/relationships.cpython-312.pyc | Bin 128823 -> 128823 bytes .../orm/__pycache__/scoping.cpython-312.pyc | Bin 83570 -> 83570 bytes .../orm/__pycache__/session.cpython-312.pyc | Bin 200966 -> 200966 bytes .../orm/__pycache__/state.cpython-312.pyc | Bin 45130 -> 45130 bytes .../__pycache__/state_changes.cpython-312.pyc | Bin 7032 -> 7032 bytes .../__pycache__/strategies.cpython-312.pyc | Bin 103067 -> 103067 bytes .../strategy_options.cpython-312.pyc | Bin 86429 -> 86429 bytes .../orm/__pycache__/sync.cpython-312.pyc | Bin 6573 -> 6573 bytes .../__pycache__/unitofwork.cpython-312.pyc | Bin 34104 -> 34104 bytes .../orm/__pycache__/util.cpython-312.pyc | Bin 85057 -> 85057 bytes .../orm/__pycache__/writeonly.cpython-312.pyc | Bin 28842 -> 28842 bytes .../pool/__pycache__/__init__.cpython-312.pyc | Bin 1521 -> 1521 bytes .../pool/__pycache__/base.cpython-312.pyc | Bin 56269 -> 56269 bytes .../pool/__pycache__/events.cpython-312.pyc | Bin 14278 -> 14278 bytes .../pool/__pycache__/impl.cpython-312.pyc | Bin 24706 -> 24706 bytes .../sql/__pycache__/__init__.cpython-312.pyc | Bin 4694 -> 4694 bytes .../_dml_constructors.cpython-312.pyc | Bin 4102 -> 4102 bytes .../_elements_constructors.cpython-312.pyc | Bin 65674 -> 65674 bytes .../__pycache__/_orm_types.cpython-312.pyc | Bin 634 -> 634 bytes .../_selectable_constructors.cpython-312.pyc | Bin 21383 -> 21383 bytes .../sql/__pycache__/_typing.cpython-312.pyc | Bin 13831 -> 13831 bytes .../__pycache__/annotation.cpython-312.pyc | Bin 21327 -> 21327 bytes .../sql/__pycache__/base.cpython-312.pyc | Bin 97514 -> 97514 bytes .../sql/__pycache__/cache_key.cpython-312.pyc | Bin 35351 -> 35351 bytes .../sql/__pycache__/coercions.cpython-312.pyc | Bin 48534 -> 48534 bytes .../sql/__pycache__/compiler.cpython-312.pyc | Bin 268766 -> 268766 bytes .../sql/__pycache__/crud.cpython-312.pyc | Bin 45474 -> 45474 bytes .../sql/__pycache__/ddl.cpython-312.pyc | Bin 56128 -> 56128 bytes .../default_comparator.cpython-312.pyc | Bin 19485 -> 19485 bytes .../sql/__pycache__/dml.cpython-312.pyc | Bin 73414 -> 73414 bytes .../sql/__pycache__/elements.cpython-312.pyc | Bin 203082 -> 203082 bytes .../sql/__pycache__/events.cpython-312.pyc | Bin 19221 -> 19221 bytes .../__pycache__/expression.cpython-312.pyc | Bin 5156 -> 5156 bytes .../sql/__pycache__/functions.cpython-312.pyc | Bin 68588 -> 68588 bytes .../sql/__pycache__/lambdas.cpython-312.pyc | Bin 54948 -> 54948 bytes .../sql/__pycache__/naming.cpython-312.pyc | Bin 8483 -> 8483 bytes .../sql/__pycache__/operators.cpython-312.pyc | Bin 88952 -> 88952 bytes .../sql/__pycache__/roles.cpython-312.pyc | Bin 12259 -> 12259 bytes .../sql/__pycache__/schema.cpython-312.pyc | Bin 244039 -> 244039 bytes .../__pycache__/selectable.cpython-312.pyc | Bin 255996 -> 255996 bytes .../sql/__pycache__/sqltypes.cpython-312.pyc | Bin 149145 -> 149145 bytes .../__pycache__/traversals.cpython-312.pyc | Bin 42415 -> 42415 bytes .../sql/__pycache__/type_api.cpython-312.pyc | Bin 85060 -> 85060 bytes .../sql/__pycache__/util.cpython-312.pyc | Bin 54390 -> 54390 bytes .../sql/__pycache__/visitors.cpython-312.pyc | Bin 35994 -> 35994 bytes .../util/__pycache__/__init__.cpython-312.pyc | Bin 5641 -> 5641 bytes .../__pycache__/_collections.cpython-312.pyc | Bin 31611 -> 31611 bytes .../_concurrency_py3k.cpython-312.pyc | Bin 8997 -> 8997 bytes .../util/__pycache__/_has_cy.cpython-312.pyc | Bin 1099 -> 1099 bytes .../util/__pycache__/compat.cpython-312.pyc | Bin 13019 -> 13019 bytes .../__pycache__/concurrency.cpython-312.pyc | Bin 2083 -> 2083 bytes .../__pycache__/deprecations.cpython-312.pyc | Bin 13628 -> 13628 bytes .../__pycache__/langhelpers.cpython-312.pyc | Bin 84148 -> 84148 bytes .../__pycache__/preloaded.cpython-312.pyc | Bin 5900 -> 5900 bytes .../util/__pycache__/queue.cpython-312.pyc | Bin 14641 -> 14641 bytes .../__pycache__/topological.cpython-312.pyc | Bin 3946 -> 3946 bytes .../util/__pycache__/typing.cpython-312.pyc | Bin 18983 -> 18983 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 219 -> 219 bytes .../_exception_handler.cpython-312.pyc | Bin 3083 -> 3083 bytes .../__pycache__/_utils.cpython-312.pyc | Bin 5123 -> 5123 bytes .../__pycache__/applications.cpython-312.pyc | Bin 12899 -> 12899 bytes .../__pycache__/background.cpython-312.pyc | Bin 2545 -> 2545 bytes .../__pycache__/concurrency.cpython-312.pyc | Bin 3215 -> 3215 bytes .../__pycache__/config.cpython-312.pyc | Bin 7528 -> 7528 bytes .../__pycache__/convertors.cpython-312.pyc | Bin 4771 -> 4771 bytes .../datastructures.cpython-312.pyc | Bin 39482 -> 39482 bytes .../__pycache__/exceptions.cpython-312.pyc | Bin 2403 -> 2403 bytes .../__pycache__/formparsers.cpython-312.pyc | Bin 14305 -> 14305 bytes .../__pycache__/requests.cpython-312.pyc | Bin 16380 -> 16380 bytes .../__pycache__/responses.cpython-312.pyc | Bin 30355 -> 30355 bytes .../__pycache__/routing.cpython-312.pyc | Bin 44032 -> 44032 bytes .../__pycache__/staticfiles.cpython-312.pyc | Bin 11544 -> 11544 bytes .../__pycache__/status.cpython-312.pyc | Bin 5189 -> 5189 bytes .../__pycache__/types.cpython-312.pyc | Bin 1324 -> 1324 bytes .../__pycache__/websockets.cpython-312.pyc | Bin 11828 -> 11828 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 2536 -> 2536 bytes .../__pycache__/base.cpython-312.pyc | Bin 11893 -> 11893 bytes .../__pycache__/cors.cpython-312.pyc | Bin 7458 -> 7458 bytes .../__pycache__/errors.cpython-312.pyc | Bin 9944 -> 9944 bytes .../__pycache__/exceptions.cpython-312.pyc | Bin 4114 -> 4114 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 33748 -> 33748 bytes .../__pycache__/_api_mode.cpython-312.pyc | Bin 283 -> 283 bytes .../__pycache__/_api_version.cpython-312.pyc | Bin 432 -> 432 bytes .../__pycache__/_app_info.cpython-312.pyc | Bin 611 -> 611 bytes .../__pycache__/_base_address.cpython-312.pyc | Bin 785 -> 785 bytes .../__pycache__/_encode.cpython-312.pyc | Bin 2983 -> 2983 bytes .../stripe/__pycache__/_error.cpython-312.pyc | Bin 7288 -> 7288 bytes .../__pycache__/_error_object.cpython-312.pyc | Bin 3305 -> 3305 bytes .../__pycache__/_http_client.cpython-312.pyc | Bin 56906 -> 56906 bytes .../_request_metrics.cpython-312.pyc | Bin 1058 -> 1058 bytes .../_request_options.cpython-312.pyc | Bin 3077 -> 3077 bytes .../_requestor_options.cpython-312.pyc | Bin 4143 -> 4143 bytes .../_stripe_object.cpython-312.pyc | Bin 22976 -> 22976 bytes .../_stripe_response.cpython-312.pyc | Bin 3859 -> 3859 bytes .../stripe/__pycache__/_util.cpython-312.pyc | Bin 15711 -> 15711 bytes .../__pycache__/_version.cpython-312.pyc | Bin 212 -> 212 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 200 -> 200 bytes .../__pycache__/introspection.cpython-312.pyc | Bin 17804 -> 17804 bytes .../typing_objects.cpython-312.pyc | Bin 17381 -> 17381 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 7315 -> 7315 bytes .../_base_connection.cpython-312.pyc | Bin 6853 -> 6853 bytes .../__pycache__/_collections.cpython-312.pyc | Bin 22574 -> 22574 bytes .../_request_methods.cpython-312.pyc | Bin 10607 -> 10607 bytes .../__pycache__/_version.cpython-312.pyc | Bin 651 -> 651 bytes .../__pycache__/connection.cpython-312.pyc | Bin 38418 -> 38418 bytes .../connectionpool.cpython-312.pyc | Bin 39740 -> 39740 bytes .../__pycache__/exceptions.cpython-312.pyc | Bin 16616 -> 16616 bytes .../__pycache__/fields.cpython-312.pyc | Bin 12027 -> 12027 bytes .../__pycache__/filepost.cpython-312.pyc | Bin 3494 -> 3494 bytes .../__pycache__/poolmanager.cpython-312.pyc | Bin 24408 -> 24408 bytes .../__pycache__/response.cpython-312.pyc | Bin 52718 -> 52718 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 198 -> 198 bytes .../contrib/__pycache__/socks.cpython-312.pyc | Bin 8176 -> 8176 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 1751 -> 1751 bytes .../http2/__pycache__/probe.cpython-312.pyc | Bin 3702 -> 3702 bytes .../util/__pycache__/__init__.cpython-312.pyc | Bin 1011 -> 1011 bytes .../__pycache__/connection.cpython-312.pyc | Bin 4701 -> 4701 bytes .../util/__pycache__/proxy.cpython-312.pyc | Bin 1223 -> 1223 bytes .../util/__pycache__/request.cpython-312.pyc | Bin 8323 -> 8323 bytes .../util/__pycache__/response.cpython-312.pyc | Bin 2879 -> 2879 bytes .../util/__pycache__/retry.cpython-312.pyc | Bin 20292 -> 20292 bytes .../util/__pycache__/ssl_.cpython-312.pyc | Bin 17175 -> 17175 bytes .../ssl_match_hostname.cpython-312.pyc | Bin 5563 -> 5563 bytes .../__pycache__/ssltransport.cpython-312.pyc | Bin 13330 -> 13330 bytes .../util/__pycache__/timeout.cpython-312.pyc | Bin 11695 -> 11695 bytes .../util/__pycache__/url.cpython-312.pyc | Bin 16232 -> 16232 bytes .../util/__pycache__/util.cpython-312.pyc | Bin 2000 -> 2000 bytes .../util/__pycache__/wait.cpython-312.pyc | Bin 3446 -> 3446 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 388 -> 388 bytes .../__pycache__/_subprocess.cpython-312.pyc | Bin 2769 -> 2769 bytes .../__pycache__/_types.cpython-312.pyc | Bin 11610 -> 11610 bytes .../__pycache__/config.cpython-312.pyc | Bin 25237 -> 25237 bytes .../__pycache__/importer.cpython-312.pyc | Bin 1792 -> 1792 bytes .../__pycache__/logging.cpython-312.pyc | Bin 8003 -> 8003 bytes .../uvicorn/__pycache__/main.cpython-312.pyc | Bin 20339 -> 20339 bytes .../__pycache__/server.cpython-312.pyc | Bin 16129 -> 16129 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 199 -> 199 bytes .../lifespan/__pycache__/on.cpython-312.pyc | Bin 7940 -> 7940 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 196 -> 196 bytes .../loops/__pycache__/auto.cpython-312.pyc | Bin 663 -> 663 bytes .../loops/__pycache__/uvloop.cpython-312.pyc | Bin 549 -> 549 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 201 -> 201 bytes .../__pycache__/asgi2.cpython-312.pyc | Bin 1061 -> 1061 bytes .../message_logger.cpython-312.pyc | Bin 4407 -> 4407 bytes .../__pycache__/proxy_headers.cpython-312.pyc | Bin 3707 -> 3707 bytes .../__pycache__/wsgi.cpython-312.pyc | Bin 9844 -> 9844 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 200 -> 200 bytes .../__pycache__/utils.cpython-312.pyc | Bin 2985 -> 2985 bytes .../http/__pycache__/__init__.cpython-312.pyc | Bin 205 -> 205 bytes .../http/__pycache__/auto.cpython-312.pyc | Bin 628 -> 628 bytes .../__pycache__/flow_control.cpython-312.pyc | Bin 3157 -> 3157 bytes .../httptools_impl.cpython-312.pyc | Bin 29000 -> 29000 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 211 -> 211 bytes .../__pycache__/auto.cpython-312.pyc | Bin 845 -> 845 bytes .../websockets_impl.cpython-312.pyc | Bin 18376 -> 18376 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 893 -> 893 bytes .../__pycache__/basereload.cpython-312.pyc | Bin 6947 -> 6947 bytes .../__pycache__/multiprocess.cpython-312.pyc | Bin 4093 -> 4093 bytes .../watchfilesreload.cpython-312.pyc | Bin 4512 -> 4512 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 10334 -> 10334 bytes .../uvloop/__pycache__/_noop.cpython-312.pyc | Bin 346 -> 346 bytes .../__pycache__/_version.cpython-312.pyc | Bin 218 -> 218 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 613 -> 613 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 552 -> 552 bytes .../__pycache__/filters.cpython-312.pyc | Bin 7219 -> 7219 bytes .../__pycache__/main.cpython-312.pyc | Bin 17149 -> 17149 bytes .../__pycache__/run.cpython-312.pyc | Bin 19508 -> 19508 bytes .../__pycache__/version.cpython-312.pyc | Bin 286 -> 286 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 12001 -> 12001 bytes .../__pycache__/labels.cpython-312.pyc | Bin 7132 -> 7132 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 4494 -> 4494 bytes .../datastructures.cpython-312.pyc | Bin 8906 -> 8906 bytes .../__pycache__/exceptions.cpython-312.pyc | Bin 17939 -> 17939 bytes .../__pycache__/frames.cpython-312.pyc | Bin 16025 -> 16025 bytes .../__pycache__/headers.cpython-312.pyc | Bin 18151 -> 18151 bytes .../__pycache__/http11.cpython-312.pyc | Bin 15493 -> 15493 bytes .../__pycache__/imports.cpython-312.pyc | Bin 3417 -> 3417 bytes .../__pycache__/protocol.cpython-312.pyc | Bin 25404 -> 25404 bytes .../__pycache__/server.cpython-312.pyc | Bin 23067 -> 23067 bytes .../__pycache__/streams.cpython-312.pyc | Bin 5456 -> 5456 bytes .../__pycache__/typing.cpython-312.pyc | Bin 1263 -> 1263 bytes .../__pycache__/utils.cpython-312.pyc | Bin 2239 -> 2239 bytes .../__pycache__/version.cpython-312.pyc | Bin 2986 -> 2986 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 201 -> 201 bytes .../__pycache__/compatibility.cpython-312.pyc | Bin 1077 -> 1077 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 316 -> 316 bytes .../__pycache__/base.cpython-312.pyc | Bin 3930 -> 3930 bytes .../permessage_deflate.cpython-312.pyc | Bin 19444 -> 19444 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 486 -> 486 bytes .../__pycache__/exceptions.cpython-312.pyc | Bin 3334 -> 3334 bytes .../__pycache__/framing.cpython-312.pyc | Bin 8203 -> 8203 bytes .../__pycache__/handshake.cpython-312.pyc | Bin 6320 -> 6320 bytes .../legacy/__pycache__/http.cpython-312.pyc | Bin 7708 -> 7708 bytes .../__pycache__/protocol.cpython-312.pyc | Bin 64131 -> 64131 bytes .../legacy/__pycache__/server.cpython-312.pyc | Bin 46724 -> 46724 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 1464 -> 1464 bytes .../__pycache__/__wrapt__.cpython-312.pyc | Bin 1328 -> 1328 bytes .../__pycache__/arguments.cpython-312.pyc | Bin 3959 -> 3959 bytes .../__pycache__/decorators.cpython-312.pyc | Bin 14603 -> 14603 bytes .../__pycache__/importer.cpython-312.pyc | Bin 10580 -> 10580 bytes .../wrapt/__pycache__/patches.cpython-312.pyc | Bin 10764 -> 10764 bytes .../wrapt/__pycache__/proxies.cpython-312.pyc | Bin 12802 -> 12802 bytes .../__pycache__/weakrefs.cpython-312.pyc | Bin 3631 -> 3631 bytes .../__pycache__/wrappers.cpython-312.pyc | Bin 35447 -> 35447 bytes Frontend/src/App.tsx | 19 + .../features/rooms/contexts/RoomContext.tsx | 55 +- .../rooms/services/advancedRoomService.ts | 5 +- .../features/rooms/services/roomService.ts | 81 +- .../team-chat/components/TeamChatPage.tsx | 848 ++++++ Frontend/src/features/team-chat/index.ts | 12 + .../team-chat/services/teamChatService.ts | 167 ++ Frontend/src/pages/AccountantLayout.tsx | 6 + Frontend/src/pages/AdminLayout.tsx | 6 + Frontend/src/pages/HousekeepingLayout.tsx | 68 +- Frontend/src/pages/StaffLayout.tsx | 6 + .../admin/AdvancedRoomManagementPage.tsx | 766 ++++- Frontend/src/pages/admin/EditRoomPage.tsx | 431 +-- Frontend/src/pages/admin/TeamChatPage.tsx | 9 + Frontend/src/pages/customer/DashboardPage.tsx | 87 + .../src/pages/housekeeping/ProfilePage.tsx | 1134 ++++++++ .../src/pages/housekeeping/TeamChatPage.tsx | 9 + Frontend/src/pages/housekeeping/index.ts | 1 + Frontend/src/pages/staff/DashboardPage.tsx | 80 +- .../pages/staff/GuestCommunicationPage.tsx | 3 +- Frontend/src/pages/staff/TeamChatPage.tsx | 9 + Frontend/src/shared/components/Header.tsx | 116 + .../shared/components/SidebarAccountant.tsx | 8 +- .../src/shared/components/SidebarAdmin.tsx | 82 +- .../src/shared/components/SidebarStaff.tsx | 21 +- docker-compose.yml | 11 +- 2211 files changed, 28086 insertions(+), 37066 deletions(-) create mode 100644 .env create mode 100644 Backend/alembic/versions/54e4d0db31a3_create_user_sessions_table.py create mode 100644 Backend/alembic/versions/__pycache__/54e4d0db31a3_create_user_sessions_table.cpython-312.pyc create mode 100644 Backend/alembic/versions/__pycache__/d709b14aa24a_create_gdpr_requests_table.cpython-312.pyc create mode 100644 Backend/alembic/versions/__pycache__/fe519abcefe7_add_email_verification_and_enhance_user_.cpython-312.pyc create mode 100644 Backend/alembic/versions/d709b14aa24a_create_gdpr_requests_table.py create mode 100644 Backend/alembic/versions/fe519abcefe7_add_email_verification_and_enhance_user_.py create mode 100644 Backend/seeders/__init__.py create mode 100644 Backend/seeders/__pycache__/__init__.cpython-312.pyc create mode 100644 Backend/seeders/__pycache__/banner_seeder.cpython-312.pyc create mode 100644 Backend/seeders/__pycache__/homepage_seeder.cpython-312.pyc create mode 100644 Backend/seeders/__pycache__/user_seeder.cpython-312.pyc create mode 100644 Backend/seeders/about_seeder.py create mode 100644 Backend/seeders/accessibility_seeder.py create mode 100644 Backend/seeders/banner_seeder.py create mode 100644 Backend/seeders/blog_seeder.py create mode 100644 Backend/seeders/cancellation_seeder.py create mode 100644 Backend/seeders/contact_seeder.py create mode 100644 Backend/seeders/faq_seeder.py create mode 100644 Backend/seeders/footer_seeder.py create mode 100644 Backend/seeders/homepage_seeder.py create mode 100644 Backend/seeders/privacy_seeder.py create mode 100644 Backend/seeders/refunds_seeder.py create mode 100644 Backend/seeders/room_seeder.py create mode 100755 Backend/seeders/run_seeder.py create mode 100644 Backend/seeders/service_seeder.py create mode 100644 Backend/seeders/settings_seeder.py create mode 100644 Backend/seeders/terms_seeder.py create mode 100644 Backend/seeders/user_seeder.py delete mode 100644 Backend/seeds_data/__pycache__/add_accountant_role.cpython-312.pyc delete mode 100644 Backend/seeds_data/__pycache__/seed_bookings.cpython-312.pyc delete mode 100644 Backend/seeds_data/__pycache__/seed_homepage_footer.cpython-312.pyc delete mode 100644 Backend/seeds_data/__pycache__/seed_initial_data.cpython-312.pyc delete mode 100644 Backend/seeds_data/add_accountant_role.py delete mode 100644 Backend/seeds_data/add_housekeeping_role.py delete mode 100644 Backend/seeds_data/add_housekeeping_user.py delete mode 100644 Backend/seeds_data/assign_housekeeping_tasks.py delete mode 100644 Backend/seeds_data/fix_blog_dates.py delete mode 100644 Backend/seeds_data/seed_about_page.py delete mode 100755 Backend/seeds_data/seed_all_test_data.py delete mode 100644 Backend/seeds_data/seed_banners_company.py delete mode 100644 Backend/seeds_data/seed_blog_posts.py delete mode 100755 Backend/seeds_data/seed_bookings.py delete mode 100644 Backend/seeds_data/seed_homepage_footer.py delete mode 100644 Backend/seeds_data/seed_initial_data.py delete mode 100644 Backend/seeds_data/seed_loyalty_rewards.py delete mode 100644 Backend/seeds_data/seed_luxury_content.py delete mode 100755 Backend/seeds_data/seed_policy_pages.py delete mode 100644 Backend/seeds_data/seed_promotions.py delete mode 100644 Backend/seeds_data/seed_rooms.py delete mode 100644 Backend/seeds_data/seed_services.py delete mode 100644 Backend/seeds_data/seed_services_enterprise.py delete mode 100644 Backend/seeds_data/seed_users.py create mode 100644 Backend/src/auth/models/__pycache__/email_verification_token.cpython-312.pyc create mode 100644 Backend/src/auth/models/__pycache__/password_history.cpython-312.pyc create mode 100644 Backend/src/auth/models/email_verification_token.py create mode 100644 Backend/src/auth/models/password_history.py create mode 100644 Backend/src/notifications/models/__pycache__/team_chat.cpython-312.pyc create mode 100644 Backend/src/notifications/models/team_chat.py create mode 100644 Backend/src/notifications/routes/__pycache__/team_chat_routes.cpython-312.pyc create mode 100644 Backend/src/notifications/routes/team_chat_routes.py create mode 100644 Backend/venv/lib/python3.12/site-packages/__pycache__/py.cpython-312.pyc create mode 100644 Backend/venv/lib/python3.12/site-packages/_pytest/__pycache__/__init__.cpython-312.pyc create mode 100644 Backend/venv/lib/python3.12/site-packages/_pytest/__pycache__/_argcomplete.cpython-312.pyc create mode 100644 Backend/venv/lib/python3.12/site-packages/_pytest/__pycache__/_version.cpython-312.pyc create mode 100644 Backend/venv/lib/python3.12/site-packages/_pytest/__pycache__/cacheprovider.cpython-312.pyc create mode 100644 Backend/venv/lib/python3.12/site-packages/_pytest/__pycache__/capture.cpython-312.pyc create mode 100644 Backend/venv/lib/python3.12/site-packages/_pytest/__pycache__/compat.cpython-312.pyc create mode 100644 Backend/venv/lib/python3.12/site-packages/_pytest/__pycache__/debugging.cpython-312.pyc create mode 100644 Backend/venv/lib/python3.12/site-packages/_pytest/__pycache__/deprecated.cpython-312.pyc create mode 100644 Backend/venv/lib/python3.12/site-packages/_pytest/__pycache__/doctest.cpython-312.pyc create mode 100644 Backend/venv/lib/python3.12/site-packages/_pytest/__pycache__/faulthandler.cpython-312.pyc create mode 100644 Backend/venv/lib/python3.12/site-packages/_pytest/__pycache__/fixtures.cpython-312.pyc create mode 100644 Backend/venv/lib/python3.12/site-packages/_pytest/__pycache__/freeze_support.cpython-312.pyc create mode 100644 Backend/venv/lib/python3.12/site-packages/_pytest/__pycache__/helpconfig.cpython-312.pyc create mode 100644 Backend/venv/lib/python3.12/site-packages/_pytest/__pycache__/hookspec.cpython-312.pyc create mode 100644 Backend/venv/lib/python3.12/site-packages/_pytest/__pycache__/junitxml.cpython-312.pyc create mode 100644 Backend/venv/lib/python3.12/site-packages/_pytest/__pycache__/legacypath.cpython-312.pyc create mode 100644 Backend/venv/lib/python3.12/site-packages/_pytest/__pycache__/logging.cpython-312.pyc create mode 100644 Backend/venv/lib/python3.12/site-packages/_pytest/__pycache__/main.cpython-312.pyc create mode 100644 Backend/venv/lib/python3.12/site-packages/_pytest/__pycache__/monkeypatch.cpython-312.pyc create mode 100644 Backend/venv/lib/python3.12/site-packages/_pytest/__pycache__/nodes.cpython-312.pyc create mode 100644 Backend/venv/lib/python3.12/site-packages/_pytest/__pycache__/nose.cpython-312.pyc create mode 100644 Backend/venv/lib/python3.12/site-packages/_pytest/__pycache__/outcomes.cpython-312.pyc create mode 100644 Backend/venv/lib/python3.12/site-packages/_pytest/__pycache__/pastebin.cpython-312.pyc create mode 100644 Backend/venv/lib/python3.12/site-packages/_pytest/__pycache__/pathlib.cpython-312.pyc create mode 100644 Backend/venv/lib/python3.12/site-packages/_pytest/__pycache__/pytester.cpython-312.pyc create mode 100644 Backend/venv/lib/python3.12/site-packages/_pytest/__pycache__/pytester_assertions.cpython-312.pyc create mode 100644 Backend/venv/lib/python3.12/site-packages/_pytest/__pycache__/python.cpython-312.pyc create mode 100644 Backend/venv/lib/python3.12/site-packages/_pytest/__pycache__/python_api.cpython-312.pyc create mode 100644 Backend/venv/lib/python3.12/site-packages/_pytest/__pycache__/python_path.cpython-312.pyc create mode 100644 Backend/venv/lib/python3.12/site-packages/_pytest/__pycache__/recwarn.cpython-312.pyc create mode 100644 Backend/venv/lib/python3.12/site-packages/_pytest/__pycache__/reports.cpython-312.pyc create mode 100644 Backend/venv/lib/python3.12/site-packages/_pytest/__pycache__/runner.cpython-312.pyc create mode 100644 Backend/venv/lib/python3.12/site-packages/_pytest/__pycache__/scope.cpython-312.pyc create mode 100644 Backend/venv/lib/python3.12/site-packages/_pytest/__pycache__/setuponly.cpython-312.pyc create mode 100644 Backend/venv/lib/python3.12/site-packages/_pytest/__pycache__/setupplan.cpython-312.pyc create mode 100644 Backend/venv/lib/python3.12/site-packages/_pytest/__pycache__/skipping.cpython-312.pyc create mode 100644 Backend/venv/lib/python3.12/site-packages/_pytest/__pycache__/stash.cpython-312.pyc create mode 100644 Backend/venv/lib/python3.12/site-packages/_pytest/__pycache__/stepwise.cpython-312.pyc create mode 100644 Backend/venv/lib/python3.12/site-packages/_pytest/__pycache__/terminal.cpython-312.pyc create mode 100644 Backend/venv/lib/python3.12/site-packages/_pytest/__pycache__/threadexception.cpython-312.pyc create mode 100644 Backend/venv/lib/python3.12/site-packages/_pytest/__pycache__/timing.cpython-312.pyc create mode 100644 Backend/venv/lib/python3.12/site-packages/_pytest/__pycache__/tmpdir.cpython-312.pyc create mode 100644 Backend/venv/lib/python3.12/site-packages/_pytest/__pycache__/unittest.cpython-312.pyc create mode 100644 Backend/venv/lib/python3.12/site-packages/_pytest/__pycache__/unraisableexception.cpython-312.pyc create mode 100644 Backend/venv/lib/python3.12/site-packages/_pytest/__pycache__/warning_types.cpython-312.pyc create mode 100644 Backend/venv/lib/python3.12/site-packages/_pytest/__pycache__/warnings.cpython-312.pyc create mode 100644 Backend/venv/lib/python3.12/site-packages/_pytest/_code/__pycache__/__init__.cpython-312.pyc create mode 100644 Backend/venv/lib/python3.12/site-packages/_pytest/_code/__pycache__/code.cpython-312.pyc create mode 100644 Backend/venv/lib/python3.12/site-packages/_pytest/_code/__pycache__/source.cpython-312.pyc create mode 100644 Backend/venv/lib/python3.12/site-packages/_pytest/_io/__pycache__/__init__.cpython-312.pyc create mode 100644 Backend/venv/lib/python3.12/site-packages/_pytest/_io/__pycache__/saferepr.cpython-312.pyc create mode 100644 Backend/venv/lib/python3.12/site-packages/_pytest/_io/__pycache__/terminalwriter.cpython-312.pyc create mode 100644 Backend/venv/lib/python3.12/site-packages/_pytest/_io/__pycache__/wcwidth.cpython-312.pyc delete mode 100644 Backend/venv/lib/python3.12/site-packages/_pytest/_io/pprint.py create mode 100644 Backend/venv/lib/python3.12/site-packages/_pytest/_py/__pycache__/__init__.cpython-312.pyc create mode 100644 Backend/venv/lib/python3.12/site-packages/_pytest/_py/__pycache__/error.cpython-312.pyc create mode 100644 Backend/venv/lib/python3.12/site-packages/_pytest/_py/__pycache__/path.cpython-312.pyc create mode 100644 Backend/venv/lib/python3.12/site-packages/_pytest/assertion/__pycache__/__init__.cpython-312.pyc create mode 100644 Backend/venv/lib/python3.12/site-packages/_pytest/assertion/__pycache__/rewrite.cpython-312.pyc create mode 100644 Backend/venv/lib/python3.12/site-packages/_pytest/assertion/__pycache__/truncate.cpython-312.pyc create mode 100644 Backend/venv/lib/python3.12/site-packages/_pytest/assertion/__pycache__/util.cpython-312.pyc create mode 100644 Backend/venv/lib/python3.12/site-packages/_pytest/config/__pycache__/__init__.cpython-312.pyc create mode 100644 Backend/venv/lib/python3.12/site-packages/_pytest/config/__pycache__/argparsing.cpython-312.pyc create mode 100644 Backend/venv/lib/python3.12/site-packages/_pytest/config/__pycache__/compat.cpython-312.pyc create mode 100644 Backend/venv/lib/python3.12/site-packages/_pytest/config/__pycache__/exceptions.cpython-312.pyc create mode 100644 Backend/venv/lib/python3.12/site-packages/_pytest/config/__pycache__/findpaths.cpython-312.pyc create mode 100644 Backend/venv/lib/python3.12/site-packages/_pytest/mark/__pycache__/__init__.cpython-312.pyc create mode 100644 Backend/venv/lib/python3.12/site-packages/_pytest/mark/__pycache__/expression.cpython-312.pyc create mode 100644 Backend/venv/lib/python3.12/site-packages/_pytest/mark/__pycache__/structures.cpython-312.pyc create mode 100644 Backend/venv/lib/python3.12/site-packages/_pytest/nose.py create mode 100644 Backend/venv/lib/python3.12/site-packages/_pytest/python_path.py delete mode 100644 Backend/venv/lib/python3.12/site-packages/_pytest/raises.py delete mode 100644 Backend/venv/lib/python3.12/site-packages/_pytest/subtests.py delete mode 100644 Backend/venv/lib/python3.12/site-packages/_pytest/tracemalloc.py create mode 100644 Backend/venv/lib/python3.12/site-packages/pip/__pycache__/__pip-runner__.cpython-312.pyc create mode 100644 Backend/venv/lib/python3.12/site-packages/pip/_internal/__pycache__/main.cpython-312.pyc create mode 100644 Backend/venv/lib/python3.12/site-packages/pip/_internal/commands/__pycache__/cache.cpython-312.pyc create mode 100644 Backend/venv/lib/python3.12/site-packages/pip/_internal/commands/__pycache__/check.cpython-312.pyc create mode 100644 Backend/venv/lib/python3.12/site-packages/pip/_internal/commands/__pycache__/completion.cpython-312.pyc create mode 100644 Backend/venv/lib/python3.12/site-packages/pip/_internal/commands/__pycache__/configuration.cpython-312.pyc create mode 100644 Backend/venv/lib/python3.12/site-packages/pip/_internal/commands/__pycache__/debug.cpython-312.pyc create mode 100644 Backend/venv/lib/python3.12/site-packages/pip/_internal/commands/__pycache__/download.cpython-312.pyc create mode 100644 Backend/venv/lib/python3.12/site-packages/pip/_internal/commands/__pycache__/hash.cpython-312.pyc create mode 100644 Backend/venv/lib/python3.12/site-packages/pip/_internal/commands/__pycache__/help.cpython-312.pyc create mode 100644 Backend/venv/lib/python3.12/site-packages/pip/_internal/commands/__pycache__/index.cpython-312.pyc create mode 100644 Backend/venv/lib/python3.12/site-packages/pip/_internal/commands/__pycache__/inspect.cpython-312.pyc create mode 100644 Backend/venv/lib/python3.12/site-packages/pip/_internal/commands/__pycache__/lock.cpython-312.pyc create mode 100644 Backend/venv/lib/python3.12/site-packages/pip/_internal/commands/__pycache__/search.cpython-312.pyc create mode 100644 Backend/venv/lib/python3.12/site-packages/pip/_internal/commands/__pycache__/uninstall.cpython-312.pyc create mode 100644 Backend/venv/lib/python3.12/site-packages/pip/_internal/commands/__pycache__/wheel.cpython-312.pyc create mode 100644 Backend/venv/lib/python3.12/site-packages/pip/_internal/locations/__pycache__/_distutils.cpython-312.pyc create mode 100644 Backend/venv/lib/python3.12/site-packages/pip/_internal/metadata/__pycache__/pkg_resources.cpython-312.pyc create mode 100644 Backend/venv/lib/python3.12/site-packages/pip/_internal/models/__pycache__/pylock.cpython-312.pyc create mode 100644 Backend/venv/lib/python3.12/site-packages/pip/_internal/network/__pycache__/xmlrpc.cpython-312.pyc create mode 100644 Backend/venv/lib/python3.12/site-packages/pip/_internal/resolution/legacy/__pycache__/__init__.cpython-312.pyc create mode 100644 Backend/venv/lib/python3.12/site-packages/pip/_internal/resolution/legacy/__pycache__/resolver.cpython-312.pyc create mode 100644 Backend/venv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/_jaraco_text.cpython-312.pyc create mode 100644 Backend/venv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/datetime.cpython-312.pyc create mode 100644 Backend/venv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/__pycache__/_cmd.cpython-312.pyc create mode 100644 Backend/venv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/__pycache__/heuristics.cpython-312.pyc create mode 100644 Backend/venv/lib/python3.12/site-packages/pip/_vendor/certifi/__pycache__/__main__.cpython-312.pyc create mode 100644 Backend/venv/lib/python3.12/site-packages/pip/_vendor/dependency_groups/__pycache__/__main__.cpython-312.pyc create mode 100644 Backend/venv/lib/python3.12/site-packages/pip/_vendor/dependency_groups/__pycache__/_lint_dependency_groups.cpython-312.pyc create mode 100644 Backend/venv/lib/python3.12/site-packages/pip/_vendor/dependency_groups/__pycache__/_pip_wrapper.cpython-312.pyc create mode 100644 Backend/venv/lib/python3.12/site-packages/pip/_vendor/dependency_groups/__pycache__/_toml_compat.cpython-312.pyc create mode 100644 Backend/venv/lib/python3.12/site-packages/pip/_vendor/distro/__pycache__/__main__.cpython-312.pyc create mode 100644 Backend/venv/lib/python3.12/site-packages/pip/_vendor/idna/__pycache__/codec.cpython-312.pyc create mode 100644 Backend/venv/lib/python3.12/site-packages/pip/_vendor/idna/__pycache__/compat.cpython-312.pyc create mode 100644 Backend/venv/lib/python3.12/site-packages/pip/_vendor/idna/__pycache__/uts46data.cpython-312.pyc create mode 100644 Backend/venv/lib/python3.12/site-packages/pip/_vendor/packaging/__pycache__/metadata.cpython-312.pyc create mode 100644 Backend/venv/lib/python3.12/site-packages/pip/_vendor/packaging/licenses/__pycache__/__init__.cpython-312.pyc create mode 100644 Backend/venv/lib/python3.12/site-packages/pip/_vendor/packaging/licenses/__pycache__/_spdx.cpython-312.pyc create mode 100644 Backend/venv/lib/python3.12/site-packages/pip/_vendor/pkg_resources/__pycache__/__init__.cpython-312.pyc create mode 100644 Backend/venv/lib/python3.12/site-packages/pip/_vendor/platformdirs/__pycache__/__main__.cpython-312.pyc create mode 100644 Backend/venv/lib/python3.12/site-packages/pip/_vendor/platformdirs/__pycache__/android.cpython-312.pyc create mode 100644 Backend/venv/lib/python3.12/site-packages/pip/_vendor/platformdirs/__pycache__/macos.cpython-312.pyc create mode 100644 Backend/venv/lib/python3.12/site-packages/pip/_vendor/platformdirs/__pycache__/windows.cpython-312.pyc create mode 100644 Backend/venv/lib/python3.12/site-packages/pip/_vendor/pygments/__pycache__/__main__.cpython-312.pyc create mode 100644 Backend/venv/lib/python3.12/site-packages/pip/_vendor/pygments/__pycache__/console.cpython-312.pyc create mode 100644 Backend/venv/lib/python3.12/site-packages/pip/_vendor/pygments/__pycache__/formatter.cpython-312.pyc create mode 100644 Backend/venv/lib/python3.12/site-packages/pip/_vendor/pygments/__pycache__/scanner.cpython-312.pyc create mode 100644 Backend/venv/lib/python3.12/site-packages/pip/_vendor/pygments/__pycache__/sphinxext.cpython-312.pyc create mode 100644 Backend/venv/lib/python3.12/site-packages/pip/_vendor/pygments/__pycache__/unistring.cpython-312.pyc create mode 100644 Backend/venv/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/__pycache__/__init__.cpython-312.pyc create mode 100644 Backend/venv/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/__pycache__/_mapping.cpython-312.pyc create mode 100644 Backend/venv/lib/python3.12/site-packages/pip/_vendor/pygments/lexers/__pycache__/python.cpython-312.pyc create mode 100644 Backend/venv/lib/python3.12/site-packages/pip/_vendor/pyproject_hooks/_in_process/__pycache__/_in_process.cpython-312.pyc create mode 100644 Backend/venv/lib/python3.12/site-packages/pip/_vendor/requests/__pycache__/help.cpython-312.pyc create mode 100644 Backend/venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/__main__.cpython-312.pyc create mode 100644 Backend/venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/_inspect.cpython-312.pyc create mode 100644 Backend/venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/_stack.cpython-312.pyc create mode 100644 Backend/venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/_timer.cpython-312.pyc create mode 100644 Backend/venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/_win32_console.cpython-312.pyc create mode 100644 Backend/venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/_windows.cpython-312.pyc create mode 100644 Backend/venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/_windows_renderer.cpython-312.pyc create mode 100644 Backend/venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/bar.cpython-312.pyc create mode 100644 Backend/venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/diagnose.cpython-312.pyc create mode 100644 Backend/venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/json.cpython-312.pyc create mode 100644 Backend/venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/layout.cpython-312.pyc create mode 100644 Backend/venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/prompt.cpython-312.pyc create mode 100644 Backend/venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/rule.cpython-312.pyc create mode 100644 Backend/venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/status.cpython-312.pyc create mode 100644 Backend/venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/tree.cpython-312.pyc create mode 100644 Backend/venv/lib/python3.12/site-packages/pip/_vendor/tomli/__pycache__/__init__.cpython-312.pyc create mode 100644 Backend/venv/lib/python3.12/site-packages/pip/_vendor/tomli/__pycache__/_parser.cpython-312.pyc create mode 100644 Backend/venv/lib/python3.12/site-packages/pip/_vendor/tomli/__pycache__/_re.cpython-312.pyc create mode 100644 Backend/venv/lib/python3.12/site-packages/pip/_vendor/tomli/__pycache__/_types.cpython-312.pyc create mode 100644 Backend/venv/lib/python3.12/site-packages/pip/_vendor/tomli_w/__pycache__/__init__.cpython-312.pyc create mode 100644 Backend/venv/lib/python3.12/site-packages/pip/_vendor/tomli_w/__pycache__/_writer.cpython-312.pyc create mode 100644 Backend/venv/lib/python3.12/site-packages/pip/_vendor/truststore/__pycache__/_macos.cpython-312.pyc create mode 100644 Backend/venv/lib/python3.12/site-packages/pip/_vendor/truststore/__pycache__/_windows.cpython-312.pyc create mode 100644 Backend/venv/lib/python3.12/site-packages/pip/_vendor/urllib3/contrib/__pycache__/appengine.cpython-312.pyc create mode 100644 Backend/venv/lib/python3.12/site-packages/pip/_vendor/urllib3/contrib/__pycache__/ntlmpool.cpython-312.pyc create mode 100644 Backend/venv/lib/python3.12/site-packages/pip/_vendor/urllib3/contrib/__pycache__/pyopenssl.cpython-312.pyc create mode 100644 Backend/venv/lib/python3.12/site-packages/pip/_vendor/urllib3/contrib/__pycache__/securetransport.cpython-312.pyc create mode 100644 Backend/venv/lib/python3.12/site-packages/pip/_vendor/urllib3/contrib/_securetransport/__pycache__/__init__.cpython-312.pyc create mode 100644 Backend/venv/lib/python3.12/site-packages/pip/_vendor/urllib3/contrib/_securetransport/__pycache__/bindings.cpython-312.pyc create mode 100644 Backend/venv/lib/python3.12/site-packages/pip/_vendor/urllib3/contrib/_securetransport/__pycache__/low_level.cpython-312.pyc create mode 100644 Backend/venv/lib/python3.12/site-packages/pip/_vendor/urllib3/packages/backports/__pycache__/__init__.cpython-312.pyc create mode 100644 Backend/venv/lib/python3.12/site-packages/pip/_vendor/urllib3/packages/backports/__pycache__/makefile.cpython-312.pyc create mode 100644 Backend/venv/lib/python3.12/site-packages/pip/_vendor/urllib3/packages/backports/__pycache__/weakref_finalize.cpython-312.pyc delete mode 100644 Backend/venv/lib/python3.12/site-packages/pydantic-2.12.5.dist-info/METADATA delete mode 100644 Backend/venv/lib/python3.12/site-packages/pydantic-2.12.5.dist-info/RECORD rename Backend/venv/lib/python3.12/site-packages/{pydantic-2.12.5.dist-info => pydantic-2.5.0.dist-info}/INSTALLER (100%) create mode 100644 Backend/venv/lib/python3.12/site-packages/pydantic-2.5.0.dist-info/METADATA create mode 100644 Backend/venv/lib/python3.12/site-packages/pydantic-2.5.0.dist-info/RECORD rename Backend/venv/lib/python3.12/site-packages/{pytest-9.0.1.dist-info => pydantic-2.5.0.dist-info}/REQUESTED (100%) rename Backend/venv/lib/python3.12/site-packages/{pydantic-2.12.5.dist-info => pydantic-2.5.0.dist-info}/WHEEL (67%) rename Backend/venv/lib/python3.12/site-packages/{pydantic-2.12.5.dist-info => pydantic-2.5.0.dist-info}/licenses/LICENSE (100%) delete mode 100644 Backend/venv/lib/python3.12/site-packages/pydantic/__pycache__/aliases.cpython-312.pyc delete mode 100644 Backend/venv/lib/python3.12/site-packages/pydantic/_internal/__pycache__/_docs_extraction.cpython-312.pyc delete mode 100644 Backend/venv/lib/python3.12/site-packages/pydantic/_internal/__pycache__/_git.cpython-312.pyc delete mode 100644 Backend/venv/lib/python3.12/site-packages/pydantic/_internal/__pycache__/_import_utils.cpython-312.pyc delete mode 100644 Backend/venv/lib/python3.12/site-packages/pydantic/_internal/__pycache__/_namespace_utils.cpython-312.pyc delete mode 100644 Backend/venv/lib/python3.12/site-packages/pydantic/_internal/__pycache__/_schema_gather.cpython-312.pyc delete mode 100644 Backend/venv/lib/python3.12/site-packages/pydantic/_internal/__pycache__/_serializers.cpython-312.pyc delete mode 100644 Backend/venv/lib/python3.12/site-packages/pydantic/_internal/__pycache__/_signature.cpython-312.pyc create mode 100644 Backend/venv/lib/python3.12/site-packages/pydantic/_internal/__pycache__/_std_types_schema.cpython-312.pyc delete mode 100644 Backend/venv/lib/python3.12/site-packages/pydantic/_internal/_docs_extraction.py delete mode 100644 Backend/venv/lib/python3.12/site-packages/pydantic/_internal/_git.py delete mode 100644 Backend/venv/lib/python3.12/site-packages/pydantic/_internal/_import_utils.py delete mode 100644 Backend/venv/lib/python3.12/site-packages/pydantic/_internal/_namespace_utils.py delete mode 100644 Backend/venv/lib/python3.12/site-packages/pydantic/_internal/_schema_gather.py delete mode 100644 Backend/venv/lib/python3.12/site-packages/pydantic/_internal/_serializers.py delete mode 100644 Backend/venv/lib/python3.12/site-packages/pydantic/_internal/_signature.py create mode 100644 Backend/venv/lib/python3.12/site-packages/pydantic/_internal/_std_types_schema.py delete mode 100644 Backend/venv/lib/python3.12/site-packages/pydantic/aliases.py delete mode 100644 Backend/venv/lib/python3.12/site-packages/pydantic/experimental/__init__.py delete mode 100644 Backend/venv/lib/python3.12/site-packages/pydantic/experimental/__pycache__/__init__.cpython-312.pyc delete mode 100644 Backend/venv/lib/python3.12/site-packages/pydantic/experimental/__pycache__/arguments_schema.cpython-312.pyc delete mode 100644 Backend/venv/lib/python3.12/site-packages/pydantic/experimental/__pycache__/missing_sentinel.cpython-312.pyc delete mode 100644 Backend/venv/lib/python3.12/site-packages/pydantic/experimental/__pycache__/pipeline.cpython-312.pyc delete mode 100644 Backend/venv/lib/python3.12/site-packages/pydantic/experimental/arguments_schema.py delete mode 100644 Backend/venv/lib/python3.12/site-packages/pydantic/experimental/missing_sentinel.py delete mode 100644 Backend/venv/lib/python3.12/site-packages/pydantic/experimental/pipeline.py rename Backend/venv/lib/python3.12/site-packages/{pydantic_core-2.41.5.dist-info => pydantic_core-2.14.1.dist-info}/INSTALLER (100%) rename Backend/venv/lib/python3.12/site-packages/{pydantic_core-2.41.5.dist-info => pydantic_core-2.14.1.dist-info}/METADATA (68%) create mode 100644 Backend/venv/lib/python3.12/site-packages/pydantic_core-2.14.1.dist-info/RECORD rename Backend/venv/lib/python3.12/site-packages/{pydantic_core-2.41.5.dist-info => pydantic_core-2.14.1.dist-info}/WHEEL (79%) rename Backend/venv/lib/python3.12/site-packages/{pydantic_core-2.41.5.dist-info/licenses => pydantic_core-2.14.1.dist-info/license_files}/LICENSE (100%) delete mode 100644 Backend/venv/lib/python3.12/site-packages/pydantic_core-2.41.5.dist-info/RECORD rename Backend/venv/lib/python3.12/site-packages/{pytest-9.0.1.dist-info => pytest-7.4.3.dist-info}/INSTALLER (100%) rename Backend/venv/lib/python3.12/site-packages/{pytest-9.0.1.dist-info/licenses => pytest-7.4.3.dist-info}/LICENSE (100%) rename Backend/venv/lib/python3.12/site-packages/{pytest-9.0.1.dist-info => pytest-7.4.3.dist-info}/METADATA (73%) create mode 100644 Backend/venv/lib/python3.12/site-packages/pytest-7.4.3.dist-info/RECORD rename Backend/venv/lib/python3.12/site-packages/{pytest_asyncio-1.3.0.dist-info => pytest-7.4.3.dist-info}/REQUESTED (100%) rename Backend/venv/lib/python3.12/site-packages/{pytest_mock-3.15.1.dist-info => pytest-7.4.3.dist-info}/WHEEL (65%) rename Backend/venv/lib/python3.12/site-packages/{pytest-9.0.1.dist-info => pytest-7.4.3.dist-info}/entry_points.txt (100%) rename Backend/venv/lib/python3.12/site-packages/{pytest-9.0.1.dist-info => pytest-7.4.3.dist-info}/top_level.txt (100%) delete mode 100644 Backend/venv/lib/python3.12/site-packages/pytest-9.0.1.dist-info/RECORD create mode 100644 Backend/venv/lib/python3.12/site-packages/pytest-cov.pth create mode 100644 Backend/venv/lib/python3.12/site-packages/pytest/__pycache__/__init__.cpython-312.pyc create mode 100644 Backend/venv/lib/python3.12/site-packages/pytest/__pycache__/__main__.cpython-312.pyc rename Backend/venv/lib/python3.12/site-packages/{pytest_asyncio-1.3.0.dist-info => pytest_asyncio-0.21.1.dist-info}/INSTALLER (100%) rename Backend/venv/lib/python3.12/site-packages/{pytest_asyncio-1.3.0.dist-info/licenses => pytest_asyncio-0.21.1.dist-info}/LICENSE (100%) rename Backend/venv/lib/python3.12/site-packages/{pytest_asyncio-1.3.0.dist-info => pytest_asyncio-0.21.1.dist-info}/METADATA (72%) create mode 100644 Backend/venv/lib/python3.12/site-packages/pytest_asyncio-0.21.1.dist-info/RECORD rename Backend/venv/lib/python3.12/site-packages/{pytest_cov-7.0.0.dist-info => pytest_asyncio-0.21.1.dist-info}/REQUESTED (100%) rename Backend/venv/lib/python3.12/site-packages/{pytest_asyncio-1.3.0.dist-info => pytest_asyncio-0.21.1.dist-info}/WHEEL (65%) rename Backend/venv/lib/python3.12/site-packages/{pytest_asyncio-1.3.0.dist-info => pytest_asyncio-0.21.1.dist-info}/entry_points.txt (100%) rename Backend/venv/lib/python3.12/site-packages/{pytest_asyncio-1.3.0.dist-info => pytest_asyncio-0.21.1.dist-info}/top_level.txt (100%) delete mode 100644 Backend/venv/lib/python3.12/site-packages/pytest_asyncio-1.3.0.dist-info/RECORD create mode 100644 Backend/venv/lib/python3.12/site-packages/pytest_asyncio/__pycache__/__init__.cpython-312.pyc create mode 100644 Backend/venv/lib/python3.12/site-packages/pytest_asyncio/__pycache__/_version.cpython-312.pyc create mode 100644 Backend/venv/lib/python3.12/site-packages/pytest_asyncio/__pycache__/plugin.cpython-312.pyc create mode 100644 Backend/venv/lib/python3.12/site-packages/pytest_asyncio/_version.py rename Backend/venv/lib/python3.12/site-packages/{pytest_cov-7.0.0.dist-info/licenses => pytest_cov-4.1.0.dist-info}/AUTHORS.rst (83%) rename Backend/venv/lib/python3.12/site-packages/{pytest_cov-7.0.0.dist-info => pytest_cov-4.1.0.dist-info}/INSTALLER (100%) rename Backend/venv/lib/python3.12/site-packages/{pytest_cov-7.0.0.dist-info/licenses => pytest_cov-4.1.0.dist-info}/LICENSE (100%) rename Backend/venv/lib/python3.12/site-packages/{pytest_cov-7.0.0.dist-info => pytest_cov-4.1.0.dist-info}/METADATA (76%) create mode 100644 Backend/venv/lib/python3.12/site-packages/pytest_cov-4.1.0.dist-info/RECORD rename Backend/venv/lib/python3.12/site-packages/{pytest_mock-3.15.1.dist-info => pytest_cov-4.1.0.dist-info}/REQUESTED (100%) rename Backend/venv/lib/python3.12/site-packages/{pytest-9.0.1.dist-info => pytest_cov-4.1.0.dist-info}/WHEEL (65%) rename Backend/venv/lib/python3.12/site-packages/{pytest_cov-7.0.0.dist-info => pytest_cov-4.1.0.dist-info}/entry_points.txt (100%) create mode 100644 Backend/venv/lib/python3.12/site-packages/pytest_cov-4.1.0.dist-info/top_level.txt delete mode 100644 Backend/venv/lib/python3.12/site-packages/pytest_cov-7.0.0.dist-info/RECORD create mode 100644 Backend/venv/lib/python3.12/site-packages/pytest_cov/__pycache__/__init__.cpython-312.pyc create mode 100644 Backend/venv/lib/python3.12/site-packages/pytest_cov/__pycache__/compat.cpython-312.pyc create mode 100644 Backend/venv/lib/python3.12/site-packages/pytest_cov/__pycache__/embed.cpython-312.pyc create mode 100644 Backend/venv/lib/python3.12/site-packages/pytest_cov/__pycache__/engine.cpython-312.pyc create mode 100644 Backend/venv/lib/python3.12/site-packages/pytest_cov/__pycache__/plugin.cpython-312.pyc create mode 100644 Backend/venv/lib/python3.12/site-packages/pytest_cov/compat.py create mode 100644 Backend/venv/lib/python3.12/site-packages/pytest_cov/embed.py rename Backend/venv/lib/python3.12/site-packages/{pytest_mock-3.15.1.dist-info => pytest_mock-3.12.0.dist-info}/INSTALLER (100%) rename Backend/venv/lib/python3.12/site-packages/{pytest_mock-3.15.1.dist-info/licenses => pytest_mock-3.12.0.dist-info}/LICENSE (100%) rename Backend/venv/lib/python3.12/site-packages/{pytest_mock-3.15.1.dist-info => pytest_mock-3.12.0.dist-info}/METADATA (87%) create mode 100644 Backend/venv/lib/python3.12/site-packages/pytest_mock-3.12.0.dist-info/RECORD create mode 100644 Backend/venv/lib/python3.12/site-packages/pytest_mock-3.12.0.dist-info/REQUESTED rename Backend/venv/lib/python3.12/site-packages/{pytest_cov-7.0.0.dist-info => pytest_mock-3.12.0.dist-info}/WHEEL (64%) rename Backend/venv/lib/python3.12/site-packages/{pytest_mock-3.15.1.dist-info => pytest_mock-3.12.0.dist-info}/entry_points.txt (100%) rename Backend/venv/lib/python3.12/site-packages/{pytest_mock-3.15.1.dist-info => pytest_mock-3.12.0.dist-info}/top_level.txt (100%) delete mode 100644 Backend/venv/lib/python3.12/site-packages/pytest_mock-3.15.1.dist-info/RECORD create mode 100644 Backend/venv/lib/python3.12/site-packages/pytest_mock/__pycache__/__init__.cpython-312.pyc create mode 100644 Backend/venv/lib/python3.12/site-packages/pytest_mock/__pycache__/_util.cpython-312.pyc create mode 100644 Backend/venv/lib/python3.12/site-packages/pytest_mock/__pycache__/_version.cpython-312.pyc create mode 100644 Backend/venv/lib/python3.12/site-packages/pytest_mock/__pycache__/plugin.cpython-312.pyc create mode 100644 Frontend/src/features/team-chat/components/TeamChatPage.tsx create mode 100644 Frontend/src/features/team-chat/index.ts create mode 100644 Frontend/src/features/team-chat/services/teamChatService.ts create mode 100644 Frontend/src/pages/admin/TeamChatPage.tsx create mode 100644 Frontend/src/pages/housekeeping/ProfilePage.tsx create mode 100644 Frontend/src/pages/housekeeping/TeamChatPage.tsx create mode 100644 Frontend/src/pages/staff/TeamChatPage.tsx diff --git a/.env b/.env new file mode 100644 index 00000000..02ccbb3a --- /dev/null +++ b/.env @@ -0,0 +1,5 @@ +DB_HOST=localhost +DB_PORT=3306 +DB_USER=root +DB_PASS=StrongPassword!@DB +DB_NAME=luxury_hotel_db diff --git a/Backend/alembic/__pycache__/env.cpython-312.pyc b/Backend/alembic/__pycache__/env.cpython-312.pyc index 242ab7367628daeec333f5d7954e837c9b84fc13..e21ea042d1e87d8e9c8ba1550e1e3f419cad25bc 100644 GIT binary patch delta 986 zcmZuv%}*0S6rb7IkAARF3dKSTECGU>Sc6f}10kU%Mq+}I8@<%pox(QlHkodNB}IDh zAHX?~c=6&54tO$tBnl@J4_-_(n{Y5OCY&U}lPBNwL#p9T=DqiO?@eaj@6EHwexLqP z*8>RT&GJ>dwyh6JKk$o-TR735pB3SMB^9^2t**y%Y8b2zc0@u{&Cl~s%Fu1*12DYX zI)PDD0X)))&7NbCHL(}S*#&yDK4E8-2w%Wdz>){v{Vk%cYEA~xQWcUzUX^R%yB*RXs}4P(OR$;3U3EJdtcsaYW! z8%I}A8Lvwitso4msyrksXdRpC#@KSjF^cvo%eZ#QDI2z9OqFuE0yH*d6iXJp%-@s6 z@g-CBx~z%Y~m2VFQ>wTkn4wCz6+|3z6S>QSNYCD z5YX$$LX;dtm4z|we9q=@gEP=gaa(;LRai;WrpVj@}v zRY$*6)Mq^JdMm%vU+JI2xA+%r?bs>;^zFw(?6*Cj?`BgeH&B1V8dW>JJa>B(@Xvo>N)DW2fC3o;(ThdLSlWhvGk% C48@=T delta 1244 zcmZuwPiPcp6o23R+sXdPZr1EZ<2Kn~hB&1Wx1b3{t;W(4w1FTBMsQp+U*asYv-X== z%u3RD5NVI$I|xPSrH9gupm#6HsnAP;Ldu{AFM>B?3I#9vzU*#x1AfE4_kQnv@9n(b zd-LSL@0r9ui9{6e{Po*cj=PdLBt@mCN0-U;!P1y;?>}~&_SdC`j{xm0jqi^OH1ma> zv=jH0nE}+@s0SsWTInp`mim8WI)Z_EGmAh?MLgJv&D2{FHAxtqb6k49;>|hph|<)X zcRXs%u}ayR-SzU5(q!sGxBrt{bZ2kTa_v}^xqMm5F2BJF4}o`- zjIuO;FPo%?=aBlt7|Y<#zlP!-yo{!{qWR5eeq*TcJo+{NMY)iSV`Qx>b8bXl8&S_4 z=dYE%nY+jc^48=9AZX4S8QfzC)0(Fv`We=oy>4w1=)6bHrB+Eub**M`Y1<(;I95p?1ja9uNpTEr_;cVivP zWJ;lSo6$LEfnV493*sfrI1^K6g4!@92IA9MF^n+Xn1khbPRqxC)drUP#C4I%4hnGy z1=fw>Z4WbxH(kmG(dP@I^Lf^fD$KB|XO*3KRurXutKzx1`OLtWn5+K?1Iqdjp`j-)57u1PwBBFmrgDUf;%pv|b5?*Zdooco!K2OUlmT4Hb zi`Yuhrxt#IVbb5fsG(k_K~Y?35FvVC27jjKMnt None: - url = config.get_main_option('sqlalchemy.url') + """Run migrations in 'offline' mode.""" + url = database_url context.configure(url=url, target_metadata=target_metadata, literal_binds=True, dialect_opts={'paramstyle': 'named'}) with context.begin_transaction(): context.run_migrations() def run_migrations_online() -> None: - connectable = engine_from_config(config.get_section(config.config_ini_section, {}), prefix='sqlalchemy.', poolclass=pool.NullPool) + """Run migrations in 'online' mode.""" + # Create engine directly from URL to avoid ConfigParser interpolation issues + connectable = create_engine(database_url, poolclass=pool.NullPool) with connectable.connect() as connection: context.configure(connection=connection, target_metadata=target_metadata) with context.begin_transaction(): diff --git a/Backend/alembic/versions/54e4d0db31a3_create_user_sessions_table.py b/Backend/alembic/versions/54e4d0db31a3_create_user_sessions_table.py new file mode 100644 index 00000000..b43fffea --- /dev/null +++ b/Backend/alembic/versions/54e4d0db31a3_create_user_sessions_table.py @@ -0,0 +1,92 @@ +"""create_user_sessions_table + +Revision ID: 54e4d0db31a3 +Revises: d709b14aa24a +Create Date: 2025-12-06 01:12:15.123456 + +""" +from alembic import op +import sqlalchemy as sa +from sqlalchemy.dialects import mysql + + +# revision identifiers, used by Alembic. +revision = '54e4d0db31a3' +down_revision = 'd709b14aa24a' +branch_labels = None +depends_on = None + + +def upgrade() -> None: + # Check if table exists before creating + bind = op.get_bind() + inspector = sa.inspect(bind) + tables = inspector.get_table_names() + + if 'user_sessions' not in tables: + # Create user sessions table + op.create_table( + 'user_sessions', + sa.Column('id', sa.Integer(), autoincrement=True, nullable=False), + sa.Column('user_id', sa.Integer(), nullable=False), + sa.Column('session_token', sa.String(length=255), nullable=False), + sa.Column('refresh_token', sa.String(length=255), nullable=True), + sa.Column('ip_address', sa.String(length=45), nullable=True), + sa.Column('user_agent', sa.String(length=500), nullable=True), + sa.Column('device_info', sa.Text(), nullable=True), + sa.Column('is_active', sa.Boolean(), nullable=False, server_default='1'), + sa.Column('last_activity', sa.DateTime(), nullable=False, server_default=sa.text('CURRENT_TIMESTAMP')), + sa.Column('expires_at', sa.DateTime(), nullable=False), + sa.Column('created_at', sa.DateTime(), nullable=False, server_default=sa.text('CURRENT_TIMESTAMP')), + sa.ForeignKeyConstraint(['user_id'], ['users.id'], ), + sa.PrimaryKeyConstraint('id') + ) + + # Create indexes + op.create_index(op.f('ix_user_sessions_id'), 'user_sessions', ['id'], unique=False) + op.create_index(op.f('ix_user_sessions_user_id'), 'user_sessions', ['user_id'], unique=False) + op.create_index(op.f('ix_user_sessions_session_token'), 'user_sessions', ['session_token'], unique=True) + op.create_index(op.f('ix_user_sessions_refresh_token'), 'user_sessions', ['refresh_token'], unique=True) + op.create_index(op.f('ix_user_sessions_is_active'), 'user_sessions', ['is_active'], unique=False) + op.create_index(op.f('ix_user_sessions_last_activity'), 'user_sessions', ['last_activity'], unique=False) + op.create_index(op.f('ix_user_sessions_expires_at'), 'user_sessions', ['expires_at'], unique=False) + + +def downgrade() -> None: + # Drop indexes + bind = op.get_bind() + inspector = sa.inspect(bind) + tables = inspector.get_table_names() + + if 'user_sessions' in tables: + try: + op.drop_index(op.f('ix_user_sessions_expires_at'), table_name='user_sessions') + except Exception: + pass + try: + op.drop_index(op.f('ix_user_sessions_last_activity'), table_name='user_sessions') + except Exception: + pass + try: + op.drop_index(op.f('ix_user_sessions_is_active'), table_name='user_sessions') + except Exception: + pass + try: + op.drop_index(op.f('ix_user_sessions_refresh_token'), table_name='user_sessions') + except Exception: + pass + try: + op.drop_index(op.f('ix_user_sessions_session_token'), table_name='user_sessions') + except Exception: + pass + try: + op.drop_index(op.f('ix_user_sessions_user_id'), table_name='user_sessions') + except Exception: + pass + try: + op.drop_index(op.f('ix_user_sessions_id'), table_name='user_sessions') + except Exception: + pass + + # Drop table + op.drop_table('user_sessions') diff --git a/Backend/alembic/versions/__pycache__/08e2f866e131_add_mfa_fields_to_users.cpython-312.pyc b/Backend/alembic/versions/__pycache__/08e2f866e131_add_mfa_fields_to_users.cpython-312.pyc index 7f2fe532521a187e9887dd0f13af457e429a56c7..c4646114a60df02ae2ef5726354944913bd7c6c8 100644 GIT binary patch delta 20 acmbQwJ)fKVG%qg~0}$MDFy6>Lg%toaEd=oZ delta 20 acmbQwJ)fKVG%qg~0}wokP}s;lg%toaqy+!~ diff --git a/Backend/alembic/versions/__pycache__/0e2dc5df18c3_add_privacy_terms_refunds_to_page_type_.cpython-312.pyc b/Backend/alembic/versions/__pycache__/0e2dc5df18c3_add_privacy_terms_refunds_to_page_type_.cpython-312.pyc index 5a6478e103a5686d594992ffd112d7877cba7811..1d83b436afac95e8d67cf08dce37fdaed56fe192 100644 GIT binary patch delta 20 acmdnNxr3AYG%qg~0}$MDFy6?$mIVMe%mp_9 delta 20 acmdnNxr3AYG%qg~0}wokP}s=5mIVMfLj^_v diff --git a/Backend/alembic/versions/__pycache__/1444eb61188e_add_section_title_fields_to_page_content.cpython-312.pyc b/Backend/alembic/versions/__pycache__/1444eb61188e_add_section_title_fields_to_page_content.cpython-312.pyc index 4bcfed31f3ef7f43c58ce95b066494e68add80e3..4d5bfb746ea484e80e199d5e9f89a805edf86891 100644 GIT binary patch delta 22 ccmaE{n(@VIM()$Ryj%=GaLd7XBlq1<09!=|UH||9 delta 22 ccmaE{n(@VIM()$Ryj%=G@FYTEBlq1<09(8VZ2$lO diff --git a/Backend/alembic/versions/__pycache__/163657e72e93_add_page_content_table.cpython-312.pyc b/Backend/alembic/versions/__pycache__/163657e72e93_add_page_content_table.cpython-312.pyc index fbc1ce4ecf201dc1102749c95138cf8725fffd8e..67f97a05316bf14b102b8f8ee90744515c92f76d 100644 GIT binary patch delta 20 acmeCw>(t{u&CAQh00g%jj5l)s69WJ?x&?*+ delta 20 acmeCw>(t{u&CAQh00d7W6gG1I69WJ@F$I+X diff --git a/Backend/alembic/versions/__pycache__/17efc6439cc3_add_luxury_section_fields_to_page_.cpython-312.pyc b/Backend/alembic/versions/__pycache__/17efc6439cc3_add_luxury_section_fields_to_page_.cpython-312.pyc index 947574aed49409f3778fa53aca853d2c26563c50..24cbf7dbd3c87a6d881f010deee1afb249cc5ab7 100644 GIT binary patch delta 20 acmca7a8H2yG%qg~0}$MDFy6==%mDyByahV| delta 20 acmca7a8H2yG%qg~0}wokP}s;F%mDyCGX+Wj diff --git a/Backend/alembic/versions/__pycache__/316d876b1b71_add_newsletter_subscribers_table.cpython-312.pyc b/Backend/alembic/versions/__pycache__/316d876b1b71_add_newsletter_subscribers_table.cpython-312.pyc index 8719cf013e9bf09b89a54dae40d49657ce61eb7b..e7c9c195837ff7676cd2240337804223466f7f78 100644 GIT binary patch delta 20 acmew+`%RYnG%qg~0}$MDFy6@hnhyX(Rt6&g delta 20 acmew+`%RYnG%qg~0}wdfH`>VknhyX&;|3`J diff --git a/Backend/alembic/versions/__pycache__/54e4d0db31a3_create_user_sessions_table.cpython-312.pyc b/Backend/alembic/versions/__pycache__/54e4d0db31a3_create_user_sessions_table.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..9fdb3a9a682c0e21e03e382e393aee7ea655a3f3 GIT binary patch literal 5587 zcmc&&Uu+Y}8Q<|b_U>j)9Fhw;6NtGaQ0EHH--9@TqYxZ&TvBQhp}2=u8}B4pV(&V; zYl!dQnuoriUIl%q?r4#?2qbh$9(bzqnCrC=sV@dQg-)qdsrSN5l`E-K(T8@%_To+A z^Mw-BmHf@@_xtAe&CGt@@0?H1dN=a0hl7M83 zf|xCA1Efz!>98HQ_Gnqm5q4l*S=cE#!i+?RS^VQ9R&xH-9xlf%gIhjH`?wDi5etjj&3Io#)KG!}HuMYxzsC(wk=Gzk}6fnd|0R zw|xg|#s9?Wwy0@OeWiu5x&)(L+CE>k$#|-^aMqOKwAj^dw3FU2V`S5w zYb=ZV)ycE@f2CTV;o4e<6tiThO+S26|uINdo`E;2LtO{ZuiC!miLf% zBPzXV@{yc@XJViCm{0!|nRi;4$r`tgxz57OU}k#D=Df?oT)w5uyDiL>Te=(d7Ut?L zW%gQ_Yt}O-sU+pwGl*Pk>H}nxrJ{&vxc?zToa+Z<3029{>*^%3K;%d$@>Bw% z+6{1i6VUDr$eQgag0I~W&xY}ZC2!y94 z7%@-A~8#zy6c zAIC|y?DbpgPa(h7>@!?j7$1lyae&9iHBo|E7xqe0tuEtN`waDUx$A28mF}M%p6Pw! z-u@}~3+}UywA(w=|JYUY$hG%@Yj4{1y_w)&oi(40J#;pH&2U#Mu2ekccRt~_UG2Zp ze@(h^?B;vd-~09Z3--lCh95BX^6l++JhPr#bqi$~{)nknZ)7VVt8_F~uTI|U1C)WdKGL2n}y&1mW1Y);Cch1h9y*08>ZSg#LyX{V3 zHgKzFp(%CxOoksa&57raWY5r(I*PG^jtGg;#ZncqO z%gLVJu-&v@x2JZsrEA;o3X8_#SZX-D%>4LCZp%&hV7m6uf`6%hsXHY|%M4rxA5PaE zS*%Ef#MF;QQDgwj`+r%6M@AZlp9jphj?f ze$sT2nx;pni{M*u?ptu0jQ`~CCDDf^(chFre^nCw*hGEYpvK@oy4HXNEj;~B$;5~%D|1cZZ=+TOx5?K zJ%^Y4%Y1mnu@QVX?K!$6Ec54zf!%3O&rZPZuaZ|(!s?{+lzxvAgVn)~Xhdo&w#)AuR>kyUKa zOW&&pL^iNNKYi~2AhL}O9-;3Y23Xz)Y@dt1&jTXeY+oIHe^zTXV6#HR*_ z291QK4EkKiDF~7p5d`GS7h}1Cl*69`#b{&##**1cMO6jG0ZGQT5kuF=_b|k0`Hz&y zMIuos+>UCZ5}6S2fdoc%9K|q>i#}aYm2AzX9mS)+ptJyPvXT6p>4~XQA_|Xar?8HE z4Ae<9<7WlHH#P^b|8pA!cKn&z@fWITg`s%Q4D;B%d&c$HU5$mSa)x{6@Pa5<4T2`H HFH8JioFQK# literal 0 HcmV?d00001 diff --git a/Backend/alembic/versions/__pycache__/59baf2338f8a_initial_migration_create_all_tables_.cpython-312.pyc b/Backend/alembic/versions/__pycache__/59baf2338f8a_initial_migration_create_all_tables_.cpython-312.pyc index 3cdfb0fa176488d00ca31f9f2e4d2e1f95a041b8..e75fedf33f7036a0239278b17032a7284334c136 100644 GIT binary patch delta 22 ccmcb8kn#3GM()$Ryj%=GaLd7XBlm>_09<_09^71eE?&an_&CAQh00g%jj5l&Ou>t@wT?D%T delta 20 acmeC>?&an_&CAQh00d7W6gF}t@w)C9@^ diff --git a/Backend/alembic/versions/__pycache__/6f7f8689fc98_add_anonymous_gdpr_support.cpython-312.pyc b/Backend/alembic/versions/__pycache__/6f7f8689fc98_add_anonymous_gdpr_support.cpython-312.pyc index 312d934410d03d87b66f88512b4623f2a6226de0..f10c963b939fcaf16d37e8934abac4e6d72c3f40 100644 GIT binary patch delta 20 acmbO!K2x0gG%qg~0}$MDFy6@B#|;29^920> delta 20 acmbO!K2x0gG%qg~0}%B5(%Hz}#|;2C3I$>S diff --git a/Backend/alembic/versions/__pycache__/7a899ef55e3b_add_comprehensive_gdpr_tables.cpython-312.pyc b/Backend/alembic/versions/__pycache__/7a899ef55e3b_add_comprehensive_gdpr_tables.cpython-312.pyc index ee44ba5f149ed6d0fb76218e29243e6bdd9243bc..62ea9346f9ae5664e6891109c9eaf0fa98e12f4a 100644 GIT binary patch delta 22 ccmZ3`#JHe|k^3|+FBbz4+;TA9$Svv!07u#dpa1{> delta 22 ccmZ3`#JHe|k^3|+FBbz4to^C8kz3Re07}vZB>(^b diff --git a/Backend/alembic/versions/__pycache__/87e29a777cb3_add_recipient_type_to_campaigns.cpython-312.pyc b/Backend/alembic/versions/__pycache__/87e29a777cb3_add_recipient_type_to_campaigns.cpython-312.pyc index 27dd199fff7ab82dc8ecb533e51a2bf587a4e763..5dd517b3c539e63c2dac6c2c30a6e1a14ad6e2da 100644 GIT binary patch delta 20 acmdnUyOEdsG%qg~0}$MDFy6?$j12%cMg=SY delta 20 acmdnUyOEdsG%qg~0}$jrFxtqyj12%d4Fz8S diff --git a/Backend/alembic/versions/__pycache__/96c23dad405d_add_system_settings_table.cpython-312.pyc b/Backend/alembic/versions/__pycache__/96c23dad405d_add_system_settings_table.cpython-312.pyc index 578a5ab183dbef3cd6a97f7de1e67dc2541d98e0..0f7708329defc34d5477913bd844ec686ee0273d 100644 GIT binary patch delta 20 acmew*^-GHTG%qg~0}$MDFy6?W&kF!Ui3O+t delta 20 acmew*^-GHTG%qg~0}wokP}s(l diff --git a/Backend/alembic/versions/__pycache__/add_blog_posts_table.cpython-312.pyc b/Backend/alembic/versions/__pycache__/add_blog_posts_table.cpython-312.pyc index 3122a342f3236829b7afe595292eea1d32e3dc41..157acfc13661290adda19d50ca9e098d8c3ed418 100644 GIT binary patch delta 20 acmeyS@=b;NG%qg~0}$MDFy6?WEd&5WRt2>H delta 20 acmeyS@=b;NG%qg~0}xDB)Y{0MEd&5Teg#GV diff --git a/Backend/alembic/versions/__pycache__/add_borica_payment_method.cpython-312.pyc b/Backend/alembic/versions/__pycache__/add_borica_payment_method.cpython-312.pyc index 43415a7a4d3f066dff6a9b4c0eb2a38a574cc686..ff1eeab1994e53b1e5dfcbb61f1834bb70aac38d 100644 GIT binary patch delta 20 acmaFB^?-}}G%qg~0}$MDFy6==$_fBIF$FRJ delta 20 acmaFB^?-}}G%qg~0}vGbQ`*QK$_fBJcm;O= diff --git a/Backend/alembic/versions/__pycache__/add_copyright_text_to_page_content.cpython-312.pyc b/Backend/alembic/versions/__pycache__/add_copyright_text_to_page_content.cpython-312.pyc index a792ba225151e09d825795e61a6fdd15728d43f6..131f4c32f25c27ef7f143605318a394e164ec889 100644 GIT binary patch delta 20 acmeBX?`G#d&CAQh00g%jj5l&OFarQEdjzWh delta 20 acmeBX?`G#d&CAQh00d7W6gF}W&M()$Ryj%=GaLd7XBlpx`08Wnvd;kCd delta 22 ccmZ3moN>W&M()$Ryj%=G5Pw2vBlpx`08T#!f&c&j diff --git a/Backend/alembic/versions/__pycache__/add_enterprise_homepage_fields_to_page_content.cpython-312.pyc b/Backend/alembic/versions/__pycache__/add_enterprise_homepage_fields_to_page_content.cpython-312.pyc index 53c8dd67ebc3fdc274030e40f355202bdb16b337..2bde4a57ffe3a52d25602ec4fa9bc1b2df2f08e9 100644 GIT binary patch delta 20 acmaFp`p}j8G%qg~0}$MDFy6?0O$h)-!UjkH delta 20 acmaFp`p}j8G%qg~0}wb}Gup^~O$h)-83siF diff --git a/Backend/alembic/versions/__pycache__/add_group_booking_tables.cpython-312.pyc b/Backend/alembic/versions/__pycache__/add_group_booking_tables.cpython-312.pyc index 2403c8aeb76b63796601d6a7e546fc72564a090f..c39101482a8af8937930a4976a47bb46435d9147 100644 GIT binary patch delta 22 ccmdlqfpOCWM()$Ryj%=GaLd7XBe%K-08I%6`2YX_ delta 22 ccmdlqfpOCWM()$Ryj%=GQ1DA}Be%K-08S+aHvj+t diff --git a/Backend/alembic/versions/__pycache__/add_guest_profile_crm_tables.cpython-312.pyc b/Backend/alembic/versions/__pycache__/add_guest_profile_crm_tables.cpython-312.pyc index 4e3be4d6eeaf84d1e825e3861e8fbca2f3a49f17..096661ad93897840ad629549f0d20a33de0ad447 100644 GIT binary patch delta 20 acmbOnKRKTJG%qg~0}$MDFy6@Bp$`B)M+Kh% delta 20 acmbOnKRKTJG%qg~0}zy-P}s=bp$`B)V+FAQ diff --git a/Backend/alembic/versions/__pycache__/add_guest_requests_table.cpython-312.pyc b/Backend/alembic/versions/__pycache__/add_guest_requests_table.cpython-312.pyc index 09d421143778da27722bd4468cf5e735ad8d39ee..2f2be9b0080ccff4458f61c296527ac728dffd82 100644 GIT binary patch delta 20 acmeyY`B{_uG%qg~0}$MDFy6@hLIeOslm<8e delta 20 acmeyY`B{_uG%qg~0}!0sXt0s{g$Mvg*9MvZ diff --git a/Backend/alembic/versions/__pycache__/add_inventory_management_tables.cpython-312.pyc b/Backend/alembic/versions/__pycache__/add_inventory_management_tables.cpython-312.pyc index 6d4a4910f867db8b0efeafdebeafec0036bd27a5..bcec65ea24360247ee36ff4f275e6811c12ab6e6 100644 GIT binary patch delta 20 acmexS^rMLTG%qg~0}$MDFy6?WYY6~P#Rh%= delta 20 acmexS^rMLTG%qg~0}x!^WU!Gt*Af6yF$U%U diff --git a/Backend/alembic/versions/__pycache__/add_loyalty_system_tables.cpython-312.pyc b/Backend/alembic/versions/__pycache__/add_loyalty_system_tables.cpython-312.pyc index 2ed5f96f1716f67ca4b451be6203c4fcffc684d5..c15f72bbb4ce58fe520f145cee853bfa2ce3c429 100644 GIT binary patch delta 22 ccmZpf$JjEDk^3|+FBbz4+;TA9$oLgAD*R76k$T delta 20 acmZ3?yO@{zG%qg~0}yPqQ`*QqgAD*PmITHC diff --git a/Backend/alembic/versions/__pycache__/add_sections_to_blog_posts.cpython-312.pyc b/Backend/alembic/versions/__pycache__/add_sections_to_blog_posts.cpython-312.pyc index ce5e6499a2d16911a3d368bb5e509fd758620e0d..3856be38e27142c2bc1bc365a688fbbe1b0e0a80 100644 GIT binary patch delta 20 acmX@YafE~WG%qg~0}$MDFy6>*$pQd4hy>XH delta 20 acmX@YafE~WG%qg~0}wQ8Yi;DVWB~v*d<0|w diff --git a/Backend/alembic/versions/__pycache__/add_service_detail_fields.cpython-312.pyc b/Backend/alembic/versions/__pycache__/add_service_detail_fields.cpython-312.pyc index 9b01d96b2ac155c3f80de20ba170ba93a7d56015..ea5453941be2c25f90d5cdec906217d260dab40a 100644 GIT binary patch delta 20 acmbO!HdBoIG%qg~0}$MDFy6?`#|;28&jfn_ delta 20 acmbO!HdBoIG%qg~0}v?vFx<$^#|;284Fq`r diff --git a/Backend/alembic/versions/__pycache__/add_staff_shifts_tables.cpython-312.pyc b/Backend/alembic/versions/__pycache__/add_staff_shifts_tables.cpython-312.pyc index 01856d2ca4f8e76d7b86f6e46be249363ea5b8b1..2d8740ce643ea5c1a947a446933de6278a4c1344 100644 GIT binary patch delta 20 acmZp6Z+7QC&CAQh00g%jj5l&uC<6dETLm)! delta 20 acmZp6Z+7QC&CAQh00e(`8*JpRPzC@zBL&U? diff --git a/Backend/alembic/versions/__pycache__/add_stripe_payment_method.cpython-312.pyc b/Backend/alembic/versions/__pycache__/add_stripe_payment_method.cpython-312.pyc index 8682b2de814fe7b1616e9e0ae78355028f393cf7..f6e289a62338feae0ca29d3cd8252e891e7e0773 100644 GIT binary patch delta 20 acmdnNwS$ZMG%qg~0}$MDFy6?m%L)KC@dUa6 delta 20 acmdnNwS$ZMG%qg~0}wokP}s<=%L)KDXavas diff --git a/Backend/alembic/versions/__pycache__/b1c4d7c154ec_add_enterprise_promotion_conditions.cpython-312.pyc b/Backend/alembic/versions/__pycache__/b1c4d7c154ec_add_enterprise_promotion_conditions.cpython-312.pyc index 3794148634adac50cb37c03944552a1cd4aa7744..eae1f63136f2a6fe67a3ecde2f005379ec8c73d7 100644 GIT binary patch delta 19 ZcmeyR`b(ATG%qg~0}$MD*vR!k2mnC11`hxL delta 19 ZcmeyR`b(ATG%qg~0}${lZ{+$Q1OPi_1t$Oi diff --git a/Backend/alembic/versions/__pycache__/bd309b0742c1_add_promotion_fields_to_bookings.cpython-312.pyc b/Backend/alembic/versions/__pycache__/bd309b0742c1_add_promotion_fields_to_bookings.cpython-312.pyc index 58ca60307e92089f9b0d21f08ddfd793449da13a..4d63112d143821dd05a248e689ed5d72057c6392 100644 GIT binary patch delta 20 acmZqTYvSWR&CAQh00g%jj5l(BX9EB+5(Oau delta 20 acmZqTYvSWR&CAQh00d7W6gF~yX9EB+i3KnK diff --git a/Backend/alembic/versions/__pycache__/bfa74be4b256_add_luxury_content_fields_to_page_.cpython-312.pyc b/Backend/alembic/versions/__pycache__/bfa74be4b256_add_luxury_content_fields_to_page_.cpython-312.pyc index 97ac49343f92b3f52006d28badb3be9465197298..db8824f150fde75c2422903380e38c2dbbf96981 100644 GIT binary patch delta 20 acmdm`uuFmaG%qg~0}$MDFy6?mF8}~KWCZsB delta 20 acmdm`uuFmaG%qg~0}wokP}s<=F8}~K+XV&y diff --git a/Backend/alembic/versions/__pycache__/cce764ef7a50_add_map_url_to_page_content.cpython-312.pyc b/Backend/alembic/versions/__pycache__/cce764ef7a50_add_map_url_to_page_content.cpython-312.pyc index e5e51b8bfdebe7cc403f68531dddbf0e9524d975..1d2160bb2a6b0220a17715cb6942e1bfc0de3b25 100644 GIT binary patch delta 20 acmZ3$zJQ(kG%qg~0}$MDFy6>Ll^Fmt!vyL8 delta 20 acmZ3$zJQ(kG%qg~0}wokP}s;ll^FmuIt2Lu diff --git a/Backend/alembic/versions/__pycache__/d032f2351965_add_financial_audit_trail_table.cpython-312.pyc b/Backend/alembic/versions/__pycache__/d032f2351965_add_financial_audit_trail_table.cpython-312.pyc index f36e5455aa47bb15d2dbca722101822a906ed166..f737793caf403a387f9f66cc2927ab7b9c25d16c 100644 GIT binary patch delta 20 acmca@eA}4&G%qg~0}$MDFy6?0K@tE%K?Vr` delta 20 acmca@eA}4&G%qg~0}x~`H`vI1K@tE$g$4Wo diff --git a/Backend/alembic/versions/__pycache__/d709b14aa24a_create_gdpr_requests_table.cpython-312.pyc b/Backend/alembic/versions/__pycache__/d709b14aa24a_create_gdpr_requests_table.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..2458caec527fb5d33069a0552965846b80cf3471 GIT binary patch literal 7643 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 S&nLjTrzl>jdop delta 20 acmZ3;zL1^!G%qg~0}wokP}s;ljTrzmVg&pE diff --git a/Backend/alembic/versions/__pycache__/fe519abcefe7_add_email_verification_and_enhance_user_.cpython-312.pyc b/Backend/alembic/versions/__pycache__/fe519abcefe7_add_email_verification_and_enhance_user_.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..9e18cef23525a8164d2137f8f9abaf0ddf2c0375 GIT binary patch literal 7136 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 literal 0 HcmV?d00001 diff --git a/Backend/alembic/versions/__pycache__/ff515d77abbe_add_more_luxury_sections_to_page_content.cpython-312.pyc b/Backend/alembic/versions/__pycache__/ff515d77abbe_add_more_luxury_sections_to_page_content.cpython-312.pyc index e4d73342bd5aef42b51b4cddd9680cf9e75a2a12..383b44bd8fba8d5867ae222b50894242fb8874f8 100644 GIT binary patch delta 20 acmew=`c;(sG%qg~0}$MDFy6@hiVFZk3I+@S delta 20 acmew=`c;(sG%qg~0}wokP}s=*iVFZkfd(4@ diff --git a/Backend/alembic/versions/__pycache__/fff4b67466b3_add_account_lockout_fields_to_users.cpython-312.pyc b/Backend/alembic/versions/__pycache__/fff4b67466b3_add_account_lockout_fields_to_users.cpython-312.pyc index bcefd045fe3615b405685eb4c7bb2009b000cbb9..aa0b76a0a776acbc3ce0ecef87ebd3732073f23f 100644 GIT binary patch delta 20 acmcc0b(M?zG%qg~0}$MDFy6@R#R>pBc?A&w delta 20 acmcc0b(M?zG%qg~0}w>N(b&lC#R>pB(FHRA diff --git a/Backend/alembic/versions/d709b14aa24a_create_gdpr_requests_table.py b/Backend/alembic/versions/d709b14aa24a_create_gdpr_requests_table.py new file mode 100644 index 00000000..85157c29 --- /dev/null +++ b/Backend/alembic/versions/d709b14aa24a_create_gdpr_requests_table.py @@ -0,0 +1,114 @@ +"""create_gdpr_requests_table + +Revision ID: d709b14aa24a +Revises: b1c4d7c154ec +Create Date: 2025-12-06 01:10:15.233886 + +""" +from alembic import op +import sqlalchemy as sa +from sqlalchemy.dialects import mysql + + +# revision identifiers, used by Alembic. +revision = 'd709b14aa24a' +down_revision = 'b1c4d7c154ec' +branch_labels = None +depends_on = None + + +def upgrade() -> None: + # Check if table exists before creating + bind = op.get_bind() + inspector = sa.inspect(bind) + tables = inspector.get_table_names() + + if 'gdpr_requests' not in tables: + # Create GDPR requests table + op.create_table( + 'gdpr_requests', + sa.Column('id', sa.Integer(), autoincrement=True, nullable=False), + sa.Column('request_type', sa.Enum('data_export', 'data_deletion', 'data_rectification', 'consent_withdrawal', name='gdprrequesttype'), nullable=False), + sa.Column('status', sa.Enum('pending', 'processing', 'completed', 'rejected', 'cancelled', name='gdprrequeststatus'), nullable=False, server_default='pending'), + sa.Column('user_id', sa.Integer(), nullable=True), + sa.Column('user_email', sa.String(length=255), nullable=False), + sa.Column('is_anonymous', sa.Boolean(), nullable=False, server_default='0'), + sa.Column('request_data', sa.JSON(), nullable=True), + sa.Column('verification_token', sa.String(length=255), nullable=True), + sa.Column('verified_at', sa.DateTime(), nullable=True), + sa.Column('processed_by', sa.Integer(), nullable=True), + sa.Column('processed_at', sa.DateTime(), nullable=True), + sa.Column('processing_notes', sa.Text(), nullable=True), + sa.Column('export_file_path', sa.String(length=500), nullable=True), + sa.Column('deletion_log', sa.JSON(), nullable=True), + sa.Column('ip_address', sa.String(length=45), nullable=True), + sa.Column('user_agent', sa.String(length=255), nullable=True), + sa.Column('created_at', sa.DateTime(), nullable=False, server_default=sa.text('CURRENT_TIMESTAMP')), + sa.Column('updated_at', sa.DateTime(), nullable=False, server_default=sa.text('CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP')), + sa.Column('expires_at', sa.DateTime(), nullable=True), + sa.ForeignKeyConstraint(['processed_by'], ['users.id'], ), + sa.ForeignKeyConstraint(['user_id'], ['users.id'], ), + sa.PrimaryKeyConstraint('id') + ) + + # Create indexes + op.create_index(op.f('ix_gdpr_requests_id'), 'gdpr_requests', ['id'], unique=False) + op.create_index(op.f('ix_gdpr_requests_request_type'), 'gdpr_requests', ['request_type'], unique=False) + op.create_index(op.f('ix_gdpr_requests_status'), 'gdpr_requests', ['status'], unique=False) + op.create_index(op.f('ix_gdpr_requests_user_id'), 'gdpr_requests', ['user_id'], unique=False) + op.create_index(op.f('ix_gdpr_requests_is_anonymous'), 'gdpr_requests', ['is_anonymous'], unique=False) + op.create_index(op.f('ix_gdpr_requests_created_at'), 'gdpr_requests', ['created_at'], unique=False) + op.create_index(op.f('ix_gdpr_requests_verification_token'), 'gdpr_requests', ['verification_token'], unique=True) + else: + # Table already exists, ensure it has the is_anonymous column if missing + columns = [col['name'] for col in inspector.get_columns('gdpr_requests')] + if 'is_anonymous' not in columns: + op.add_column('gdpr_requests', sa.Column('is_anonymous', sa.Boolean(), nullable=False, server_default='0')) + op.create_index(op.f('ix_gdpr_requests_is_anonymous'), 'gdpr_requests', ['is_anonymous'], unique=False) + + # Ensure user_id is nullable + # Note: This might fail if there are existing non-null values, but for a new table it should be fine + try: + op.alter_column('gdpr_requests', 'user_id', existing_type=sa.Integer(), nullable=True) + except Exception: + pass # Column might already be nullable + + +def downgrade() -> None: + # Drop indexes + bind = op.get_bind() + inspector = sa.inspect(bind) + tables = inspector.get_table_names() + + if 'gdpr_requests' in tables: + try: + op.drop_index(op.f('ix_gdpr_requests_verification_token'), table_name='gdpr_requests') + except Exception: + pass + try: + op.drop_index(op.f('ix_gdpr_requests_created_at'), table_name='gdpr_requests') + except Exception: + pass + try: + op.drop_index(op.f('ix_gdpr_requests_is_anonymous'), table_name='gdpr_requests') + except Exception: + pass + try: + op.drop_index(op.f('ix_gdpr_requests_user_id'), table_name='gdpr_requests') + except Exception: + pass + try: + op.drop_index(op.f('ix_gdpr_requests_status'), table_name='gdpr_requests') + except Exception: + pass + try: + op.drop_index(op.f('ix_gdpr_requests_request_type'), table_name='gdpr_requests') + except Exception: + pass + try: + op.drop_index(op.f('ix_gdpr_requests_id'), table_name='gdpr_requests') + except Exception: + pass + + # Drop table + op.drop_table('gdpr_requests') diff --git a/Backend/alembic/versions/fe519abcefe7_add_email_verification_and_enhance_user_.py b/Backend/alembic/versions/fe519abcefe7_add_email_verification_and_enhance_user_.py new file mode 100644 index 00000000..ad1cbbd3 --- /dev/null +++ b/Backend/alembic/versions/fe519abcefe7_add_email_verification_and_enhance_user_.py @@ -0,0 +1,110 @@ +"""add_email_verification_and_enhance_user_security + +Revision ID: fe519abcefe7 +Revises: 54e4d0db31a3 +Create Date: 2025-12-06 01:53:10.797944 + +""" +from alembic import op +import sqlalchemy as sa +from sqlalchemy.dialects import mysql + + +# revision identifiers, used by Alembic. +revision = 'fe519abcefe7' +down_revision = '54e4d0db31a3' +branch_labels = None +depends_on = None + + +def upgrade() -> None: + bind = op.get_bind() + inspector = sa.inspect(bind) + tables = inspector.get_table_names() + + # Add email_verified column to users table + if 'users' in tables: + columns = [col['name'] for col in inspector.get_columns('users')] + if 'email_verified' not in columns: + # Use MySQL-compatible boolean default + op.add_column('users', sa.Column('email_verified', sa.Boolean(), nullable=False, server_default=sa.text('0'))) + # Check if index exists before creating + try: + op.create_index('ix_users_email_verified', 'users', ['email_verified'], unique=False) + except Exception: + pass # Index might already exist + + # Add password expiry fields + if 'password_changed_at' not in columns: + op.add_column('users', sa.Column('password_changed_at', sa.DateTime(), nullable=True)) + # Check if index exists before creating + try: + op.create_index('ix_users_password_changed_at', 'users', ['password_changed_at'], unique=False) + except Exception: + pass # Index might already exist + + # Create password_history table + if 'password_history' not in tables: + op.create_table( + 'password_history', + sa.Column('id', sa.Integer(), autoincrement=True, nullable=False), + sa.Column('user_id', sa.Integer(), nullable=False), + sa.Column('password_hash', sa.String(length=255), nullable=False), + sa.Column('created_at', sa.DateTime(), nullable=False, server_default=sa.text('CURRENT_TIMESTAMP')), + sa.ForeignKeyConstraint(['user_id'], ['users.id'], ), + sa.PrimaryKeyConstraint('id') + ) + op.create_index(op.f('ix_password_history_id'), 'password_history', ['id'], unique=False) + op.create_index(op.f('ix_password_history_user_id'), 'password_history', ['user_id'], unique=False) + op.create_index(op.f('ix_password_history_created_at'), 'password_history', ['created_at'], unique=False) + + # Create email_verification_tokens table + if 'email_verification_tokens' not in tables: + op.create_table( + 'email_verification_tokens', + sa.Column('id', sa.Integer(), autoincrement=True, nullable=False), + sa.Column('user_id', sa.Integer(), nullable=False), + sa.Column('token', sa.String(length=255), nullable=False), + sa.Column('email', sa.String(length=100), nullable=False), + sa.Column('expires_at', sa.DateTime(), nullable=False), + sa.Column('used', sa.Boolean(), nullable=False, server_default=sa.text('0')), + sa.Column('created_at', sa.DateTime(), nullable=False, server_default=sa.text('CURRENT_TIMESTAMP')), + sa.Column('updated_at', sa.DateTime(), nullable=False, server_default=sa.text('CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP')), + sa.ForeignKeyConstraint(['user_id'], ['users.id'], ), + sa.PrimaryKeyConstraint('id') + ) + op.create_index(op.f('ix_email_verification_tokens_id'), 'email_verification_tokens', ['id'], unique=False) + op.create_index(op.f('ix_email_verification_tokens_user_id'), 'email_verification_tokens', ['user_id'], unique=False) + op.create_index(op.f('ix_email_verification_tokens_token'), 'email_verification_tokens', ['token'], unique=True) + op.create_index(op.f('ix_email_verification_tokens_expires_at'), 'email_verification_tokens', ['expires_at'], unique=False) + + +def downgrade() -> None: + bind = op.get_bind() + inspector = sa.inspect(bind) + tables = inspector.get_table_names() + + # Drop email_verification_tokens table + if 'email_verification_tokens' in tables: + op.drop_index(op.f('ix_email_verification_tokens_expires_at'), table_name='email_verification_tokens') + op.drop_index(op.f('ix_email_verification_tokens_token'), table_name='email_verification_tokens') + op.drop_index(op.f('ix_email_verification_tokens_user_id'), table_name='email_verification_tokens') + op.drop_index(op.f('ix_email_verification_tokens_id'), table_name='email_verification_tokens') + op.drop_table('email_verification_tokens') + + # Remove password_history table + if 'password_history' in tables: + op.drop_index(op.f('ix_password_history_created_at'), table_name='password_history') + op.drop_index(op.f('ix_password_history_user_id'), table_name='password_history') + op.drop_index(op.f('ix_password_history_id'), table_name='password_history') + op.drop_table('password_history') + + # Remove email_verified and password_changed_at columns from users table + if 'users' in tables: + columns = [col['name'] for col in inspector.get_columns('users')] + if 'password_changed_at' in columns: + op.drop_index('ix_users_password_changed_at', table_name='users') + op.drop_column('users', 'password_changed_at') + if 'email_verified' in columns: + op.drop_index('ix_users_email_verified', table_name='users') + op.drop_column('users', 'email_verified') diff --git a/Backend/seeders/__init__.py b/Backend/seeders/__init__.py new file mode 100644 index 00000000..edad87bd --- /dev/null +++ b/Backend/seeders/__init__.py @@ -0,0 +1,2 @@ +# Seeders package + diff --git a/Backend/seeders/__pycache__/__init__.cpython-312.pyc b/Backend/seeders/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..4b27ce4fa716de11e5b45043c3d2e7ea3cbd7f42 GIT binary patch literal 156 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 R>p=KVjxGD8z(&#O{{z(8aU=i$ literal 0 HcmV?d00001 diff --git a/Backend/seeders/__pycache__/homepage_seeder.cpython-312.pyc b/Backend/seeders/__pycache__/homepage_seeder.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..02fa3f6ef05a96da48cce7445473e16a385751b9 GIT binary patch literal 22724 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 literal 0 HcmV?d00001 diff --git a/Backend/seeders/about_seeder.py b/Backend/seeders/about_seeder.py new file mode 100644 index 00000000..f3c5765f --- /dev/null +++ b/Backend/seeders/about_seeder.py @@ -0,0 +1,318 @@ +""" +About Page Seeder +Seeds the database with comprehensive about page content +All images are from Unsplash (free stock photos) +""" +import json +import sys +from pathlib import Path +from datetime import datetime, timezone + +# Add parent directory to path to allow importing from src +sys.path.insert(0, str(Path(__file__).resolve().parents[1])) + +from sqlalchemy.orm import Session +from src.shared.config.database import SessionLocal +from src.shared.config.logging_config import get_logger +from src.content.models.page_content import PageContent, PageType + +# Import all models to ensure relationships are loaded +from src.models import * + +logger = get_logger(__name__) + + +def get_about_page_data(): + """Generate comprehensive about page data with Unsplash images""" + + now = datetime.now(timezone.utc) + + return { + 'page_type': PageType.ABOUT, + 'title': 'About Our Hotel', + 'subtitle': 'A Legacy of Luxury and Exceptional Service', + 'description': 'Discover our rich heritage spanning three decades. We have been crafting exceptional experiences for discerning travelers worldwide, blending timeless elegance with modern amenities.', + 'content': '

For over three decades, we have been at the forefront of luxury hospitality, creating unforgettable experiences for our guests. Our commitment to excellence, attention to detail, and passion for service has made us a destination of choice for travelers seeking the finest in accommodation, dining, and personalized service.

', + 'meta_title': 'About Us | Luxury Hotel & Resort - Our Story, Mission & Vision', + 'meta_description': 'Learn about our luxury hotel\'s rich heritage, mission, vision, and commitment to exceptional hospitality. Discover our story spanning three decades of excellence.', + 'meta_keywords': 'about us, hotel history, luxury hospitality, hotel mission, hotel vision, hotel story, luxury hotel', + 'og_title': 'About Our Luxury Hotel - A Legacy of Excellence', + 'og_description': 'Discover our rich heritage spanning three decades. We have been crafting exceptional experiences for discerning travelers worldwide.', + 'og_image': 'https://images.unsplash.com/photo-1520250497591-112f2f40a3f4?w=1200&h=630&fit=crop', + 'canonical_url': 'https://luxuryhotel.com/about', + 'hero_title': 'Our Story', + 'hero_subtitle': 'Three Decades of Excellence in Luxury Hospitality', + 'hero_image': 'https://images.unsplash.com/photo-1520250497591-112f2f40a3f4?w=1920&h=1080&fit=crop', + 'hero_video_url': None, + 'hero_video_poster': None, + 'about_hero_image': 'https://images.unsplash.com/photo-1566073771259-6a8506099945?w=1400&h=900&fit=crop', + 'story_content': '

Founded in 1993, our hotel began as a vision to create a sanctuary of luxury and sophistication in the heart of the city. What started as a small boutique property has grown into an internationally recognized destination, consistently ranked among the world\'s finest hotels.

Over the years, we have welcomed countless guests, from world leaders and celebrities to families celebrating special moments. Each guest has contributed to our story, and we are honored to have been part of their journeys.

Our commitment to excellence has never wavered. We continuously invest in our facilities, train our staff to the highest standards, and innovate to exceed expectations. Today, we stand as a testament to what is possible when passion meets dedication.

', + 'mission': '

Our mission is to provide unparalleled luxury experiences that exceed expectations. We are committed to creating memorable moments for every guest through exceptional service, world-class amenities, and attention to every detail. We strive to be the benchmark of excellence in hospitality, where every interaction reflects our dedication to perfection.

', + 'vision': '

Our vision is to be the world\'s most respected luxury hotel brand, recognized for our unwavering commitment to excellence, innovation, and sustainable luxury. We envision a future where our guests feel truly at home, where our team members are proud ambassadors of our values, and where our community benefits from our presence and commitment to responsible hospitality.

', + 'values': json.dumps([ + { + 'icon': 'heart', + 'title': 'Excellence', + 'description': 'We strive for perfection in every detail, ensuring your experience exceeds expectations. Excellence is not a goal but a standard we maintain in everything we do.' + }, + { + 'icon': 'users', + 'title': 'Hospitality', + 'description': 'Our dedicated team provides warm, personalized service to make you feel at home. We believe true hospitality comes from the heart and is reflected in every interaction.' + }, + { + 'icon': 'leaf', + 'title': 'Sustainability', + 'description': 'Committed to eco-friendly practices for a better future and a delightful stay. We balance luxury with responsibility, ensuring our operations protect the environment for future generations.' + }, + { + 'icon': 'award', + 'title': 'Quality', + 'description': 'We maintain the highest standards in service, amenities, and guest satisfaction. Quality is embedded in our culture and evident in every aspect of your stay.' + }, + { + 'icon': 'handshake', + 'title': 'Integrity', + 'description': 'We conduct our business with honesty, transparency, and ethical practices. Trust is the foundation of our relationships with guests, partners, and our community.' + }, + { + 'icon': 'lightbulb', + 'title': 'Innovation', + 'description': 'We embrace new technologies and creative solutions to enhance your experience. Innovation drives us to continuously improve and stay ahead of industry trends.' + } + ]), + 'team': json.dumps([ + { + 'name': 'Sarah Johnson', + 'position': 'General Manager', + 'bio': 'With over 20 years of experience in luxury hospitality, Sarah leads our team with passion and dedication. Her commitment to excellence has been instrumental in our success.', + 'image': 'https://images.unsplash.com/photo-1494790108377-be9c29b29330?w=400&h=400&fit=crop&crop=face', + 'social': { + 'linkedin': 'https://linkedin.com/in/sarahjohnson', + 'twitter': 'https://twitter.com/sarahjohnson' + } + }, + { + 'name': 'Michael Chen', + 'position': 'Executive Chef', + 'bio': 'Award-winning chef with a passion for creating culinary masterpieces. Michael brings innovative flavors and techniques to our restaurants, delighting guests with every dish.', + 'image': 'https://images.unsplash.com/photo-1507003211169-0a1dd7228f2d?w=400&h=400&fit=crop&crop=face', + 'social': { + 'linkedin': 'https://linkedin.com/in/michaelchen', + 'instagram': 'https://instagram.com/chefmichael' + } + }, + { + 'name': 'Emily Rodriguez', + 'position': 'Director of Guest Services', + 'bio': 'Emily ensures every guest receives personalized attention and exceptional service. Her warm personality and attention to detail make her a favorite among our guests.', + 'image': 'https://images.unsplash.com/photo-1438761681033-6461ffad8d80?w=400&h=400&fit=crop&crop=face', + 'social': { + 'linkedin': 'https://linkedin.com/in/emilyrodriguez' + } + }, + { + 'name': 'David Thompson', + 'position': 'Spa Director', + 'bio': 'With expertise in wellness and holistic healing, David has created a world-class spa experience. His innovative treatments and serene environment provide guests with ultimate relaxation.', + 'image': 'https://images.unsplash.com/photo-1500648767791-00dcc994a43e?w=400&h=400&fit=crop&crop=face', + 'social': { + 'linkedin': 'https://linkedin.com/in/davidthompson' + } + } + ]), + 'timeline': json.dumps([ + { + 'year': '1993', + 'title': 'Foundation', + 'description': 'Hotel founded with a vision to create a luxury destination. Opened with 50 rooms and a commitment to exceptional service.', + 'image': 'https://images.unsplash.com/photo-1520250497591-112f2f40a3f4?w=800&h=600&fit=crop' + }, + { + 'year': '2000', + 'title': 'First Expansion', + 'description': 'Expanded to 150 rooms and added our first fine dining restaurant. Received our first five-star rating from international travel guides.', + 'image': 'https://images.unsplash.com/photo-1566073771259-6a8506099945?w=800&h=600&fit=crop' + }, + { + 'year': '2008', + 'title': 'Spa & Wellness Center', + 'description': 'Opened our world-class spa and wellness center, introducing holistic wellness programs and luxury treatments.', + 'image': 'https://images.unsplash.com/photo-1544161515-4ab6ce6db874?w=800&h=600&fit=crop' + }, + { + 'year': '2015', + 'title': 'Major Renovation', + 'description': 'Completed a comprehensive renovation, modernizing all rooms and public spaces while preserving our classic elegance.', + 'image': 'https://images.unsplash.com/photo-1618773928121-c32242e63f39?w=800&h=600&fit=crop' + }, + { + 'year': '2020', + 'title': 'Sustainability Initiative', + 'description': 'Launched our comprehensive sustainability program, achieving carbon neutrality and implementing eco-friendly practices throughout the property.', + 'image': 'https://images.unsplash.com/photo-1470071459604-3b5ec3a7fe05?w=800&h=600&fit=crop' + }, + { + 'year': '2023', + 'title': 'Award Recognition', + 'description': 'Received "Best Luxury Hotel" award and maintained our five-star rating. Celebrated 30 years of excellence in hospitality.', + 'image': 'https://images.unsplash.com/photo-1579621970563-ebec7560ff3e?w=800&h=600&fit=crop' + } + ]), + 'achievements': json.dumps([ + { + 'icon': 'trophy', + 'title': 'Best Luxury Hotel 2023', + 'description': 'Awarded by International Hospitality Association', + 'year': '2023', + 'image': 'https://images.unsplash.com/photo-1579621970563-ebec7560ff3e?w=400&h=400&fit=crop' + }, + { + 'icon': 'star', + 'title': 'Five-Star Rating', + 'description': 'Consistently rated five-star by global travel guides', + 'year': '2020-2023', + 'image': 'https://images.unsplash.com/photo-1579621970563-ebec7560ff3e?w=400&h=400&fit=crop' + }, + { + 'icon': 'medal', + 'title': 'Excellence in Service', + 'description': 'Recognized for outstanding customer service and guest satisfaction', + 'year': '2022', + 'image': 'https://images.unsplash.com/photo-1579621970563-ebec7560ff3e?w=400&h=400&fit=crop' + }, + { + 'icon': 'leaf', + 'title': 'Green Hotel Certification', + 'description': 'Certified for sustainable practices and environmental responsibility', + 'year': '2021', + 'image': 'https://images.unsplash.com/photo-1470071459604-3b5ec3a7fe05?w=400&h=400&fit=crop' + }, + { + 'icon': 'users', + 'title': 'Guest Choice Award', + 'description': 'Voted favorite luxury hotel by guests worldwide', + 'year': '2023', + 'image': 'https://images.unsplash.com/photo-1579621970563-ebec7560ff3e?w=400&h=400&fit=crop' + }, + { + 'icon': 'award', + 'title': 'Culinary Excellence', + 'description': 'Restaurant awarded Michelin star for exceptional cuisine', + 'year': '2022', + 'image': 'https://images.unsplash.com/photo-1414235077428-338989a2e8c0?w=400&h=400&fit=crop' + } + ]), + 'stats': json.dumps([ + {'number': '50000+', 'label': 'Happy Guests', 'icon': 'users'}, + {'number': '30+', 'label': 'Years of Excellence', 'icon': 'calendar'}, + {'number': '150+', 'label': 'Awards Won', 'icon': 'award'}, + {'number': '98%', 'label': 'Guest Satisfaction', 'icon': 'star'}, + {'number': '200+', 'label': 'Team Members', 'icon': 'users'}, + {'number': '115', 'label': 'Luxury Rooms', 'icon': 'home'} + ]), + 'stats_section_title': 'Our Achievements in Numbers', + 'stats_section_subtitle': 'A legacy built on excellence and guest satisfaction', + 'testimonials': json.dumps([ + { + 'name': 'James Wilson', + 'title': 'VIP Guest', + 'quote': 'The level of luxury and attention to detail is simply extraordinary. This hotel understands what true hospitality means.', + 'rating': 5, + 'image': 'https://images.unsplash.com/photo-1535713875002-d1d0cf377fde?w=200&h=200&fit=crop&crop=face' + }, + { + 'name': 'Sophia Lee', + 'title': 'Travel Blogger', + 'quote': 'Every aspect of my stay was flawless. The service, the amenities, the ambiance - truly a five-star experience.', + 'rating': 5, + 'image': 'https://images.unsplash.com/photo-1438761681033-6461ffad8d80?w=200&h=200&fit=crop&crop=face' + }, + { + 'name': 'David Chen', + 'title': 'CEO, Global Corp', + 'quote': 'An impeccable hotel with outstanding service. This is what luxury hospitality should be - perfect in every way.', + 'rating': 5, + 'image': 'https://images.unsplash.com/photo-1534528741775-53994a69daeb?w=200&h=200&fit=crop&crop=face' + }, + { + 'name': 'Maria Garcia', + 'title': 'Frequent Guest', + 'quote': 'I\'ve stayed at many luxury hotels, but this one stands out. The personal attention and genuine care for guests is remarkable.', + 'rating': 5, + 'image': 'https://images.unsplash.com/photo-1544005313-94ddf0286df2?w=200&h=200&fit=crop&crop=face' + } + ]), + 'testimonials_section_title': 'What Our Guests Say', + 'testimonials_section_subtitle': 'Stories from our valued guests', + 'gallery_images': json.dumps([ + 'https://images.unsplash.com/photo-1520250497591-112f2f40a3f4?w=1200&h=800&fit=crop', + 'https://images.unsplash.com/photo-1566073771259-6a8506099945?w=1200&h=800&fit=crop', + 'https://images.unsplash.com/photo-1618773928121-c32242e63f39?w=1200&h=800&fit=crop', + 'https://images.unsplash.com/photo-1544161515-4ab6ce6db874?w=1200&h=800&fit=crop', + 'https://images.unsplash.com/photo-1414235077428-338989a2e8c0?w=1200&h=800&fit=crop', + 'https://images.unsplash.com/photo-1590490360182-c33d57733427?w=1200&h=800&fit=crop', + 'https://images.unsplash.com/photo-1631049307264-da0ec9d70304?w=1200&h=800&fit=crop', + 'https://images.unsplash.com/photo-1571896349842-33c89424de2d?w=1200&h=800&fit=crop' + ]), + 'gallery_section_title': 'Our Photo Gallery', + 'gallery_section_subtitle': 'A glimpse into our world of luxury', + 'contact_info': json.dumps({ + 'phone': '+1 (555) 123-4567', + 'email': 'info@luxuryhotel.com', + 'address': '123 Luxury Avenue, Premium City, PC 12345' + }), + 'social_links': json.dumps({ + 'facebook': 'https://facebook.com/luxuryhotel', + 'twitter': 'https://twitter.com/luxuryhotel', + 'instagram': 'https://instagram.com/luxuryhotel', + 'linkedin': 'https://linkedin.com/company/luxuryhotel', + 'youtube': 'https://youtube.com/luxuryhotel' + }), + 'is_active': True, + 'created_at': now, + 'updated_at': now + } + + +def seed_about_page(db: Session): + """Seed about page content into the database""" + try: + about_data = get_about_page_data() + + # Check if about page content already exists + existing_content = db.query(PageContent).filter(PageContent.page_type == PageType.ABOUT).first() + + if existing_content: + logger.info('Updating existing about page content...') + for key, value in about_data.items(): + if key not in ['id', 'page_type', 'created_at']: # Don't update primary key or creation date + setattr(existing_content, key, value) + existing_content.updated_at = datetime.now(timezone.utc) + else: + logger.info('Creating new about page content...') + about_page = PageContent(**about_data) + db.add(about_page) + + db.commit() + logger.info('About page content seeded successfully!') + except Exception as e: + db.rollback() + logger.error(f'Error seeding about page: {str(e)}', exc_info=True) + raise + + +def main(): + db = SessionLocal() + try: + seed_about_page(db) + except Exception as e: + logger.error(f'Failed to seed about page: {str(e)}', exc_info=True) + sys.exit(1) + finally: + db.close() + + +if __name__ == '__main__': + main() + diff --git a/Backend/seeders/accessibility_seeder.py b/Backend/seeders/accessibility_seeder.py new file mode 100644 index 00000000..fcc27fb1 --- /dev/null +++ b/Backend/seeders/accessibility_seeder.py @@ -0,0 +1,200 @@ +""" +Accessibility Page Seeder +Seeds the database with comprehensive accessibility information +""" +import json +import sys +from pathlib import Path +from datetime import datetime, timezone + +# Add parent directory to path to allow importing from src +sys.path.insert(0, str(Path(__file__).resolve().parents[1])) + +from sqlalchemy.orm import Session +from src.shared.config.database import SessionLocal +from src.shared.config.logging_config import get_logger +from src.content.models.page_content import PageContent, PageType + +# Import all models to ensure relationships are loaded +from src.models import * + +logger = get_logger(__name__) + + +def get_accessibility_page_data(): + """Generate comprehensive accessibility page data""" + + now = datetime.now(timezone.utc) + + return { + 'page_type': PageType.ACCESSIBILITY, + 'title': 'Accessibility', + 'subtitle': 'Committed to Accessibility for All', + 'description': 'We are committed to providing accessible facilities and services for all our guests. Learn about our accessibility features and accommodations.', + 'content': """ +

Our Commitment to Accessibility

+

At Luxury Hotel & Resort, we are committed to ensuring that our facilities and services are accessible to all guests, including those with disabilities. We strive to comply with the Americans with Disabilities Act (ADA) and continuously work to improve accessibility throughout our property.

+ +

Accessible Accommodations

+

Accessible Guest Rooms

+

We offer several accessible guest rooms designed to meet ADA requirements, featuring:

+
    +
  • Wider doorways (minimum 32 inches)
  • +
  • Roll-in showers or accessible bathtubs with grab bars
  • +
  • Lowered light switches and thermostats
  • +
  • Visual door knockers and phone alerts
  • +
  • Accessible vanities and bathroom fixtures
  • +
  • Closed-captioned televisions
  • +
  • Accessible closet rods and shelves
  • +
+ +

Room Features

+
    +
  • Hearing-impaired kits available upon request
  • +
  • Visual smoke detectors
  • +
  • TTY/TDD devices available
  • +
  • Accessible furniture and seating
  • +
+ +

Public Areas & Facilities

+

Entrance & Lobby

+
    +
  • Wheelchair-accessible main entrance
  • +
  • Automatic doors at main entrance
  • +
  • Accessible front desk with lowered counter
  • +
  • Accessible seating areas in lobby
  • +
+ +

Dining Facilities

+
    +
  • Accessible dining areas in all restaurants
  • +
  • Accessible tables and seating
  • +
  • Menus available in large print or braille upon request
  • +
  • Staff trained to assist guests with disabilities
  • +
+ +

Recreation & Fitness

+
    +
  • Accessible fitness center with adaptive equipment
  • +
  • Accessible pool area with pool lift (available upon request)
  • +
  • Accessible spa facilities
  • +
+ +

Meeting & Event Spaces

+
    +
  • Accessible meeting rooms
  • +
  • Accessible restrooms in meeting areas
  • +
  • Assistive listening devices available
  • +
  • Sign language interpreters available with advance notice
  • +
+ +

Parking & Transportation

+
    +
  • Accessible parking spaces near main entrance
  • +
  • Van-accessible parking spaces
  • +
  • Accessible valet service
  • +
  • Accessible transportation available upon request
  • +
+ +

Service Animals

+

Service animals are welcome throughout our property. We comply with all applicable laws regarding service animals and do not charge additional fees for service animals.

+ +

Assistive Devices & Services

+

Available Upon Request

+
    +
  • TTY/TDD devices
  • +
  • Visual door knockers
  • +
  • Hearing-impaired kits
  • +
  • Closed-captioned televisions
  • +
  • Large print menus and materials
  • +
  • Braille materials (available for select items)
  • +
  • Assistive listening devices for meetings
  • +
  • Sign language interpreters (with advance notice)
  • +
+ +

Website Accessibility

+

We are committed to making our website accessible to all users. Our website is designed to comply with WCAG 2.1 Level AA standards. If you encounter any accessibility barriers on our website, please contact us so we can address the issue.

+ +

Communication

+

Our staff is trained to communicate effectively with guests who have disabilities. We can provide information in alternative formats upon request, including:

+
    +
  • Large print materials
  • +
  • Written materials
  • +
  • Assistance with reading menus or other materials
  • +
+ +

Accessibility Concerns & Feedback

+

We welcome feedback from our guests regarding accessibility. If you have any concerns or suggestions for improvement, please contact us:

+
    +
  • Email: accessibility@luxuryhotel.com
  • +
  • Phone: +1 (555) 123-4567
  • +
  • TTY/TDD: +1 (555) 123-4568
  • +
  • Address: 123 Luxury Avenue, Premium City, PC 12345, United States
  • +
+ +

Reservations

+

When making a reservation, please inform us of any specific accessibility needs so we can ensure your room and services meet your requirements. Our reservations team is available 24/7 to assist you.

+
    +
  • Reservations Phone: +1 (555) 123-4567
  • +
  • Reservations Email: reservations@luxuryhotel.com
  • +
+ +

Ongoing Improvements

+

We are continuously working to improve accessibility throughout our property. We regularly review and update our facilities and services to better serve all our guests. If you have suggestions for improvements, we would love to hear from you.

+ +

Last Updated: {}

+ """.format(now.strftime('%B %d, %Y')), + 'meta_title': 'Accessibility | Luxury Hotel & Resort - Accessible Facilities', + 'meta_description': 'Learn about our accessible facilities and services. We are committed to providing accessible accommodations for all guests.', + 'meta_keywords': 'accessibility, ADA, accessible hotel, wheelchair accessible, disability accommodations, accessible rooms', + 'og_title': 'Accessibility - Luxury Hotel & Resort', + 'og_description': 'Committed to accessibility for all. Learn about our accessible facilities and services.', + 'og_image': 'https://images.unsplash.com/photo-1556761175-5973dc0f32e7?w=1200&h=630&fit=crop', + 'canonical_url': 'https://luxuryhotel.com/accessibility', + 'is_active': True, + 'created_at': now, + 'updated_at': now + } + + +def seed_accessibility_page(db: Session): + """Seed accessibility page content into the database""" + try: + accessibility_data = get_accessibility_page_data() + + # Check if accessibility page content already exists + existing_content = db.query(PageContent).filter(PageContent.page_type == PageType.ACCESSIBILITY).first() + + if existing_content: + logger.info('Updating existing accessibility page content...') + for key, value in accessibility_data.items(): + if key not in ['id', 'page_type', 'created_at']: + setattr(existing_content, key, value) + existing_content.updated_at = datetime.now(timezone.utc) + else: + logger.info('Creating new accessibility page content...') + accessibility_page = PageContent(**accessibility_data) + db.add(accessibility_page) + + db.commit() + logger.info('Accessibility page content seeded successfully!') + except Exception as e: + db.rollback() + logger.error(f'Error seeding accessibility page: {str(e)}', exc_info=True) + raise + + +def main(): + db = SessionLocal() + try: + seed_accessibility_page(db) + except Exception as e: + logger.error(f'Failed to seed accessibility page: {str(e)}', exc_info=True) + sys.exit(1) + finally: + db.close() + + +if __name__ == '__main__': + main() + diff --git a/Backend/seeders/banner_seeder.py b/Backend/seeders/banner_seeder.py new file mode 100644 index 00000000..541bcb7d --- /dev/null +++ b/Backend/seeders/banner_seeder.py @@ -0,0 +1,315 @@ +""" +Banner Seeder +Seeds the database with comprehensive banners for different positions +All images are from Unsplash (free stock photos) +""" +import sys +from pathlib import Path +from datetime import datetime, timezone, timedelta + +# Add parent directory to path to import modules +sys.path.insert(0, str(Path(__file__).resolve().parents[1])) + +from sqlalchemy.orm import Session +from src.shared.config.database import SessionLocal +from src.content.models.banner import Banner +from src.shared.config.logging_config import get_logger + +logger = get_logger(__name__) + + +def get_banner_data(): + """Generate comprehensive banner data with Unsplash images""" + + now = datetime.now(timezone.utc) + future_date = now + timedelta(days=365) # Banners active for 1 year + + banners = [ + # Home Page Banners + { + 'title': 'Welcome to Luxury', + 'description': 'Experience unparalleled elegance and world-class service at our award-winning hotel. Discover sophisticated rooms, exceptional dining, and modern amenities.', + 'image_url': 'https://images.unsplash.com/photo-1566073771259-6a8506099945?w=1920&h=1080&fit=crop', + 'link_url': '/rooms', + 'position': 'home', + 'display_order': 1, + 'is_active': True, + 'start_date': now, + 'end_date': future_date + }, + { + 'title': 'Special Summer Offer', + 'description': 'Book now and save up to 30% on your summer getaway! Perfect for families, couples, and solo travelers. Limited time offer.', + 'image_url': 'https://images.unsplash.com/photo-1571896349842-33c89424de2d?w=1920&h=1080&fit=crop', + 'link_url': '/book', + 'position': 'home', + 'display_order': 2, + 'is_active': True, + 'start_date': now, + 'end_date': future_date + }, + { + 'title': 'Fine Dining Experience', + 'description': 'Savor exquisite cuisine at our Michelin-starred restaurants. Enjoy international flavors, local specialties, and expertly curated wine pairings.', + 'image_url': 'https://images.unsplash.com/photo-1414235077428-338989a2e8c0?w=1920&h=1080&fit=crop', + 'link_url': '/services', + 'position': 'home', + 'display_order': 3, + 'is_active': True, + 'start_date': now, + 'end_date': future_date + }, + { + 'title': 'Luxury Spa & Wellness', + 'description': 'Rejuvenate at our world-class spa with personalized treatments, therapeutic massages, steam rooms, saunas, and yoga classes.', + 'image_url': 'https://images.unsplash.com/photo-1544161515-4ab6ce6db874?w=1920&h=1080&fit=crop', + 'link_url': '/services', + 'position': 'home', + 'display_order': 4, + 'is_active': True, + 'start_date': now, + 'end_date': future_date + }, + { + 'title': 'Business Events & Conferences', + 'description': 'Host your corporate event in our state-of-the-art facilities. Versatile spaces for intimate meetings to large conferences with cutting-edge technology.', + 'image_url': 'https://images.unsplash.com/photo-1497366216548-37526070297c?w=1920&h=1080&fit=crop', + 'link_url': '/contact', + 'position': 'home', + 'display_order': 5, + 'is_active': True, + 'start_date': now, + 'end_date': future_date + }, + + # Rooms Page Banners + { + 'title': 'Luxurious Suites', + 'description': 'Elegantly designed suites with spacious layouts, separate living areas, marble bathrooms, and private balconies with panoramic views. Smart room controls and premium amenities included.', + 'image_url': 'https://images.unsplash.com/photo-1618773928121-c32242e63f39?w=1920&h=1080&fit=crop', + 'link_url': '/rooms', + 'position': 'rooms', + 'display_order': 1, + 'is_active': True, + 'start_date': now, + 'end_date': future_date + }, + { + 'title': 'Presidential Suite', + 'description': 'Ultimate luxury in our exclusive 2,000+ sq ft suite. Features grand living room, formal dining, fully equipped kitchen, private terrace, and personal butler service. Perfect for VIP guests.', + 'image_url': 'https://images.unsplash.com/photo-1596394516093-501ba68a0ba6?w=1920&h=1080&fit=crop', + 'link_url': '/rooms', + 'position': 'rooms', + 'display_order': 2, + 'is_active': True, + 'start_date': now, + 'end_date': future_date + }, + { + 'title': 'Ocean View Rooms', + 'description': 'Breathtaking ocean views from private balconies. Spacious rooms with floor-to-ceiling windows, coastal decor, and premium furnishings. Perfect for romantic getaways.', + 'image_url': 'https://images.unsplash.com/photo-1631049307264-da0ec9d70304?w=1920&h=1080&fit=crop', + 'link_url': '/rooms', + 'position': 'rooms', + 'display_order': 3, + 'is_active': True, + 'start_date': now, + 'end_date': future_date + }, + + # About Page Banners + { + 'title': 'Our Story', + 'description': 'Discover our rich heritage spanning three decades. Founded to redefine luxury hospitality, we\'ve grown into an internationally recognized destination with timeless elegance.', + 'image_url': 'https://images.unsplash.com/photo-1520250497591-112f2f40a3f4?w=1920&h=1080&fit=crop', + 'link_url': '/about', + 'position': 'about', + 'display_order': 1, + 'is_active': True, + 'start_date': now, + 'end_date': future_date + }, + { + 'title': 'Award-Winning Service', + 'description': 'Recognized globally for exceptional hospitality with prestigious awards including five-star ratings and "Best Luxury Hotel" honors. Our trained team delivers service beyond expectations.', + 'image_url': 'https://images.unsplash.com/photo-1579621970563-ebec7560ff3e?w=1920&h=1080&fit=crop', + 'link_url': '/about', + 'position': 'about', + 'display_order': 2, + 'is_active': True, + 'start_date': now, + 'end_date': future_date + }, + + # Contact Page Banner + { + 'title': 'Get in Touch', + 'description': 'Our friendly team is available 24/7 for reservations, inquiries, and special requests. Reach us by phone, email, or visit our front desk. Concierge assistance available.', + 'image_url': 'https://images.unsplash.com/photo-1556761175-5973dc0f32e7?w=1920&h=1080&fit=crop', + 'link_url': '/contact', + 'position': 'contact', + 'display_order': 1, + 'is_active': True, + 'start_date': now, + 'end_date': future_date + }, + + # Services Page Banners + { + 'title': 'Premium Services', + 'description': 'Enjoy personalized butler service, private airport transfers, VIP lounge access, and priority reservations. Business center, city tours, and special occasion planning available.', + 'image_url': 'https://images.unsplash.com/photo-1441986300917-64674bd600d8?w=1920&h=1080&fit=crop', + 'link_url': '/services', + 'position': 'services', + 'display_order': 1, + 'is_active': True, + 'start_date': now, + 'end_date': future_date + }, + { + 'title': '24/7 Concierge Service', + 'description': 'Our dedicated concierge team is available around the clock. We assist with restaurant reservations, event tickets, transportation, exclusive experiences, and special occasions.', + 'image_url': 'https://images.unsplash.com/photo-1556761175-5973dc0f32e7?w=1920&h=1080&fit=crop', + 'link_url': '/services', + 'position': 'services', + 'display_order': 2, + 'is_active': True, + 'start_date': now, + 'end_date': future_date + }, + + # Promotional Banners (can be used across pages) + { + 'title': 'Early Bird Special', + 'description': 'Book 30 days in advance and save 20%! Perfect for travelers who plan ahead. Applies to all room types. Terms and conditions apply.', + 'image_url': 'https://images.unsplash.com/photo-1564501049412-61c2a3083791?w=1920&h=1080&fit=crop', + 'link_url': '/book', + 'position': 'home', + 'display_order': 6, + 'is_active': True, + 'start_date': now, + 'end_date': future_date + }, + { + 'title': 'Weekend Getaway Package', + 'description': 'All-inclusive weekend package with luxurious accommodation, daily breakfast, and full spa access. Late checkout included. Available Friday through Sunday.', + 'image_url': 'https://images.unsplash.com/photo-1590490360182-c33d57733427?w=1920&h=1080&fit=crop', + 'link_url': '/book', + 'position': 'home', + 'display_order': 7, + 'is_active': True, + 'start_date': now, + 'end_date': future_date + }, + { + 'title': 'Honeymoon Package', + 'description': 'Romantic honeymoon package includes luxurious suite, breakfast in bed, candlelit dinner with champagne, couples spa treatments, and special amenities.', + 'image_url': 'https://images.unsplash.com/photo-1611892440504-42a792e24d32?w=1920&h=1080&fit=crop', + 'link_url': '/book', + 'position': 'home', + 'display_order': 8, + 'is_active': True, + 'start_date': now, + 'end_date': future_date + }, + + # Footer/General Banners + { + 'title': 'Join Our Loyalty Program', + 'description': 'Earn points with every stay. Redeem for free nights, upgrades, dining credits, and spa treatments. Multiple tier levels from Silver to Platinum. Join free today!', + 'image_url': 'https://images.unsplash.com/photo-1519389950473-47ba0277781c?w=1920&h=1080&fit=crop', + 'link_url': '/loyalty', + 'position': 'home', + 'display_order': 9, + 'is_active': True, + 'start_date': now, + 'end_date': future_date + }, + { + 'title': 'Gift Cards Available', + 'description': 'Give the gift of luxury with our hotel gift cards. Perfect for any occasion. Usable for accommodations, dining, spa, and all services. Never expire. Purchase online or at front desk.', + 'image_url': 'https://images.unsplash.com/photo-1606761568499-6d2451b23c66?w=1920&h=1080&fit=crop', + 'link_url': '/gift-cards', + 'position': 'home', + 'display_order': 10, + 'is_active': True, + 'start_date': now, + 'end_date': future_date + } + ] + + return banners + + +def seed_banners(db: Session, clear_existing: bool = False): + """Seed banners into the database""" + try: + if clear_existing: + logger.info('Clearing existing banners...') + db.query(Banner).delete() + db.commit() + + banners_data = get_banner_data() + created_count = 0 + updated_count = 0 + + for banner_data in banners_data: + # Check if banner with same title and position already exists + existing = db.query(Banner).filter( + Banner.title == banner_data['title'], + Banner.position == banner_data['position'] + ).first() + + if existing: + logger.info(f'Updating existing banner: {banner_data["title"]} ({banner_data["position"]})') + # Update existing banner + for key, value in banner_data.items(): + setattr(existing, key, value) + existing.updated_at = datetime.now(timezone.utc) + updated_count += 1 + else: + logger.info(f'Creating new banner: {banner_data["title"]} ({banner_data["position"]})') + # Create new banner + banner = Banner(**banner_data) + db.add(banner) + created_count += 1 + + db.commit() + logger.info(f'Banner seeding completed! Created: {created_count}, Updated: {updated_count}') + return created_count, updated_count + + except Exception as e: + logger.error(f'Error seeding banners: {str(e)}', exc_info=True) + db.rollback() + raise + + +def main(): + """Main function to run the seeder""" + import argparse + + parser = argparse.ArgumentParser(description='Seed banners into the database') + parser.add_argument( + '--clear', + action='store_true', + help='Clear existing banners before seeding' + ) + + args = parser.parse_args() + + logger.info('Starting banner seeder...') + + db = SessionLocal() + try: + created, updated = seed_banners(db, clear_existing=args.clear) + logger.info(f'Banner seeder completed successfully! Created: {created}, Updated: {updated}') + except Exception as e: + logger.error(f'Failed to seed banners: {str(e)}', exc_info=True) + sys.exit(1) + finally: + db.close() + + +if __name__ == '__main__': + main() + diff --git a/Backend/seeders/blog_seeder.py b/Backend/seeders/blog_seeder.py new file mode 100644 index 00000000..8c58fd81 --- /dev/null +++ b/Backend/seeders/blog_seeder.py @@ -0,0 +1,320 @@ +""" +Blog Seeder +Seeds the database with blog posts +All images are from Unsplash (free stock photos) +""" +import json +import sys +import re +from pathlib import Path +from datetime import datetime, timezone, timedelta + +# Add parent directory to path to import modules +sys.path.insert(0, str(Path(__file__).resolve().parents[1])) + +from sqlalchemy.orm import Session +from src.shared.config.database import SessionLocal +from src.shared.config.logging_config import get_logger +from src.content.models.blog import BlogPost +from src.auth.models.user import User + +# Import all models to ensure relationships are loaded correctly +from src.models import * + +logger = get_logger(__name__) + + +def slugify(text): + """Convert text to URL-friendly slug""" + text = text.lower() + text = re.sub(r'[^\w\s-]', '', text) + text = re.sub(r'[-\s]+', '-', text) + return text.strip('-') + + +def get_blog_posts_data(author_id: int): + """Generate comprehensive blog posts data with Unsplash images""" + now = datetime.now(timezone.utc) + + posts = [ + { + 'title': '10 Tips for Planning the Perfect Luxury Hotel Stay', + 'slug': '10-tips-planning-perfect-luxury-hotel-stay', + 'excerpt': 'Discover expert tips to make your luxury hotel experience unforgettable. From booking strategies to maximizing amenities, we share insider secrets.', + 'content': '''

Planning a luxury hotel stay requires attention to detail and insider knowledge. Whether you're celebrating a special occasion or simply treating yourself, these tips will help you make the most of your experience.

+ +

1. Book in Advance

+

Luxury hotels often offer early bird discounts and better room availability when you book well in advance. Planning ahead also gives you access to special packages and upgrades.

+ +

2. Communicate Your Preferences

+

Don't hesitate to communicate your preferences when booking. Whether you prefer a high floor, specific room amenities, or have dietary restrictions, hotels are happy to accommodate.

+ +

3. Join Loyalty Programs

+

Most luxury hotels offer loyalty programs with exclusive benefits. Join before your stay to earn points, receive member rates, and enjoy perks like late checkout.

+ +

4. Explore Hotel Amenities

+

Take advantage of all the hotel has to offer - from spa treatments to fine dining. Many luxury hotels have world-class facilities that are worth experiencing.

+ +

5. Use Concierge Services

+

The concierge team is your gateway to the best local experiences. They can secure restaurant reservations, arrange transportation, and provide insider recommendations.

+ +

6. Check for Special Packages

+

Look for special packages that bundle accommodations with dining, spa, or local experiences. These often provide better value than booking separately.

+ +

7. Review Cancellation Policies

+

Understand the cancellation and modification policies before booking. Flexible rates may cost more but provide peace of mind.

+ +

8. Pack Appropriately

+

While luxury hotels provide many amenities, bringing appropriate attire for dining and activities ensures you're prepared for all experiences.

+ +

9. Arrive Early or Late

+

If possible, arrive early or late to avoid peak check-in times. This often results in better service and sometimes room upgrades if available.

+ +

10. Leave Reviews

+

Share your experience through reviews. Hotels value feedback and often reward guests who provide detailed, constructive reviews.

+ +

Remember, a luxury hotel stay is about creating memories. Take your time, enjoy every moment, and don't hesitate to ask for what will make your stay perfect.

''', + 'featured_image': 'https://images.unsplash.com/photo-1566073771259-6a8506099945?w=1200&h=800&fit=crop', + 'author_id': author_id, + 'published_at': now - timedelta(days=5), + 'is_published': True, + 'tags': json.dumps(['travel tips', 'luxury travel', 'hotel guide', 'vacation planning']), + 'meta_title': '10 Tips for Planning the Perfect Luxury Hotel Stay | Travel Guide', + 'meta_description': 'Expert tips for planning an unforgettable luxury hotel stay. Learn booking strategies, how to maximize amenities, and insider secrets.', + 'meta_keywords': 'luxury hotel tips, hotel booking guide, travel planning, luxury travel advice', + 'sections': None + }, + { + 'title': 'The Art of Fine Dining: A Culinary Journey at Our Hotel', + 'slug': 'art-fine-dining-culinary-journey', + 'excerpt': 'Explore our award-winning restaurants and discover the culinary philosophy behind our Michelin-starred dining experiences.', + 'content': '''

Fine dining is an art form that combines exceptional ingredients, masterful technique, and impeccable service. At our hotel, we've created culinary experiences that celebrate both tradition and innovation.

+ +

Our Culinary Philosophy

+

Our chefs believe in using the finest locally sourced ingredients, supporting sustainable practices, and creating dishes that tell a story. Each plate is a masterpiece, carefully crafted to delight all senses.

+ +

Signature Dishes

+

From our signature truffle risotto to our perfectly aged wagyu beef, every dish on our menu has been thoughtfully created. Our tasting menus offer a journey through flavors, textures, and culinary traditions.

+ +

Wine Pairing Excellence

+

Our sommeliers curate wine pairings that enhance every dish. With an extensive cellar featuring rare vintages and hidden gems, we ensure the perfect complement to your meal.

+ +

Private Dining Experiences

+

For special occasions, our private dining rooms offer intimate settings with personalized menus. Our chefs work closely with guests to create unforgettable culinary experiences.

+ +

Join us for a culinary journey that celebrates the art of fine dining and creates memories that last a lifetime.

''', + 'featured_image': 'https://images.unsplash.com/photo-1414235077428-338989a2e8c0?w=1200&h=800&fit=crop', + 'author_id': author_id, + 'published_at': now - timedelta(days=10), + 'is_published': True, + 'tags': json.dumps(['fine dining', 'culinary', 'restaurant', 'gourmet']), + 'meta_title': 'The Art of Fine Dining | Culinary Excellence', + 'meta_description': 'Discover our award-winning restaurants and Michelin-starred dining experiences. Explore our culinary philosophy and signature dishes.', + 'meta_keywords': 'fine dining, Michelin restaurant, gourmet cuisine, culinary experience', + 'sections': None + }, + { + 'title': 'Wellness and Relaxation: Your Guide to Our Spa & Wellness Center', + 'slug': 'wellness-relaxation-spa-wellness-center-guide', + 'excerpt': 'Discover our world-class spa and wellness center. Learn about our treatments, wellness programs, and how to achieve ultimate relaxation.', + 'content': '''

In today's fast-paced world, taking time for wellness and relaxation is essential. Our spa and wellness center offers a sanctuary where you can rejuvenate your mind, body, and spirit.

+ +

Our Wellness Philosophy

+

We believe in holistic wellness that addresses physical, mental, and emotional well-being. Our treatments combine traditional techniques with modern innovations to provide comprehensive care.

+ +

Signature Treatments

+

From our signature deep tissue massages to rejuvenating facials, each treatment is customized to your needs. Our expert therapists use premium products and time-tested techniques.

+ +

Wellness Programs

+

Beyond individual treatments, we offer comprehensive wellness programs including yoga classes, meditation sessions, and personalized fitness consultations.

+ +

The Spa Environment

+

Our spa facilities include steam rooms, saunas, relaxation lounges, and private treatment rooms. Every detail is designed to create a serene, peaceful atmosphere.

+ +

Couples Experiences

+

Share the relaxation experience with our couples treatments. Perfect for romantic getaways or celebrating special moments together.

+ +

Whether you're seeking stress relief, muscle recovery, or simply a moment of tranquility, our spa and wellness center provides the perfect escape.

''', + 'featured_image': 'https://images.unsplash.com/photo-1544161515-4ab6ce6db874?w=1200&h=800&fit=crop', + 'author_id': author_id, + 'published_at': now - timedelta(days=15), + 'is_published': True, + 'tags': json.dumps(['spa', 'wellness', 'relaxation', 'self-care']), + 'meta_title': 'Wellness and Relaxation Guide | Spa & Wellness Center', + 'meta_description': 'Discover our world-class spa and wellness center. Learn about treatments, wellness programs, and how to achieve ultimate relaxation.', + 'meta_keywords': 'spa, wellness, relaxation, massage, hotel spa', + 'sections': None + }, + { + 'title': 'Sustainable Luxury: Our Commitment to Environmental Responsibility', + 'slug': 'sustainable-luxury-environmental-responsibility', + 'excerpt': 'Learn about our sustainability initiatives and how we balance luxury with environmental responsibility. Discover our green practices and commitment to the planet.', + 'content': '''

Luxury and sustainability are not mutually exclusive. At our hotel, we've proven that you can enjoy world-class amenities while protecting the environment for future generations.

+ +

Our Sustainability Mission

+

We're committed to reducing our environmental footprint through innovative practices, renewable energy, and responsible sourcing. Our goal is carbon neutrality while maintaining the highest standards of luxury.

+ +

Green Building Practices

+

Our facilities incorporate energy-efficient systems, water conservation measures, and sustainable materials. We continuously invest in technologies that reduce our environmental impact.

+ +

Local and Sustainable Sourcing

+

We prioritize local suppliers and sustainable ingredients in our restaurants. This not only reduces our carbon footprint but also supports local communities and ensures the freshest quality.

+ +

Waste Reduction

+

Through comprehensive recycling programs, composting, and waste reduction initiatives, we've significantly decreased our waste output. Single-use plastics have been eliminated throughout the property.

+ +

Guest Participation

+

We invite guests to join us in our sustainability efforts through optional programs like towel reuse, energy conservation, and supporting local conservation projects.

+ +

Together, we can enjoy luxury experiences while protecting our planet. Every small action contributes to a more sustainable future.

''', + 'featured_image': 'https://images.unsplash.com/photo-1470071459604-3b5ec3a7fe05?w=1200&h=800&fit=crop', + 'author_id': author_id, + 'published_at': now - timedelta(days=20), + 'is_published': True, + 'tags': json.dumps(['sustainability', 'environment', 'green hotel', 'eco-friendly']), + 'meta_title': 'Sustainable Luxury | Environmental Responsibility', + 'meta_description': 'Learn about our sustainability initiatives and how we balance luxury with environmental responsibility. Discover our green practices.', + 'meta_keywords': 'sustainable luxury, green hotel, environmental responsibility, eco-friendly', + 'sections': None + }, + { + 'title': 'Celebrating 30 Years of Excellence in Hospitality', + 'slug': 'celebrating-30-years-excellence-hospitality', + 'excerpt': 'Join us as we celebrate three decades of providing exceptional hospitality. Learn about our journey, milestones, and vision for the future.', + 'content': '''

This year marks a significant milestone - 30 years of excellence in hospitality. From our humble beginnings to becoming an internationally recognized destination, our journey has been remarkable.

+ +

Our Beginnings

+

Founded in 1993, we started with a simple vision: to create a sanctuary of luxury and sophistication. What began as a small boutique property has grown into a world-class destination.

+ +

Key Milestones

+

Over three decades, we've achieved numerous milestones - from our first five-star rating to receiving international awards. Each achievement represents our commitment to excellence.

+ +

Our Team

+

None of this would be possible without our dedicated team. Their passion, professionalism, and commitment to service excellence have been the foundation of our success.

+ +

Looking Forward

+

As we celebrate this milestone, we're also looking to the future. We continue to innovate, invest in our facilities, and enhance our services to exceed guest expectations.

+ +

Thank You

+

To all our guests, partners, and team members - thank you for being part of our journey. Here's to the next 30 years of creating unforgettable experiences.

+ +

Join us in celebrating this special anniversary with special packages and events throughout the year.

''', + 'featured_image': 'https://images.unsplash.com/photo-1520250497591-112f2f40a3f4?w=1200&h=800&fit=crop', + 'author_id': author_id, + 'published_at': now - timedelta(days=25), + 'is_published': True, + 'tags': json.dumps(['anniversary', 'hotel history', 'milestone', 'celebration']), + 'meta_title': 'Celebrating 30 Years of Excellence | Hotel Anniversary', + 'meta_description': 'Join us as we celebrate three decades of providing exceptional hospitality. Learn about our journey, milestones, and vision for the future.', + 'meta_keywords': 'hotel anniversary, 30 years, hospitality excellence, milestone', + 'sections': None + }, + { + 'title': 'The Ultimate Business Traveler\'s Guide to Our Hotel', + 'slug': 'ultimate-business-traveler-guide', + 'excerpt': 'Discover how our hotel caters to business travelers with state-of-the-art facilities, convenient services, and amenities designed for productivity and comfort.', + 'content': '''

Business travel doesn't have to mean sacrificing comfort or productivity. Our hotel is designed specifically to meet the needs of modern business travelers.

+ +

Business Facilities

+

Our fully equipped business center provides everything you need - from high-speed internet to meeting rooms with state-of-the-art AV equipment. Work seamlessly from anywhere in the hotel.

+ +

Convenient Services

+

Express check-in and checkout, 24/7 concierge service, and flexible meeting arrangements ensure your business needs are met efficiently. We understand that time is valuable.

+ +

Comfortable Accommodations

+

Our rooms feature dedicated workspaces, ergonomic furniture, and premium amenities. After a long day of meetings, relax in comfort and recharge for tomorrow.

+ +

Networking Opportunities

+

Our restaurants and lounges provide perfect settings for business networking. Whether hosting clients or connecting with colleagues, we provide the ideal atmosphere.

+ +

Wellness for Business Travelers

+

Maintain your wellness routine with our fitness center, spa services, and healthy dining options. We help you stay balanced even when traveling for business.

+ +

Experience business travel redefined - where productivity meets luxury, and comfort enhances performance.

''', + 'featured_image': 'https://images.unsplash.com/photo-1497366216548-37526070297c?w=1200&h=800&fit=crop', + 'author_id': author_id, + 'published_at': now - timedelta(days=30), + 'is_published': True, + 'tags': json.dumps(['business travel', 'corporate', 'productivity', 'meetings']), + 'meta_title': 'Business Traveler\'s Guide | Corporate Accommodation', + 'meta_description': 'Discover how our hotel caters to business travelers with state-of-the-art facilities, convenient services, and productivity-focused amenities.', + 'meta_keywords': 'business travel, corporate hotel, business facilities, meeting rooms', + 'sections': None + } + ] + + return posts + + +def seed_blog_posts(db: Session, clear_existing: bool = False): + """Seed blog posts into the database""" + try: + # Get admin user as author + admin_user = db.query(User).filter(User.email == 'admin@hotel.com').first() + if not admin_user: + logger.error('Admin user not found. Please run user seeder first.') + raise ValueError('Admin user not found. Please run user seeder first.') + + if clear_existing: + logger.info('Clearing existing blog posts...') + db.query(BlogPost).delete() + db.commit() + logger.info('Existing blog posts cleared.') + + posts_data = get_blog_posts_data(admin_user.id) + now = datetime.now(timezone.utc) + + created_count = 0 + updated_count = 0 + + for post_data in posts_data: + # Generate slug if not provided + if not post_data.get('slug'): + post_data['slug'] = slugify(post_data['title']) + + existing = db.query(BlogPost).filter(BlogPost.slug == post_data['slug']).first() + + if existing: + logger.debug(f"Blog post '{post_data['title']}' already exists. Updating...") + for key, value in post_data.items(): + setattr(existing, key, value) + existing.updated_at = now + updated_count += 1 + else: + logger.debug(f"Creating blog post: {post_data['title']}") + post = BlogPost(**post_data) + db.add(post) + created_count += 1 + + db.commit() + logger.info(f'Successfully seeded blog posts! Created: {created_count}, Updated: {updated_count}, Total: {len(posts_data)}') + except Exception as e: + db.rollback() + logger.error(f'Error seeding blog posts: {str(e)}', exc_info=True) + raise + + +def main(): + import argparse + + parser = argparse.ArgumentParser(description='Seed blog posts') + parser.add_argument( + '--clear', + action='store_true', + help='Clear existing blog posts before seeding' + ) + args = parser.parse_args() + + db = SessionLocal() + try: + seed_blog_posts(db, clear_existing=args.clear) + except Exception as e: + logger.error(f'Failed to seed blog posts: {str(e)}', exc_info=True) + sys.exit(1) + finally: + db.close() + + +if __name__ == '__main__': + main() + diff --git a/Backend/seeders/cancellation_seeder.py b/Backend/seeders/cancellation_seeder.py new file mode 100644 index 00000000..53fefb04 --- /dev/null +++ b/Backend/seeders/cancellation_seeder.py @@ -0,0 +1,221 @@ +""" +Cancellation Policy Page Seeder +Seeds the database with comprehensive cancellation policy content +""" +import json +import sys +from pathlib import Path +from datetime import datetime, timezone + +# Add parent directory to path to allow importing from src +sys.path.insert(0, str(Path(__file__).resolve().parents[1])) + +from sqlalchemy.orm import Session +from src.shared.config.database import SessionLocal +from src.shared.config.logging_config import get_logger +from src.content.models.page_content import PageContent, PageType + +# Import all models to ensure relationships are loaded +from src.models import * + +logger = get_logger(__name__) + + +def get_cancellation_page_data(): + """Generate comprehensive cancellation policy page data""" + + now = datetime.now(timezone.utc) + + return { + 'page_type': PageType.CANCELLATION, + 'title': 'Cancellation Policy', + 'subtitle': 'Reservation Cancellation Terms and Conditions', + 'description': 'Learn about our cancellation policy, including cancellation deadlines, fees, and procedures for different rate types.', + 'content': """ +

1. Overview

+

This Cancellation Policy outlines the terms and conditions for cancelling reservations at Luxury Hotel & Resort. Cancellation terms vary by rate type and are clearly stated at the time of booking. Please review this policy carefully before making a reservation.

+ +

2. Standard Cancellation Policy

+

2.1 Flexible Rate

+

For reservations made with our Flexible Rate:

+
    +
  • Free Cancellation: Cancellations made 24-48 hours before the scheduled check-in date and time are free of charge
  • +
  • Late Cancellation: Cancellations made less than 24 hours before check-in will incur a charge equal to one night's room rate plus taxes
  • +
  • No-Show: Failure to arrive on the scheduled check-in date will result in a charge for the entire reservation
  • +
+ +

2.2 Non-Refundable Rate

+

For reservations made with our Non-Refundable Rate:

+
    +
  • These rates offer the best value but are non-refundable
  • +
  • Cancellations or modifications are not permitted
  • +
  • In exceptional circumstances, we may offer a credit for future stays (subject to management approval)
  • +
  • No-shows will be charged the full reservation amount
  • +
+ +

2.3 Advance Purchase Rate

+

For Advance Purchase rates:

+
    +
  • Full payment is required at the time of booking
  • +
  • Cancellations made 7 days or more before check-in: Full refund minus a processing fee
  • +
  • Cancellations made less than 7 days before check-in: No refund
  • +
+ +

3. Special Packages and Promotions

+

Cancellation terms for special packages, promotions, and seasonal offers may differ from standard rates. Specific cancellation terms will be clearly stated at the time of booking and in your confirmation email.

+ +

4. Group Bookings

+

For group bookings (typically 10 or more rooms):

+
    +
  • Cancellation terms are specified in the group booking contract
  • +
  • Generally, cancellations must be made 30-60 days in advance to avoid penalties
  • +
  • Individual room cancellations within a group may be subject to different terms
  • +
  • Please refer to your group booking agreement for specific terms
  • +
+ +

5. Event and Meeting Bookings

+

Cancellation policies for event and meeting space bookings are detailed in your event contract. Generally:

+
    +
  • Cancellations made 30+ days in advance: Full refund or credit
  • +
  • Cancellations made 14-30 days in advance: 50% refund or credit
  • +
  • Cancellations made less than 14 days in advance: No refund
  • +
+ +

6. How to Cancel

+

6.1 Online Cancellation

+

You can cancel your reservation online through:

+
    +
  • Your booking confirmation email (click "Manage Reservation")
  • +
  • Our website's "Manage Booking" section
  • +
  • Your account dashboard (if you have an account)
  • +
+ +

6.2 Phone Cancellation

+

Call our reservations team:

+
    +
  • Phone: +1 (555) 123-4567
  • +
  • Hours: 24/7
  • +
  • Please have your confirmation number ready
  • +
+ +

6.3 Email Cancellation

+

Send an email to:

+
    +
  • Email: reservations@luxuryhotel.com
  • +
  • Include your confirmation number and guest name
  • +
  • Allow 24-48 hours for email processing
  • +
+ +

7. Cancellation Confirmation

+

Upon successful cancellation, you will receive a cancellation confirmation email. Please retain this confirmation for your records. If you do not receive a confirmation, please contact us to verify that your cancellation was processed.

+ +

8. Refunds

+

Refunds for eligible cancellations will be processed to the original payment method within 5-10 business days. The time it takes for the refund to appear in your account depends on your financial institution. For more information, please refer to our Refund Policy.

+ +

9. Modifications vs. Cancellations

+

9.1 Date Changes

+

Modifying your reservation dates may be treated as a cancellation and rebooking, subject to availability and current rates. Please contact us to discuss modification options.

+ +

9.2 Room Type Changes

+

Changes to room type are subject to availability and rate differences. Additional charges may apply if the new room type has a higher rate.

+ +

10. Force Majeure

+

In cases of force majeure events (natural disasters, pandemics, government restrictions, travel bans, etc.), we will work with you to provide flexible cancellation options, including:

+
    +
  • Full refunds
  • +
  • Rescheduling without penalty
  • +
  • Credit for future stays
  • +
+

Each situation is evaluated individually. Please contact us as soon as possible if you are affected by a force majeure event.

+ +

11. Third-Party Bookings

+

If you made your reservation through a third-party booking site (such as Expedia, Booking.com, etc.), you must cancel through that third party according to their cancellation policies. We cannot directly cancel third-party bookings.

+ +

12. No-Show Policy

+

If you do not arrive on your scheduled check-in date and have not cancelled your reservation:

+
    +
  • Your reservation will be considered a "no-show"
  • +
  • You will be charged according to your rate's cancellation policy
  • +
  • Remaining nights may be released for resale
  • +
  • No refunds are provided for no-show reservations
  • +
+ +

13. Early Departure

+

If you check out earlier than your scheduled departure date:

+
    +
  • You may be eligible for a partial refund for unused nights
  • +
  • Early departure refunds are not guaranteed and are evaluated on a case-by-case basis
  • +
  • Please notify the front desk at least 24 hours before your early departure
  • +
  • Refunds are subject to the terms of your original reservation
  • +
+ +

14. Special Circumstances

+

We understand that unexpected circumstances may arise. In cases of medical emergencies, family emergencies, or other extenuating circumstances, please contact us immediately. We will review your situation and may offer flexible cancellation options on a case-by-case basis.

+ +

15. Contact Information

+

For cancellation requests or questions about our cancellation policy, please contact us:

+
    +
  • Reservations Phone: +1 (555) 123-4567 (24/7)
  • +
  • Reservations Email: reservations@luxuryhotel.com
  • +
  • Address: 123 Luxury Avenue, Premium City, PC 12345, United States
  • +
+ +

16. Policy Updates

+

We reserve the right to update this Cancellation Policy at any time. Changes will be posted on this page with an updated "Last Updated" date. The cancellation terms that apply to your reservation are those in effect at the time you made your booking.

+ +

Last Updated: {}

+ """.format(now.strftime('%B %d, %Y')), + 'meta_title': 'Cancellation Policy | Luxury Hotel & Resort', + 'meta_description': 'Learn about our cancellation policy, including cancellation deadlines, fees, and procedures for different rate types.', + 'meta_keywords': 'cancellation policy, hotel cancellation, booking cancellation, cancel reservation, cancellation terms', + 'og_title': 'Cancellation Policy - Luxury Hotel & Resort', + 'og_description': 'Reservation cancellation terms and conditions. Learn how to cancel your booking and applicable fees.', + 'og_image': 'https://images.unsplash.com/photo-1556761175-5973dc0f32e7?w=1200&h=630&fit=crop', + 'canonical_url': 'https://luxuryhotel.com/cancellation', + 'is_active': True, + 'created_at': now, + 'updated_at': now + } + + +def seed_cancellation_page(db: Session): + """Seed cancellation policy page content into the database""" + try: + cancellation_data = get_cancellation_page_data() + + # Check if cancellation page content already exists + existing_content = db.query(PageContent).filter(PageContent.page_type == PageType.CANCELLATION).first() + + if existing_content: + logger.info('Updating existing cancellation policy page content...') + for key, value in cancellation_data.items(): + if key not in ['id', 'page_type', 'created_at']: + setattr(existing_content, key, value) + existing_content.updated_at = datetime.now(timezone.utc) + else: + logger.info('Creating new cancellation policy page content...') + cancellation_page = PageContent(**cancellation_data) + db.add(cancellation_page) + + db.commit() + logger.info('Cancellation policy page content seeded successfully!') + except Exception as e: + db.rollback() + logger.error(f'Error seeding cancellation policy page: {str(e)}', exc_info=True) + raise + + +def main(): + db = SessionLocal() + try: + seed_cancellation_page(db) + except Exception as e: + logger.error(f'Failed to seed cancellation policy page: {str(e)}', exc_info=True) + sys.exit(1) + finally: + db.close() + + +if __name__ == '__main__': + main() + diff --git a/Backend/seeders/contact_seeder.py b/Backend/seeders/contact_seeder.py new file mode 100644 index 00000000..15bb13bb --- /dev/null +++ b/Backend/seeders/contact_seeder.py @@ -0,0 +1,167 @@ +""" +Contact Page Seeder +Seeds the database with comprehensive contact page content +All images are from Unsplash (free stock photos) +""" +import json +import sys +from pathlib import Path +from datetime import datetime, timezone + +# Add parent directory to path to allow importing from src +sys.path.insert(0, str(Path(__file__).resolve().parents[1])) + +from sqlalchemy.orm import Session +from src.shared.config.database import SessionLocal +from src.shared.config.logging_config import get_logger +from src.content.models.page_content import PageContent, PageType + +# Import all models to ensure relationships are loaded +from src.models import * + +logger = get_logger(__name__) + + +def get_contact_page_data(): + """Generate comprehensive contact page data with Unsplash images""" + + now = datetime.now(timezone.utc) + + return { + 'page_type': PageType.CONTACT, + 'title': 'Contact Us', + 'subtitle': 'We\'re Here to Help - Get in Touch', + 'description': 'Have questions or need assistance? Our friendly team is available 24/7 to help with reservations, inquiries, and special requests. Reach out to us through any of the methods below.', + 'content': '

We value your feedback and are here to assist you with any questions or requests. Whether you\'re planning a stay, have a question about our services, or need assistance during your visit, our team is ready to help.

', + 'meta_title': 'Contact Us | Luxury Hotel & Resort - Get in Touch', + 'meta_description': 'Contact our luxury hotel for reservations, inquiries, or assistance. Our friendly team is available 24/7. Phone, email, and location information.', + 'meta_keywords': 'contact us, hotel contact, reservations, customer service, hotel phone number, hotel email', + 'og_title': 'Contact Us - Luxury Hotel & Resort', + 'og_description': 'Have questions or need assistance? Our friendly team is available 24/7 to help with reservations, inquiries, and special requests.', + 'og_image': 'https://images.unsplash.com/photo-1556761175-5973dc0f32e7?w=1200&h=630&fit=crop', + 'canonical_url': 'https://luxuryhotel.com/contact', + 'hero_title': 'Get in Touch', + 'hero_subtitle': 'We\'re Here to Help You', + 'hero_image': 'https://images.unsplash.com/photo-1556761175-5973dc0f32e7?w=1920&h=1080&fit=crop', + 'hero_video_url': None, + 'hero_video_poster': None, + 'contact_info': json.dumps({ + 'phone': '+1 (555) 123-4567', + 'toll_free': '+1 (800) 123-4567', + 'email': 'info@luxuryhotel.com', + 'reservations_email': 'reservations@luxuryhotel.com', + 'address': '123 Luxury Avenue, Premium City, PC 12345', + 'address_line2': 'United States', + 'business_hours': { + 'front_desk': '24/7', + 'concierge': '24/7', + 'reservations': 'Monday - Sunday: 8:00 AM - 10:00 PM', + 'restaurant': 'Breakfast: 7:00 AM - 11:00 AM, Lunch: 12:00 PM - 3:00 PM, Dinner: 6:00 PM - 11:00 PM', + 'spa': 'Monday - Sunday: 9:00 AM - 9:00 PM' + } + }), + 'map_url': 'https://www.google.com/maps/embed?pb=!1m18!1m12!1m3!1d3022.184132576!2d-73.98811768459418!3d40.75889597932681!2m3!1f0!2f0!3f0!3m2!1i1024!2i768!4f13.1!3m3!1m2!1s0x89c25855c6480299%3A0x55194ec5a1ae072e!2sTimes%20Square!5e0!3m2!1sen!2sus!4v1234567890123!5m2!1sen!2sus', + 'social_links': json.dumps({ + 'facebook': 'https://facebook.com/luxuryhotel', + 'twitter': 'https://twitter.com/luxuryhotel', + 'instagram': 'https://instagram.com/luxuryhotel', + 'linkedin': 'https://linkedin.com/company/luxuryhotel', + 'youtube': 'https://youtube.com/luxuryhotel', + 'pinterest': 'https://pinterest.com/luxuryhotel' + }), + 'testimonials': json.dumps([ + { + 'name': 'Sarah Johnson', + 'title': 'Guest', + 'quote': 'The customer service team was incredibly helpful and responsive. They answered all my questions and made my booking process seamless.', + 'rating': 5, + 'image': 'https://images.unsplash.com/photo-1494790108377-be9c29b29330?w=200&h=200&fit=crop&crop=face' + }, + { + 'name': 'Michael Chen', + 'title': 'Business Traveler', + 'quote': 'The concierge team went above and beyond to help with my business needs. Their attention to detail and professionalism is outstanding.', + 'rating': 5, + 'image': 'https://images.unsplash.com/photo-1507003211169-0a1dd7228f2d?w=200&h=200&fit=crop&crop=face' + } + ]), + 'testimonials_section_title': 'What Our Guests Say About Our Service', + 'testimonials_section_subtitle': 'Real feedback from our valued guests', + 'features': json.dumps([ + { + 'icon': 'phone', + 'title': '24/7 Support', + 'description': 'Our team is available around the clock to assist you with any questions or requests.' + }, + { + 'icon': 'clock', + 'title': 'Quick Response', + 'description': 'We respond to all inquiries within 24 hours, often much sooner.' + }, + { + 'icon': 'users', + 'title': 'Expert Team', + 'description': 'Our knowledgeable staff is trained to provide exceptional service and assistance.' + }, + { + 'icon': 'globe', + 'title': 'Multiple Languages', + 'description': 'We speak your language. Our team is fluent in multiple languages to serve international guests.' + } + ]), + 'features_section_title': 'Why Contact Us', + 'features_section_subtitle': 'We\'re committed to providing exceptional service', + 'gallery_images': json.dumps([ + 'https://images.unsplash.com/photo-1556761175-5973dc0f32e7?w=1200&h=800&fit=crop', + 'https://images.unsplash.com/photo-1566073771259-6a8506099945?w=1200&h=800&fit=crop', + 'https://images.unsplash.com/photo-1520250497591-112f2f40a3f4?w=1200&h=800&fit=crop' + ]), + 'gallery_section_title': 'Visit Our Hotel', + 'gallery_section_subtitle': 'Experience our luxury facilities', + 'is_active': True, + 'created_at': now, + 'updated_at': now + } + + +def seed_contact_page(db: Session): + """Seed contact page content into the database""" + try: + contact_data = get_contact_page_data() + + # Check if contact page content already exists + existing_content = db.query(PageContent).filter(PageContent.page_type == PageType.CONTACT).first() + + if existing_content: + logger.info('Updating existing contact page content...') + for key, value in contact_data.items(): + if key not in ['id', 'page_type', 'created_at']: # Don't update primary key or creation date + setattr(existing_content, key, value) + existing_content.updated_at = datetime.now(timezone.utc) + else: + logger.info('Creating new contact page content...') + contact_page = PageContent(**contact_data) + db.add(contact_page) + + db.commit() + logger.info('Contact page content seeded successfully!') + except Exception as e: + db.rollback() + logger.error(f'Error seeding contact page: {str(e)}', exc_info=True) + raise + + +def main(): + db = SessionLocal() + try: + seed_contact_page(db) + except Exception as e: + logger.error(f'Failed to seed contact page: {str(e)}', exc_info=True) + sys.exit(1) + finally: + db.close() + + +if __name__ == '__main__': + main() + diff --git a/Backend/seeders/faq_seeder.py b/Backend/seeders/faq_seeder.py new file mode 100644 index 00000000..83e0bdde --- /dev/null +++ b/Backend/seeders/faq_seeder.py @@ -0,0 +1,192 @@ +""" +FAQ Page Seeder +Seeds the database with comprehensive FAQ content +""" +import json +import sys +from pathlib import Path +from datetime import datetime, timezone + +# Add parent directory to path to allow importing from src +sys.path.insert(0, str(Path(__file__).resolve().parents[1])) + +from sqlalchemy.orm import Session +from src.shared.config.database import SessionLocal +from src.shared.config.logging_config import get_logger +from src.content.models.page_content import PageContent, PageType + +# Import all models to ensure relationships are loaded +from src.models import * + +logger = get_logger(__name__) + + +def get_faq_page_data(): + """Generate comprehensive FAQ page data""" + + now = datetime.now(timezone.utc) + + return { + 'page_type': PageType.FAQ, + 'title': 'Frequently Asked Questions', + 'subtitle': 'Find Answers to Common Questions', + 'description': 'Get answers to the most frequently asked questions about our hotel, reservations, services, and policies.', + 'content': """ +

General Questions

+ +

What are your check-in and check-out times?

+

Check-in time is 3:00 PM, and check-out time is 11:00 AM. Early check-in and late check-out may be available upon request, subject to availability and additional charges.

+ +

Do you offer airport transportation?

+

Yes, we offer airport transfer services. Please contact our concierge team at least 24 hours in advance to arrange transportation. Additional charges may apply.

+ +

Is parking available?

+

Yes, we offer complimentary valet parking for all hotel guests. Self-parking is also available at an additional charge.

+ +

Do you have a fitness center?

+

Yes, our state-of-the-art fitness center is open 24/7 and is complimentary for all hotel guests. We also offer personal training sessions upon request.

+ +

Is Wi-Fi available?

+

Yes, complimentary high-speed Wi-Fi is available throughout the hotel, including all guest rooms and public areas.

+ +

Reservations & Booking

+ +

How do I make a reservation?

+

You can make a reservation through our website, by calling our reservations team at +1 (555) 123-4567, or by emailing reservations@luxuryhotel.com.

+ +

Can I modify or cancel my reservation?

+

Yes, you can modify or cancel your reservation through our website or by contacting our reservations team. Please refer to our cancellation policy for details on refunds and fees.

+ +

What payment methods do you accept?

+

We accept all major credit cards (Visa, MasterCard, American Express, Discover), debit cards, and bank transfers. Cash payments are also accepted at check-in.

+ +

Do you require a deposit?

+

A credit card is required to guarantee your reservation. A deposit may be required for certain room types or during peak seasons. Details will be provided at the time of booking.

+ +

Can I book for someone else?

+

Yes, you can make a reservation for another guest. Please provide the guest's name and contact information at the time of booking, and ensure they have a valid ID for check-in.

+ +

Rooms & Accommodations

+ +

What amenities are included in the rooms?

+

All rooms include complimentary Wi-Fi, flat-screen TV, minibar, coffee maker, in-room safe, air conditioning, and luxury toiletries. Suites include additional amenities such as separate living areas and premium services.

+ +

Do you have connecting rooms?

+

Yes, we have connecting rooms available. Please request connecting rooms at the time of booking, and we will do our best to accommodate your request based on availability.

+ +

Are rooms accessible for guests with disabilities?

+

Yes, we have accessible rooms designed to meet ADA requirements. Please inform us of any specific accessibility needs when making your reservation.

+ +

Can I request a specific room or floor?

+

Yes, you can request a specific room or floor preference. While we cannot guarantee specific rooms, we will do our best to honor your request based on availability.

+ +

Do you allow pets?

+

We welcome service animals. For pets, please contact us in advance as pet-friendly rooms are limited and additional charges may apply.

+ +

Services & Amenities

+ +

Do you have a spa?

+

Yes, we have a world-class spa offering a variety of treatments. Advance reservations are recommended. Please contact our spa directly to book treatments.

+ +

Are there restaurants on-site?

+

Yes, we have multiple dining options including fine dining, casual restaurants, and room service available 24/7. Our restaurants feature award-winning cuisine and extensive wine selections.

+ +

Do you offer room service?

+

Yes, room service is available 24 hours a day. Our extensive menu includes breakfast, lunch, dinner, and late-night options.

+ +

Is there a business center?

+

Yes, our business center is equipped with computers, printers, and meeting facilities. It is available 24/7 for all guests.

+ +

Do you have meeting and event facilities?

+

Yes, we have versatile meeting and event spaces suitable for conferences, weddings, and other special occasions. Please contact our events team for more information.

+ +

Policies & Procedures

+ +

What is your cancellation policy?

+

Cancellation policies vary by rate type and booking. Generally, cancellations made 24-48 hours before check-in are free. Please refer to your booking confirmation for specific cancellation terms.

+ +

What is your smoking policy?

+

Our hotel is 100% non-smoking. Smoking is not permitted in any guest rooms or indoor public areas. Designated outdoor smoking areas are available.

+ +

What is the minimum age to check in?

+

Guests must be at least 18 years old to check in. Guests under 18 must be accompanied by an adult.

+ +

Do you have a lost and found?

+

Yes, we maintain a lost and found department. If you have lost an item, please contact our front desk immediately. We will make every effort to locate and return your belongings.

+ +

Special Requests

+ +

Can I request early check-in or late check-out?

+

Early check-in and late check-out are subject to availability. Please contact us in advance, and we will do our best to accommodate your request. Additional charges may apply.

+ +

Do you accommodate special dietary requirements?

+

Yes, we can accommodate various dietary requirements including vegetarian, vegan, gluten-free, and allergies. Please inform us of any dietary restrictions when making your reservation or dining reservation.

+ +

Can you help arrange special occasions?

+

Absolutely! Our concierge team can help arrange special occasions such as anniversaries, birthdays, or proposals. Please contact us in advance to discuss your needs.

+ +

Contact & Support

+ +

How can I contact the hotel?

+

You can reach us by phone at +1 (555) 123-4567, email at info@luxuryhotel.com, or through our website's contact form. Our front desk is available 24/7.

+ +

Do you have a loyalty program?

+

Yes, we offer a loyalty program with exclusive benefits including room upgrades, late check-out, and special rates. Membership is free. Please visit our website or contact us for more information.

+ +

Can I leave feedback about my stay?

+

We value your feedback! You can leave a review on our website, through our post-stay survey, or by contacting our guest relations team directly.

+ """, + 'meta_title': 'FAQ | Frequently Asked Questions - Luxury Hotel & Resort', + 'meta_description': 'Find answers to frequently asked questions about reservations, rooms, services, and policies at Luxury Hotel & Resort.', + 'meta_keywords': 'FAQ, frequently asked questions, hotel questions, booking questions, hotel policies, hotel information', + 'og_title': 'FAQ - Luxury Hotel & Resort', + 'og_description': 'Find answers to common questions about our hotel, reservations, and services.', + 'og_image': 'https://images.unsplash.com/photo-1556761175-5973dc0f32e7?w=1200&h=630&fit=crop', + 'canonical_url': 'https://luxuryhotel.com/faq', + 'is_active': True, + 'created_at': now, + 'updated_at': now + } + + +def seed_faq_page(db: Session): + """Seed FAQ page content into the database""" + try: + faq_data = get_faq_page_data() + + # Check if FAQ page content already exists + existing_content = db.query(PageContent).filter(PageContent.page_type == PageType.FAQ).first() + + if existing_content: + logger.info('Updating existing FAQ page content...') + for key, value in faq_data.items(): + if key not in ['id', 'page_type', 'created_at']: + setattr(existing_content, key, value) + existing_content.updated_at = datetime.now(timezone.utc) + else: + logger.info('Creating new FAQ page content...') + faq_page = PageContent(**faq_data) + db.add(faq_page) + + db.commit() + logger.info('FAQ page content seeded successfully!') + except Exception as e: + db.rollback() + logger.error(f'Error seeding FAQ page: {str(e)}', exc_info=True) + raise + + +def main(): + db = SessionLocal() + try: + seed_faq_page(db) + except Exception as e: + logger.error(f'Failed to seed FAQ page: {str(e)}', exc_info=True) + sys.exit(1) + finally: + db.close() + + +if __name__ == '__main__': + main() + diff --git a/Backend/seeders/footer_seeder.py b/Backend/seeders/footer_seeder.py new file mode 100644 index 00000000..2cf6a059 --- /dev/null +++ b/Backend/seeders/footer_seeder.py @@ -0,0 +1,173 @@ +""" +Footer Page Seeder +Seeds the database with comprehensive footer content +""" +import json +import sys +from pathlib import Path +from datetime import datetime, timezone + +# Add parent directory to path to allow importing from src +sys.path.insert(0, str(Path(__file__).resolve().parents[1])) + +from sqlalchemy.orm import Session +from src.shared.config.database import SessionLocal +from src.shared.config.logging_config import get_logger +from src.content.models.page_content import PageContent, PageType + +# Import all models to ensure relationships are loaded +from src.models import * + +logger = get_logger(__name__) + + +def get_footer_page_data(): + """Generate comprehensive footer page data""" + + now = datetime.now(timezone.utc) + + return { + 'page_type': PageType.FOOTER, + 'title': 'Luxury Hotel & Resort', + 'subtitle': 'Experience Unparalleled Elegance and Comfort', + 'description': 'Your premier destination for luxury hospitality. Experience world-class service, exquisite accommodations, and unforgettable moments.', + 'content': '

For over three decades, we have been crafting exceptional experiences for discerning travelers worldwide. Our commitment to excellence and attention to detail sets us apart.

', + 'social_links': json.dumps({ + 'facebook': 'https://facebook.com/luxuryhotel', + 'twitter': 'https://twitter.com/luxuryhotel', + 'instagram': 'https://instagram.com/luxuryhotel', + 'linkedin': 'https://linkedin.com/company/luxuryhotel', + 'youtube': 'https://youtube.com/luxuryhotel', + 'pinterest': 'https://pinterest.com/luxuryhotel' + }), + 'footer_links': json.dumps({ + 'quick_links': [ + {'label': 'Home', 'url': '/'}, + {'label': 'About Us', 'url': '/about'}, + {'label': 'Rooms & Suites', 'url': '/rooms'}, + {'label': 'Services', 'url': '/services'}, + {'label': 'Contact', 'url': '/contact'}, + {'label': 'Blog', 'url': '/blog'} + ], + 'accommodations': [ + {'label': 'Standard Rooms', 'url': '/rooms?type=standard'}, + {'label': 'Deluxe Rooms', 'url': '/rooms?type=deluxe'}, + {'label': 'Executive Suites', 'url': '/rooms?type=executive'}, + {'label': 'Presidential Suites', 'url': '/rooms?type=presidential'}, + {'label': 'Ocean View Rooms', 'url': '/rooms?type=ocean-view'}, + {'label': 'Family Rooms', 'url': '/rooms?type=family'} + ], + 'services': [ + {'label': 'Spa & Wellness', 'url': '/services?category=spa'}, + {'label': 'Fine Dining', 'url': '/services?category=dining'}, + {'label': 'Concierge', 'url': '/services?category=concierge'}, + {'label': 'Business Center', 'url': '/services?category=business'}, + {'label': 'Event Planning', 'url': '/services?category=events'}, + {'label': 'Transportation', 'url': '/services?category=transportation'} + ], + 'information': [ + {'label': 'About Us', 'url': '/about'}, + {'label': 'Our Story', 'url': '/about#story'}, + {'label': 'Awards & Recognition', 'url': '/about#awards'}, + {'label': 'Careers', 'url': '/careers'}, + {'label': 'Press & Media', 'url': '/press'}, + {'label': 'Blog', 'url': '/blog'} + ], + 'support_links': [ + {'label': 'Contact Us', 'url': '/contact'}, + {'label': 'FAQ', 'url': '/faq'}, + {'label': 'Booking Help', 'url': '/help'}, + {'label': 'Cancellation Policy', 'url': '/cancellation'}, + {'label': 'Privacy Policy', 'url': '/privacy'}, + {'label': 'Terms & Conditions', 'url': '/terms'}, + {'label': 'Refund Policy', 'url': '/refunds'}, + {'label': 'Accessibility', 'url': '/accessibility'} + ] + }), + 'badges': json.dumps([ + { + 'icon': 'award', + 'text': '5-Star Rated', + 'description': 'Consistently rated five-star by global travel guides' + }, + { + 'icon': 'trophy', + 'text': 'Award Winning', + 'description': 'Best Luxury Hotel 2023' + }, + { + 'icon': 'shield', + 'text': 'Secure Booking', + 'description': 'Your data and payments are protected' + }, + { + 'icon': 'star', + 'text': '98% Satisfaction', + 'description': 'Guest satisfaction rating' + }, + { + 'icon': 'leaf', + 'text': 'Eco-Friendly', + 'description': 'Certified green hotel' + }, + { + 'icon': 'check-circle', + 'text': 'Best Price Guarantee', + 'description': 'We guarantee the best rates' + } + ]), + 'copyright_text': f'© {datetime.now(timezone.utc).year} Luxury Hotel & Resort. All rights reserved.', + 'contact_info': json.dumps({ + 'phone': '+1 (555) 123-4567', + 'toll_free': '+1 (800) 123-4567', + 'email': 'info@luxuryhotel.com', + 'reservations_email': 'reservations@luxuryhotel.com', + 'address': '123 Luxury Avenue, Premium City, PC 12345, United States' + }), + 'is_active': True, + 'created_at': now, + 'updated_at': now + } + + +def seed_footer_page(db: Session): + """Seed footer page content into the database""" + try: + footer_data = get_footer_page_data() + + # Check if footer page content already exists + existing_content = db.query(PageContent).filter(PageContent.page_type == PageType.FOOTER).first() + + if existing_content: + logger.info('Updating existing footer page content...') + for key, value in footer_data.items(): + if key not in ['id', 'page_type', 'created_at']: # Don't update primary key or creation date + setattr(existing_content, key, value) + existing_content.updated_at = datetime.now(timezone.utc) + else: + logger.info('Creating new footer page content...') + footer_page = PageContent(**footer_data) + db.add(footer_page) + + db.commit() + logger.info('Footer page content seeded successfully!') + except Exception as e: + db.rollback() + logger.error(f'Error seeding footer page: {str(e)}', exc_info=True) + raise + + +def main(): + db = SessionLocal() + try: + seed_footer_page(db) + except Exception as e: + logger.error(f'Failed to seed footer page: {str(e)}', exc_info=True) + sys.exit(1) + finally: + db.close() + + +if __name__ == '__main__': + main() + diff --git a/Backend/seeders/homepage_seeder.py b/Backend/seeders/homepage_seeder.py new file mode 100644 index 00000000..97f7e4ac --- /dev/null +++ b/Backend/seeders/homepage_seeder.py @@ -0,0 +1,596 @@ +""" +Homepage Seeder +Seeds the homepage with comprehensive content including images from Unsplash +""" +import json +import sys +from pathlib import Path +from datetime import datetime, timezone + +# Add parent directory to path to import modules +sys.path.insert(0, str(Path(__file__).resolve().parents[1])) + +from sqlalchemy.orm import Session +from src.shared.config.database import SessionLocal, engine +from src.content.models.page_content import PageContent, PageType +from src.shared.config.logging_config import get_logger + +logger = get_logger(__name__) + + +def get_homepage_data(): + """Generate comprehensive homepage data with Unsplash images""" + + # Using Unsplash Source API for images (free, no API key needed) + # Format: https://source.unsplash.com/{width}x{height}/?{keywords} + + return { + 'page_type': PageType.HOME, + 'title': 'Luxury Hotel & Resort', + 'subtitle': 'Experience Unparalleled Elegance and Comfort', + 'description': 'Welcome to our world-class luxury hotel where exceptional service meets breathtaking elegance. Discover a sanctuary of sophistication and comfort.', + 'content': '

Experience the pinnacle of luxury hospitality at our award-winning hotel. Nestled in a prime location, we offer world-class amenities, exquisite dining, and unparalleled service that creates unforgettable memories.

', + + # SEO Meta Tags + 'meta_title': 'Luxury Hotel & Resort | Premium Accommodation & World-Class Service', + 'meta_description': 'Discover luxury accommodation with world-class amenities, fine dining, and exceptional service. Book your stay at our award-winning hotel today.', + 'meta_keywords': 'luxury hotel, resort, premium accommodation, fine dining, spa, business hotel, vacation, travel', + 'og_title': 'Luxury Hotel & Resort - Experience Unparalleled Elegance', + 'og_description': 'Welcome to our world-class luxury hotel where exceptional service meets breathtaking elegance.', + 'og_image': 'https://images.unsplash.com/photo-1566073771259-6a8506099945?w=1200&h=630&fit=crop', + 'canonical_url': 'https://luxuryhotel.com', + + # Hero Section + 'hero_title': 'Welcome to Luxury Redefined', + 'hero_subtitle': 'Where Every Moment Becomes a Memory', + 'hero_image': 'https://images.unsplash.com/photo-1566073771259-6a8506099945?w=1920&h=1080&fit=crop', + 'hero_video_url': None, + 'hero_video_poster': None, + + # Story Content + 'story_content': '

For over three decades, we have been crafting exceptional experiences for our guests. Our commitment to excellence, attention to detail, and passion for hospitality has made us a destination of choice for discerning travelers worldwide.

', + + # Values Section + 'values': json.dumps([ + { + 'icon': 'heart', + 'title': 'Excellence', + 'description': 'We strive for perfection in every detail, ensuring your experience exceeds expectations.' + }, + { + 'icon': 'shield', + 'title': 'Trust', + 'description': 'Your comfort and security are our top priorities, backed by years of trusted service.' + }, + { + 'icon': 'users', + 'title': 'Hospitality', + 'description': 'Our dedicated team is committed to making your stay memorable and delightful.' + }, + { + 'icon': 'award', + 'title': 'Quality', + 'description': 'We maintain the highest standards in service, amenities, and guest satisfaction.' + } + ]), + + # Features Section + 'features_section_title': 'Why Choose Us', + 'features_section_subtitle': 'Discover what makes us the perfect choice for your stay', + 'features': json.dumps([ + { + 'icon': 'wifi', + 'title': 'Free High-Speed WiFi', + 'description': 'Stay connected with complimentary high-speed internet throughout the property.', + 'image': 'https://images.unsplash.com/photo-1558618666-fcd25c85cd64?w=800&h=600&fit=crop' + }, + { + 'icon': 'utensils', + 'title': 'Fine Dining', + 'description': 'Savor exquisite cuisine at our award-winning restaurants and bars.', + 'image': 'https://images.unsplash.com/photo-1414235077428-338989a2e8c0?w=800&h=600&fit=crop' + }, + { + 'icon': 'spa', + 'title': 'Luxury Spa', + 'description': 'Rejuvenate your mind and body at our world-class spa and wellness center.', + 'image': 'https://images.unsplash.com/photo-1544161515-4ab6ce6db874?w=800&h=600&fit=crop' + }, + { + 'icon': 'dumbbell', + 'title': 'Fitness Center', + 'description': 'Maintain your workout routine in our state-of-the-art fitness facility.', + 'image': 'https://images.unsplash.com/photo-1534438327276-14e5300c3a48?w=800&h=600&fit=crop' + }, + { + 'icon': 'swimming-pool', + 'title': 'Swimming Pool', + 'description': 'Relax and unwind in our stunning outdoor and indoor pools.', + 'image': 'https://images.unsplash.com/photo-1571896349842-33c89424de2d?w=800&h=600&fit=crop' + }, + { + 'icon': 'car', + 'title': 'Valet Parking', + 'description': 'Complimentary valet parking service for all our guests.', + 'image': 'https://images.unsplash.com/photo-1502877338535-766e1452684a?w=800&h=600&fit=crop' + } + ]), + + # About Preview Section + 'about_preview_title': 'Our Story', + 'about_preview_subtitle': 'A Legacy of Excellence', + 'about_preview_content': '

Since our founding, we have been dedicated to providing exceptional hospitality experiences. Our commitment to excellence, combined with our passion for service, has established us as a leader in the luxury hospitality industry.

', + 'about_preview_image': 'https://images.unsplash.com/photo-1520250497591-112f2f40a3f4?w=1200&h=800&fit=crop', + + # Stats Section + 'stats_section_title': 'Our Achievements', + 'stats_section_subtitle': 'Numbers that speak for themselves', + 'stats': json.dumps([ + { + 'number': '50000+', + 'label': 'Happy Guests', + 'icon': 'users' + }, + { + 'number': '30+', + 'label': 'Years of Excellence', + 'icon': 'calendar' + }, + { + 'number': '150+', + 'label': 'Awards Won', + 'icon': 'award' + }, + { + 'number': '98%', + 'label': 'Guest Satisfaction', + 'icon': 'star' + } + ]), + + # Rooms Section + 'rooms_section_title': 'Luxurious Accommodations', + 'rooms_section_subtitle': 'Elegant rooms and suites designed for your comfort', + 'rooms_section_button_text': 'View All Rooms', + 'rooms_section_button_link': '/rooms', + 'rooms_section_enabled': True, + + # Luxury Services Section + 'luxury_services_section_title': 'Premium Services', + 'luxury_services_section_subtitle': 'Indulge in our exclusive offerings', + 'services_section_button_text': 'Explore Services', + 'services_section_button_link': '/services', + 'services_section_limit': 6, + 'luxury_services': json.dumps([ + { + 'icon': 'concierge', + 'title': '24/7 Concierge', + 'description': 'Our dedicated concierge team is available around the clock to assist with any request.', + 'image': 'https://images.unsplash.com/photo-1556761175-5973dc0f32e7?w=600&h=400&fit=crop' + }, + { + 'icon': 'plane', + 'title': 'Airport Transfer', + 'description': 'Complimentary airport transfer service for a seamless arrival experience.', + 'image': 'https://images.unsplash.com/photo-1449824913935-59a10b8d2000?w=600&h=400&fit=crop' + }, + { + 'icon': 'briefcase', + 'title': 'Business Center', + 'description': 'Fully equipped business center with meeting rooms and conference facilities.', + 'image': 'https://images.unsplash.com/photo-1497366216548-37526070297c?w=600&h=400&fit=crop' + }, + { + 'icon': 'wine', + 'title': 'Wine Cellar', + 'description': 'Explore our extensive collection of fine wines from around the world.', + 'image': 'https://images.unsplash.com/photo-1510812431401-41d2bd2722f3?w=600&h=400&fit=crop' + }, + { + 'icon': 'music', + 'title': 'Live Entertainment', + 'description': 'Enjoy live music and entertainment in our elegant lounge areas.', + 'image': 'https://images.unsplash.com/photo-1493225457124-a3eb161ffa5f?w=600&h=400&fit=crop' + }, + { + 'icon': 'gift', + 'title': 'Gift Shop', + 'description': 'Browse our curated selection of luxury gifts and souvenirs.', + 'image': 'https://images.unsplash.com/photo-1441986300917-64674bd600d8?w=600&h=400&fit=crop' + } + ]), + + # Luxury Experiences Section + 'luxury_experiences_section_title': 'Unique Experiences', + 'luxury_experiences_section_subtitle': 'Create unforgettable memories with our curated experiences', + 'luxury_experiences': json.dumps([ + { + 'icon': 'sunset', + 'title': 'Sunset Rooftop Dining', + 'description': 'Dine under the stars with panoramic city views and gourmet cuisine.', + 'image': 'https://images.unsplash.com/photo-1517248135467-4c7edcad34c4?w=800&h=600&fit=crop' + }, + { + 'icon': 'compass', + 'title': 'City Tours', + 'description': 'Explore the city with our guided tours showcasing local culture and landmarks.', + 'image': 'https://images.unsplash.com/photo-1488646953014-85cb44e25828?w=800&h=600&fit=crop' + }, + { + 'icon': 'camera', + 'title': 'Photography Sessions', + 'description': 'Capture your special moments with our professional photography services.', + 'image': 'https://images.unsplash.com/photo-1516035069371-29a1b244cc32?w=800&h=600&fit=crop' + } + ]), + + # Amenities Section + 'amenities_section_title': 'World-Class Amenities', + 'amenities_section_subtitle': 'Everything you need for a perfect stay', + 'amenities': json.dumps([ + { + 'icon': 'wifi', + 'title': 'Free WiFi', + 'description': 'High-speed internet access throughout the property' + }, + { + 'icon': 'tv', + 'title': 'Smart TV', + 'description': 'Streaming services and premium channels in every room' + }, + { + 'icon': 'coffee', + 'title': 'Coffee Maker', + 'description': 'Premium coffee and tea making facilities' + }, + { + 'icon': 'snowflake', + 'title': 'Climate Control', + 'description': 'Individual temperature control in all rooms' + }, + { + 'icon': 'lock', + 'title': 'Safe', + 'description': 'In-room safe for your valuables' + }, + { + 'icon': 'shirt', + 'title': 'Laundry Service', + 'description': 'Professional laundry and dry cleaning services' + } + ]), + + # Testimonials Section + 'testimonials_section_title': 'What Our Guests Say', + 'testimonials_section_subtitle': 'Real experiences from real guests', + 'testimonials': json.dumps([ + { + 'name': 'Sarah Johnson', + 'title': 'Business Traveler', + 'quote': 'The service was exceptional and the rooms were immaculate. This hotel exceeded all my expectations.', + 'rating': 5, + 'image': 'https://images.unsplash.com/photo-1494790108377-be9c29b29330?w=200&h=200&fit=crop&crop=face' + }, + { + 'name': 'Michael Chen', + 'title': 'Honeymooner', + 'quote': 'Our honeymoon was made perfect by the attentive staff and beautiful accommodations. Truly unforgettable!', + 'rating': 5, + 'image': 'https://images.unsplash.com/photo-1507003211169-0a1dd7228f2d?w=200&h=200&fit=crop&crop=face' + }, + { + 'name': 'Emily Rodriguez', + 'title': 'Family Vacation', + 'quote': 'Perfect for families! The kids loved the pool and the staff was so accommodating. We will definitely return.', + 'rating': 5, + 'image': 'https://images.unsplash.com/photo-1438761681033-6461ffad8d80?w=200&h=200&fit=crop&crop=face' + }, + { + 'name': 'David Thompson', + 'title': 'Luxury Traveler', + 'quote': 'The attention to detail and level of service is unmatched. This is what luxury hospitality should be.', + 'rating': 5, + 'image': 'https://images.unsplash.com/photo-1500648767791-00dcc994a43e?w=200&h=200&fit=crop&crop=face' + } + ]), + + # Gallery Section + 'gallery_section_title': 'Photo Gallery', + 'gallery_section_subtitle': 'A glimpse into our world of luxury', + 'gallery_images': json.dumps([ + 'https://images.unsplash.com/photo-1566073771259-6a8506099945?w=1200&h=800&fit=crop', + 'https://images.unsplash.com/photo-1520250497591-112f2f40a3f4?w=1200&h=800&fit=crop', + 'https://images.unsplash.com/photo-1571896349842-33c89424de2d?w=1200&h=800&fit=crop', + 'https://images.unsplash.com/photo-1542314831-068cd1dbfeeb?w=1200&h=800&fit=crop', + 'https://images.unsplash.com/photo-1564501049412-61c2a3083791?w=1200&h=800&fit=crop', + 'https://images.unsplash.com/photo-1590490360182-c33d57733427?w=1200&h=800&fit=crop', + 'https://images.unsplash.com/photo-1611892440504-42a792e24d32?w=1200&h=800&fit=crop', + 'https://images.unsplash.com/photo-1578683010236-d716f9a3f461?w=1200&h=800&fit=crop' + ]), + + # Luxury Section + 'luxury_section_title': 'Luxury Redefined', + 'luxury_section_subtitle': 'Experience the epitome of elegance and sophistication', + 'luxury_section_image': 'https://images.unsplash.com/photo-1618773928121-c32242e63f39?w=1400&h=900&fit=crop', + 'luxury_features': json.dumps([ + { + 'icon': 'crown', + 'title': 'Royal Treatment', + 'description': 'Experience service fit for royalty with our personalized attention to every detail.' + }, + { + 'icon': 'gem', + 'title': 'Premium Quality', + 'description': 'Only the finest materials and furnishings grace our elegant spaces.' + }, + { + 'icon': 'sparkles', + 'title': 'Exclusive Access', + 'description': 'Enjoy exclusive access to private lounges and premium facilities.' + } + ]), + + # Luxury Gallery Section + 'luxury_gallery_section_title': 'Luxury Gallery', + 'luxury_gallery_section_subtitle': 'Discover our world of refined elegance', + 'luxury_gallery': json.dumps([ + 'https://images.unsplash.com/photo-1618773928121-c32242e63f39?w=1200&h=800&fit=crop', + 'https://images.unsplash.com/photo-1596394516093-501ba68a0ba6?w=1200&h=800&fit=crop', + 'https://images.unsplash.com/photo-1631049307264-da0ec9d70304?w=1200&h=800&fit=crop', + 'https://images.unsplash.com/photo-1590490360182-c33d57733427?w=1200&h=800&fit=crop' + ]), + + # Luxury Testimonials Section + 'luxury_testimonials_section_title': 'Guest Experiences', + 'luxury_testimonials_section_subtitle': 'Stories from our valued guests', + 'luxury_testimonials': json.dumps([ + { + 'name': 'James Wilson', + 'title': 'VIP Guest', + 'quote': 'The level of luxury and attention to detail is simply extraordinary. This is hospitality at its finest.', + 'image': 'https://images.unsplash.com/photo-1472099645785-5658abf4ff4e?w=200&h=200&fit=crop&crop=face' + }, + { + 'name': 'Maria Garcia', + 'title': 'Celebrity Guest', + 'quote': 'Privacy, elegance, and impeccable service. This hotel understands true luxury.', + 'image': 'https://images.unsplash.com/photo-1534528741775-53994a69daeb?w=200&h=200&fit=crop&crop=face' + } + ]), + + # Awards Section + 'awards_section_title': 'Awards & Recognition', + 'awards_section_subtitle': 'Recognized for excellence in hospitality', + 'awards': json.dumps([ + { + 'icon': 'trophy', + 'title': 'Best Luxury Hotel 2023', + 'description': 'Awarded by International Hospitality Association', + 'year': '2023', + 'image': 'https://images.unsplash.com/photo-1606761568499-6d2451b23c66?w=400&h=400&fit=crop' + }, + { + 'icon': 'star', + 'title': '5-Star Rating', + 'description': 'Consistently rated 5 stars by leading travel organizations', + 'year': '2023', + 'image': 'https://images.unsplash.com/photo-1519389950473-47ba0277781c?w=400&h=400&fit=crop' + }, + { + 'icon': 'award', + 'title': 'Excellence in Service', + 'description': 'Recognized for outstanding customer service and guest satisfaction', + 'year': '2022', + 'image': 'https://images.unsplash.com/photo-1579621970563-ebec7560ff3e?w=400&h=400&fit=crop' + } + ]), + + # Partners Section + 'partners_section_title': 'Our Partners', + 'partners_section_subtitle': 'Trusted by leading brands and organizations', + 'partners': json.dumps([ + { + 'name': 'Travel Partner', + 'logo': 'https://images.unsplash.com/photo-1566073771259-6a8506099945?w=200&h=100&fit=crop', + 'url': '#' + }, + { + 'name': 'Luxury Brand', + 'logo': 'https://images.unsplash.com/photo-1520250497591-112f2f40a3f4?w=200&h=100&fit=crop', + 'url': '#' + }, + { + 'name': 'Hospitality Group', + 'logo': 'https://images.unsplash.com/photo-1571896349842-33c89424de2d?w=200&h=100&fit=crop', + 'url': '#' + } + ]), + + # CTA Section + 'cta_title': 'Ready to Experience Luxury?', + 'cta_subtitle': 'Book your stay today and discover why we are the preferred choice for discerning travelers', + 'cta_button_text': 'Book Now', + 'cta_button_link': '/book', + 'cta_image': 'https://images.unsplash.com/photo-1564501049412-61c2a3083791?w=1400&h=700&fit=crop', + + # Newsletter Section + 'newsletter_section_title': 'Stay Connected', + 'newsletter_section_subtitle': 'Subscribe to our newsletter for exclusive offers and updates', + 'newsletter_placeholder': 'Enter your email address', + 'newsletter_button_text': 'Subscribe', + 'newsletter_enabled': True, + + # Trust Badges Section + 'trust_badges_section_title': 'Why Trust Us', + 'trust_badges_section_subtitle': 'Your peace of mind is our priority', + 'trust_badges_enabled': True, + 'trust_badges': json.dumps([ + { + 'icon': 'shield-check', + 'title': 'Secure Booking', + 'description': 'Your data and payments are protected with industry-leading security' + }, + { + 'icon': 'clock', + 'title': '24/7 Support', + 'description': 'Round-the-clock customer support for all your needs' + }, + { + 'icon': 'undo', + 'title': 'Flexible Cancellation', + 'description': 'Free cancellation up to 24 hours before check-in' + }, + { + 'icon': 'check-circle', + 'title': 'Best Price Guarantee', + 'description': 'We guarantee the best rates for your stay' + } + ]), + + # Promotions Section + 'promotions_section_title': 'Special Offers', + 'promotions_section_subtitle': 'Exclusive deals and packages for our guests', + 'promotions_enabled': True, + 'promotions': json.dumps([ + { + 'title': 'Early Bird Special', + 'description': 'Book 30 days in advance and save 20%', + 'discount': '20% OFF', + 'image': 'https://images.unsplash.com/photo-1566073771259-6a8506099945?w=800&h=600&fit=crop', + 'link': '/promotions/early-bird' + }, + { + 'title': 'Weekend Getaway', + 'description': 'Perfect weekend escape with complimentary breakfast', + 'discount': '15% OFF', + 'image': 'https://images.unsplash.com/photo-1520250497591-112f2f40a3f4?w=800&h=600&fit=crop', + 'link': '/promotions/weekend' + }, + { + 'title': 'Honeymoon Package', + 'description': 'Romantic getaway with special amenities and services', + 'discount': '25% OFF', + 'image': 'https://images.unsplash.com/photo-1571896349842-33c89424de2d?w=800&h=600&fit=crop', + 'link': '/promotions/honeymoon' + } + ]), + + # Blog Section + 'blog_section_title': 'Latest News & Updates', + 'blog_section_subtitle': 'Stay informed with our latest articles and hotel news', + 'blog_posts_limit': 3, + 'blog_enabled': True, + + # Sections Enabled + 'sections_enabled': json.dumps({ + 'hero': True, + 'features': True, + 'about_preview': True, + 'stats': True, + 'rooms': True, + 'services': True, + 'experiences': True, + 'amenities': True, + 'testimonials': True, + 'gallery': True, + 'luxury': True, + 'awards': True, + 'partners': True, + 'cta': True, + 'newsletter': True, + 'trust_badges': True, + 'promotions': True, + 'blog': True + }), + + # Badges + 'badges': json.dumps([ + { + 'text': '5-Star Rated', + 'icon': 'star' + }, + { + 'text': 'Award Winning', + 'icon': 'award' + }, + { + 'text': 'Eco-Friendly', + 'icon': 'leaf' + } + ]), + + # Social Links + 'social_links': json.dumps({ + 'facebook': 'https://facebook.com/luxuryhotel', + 'twitter': 'https://twitter.com/luxuryhotel', + 'instagram': 'https://instagram.com/luxuryhotel', + 'linkedin': 'https://linkedin.com/company/luxuryhotel', + 'youtube': 'https://youtube.com/luxuryhotel' + }), + + # Contact Info + 'contact_info': json.dumps({ + 'phone': '+1 (555) 123-4567', + 'email': 'info@luxuryhotel.com', + 'address': '123 Luxury Avenue, Premium City, PC 12345' + }), + + # Active Status + 'is_active': True, + 'created_at': datetime.now(timezone.utc), + 'updated_at': datetime.now(timezone.utc) + } + + +def seed_homepage(db: Session): + """Seed the homepage content""" + try: + # Check if homepage already exists + existing = db.query(PageContent).filter(PageContent.page_type == PageType.HOME).first() + + if existing: + logger.info('Homepage content already exists. Updating...') + # Update existing content + data = get_homepage_data() + for key, value in data.items(): + if key != 'page_type': # Don't update page_type + setattr(existing, key, value) + existing.updated_at = datetime.now(timezone.utc) + db.commit() + logger.info('Homepage content updated successfully!') + return existing + else: + logger.info('Creating new homepage content...') + # Create new content + data = get_homepage_data() + homepage = PageContent(**data) + db.add(homepage) + db.commit() + db.refresh(homepage) + logger.info('Homepage content created successfully!') + return homepage + + except Exception as e: + logger.error(f'Error seeding homepage: {str(e)}', exc_info=True) + db.rollback() + raise + + +def main(): + """Main function to run the seeder""" + logger.info('Starting homepage seeder...') + + db = SessionLocal() + try: + homepage = seed_homepage(db) + logger.info(f'Homepage seeder completed successfully! ID: {homepage.id}') + except Exception as e: + logger.error(f'Failed to seed homepage: {str(e)}', exc_info=True) + sys.exit(1) + finally: + db.close() + + +if __name__ == '__main__': + main() + diff --git a/Backend/seeders/privacy_seeder.py b/Backend/seeders/privacy_seeder.py new file mode 100644 index 00000000..7c8790d8 --- /dev/null +++ b/Backend/seeders/privacy_seeder.py @@ -0,0 +1,172 @@ +""" +Privacy Policy Page Seeder +Seeds the database with comprehensive privacy policy content +""" +import json +import sys +from pathlib import Path +from datetime import datetime, timezone + +# Add parent directory to path to allow importing from src +sys.path.insert(0, str(Path(__file__).resolve().parents[1])) + +from sqlalchemy.orm import Session +from src.shared.config.database import SessionLocal +from src.shared.config.logging_config import get_logger +from src.content.models.page_content import PageContent, PageType + +# Import all models to ensure relationships are loaded +from src.models import * + +logger = get_logger(__name__) + + +def get_privacy_page_data(): + """Generate comprehensive privacy policy page data""" + + now = datetime.now(timezone.utc) + + return { + 'page_type': PageType.PRIVACY, + 'title': 'Privacy Policy', + 'subtitle': 'Your Privacy Matters to Us', + 'description': 'Learn how we collect, use, and protect your personal information. We are committed to maintaining your privacy and ensuring the security of your data.', + 'content': """ +

1. Introduction

+

At Luxury Hotel & Resort, we are committed to protecting your privacy and ensuring the security of your personal information. This Privacy Policy explains how we collect, use, disclose, and safeguard your information when you visit our website, make a reservation, or use our services.

+ +

2. Information We Collect

+

2.1 Personal Information

+

We may collect personal information that you provide directly to us, including:

+
    +
  • Name, email address, phone number, and mailing address
  • +
  • Payment information (credit card details, billing address)
  • +
  • Reservation details and preferences
  • +
  • Identification documents (for check-in purposes)
  • +
  • Special requests or dietary requirements
  • +
+ +

2.2 Automatically Collected Information

+

When you visit our website, we may automatically collect certain information, including:

+
    +
  • IP address and browser type
  • +
  • Device information and operating system
  • +
  • Pages visited and time spent on our site
  • +
  • Referring website addresses
  • +
  • Cookies and similar tracking technologies
  • +
+ +

3. How We Use Your Information

+

We use the information we collect for various purposes, including:

+
    +
  • Processing and managing your reservations
  • +
  • Communicating with you about your stay
  • +
  • Providing customer service and support
  • +
  • Sending marketing communications (with your consent)
  • +
  • Improving our services and website experience
  • +
  • Complying with legal obligations
  • +
  • Preventing fraud and ensuring security
  • +
+ +

4. Information Sharing and Disclosure

+

We do not sell your personal information. We may share your information in the following circumstances:

+
    +
  • Service Providers: With trusted third-party service providers who assist us in operating our business
  • +
  • Legal Requirements: When required by law or to protect our rights and safety
  • +
  • Business Transfers: In connection with a merger, acquisition, or sale of assets
  • +
  • With Your Consent: When you have given us explicit permission to share your information
  • +
+ +

5. Data Security

+

We implement appropriate technical and organizational measures to protect your personal information against unauthorized access, alteration, disclosure, or destruction. However, no method of transmission over the Internet is 100% secure, and we cannot guarantee absolute security.

+ +

6. Your Rights

+

Depending on your location, you may have certain rights regarding your personal information, including:

+
    +
  • The right to access your personal information
  • +
  • The right to correct inaccurate information
  • +
  • The right to request deletion of your information
  • +
  • The right to object to processing of your information
  • +
  • The right to data portability
  • +
  • The right to withdraw consent
  • +
+ +

7. Cookies and Tracking Technologies

+

We use cookies and similar tracking technologies to enhance your browsing experience, analyze website traffic, and personalize content. You can control cookie preferences through your browser settings.

+ +

8. Third-Party Links

+

Our website may contain links to third-party websites. We are not responsible for the privacy practices of these external sites. We encourage you to review their privacy policies.

+ +

9. Children's Privacy

+

Our services are not directed to individuals under the age of 18. We do not knowingly collect personal information from children. If you believe we have collected information from a child, please contact us immediately.

+ +

10. International Data Transfers

+

Your information may be transferred to and processed in countries other than your country of residence. We ensure appropriate safeguards are in place to protect your information in accordance with this Privacy Policy.

+ +

11. Changes to This Privacy Policy

+

We may update this Privacy Policy from time to time. We will notify you of any material changes by posting the new policy on this page and updating the "Last Updated" date.

+ +

12. Contact Us

+

If you have any questions or concerns about this Privacy Policy or our data practices, please contact us at:

+

+ Email: privacy@luxuryhotel.com
+ Phone: +1 (555) 123-4567
+ Address: 123 Luxury Avenue, Premium City, PC 12345, United States +

+ +

Last Updated: {}

+ """.format(now.strftime('%B %d, %Y')), + 'meta_title': 'Privacy Policy | Luxury Hotel & Resort', + 'meta_description': 'Learn how Luxury Hotel & Resort collects, uses, and protects your personal information. Read our comprehensive privacy policy.', + 'meta_keywords': 'privacy policy, data protection, personal information, GDPR, privacy rights, hotel privacy', + 'og_title': 'Privacy Policy - Luxury Hotel & Resort', + 'og_description': 'Your privacy matters to us. Learn how we protect and use your personal information.', + 'og_image': 'https://images.unsplash.com/photo-1556761175-5973dc0f32e7?w=1200&h=630&fit=crop', + 'canonical_url': 'https://luxuryhotel.com/privacy', + 'is_active': True, + 'created_at': now, + 'updated_at': now + } + + +def seed_privacy_page(db: Session): + """Seed privacy policy page content into the database""" + try: + privacy_data = get_privacy_page_data() + + # Check if privacy page content already exists + existing_content = db.query(PageContent).filter(PageContent.page_type == PageType.PRIVACY).first() + + if existing_content: + logger.info('Updating existing privacy policy page content...') + for key, value in privacy_data.items(): + if key not in ['id', 'page_type', 'created_at']: + setattr(existing_content, key, value) + existing_content.updated_at = datetime.now(timezone.utc) + else: + logger.info('Creating new privacy policy page content...') + privacy_page = PageContent(**privacy_data) + db.add(privacy_page) + + db.commit() + logger.info('Privacy policy page content seeded successfully!') + except Exception as e: + db.rollback() + logger.error(f'Error seeding privacy policy page: {str(e)}', exc_info=True) + raise + + +def main(): + db = SessionLocal() + try: + seed_privacy_page(db) + except Exception as e: + logger.error(f'Failed to seed privacy policy page: {str(e)}', exc_info=True) + sys.exit(1) + finally: + db.close() + + +if __name__ == '__main__': + main() + diff --git a/Backend/seeders/refunds_seeder.py b/Backend/seeders/refunds_seeder.py new file mode 100644 index 00000000..594e4a13 --- /dev/null +++ b/Backend/seeders/refunds_seeder.py @@ -0,0 +1,193 @@ +""" +Refund Policy Page Seeder +Seeds the database with comprehensive refund policy content +""" +import json +import sys +from pathlib import Path +from datetime import datetime, timezone + +# Add parent directory to path to allow importing from src +sys.path.insert(0, str(Path(__file__).resolve().parents[1])) + +from sqlalchemy.orm import Session +from src.shared.config.database import SessionLocal +from src.shared.config.logging_config import get_logger +from src.content.models.page_content import PageContent, PageType + +# Import all models to ensure relationships are loaded +from src.models import * + +logger = get_logger(__name__) + + +def get_refunds_page_data(): + """Generate comprehensive refund policy page data""" + + now = datetime.now(timezone.utc) + + return { + 'page_type': PageType.REFUNDS, + 'title': 'Refund Policy', + 'subtitle': 'Our Refund Policy and Procedures', + 'description': 'Learn about our refund policy, including eligibility, processing times, and how to request a refund for your reservation or services.', + 'content': """ +

1. Overview

+

At Luxury Hotel & Resort, we strive to provide exceptional service and ensure your satisfaction. This Refund Policy outlines the terms and conditions under which refunds may be issued for reservations, services, and other transactions.

+ +

2. Reservation Refunds

+

2.1 Cancellation Refunds

+

Refunds for cancelled reservations are subject to the cancellation policy associated with your booking:

+
    +
  • Flexible Rate: Full refund if cancelled 24-48 hours before check-in (depending on rate terms)
  • +
  • Non-Refundable Rate: No refund for cancellations, but may be eligible for credit or rescheduling (subject to terms)
  • +
  • Special Packages: Refund terms vary by package - please refer to your booking confirmation
  • +
+ +

2.2 Early Departure

+

If you check out earlier than your scheduled departure date, you may be eligible for a partial refund for unused nights, subject to the terms of your reservation and availability. Early departure refunds are not guaranteed and are evaluated on a case-by-case basis.

+ +

2.3 No-Show

+

If you do not arrive on your scheduled check-in date and have not cancelled your reservation, you will be charged for the first night. No refunds are provided for no-show reservations.

+ +

3. Service Refunds

+

3.1 Spa Services

+

Spa service refunds or rescheduling:

+
    +
  • Cancellations made 24 hours in advance: Full refund or rescheduling
  • +
  • Cancellations made less than 24 hours in advance: 50% refund or rescheduling
  • +
  • No-show: No refund
  • +
+ +

3.2 Dining Reservations

+

Dining reservation refunds:

+
    +
  • Cancellations made 4 hours in advance: Full refund
  • +
  • Cancellations made less than 4 hours in advance: No refund, but may be rescheduled
  • +
  • Special event dining: Subject to specific event terms
  • +
+ +

3.3 Event & Meeting Bookings

+

Refund policies for events and meetings vary based on the size and type of event. Please refer to your event contract for specific refund terms.

+ +

4. Processing Refunds

+

4.1 Refund Processing Time

+

Once approved, refunds are typically processed within 5-10 business days. The time it takes for the refund to appear in your account depends on your financial institution:

+
    +
  • Credit card refunds: 5-10 business days
  • +
  • Debit card refunds: 5-10 business days
  • +
  • Bank transfer refunds: 7-14 business days
  • +
+ +

4.2 Refund Method

+

Refunds will be issued to the original payment method used for the transaction. If the original payment method is no longer valid, please contact us to arrange an alternative refund method.

+ +

5. Requesting a Refund

+

5.1 How to Request

+

To request a refund, please contact us:

+
    +
  • Phone: +1 (555) 123-4567
  • +
  • Email: refunds@luxuryhotel.com
  • +
  • Online: Through your booking confirmation or account
  • +
+ +

5.2 Required Information

+

When requesting a refund, please provide:

+
    +
  • Reservation or booking confirmation number
  • +
  • Guest name and contact information
  • +
  • Reason for refund request
  • +
  • Original payment method details
  • +
+ +

6. Non-Refundable Items

+

The following items and services are generally non-refundable:

+
    +
  • Non-refundable rate bookings (unless otherwise specified)
  • +
  • Gift cards and vouchers (subject to terms and conditions)
  • +
  • Third-party bookings (subject to third-party policies)
  • +
  • Consumed services (meals, spa treatments already received)
  • +
  • No-show charges
  • +
+ +

7. Special Circumstances

+

7.1 Force Majeure

+

In cases of force majeure events (natural disasters, pandemics, government restrictions, etc.), we will work with you to provide refunds, credits, or rescheduling options. Each situation is evaluated individually.

+ +

7.2 Service Issues

+

If you experience service issues during your stay, please bring them to our attention immediately so we can address them. We may offer partial refunds or credits for significant service failures, evaluated on a case-by-case basis.

+ +

8. Disputes & Appeals

+

If you are not satisfied with a refund decision, you may appeal by contacting our guest relations team. We will review your case and provide a response within 5-7 business days.

+ +

9. Third-Party Bookings

+

If you made your reservation through a third-party booking site (such as Expedia, Booking.com, etc.), refund requests must be processed through that third party according to their policies. We cannot directly process refunds for third-party bookings.

+ +

10. Contact Information

+

For refund inquiries or assistance, please contact us:

+
    +
  • Refunds Department: refunds@luxuryhotel.com
  • +
  • Phone: +1 (555) 123-4567
  • +
  • Hours: Monday-Friday, 9:00 AM - 6:00 PM EST
  • +
  • Address: 123 Luxury Avenue, Premium City, PC 12345, United States
  • +
+ +

11. Policy Updates

+

We reserve the right to update this Refund Policy at any time. Changes will be posted on this page with an updated "Last Updated" date. Your continued use of our services after changes are posted constitutes acceptance of the updated policy.

+ +

Last Updated: {}

+ """.format(now.strftime('%B %d, %Y')), + 'meta_title': 'Refund Policy | Luxury Hotel & Resort', + 'meta_description': 'Learn about our refund policy, including eligibility, processing times, and how to request refunds for reservations and services.', + 'meta_keywords': 'refund policy, cancellation refund, hotel refund, booking refund, refund request', + 'og_title': 'Refund Policy - Luxury Hotel & Resort', + 'og_description': 'Our refund policy and procedures. Learn how to request refunds for reservations and services.', + 'og_image': 'https://images.unsplash.com/photo-1556761175-5973dc0f32e7?w=1200&h=630&fit=crop', + 'canonical_url': 'https://luxuryhotel.com/refunds', + 'is_active': True, + 'created_at': now, + 'updated_at': now + } + + +def seed_refunds_page(db: Session): + """Seed refunds policy page content into the database""" + try: + refunds_data = get_refunds_page_data() + + # Check if refunds page content already exists + existing_content = db.query(PageContent).filter(PageContent.page_type == PageType.REFUNDS).first() + + if existing_content: + logger.info('Updating existing refunds policy page content...') + for key, value in refunds_data.items(): + if key not in ['id', 'page_type', 'created_at']: + setattr(existing_content, key, value) + existing_content.updated_at = datetime.now(timezone.utc) + else: + logger.info('Creating new refunds policy page content...') + refunds_page = PageContent(**refunds_data) + db.add(refunds_page) + + db.commit() + logger.info('Refunds policy page content seeded successfully!') + except Exception as e: + db.rollback() + logger.error(f'Error seeding refunds policy page: {str(e)}', exc_info=True) + raise + + +def main(): + db = SessionLocal() + try: + seed_refunds_page(db) + except Exception as e: + logger.error(f'Failed to seed refunds policy page: {str(e)}', exc_info=True) + sys.exit(1) + finally: + db.close() + + +if __name__ == '__main__': + main() + diff --git a/Backend/seeders/room_seeder.py b/Backend/seeders/room_seeder.py new file mode 100644 index 00000000..662de21c --- /dev/null +++ b/Backend/seeders/room_seeder.py @@ -0,0 +1,473 @@ +""" +Room Seeder +Seeds the database with room types and rooms +All images are from Unsplash (free stock photos) +""" +import json +import sys +from pathlib import Path +from datetime import datetime, timezone +from decimal import Decimal + +# Add parent directory to path to import modules +sys.path.insert(0, str(Path(__file__).resolve().parents[1])) + +from sqlalchemy.orm import Session +from src.shared.config.database import SessionLocal +from src.shared.config.logging_config import get_logger +from src.rooms.models.room import Room, RoomStatus +from src.rooms.models.room_type import RoomType + +# Import all models to ensure relationships are loaded correctly +from src.models import * + +logger = get_logger(__name__) + + +def get_room_types_data(): + """Generate room types data""" + now = datetime.now(timezone.utc) + + return [ + { + 'name': 'Standard Room', + 'description': 'Comfortable and well-appointed standard rooms perfect for business travelers and couples. Features modern amenities and elegant decor.', + 'base_price': Decimal('150.00'), + 'capacity': 2, + 'amenities': json.dumps([ + 'Free WiFi', + 'Flat-screen TV', + 'Air Conditioning', + 'Mini Bar', + 'Work Desk', + 'In-room Safe', + 'Coffee Maker', + 'Hair Dryer' + ]) + }, + { + 'name': 'Deluxe Room', + 'description': 'Spacious deluxe rooms with enhanced amenities and premium furnishings. Ideal for guests seeking extra comfort and space.', + 'base_price': Decimal('220.00'), + 'capacity': 2, + 'amenities': json.dumps([ + 'Free WiFi', + 'Smart TV', + 'Air Conditioning', + 'Premium Mini Bar', + 'Work Desk', + 'In-room Safe', + 'Nespresso Machine', + 'Hair Dryer', + 'Bathrobe & Slippers', + 'City View' + ]) + }, + { + 'name': 'Executive Suite', + 'description': 'Luxurious suites with separate living areas, perfect for extended stays or guests who prefer extra space and privacy.', + 'base_price': Decimal('350.00'), + 'capacity': 3, + 'amenities': json.dumps([ + 'Free WiFi', + 'Smart TV (Multiple)', + 'Air Conditioning', + 'Premium Mini Bar', + 'Separate Living Area', + 'In-room Safe', + 'Nespresso Machine', + 'Hair Dryer', + 'Bathrobe & Slippers', + 'Panoramic View', + 'Premium Toiletries', + 'Welcome Amenities' + ]) + }, + { + 'name': 'Presidential Suite', + 'description': 'The ultimate in luxury accommodation. Spacious multi-room suite with premium amenities, private terrace, and personalized butler service.', + 'base_price': Decimal('800.00'), + 'capacity': 4, + 'amenities': json.dumps([ + 'Free WiFi', + 'Smart TV (Multiple)', + 'Air Conditioning', + 'Premium Mini Bar', + 'Separate Living & Dining Areas', + 'In-room Safe', + 'Nespresso Machine', + 'Hair Dryer', + 'Bathrobe & Slippers', + 'Panoramic View', + 'Premium Toiletries', + 'Welcome Amenities', + 'Private Terrace', + 'Butler Service', + 'Private Bar', + 'Jacuzzi' + ]) + }, + { + 'name': 'Ocean View Room', + 'description': 'Stunning ocean view rooms with floor-to-ceiling windows and private balconies. Perfect for romantic getaways and relaxation.', + 'base_price': Decimal('280.00'), + 'capacity': 2, + 'amenities': json.dumps([ + 'Free WiFi', + 'Smart TV', + 'Air Conditioning', + 'Premium Mini Bar', + 'Work Desk', + 'In-room Safe', + 'Nespresso Machine', + 'Hair Dryer', + 'Bathrobe & Slippers', + 'Ocean View', + 'Private Balcony', + 'Premium Toiletries' + ]) + }, + { + 'name': 'Family Room', + 'description': 'Spacious family-friendly rooms designed to accommodate families with children. Features extra beds and family amenities.', + 'base_price': Decimal('300.00'), + 'capacity': 4, + 'amenities': json.dumps([ + 'Free WiFi', + 'Smart TV (Multiple)', + 'Air Conditioning', + 'Mini Bar', + 'Extra Beds', + 'In-room Safe', + 'Coffee Maker', + 'Hair Dryer', + 'Family Amenities', + 'Game Console', + 'Child Safety Features' + ]) + } + ] + + +def get_rooms_data(room_type_map): + """Generate rooms data based on room types""" + now = datetime.now(timezone.utc) + + rooms = [] + + # Standard Rooms (Floors 1-3, Rooms 101-130) + standard_type = room_type_map.get('Standard Room') + if standard_type: + for floor in range(1, 4): + for room_num in range(1, 11): + room_number = f"{floor}{room_num:02d}" + rooms.append({ + 'room_type_id': standard_type.id, + 'room_number': room_number, + 'floor': floor, + 'status': RoomStatus.available, + 'price': Decimal('150.00'), + 'featured': room_num <= 2, # First 2 rooms per floor are featured + 'capacity': 2, + 'room_size': '25 sqm', + 'view': 'City View', + 'images': json.dumps([ + 'https://images.unsplash.com/photo-1631049307264-da0ec9d70304?w=1200&h=800&fit=crop', + 'https://images.unsplash.com/photo-1596394516093-501ba68a0ba6?w=1200&h=800&fit=crop', + 'https://images.unsplash.com/photo-1618773928121-c32242e63f39?w=1200&h=800&fit=crop' + ]), + 'amenities': json.dumps([ + 'Free WiFi', + 'Flat-screen TV', + 'Air Conditioning', + 'Mini Bar', + 'Work Desk', + 'In-room Safe' + ]), + 'description': f'Comfortable standard room on floor {floor} with modern amenities and city view. Perfect for business travelers and couples.' + }) + + # Deluxe Rooms (Floors 4-6, Rooms 401-430) + deluxe_type = room_type_map.get('Deluxe Room') + if deluxe_type: + for floor in range(4, 7): + for room_num in range(1, 11): + room_number = f"{floor}{room_num:02d}" + rooms.append({ + 'room_type_id': deluxe_type.id, + 'room_number': room_number, + 'floor': floor, + 'status': RoomStatus.available, + 'price': Decimal('220.00'), + 'featured': room_num <= 2, + 'capacity': 2, + 'room_size': '35 sqm', + 'view': 'City View', + 'images': json.dumps([ + 'https://images.unsplash.com/photo-1618773928121-c32242e63f39?w=1200&h=800&fit=crop', + 'https://images.unsplash.com/photo-1590490360182-c33d57733427?w=1200&h=800&fit=crop', + 'https://images.unsplash.com/photo-1631049307264-da0ec9d70304?w=1200&h=800&fit=crop' + ]), + 'amenities': json.dumps([ + 'Free WiFi', + 'Smart TV', + 'Air Conditioning', + 'Premium Mini Bar', + 'Work Desk', + 'Nespresso Machine', + 'Bathrobe & Slippers' + ]), + 'description': f'Spacious deluxe room on floor {floor} with premium amenities and enhanced comfort. Ideal for guests seeking extra space.' + }) + + # Executive Suites (Floors 7-8, Rooms 701-720) + executive_type = room_type_map.get('Executive Suite') + if executive_type: + for floor in range(7, 9): + for room_num in range(1, 11): + room_number = f"{floor}{room_num:02d}" + rooms.append({ + 'room_type_id': executive_type.id, + 'room_number': room_number, + 'floor': floor, + 'status': RoomStatus.available, + 'price': Decimal('350.00'), + 'featured': room_num <= 3, + 'capacity': 3, + 'room_size': '55 sqm', + 'view': 'Panoramic View', + 'images': json.dumps([ + 'https://images.unsplash.com/photo-1590490360182-c33d57733427?w=1200&h=800&fit=crop', + 'https://images.unsplash.com/photo-1618773928121-c32242e63f39?w=1200&h=800&fit=crop', + 'https://images.unsplash.com/photo-1631049307264-da0ec9d70304?w=1200&h=800&fit=crop', + 'https://images.unsplash.com/photo-1596394516093-501ba68a0ba6?w=1200&h=800&fit=crop' + ]), + 'amenities': json.dumps([ + 'Free WiFi', + 'Smart TV (Multiple)', + 'Separate Living Area', + 'Premium Mini Bar', + 'Nespresso Machine', + 'Bathrobe & Slippers', + 'Premium Toiletries', + 'Welcome Amenities' + ]), + 'description': f'Luxurious executive suite on floor {floor} with separate living area and panoramic views. Perfect for extended stays.' + }) + + # Presidential Suites (Floor 9, Rooms 901-905) + presidential_type = room_type_map.get('Presidential Suite') + if presidential_type: + for room_num in range(1, 6): + room_number = f"9{room_num:02d}" + rooms.append({ + 'room_type_id': presidential_type.id, + 'room_number': room_number, + 'floor': 9, + 'status': RoomStatus.available, + 'price': Decimal('800.00'), + 'featured': True, # All presidential suites are featured + 'capacity': 4, + 'room_size': '120 sqm', + 'view': 'Panoramic View', + 'images': json.dumps([ + 'https://images.unsplash.com/photo-1596394516093-501ba68a0ba6?w=1200&h=800&fit=crop', + 'https://images.unsplash.com/photo-1618773928121-c32242e63f39?w=1200&h=800&fit=crop', + 'https://images.unsplash.com/photo-1590490360182-c33d57733427?w=1200&h=800&fit=crop', + 'https://images.unsplash.com/photo-1631049307264-da0ec9d70304?w=1200&h=800&fit=crop', + 'https://images.unsplash.com/photo-1564501049412-61c2a3083791?w=1200&h=800&fit=crop' + ]), + 'amenities': json.dumps([ + 'Free WiFi', + 'Smart TV (Multiple)', + 'Separate Living & Dining Areas', + 'Private Terrace', + 'Butler Service', + 'Premium Mini Bar', + 'Private Bar', + 'Jacuzzi', + 'Premium Toiletries', + 'Welcome Amenities' + ]), + 'description': f'Ultimate luxury in our exclusive presidential suite. Features grand living room, formal dining, private terrace, and personal butler service. Suite {room_num}.' + }) + + # Ocean View Rooms (Floor 10, Rooms 1001-1020) + ocean_type = room_type_map.get('Ocean View Room') + if ocean_type: + for room_num in range(1, 21): + room_number = f"10{room_num:02d}" + rooms.append({ + 'room_type_id': ocean_type.id, + 'room_number': room_number, + 'floor': 10, + 'status': RoomStatus.available, + 'price': Decimal('280.00'), + 'featured': room_num <= 5, + 'capacity': 2, + 'room_size': '30 sqm', + 'view': 'Ocean View', + 'images': json.dumps([ + 'https://images.unsplash.com/photo-1631049307264-da0ec9d70304?w=1200&h=800&fit=crop', + 'https://images.unsplash.com/photo-1587925358603-dc217c8a64f8?w=1200&h=800&fit=crop', + 'https://images.unsplash.com/photo-1564501049412-61c2a3083791?w=1200&h=800&fit=crop' + ]), + 'amenities': json.dumps([ + 'Free WiFi', + 'Smart TV', + 'Air Conditioning', + 'Premium Mini Bar', + 'Private Balcony', + 'Nespresso Machine', + 'Bathrobe & Slippers', + 'Ocean View' + ]), + 'description': f'Stunning ocean view room with floor-to-ceiling windows and private balcony. Perfect for romantic getaways and relaxation.' + }) + + # Family Rooms (Floor 1, Rooms 111-120) + family_type = room_type_map.get('Family Room') + if family_type: + for room_num in range(11, 21): + room_number = f"1{room_num:02d}" + rooms.append({ + 'room_type_id': family_type.id, + 'room_number': room_number, + 'floor': 1, + 'status': RoomStatus.available, + 'price': Decimal('300.00'), + 'featured': room_num <= 13, + 'capacity': 4, + 'room_size': '45 sqm', + 'view': 'City View', + 'images': json.dumps([ + 'https://images.unsplash.com/photo-1631049307264-da0ec9d70304?w=1200&h=800&fit=crop', + 'https://images.unsplash.com/photo-1618773928121-c32242e63f39?w=1200&h=800&fit=crop', + 'https://images.unsplash.com/photo-1590490360182-c33d57733427?w=1200&h=800&fit=crop' + ]), + 'amenities': json.dumps([ + 'Free WiFi', + 'Smart TV (Multiple)', + 'Air Conditioning', + 'Mini Bar', + 'Extra Beds', + 'Game Console', + 'Child Safety Features', + 'Family Amenities' + ]), + 'description': f'Spacious family-friendly room on floor 1 designed to accommodate families with children. Features extra beds and family amenities.' + }) + + return rooms + + +def seed_room_types(db: Session): + """Seed room types into the database""" + try: + room_types_data = get_room_types_data() + room_type_map = {} + + now = datetime.now(timezone.utc) + + for room_type_data in room_types_data: + existing = db.query(RoomType).filter(RoomType.name == room_type_data['name']).first() + + if existing: + logger.info(f"Room type '{room_type_data['name']}' already exists. Updating...") + for key, value in room_type_data.items(): + setattr(existing, key, value) + existing.updated_at = now + room_type_map[existing.name] = existing + else: + logger.info(f"Creating room type: {room_type_data['name']}") + room_type = RoomType( + **room_type_data, + created_at=now, + updated_at=now + ) + db.add(room_type) + db.flush() # Flush to get the ID + room_type_map[room_type.name] = room_type + + db.commit() + logger.info(f'Successfully seeded {len(room_type_map)} room types!') + return room_type_map + except Exception as e: + db.rollback() + logger.error(f'Error seeding room types: {str(e)}', exc_info=True) + raise + + +def seed_rooms(db: Session, room_type_map: dict, clear_existing: bool = False): + """Seed rooms into the database""" + try: + if clear_existing: + logger.info('Clearing existing rooms...') + db.query(Room).delete() + db.commit() + logger.info('Existing rooms cleared.') + + rooms_data = get_rooms_data(room_type_map) + now = datetime.now(timezone.utc) + + created_count = 0 + updated_count = 0 + + for room_data in rooms_data: + existing = db.query(Room).filter(Room.room_number == room_data['room_number']).first() + + if existing: + logger.debug(f"Room '{room_data['room_number']}' already exists. Updating...") + for key, value in room_data.items(): + setattr(existing, key, value) + existing.updated_at = now + updated_count += 1 + else: + logger.debug(f"Creating room: {room_data['room_number']}") + room = Room( + **room_data, + created_at=now, + updated_at=now + ) + db.add(room) + created_count += 1 + + db.commit() + logger.info(f'Successfully seeded rooms! Created: {created_count}, Updated: {updated_count}, Total: {len(rooms_data)}') + except Exception as e: + db.rollback() + logger.error(f'Error seeding rooms: {str(e)}', exc_info=True) + raise + + +def seed_rooms_and_types(db: Session, clear_existing: bool = False): + """Seed both room types and rooms""" + room_type_map = seed_room_types(db) + seed_rooms(db, room_type_map, clear_existing=clear_existing) + return room_type_map + + +def main(): + import argparse + + parser = argparse.ArgumentParser(description='Seed room types and rooms') + parser.add_argument( + '--clear-rooms', + action='store_true', + help='Clear existing rooms before seeding (room types are updated, not cleared)' + ) + args = parser.parse_args() + + db = SessionLocal() + try: + seed_rooms_and_types(db, clear_existing=args.clear_rooms) + except Exception as e: + logger.error(f'Failed to seed rooms: {str(e)}', exc_info=True) + sys.exit(1) + finally: + db.close() + + +if __name__ == '__main__': + main() + diff --git a/Backend/seeders/run_seeder.py b/Backend/seeders/run_seeder.py new file mode 100755 index 00000000..ccdf470f --- /dev/null +++ b/Backend/seeders/run_seeder.py @@ -0,0 +1,184 @@ +#!/usr/bin/env python3 +""" +Seeder Runner +Run all seeders or specific seeders +""" +import sys +import argparse +from pathlib import Path + +# Add parent directory to path +sys.path.insert(0, str(Path(__file__).resolve().parents[1])) + +from homepage_seeder import seed_homepage +from about_seeder import seed_about_page +from contact_seeder import seed_contact_page +from privacy_seeder import seed_privacy_page +from faq_seeder import seed_faq_page +from accessibility_seeder import seed_accessibility_page +from refunds_seeder import seed_refunds_page +from terms_seeder import seed_terms_page +from cancellation_seeder import seed_cancellation_page +from footer_seeder import seed_footer_page +from banner_seeder import seed_banners +from user_seeder import seed_users_and_roles +from room_seeder import seed_rooms_and_types +from service_seeder import seed_services +from blog_seeder import seed_blog_posts +from settings_seeder import seed_settings +from src.shared.config.database import SessionLocal +from src.shared.config.logging_config import get_logger + +logger = get_logger(__name__) + + +def main(): + parser = argparse.ArgumentParser(description='Run database seeders') + parser.add_argument( + '--seeder', + choices=['homepage', 'about', 'contact', 'privacy', 'faq', 'accessibility', 'refunds', 'terms', 'cancellation', 'footer', 'banners', 'users', 'rooms', 'services', 'blog', 'settings', 'all'], + default='all', + help='Which seeder to run (default: all)' + ) + parser.add_argument( + '--clear-banners', + action='store_true', + help='Clear existing banners before seeding (only applies to banners seeder)' + ) + parser.add_argument( + '--clear-rooms', + action='store_true', + help='Clear existing rooms before seeding (only applies to rooms seeder)' + ) + parser.add_argument( + '--clear-services', + action='store_true', + help='Clear existing services before seeding (only applies to services seeder)' + ) + parser.add_argument( + '--clear-blog', + action='store_true', + help='Clear existing blog posts before seeding (only applies to blog seeder)' + ) + parser.add_argument( + '--clear-settings', + action='store_true', + help='Clear existing settings before seeding (only applies to settings seeder)' + ) + parser.add_argument( + '--admin-email', + default='admin@hotel.com', + help='Admin user email (default: admin@hotel.com)' + ) + parser.add_argument( + '--admin-password', + default='admin123', + help='Admin user password (default: admin123)' + ) + parser.add_argument( + '--admin-name', + default='Admin User', + help='Admin user full name (default: Admin User)' + ) + + args = parser.parse_args() + + db = SessionLocal() + try: + # Always seed users/roles first if running all or users seeder + if args.seeder == 'users' or args.seeder == 'all': + logger.info('Running user and role seeder...') + seed_users_and_roles( + db, + admin_email=args.admin_email, + admin_password=args.admin_password, + admin_name=args.admin_name + ) + logger.info('User and role seeder completed!') + + if args.seeder == 'homepage' or args.seeder == 'all': + logger.info('Running homepage seeder...') + seed_homepage(db) + logger.info('Homepage seeder completed!') + + if args.seeder == 'about' or args.seeder == 'all': + logger.info('Running about page seeder...') + seed_about_page(db) + logger.info('About page seeder completed!') + + if args.seeder == 'contact' or args.seeder == 'all': + logger.info('Running contact page seeder...') + seed_contact_page(db) + logger.info('Contact page seeder completed!') + + if args.seeder == 'privacy' or args.seeder == 'all': + logger.info('Running privacy policy page seeder...') + seed_privacy_page(db) + logger.info('Privacy policy page seeder completed!') + + if args.seeder == 'faq' or args.seeder == 'all': + logger.info('Running FAQ page seeder...') + seed_faq_page(db) + logger.info('FAQ page seeder completed!') + + if args.seeder == 'accessibility' or args.seeder == 'all': + logger.info('Running accessibility page seeder...') + seed_accessibility_page(db) + logger.info('Accessibility page seeder completed!') + + if args.seeder == 'refunds' or args.seeder == 'all': + logger.info('Running refunds policy page seeder...') + seed_refunds_page(db) + logger.info('Refunds policy page seeder completed!') + + if args.seeder == 'terms' or args.seeder == 'all': + logger.info('Running terms of use page seeder...') + seed_terms_page(db) + logger.info('Terms of use page seeder completed!') + + if args.seeder == 'cancellation' or args.seeder == 'all': + logger.info('Running cancellation policy page seeder...') + seed_cancellation_page(db) + logger.info('Cancellation policy page seeder completed!') + + if args.seeder == 'footer' or args.seeder == 'all': + logger.info('Running footer page seeder...') + seed_footer_page(db) + logger.info('Footer page seeder completed!') + + if args.seeder == 'banners' or args.seeder == 'all': + logger.info('Running banner seeder...') + seed_banners(db, clear_existing=args.clear_banners) + logger.info('Banner seeder completed!') + + if args.seeder == 'rooms' or args.seeder == 'all': + logger.info('Running room seeder...') + seed_rooms_and_types(db, clear_existing=args.clear_rooms) + logger.info('Room seeder completed!') + + if args.seeder == 'services' or args.seeder == 'all': + logger.info('Running service seeder...') + seed_services(db, clear_existing=args.clear_services) + logger.info('Service seeder completed!') + + if args.seeder == 'blog' or args.seeder == 'all': + logger.info('Running blog seeder...') + seed_blog_posts(db, clear_existing=args.clear_blog) + logger.info('Blog seeder completed!') + + if args.seeder == 'settings' or args.seeder == 'all': + logger.info('Running settings seeder...') + seed_settings(db, clear_existing=args.clear_settings) + logger.info('Settings seeder completed!') + + logger.info('All seeders completed successfully!') + except Exception as e: + logger.error(f'Seeder failed: {str(e)}', exc_info=True) + sys.exit(1) + finally: + db.close() + + +if __name__ == '__main__': + main() + diff --git a/Backend/seeders/service_seeder.py b/Backend/seeders/service_seeder.py new file mode 100644 index 00000000..1ebf3b32 --- /dev/null +++ b/Backend/seeders/service_seeder.py @@ -0,0 +1,413 @@ +""" +Service Seeder +Seeds the database with hotel services +All images are from Unsplash (free stock photos) +""" +import json +import sys +from pathlib import Path +from datetime import datetime, timezone +from decimal import Decimal +import re + +# Add parent directory to path to import modules +sys.path.insert(0, str(Path(__file__).resolve().parents[1])) + +from sqlalchemy.orm import Session +from src.shared.config.database import SessionLocal +from src.shared.config.logging_config import get_logger +from src.hotel_services.models.service import Service + +# Import all models to ensure relationships are loaded correctly +from src.models import * + +logger = get_logger(__name__) + + +def slugify(text): + """Convert text to URL-friendly slug""" + text = text.lower() + text = re.sub(r'[^\w\s-]', '', text) + text = re.sub(r'[-\s]+', '-', text) + return text.strip('-') + + +def get_services_data(): + """Generate comprehensive services data with Unsplash images""" + now = datetime.now(timezone.utc) + + services = [ + # Spa & Wellness Services + { + 'name': 'Luxury Spa Treatment', + 'description': 'Indulge in our signature spa treatments designed to rejuvenate your mind, body, and soul. Experience ultimate relaxation with our expert therapists.', + 'price': Decimal('150.00'), + 'category': 'Spa & Wellness', + 'slug': 'luxury-spa-treatment', + 'image': 'https://images.unsplash.com/photo-1544161515-4ab6ce6db874?w=1200&h=800&fit=crop', + 'content': '

Our luxury spa treatments combine traditional techniques with modern wellness practices. Choose from a variety of massages, facials, and body treatments tailored to your needs.

', + 'sections': json.dumps([ + { + 'type': 'features', + 'title': 'Treatment Options', + 'content': 'Swedish Massage, Deep Tissue, Hot Stone, Aromatherapy, Facial Treatments', + 'alignment': 'left', + 'is_visible': True + } + ]), + 'meta_title': 'Luxury Spa Treatment | Hotel Spa Services', + 'meta_description': 'Experience ultimate relaxation with our luxury spa treatments. Expert therapists, premium products, and serene environment.', + 'meta_keywords': 'spa, massage, wellness, relaxation, hotel spa, luxury treatment', + 'is_active': True + }, + { + 'name': 'Couples Massage', + 'description': 'Share a relaxing experience with your partner in our private couples massage room. Perfect for romantic getaways and special occasions.', + 'price': Decimal('280.00'), + 'category': 'Spa & Wellness', + 'slug': 'couples-massage', + 'image': 'https://images.unsplash.com/photo-1544161515-4ab6ce6db874?w=1200&h=800&fit=crop', + 'content': '

Enjoy a synchronized massage experience with your loved one in our beautifully appointed couples suite. Includes champagne and chocolate-covered strawberries.

', + 'sections': None, + 'meta_title': 'Couples Massage | Romantic Spa Experience', + 'meta_description': 'Share a romantic spa experience with couples massage. Private suite, synchronized treatments, and special amenities included.', + 'meta_keywords': 'couples massage, romantic spa, couples treatment, hotel spa', + 'is_active': True + }, + { + 'name': 'Facial Treatment', + 'description': 'Rejuvenate your skin with our professional facial treatments using premium skincare products. Customized for your skin type.', + 'price': Decimal('120.00'), + 'category': 'Spa & Wellness', + 'slug': 'facial-treatment', + 'image': 'https://images.unsplash.com/photo-1570172619644-dfd03ed5d881?w=1200&h=800&fit=crop', + 'content': '

Our expert estheticians provide personalized facial treatments to address your specific skin concerns. Includes deep cleansing, exfoliation, and hydration.

', + 'sections': None, + 'meta_title': 'Facial Treatment | Professional Skincare Services', + 'meta_description': 'Professional facial treatments with premium products. Customized for your skin type by expert estheticians.', + 'meta_keywords': 'facial, skincare, spa facial, beauty treatment', + 'is_active': True + }, + + # Dining Services + { + 'name': 'Fine Dining Experience', + 'description': 'Savor exquisite cuisine at our award-winning restaurant. Chef-prepared meals with the finest ingredients and impeccable service.', + 'price': Decimal('200.00'), + 'category': 'Dining', + 'slug': 'fine-dining-experience', + 'image': 'https://images.unsplash.com/photo-1414235077428-338989a2e8c0?w=1200&h=800&fit=crop', + 'content': '

Experience culinary excellence at our Michelin-starred restaurant. Our talented chefs create innovative dishes using locally sourced, seasonal ingredients.

', + 'sections': json.dumps([ + { + 'type': 'menu', + 'title': 'Signature Dishes', + 'content': 'Truffle Risotto, Wagyu Beef, Lobster Thermidor, Seasonal Tasting Menu', + 'alignment': 'center', + 'is_visible': True + } + ]), + 'meta_title': 'Fine Dining Restaurant | Award-Winning Cuisine', + 'meta_description': 'Experience award-winning fine dining with chef-prepared meals, premium ingredients, and exceptional service.', + 'meta_keywords': 'fine dining, restaurant, gourmet, Michelin, hotel restaurant', + 'is_active': True + }, + { + 'name': 'Room Service', + 'description': 'Enjoy delicious meals in the comfort of your room. Available 24/7 with an extensive menu of international and local cuisine.', + 'price': Decimal('50.00'), + 'category': 'Dining', + 'slug': 'room-service', + 'image': 'https://images.unsplash.com/photo-1551632811-5617803d319f?w=1200&h=800&fit=crop', + 'content': '

Our room service menu features breakfast, lunch, dinner, and late-night options. All dishes are prepared fresh and delivered to your room with professional service.

', + 'sections': None, + 'meta_title': '24/7 Room Service | In-Room Dining', + 'meta_description': 'Enjoy delicious meals in your room with our 24/7 room service. Extensive menu, fresh preparation, and professional delivery.', + 'meta_keywords': 'room service, in-room dining, hotel food delivery', + 'is_active': True + }, + { + 'name': 'Private Chef Service', + 'description': 'Experience gourmet dining in the privacy of your suite with a personal chef. Customized menus and intimate dining experience.', + 'price': Decimal('500.00'), + 'category': 'Dining', + 'slug': 'private-chef-service', + 'image': 'https://images.unsplash.com/photo-1577219491135-ce391730fd43?w=1200&h=800&fit=crop', + 'content': '

Our private chef service brings fine dining directly to your suite. Work with our chef to create a customized menu for your special occasion.

', + 'sections': None, + 'meta_title': 'Private Chef Service | In-Suite Dining', + 'meta_description': 'Enjoy a private chef experience in your suite. Customized menus, intimate dining, and exceptional culinary expertise.', + 'meta_keywords': 'private chef, in-suite dining, personal chef, luxury dining', + 'is_active': True + }, + + # Concierge Services + { + 'name': '24/7 Concierge Service', + 'description': 'Our dedicated concierge team is available around the clock to assist with restaurant reservations, event tickets, transportation, and more.', + 'price': Decimal('0.00'), + 'category': 'Concierge', + 'slug': 'concierge-service', + 'image': 'https://images.unsplash.com/photo-1556761175-5973dc0f32e7?w=1200&h=800&fit=crop', + 'content': '

From restaurant reservations to exclusive experiences, our concierge team ensures your stay is seamless and memorable. Available 24/7 for all your needs.

', + 'sections': json.dumps([ + { + 'type': 'services', + 'title': 'Concierge Services', + 'content': 'Restaurant Reservations, Event Tickets, Transportation, City Tours, Special Occasions', + 'alignment': 'left', + 'is_visible': True + } + ]), + 'meta_title': '24/7 Concierge Service | Personal Assistance', + 'meta_description': 'Round-the-clock concierge service for restaurant reservations, tickets, transportation, and personalized assistance.', + 'meta_keywords': 'concierge, personal assistant, hotel concierge, guest services', + 'is_active': True + }, + { + 'name': 'Airport Transfer', + 'description': 'Enjoy seamless airport transfers in our luxury vehicles. Professional drivers and comfortable transportation to and from the airport.', + 'price': Decimal('80.00'), + 'category': 'Transportation', + 'slug': 'airport-transfer', + 'image': 'https://images.unsplash.com/photo-1583485088076-494435075764?w=1200&h=800&fit=crop', + 'content': '

Start and end your journey in comfort with our premium airport transfer service. Available for all major airports with luxury vehicles and professional drivers.

', + 'sections': None, + 'meta_title': 'Airport Transfer Service | Luxury Transportation', + 'meta_description': 'Premium airport transfer service with luxury vehicles and professional drivers. Seamless transportation to and from the airport.', + 'meta_keywords': 'airport transfer, transportation, airport shuttle, luxury car service', + 'is_active': True + }, + { + 'name': 'City Tour Service', + 'description': 'Discover the city with our guided tour service. Customized itineraries and expert local guides to show you the best attractions.', + 'price': Decimal('150.00'), + 'category': 'Concierge', + 'slug': 'city-tour-service', + 'image': 'https://images.unsplash.com/photo-1488646953014-85cb44e25828?w=1200&h=800&fit=crop', + 'content': '

Explore the city with our professional tour guides. Choose from standard tours or customize your itinerary to visit your preferred attractions.

', + 'sections': None, + 'meta_title': 'City Tour Service | Guided Tours', + 'meta_description': 'Discover the city with our guided tour service. Expert guides, customized itineraries, and memorable experiences.', + 'meta_keywords': 'city tour, guided tour, sightseeing, local attractions', + 'is_active': True + }, + + # Business Services + { + 'name': 'Business Center Access', + 'description': 'Access our fully equipped business center with computers, printers, meeting rooms, and high-speed internet. Perfect for business travelers.', + 'price': Decimal('25.00'), + 'category': 'Business', + 'slug': 'business-center-access', + 'image': 'https://images.unsplash.com/photo-1497366216548-37526070297c?w=1200&h=800&fit=crop', + 'content': '

Our business center provides all the facilities you need for productive work. Includes private workstations, printing services, and meeting spaces.

', + 'sections': None, + 'meta_title': 'Business Center | Professional Workspace', + 'meta_description': 'Fully equipped business center with computers, printers, meeting rooms, and high-speed internet for business travelers.', + 'meta_keywords': 'business center, workspace, meeting room, business facilities', + 'is_active': True + }, + { + 'name': 'Meeting Room Rental', + 'description': 'Host your business meetings in our state-of-the-art meeting rooms. Equipped with modern technology and professional amenities.', + 'price': Decimal('300.00'), + 'category': 'Business', + 'slug': 'meeting-room-rental', + 'image': 'https://images.unsplash.com/photo-1497366216548-37526070297c?w=1200&h=800&fit=crop', + 'content': '

Our meeting rooms accommodate various group sizes and are equipped with AV equipment, high-speed internet, and catering options.

', + 'sections': None, + 'meta_title': 'Meeting Room Rental | Business Facilities', + 'meta_description': 'State-of-the-art meeting rooms with modern technology, AV equipment, and professional amenities for your business needs.', + 'meta_keywords': 'meeting room, conference room, business meeting, event space', + 'is_active': True + }, + + # Additional Services + { + 'name': 'Laundry & Dry Cleaning', + 'description': 'Professional laundry and dry cleaning services. Same-day service available for your convenience.', + 'price': Decimal('30.00'), + 'category': 'Housekeeping', + 'slug': 'laundry-dry-cleaning', + 'image': 'https://images.unsplash.com/photo-1582735689369-4fe89db7114c?w=1200&h=800&fit=crop', + 'content': '

Keep your wardrobe fresh with our professional laundry and dry cleaning services. Same-day service available for urgent needs.

', + 'sections': None, + 'meta_title': 'Laundry & Dry Cleaning Service', + 'meta_description': 'Professional laundry and dry cleaning services with same-day service available. Keep your wardrobe fresh during your stay.', + 'meta_keywords': 'laundry, dry cleaning, clothing service, hotel laundry', + 'is_active': True + }, + { + 'name': 'Fitness Center Access', + 'description': 'Access our state-of-the-art fitness center with modern equipment, personal trainers, and group fitness classes.', + 'price': Decimal('0.00'), + 'category': 'Fitness', + 'slug': 'fitness-center-access', + 'image': 'https://images.unsplash.com/photo-1534438747741-0bf23ca35f0d?w=1200&h=800&fit=crop', + 'content': '

Maintain your fitness routine in our fully equipped gym. Features cardio equipment, weight training, and personal training sessions available.

', + 'sections': None, + 'meta_title': 'Fitness Center | Hotel Gym Access', + 'meta_description': 'State-of-the-art fitness center with modern equipment, personal trainers, and group fitness classes. Stay fit during your stay.', + 'meta_keywords': 'fitness center, gym, workout, exercise, hotel gym', + 'is_active': True + }, + { + 'name': 'Personal Shopper', + 'description': 'Discover the city\'s best boutiques and shopping destinations with our expert personal shopper. Tailored shopping experiences.', + 'price': Decimal('200.00'), + 'category': 'Concierge', + 'slug': 'personal-shopper', + 'image': 'https://images.unsplash.com/photo-1528716321680-815a8cdb8bc7?w=1200&h=800&fit=crop', + 'content': '

Let our personal shopper guide you to the best shopping destinations. From luxury boutiques to local markets, we\'ll help you find exactly what you\'re looking for.

', + 'sections': None, + 'meta_title': 'Personal Shopper Service | Shopping Assistance', + 'meta_description': 'Expert personal shopper service to guide you to the best boutiques and shopping destinations. Tailored shopping experiences.', + 'meta_keywords': 'personal shopper, shopping service, boutique shopping, shopping guide', + 'is_active': True + }, + { + 'name': 'Valet Parking', + 'description': 'Complimentary valet parking service for all hotel guests. Secure parking with professional valet attendants.', + 'price': Decimal('0.00'), + 'category': 'Transportation', + 'slug': 'valet-parking', + 'image': 'https://images.unsplash.com/photo-1502877338535-766e1452684a?w=1200&h=800&fit=crop', + 'content': '

Enjoy the convenience of valet parking. Our professional attendants will safely park and retrieve your vehicle whenever needed.

', + 'sections': None, + 'meta_title': 'Valet Parking Service | Complimentary Parking', + 'meta_description': 'Complimentary valet parking service with professional attendants. Secure and convenient parking for all hotel guests.', + 'meta_keywords': 'valet parking, parking service, hotel parking', + 'is_active': True + }, + { + 'name': 'Butler Service', + 'description': 'Experience personalized butler service for suite guests. Available 24/7 to attend to your every need and ensure a flawless stay.', + 'price': Decimal('0.00'), + 'category': 'Concierge', + 'slug': 'butler-service', + 'image': 'https://images.unsplash.com/photo-1556761175-5973dc0f32e7?w=1200&h=800&fit=crop', + 'content': '

Our dedicated butlers provide personalized service to suite guests. From unpacking to arranging special requests, we ensure every detail is perfect.

', + 'sections': None, + 'meta_title': 'Butler Service | Personalized Assistance', + 'meta_description': 'Personalized butler service for suite guests. Available 24/7 to attend to your every need and ensure a flawless stay.', + 'meta_keywords': 'butler service, personal butler, suite service, luxury service', + 'is_active': True + }, + { + 'name': 'Event Planning', + 'description': 'Let our expert event planners organize your special occasion. From intimate dinners to grand celebrations, we handle every detail.', + 'price': Decimal('500.00'), + 'category': 'Events', + 'slug': 'event-planning', + 'image': 'https://images.unsplash.com/photo-1519167758481-83f29da1c4fe?w=1200&h=800&fit=crop', + 'content': '

Our event planning team will work with you to create unforgettable celebrations. From venue selection to catering and entertainment, we manage it all.

', + 'sections': None, + 'meta_title': 'Event Planning Service | Special Occasions', + 'meta_description': 'Expert event planning service for special occasions. From intimate dinners to grand celebrations, we handle every detail.', + 'meta_keywords': 'event planning, party planning, special events, celebration planning', + 'is_active': True + }, + { + 'name': 'Photography Service', + 'description': 'Capture your special moments with our professional photography service. Available for events, portraits, and special occasions.', + 'price': Decimal('300.00'), + 'category': 'Events', + 'slug': 'photography-service', + 'image': 'https://images.unsplash.com/photo-1516035069371-29a1b244cc32?w=1200&h=800&fit=crop', + 'content': '

Our professional photographers will capture your special moments with artistic flair. Perfect for weddings, anniversaries, and other celebrations.

', + 'sections': None, + 'meta_title': 'Professional Photography Service', + 'meta_description': 'Professional photography service for events, portraits, and special occasions. Capture your special moments with artistic flair.', + 'meta_keywords': 'photography, photographer, event photography, portrait photography', + 'is_active': True + }, + { + 'name': 'Babysitting Service', + 'description': 'Professional babysitting service for families. Certified caregivers available to watch your children while you enjoy your stay.', + 'price': Decimal('50.00'), + 'category': 'Family', + 'slug': 'babysitting-service', + 'image': 'https://images.unsplash.com/photo-1503454537195-1dcabb73ffb9?w=1200&h=800&fit=crop', + 'content': '

Enjoy peace of mind with our professional babysitting service. All caregivers are certified and experienced in childcare.

', + 'sections': None, + 'meta_title': 'Babysitting Service | Childcare', + 'meta_description': 'Professional babysitting service with certified caregivers. Enjoy your stay while your children are safely cared for.', + 'meta_keywords': 'babysitting, childcare, kids service, family service', + 'is_active': True + } + ] + + return services + + +def seed_services(db: Session, clear_existing: bool = False): + """Seed services into the database""" + try: + if clear_existing: + logger.info('Clearing existing services...') + db.query(Service).delete() + db.commit() + logger.info('Existing services cleared.') + + services_data = get_services_data() + now = datetime.now(timezone.utc) + + created_count = 0 + updated_count = 0 + + for service_data in services_data: + # Generate slug if not provided + if not service_data.get('slug'): + service_data['slug'] = slugify(service_data['name']) + + existing = db.query(Service).filter(Service.slug == service_data['slug']).first() + + if existing: + logger.debug(f"Service '{service_data['name']}' already exists. Updating...") + for key, value in service_data.items(): + setattr(existing, key, value) + existing.updated_at = now + updated_count += 1 + else: + logger.debug(f"Creating service: {service_data['name']}") + service = Service( + **service_data, + created_at=now, + updated_at=now + ) + db.add(service) + created_count += 1 + + db.commit() + logger.info(f'Successfully seeded services! Created: {created_count}, Updated: {updated_count}, Total: {len(services_data)}') + except Exception as e: + db.rollback() + logger.error(f'Error seeding services: {str(e)}', exc_info=True) + raise + + +def main(): + import argparse + + parser = argparse.ArgumentParser(description='Seed hotel services') + parser.add_argument( + '--clear', + action='store_true', + help='Clear existing services before seeding' + ) + args = parser.parse_args() + + db = SessionLocal() + try: + seed_services(db, clear_existing=args.clear) + except Exception as e: + logger.error(f'Failed to seed services: {str(e)}', exc_info=True) + sys.exit(1) + finally: + db.close() + + +if __name__ == '__main__': + main() + diff --git a/Backend/seeders/settings_seeder.py b/Backend/seeders/settings_seeder.py new file mode 100644 index 00000000..bdea4a0f --- /dev/null +++ b/Backend/seeders/settings_seeder.py @@ -0,0 +1,339 @@ +""" +Settings Seeder +Seeds the database with system settings +""" +import sys +from pathlib import Path +from datetime import datetime, timezone + +# Add parent directory to path to import modules +sys.path.insert(0, str(Path(__file__).resolve().parents[1])) + +from sqlalchemy.orm import Session +from src.shared.config.database import SessionLocal +from src.shared.config.logging_config import get_logger +from src.system.models.system_settings import SystemSettings +from src.auth.models.user import User + +# Import all models to ensure relationships are loaded correctly +from src.models import * + +logger = get_logger(__name__) + + +def get_settings_data(): + """Generate comprehensive system settings data""" + + return [ + # Company Settings + { + 'key': 'company_name', + 'value': 'Luxury Hotel & Resort', + 'description': 'The official name of the hotel/company' + }, + { + 'key': 'company_tagline', + 'value': 'Experience Unparalleled Elegance and Comfort', + 'description': 'Company tagline or slogan' + }, + { + 'key': 'company_logo_url', + 'value': 'https://ui-avatars.com/api/?name=Luxury+Hotel&background=d4af37&color=fff&size=400&bold=true&font-size=0.5', + 'description': 'URL to the company logo image' + }, + { + 'key': 'company_favicon_url', + 'value': 'https://ui-avatars.com/api/?name=LH&background=d4af37&color=fff&size=64&bold=true', + 'description': 'URL to the company favicon image' + }, + { + 'key': 'company_phone', + 'value': '+1 (555) 123-4567', + 'description': 'Primary company phone number' + }, + { + 'key': 'company_email', + 'value': 'info@luxuryhotel.com', + 'description': 'Primary company email address' + }, + { + 'key': 'company_address', + 'value': '123 Luxury Avenue, Premium City, PC 12345, United States', + 'description': 'Company physical address' + }, + { + 'key': 'tax_rate', + 'value': '10.0', + 'description': 'Default tax rate percentage (e.g., 10.0 for 10%)' + }, + { + 'key': 'chat_working_hours_start', + 'value': '9', + 'description': 'Chat support working hours start (24-hour format, e.g., 9 for 9 AM)' + }, + { + 'key': 'chat_working_hours_end', + 'value': '18', + 'description': 'Chat support working hours end (24-hour format, e.g., 18 for 6 PM)' + }, + + # Platform Settings + { + 'key': 'platform_currency', + 'value': 'USD', + 'description': 'Default platform currency code (ISO 4217 format, e.g., USD, EUR, GBP)' + }, + + # Payment Gateway Settings (Placeholder values - should be configured in production) + { + 'key': 'stripe_secret_key', + 'value': '', + 'description': 'Stripe secret API key (configure in production)' + }, + { + 'key': 'stripe_publishable_key', + 'value': '', + 'description': 'Stripe publishable API key (configure in production)' + }, + { + 'key': 'stripe_webhook_secret', + 'value': '', + 'description': 'Stripe webhook secret for verifying webhook events (configure in production)' + }, + { + 'key': 'paypal_client_id', + 'value': '', + 'description': 'PayPal client ID (configure in production)' + }, + { + 'key': 'paypal_client_secret', + 'value': '', + 'description': 'PayPal client secret (configure in production)' + }, + { + 'key': 'paypal_mode', + 'value': 'sandbox', + 'description': 'PayPal mode: "sandbox" for testing, "live" for production' + }, + { + 'key': 'borica_terminal_id', + 'value': '', + 'description': 'Borica terminal ID (configure if using Borica payment gateway)' + }, + { + 'key': 'borica_merchant_id', + 'value': '', + 'description': 'Borica merchant ID (configure if using Borica payment gateway)' + }, + { + 'key': 'borica_private_key_path', + 'value': '', + 'description': 'Path to Borica private key file (configure if using Borica)' + }, + { + 'key': 'borica_certificate_path', + 'value': '', + 'description': 'Path to Borica certificate file (configure if using Borica)' + }, + { + 'key': 'borica_gateway_url', + 'value': '', + 'description': 'Borica gateway URL (configure if using Borica payment gateway)' + }, + { + 'key': 'borica_mode', + 'value': 'test', + 'description': 'Borica mode: "test" for testing, "production" for live transactions' + }, + + # SMTP Settings (Placeholder values - should be configured in production) + { + 'key': 'smtp_host', + 'value': '', + 'description': 'SMTP server hostname (e.g., smtp.gmail.com, smtp.sendgrid.net)' + }, + { + 'key': 'smtp_port', + 'value': '587', + 'description': 'SMTP server port (587 for STARTTLS, 465 for SSL)' + }, + { + 'key': 'smtp_user', + 'value': '', + 'description': 'SMTP authentication username/email' + }, + { + 'key': 'smtp_password', + 'value': '', + 'description': 'SMTP authentication password (stored securely)' + }, + { + 'key': 'smtp_from_email', + 'value': 'noreply@luxuryhotel.com', + 'description': 'Default "From" email address for outgoing emails' + }, + { + 'key': 'smtp_from_name', + 'value': 'Luxury Hotel & Resort', + 'description': 'Default "From" name for outgoing emails' + }, + { + 'key': 'smtp_use_tls', + 'value': 'true', + 'description': 'Use TLS/SSL for SMTP connection (true for port 465, false for port 587 with STARTTLS)' + }, + + # Security Settings + { + 'key': 'recaptcha_site_key', + 'value': '', + 'description': 'Google reCAPTCHA site key (configure if using reCAPTCHA)' + }, + { + 'key': 'recaptcha_secret_key', + 'value': '', + 'description': 'Google reCAPTCHA secret key (configure if using reCAPTCHA)' + }, + { + 'key': 'recaptcha_enabled', + 'value': 'false', + 'description': 'Enable/disable reCAPTCHA verification (true/false)' + }, + + # Additional Settings + { + 'key': 'booking_confirmation_email_enabled', + 'value': 'true', + 'description': 'Enable automatic booking confirmation emails (true/false)' + }, + { + 'key': 'booking_cancellation_email_enabled', + 'value': 'true', + 'description': 'Enable automatic booking cancellation emails (true/false)' + }, + { + 'key': 'newsletter_enabled', + 'value': 'true', + 'description': 'Enable newsletter subscription feature (true/false)' + }, + { + 'key': 'maintenance_mode', + 'value': 'false', + 'description': 'Enable maintenance mode (true/false)' + }, + { + 'key': 'maintenance_message', + 'value': 'We are currently performing scheduled maintenance. Please check back soon.', + 'description': 'Message to display when maintenance mode is enabled' + }, + { + 'key': 'default_checkin_time', + 'value': '15:00', + 'description': 'Default check-in time (24-hour format, e.g., 15:00 for 3 PM)' + }, + { + 'key': 'default_checkout_time', + 'value': '11:00', + 'description': 'Default check-out time (24-hour format, e.g., 11:00 for 11 AM)' + }, + { + 'key': 'cancellation_hours', + 'value': '24', + 'description': 'Number of hours before check-in that cancellation is allowed without penalty' + }, + { + 'key': 'max_guests_per_room', + 'value': '4', + 'description': 'Maximum number of guests allowed per room' + }, + { + 'key': 'min_booking_advance_days', + 'value': '0', + 'description': 'Minimum number of days in advance required for booking (0 = same day allowed)' + }, + { + 'key': 'max_booking_advance_days', + 'value': '365', + 'description': 'Maximum number of days in advance bookings can be made' + } + ] + + +def seed_settings(db: Session, clear_existing: bool = False, admin_user_id: int = None): + """Seed system settings into the database""" + try: + if clear_existing: + logger.info('Clearing existing system settings...') + db.query(SystemSettings).delete() + db.commit() + logger.info('Existing system settings cleared.') + + # Get admin user if not provided + if admin_user_id is None: + admin_user = db.query(User).filter(User.email == 'admin@hotel.com').first() + if admin_user: + admin_user_id = admin_user.id + else: + logger.warning('Admin user not found. Settings will be created without updated_by_id.') + + settings_data = get_settings_data() + now = datetime.now(timezone.utc) + + created_count = 0 + updated_count = 0 + + for setting_data in settings_data: + existing = db.query(SystemSettings).filter(SystemSettings.key == setting_data['key']).first() + + if existing: + logger.debug(f"Setting '{setting_data['key']}' already exists. Updating...") + existing.value = setting_data['value'] + existing.description = setting_data['description'] + if admin_user_id: + existing.updated_by_id = admin_user_id + existing.updated_at = now + updated_count += 1 + else: + logger.debug(f"Creating setting: {setting_data['key']}") + setting = SystemSettings( + key=setting_data['key'], + value=setting_data['value'], + description=setting_data['description'], + updated_by_id=admin_user_id, + updated_at=now + ) + db.add(setting) + created_count += 1 + + db.commit() + logger.info(f'Successfully seeded system settings! Created: {created_count}, Updated: {updated_count}, Total: {len(settings_data)}') + except Exception as e: + db.rollback() + logger.error(f'Error seeding system settings: {str(e)}', exc_info=True) + raise + + +def main(): + import argparse + + parser = argparse.ArgumentParser(description='Seed system settings') + parser.add_argument( + '--clear', + action='store_true', + help='Clear existing settings before seeding' + ) + args = parser.parse_args() + + db = SessionLocal() + try: + seed_settings(db, clear_existing=args.clear) + except Exception as e: + logger.error(f'Failed to seed system settings: {str(e)}', exc_info=True) + sys.exit(1) + finally: + db.close() + + +if __name__ == '__main__': + main() + diff --git a/Backend/seeders/terms_seeder.py b/Backend/seeders/terms_seeder.py new file mode 100644 index 00000000..c836960a --- /dev/null +++ b/Backend/seeders/terms_seeder.py @@ -0,0 +1,178 @@ +""" +Terms of Use Page Seeder +Seeds the database with comprehensive terms of use content +""" +import json +import sys +from pathlib import Path +from datetime import datetime, timezone + +# Add parent directory to path to allow importing from src +sys.path.insert(0, str(Path(__file__).resolve().parents[1])) + +from sqlalchemy.orm import Session +from src.shared.config.database import SessionLocal +from src.shared.config.logging_config import get_logger +from src.content.models.page_content import PageContent, PageType + +# Import all models to ensure relationships are loaded +from src.models import * + +logger = get_logger(__name__) + + +def get_terms_page_data(): + """Generate comprehensive terms of use page data""" + + now = datetime.now(timezone.utc) + + return { + 'page_type': PageType.TERMS, + 'title': 'Terms of Use', + 'subtitle': 'Terms and Conditions for Using Our Services', + 'description': 'Please read these terms and conditions carefully before using our website or services. By using our services, you agree to be bound by these terms.', + 'content': """ +

1. Acceptance of Terms

+

By accessing and using the Luxury Hotel & Resort website and services, you accept and agree to be bound by the terms and provision of this agreement. If you do not agree to these terms, please do not use our services.

+ +

2. Use of Website

+

2.1 Eligibility

+

You must be at least 18 years old to make a reservation or use our services. By using our website, you represent and warrant that you are at least 18 years of age and have the legal capacity to enter into this agreement.

+ +

2.2 User Account

+

If you create an account with us, you are responsible for maintaining the confidentiality of your account and password. You agree to accept responsibility for all activities that occur under your account.

+ +

2.3 Prohibited Uses

+

You agree not to use our website or services:

+
    +
  • For any unlawful purpose or to solicit others to perform unlawful acts
  • +
  • To violate any international, federal, provincial, or state regulations, rules, laws, or local ordinances
  • +
  • To infringe upon or violate our intellectual property rights or the intellectual property rights of others
  • +
  • To harass, abuse, insult, harm, defame, slander, disparage, intimidate, or discriminate
  • +
  • To submit false or misleading information
  • +
  • To upload or transmit viruses or any other type of malicious code
  • +
  • To collect or track the personal information of others
  • +
  • To spam, phish, pharm, pretext, spider, crawl, or scrape
  • +
  • For any obscene or immoral purpose
  • +
  • To interfere with or circumvent the security features of our website
  • +
+ +

3. Reservations and Bookings

+

3.1 Reservation Terms

+

When you make a reservation through our website or by phone, you agree to:

+
    +
  • Provide accurate and complete information
  • +
  • Use a valid payment method
  • +
  • Pay all charges incurred by your account
  • +
  • Comply with our cancellation and refund policies
  • +
+ +

3.2 Pricing

+

All prices are displayed in the currency specified and are subject to change without notice. We reserve the right to correct any pricing errors. Taxes and fees may apply and will be disclosed at the time of booking.

+ +

3.3 Payment

+

Payment is required at the time of booking or as specified in your reservation confirmation. We accept major credit cards and other payment methods as indicated on our website.

+ +

4. Cancellation and Refund Policy

+

Cancellation and refund terms vary by rate type and are specified at the time of booking. Please refer to your booking confirmation and our Refund Policy for detailed information.

+ +

5. Intellectual Property

+

The content on our website, including text, graphics, logos, images, and software, is the property of Luxury Hotel & Resort or its content suppliers and is protected by copyright and other intellectual property laws. You may not reproduce, distribute, modify, or create derivative works from any content without our express written permission.

+ +

6. User Content

+

If you submit content to our website (such as reviews, comments, or photos), you grant us a non-exclusive, royalty-free, perpetual, and worldwide license to use, reproduce, modify, and distribute such content for any purpose.

+ +

7. Limitation of Liability

+

To the fullest extent permitted by law, Luxury Hotel & Resort shall not be liable for any indirect, incidental, special, consequential, or punitive damages, or any loss of profits or revenues, whether incurred directly or indirectly, or any loss of data, use, goodwill, or other intangible losses resulting from your use of our services.

+ +

8. Indemnification

+

You agree to indemnify, defend, and hold harmless Luxury Hotel & Resort and its officers, directors, employees, and agents from any claims, damages, losses, liabilities, and expenses (including legal fees) arising out of or relating to your use of our services or violation of these terms.

+ +

9. Disclaimer of Warranties

+

Our services are provided "as is" and "as available" without warranties of any kind, either express or implied. We do not warrant that our services will be uninterrupted, secure, or error-free.

+ +

10. Third-Party Links

+

Our website may contain links to third-party websites. We are not responsible for the content, privacy policies, or practices of third-party websites. Your use of third-party websites is at your own risk.

+ +

11. Force Majeure

+

We shall not be liable for any failure or delay in performance under these terms which is due to circumstances beyond our reasonable control, including but not limited to natural disasters, war, terrorism, pandemics, government actions, or other force majeure events.

+ +

12. Governing Law

+

These terms shall be governed by and construed in accordance with the laws of the jurisdiction in which our hotel is located, without regard to its conflict of law provisions.

+ +

13. Dispute Resolution

+

Any disputes arising out of or relating to these terms or our services shall be resolved through binding arbitration in accordance with the rules of the applicable arbitration association, except where prohibited by law.

+ +

14. Changes to Terms

+

We reserve the right to modify these terms at any time. Changes will be effective immediately upon posting on our website. Your continued use of our services after changes are posted constitutes acceptance of the modified terms.

+ +

15. Severability

+

If any provision of these terms is found to be unenforceable or invalid, that provision shall be limited or eliminated to the minimum extent necessary, and the remaining provisions shall remain in full force and effect.

+ +

16. Entire Agreement

+

These terms constitute the entire agreement between you and Luxury Hotel & Resort regarding the use of our services and supersede all prior agreements and understandings.

+ +

17. Contact Information

+

If you have any questions about these Terms of Use, please contact us:

+
    +
  • Email: legal@luxuryhotel.com
  • +
  • Phone: +1 (555) 123-4567
  • +
  • Address: 123 Luxury Avenue, Premium City, PC 12345, United States
  • +
+ +

Last Updated: {}

+ """.format(now.strftime('%B %d, %Y')), + 'meta_title': 'Terms of Use | Luxury Hotel & Resort - Terms and Conditions', + 'meta_description': 'Read our terms and conditions for using our website and services. By using our services, you agree to these terms.', + 'meta_keywords': 'terms of use, terms and conditions, user agreement, legal terms, hotel terms', + 'og_title': 'Terms of Use - Luxury Hotel & Resort', + 'og_description': 'Terms and conditions for using our website and services. Please read carefully before using our services.', + 'og_image': 'https://images.unsplash.com/photo-1556761175-5973dc0f32e7?w=1200&h=630&fit=crop', + 'canonical_url': 'https://luxuryhotel.com/terms', + 'is_active': True, + 'created_at': now, + 'updated_at': now + } + + +def seed_terms_page(db: Session): + """Seed terms of use page content into the database""" + try: + terms_data = get_terms_page_data() + + # Check if terms page content already exists + existing_content = db.query(PageContent).filter(PageContent.page_type == PageType.TERMS).first() + + if existing_content: + logger.info('Updating existing terms of use page content...') + for key, value in terms_data.items(): + if key not in ['id', 'page_type', 'created_at']: + setattr(existing_content, key, value) + existing_content.updated_at = datetime.now(timezone.utc) + else: + logger.info('Creating new terms of use page content...') + terms_page = PageContent(**terms_data) + db.add(terms_page) + + db.commit() + logger.info('Terms of use page content seeded successfully!') + except Exception as e: + db.rollback() + logger.error(f'Error seeding terms of use page: {str(e)}', exc_info=True) + raise + + +def main(): + db = SessionLocal() + try: + seed_terms_page(db) + except Exception as e: + logger.error(f'Failed to seed terms of use page: {str(e)}', exc_info=True) + sys.exit(1) + finally: + db.close() + + +if __name__ == '__main__': + main() + diff --git a/Backend/seeders/user_seeder.py b/Backend/seeders/user_seeder.py new file mode 100644 index 00000000..e235d10e --- /dev/null +++ b/Backend/seeders/user_seeder.py @@ -0,0 +1,198 @@ +""" +User and Role Seeder +Creates default roles and an admin user +""" +import sys +from pathlib import Path +from datetime import datetime, timezone +import bcrypt + +# Add parent directory to path to import modules +sys.path.insert(0, str(Path(__file__).resolve().parents[1])) + +from sqlalchemy.orm import Session +from src.shared.config.database import SessionLocal +# Import all models to ensure relationships are properly initialized +from src.models import * +from src.auth.models.role import Role +from src.auth.models.user import User +from src.shared.config.logging_config import get_logger + +logger = get_logger(__name__) + + +def get_roles_data(): + """Generate default roles data""" + return [ + { + 'name': 'admin', + 'description': 'Full system access with all administrative privileges' + }, + { + 'name': 'staff', + 'description': 'Hotel staff with operational access' + }, + { + 'name': 'customer', + 'description': 'Regular customer/guest user' + }, + { + 'name': 'accountant', + 'description': 'Financial management and accounting access' + }, + + { + 'name': 'housekeeping', + 'description': 'Housekeeping and room management access' + } + ] + + +def seed_roles(db: Session): + """Seed roles into the database""" + try: + roles_data = get_roles_data() + created_count = 0 + updated_count = 0 + role_map = {} + + for role_data in roles_data: + existing = db.query(Role).filter(Role.name == role_data['name']).first() + + if existing: + logger.info(f'Role already exists: {role_data["name"]}') + role_map[role_data['name']] = existing + else: + logger.info(f'Creating role: {role_data["name"]}') + role = Role(**role_data) + db.add(role) + db.flush() # Flush to get the ID + role_map[role_data['name']] = role + created_count += 1 + + db.commit() + logger.info(f'Role seeding completed! Created: {created_count}, Existing: {len(roles_data) - created_count}') + return role_map + + except Exception as e: + logger.error(f'Error seeding roles: {str(e)}', exc_info=True) + db.rollback() + raise + + +def seed_admin_user(db: Session, admin_role: Role, email: str = 'admin@hotel.com', password: str = 'admin123', full_name: str = 'Admin User'): + """Seed admin user into the database""" + try: + # Check if admin user already exists + existing = db.query(User).filter(User.email == email).first() + + if existing: + logger.info(f'Admin user already exists: {email}') + # Update role if needed + if existing.role_id != admin_role.id: + existing.role_id = admin_role.id + existing.updated_at = datetime.now(timezone.utc) + db.commit() + logger.info(f'Updated admin user role: {email}') + return existing + + # Create new admin user + logger.info(f'Creating admin user: {email}') + password_bytes = password.encode('utf-8') + salt = bcrypt.gensalt() + hashed_password = bcrypt.hashpw(password_bytes, salt).decode('utf-8') + + admin_user = User( + email=email, + password=hashed_password, + full_name=full_name, + role_id=admin_role.id, + is_active=True, + phone=None, + address=None + ) + + db.add(admin_user) + db.commit() + db.refresh(admin_user) + logger.info(f'Admin user created successfully: {email}') + return admin_user + + except Exception as e: + logger.error(f'Error seeding admin user: {str(e)}', exc_info=True) + db.rollback() + raise + + +def seed_users_and_roles(db: Session, admin_email: str = 'admin@hotel.com', admin_password: str = 'admin123', admin_name: str = 'Admin User'): + """Seed roles and admin user""" + try: + # First, seed roles + role_map = seed_roles(db) + + # Get admin role + admin_role = role_map.get('admin') + if not admin_role: + raise ValueError('Admin role not found after seeding') + + # Seed admin user + admin_user = seed_admin_user(db, admin_role, admin_email, admin_password, admin_name) + + return role_map, admin_user + + except Exception as e: + logger.error(f'Error seeding users and roles: {str(e)}', exc_info=True) + raise + + +def main(): + """Main function to run the seeder""" + import argparse + + parser = argparse.ArgumentParser(description='Seed roles and admin user') + parser.add_argument( + '--email', + default='admin@hotel.com', + help='Admin user email (default: admin@hotel.com)' + ) + parser.add_argument( + '--password', + default='admin123', + help='Admin user password (default: admin123)' + ) + parser.add_argument( + '--name', + default='Admin User', + help='Admin user full name (default: Admin User)' + ) + + args = parser.parse_args() + + logger.info('Starting user and role seeder...') + + db = SessionLocal() + try: + role_map, admin_user = seed_users_and_roles( + db, + admin_email=args.email, + admin_password=args.password, + admin_name=args.name + ) + logger.info(f'User and role seeder completed successfully!') + logger.info(f'Admin user: {admin_user.email} (ID: {admin_user.id})') + logger.info(f'Roles created: {len(role_map)}') + print(f'\n✓ Admin user created successfully!') + print(f' Email: {admin_user.email}') + print(f' Password: {args.password}') + print(f' Role: admin') + print(f'\n⚠️ IMPORTANT: Change the default password after first login!') + except Exception as e: + logger.error(f'Failed to seed users and roles: {str(e)}', exc_info=True) + sys.exit(1) + finally: + db.close() + + +if __name__ == '__main__': + main() + diff --git a/Backend/seeds_data/__pycache__/add_accountant_role.cpython-312.pyc b/Backend/seeds_data/__pycache__/add_accountant_role.cpython-312.pyc deleted file mode 100644 index 788378bcd44dde0592bdf7663a9715212ce9ab60..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2772 zcmb7GO>7fK6rT02?e(sI@&m;U2^k1gaGThW1PUQgktPAu5-6O=#oBl`WRvx-ySr{; zH=!U=k%&~J>H!L^%ApqoQaScq2`;_Z#gfAcr2f!K+zjDRK@WXnXR}V~7Ih@gd-MM0 z&Fp*M_{TtiLolvg>yZEOAoLqq*aOz(vHTa1D@a5mNTfuULXA*BX~mVKM`#MUkVH$& zEvjNXQI1#P?Rmr_Q4>LX<JYs%R*(H=}S#euOXcZpEJrj0Ax9 zTtFj1DI|I)cOazi0RK9Xwf)Qa)rr0}>)@@G?P_Z4M9#6!xH7H?pFPW+O6YRR#HNM? zQN-rBgxiHgLQAWrpqlMi*A$5;i9!@iVN@`rD0ecgf}%w;*1miLHLB3gjY1i>Np7+{paMO&y>>;; zy5RO2ZJk4Bs`3GgjgH3Voamt6WJ?`d9ii$5s%pAQO3%1z_14;RR@pOP|H^x*viE^~ z*vZZ2*2af(yy6zyklAGWZb$loSsHv=Y>7jiyQ#{7o1xe4XSUiN6WHb)D)LSRokpU2 zmOe`_oUG6(Y6?x$r_mJEMymfmv$icG{%qf&m8M_cuIpMJ*J@vjbG*{skms*oeSr_H zf=8wA1qCoc%v3twz%l`jDk#bF7?U2yM+bUwHn6f77Lrmg9?lM~k2WQn;{;j&B?u~w z$*Q0xWI-uoQwL57nWUteMh6yD5%&5>lfg9NvKSR2TD&M#01FT%9r>4pD;OqXBVFER zEUhS+t=SO91CDbqPH!)}U%`XAuIae!B&%oE!(K0bLI5gKuM_OC+#jYTJ)@J(vpi$6 zVoJJBiq>+E$+}@$?vyU8rsa}F%bid(L$YW4cOr z;Vc#lFs+OViAjq#GKR$fyqXcla*3l>pbWK;TAV<+6>>gVML^xla0mRHktZ zF6A70?Av&0%enrNtHs^;bGYdn_DlBL4cCLkaA!W;d0YHWzA1m-myaI4A3jnH59hAL#hyMCp!{LJe2r!H9-3S!%&OF|kYu%M==qmWTiS*cw&f>P7{I;Il*4?>= zJq7>UOa6w^o5;ssX6M<@xaV)6&8(Qs{>*{S83wQobQCeV6MVa?y7W zxQ94&&*cWmJugjou3@N|w%B+)DadL(o{azy)TrNoJpIvVwyX1hkF0w@Q>CquddnM+ zi&`Qc*I$E#EpG~*eMKJC$!krrfu4}!am$kubm(J?Cp8TP7Z+vSVu-QjkyS&|O(=9z zx0(z+5jDoaSd1n#bxb}Jwg0448ZJZ(lA0(fMwHZlx%J9*NOmKj0I86_a5vF1%t&vB z=>^*dE@?$NsCU4UG_a9@sYFv0^^~D0W|>12{|JSjdQhlwaqlIy7;MW2+s^Szh`z|4 zXD^1%hZd>NyB9yc-`G|_+kZ#hj}U&wV5+e+Kq1CIm;H%;{Q=|4ak~r59$@BnTsZ!K Y*;HVNw6gHcwSPKX;t|uNzXiMh4Vztm00000 diff --git a/Backend/seeds_data/__pycache__/seed_bookings.cpython-312.pyc b/Backend/seeds_data/__pycache__/seed_bookings.cpython-312.pyc deleted file mode 100644 index 61ca3ec73e2b0e1d2446b967bb3af5370dbe0a00..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10874 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 diff --git a/Backend/seeds_data/__pycache__/seed_homepage_footer.cpython-312.pyc b/Backend/seeds_data/__pycache__/seed_homepage_footer.cpython-312.pyc deleted file mode 100644 index 81890ff4cb773136655c318d42345e399b6660b6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 19790 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 diff --git a/Backend/seeds_data/__pycache__/seed_initial_data.cpython-312.pyc b/Backend/seeds_data/__pycache__/seed_initial_data.cpython-312.pyc deleted file mode 100644 index 53a5477219358dea5666cacb7a366d5dabb3f011..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7239 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 today.replace(hour=0, minute=0), - HousekeepingTask.scheduled_time < today.replace(hour=23, minute=59, second=59) - ).first() - - if existing_task: - print(f" ⚠️ Task already exists for Room {room.room_number}, skipping...") - skipped_count += 1 - continue - - # Schedule tasks at different times throughout the day - scheduled_time = today + timedelta(hours=i) - - task = HousekeepingTask( - room_id=room.id, - booking_id=None, - task_type=HousekeepingType(task_type), - status=HousekeepingStatus.pending, - scheduled_time=scheduled_time, - assigned_to=housekeeping_user.id, - created_by=admin_user.id if admin_user else housekeeping_user.id, - checklist_items=checklists.get(task_type, []), - notes=f'Test task for Room {room.room_number} - {task_type} cleaning', - estimated_duration_minutes=45 if task_type == 'checkout' else 30 - ) - - db.add(task) - created_count += 1 - print(f" ✓ Created {task_type} task for Room {room.room_number} (scheduled: {scheduled_time.strftime('%Y-%m-%d %H:%M')})") - - db.commit() - - print(f"\n✓ Tasks assigned successfully!") - print(f" - Created: {created_count} task(s)") - print(f" - Skipped: {skipped_count} task(s) (already exist)") - print(f" - Assigned to: {housekeeping_user.email}") - - except Exception as e: - db.rollback() - print(f"✗ Error assigning housekeeping tasks: {e}") - import traceback - traceback.print_exc() - sys.exit(1) - finally: - db.close() - -if __name__ == '__main__': - print("Assigning test housekeeping tasks to housekeeping user...") - print("=" * 60) - assign_housekeeping_tasks() - print("=" * 60) - print("Done!") - diff --git a/Backend/seeds_data/fix_blog_dates.py b/Backend/seeds_data/fix_blog_dates.py deleted file mode 100644 index b2f19ab8..00000000 --- a/Backend/seeds_data/fix_blog_dates.py +++ /dev/null @@ -1,50 +0,0 @@ -""" -Fix blog post published_at dates to be in the past -""" -import sys -from pathlib import Path -sys.path.insert(0, str(Path(__file__).parent.parent)) - -from sqlalchemy.orm import Session -from src.shared.config.database import SessionLocal -from src.models.blog import BlogPost -from datetime import datetime, timedelta - -def fix_blog_dates(): - """Update all blog posts to have published_at dates in the past""" - db: Session = SessionLocal() - - try: - # Get all published posts - posts = db.query(BlogPost).filter(BlogPost.is_published == True).order_by(BlogPost.created_at.asc()).all() - - if not posts: - print("No published posts found.") - return - - # Set base date to 60 days ago - base_date = datetime.utcnow() - timedelta(days=60) - - updated = 0 - for i, post in enumerate(posts): - # Set each post's date going backwards from base_date - # Each post is 2 days earlier than the previous one - new_date = base_date - timedelta(days=i * 2) - post.published_at = new_date - updated += 1 - - db.commit() - print(f"Successfully updated {updated} blog posts with past published_at dates") - - except Exception as e: - db.rollback() - print(f"Error fixing blog dates: {str(e)}") - raise - finally: - db.close() - -if __name__ == "__main__": - print("Fixing blog post published_at dates...") - fix_blog_dates() - print("Done!") - diff --git a/Backend/seeds_data/seed_about_page.py b/Backend/seeds_data/seed_about_page.py deleted file mode 100644 index ee0b88f6..00000000 --- a/Backend/seeds_data/seed_about_page.py +++ /dev/null @@ -1,201 +0,0 @@ -#!/usr/bin/env python3 - -import sys -import os -from pathlib import Path -import json - -sys.path.insert(0, str(Path(__file__).parent)) - -from sqlalchemy.orm import Session -from src.shared.config.database import SessionLocal -from src.models.page_content import PageContent, PageType -from datetime import datetime - -def get_db(): - db = SessionLocal() - try: - return db - finally: - pass - -def seed_about_page(db: Session): - print("=" * 80) - print("SEEDING ABOUT PAGE CONTENT") - print("=" * 80) - - about_data = { - "title": "About Luxury Hotel", - "subtitle": "Where Excellence Meets Unforgettable Experiences", - "description": "Discover the story behind our commitment to luxury hospitality and exceptional service.", - "story_content": "For over three decades, Luxury Hotel has been a beacon of excellence in the hospitality industry. Founded with a vision to redefine luxury travel, we have grown from a single property to a collection of world-renowned destinations, each offering a unique blend of timeless elegance and modern sophistication. Our journey has been marked by countless awards, memorable moments, and the unwavering trust of our guests who return year after year.", - "mission": "To provide unparalleled luxury hospitality experiences that exceed expectations, creating lasting memories for our guests through exceptional service, attention to detail, and genuine care.", - "vision": "To be recognized as the world's premier luxury hotel brand, setting the standard for excellence in hospitality while maintaining our commitment to sustainability and community engagement.", - "about_hero_image": "https://images.unsplash.com/photo-1566073771259-6a8506099945?w=1920&h=1080&fit=crop", - "values": json.dumps([ - { - "icon": "Heart", - "title": "Passion", - "description": "We are passionate about hospitality and dedicated to creating exceptional experiences for every guest." - }, - { - "icon": "Award", - "title": "Excellence", - "description": "We strive for excellence in every aspect of our service, from the smallest detail to the grandest gesture." - }, - { - "icon": "Shield", - "title": "Integrity", - "description": "We conduct our business with honesty, transparency, and respect for our guests and community." - }, - { - "icon": "Users", - "title": "Service", - "description": "Our guests are at the heart of everything we do. Your comfort and satisfaction are our top priorities." - } - ]), - "features": json.dumps([ - { - "icon": "Star", - "title": "Premium Accommodations", - "description": "Luxuriously appointed rooms and suites designed for ultimate comfort and relaxation." - }, - { - "icon": "Clock", - "title": "24/7 Service", - "description": "Round-the-clock concierge and room service to attend to your needs at any time." - }, - { - "icon": "Award", - "title": "Award-Winning", - "description": "Recognized for excellence in hospitality and guest satisfaction." - } - ]), - "team": json.dumps([ - { - "name": "Sarah Johnson", - "role": "General Manager", - "image": "https://images.unsplash.com/photo-1494790108377-be9c29b29330?w=400&h=400&fit=crop", - "bio": "With over 15 years of experience in luxury hospitality, Sarah leads our team with passion and dedication.", - "social_links": { - "linkedin": "https://linkedin.com/in/sarahjohnson", - "twitter": "https://twitter.com/sarahjohnson" - } - }, - { - "name": "Michael Chen", - "role": "Head Chef", - "image": "https://images.unsplash.com/photo-1507003211169-0a1dd7228f2d?w=400&h=400&fit=crop", - "bio": "Award-winning chef with expertise in international cuisine, bringing world-class dining experiences to our guests.", - "social_links": { - "linkedin": "https://linkedin.com/in/michaelchen", - "twitter": "https://twitter.com/michaelchen" - } - }, - { - "name": "Emily Rodriguez", - "role": "Guest Relations Manager", - "image": "https://images.unsplash.com/photo-1438761681033-6461ffad8d80?w=400&h=400&fit=crop", - "bio": "Ensuring every guest feels valued and receives personalized attention throughout their stay.", - "social_links": { - "linkedin": "https://linkedin.com/in/emilyrodriguez" - } - } - ]), - "timeline": json.dumps([ - { - "year": "2010", - "title": "Grand Opening", - "description": "Luxury Hotel opened its doors, welcoming guests to a new standard of luxury hospitality.", - "image": "https://images.unsplash.com/photo-1566073771259-6a8506099945?w=800&h=600&fit=crop" - }, - { - "year": "2015", - "title": "First Award", - "description": "Received our first 'Best Luxury Hotel' award, recognizing our commitment to excellence.", - "image": "https://images.unsplash.com/photo-1571896349842-33c89424de2d?w=800&h=600&fit=crop" - }, - { - "year": "2018", - "title": "Major Renovation", - "description": "Completed a comprehensive renovation, adding state-of-the-art facilities and expanding our capacity.", - "image": "https://images.unsplash.com/photo-1590490360182-c33d57733427?w=800&h=600&fit=crop" - }, - { - "year": "2020", - "title": "Sustainability Initiative", - "description": "Launched our sustainability program, committing to eco-friendly practices and community engagement.", - "image": "https://images.unsplash.com/photo-1611892440504-42a792e24d32?w=800&h=600&fit=crop" - }, - { - "year": "2023", - "title": "International Recognition", - "description": "Achieved international recognition as one of the world's top luxury hotels.", - "image": "https://images.unsplash.com/photo-1564501049412-61c2a3083791?w=800&h=600&fit=crop" - } - ]), - "achievements": json.dumps([ - { - "icon": "Award", - "title": "Best Luxury Hotel 2023", - "description": "Recognized as the best luxury hotel in the region for exceptional service and amenities.", - "year": "2023", - "image": "https://images.unsplash.com/photo-1571896349842-33c89424de2d?w=400&h=300&fit=crop" - }, - { - "icon": "Star", - "title": "5-Star Rating", - "description": "Maintained our prestigious 5-star rating for over a decade, a testament to our consistent excellence.", - "year": "2022", - "image": "https://images.unsplash.com/photo-1566073771259-6a8506099945?w=400&h=300&fit=crop" - }, - { - "icon": "Award", - "title": "Sustainable Hotel of the Year", - "description": "Awarded for our commitment to environmental sustainability and green practices.", - "year": "2021", - "image": "https://images.unsplash.com/photo-1611892440504-42a792e24d32?w=400&h=300&fit=crop" - }, - { - "icon": "Users", - "title": "Guest Satisfaction Excellence", - "description": "Achieved 98% guest satisfaction rate, the highest in our category.", - "year": "2023", - "image": "https://images.unsplash.com/photo-1590490360182-c33d57733427?w=400&h=300&fit=crop" - } - ]), - "meta_title": "About Us - Luxury Hotel | Our Story, Mission & Vision", - "meta_description": "Learn about Luxury Hotel's commitment to excellence, our story, values, and the dedicated team that makes every stay unforgettable." - } - - existing = db.query(PageContent).filter(PageContent.page_type == PageType.ABOUT).first() - - if existing: - for key, value in about_data.items(): - setattr(existing, key, value) - existing.updated_at = datetime.utcnow() - print("✓ Updated existing about page content") - else: - new_content = PageContent( - page_type=PageType.ABOUT, - **about_data - ) - db.add(new_content) - print("✓ Created new about page content") - - db.commit() - print("\n✅ About page content seeded successfully!") - print("=" * 80) - -if __name__ == "__main__": - db = get_db() - try: - seed_about_page(db) - except Exception as e: - print(f"\n❌ Error: {e}") - import traceback - traceback.print_exc() - db.rollback() - finally: - db.close() - diff --git a/Backend/seeds_data/seed_all_test_data.py b/Backend/seeds_data/seed_all_test_data.py deleted file mode 100755 index 116af888..00000000 --- a/Backend/seeds_data/seed_all_test_data.py +++ /dev/null @@ -1,154 +0,0 @@ -#!/usr/bin/env python3 -""" -Master script to seed all test data for the hotel booking system. -This script runs all necessary seed scripts in the correct order. -""" - -import sys -import os -from pathlib import Path - -# Add the Backend directory to the path -backend_dir = Path(__file__).parent.parent -sys.path.insert(0, str(backend_dir)) -# Also add the seeds_data directory like other seed scripts -sys.path.insert(0, str(Path(__file__).parent)) - -import bcrypt - -def ensure_housekeeping_role(db): - """Ensure housekeeping role exists""" - from src.models.role import Role - housekeeping_role = db.query(Role).filter(Role.name == 'housekeeping').first() - if not housekeeping_role: - print('Creating housekeeping role...') - housekeeping_role = Role(name='housekeeping', description='Housekeeping staff role') - db.add(housekeeping_role) - db.commit() - db.refresh(housekeeping_role) - print('✓ Housekeeping role created') - return housekeeping_role - -def ensure_housekeeping_users(db): - """Ensure housekeeping users exist""" - from src.models.role import Role - from src.models.user import User - housekeeping_role = db.query(Role).filter(Role.name == 'housekeeping').first() - if not housekeeping_role: - print('❌ Housekeeping role not found!') - return - - housekeeping_users = [ - { - 'email': 'housekeeping@gnxsoft.com', - 'password': 'housekeeping123', - 'full_name': 'Housekeeping Staff', - 'phone': '+1 (555) 999-0000' - }, - { - 'email': 'housekeeping2@gnxsoft.com', - 'password': 'housekeeping123', - 'full_name': 'Housekeeping Staff 2', - 'phone': '+1 (555) 999-0001' - } - ] - - for user_data in housekeeping_users: - existing = db.query(User).filter(User.email == user_data['email']).first() - if not existing: - password_bytes = user_data['password'].encode('utf-8') - salt = bcrypt.gensalt() - hashed_password = bcrypt.hashpw(password_bytes, salt).decode('utf-8') - - user = User( - email=user_data['email'], - password=hashed_password, - full_name=user_data['full_name'], - phone=user_data['phone'], - role_id=housekeeping_role.id, - currency='EUR', - is_active=True - ) - db.add(user) - print(f' ✓ Created housekeeping user: {user_data["email"]} - Password: {user_data["password"]}') - else: - print(f' ⚠️ Housekeeping user "{user_data["email"]}" already exists') - - db.commit() - -def main(): - print('=' * 80) - print('SEEDING ALL TEST DATA FOR HOTEL BOOKING SYSTEM') - print('=' * 80) - print() - - from src.shared.config.database import SessionLocal - db = SessionLocal() - try: - # Step 1: Ensure housekeeping role exists - print('Step 1: Ensuring housekeeping role exists...') - ensure_housekeeping_role(db) - print() - - # Step 2: Ensure housekeeping users exist - print('Step 2: Ensuring housekeeping users exist...') - ensure_housekeeping_users(db) - print() - - # Step 3: Import and run seed scripts - print('Step 3: Running seed scripts...') - print() - - # Import seed modules - from seeds_data.seed_initial_data import seed_roles, seed_room_types, seed_admin_user - from seeds_data.seed_users import seed_users - from seeds_data.seed_rooms import seed_rooms - from seeds_data.seed_bookings import seed_bookings - - # Run seed scripts - print('Running seed_initial_data...') - seed_initial_data.seed_roles(db) - seed_initial_data.seed_room_types(db) - seed_initial_data.seed_admin_user(db) - print() - - print('Running seed_users...') - seed_users_module.seed_users(db) - print() - - print('Running seed_rooms...') - seed_rooms_module.seed_rooms(db) - print() - - print('Running seed_bookings...') - seed_bookings_module.seed_bookings(db) - print() - - print('=' * 80) - print('✅ ALL TEST DATA SEEDED SUCCESSFULLY!') - print('=' * 80) - print() - print('📋 Test Accounts:') - print(' Staff: staff@gnxsoft.com / staff123') - print(' Housekeeping: housekeeping@gnxsoft.com / housekeeping123') - print(' Housekeeping 2: housekeeping2@gnxsoft.com / housekeeping123') - print(' Customer: customer@gnxsoft.com / customer123') - print() - print('🧪 To test notifications:') - print(' 1. Log in as staff (staff@gnxsoft.com)') - print(' 2. Go to Bookings and mark a checked_in booking as checked_out') - print(' 3. Log in as housekeeping user in another browser/tab') - print(' 4. You should receive a real-time notification about the room needing cleaning') - print('=' * 80) - - except Exception as e: - print(f'\n❌ Error: {e}') - import traceback - traceback.print_exc() - db.rollback() - finally: - db.close() - -if __name__ == '__main__': - main() - diff --git a/Backend/seeds_data/seed_banners_company.py b/Backend/seeds_data/seed_banners_company.py deleted file mode 100644 index a603aff8..00000000 --- a/Backend/seeds_data/seed_banners_company.py +++ /dev/null @@ -1,70 +0,0 @@ -import sys -import os -from datetime import datetime, timedelta -sys.path.insert(0, os.path.join(os.path.dirname(__file__), 'src')) -from sqlalchemy.orm import Session -from src.shared.config.database import SessionLocal -from src.models.banner import Banner -from src.models.system_settings import SystemSettings -from src.models.user import User - -def seed_banners(db: Session): - print('Seeding banners...') - admin_user = db.query(User).filter(User.email == 'admin@hotel.com').first() - admin_id = admin_user.id if admin_user else None - existing_banners = db.query(Banner).all() - if existing_banners: - for banner in existing_banners: - db.delete(banner) - db.commit() - print(f' ✓ Removed {len(existing_banners)} existing banner(s)') - banners_data = [{'title': 'Welcome to Unparalleled Luxury', 'description': 'Where timeless elegance meets modern sophistication. Experience the pinnacle of hospitality in our award-winning luxury hotel.', 'image_url': 'https://images.unsplash.com/photo-1564501049412-61c2a3083791?w=1920', 'link_url': '/rooms', 'position': 'home', 'display_order': 1, 'is_active': True, 'start_date': datetime.utcnow() - timedelta(days=30), 'end_date': datetime.utcnow() + timedelta(days=365)}, {'title': 'Exclusive Presidential Suites', 'description': 'Indulge in our most opulent accommodations. Spacious suites with panoramic views, private terraces, and personalized butler service.', 'image_url': 'https://images.unsplash.com/photo-1590490360182-c33d57733427?w=1920', 'link_url': '/rooms', 'position': 'home', 'display_order': 2, 'is_active': True, 'start_date': datetime.utcnow() - timedelta(days=7), 'end_date': datetime.utcnow() + timedelta(days=365)}, {'title': 'World-Class Spa & Wellness', 'description': 'Rejuvenate your mind, body, and soul. Our award-winning spa offers bespoke treatments using the finest luxury products.', 'image_url': 'https://images.unsplash.com/photo-1544161515-4ab6ce6db874?w=1920', 'link_url': '/services', 'position': 'home', 'display_order': 3, 'is_active': True, 'start_date': datetime.utcnow() - timedelta(days=1), 'end_date': datetime.utcnow() + timedelta(days=365)}, {'title': 'Michelin-Starred Culinary Excellence', 'description': 'Savor extraordinary flavors crafted by world-renowned chefs. Our fine dining restaurants offer an unforgettable gastronomic journey.', 'image_url': 'https://images.unsplash.com/photo-1517248135467-4c7edcad34c4?w=1920', 'link_url': '/services', 'position': 'home', 'display_order': 4, 'is_active': True, 'start_date': datetime.utcnow(), 'end_date': datetime.utcnow() + timedelta(days=365)}, {'title': 'Private Yacht & Exclusive Experiences', 'description': 'Create unforgettable memories with our curated luxury experiences. From private yacht charters to exclusive cultural tours.', 'image_url': 'https://images.unsplash.com/photo-1544551763-46a013bb70d5?w=1920', 'link_url': '/services', 'position': 'home', 'display_order': 5, 'is_active': True, 'start_date': datetime.utcnow() - timedelta(days=15), 'end_date': datetime.utcnow() + timedelta(days=365)}] - for banner_data in banners_data: - new_banner = Banner(**banner_data) - db.add(new_banner) - print(f' ✓ Created banner: {banner_data['title']}') - db.commit() - print('✓ Banners seeded successfully!\n') - -def seed_company_info(db: Session): - print('Seeding company information...') - admin_user = db.query(User).filter(User.email == 'admin@hotel.com').first() - admin_id = admin_user.id if admin_user else None - company_settings = [{'key': 'company_name', 'value': 'Luxury Hotel', 'description': 'Company name displayed throughout the application'}, {'key': 'company_tagline', 'value': 'Experience Unparalleled Elegance', 'description': 'Company tagline or slogan'}, {'key': 'company_logo_url', 'value': '', 'description': 'URL to company logo image (upload via admin dashboard)'}, {'key': 'company_favicon_url', 'value': '', 'description': 'URL to company favicon image (upload via admin dashboard)'}, {'key': 'company_phone', 'value': '+1 (555) 123-4567', 'description': 'Company contact phone number'}, {'key': 'company_email', 'value': 'info@luxuryhotel.com', 'description': 'Company contact email address'}, {'key': 'company_address', 'value': '123 Luxury Avenue, Premium District, City 12345, Country', 'description': 'Company physical address'}, {'key': 'tax_rate', 'value': '10.0', 'description': 'Default tax rate percentage (e.g., 10.0 for 10%)'}, {'key': 'platform_currency', 'value': 'EUR', 'description': 'Platform-wide currency setting for displaying prices'}] - for setting_data in company_settings: - existing = db.query(SystemSettings).filter(SystemSettings.key == setting_data['key']).first() - if existing: - existing.value = setting_data['value'] - existing.description = setting_data['description'] - if admin_id: - existing.updated_by_id = admin_id - print(f' ✓ Updated setting: {setting_data['key']}') - else: - new_setting = SystemSettings(key=setting_data['key'], value=setting_data['value'], description=setting_data['description'], updated_by_id=admin_id) - db.add(new_setting) - print(f' ✓ Created setting: {setting_data['key']}') - db.commit() - print('✓ Company information seeded successfully!\n') - -def main(): - db: Session = SessionLocal() - try: - print('=' * 80) - print('SEEDING BANNERS AND COMPANY INFORMATION') - print('=' * 80) - print() - seed_banners(db) - seed_company_info(db) - print('=' * 80) - print('✓ All data seeded successfully!') - print('=' * 80) - except Exception as e: - db.rollback() - print(f'\n✗ Error seeding data: {e}') - import traceback - traceback.print_exc() - raise - finally: - db.close() -if __name__ == '__main__': - main() \ No newline at end of file diff --git a/Backend/seeds_data/seed_blog_posts.py b/Backend/seeds_data/seed_blog_posts.py deleted file mode 100644 index d836acc9..00000000 --- a/Backend/seeds_data/seed_blog_posts.py +++ /dev/null @@ -1,1262 +0,0 @@ -""" -Seed script for blog posts with sample data from Unsplash -Run this script to populate the database with sample blog posts -""" -import sys -import os -from pathlib import Path -sys.path.insert(0, str(Path(__file__).parent.parent)) -from sqlalchemy.orm import Session -from src.shared.config.database import SessionLocal -from src.models.blog import BlogPost -from src.models.user import User -from src.models.role import Role -from datetime import datetime, timedelta -import json - -# Sample blog posts with Unsplash images -BLOG_POSTS = [ - { - "title": "10 Essential Tips for a Perfect Hotel Stay", - "slug": "10-essential-tips-perfect-hotel-stay", - "excerpt": "Discover insider secrets to make your hotel experience unforgettable. From booking strategies to room selection, we share expert tips.", - "content": """ -

Introduction

-

Planning a hotel stay? Whether you're traveling for business or pleasure, these essential tips will help you make the most of your experience.

- -

1. Book Directly with the Hotel

-

Booking directly with the hotel often provides better rates, room upgrades, and exclusive perks. Plus, you'll have direct communication with the property.

- -

2. Join the Loyalty Program

-

Most hotels offer loyalty programs that provide points, discounts, and special benefits. Sign up before your stay to start earning rewards.

- -

3. Communicate Special Requests Early

-

Whether you need a late checkout, extra pillows, or have dietary restrictions, communicate your needs when booking or at least 24 hours before arrival.

- -

4. Check-In Online

-

Many hotels now offer online check-in, saving you time at the front desk. You can often select your room and receive your key digitally.

- -

5. Explore Hotel Amenities

-

Take advantage of hotel amenities like the spa, fitness center, pool, and restaurants. These are often included in your stay or available at discounted rates.

- -

6. Be Polite to Staff

-

A friendly attitude goes a long way. Hotel staff are more likely to help with special requests or upgrades if you're courteous and respectful.

- -

7. Use the Concierge

-

The concierge can provide local recommendations, make reservations, and help with transportation. They're a valuable resource for making your stay memorable.

- -

8. Review Your Bill

-

Before checking out, review your bill carefully. Check for any unexpected charges and ensure all services match what you received.

- -

9. Leave a Review

-

Share your experience by leaving a review. This helps future guests and provides valuable feedback to the hotel.

- -

10. Stay Connected

-

Follow the hotel on social media for special offers, events, and updates. You might discover exclusive deals or experiences.

- -

Conclusion

-

By following these tips, you'll enhance your hotel stay and create lasting memories. Remember, a great hotel experience is about more than just a comfortable bed—it's about the entire journey.

- """, - "featured_image": "https://images.unsplash.com/photo-1566073771259-6a8506099945?w=1200&h=800&fit=crop", - "tags": ["Travel Tips", "Hotel Guide", "Hospitality"], - "meta_title": "10 Essential Tips for a Perfect Hotel Stay | Luxury Hotel Blog", - "meta_description": "Discover expert tips for making your hotel stay unforgettable. From booking strategies to maximizing amenities, learn how to get the most from your hotel experience.", - "meta_keywords": "hotel tips, travel guide, hotel stay, hospitality, travel advice" - }, - { - "title": "The Art of Luxury Hospitality: What Sets Premium Hotels Apart", - "slug": "art-of-luxury-hospitality-premium-hotels", - "excerpt": "Explore the defining characteristics of luxury hotels and what makes them stand out in the hospitality industry.", - "content": """ -

Introduction

-

Luxury hospitality is an art form that goes beyond beautiful decor and premium amenities. It's about creating unforgettable experiences that touch every aspect of a guest's journey.

- -

Personalized Service

-

True luxury hotels excel at personalization. From remembering guest preferences to anticipating needs, personalized service creates a sense of being truly valued.

- -

Attention to Detail

-

Every element matters in luxury hospitality. From the thread count of sheets to the temperature of the pool, attention to detail ensures perfection at every turn.

- -

Exceptional Design

-

Luxury hotels are architectural and design masterpieces. They blend local culture with contemporary elegance, creating spaces that inspire and delight.

- -

World-Class Dining

-

Fine dining is a cornerstone of luxury hospitality. Award-winning restaurants, celebrity chefs, and exceptional culinary experiences define premium hotels.

- -

Exclusive Amenities

-

From private butlers to exclusive spa treatments, luxury hotels offer amenities that go beyond the ordinary, creating unique and memorable experiences.

- -

Conclusion

-

Luxury hospitality is about creating moments that guests will remember forever. It's the combination of exceptional service, attention to detail, and genuine care that sets premium hotels apart.

- """, - "featured_image": "https://images.unsplash.com/photo-1551882547-ff40c63fe5fa?w=1200&h=800&fit=crop", - "tags": ["Luxury", "Hospitality", "Premium"], - "meta_title": "The Art of Luxury Hospitality | Premium Hotel Features", - "meta_description": "Discover what makes luxury hotels exceptional. Learn about personalized service, attention to detail, and the elements that define premium hospitality.", - "meta_keywords": "luxury hotels, premium hospitality, luxury travel, hotel design, fine dining" - }, - { - "title": "Sustainable Tourism: How Hotels Are Going Green", - "slug": "sustainable-tourism-hotels-going-green", - "excerpt": "Learn how modern hotels are implementing sustainable practices to protect the environment while providing exceptional guest experiences.", - "content": """ -

Introduction

-

Sustainable tourism is no longer a trend—it's a necessity. Hotels worldwide are implementing eco-friendly practices to reduce their environmental impact while maintaining luxury standards.

- -

Energy Efficiency

-

Modern hotels are investing in renewable energy, LED lighting, and smart systems that reduce energy consumption without compromising guest comfort.

- -

Water Conservation

-

From low-flow fixtures to water recycling systems, hotels are finding innovative ways to conserve water while maintaining the luxury experience guests expect.

- -

Waste Reduction

-

Comprehensive recycling programs, composting, and reducing single-use plastics are becoming standard practices in environmentally conscious hotels.

- -

Local Sourcing

-

Supporting local communities through sourcing local products, hiring local staff, and preserving local culture benefits both the environment and the community.

- -

Green Certifications

-

Many hotels are pursuing green certifications like LEED and Green Key, demonstrating their commitment to sustainability and environmental responsibility.

- -

Guest Education

-

Hotels are educating guests about sustainable practices, encouraging participation in conservation efforts, and making it easy to make eco-friendly choices.

- -

Conclusion

-

Sustainable tourism is the future of hospitality. By choosing eco-friendly hotels, guests can enjoy luxury experiences while supporting environmental conservation.

- """, - "featured_image": "https://images.unsplash.com/photo-1470071459604-3b5ec3a7fe05?w=1200&h=800&fit=crop", - "tags": ["Sustainability", "Eco-Friendly", "Green Travel"], - "meta_title": "Sustainable Tourism: How Hotels Are Going Green", - "meta_description": "Discover how hotels are implementing sustainable practices to protect the environment while providing exceptional guest experiences.", - "meta_keywords": "sustainable tourism, eco-friendly hotels, green travel, environmental conservation, sustainable hospitality" - }, - { - "title": "The Ultimate Guide to Hotel Room Types", - "slug": "ultimate-guide-hotel-room-types", - "excerpt": "Navigate the world of hotel accommodations with our comprehensive guide to different room types and what to expect from each.", - "content": """ -

Introduction

-

Understanding hotel room types can help you choose the perfect accommodation for your needs and budget. Here's your guide to navigating hotel room categories.

- -

Standard Rooms

-

Standard rooms are the most basic accommodation, typically featuring a bed, bathroom, and essential amenities. Perfect for short stays or budget-conscious travelers.

- -

Deluxe Rooms

-

Deluxe rooms offer more space and upgraded amenities. They often feature better views, larger bathrooms, and additional seating areas.

- -

Suites

-

Suites provide separate living and sleeping areas, making them ideal for longer stays or guests who need extra space for work or relaxation.

- -

Presidential Suites

-

The pinnacle of hotel accommodations, presidential suites offer multiple rooms, premium amenities, and often include butler service and exclusive access.

- -

Specialty Rooms

-

Many hotels offer specialty rooms like honeymoon suites, family rooms, or themed accommodations designed for specific guest needs or occasions.

- -

Choosing the Right Room

-

Consider your needs: space requirements, view preferences, length of stay, and budget. Don't hesitate to contact the hotel directly for recommendations.

- -

Conclusion

-

Understanding room types helps you make informed decisions and ensures you get the accommodation that best suits your travel needs and preferences.

- """, - "featured_image": "https://images.unsplash.com/photo-1631049307264-da0ec9d70304?w=1200&h=800&fit=crop", - "tags": ["Hotel Guide", "Accommodation", "Travel Tips"], - "meta_title": "The Ultimate Guide to Hotel Room Types | Choose Your Perfect Room", - "meta_description": "Learn about different hotel room types and find the perfect accommodation for your needs. From standard rooms to presidential suites, we cover it all.", - "meta_keywords": "hotel rooms, room types, hotel accommodation, suites, travel guide" - }, - { - "title": "Wellness Tourism: Hotels as Health and Wellness Destinations", - "slug": "wellness-tourism-hotels-health-destinations", - "excerpt": "Discover how hotels are transforming into wellness destinations, offering comprehensive health and wellness programs for modern travelers.", - "content": """ -

Introduction

-

Wellness tourism is one of the fastest-growing segments in travel. Hotels are responding by creating comprehensive wellness programs that address physical, mental, and spiritual well-being.

- -

State-of-the-Art Spas

-

Modern hotel spas offer more than massages. They provide holistic treatments, thermal experiences, and wellness consultations tailored to individual needs.

- -

Fitness and Movement

-

From fully equipped gyms to yoga studios and personal training, hotels are making it easy for guests to maintain their fitness routines while traveling.

- -

Healthy Dining Options

-

Wellness-focused hotels offer nutritious menus, dietary accommodations, and nutritionist consultations, making healthy eating effortless during your stay.

- -

Mindfulness and Meditation

-

Many hotels now offer meditation spaces, mindfulness programs, and stress-reduction activities to help guests find balance and peace.

- -

Outdoor Activities

-

Wellness hotels often provide access to nature, outdoor activities, and adventure experiences that promote physical activity and connection with the environment.

- -

Sleep Optimization

-

Recognizing the importance of rest, wellness hotels focus on sleep quality with premium bedding, blackout curtains, and sleep enhancement programs.

- -

Conclusion

-

Wellness tourism represents a shift toward holistic travel experiences. Hotels that embrace this trend are creating spaces where guests can truly rejuvenate and restore.

- """, - "featured_image": "https://images.unsplash.com/photo-1544161515-4ab6ce6db874?w=1200&h=800&fit=crop", - "tags": ["Wellness", "Health", "Spa", "Fitness"], - "meta_title": "Wellness Tourism: Hotels as Health and Wellness Destinations", - "meta_description": "Explore how hotels are becoming wellness destinations, offering comprehensive health and wellness programs for modern travelers seeking balance and rejuvenation.", - "meta_keywords": "wellness tourism, health travel, spa hotels, wellness retreats, fitness travel" - }, - { - "title": "Technology in Modern Hotels: Enhancing the Guest Experience", - "slug": "technology-modern-hotels-enhancing-guest-experience", - "excerpt": "Explore how cutting-edge technology is revolutionizing the hotel industry and creating seamless, personalized guest experiences.", - "content": """ -

Introduction

-

Technology is transforming the hotel industry, making stays more convenient, personalized, and enjoyable. From mobile check-in to smart room controls, innovation is everywhere.

- -

Mobile Check-In and Keyless Entry

-

Guests can now check in via mobile apps and use their smartphones as room keys, eliminating wait times and providing instant access to their rooms.

- -

Smart Room Controls

-

Voice-activated assistants and smart controls allow guests to adjust lighting, temperature, and entertainment systems with simple commands or mobile apps.

- -

Personalized Recommendations

-

AI-powered systems analyze guest preferences to provide personalized recommendations for dining, activities, and services, enhancing the overall experience.

- -

Contactless Services

-

From contactless payments to digital menus and virtual concierge services, hotels are reducing physical contact while maintaining high service standards.

- -

Virtual Reality and Augmented Reality

-

Some hotels are using VR and AR to provide virtual tours, immersive experiences, and enhanced wayfinding, helping guests explore and navigate properties.

- -

Data Analytics

-

Hotels use data analytics to understand guest behavior, optimize operations, and predict needs, ensuring every stay is better than the last.

- -

Conclusion

-

Technology in hotels is about enhancing human connection, not replacing it. The best hotels use technology to free up staff to provide more personalized, meaningful service.

- """, - "featured_image": "https://images.unsplash.com/photo-1517245386807-bb43f82c33c4?w=1200&h=800&fit=crop", - "tags": ["Technology", "Innovation", "Smart Hotels"], - "meta_title": "Technology in Modern Hotels: Enhancing Guest Experience", - "meta_description": "Discover how cutting-edge technology is revolutionizing hotels, from mobile check-in to smart room controls and AI-powered personalization.", - "meta_keywords": "hotel technology, smart hotels, mobile check-in, hotel innovation, tech travel" - }, - { - "title": "The Ultimate Guide to Hotel Amenities: What to Expect", - "slug": "ultimate-guide-hotel-amenities-what-to-expect", - "excerpt": "From spas to fitness centers, discover the essential amenities that make a hotel stay memorable and how to make the most of them.", - "content": """ -

Introduction

-

Modern hotels offer an impressive array of amenities designed to enhance your stay. Understanding what's available can help you choose the perfect hotel and maximize your experience.

- -

Spa and Wellness Facilities

-

Luxury hotels often feature world-class spas offering massages, facials, and holistic treatments. These facilities provide relaxation and rejuvenation during your stay.

- -

Fitness Centers

-

State-of-the-art fitness centers with modern equipment allow you to maintain your workout routine while traveling. Many hotels also offer personal training and group classes.

- -

Swimming Pools

-

From rooftop infinity pools to heated indoor pools, swimming facilities provide relaxation and recreation. Some hotels offer poolside service and cabanas for ultimate comfort.

- -

Dining Options

-

Fine dining restaurants, casual cafes, room service, and bars create diverse culinary experiences. Many hotels feature award-winning chefs and unique dining concepts.

- -

Business Facilities

-

Business centers, meeting rooms, and conference facilities cater to corporate travelers. High-speed internet and printing services ensure productivity.

- -

Concierge Services

-

Professional concierge teams can arrange restaurant reservations, transportation, tickets, and local experiences, making your stay seamless and memorable.

- -

Conclusion

-

Hotel amenities significantly enhance your stay. Research available amenities when booking to ensure your hotel meets all your needs and preferences.

- """, - "featured_image": "https://images.unsplash.com/photo-1540541338287-41700207dee6?w=1200&h=800&fit=crop", - "tags": ["Amenities", "Hotel Guide", "Luxury"], - "meta_title": "The Ultimate Guide to Hotel Amenities | What to Expect", - "meta_description": "Discover essential hotel amenities from spas to fitness centers. Learn what to expect and how to make the most of your hotel stay.", - "meta_keywords": "hotel amenities, spa, fitness center, hotel facilities, luxury amenities" - }, - { - "title": "Business Travel Tips: Making the Most of Your Hotel Stay", - "slug": "business-travel-tips-making-most-hotel-stay", - "excerpt": "Essential strategies for business travelers to maximize productivity, comfort, and efficiency during hotel stays.", - "content": """ -

Introduction

-

Business travel requires efficiency and comfort. These tips will help you make the most of your hotel stay while maintaining productivity and well-being.

- -

Choose the Right Location

-

Select hotels close to your meetings or with excellent transportation links. This saves time and reduces stress during your business trip.

- -

Leverage Business Services

-

Take advantage of business centers, meeting rooms, and high-speed internet. Many hotels offer complimentary business services for corporate guests.

- -

Maintain Your Routine

-

Use hotel fitness centers to maintain your exercise routine. Regular workouts help manage stress and maintain energy levels during business trips.

- -

Optimize Your Room

-

Request a quiet room away from elevators and high-traffic areas. Ensure your room has adequate workspace and lighting for productivity.

- -

Use Concierge Services

-

Hotel concierges can handle restaurant reservations, transportation, and local recommendations, freeing your time for business matters.

- -

Join Loyalty Programs

-

Business travelers benefit significantly from hotel loyalty programs, earning points, upgrades, and exclusive perks that enhance every stay.

- -

Conclusion

-

Strategic planning and utilizing hotel services can transform business travel from stressful to seamless, allowing you to focus on your work.

- """, - "featured_image": "https://images.unsplash.com/photo-1497366216548-37526070297c?w=1200&h=800&fit=crop", - "tags": ["Business Travel", "Travel Tips", "Productivity"], - "meta_title": "Business Travel Tips: Making the Most of Your Hotel Stay", - "meta_description": "Essential strategies for business travelers to maximize productivity and comfort during hotel stays. Tips for efficient business travel.", - "meta_keywords": "business travel, corporate travel, hotel business services, travel productivity, business tips" - }, - { - "title": "Family-Friendly Hotels: What to Look For", - "slug": "family-friendly-hotels-what-to-look-for", - "excerpt": "Discover the essential features and amenities that make hotels perfect for families traveling with children.", - "content": """ -

Introduction

-

Traveling with family requires special considerations. Family-friendly hotels offer amenities and services designed to make stays comfortable and enjoyable for all ages.

- -

Family Room Options

-

Look for hotels offering family rooms, suites, or connecting rooms. These provide space for everyone and often include extra beds or pull-out sofas.

- -

Kid-Friendly Amenities

-

Children's programs, kids' clubs, playgrounds, and game rooms keep young guests entertained. Some hotels offer babysitting services for parents' peace of mind.

- -

Dining Options

-

Family-friendly hotels provide children's menus, flexible dining times, and room service options. Buffet breakfasts are particularly convenient for families.

- -

Safety Features

-

Safety is paramount. Look for hotels with pool safety measures, childproofing options, and secure room access. Ground-floor rooms or rooms near elevators can be safer for families.

- -

Entertainment Facilities

-

Pools, game rooms, and outdoor spaces provide entertainment for children while allowing parents to relax. Some hotels offer family activities and events.

- -

Location Considerations

-

Choose hotels near family attractions, parks, or beaches. Easy access to activities reduces travel time and keeps children engaged.

- -

Conclusion

-

Family-friendly hotels create memorable experiences for all family members. Research and choose hotels that cater specifically to families for the best experience.

- """, - "featured_image": "https://images.unsplash.com/photo-1506905925346-21bda4d32df4?w=1200&h=800&fit=crop", - "tags": ["Family Travel", "Family Hotels", "Travel Tips"], - "meta_title": "Family-Friendly Hotels: What to Look For | Family Travel Guide", - "meta_description": "Discover essential features that make hotels perfect for families. Learn what to look for when booking family-friendly accommodations.", - "meta_keywords": "family hotels, family travel, kid-friendly hotels, family accommodations, travel with children" - }, - { - "title": "Romantic Getaways: Choosing the Perfect Hotel", - "slug": "romantic-getaways-choosing-perfect-hotel", - "excerpt": "Create unforgettable romantic experiences with our guide to selecting hotels perfect for couples and special occasions.", - "content": """ -

Introduction

-

Romantic getaways require special attention to detail. The right hotel can transform a trip into an unforgettable romantic experience.

- -

Intimate Settings

-

Look for hotels with intimate atmospheres, private balconies, and romantic room designs. Boutique hotels often excel at creating romantic environments.

- -

Special Packages

-

Many hotels offer romantic packages including champagne, flowers, couples' spa treatments, and special dining experiences. These packages add magic to your stay.

- -

Scenic Locations

-

Hotels with stunning views, beachfront locations, or mountain settings create romantic backdrops. Sunsets and scenic vistas enhance the romantic atmosphere.

- -

Fine Dining

-

Romantic restaurants with candlelit dinners, private dining options, and exceptional cuisine create memorable experiences. Room service can also be romantic.

- -

Spa and Wellness

-

Couples' spa treatments, private hot tubs, and wellness facilities provide relaxation and connection. Many hotels offer romantic spa packages.

- -

Privacy and Seclusion

-

Private villas, secluded rooms, and adults-only areas ensure privacy and intimacy. These features are essential for romantic getaways.

- -

Conclusion

-

The perfect romantic hotel combines beautiful settings, intimate atmosphere, and thoughtful amenities to create unforgettable moments for couples.

- """, - "featured_image": "https://images.unsplash.com/photo-1520250497591-112f2f40a3f4?w=1200&h=800&fit=crop", - "tags": ["Romantic", "Couples", "Getaways"], - "meta_title": "Romantic Getaways: Choosing the Perfect Hotel for Couples", - "meta_description": "Create unforgettable romantic experiences with our guide to selecting hotels perfect for couples and special occasions.", - "meta_keywords": "romantic hotels, couples travel, romantic getaways, honeymoon hotels, romantic destinations" - }, - { - "title": "Hotel Booking Strategies: Getting the Best Deals", - "slug": "hotel-booking-strategies-getting-best-deals", - "excerpt": "Master the art of hotel booking with insider tips and strategies to secure the best rates and exclusive deals.", - "content": """ -

Introduction

-

Smart booking strategies can save significant money while securing better rooms and amenities. Learn the secrets to getting the best hotel deals.

- -

Book Directly

-

Booking directly with hotels often provides better rates, room upgrades, and exclusive perks not available through third-party sites.

- -

Flexible Dates

-

Flexibility with travel dates can result in substantial savings. Mid-week stays and off-peak seasons typically offer better rates.

- -

Join Loyalty Programs

-

Hotel loyalty programs provide points, discounts, and member-exclusive rates. Frequent travelers benefit significantly from these programs.

- -

Last-Minute Deals

-

Hotels often offer last-minute deals to fill empty rooms. If you're flexible, these can provide excellent value.

- -

Package Deals

-

Bundling hotel stays with flights or activities can result in savings. Compare package prices with individual bookings.

- -

Negotiate

-

Don't hesitate to call hotels directly and negotiate rates, especially for longer stays or group bookings. Hotels often have flexibility.

- -

Conclusion

-

Strategic booking approaches can significantly reduce costs while enhancing your hotel experience. Combine multiple strategies for maximum savings.

- """, - "featured_image": "https://images.unsplash.com/photo-1559526324-4b87b5e36e44?w=1200&h=800&fit=crop", - "tags": ["Booking Tips", "Travel Deals", "Savings"], - "meta_title": "Hotel Booking Strategies: Getting the Best Deals and Rates", - "meta_description": "Master hotel booking with insider tips to secure the best rates, exclusive deals, and room upgrades.", - "meta_keywords": "hotel deals, booking tips, hotel discounts, travel savings, best hotel rates" - }, - { - "title": "The History of Luxury Hospitality", - "slug": "history-luxury-hospitality", - "excerpt": "Explore the evolution of luxury hospitality from ancient inns to modern five-star hotels and what defines true luxury.", - "content": """ -

Introduction

-

Luxury hospitality has evolved dramatically over centuries, from simple inns to today's sophisticated five-star establishments. Understanding this history enriches our appreciation of modern luxury.

- -

Ancient Origins

-

Hospitality dates back to ancient civilizations where travelers found shelter in inns and guesthouses. These early establishments laid the foundation for modern hospitality.

- -

Grand Hotels Era

-

The 19th century saw the rise of grand hotels in Europe and America. These magnificent establishments set new standards for luxury, service, and architecture.

- -

Modern Luxury

-

Today's luxury hotels combine traditional elegance with modern amenities, technology, and personalized service. The definition of luxury continues to evolve.

- -

Iconic Properties

-

Legendary hotels like The Ritz, The Savoy, and The Plaza have become symbols of luxury hospitality, setting benchmarks for excellence worldwide.

- -

Contemporary Trends

-

Modern luxury emphasizes experiences, sustainability, wellness, and personalization. Hotels adapt to changing guest expectations while maintaining timeless elegance.

- -

Conclusion

-

The history of luxury hospitality reflects our evolving understanding of comfort, service, and elegance. Today's luxury hotels honor tradition while embracing innovation.

- """, - "featured_image": "https://images.unsplash.com/photo-1564501049412-61c2a3083791?w=1200&h=800&fit=crop", - "tags": ["History", "Luxury", "Hospitality"], - "meta_title": "The History of Luxury Hospitality: From Ancient Inns to Modern Hotels", - "meta_description": "Explore the evolution of luxury hospitality from ancient inns to modern five-star hotels and what defines true luxury.", - "meta_keywords": "hotel history, luxury hospitality history, grand hotels, hospitality evolution, luxury travel history" - }, - { - "title": "Hotel Etiquette: Do's and Don'ts for Guests", - "slug": "hotel-etiquette-dos-donts-guests", - "excerpt": "Master proper hotel etiquette to ensure a pleasant stay for yourself and other guests while respecting hotel staff and property.", - "content": """ -

Introduction

-

Proper hotel etiquette ensures pleasant experiences for everyone. Understanding expected behavior helps create positive interactions with staff and fellow guests.

- -

Check-In and Check-Out

-

Arrive on time for check-in and respect check-out times. Be patient and courteous with front desk staff, especially during busy periods.

- -

Room Behavior

-

Keep noise levels reasonable, especially during quiet hours. Respect room capacity limits and treat hotel property with care.

- -

Staff Interactions

-

Treat all hotel staff with respect and kindness. A friendly attitude often results in better service and assistance with special requests.

- -

Common Areas

-

Respect shared spaces like lobbies, pools, and restaurants. Follow dress codes, keep areas clean, and be mindful of other guests.

- -

Tipping Guidelines

-

Tip housekeeping, bellhops, and concierge staff appropriately. Tipping shows appreciation for good service and is standard practice.

- -

Special Requests

-

Make special requests in advance when possible. Be reasonable and understanding if requests cannot be accommodated.

- -

Conclusion

-

Good hotel etiquette creates positive experiences for everyone. Simple courtesy and respect go a long way in ensuring pleasant stays.

- """, - "featured_image": "https://images.unsplash.com/photo-1571896349842-33c89424de2d?w=1200&h=800&fit=crop", - "tags": ["Etiquette", "Travel Tips", "Guest Guide"], - "meta_title": "Hotel Etiquette: Do's and Don'ts for Hotel Guests", - "meta_description": "Master proper hotel etiquette to ensure pleasant stays. Learn do's and don'ts for interacting with staff and other guests.", - "meta_keywords": "hotel etiquette, guest etiquette, travel etiquette, hotel manners, guest behavior" - }, - { - "title": "Boutique Hotels vs. Chain Hotels: Which is Right for You?", - "slug": "boutique-hotels-vs-chain-hotels-which-right-for-you", - "excerpt": "Compare boutique and chain hotels to determine which type best suits your travel style, preferences, and needs.", - "content": """ -

Introduction

-

Choosing between boutique and chain hotels depends on your preferences, travel style, and priorities. Each offers distinct advantages.

- -

Boutique Hotels

-

Boutique hotels offer unique character, personalized service, and distinctive design. They provide intimate experiences and local flavor, perfect for travelers seeking authenticity.

- -

Chain Hotels

-

Chain hotels provide consistency, loyalty programs, and predictable experiences. They're ideal for business travelers and those who value reliability and familiarity.

- -

Service Comparison

-

Boutique hotels excel in personalized, attentive service, while chains offer standardized, efficient service. Choose based on your preference for customization vs. consistency.

- -

Amenities and Facilities

-

Chain hotels typically offer extensive amenities and facilities, while boutiques focus on curated, high-quality experiences. Consider what matters most to you.

- -

Location and Design

-

Boutique hotels often feature unique, locally-inspired designs in interesting neighborhoods. Chains provide familiar layouts in convenient, predictable locations.

- -

Value and Pricing

-

Both can offer excellent value. Boutiques provide unique experiences, while chains offer loyalty rewards and package deals. Compare based on total value, not just price.

- -

Conclusion

-

The best choice depends on your priorities. Boutiques offer uniqueness and character, while chains provide consistency and rewards. Consider your travel style and needs.

- """, - "featured_image": "https://images.unsplash.com/photo-1551882547-ff40c63fe5fa?w=1200&h=800&fit=crop", - "tags": ["Hotel Types", "Travel Guide", "Comparison"], - "meta_title": "Boutique Hotels vs. Chain Hotels: Which is Right for You?", - "meta_description": "Compare boutique and chain hotels to determine which type best suits your travel style, preferences, and needs.", - "meta_keywords": "boutique hotels, chain hotels, hotel comparison, hotel types, travel guide" - }, - { - "title": "Accessibility in Hotels: Ensuring Comfortable Stays for All", - "slug": "accessibility-hotels-ensuring-comfortable-stays-all", - "excerpt": "Learn about hotel accessibility features and how to ensure comfortable, accessible stays for guests with disabilities.", - "content": """ -

Introduction

-

Accessible hotels ensure comfortable stays for all guests. Understanding accessibility features helps travelers with disabilities find suitable accommodations.

- -

Accessible Rooms

-

Accessible rooms feature wider doorways, roll-in showers, grab bars, and lower fixtures. These rooms meet ADA standards and provide comfort and safety.

- -

Common Areas

-

Accessible hotels provide ramps, elevators, and accessible paths throughout. Restaurants, pools, and facilities should be accessible to all guests.

- -

Communication Access

-

Hotels should offer visual alarms, TTY devices, and staff trained in sign language or communication assistance for guests with hearing impairments.

- -

Service Animals

-

Hotels must accommodate service animals. Understanding policies and communicating needs ensures smooth stays for guests with service animals.

- -

Booking Considerations

-

When booking, specify accessibility needs clearly. Contact hotels directly to confirm specific features and ensure your requirements are met.

- -

Staff Training

-

Well-trained staff understand accessibility needs and can assist effectively. Choose hotels known for excellent accessibility service.

- -

Conclusion

-

Accessible hotels create inclusive experiences for all guests. Research and communicate needs to ensure comfortable, accessible stays.

- """, - "featured_image": "https://images.unsplash.com/photo-1522771739844-6a9f6d5f14af?w=1200&h=800&fit=crop", - "tags": ["Accessibility", "Inclusive Travel", "Guest Services"], - "meta_title": "Accessibility in Hotels: Ensuring Comfortable Stays for All Guests", - "meta_description": "Learn about hotel accessibility features and how to ensure comfortable, accessible stays for guests with disabilities.", - "meta_keywords": "accessible hotels, hotel accessibility, disability travel, accessible accommodations, inclusive travel" - }, - { - "title": "Hotel Security: Staying Safe During Your Stay", - "slug": "hotel-security-staying-safe-during-stay", - "excerpt": "Essential security tips and practices to ensure your safety and protect your belongings during hotel stays.", - "content": """ -

Introduction

-

Hotel security is a shared responsibility between guests and hotels. Following security best practices ensures safe, worry-free stays.

- -

Room Security

-

Always lock your room door and use deadbolts. Never leave doors propped open, and verify room numbers before entering. Use room safes for valuables.

- -

Valuables Protection

-

Use in-room safes for passports, jewelry, and electronics. Don't leave valuables unattended in public areas. Consider hotel safety deposit boxes for important items.

- -

Personal Information

-

Protect personal information. Be cautious with Wi-Fi networks, and avoid sharing room numbers publicly. Use secure payment methods.

- -

Hotel Facilities

-

Be aware of your surroundings in common areas. Use well-lit paths, and don't hesitate to ask hotel staff for assistance or security escorts.

- -

Emergency Procedures

-

Familiarize yourself with emergency exits and procedures. Know the location of fire exits and emergency contact information.

- -

Trust Your Instincts

-

If something feels wrong, trust your instincts. Report suspicious activity to hotel security immediately. Your safety is the priority.

- -

Conclusion

-

Following security best practices ensures safe hotel stays. Stay vigilant, use available security features, and communicate concerns to hotel staff.

- """, - "featured_image": "https://images.unsplash.com/photo-1557804506-669a67965ba0?w=1200&h=800&fit=crop", - "tags": ["Security", "Safety", "Travel Tips"], - "meta_title": "Hotel Security: Staying Safe During Your Stay | Safety Tips", - "meta_description": "Essential security tips and practices to ensure your safety and protect your belongings during hotel stays.", - "meta_keywords": "hotel security, travel safety, hotel safety tips, guest security, travel security" - }, - { - "title": "Pet-Friendly Hotels: Traveling with Your Furry Friends", - "slug": "pet-friendly-hotels-traveling-furry-friends", - "excerpt": "Discover how to find and enjoy pet-friendly hotels that welcome your four-legged companions with open arms.", - "content": """ -

Introduction

-

Traveling with pets requires special planning. Pet-friendly hotels make it possible to bring your furry friends along, ensuring everyone enjoys the trip.

- -

Finding Pet-Friendly Hotels

-

Research hotels that explicitly welcome pets. Check policies regarding size limits, breed restrictions, and number of pets allowed per room.

- -

Pet Amenities

-

Many pet-friendly hotels offer special amenities like pet beds, bowls, treats, and walking services. Some even have pet spas and play areas.

- -

Pet Fees and Policies

-

Understand pet fees, which can vary significantly. Some hotels charge per night, while others have flat fees. Review cancellation policies for pet-related issues.

- -

Pet Etiquette

-

Keep pets leashed in common areas, clean up after them, and respect other guests. Don't leave pets unattended in rooms for extended periods.

- -

Preparing Your Pet

-

Bring familiar items like beds and toys. Ensure pets are well-behaved and up-to-date on vaccinations. Bring necessary documentation.

- -

Local Pet Services

-

Research nearby veterinarians, pet stores, and dog parks. Hotels in pet-friendly areas often provide recommendations and assistance.

- -

Conclusion

-

Pet-friendly hotels make traveling with pets enjoyable. Research thoroughly, follow policies, and be considerate to ensure positive experiences for all.

- """, - "featured_image": "https://images.unsplash.com/photo-1601758228041-f3b2795255f1?w=1200&h=800&fit=crop", - "tags": ["Pet Travel", "Pet-Friendly", "Travel Tips"], - "meta_title": "Pet-Friendly Hotels: Traveling with Your Furry Friends", - "meta_description": "Discover how to find and enjoy pet-friendly hotels that welcome your four-legged companions with open arms.", - "meta_keywords": "pet-friendly hotels, traveling with pets, pet travel, dog-friendly hotels, pet accommodations" - }, - { - "title": "Hotel Concierge Services: Maximizing Your Experience", - "slug": "hotel-concierge-services-maximizing-experience", - "excerpt": "Learn how to leverage hotel concierge services to enhance your stay with local insights, reservations, and personalized assistance.", - "content": """ -

Introduction

-

Hotel concierges are valuable resources for enhancing your stay. Understanding how to work with them unlocks local expertise and exclusive access.

- -

What Concierges Offer

-

Concierges provide restaurant reservations, event tickets, transportation, local recommendations, and assistance with special requests. They're your local experts.

- -

Restaurant Reservations

-

Concierges often have relationships with popular restaurants, securing tables at hard-to-book establishments. They know the best local dining options.

- -

Local Insights

-

Tap into concierges' local knowledge for hidden gems, cultural experiences, and authentic recommendations beyond tourist guides.

- -

Special Occasions

-

Concierges excel at arranging special occasions—anniversaries, proposals, birthdays. They coordinate flowers, cakes, decorations, and surprises.

- -

Transportation and Logistics

-

From airport transfers to car rentals and private drivers, concierges handle transportation needs efficiently and reliably.

- -

Building Relationships

-

Building rapport with concierges through courtesy and clear communication often results in better service and special considerations.

- -

Conclusion

-

Concierge services transform hotel stays into exceptional experiences. Don't hesitate to utilize their expertise and connections.

- """, - "featured_image": "https://images.unsplash.com/photo-1558618666-fcd25c85cd64?w=1200&h=800&fit=crop", - "tags": ["Concierge", "Guest Services", "Travel Tips"], - "meta_title": "Hotel Concierge Services: Maximizing Your Experience", - "meta_description": "Learn how to leverage hotel concierge services to enhance your stay with local insights, reservations, and personalized assistance.", - "meta_keywords": "hotel concierge, concierge services, guest services, travel assistance, hotel services" - }, - { - "title": "Seasonal Hotel Stays: Best Times to Visit", - "slug": "seasonal-hotel-stays-best-times-visit", - "excerpt": "Discover the advantages of different seasons for hotel stays and how timing affects rates, crowds, and experiences.", - "content": """ -

Introduction

-

Timing your hotel stay can significantly impact your experience, costs, and enjoyment. Understanding seasonal patterns helps you choose the perfect time to visit.

- -

Peak Season

-

Peak seasons offer ideal weather and full amenities but come with higher prices and crowds. Book well in advance and expect premium rates.

- -

Shoulder Season

-

Shoulder seasons provide a balance of good weather, reasonable prices, and fewer crowds. These periods often offer the best value and experience.

- -

Off-Season Benefits

-

Off-season travel offers significant savings, fewer crowds, and more personalized service. Some amenities may be limited, but value is exceptional.

- -

Weather Considerations

-

Research destination weather patterns. Some locations are beautiful year-round, while others have distinct seasons affecting activities and experiences.

- -

Special Events

-

Consider local festivals, holidays, and events. These can enhance experiences but also increase prices and require early booking.

- -

Business vs. Leisure

-

Business travelers may prefer off-peak times for better rates and availability. Leisure travelers can choose based on weather and activities.

- -

Conclusion

-

Choosing the right season balances your priorities—weather, budget, crowds, and experiences. Research thoroughly to find your ideal timing.

- """, - "featured_image": "https://images.unsplash.com/photo-1506905925346-21bda4d32df4?w=1200&h=800&fit=crop", - "tags": ["Travel Planning", "Seasonal Travel", "Travel Tips"], - "meta_title": "Seasonal Hotel Stays: Best Times to Visit | Travel Planning", - "meta_description": "Discover the advantages of different seasons for hotel stays and how timing affects rates, crowds, and experiences.", - "meta_keywords": "seasonal travel, best time to travel, travel seasons, hotel booking seasons, travel planning" - }, - { - "title": "Hotel Loyalty Programs: Maximizing Rewards", - "slug": "hotel-loyalty-programs-maximizing-rewards", - "excerpt": "Unlock the full potential of hotel loyalty programs with strategies to earn points, achieve elite status, and redeem rewards effectively.", - "content": """ -

Introduction

-

Hotel loyalty programs offer significant value for frequent travelers. Understanding how to maximize these programs enhances every stay with rewards and perks.

- -

Choosing the Right Program

-

Select programs aligned with your travel patterns. Consider hotel locations, frequency of travel, and program benefits that matter most to you.

- -

Earning Points

-

Maximize point earning through direct bookings, credit card partnerships, and promotional offers. Some programs offer bonus points for specific activities.

- -

Elite Status Benefits

-

Elite status provides room upgrades, late checkout, breakfast, and lounge access. Focus on one program to achieve status faster.

- -

Point Redemption

-

Redeem points strategically for maximum value. Award nights, upgrades, and experiences offer different redemption values—choose wisely.

- -

Credit Card Partnerships

-

Hotel-branded credit cards accelerate point earning and provide automatic elite status. Evaluate annual fees against benefits received.

- -

Promotions and Bonuses

-

Take advantage of promotions, bonus point offers, and special events. Sign up for program emails to stay informed about opportunities.

- -

Conclusion

-

Strategic participation in loyalty programs provides substantial value. Focus, be consistent, and leverage all available benefits for maximum rewards.

- """, - "featured_image": "https://images.unsplash.com/photo-1556742049-0cfed4f6a45d?w=1200&h=800&fit=crop", - "tags": ["Loyalty Programs", "Travel Rewards", "Travel Tips"], - "meta_title": "Hotel Loyalty Programs: Maximizing Rewards and Benefits", - "meta_description": "Unlock the full potential of hotel loyalty programs with strategies to earn points, achieve elite status, and redeem rewards effectively.", - "meta_keywords": "hotel loyalty programs, travel rewards, points programs, hotel rewards, loyalty benefits" - }, - { - "title": "Hotel Room Service: A Complete Guide", - "slug": "hotel-room-service-complete-guide", - "excerpt": "Navigate hotel room service menus, etiquette, and tips to enjoy convenient dining in the comfort of your room.", - "content": """ -

Introduction

-

Room service offers convenience and privacy, allowing guests to dine in their rooms. Understanding how to use this service enhances your hotel experience.

- -

Menu Options

-

Room service menus range from simple snacks to full meals. Many hotels offer 24-hour service with diverse options to suit different tastes and times.

- -

Ordering Process

-

Order through phone, in-room tablets, or hotel apps. Specify delivery time, special requests, and dietary requirements when ordering.

- -

Pricing Considerations

-

Room service typically includes service charges and delivery fees. Prices are often higher than restaurant dining, but convenience may justify the cost.

- -

Timing Your Orders

-

Order during off-peak hours for faster service. Breakfast orders placed the night before ensure timely morning delivery.

- -

Special Requests

-

Hotels accommodate dietary restrictions, allergies, and special requests. Communicate needs clearly when ordering for best results.

- -

Tipping Etiquette

-

Tip room service staff appropriately, typically 15-20% of the bill. Some hotels include service charges, but additional tips are appreciated.

- -

Conclusion

-

Room service provides convenient dining options. Understanding menus, ordering processes, and etiquette ensures enjoyable experiences.

- """, - "featured_image": "https://images.unsplash.com/photo-1555396273-367ea4eb4db5?w=1200&h=800&fit=crop", - "tags": ["Room Service", "Dining", "Hotel Services"], - "meta_title": "Hotel Room Service: A Complete Guide to In-Room Dining", - "meta_description": "Navigate hotel room service menus, etiquette, and tips to enjoy convenient dining in the comfort of your room.", - "meta_keywords": "room service, hotel dining, in-room dining, hotel food service, room service guide" - }, - { - "title": "Extended Stay Hotels: Living in Comfort", - "slug": "extended-stay-hotels-living-comfort", - "excerpt": "Discover the benefits of extended stay hotels for long-term travel, relocations, and temporary housing needs.", - "content": """ -

Introduction

-

Extended stay hotels provide comfortable, convenient accommodations for longer visits. These properties are designed specifically for guests staying weeks or months.

- -

Apartment-Style Living

-

Extended stay hotels offer apartment-like rooms with kitchens, living areas, and separate bedrooms. These features make long stays comfortable and practical.

- -

Cost Effectiveness

-

Extended stay rates are typically lower than traditional hotels for longer periods. Weekly and monthly rates provide significant savings.

- -

Home-Like Amenities

-

Full kitchens, laundry facilities, and larger spaces create home-like environments. These amenities are essential for comfortable extended stays.

- -

Location Benefits

-

Extended stay hotels are often located near business districts, hospitals, or universities, providing convenient access for work or study.

- -

Flexible Stays

-

Flexible booking options accommodate changing schedules. Many properties offer month-to-month arrangements without long-term commitments.

- -

Services and Support

-

Housekeeping, maintenance, and front desk services provide support while maintaining independence. Balance of service and privacy is key.

- -

Conclusion

-

Extended stay hotels bridge the gap between hotels and apartments, offering comfort and convenience for longer visits.

- """, - "featured_image": "https://images.unsplash.com/photo-1522708323590-d24dbb6b0267?w=1200&h=800&fit=crop", - "tags": ["Extended Stay", "Long-Term Travel", "Accommodation"], - "meta_title": "Extended Stay Hotels: Living in Comfort for Long-Term Travel", - "meta_description": "Discover the benefits of extended stay hotels for long-term travel, relocations, and temporary housing needs.", - "meta_keywords": "extended stay hotels, long-term hotels, temporary housing, relocation hotels, monthly hotels" - }, - { - "title": "Hotel Photography: Capturing Your Stay", - "slug": "hotel-photography-capturing-your-stay", - "excerpt": "Tips and techniques for taking stunning photos of your hotel stay to preserve memories and share experiences.", - "content": """ -

Introduction

-

Hotel photography preserves memories and shares experiences. Whether for personal keepsakes or social media, great photos enhance your travel documentation.

- -

Room Photography

-

Capture rooms in natural light, showing key features and ambiance. Include details like views, amenities, and design elements that make the room special.

- -

Common Areas

-

Photograph lobbies, restaurants, and facilities to document the full hotel experience. These spaces often showcase the hotel's character and style.

- -

Food and Dining

-

Food photography requires good lighting and composition. Capture presentation, ambiance, and memorable meals to preserve dining experiences.

- -

Views and Scenery

-

Hotel views are often highlights. Capture sunrises, sunsets, and scenic vistas from rooms, balconies, and hotel terraces.

- -

Respect and Etiquette

-

Respect other guests' privacy when photographing. Avoid photographing staff without permission and follow hotel photography policies.

- -

Editing and Sharing

-

Edit photos to enhance colors and composition while maintaining authenticity. Share thoughtfully, respecting the hotel and other guests.

- -

Conclusion

-

Hotel photography creates lasting memories. With respect and good technique, you can capture beautiful images that preserve your travel experiences.

- """, - "featured_image": "https://images.unsplash.com/photo-1516035069371-29a1b244cc32?w=1200&h=800&fit=crop", - "tags": ["Photography", "Travel Tips", "Social Media"], - "meta_title": "Hotel Photography: Capturing Your Stay | Travel Photography Tips", - "meta_description": "Tips and techniques for taking stunning photos of your hotel stay to preserve memories and share experiences.", - "meta_keywords": "hotel photography, travel photography, hotel photos, travel tips, photography tips" - }, - { - "title": "Eco-Friendly Hotels: Sustainable Travel Choices", - "slug": "eco-friendly-hotels-sustainable-travel-choices", - "excerpt": "Learn how to identify and choose eco-friendly hotels that prioritize sustainability and environmental responsibility.", - "content": """ -

Introduction

-

Eco-friendly hotels combine luxury with environmental responsibility. Choosing sustainable accommodations supports conservation while enjoying comfortable stays.

- -

Sustainability Certifications

-

Look for hotels with recognized certifications like LEED, Green Key, or EarthCheck. These certifications verify genuine environmental commitments.

- -

Energy Efficiency

-

Eco-friendly hotels use renewable energy, efficient systems, and smart technology to reduce energy consumption without compromising comfort.

- -

Water Conservation

-

Sustainable hotels implement water-saving measures, recycling systems, and responsible water management practices throughout their operations.

- -

Waste Reduction

-

Comprehensive recycling, composting, and waste reduction programs minimize environmental impact. Some hotels eliminate single-use plastics entirely.

- -

Local Sourcing

-

Sustainable hotels source locally, supporting communities and reducing transportation impacts. Local food, materials, and services benefit everyone.

- -

Guest Participation

-

Eco-friendly hotels encourage guest participation through towel reuse programs, energy conservation, and educational initiatives about sustainability.

- -

Conclusion

-

Choosing eco-friendly hotels supports environmental conservation while enjoying luxury experiences. Sustainable travel benefits destinations and future generations.

- """, - "featured_image": "https://images.unsplash.com/photo-1470071459604-3b5ec3a7fe05?w=1200&h=800&fit=crop", - "tags": ["Sustainability", "Eco-Friendly", "Green Travel"], - "meta_title": "Eco-Friendly Hotels: Sustainable Travel Choices | Green Hotels", - "meta_description": "Learn how to identify and choose eco-friendly hotels that prioritize sustainability and environmental responsibility.", - "meta_keywords": "eco-friendly hotels, sustainable hotels, green hotels, eco travel, sustainable travel" - }, - { - "title": "Hotel Reviews: How to Write Helpful Reviews", - "slug": "hotel-reviews-how-write-helpful-reviews", - "excerpt": "Master the art of writing hotel reviews that help other travelers make informed decisions while providing valuable feedback to hotels.", - "content": """ -

Introduction

-

Well-written hotel reviews help travelers make informed decisions and provide valuable feedback to hotels. Learning to write effective reviews benefits everyone.

- -

Be Specific

-

Provide specific details about your experience—room features, service interactions, amenities used. Specific information is more helpful than general statements.

- -

Balance Positives and Negatives

-

Honest reviews include both positive aspects and areas for improvement. Balanced perspectives help readers understand the full experience.

- -

Focus on Facts

-

Stick to factual observations about your stay. Avoid speculation or assumptions about things you didn't directly experience.

- -

Consider Context

-

Mention relevant context—travel purpose, time of year, special occasions. This helps readers understand if your experience applies to their situation.

- -

Be Respectful

-

Write respectfully, even when reporting negative experiences. Constructive criticism is more valuable than harsh complaints.

- -

Include Photos

-

Photos enhance reviews significantly, showing actual conditions and experiences. Include images of rooms, amenities, and notable features.

- -

Conclusion

-

Helpful reviews require thoughtfulness, honesty, and respect. Well-written reviews create value for travelers and hotels alike.

- """, - "featured_image": "https://images.unsplash.com/photo-1450101499163-c8848c66ca85?w=1200&h=800&fit=crop", - "tags": ["Reviews", "Travel Tips", "Guest Feedback"], - "meta_title": "Hotel Reviews: How to Write Helpful Reviews for Travelers", - "meta_description": "Master the art of writing hotel reviews that help other travelers make informed decisions while providing valuable feedback to hotels.", - "meta_keywords": "hotel reviews, writing reviews, travel reviews, review tips, guest feedback" - }, - { - "title": "Hotel Cancellation Policies: Understanding Your Options", - "slug": "hotel-cancellation-policies-understanding-options", - "excerpt": "Navigate hotel cancellation policies to understand your rights, options, and how to handle changes to your travel plans.", - "content": """ -

Introduction

-

Understanding hotel cancellation policies protects you from unexpected charges and helps you make informed booking decisions.

- -

Policy Types

-

Hotels offer various cancellation policies—fully refundable, partially refundable, and non-refundable. Each has different terms and deadlines.

- -

Booking Channels

-

Cancellation policies vary by booking channel. Direct bookings often offer more flexibility than third-party sites. Always review terms carefully.

- -

Deadlines Matter

-

Cancellation deadlines are critical. Missing deadlines can result in charges. Set reminders and understand exact cutoff times.

- -

Special Circumstances

-

Hotels may offer flexibility for emergencies, weather, or other extenuating circumstances. Contact hotels directly to discuss options.

- -

Travel Insurance

-

Travel insurance can protect against cancellation fees for covered reasons. Review policies to understand what's covered and what's not.

- -

Modification Options

-

Some hotels allow date modifications instead of cancellations. This can preserve your booking while accommodating schedule changes.

- -

Conclusion

-

Understanding cancellation policies prevents surprises and helps you choose bookings that match your flexibility needs.

- """, - "featured_image": "https://images.unsplash.com/photo-1559526324-4b87b5e36e44?w=1200&h=800&fit=crop", - "tags": ["Booking", "Travel Tips", "Policies"], - "meta_title": "Hotel Cancellation Policies: Understanding Your Options", - "meta_description": "Navigate hotel cancellation policies to understand your rights, options, and how to handle changes to your travel plans.", - "meta_keywords": "cancellation policies, hotel booking, travel policies, refund policies, booking terms" - }, - { - "title": "Hotel Wi-Fi: Staying Connected on the Go", - "slug": "hotel-wifi-staying-connected-go", - "excerpt": "Navigate hotel Wi-Fi services, understand connection options, and ensure reliable internet access during your stay.", - "content": """ -

Introduction

-

Reliable hotel Wi-Fi is essential for modern travelers. Understanding Wi-Fi options and how to optimize connections ensures productivity and connectivity.

- -

Wi-Fi Tiers

-

Many hotels offer multiple Wi-Fi tiers—basic free service and premium high-speed options. Choose based on your needs and usage.

- -

Connection Tips

-

Position devices near routers, avoid peak usage times, and disconnect unused devices. These simple steps improve connection quality.

- -

Security Considerations

-

Use hotel Wi-Fi cautiously. Avoid sensitive transactions on public networks. Consider VPN services for enhanced security when traveling.

- -

Business Travel Needs

-

Business travelers may need premium Wi-Fi for video calls and large file transfers. Verify speeds and reliability before booking.

- -

Troubleshooting

-

Hotel IT support can assist with connection issues. Don't hesitate to contact them for help with Wi-Fi problems.

- -

Alternative Options

-

Mobile hotspots and data plans provide alternatives to hotel Wi-Fi. Consider these options for critical connectivity needs.

- -

Conclusion

-

Understanding hotel Wi-Fi options and optimizing connections ensures reliable internet access during your stay.

- """, - "featured_image": "https://images.unsplash.com/photo-1558618666-fcd25c85cd64?w=1200&h=800&fit=crop", - "tags": ["Technology", "Wi-Fi", "Business Travel"], - "meta_title": "Hotel Wi-Fi: Staying Connected on the Go | Internet Access", - "meta_description": "Navigate hotel Wi-Fi services, understand connection options, and ensure reliable internet access during your stay.", - "meta_keywords": "hotel wifi, hotel internet, wifi tips, travel technology, hotel connectivity" - }, - { - "title": "Hotel Breakfast: Starting Your Day Right", - "slug": "hotel-breakfast-starting-day-right", - "excerpt": "Explore hotel breakfast options from continental to full breakfast buffets and how to make the most of morning dining.", - "content": """ -

Introduction

-

Hotel breakfasts set the tone for your day. Understanding options and making the most of breakfast services enhances your stay experience.

- -

Breakfast Types

-

Hotels offer various breakfast options—continental, buffet, à la carte, and room service. Each provides different experiences and value.

- -

Buffet Benefits

-

Breakfast buffets offer variety and value, allowing you to sample different items and eat as much as you like. They're perfect for families.

- -

Timing Considerations

-

Breakfast service hours vary. Early risers and late sleepers should check times. Some hotels offer extended or 24-hour breakfast options.

- -

Dietary Accommodations

-

Hotels accommodate dietary restrictions, allergies, and preferences. Communicate needs in advance for best results.

- -

Included vs. Paid

-

Some hotels include breakfast in rates, while others charge separately. Compare total costs when evaluating hotel options.

- -

Local Specialties

-

Hotel breakfasts often feature local specialties, providing cultural experiences and authentic flavors of the destination.

- -

Conclusion

-

Hotel breakfasts offer convenience and variety. Understanding options helps you start each day of your stay on the right note.

- """, - "featured_image": "https://images.unsplash.com/photo-1525351484163-7529414344d8?w=1200&h=800&fit=crop", - "tags": ["Dining", "Breakfast", "Hotel Services"], - "meta_title": "Hotel Breakfast: Starting Your Day Right | Breakfast Guide", - "meta_description": "Explore hotel breakfast options from continental to full breakfast buffets and how to make the most of morning dining.", - "meta_keywords": "hotel breakfast, breakfast buffet, hotel dining, morning meals, hotel food" - }, - { - "title": "Hotel Pools: Making the Most of Pool Facilities", - "slug": "hotel-pools-making-most-pool-facilities", - "excerpt": "Discover how to enjoy hotel pool facilities, from infinity pools to rooftop pools, and poolside service experiences.", - "content": """ -

Introduction

-

Hotel pools provide relaxation and recreation. Understanding pool facilities and etiquette ensures enjoyable experiences for all guests.

- -

Pool Types

-

Hotels offer various pool types—outdoor, indoor, rooftop, infinity, and heated pools. Each provides unique experiences and benefits.

- -

Poolside Service

-

Many hotels offer poolside service for food and beverages. Enjoy meals and drinks without leaving the pool area.

- -

Pool Etiquette

-

Respect other guests, follow pool rules, and maintain cleanliness. Proper etiquette ensures pleasant experiences for everyone.

- -

Family Considerations

-

Family-friendly pools often have shallow areas, lifeguards, and children's activities. Some hotels offer separate adult pools for quiet relaxation.

- -

Pool Hours

-

Check pool operating hours, which may vary by season or day. Some pools offer extended hours or 24-hour access.

- -

Pool Amenities

-

Hotels may offer pool amenities like cabanas, loungers, towels, and changing facilities. Inquire about available services.

- -

Conclusion

-

Hotel pools enhance stays with relaxation and recreation. Understanding facilities and following etiquette ensures enjoyable pool experiences.

- """, - "featured_image": "https://images.unsplash.com/photo-1571896349842-33c89424de2d?w=1200&h=800&fit=crop", - "tags": ["Amenities", "Pools", "Recreation"], - "meta_title": "Hotel Pools: Making the Most of Pool Facilities", - "meta_description": "Discover how to enjoy hotel pool facilities, from infinity pools to rooftop pools, and poolside service experiences.", - "meta_keywords": "hotel pools, pool facilities, poolside service, hotel amenities, pool guide" - }, - { - "title": "Hotel Spas: Ultimate Relaxation Experiences", - "slug": "hotel-spas-ultimate-relaxation-experiences", - "excerpt": "Explore hotel spa facilities and treatments, from massages to holistic wellness programs, for complete relaxation and rejuvenation.", - "content": """ -

Introduction

-

Hotel spas provide sanctuary for relaxation and rejuvenation. Understanding spa offerings helps you choose treatments and maximize your experience.

- -

Spa Treatments

-

Hotel spas offer diverse treatments—massages, facials, body wraps, and holistic therapies. Each addresses different wellness needs.

- -

Booking Considerations

-

Book spa appointments in advance, especially for popular treatments and peak times. Early booking ensures preferred times and availability.

- -

Treatment Packages

-

Many spas offer packages combining multiple treatments at discounted rates. Packages provide comprehensive wellness experiences.

- -

Spa Facilities

-

Hotel spas often include saunas, steam rooms, hot tubs, and relaxation areas. Arrive early to enjoy these facilities before treatments.

- -

Wellness Programs

-

Some hotel spas offer comprehensive wellness programs including fitness, nutrition, and mindfulness components for holistic health.

- -

Couples Experiences

-

Couples' treatments and private spa suites create romantic, intimate experiences perfect for special occasions or getaways.

- -

Conclusion

-

Hotel spas provide essential relaxation and wellness experiences. Understanding offerings and booking strategically maximizes your spa visit.

- """, - "featured_image": "https://images.unsplash.com/photo-1544161515-4ab6ce6db874?w=1200&h=800&fit=crop", - "tags": ["Spa", "Wellness", "Relaxation"], - "meta_title": "Hotel Spas: Ultimate Relaxation Experiences | Spa Guide", - "meta_description": "Explore hotel spa facilities and treatments, from massages to holistic wellness programs, for complete relaxation and rejuvenation.", - "meta_keywords": "hotel spas, spa treatments, wellness, relaxation, spa guide" - }, - { - "title": "Hotel Bars and Lounges: Evening Entertainment", - "slug": "hotel-bars-lounges-evening-entertainment", - "excerpt": "Discover hotel bars and lounges offering craft cocktails, live music, and sophisticated atmospheres for evening relaxation and socializing.", - "content": """ -

Introduction

-

Hotel bars and lounges provide sophisticated settings for evening entertainment, socializing, and enjoying craft beverages in elegant atmospheres.

- -

Cocktail Culture

-

Hotel bars often feature expert mixologists creating craft cocktails with premium ingredients. These establishments showcase beverage artistry.

- -

Atmosphere and Design

-

Hotel bars create distinct atmospheres through design, lighting, and music. From rooftop bars to speakeasies, each offers unique experiences.

- -

Live Entertainment

-

Many hotel bars feature live music, DJs, or entertainment. These elements enhance evening experiences and create memorable nights.

- -

Bar Food

-

Hotel bars often serve excellent bar food, from small plates to full meals. Quality food complements beverage experiences.

- -

Social Spaces

-

Bars and lounges serve as social hubs, perfect for meeting other travelers, business networking, or simply relaxing after a day of activities.

- -

Rooftop Experiences

-

Rooftop bars offer stunning views and unique atmospheres. These elevated spaces provide exceptional evening experiences.

- -

Conclusion

-

Hotel bars and lounges enhance stays with sophisticated evening entertainment. These spaces provide perfect settings for relaxation and socializing.

- """, - "featured_image": "https://images.unsplash.com/photo-1517245386807-bb43f82c33c4?w=1200&h=800&fit=crop", - "tags": ["Entertainment", "Bars", "Nightlife"], - "meta_title": "Hotel Bars and Lounges: Evening Entertainment | Nightlife", - "meta_description": "Discover hotel bars and lounges offering craft cocktails, live music, and sophisticated atmospheres for evening relaxation and socializing.", - "meta_keywords": "hotel bars, hotel lounges, nightlife, cocktails, evening entertainment" - }, - { - "title": "Hotel Fitness Centers: Staying Active While Traveling", - "slug": "hotel-fitness-centers-staying-active-traveling", - "excerpt": "Maintain your fitness routine with hotel fitness centers featuring modern equipment, classes, and wellness facilities.", - "content": """ -

Introduction

-

Hotel fitness centers allow travelers to maintain exercise routines while away from home. Modern facilities provide comprehensive workout options.

- -

Equipment Quality

-

Hotel fitness centers vary in equipment quality and variety. Premium hotels offer state-of-the-art equipment matching commercial gyms.

- -

Operating Hours

-

Many hotel fitness centers offer 24-hour access, accommodating early risers and late-night exercisers. Check hours when booking.

- -

Group Classes

-

Some hotels offer fitness classes like yoga, Pilates, or spinning. These classes provide structured workouts and social interaction.

- -

Personal Training

-

Premium hotels may offer personal training services. These sessions provide personalized guidance and motivation during your stay.

- -

Outdoor Options

-

Hotels in scenic locations may offer outdoor fitness options like running trails, tennis courts, or water sports facilities.

- -

Wellness Integration

-

Fitness centers often integrate with hotel spas and wellness programs, providing comprehensive health and fitness experiences.

- -

Conclusion

-

Hotel fitness centers enable travelers to maintain active lifestyles. Understanding facilities and options helps you stay fit while traveling.

- """, - "featured_image": "https://images.unsplash.com/photo-1534438327276-14e5300c3a48?w=1200&h=800&fit=crop", - "tags": ["Fitness", "Wellness", "Health"], - "meta_title": "Hotel Fitness Centers: Staying Active While Traveling", - "meta_description": "Maintain your fitness routine with hotel fitness centers featuring modern equipment, classes, and wellness facilities.", - "meta_keywords": "hotel fitness, gym, fitness centers, travel fitness, hotel gym" - }, - { - "title": "Hotel Meeting Spaces: Hosting Successful Events", - "slug": "hotel-meeting-spaces-hosting-successful-events", - "excerpt": "Plan and execute successful meetings, conferences, and events using hotel meeting spaces and professional event services.", - "content": """ -

Introduction

-

Hotel meeting spaces provide professional settings for business events, conferences, and social gatherings. Understanding options ensures successful events.

- -

Space Types

-

Hotels offer various meeting spaces—boardrooms, ballrooms, conference halls, and breakout rooms. Each serves different event types and sizes.

- -

Technology and Equipment

-

Modern meeting spaces include AV equipment, high-speed internet, video conferencing, and presentation technology. Verify available equipment when booking.

- -

Catering Services

-

Hotel catering provides meals, breaks, and beverages for events. Professional catering ensures quality food service throughout your event.

- -

Event Planning Support

-

Hotel event coordinators assist with planning, setup, and execution. Their expertise ensures smooth, professional events.

- -

Flexible Configurations

-

Meeting spaces can be configured for various setups—theater, classroom, banquet, or boardroom styles. Choose configurations matching your needs.

- -

Accommodation Packages

-

Hotels often offer packages combining meeting spaces with guest rooms, providing convenience and value for event attendees.

- -

Conclusion

-

Hotel meeting spaces provide professional environments for successful events. Leveraging hotel services and expertise ensures memorable gatherings.

- """, - "featured_image": "https://images.unsplash.com/photo-1497366216548-37526070297c?w=1200&h=800&fit=crop", - "tags": ["Business", "Meetings", "Events"], - "meta_title": "Hotel Meeting Spaces: Hosting Successful Events | Business", - "meta_description": "Plan and execute successful meetings, conferences, and events using hotel meeting spaces and professional event services.", - "meta_keywords": "hotel meetings, conference rooms, event spaces, business meetings, hotel events" - } -] - -def seed_blog_posts(): - """Seed the database with sample blog posts""" - db: Session = SessionLocal() - - try: - # Get the first admin user as the author - admin_role = db.query(Role).filter(Role.name == 'admin').first() - if not admin_role: - print("Error: Admin role not found. Please seed roles first.") - return - - admin_user = db.query(User).filter(User.role_id == admin_role.id).first() - - if not admin_user: - print("Error: No admin user found. Please create an admin user first.") - return - - # Check existing posts - existing_posts = db.query(BlogPost).all() - existing_slugs = {post.slug for post in existing_posts} - existing_count = len(existing_posts) - - if existing_count >= len(BLOG_POSTS): - print(f"Blog posts already exist ({existing_count} posts). All posts have been seeded.") - return - - # Filter out posts that already exist - posts_to_create = [post for post in BLOG_POSTS if post["slug"] not in existing_slugs] - - if not posts_to_create: - print(f"All blog posts from seed data already exist ({existing_count} posts).") - return - - print(f"Found {existing_count} existing posts. Adding {len(posts_to_create)} new posts...") - - # Create blog posts - created_posts = [] - # Set base date to 60 days ago to ensure all dates are in the past - base_date = datetime.utcnow() - timedelta(days=60) - - # Start from the number of existing posts to maintain date spacing - for i, post_data in enumerate(posts_to_create): - # Stagger dates going backwards from base_date to ensure all are in the past - # Each post is 2 days earlier than the previous one - post_date = base_date - timedelta(days=i * 2) - post = BlogPost( - title=post_data["title"], - slug=post_data["slug"], - excerpt=post_data["excerpt"], - content=post_data["content"], - featured_image=post_data["featured_image"], - author_id=admin_user.id, - tags=json.dumps(post_data["tags"]), - meta_title=post_data["meta_title"], - meta_description=post_data["meta_description"], - meta_keywords=post_data["meta_keywords"], - is_published=True, - published_at=post_date, # All dates in the past - views_count=0 - ) - db.add(post) - created_posts.append(post) - - db.commit() - - print(f"Successfully created {len(created_posts)} blog posts:") - for post in created_posts: - print(f" - {post.title} (slug: {post.slug})") - - except Exception as e: - db.rollback() - print(f"Error seeding blog posts: {str(e)}") - raise - finally: - db.close() - -if __name__ == "__main__": - print("Seeding blog posts...") - seed_blog_posts() - print("Done!") - diff --git a/Backend/seeds_data/seed_bookings.py b/Backend/seeds_data/seed_bookings.py deleted file mode 100755 index ed200dda..00000000 --- a/Backend/seeds_data/seed_bookings.py +++ /dev/null @@ -1,329 +0,0 @@ -#!/usr/bin/env python3 -""" -Script to seed sample bookings for testing check-in/check-out and housekeeping notifications. -""" - -import sys -import os -from pathlib import Path -# Add both the seeds_data directory and the Backend directory to the path -sys.path.insert(0, str(Path(__file__).parent)) -sys.path.insert(0, str(Path(__file__).parent.parent)) -from sqlalchemy.orm import Session -from sqlalchemy import and_ -from src.shared.config.database import SessionLocal -# Import all models needed for SQLAlchemy relationship setup -# Import base models first -from src.auth.models.role import Role -from src.auth.models.user import User -from src.rooms.models.room import Room, RoomStatus -from src.rooms.models.room_type import RoomType # For Room relationship -from src.rooms.models.rate_plan import RatePlan # For RoomType relationship -from src.rooms.models.room_maintenance import RoomMaintenance # For Room relationship -from src.rooms.models.room_inspection import RoomInspection # For Room relationship -from src.rooms.models.room_attribute import RoomAttribute # For Room relationship -from src.hotel_services.models.housekeeping_task import HousekeepingTask # For Room relationship -from src.bookings.models.booking import Booking, BookingStatus -from src.bookings.models.group_booking import GroupBooking # For Booking relationship - -# Import all related models to satisfy SQLAlchemy relationships -# This is necessary because SQLAlchemy needs all related models loaded -try: - from src.auth.models.refresh_token import RefreshToken - from src.reviews.models.review import Review - from src.reviews.models.favorite import Favorite - from src.hotel_services.models.service import Service # For ServiceBooking relationship - from src.hotel_services.models.service_booking import ServiceBooking - from src.hotel_services.models.service_usage import ServiceUsage # For Booking relationship - from src.bookings.models.checkin_checkout import CheckInCheckOut - from src.payments.models.payment import Payment - from src.payments.models.invoice import Invoice - from src.ai.models.chat import Chat - from src.loyalty.models.user_loyalty import UserLoyalty - from src.loyalty.models.loyalty_tier import LoyaltyTier # For UserLoyalty relationship - from src.loyalty.models.loyalty_point_transaction import LoyaltyPointTransaction # For UserLoyalty relationship - from src.loyalty.models.referral import Referral - from src.loyalty.models.package import Package # For RoomType relationship - from src.guest_management.models.guest_preference import GuestPreference - from src.guest_management.models.guest_note import GuestNote - from src.guest_management.models.guest_communication import GuestCommunication - from src.guest_management.models.guest_tag import GuestTag, guest_tag_association - from src.guest_management.models.guest_segment import GuestSegment, guest_segment_association - # Import any other models that might be related -except ImportError: - pass # Some models might not exist, that's okay -from datetime import datetime, timedelta -import random -import secrets - -def get_db(): - db = SessionLocal() - try: - return db - finally: - pass - -def generate_booking_number() -> str: - """Generate a unique booking number""" - prefix = 'BK' - ts = int(datetime.utcnow().timestamp() * 1000) - rand = secrets.randbelow(9000) + 1000 - return f'{prefix}-{ts}-{rand}' - -def seed_bookings(db: Session): - print('=' * 80) - print('SEEDING SAMPLE BOOKINGS FOR TESTING') - print('=' * 80) - - # Get roles - customer_role = db.query(Role).filter(Role.name == 'customer').first() - staff_role = db.query(Role).filter(Role.name == 'staff').first() - admin_role = db.query(Role).filter(Role.name == 'admin').first() - - if not customer_role: - print(' ❌ Customer role not found! Please seed roles first.') - return - - # Get customers - customers = db.query(User).filter(User.role_id == customer_role.id).all() - if not customers: - print(' ❌ No customer users found! Please seed users first.') - return - - # Get available rooms - rooms = db.query(Room).all() - if not rooms: - print(' ❌ No rooms found! Please seed rooms first.') - return - - print(f'\n✓ Found {len(customers)} customer(s) and {len(rooms)} room(s)') - - # Delete existing bookings (optional - comment out if you want to keep existing bookings) - existing_bookings = db.query(Booking).all() - if existing_bookings: - print(f'\n🗑️ Deleting {len(existing_bookings)} existing booking(s)...') - booking_ids = [b.id for b in existing_bookings] - - # Delete related records first to avoid foreign key constraints - try: - from src.guest_management.models.guest_complaint import GuestComplaint, ComplaintUpdate - complaints = db.query(GuestComplaint).filter(GuestComplaint.booking_id.in_(booking_ids)).all() - if complaints: - complaint_ids = [c.id for c in complaints] - # Delete complaint updates first - updates = db.query(ComplaintUpdate).filter(ComplaintUpdate.complaint_id.in_(complaint_ids)).all() - if updates: - for update in updates: - db.delete(update) - print(f' ✓ Deleted {len(updates)} complaint update(s)') - # Then delete complaints - for complaint in complaints: - db.delete(complaint) - print(f' ✓ Deleted {len(complaints)} guest complaint(s)') - except ImportError: - pass - - for booking in existing_bookings: - db.delete(booking) - db.commit() - print(f'✓ Deleted {len(existing_bookings)} booking(s)') - - # Create sample bookings with different statuses - now = datetime.utcnow() - bookings_data = [] - - # 1. Past bookings (checked out) - These should trigger cleaning notifications - print('\n📅 Creating past bookings (checked out)...') - for i in range(3): - room = random.choice(rooms) - customer = random.choice(customers) - - # Check-out was 1-3 days ago - days_ago = random.randint(1, 3) - check_out_date = now - timedelta(days=days_ago) - check_in_date = check_out_date - timedelta(days=random.randint(1, 5)) - - # Calculate price - base_price = float(room.price) if room.price else 100.0 - num_nights = (check_out_date - check_in_date).days - total_price = base_price * num_nights - - booking = Booking( - booking_number=generate_booking_number(), - user_id=customer.id, - room_id=room.id, - check_in_date=check_in_date, - check_out_date=check_out_date, - num_guests=random.randint(1, min(room.capacity, 4)), - total_price=total_price, - status=BookingStatus.checked_out, - deposit_paid=True, - requires_deposit=False, - special_requests=f'Sample booking for testing - Checked out {days_ago} day(s) ago' - ) - db.add(booking) - db.flush() # Flush to get booking ID - - # Set room status to cleaning for checked out bookings - # Check if there's active maintenance first - try: - from src.rooms.models.room_maintenance import RoomMaintenance, MaintenanceStatus - active_maintenance = db.query(RoomMaintenance).filter( - and_( - RoomMaintenance.room_id == room.id, - RoomMaintenance.blocks_room == True, - RoomMaintenance.status.in_([MaintenanceStatus.scheduled, MaintenanceStatus.in_progress]) - ) - ).first() - if not active_maintenance: - room.status = RoomStatus.cleaning - - # Create housekeeping task for checkout cleaning - try: - from src.hotel_services.models.housekeeping_task import HousekeepingTask, HousekeepingStatus, HousekeepingType - checkout_checklist = [ - {'item': 'Bathroom cleaned', 'completed': False, 'notes': ''}, - {'item': 'Beds made with fresh linens', 'completed': False, 'notes': ''}, - {'item': 'Trash emptied', 'completed': False, 'notes': ''}, - {'item': 'Towels replaced', 'completed': False, 'notes': ''}, - {'item': 'Amenities restocked', 'completed': False, 'notes': ''}, - {'item': 'Floor vacuumed and mopped', 'completed': False, 'notes': ''}, - {'item': 'Surfaces dusted', 'completed': False, 'notes': ''}, - {'item': 'Windows and mirrors cleaned', 'completed': False, 'notes': ''}, - ] - - housekeeping_task = HousekeepingTask( - room_id=room.id, - booking_id=booking.id, - task_type=HousekeepingType.checkout, - status=HousekeepingStatus.pending, - scheduled_time=datetime.utcnow(), - created_by=admin_role.id if admin_role else (staff_role.id if staff_role else None), - checklist_items=checkout_checklist, - notes=f'Auto-created on checkout for booking {booking.booking_number}', - estimated_duration_minutes=45 - ) - db.add(housekeeping_task) - except ImportError: - pass # If housekeeping models not available, skip task creation - except ImportError: - # If maintenance model not available, just set to cleaning - room.status = RoomStatus.cleaning - bookings_data.append({ - 'number': booking.booking_number, - 'room': room.room_number, - 'status': 'checked_out', - 'check_out': check_out_date.strftime('%Y-%m-%d') - }) - print(f' ✓ Created booking {booking.booking_number} - Room {room.room_number}, Checked out {days_ago} day(s) ago') - - # 2. Current bookings (checked in) - Guests currently staying - print('\n📅 Creating current bookings (checked in)...') - for i in range(2): - room = random.choice(rooms) - customer = random.choice(customers) - - # Checked in 1-3 days ago, checking out in 1-3 days - days_ago = random.randint(1, 3) - check_in_date = now - timedelta(days=days_ago) - check_out_date = now + timedelta(days=random.randint(1, 3)) - - base_price = float(room.price) if room.price else 100.0 - num_nights = (check_out_date - check_in_date).days - total_price = base_price * num_nights - - booking = Booking( - booking_number=generate_booking_number(), - user_id=customer.id, - room_id=room.id, - check_in_date=check_in_date, - check_out_date=check_out_date, - num_guests=random.randint(1, min(room.capacity, 4)), - total_price=total_price, - status=BookingStatus.checked_in, - deposit_paid=True, - requires_deposit=False, - special_requests=f'Sample booking for testing - Currently checked in' - ) - db.add(booking) - db.flush() # Flush to get booking ID - - # Set room status to occupied for checked in bookings - room.status = RoomStatus.occupied - bookings_data.append({ - 'number': booking.booking_number, - 'room': room.room_number, - 'status': 'checked_in', - 'check_out': check_out_date.strftime('%Y-%m-%d') - }) - print(f' ✓ Created booking {booking.booking_number} - Room {room.room_number}, Checked in {days_ago} day(s) ago') - - # 3. Future bookings (confirmed) - Upcoming reservations - print('\n📅 Creating future bookings (confirmed)...') - for i in range(3): - room = random.choice(rooms) - customer = random.choice(customers) - - # Check-in in 1-7 days, staying for 2-5 days - days_ahead = random.randint(1, 7) - check_in_date = now + timedelta(days=days_ahead) - check_out_date = check_in_date + timedelta(days=random.randint(2, 5)) - - base_price = float(room.price) if room.price else 100.0 - num_nights = (check_out_date - check_in_date).days - total_price = base_price * num_nights - - booking = Booking( - booking_number=generate_booking_number(), - user_id=customer.id, - room_id=room.id, - check_in_date=check_in_date, - check_out_date=check_out_date, - num_guests=random.randint(1, min(room.capacity, 4)), - total_price=total_price, - status=BookingStatus.confirmed, - deposit_paid=random.choice([True, False]), - requires_deposit=random.choice([True, False]), - special_requests=f'Sample booking for testing - Future reservation' - ) - db.add(booking) - bookings_data.append({ - 'number': booking.booking_number, - 'room': room.room_number, - 'status': 'confirmed', - 'check_in': check_in_date.strftime('%Y-%m-%d') - }) - print(f' ✓ Created booking {booking.booking_number} - Room {room.room_number}, Check-in in {days_ahead} day(s)') - - db.commit() - - print(f'\n✅ Successfully created {len(bookings_data)} sample bookings!') - print(f'\n📊 Summary:') - checked_out = sum(1 for b in bookings_data if b['status'] == 'checked_out') - checked_in = sum(1 for b in bookings_data if b['status'] == 'checked_in') - confirmed = sum(1 for b in bookings_data if b['status'] == 'confirmed') - print(f' - Checked out: {checked_out} (rooms should be in cleaning status)') - print(f' - Checked in: {checked_in} (guests currently staying)') - print(f' - Confirmed: {confirmed} (upcoming reservations)') - print('\n💡 To test notifications:') - print(' 1. Log in as staff user (staff@gnxsoft.com / staff123)') - print(' 2. Go to Bookings and mark a checked_in booking as checked_out') - print(' 3. Log in as housekeeping user (housekeeping@gnxsoft.com / P4eli240453.)') - print(' 4. You should receive a notification about the room needing cleaning') - print('=' * 80) - -def main(): - db = get_db() - try: - seed_bookings(db) - except Exception as e: - print(f'\n❌ Error: {e}') - import traceback - traceback.print_exc() - db.rollback() - finally: - db.close() - -if __name__ == '__main__': - main() - diff --git a/Backend/seeds_data/seed_homepage_footer.py b/Backend/seeds_data/seed_homepage_footer.py deleted file mode 100644 index d85da6ad..00000000 --- a/Backend/seeds_data/seed_homepage_footer.py +++ /dev/null @@ -1,392 +0,0 @@ -import sys -import os -import json -from datetime import datetime, timedelta -# Add parent directory to path to import from src -sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__)))) -from sqlalchemy.orm import Session -from src.shared.config.database import SessionLocal -from src.content.models.page_content import PageContent, PageType - -def seed_homepage_content(db: Session): - existing = db.query(PageContent).filter(PageContent.page_type == PageType.HOME).first() - luxury_features = [{'icon': 'Sparkles', 'title': 'Premium Amenities', 'description': 'World-class facilities designed for your comfort and relaxation'}, {'icon': 'Crown', 'title': 'Royal Service', 'description': 'Dedicated concierge service available 24/7 for all your needs'}, {'icon': 'Award', 'title': 'Award-Winning', 'description': 'Recognized for excellence in hospitality and guest satisfaction'}, {'icon': 'Shield', 'title': 'Secure & Private', 'description': 'Your privacy and security are our top priorities'}, {'icon': 'Heart', 'title': 'Personalized Care', 'description': 'Tailored experiences crafted just for you'}, {'icon': 'Gem', 'title': 'Luxury Design', 'description': 'Elegantly designed spaces with attention to every detail'}] - luxury_gallery = ['https://images.unsplash.com/photo-1566073771259-6a8506099945?w=800', 'https://images.unsplash.com/photo-1571896349842-33c89424de2d?w=800', 'https://images.unsplash.com/photo-1582719478250-c89cae4dc85b?w=800', 'https://images.unsplash.com/photo-1564501049412-61c2a3083791?w=800', 'https://images.unsplash.com/photo-1590490360182-c33d57733427?w=800', 'https://images.unsplash.com/photo-1551882547-ff40c63fe5fa?w=800'] - luxury_testimonials = [{'name': 'Sarah Johnson', 'title': 'Business Executive', 'quote': 'An absolutely stunning experience. The attention to detail and level of service exceeded all expectations.', 'image': 'https://images.unsplash.com/photo-1494790108377-be9c29b29330?w=200'}, {'name': 'Michael Chen', 'title': 'Travel Enthusiast', 'quote': 'The epitome of luxury. Every moment was perfect, from check-in to check-out.', 'image': 'https://images.unsplash.com/photo-1507003211169-0a1dd7228f2d?w=200'}, {'name': 'Emma Williams', 'title': 'Luxury Traveler', 'quote': 'This hotel redefines what luxury means. I will definitely return.', 'image': 'https://images.unsplash.com/photo-1438761681033-6461ffad8d80?w=200'}] - luxury_services = [ - { - 'icon': 'UtensilsCrossed', - 'title': 'Fine Dining', - 'description': 'Michelin-starred restaurants offering world-class cuisine', - 'image': 'https://images.unsplash.com/photo-1517248135467-4c7edcad34c4?w=600', - 'slug': 'fine-dining', - 'category': 'Dining', - 'content': '

Experience culinary excellence at our Michelin-starred restaurants. Our world-renowned chefs craft exquisite dishes using the finest ingredients sourced from around the globe. From intimate dining experiences to grand celebrations, we offer a variety of settings to suit every occasion.

Our restaurants feature seasonal menus that showcase the best of local and international cuisine, paired with an extensive wine collection curated by our master sommelier.

', - 'sections': [], - 'meta_title': 'Fine Dining Experience - Luxury Hotel', - 'meta_description': 'Discover our Michelin-starred restaurants offering world-class cuisine in elegant settings.', - 'meta_keywords': 'fine dining, michelin star, luxury restaurant, gourmet cuisine' - }, - { - 'icon': 'Wine', - 'title': 'Premium Bar', - 'description': 'Extensive wine collection and craft cocktails in elegant settings', - 'image': 'https://images.unsplash.com/photo-1514362545857-3bc16c4c7d1b?w=600', - 'slug': 'premium-bar', - 'category': 'Dining', - 'content': '

Unwind in sophistication at our premium bar, featuring an extensive collection of rare wines, vintage spirits, and expertly crafted cocktails. Our master mixologists create unique beverages tailored to your preferences.

The elegant ambiance, combined with live music on select evenings, creates the perfect setting for business meetings, romantic evenings, or casual gatherings with friends.

', - 'sections': [], - 'meta_title': 'Premium Bar & Lounge - Luxury Hotel', - 'meta_description': 'Enjoy an extensive wine collection and craft cocktails in our elegant bar and lounge.', - 'meta_keywords': 'premium bar, wine collection, craft cocktails, luxury lounge' - }, - { - 'icon': 'Dumbbell', - 'title': 'Spa & Wellness', - 'description': 'Rejuvenating spa treatments and state-of-the-art fitness center', - 'image': 'https://images.unsplash.com/photo-1544161515-4ab6ce6db874?w=600', - 'slug': 'spa-wellness', - 'category': 'Wellness', - 'content': '

Escape to tranquility at our world-class spa and wellness center. Indulge in a range of rejuvenating treatments designed to restore balance and vitality. Our expert therapists use premium products and ancient techniques to provide an unparalleled wellness experience.

Our state-of-the-art fitness center is equipped with the latest equipment and offers personal training sessions, yoga classes, and wellness programs tailored to your needs.

', - 'sections': [], - 'meta_title': 'Spa & Wellness Center - Luxury Hotel', - 'meta_description': 'Rejuvenate with our spa treatments and state-of-the-art fitness facilities.', - 'meta_keywords': 'spa, wellness, fitness center, massage, luxury spa' - }, - { - 'icon': 'Car', - 'title': 'Concierge Services', - 'description': 'Personalized assistance for all your travel and entertainment needs', - 'image': 'https://images.unsplash.com/photo-1558618666-fcd25c85cd64?w=600', - 'slug': 'concierge-services', - 'category': 'Services', - 'content': '

Our dedicated concierge team is available 24/7 to ensure your stay is nothing short of extraordinary. From restaurant reservations and event tickets to private tours and transportation arrangements, we handle every detail with precision and care.

Whether you need assistance with business arrangements, special celebrations, or unique local experiences, our concierge team has the expertise and connections to make it happen.

', - 'sections': [], - 'meta_title': 'Concierge Services - Luxury Hotel', - 'meta_description': 'Personalized assistance for all your travel and entertainment needs, available 24/7.', - 'meta_keywords': 'concierge, personal assistant, travel services, luxury service' - } - ] - luxury_experiences = [{'icon': 'Sunset', 'title': 'Sunset Rooftop', 'description': 'Breathtaking views and exclusive rooftop experiences', 'image': 'https://images.unsplash.com/photo-1514933651103-005eec06c04b?w=600'}, {'icon': 'Ship', 'title': 'Yacht Excursions', 'description': 'Private yacht charters for unforgettable sea adventures', 'image': 'https://images.unsplash.com/photo-1544551763-46a013bb70d5?w=600'}, {'icon': 'Music', 'title': 'Live Entertainment', 'description': 'World-class performances and exclusive events', 'image': 'https://images.unsplash.com/photo-1470229722913-7c0e2dbbafd3?w=600'}, {'icon': 'Palette', 'title': 'Art & Culture', 'description': 'Curated art collections and cultural experiences', 'image': 'https://images.unsplash.com/photo-1578301978018-3005759f48f7?w=600'}] - awards = [{'icon': 'Trophy', 'title': 'Best Luxury Hotel 2024', 'description': 'Awarded by International Luxury Travel Association', 'image': 'https://images.unsplash.com/photo-1579783902614-a3fb3927b6a5?w=400', 'year': '2024'}, {'icon': 'Star', 'title': '5-Star Excellence', 'description': 'Consistently rated 5 stars by leading travel publications', 'image': 'https://images.unsplash.com/photo-1606761568499-6d2451b23c66?w=400', 'year': '2023'}, {'icon': 'Award', 'title': 'Sustainable Luxury', 'description': 'Recognized for environmental responsibility and sustainability', 'image': 'https://images.unsplash.com/photo-1473341304170-971dccb5ac1e?w=400', 'year': '2024'}] - partners = [{'name': 'Luxury Travel Group', 'logo': 'https://images.unsplash.com/photo-1599305445671-ac291c95aaa9?w=200', 'link': '#'}, {'name': 'Premium Airlines', 'logo': 'https://images.unsplash.com/photo-1436491865332-7a61a109cc05?w=200', 'link': '#'}, {'name': 'Exclusive Events', 'logo': 'https://images.unsplash.com/photo-1511578314322-379afb476865?w=200', 'link': '#'}, {'name': 'Fine Dining Network', 'logo': 'https://images.unsplash.com/photo-1555396273-367ea4eb4db5?w=200', 'link': '#'}] - stats = [{'icon': 'Users', 'number': '50,000+', 'label': 'Happy Guests'}, {'icon': 'Award', 'number': '25+', 'label': 'Awards Won'}, {'icon': 'Star', 'number': '4.9', 'label': 'Average Rating'}, {'icon': 'Globe', 'number': '100+', 'label': 'Countries Served'}] - amenities = [{'icon': 'Wifi', 'title': 'High-Speed WiFi', 'description': 'Complimentary high-speed internet throughout the property', 'image': ''}, {'icon': 'Coffee', 'title': '24/7 Room Service', 'description': 'Round-the-clock dining and beverage service', 'image': ''}, {'icon': 'Car', 'title': 'Valet Parking', 'description': 'Complimentary valet parking for all guests', 'image': ''}, {'icon': 'Plane', 'title': 'Airport Transfer', 'description': 'Luxury airport transfer service available', 'image': ''}] - features = [{'icon': 'Shield', 'title': 'Secure & Safe', 'description': '24/7 security and state-of-the-art safety systems'}, {'icon': 'Wifi', 'title': 'Free WiFi', 'description': 'High-speed internet access throughout the property'}, {'icon': 'Coffee', 'title': 'Room Service', 'description': '24/7 room service available for your convenience'}, {'icon': 'Car', 'title': 'Parking', 'description': 'Complimentary valet parking for all guests'}, {'icon': 'UtensilsCrossed', 'title': 'Fine Dining', 'description': 'World-class restaurants and dining experiences'}, {'icon': 'Dumbbell', 'title': 'Fitness Center', 'description': 'State-of-the-art fitness facilities'}] - testimonials = [{'name': 'Robert Martinez', 'role': 'CEO, Tech Corp', 'image': 'https://images.unsplash.com/photo-1500648767791-00dcc994a43e?w=200', 'rating': 5, 'comment': 'Exceptional service and attention to detail. The staff went above and beyond to make our stay memorable.'}, {'name': 'Lisa Anderson', 'role': 'Travel Blogger', 'image': 'https://images.unsplash.com/photo-1487412720507-e7ab37603c6f?w=200', 'rating': 5, 'comment': "The most luxurious hotel experience I've ever had. Every detail was perfect."}, {'name': 'David Thompson', 'role': 'Investment Banker', 'image': 'https://images.unsplash.com/photo-1472099645785-5658abf4ff4e?w=200', 'rating': 5, 'comment': 'Outstanding facilities and impeccable service. Highly recommend for business travelers.'}] - gallery_images = ['https://images.unsplash.com/photo-1564501049412-61c2a3083791?w=800', 'https://images.unsplash.com/photo-1590490360182-c33d57733427?w=800', 'https://images.unsplash.com/photo-1551882547-ff40c63fe5fa?w=800', 'https://images.unsplash.com/photo-1571896349842-33c89424de2d?w=800', 'https://images.unsplash.com/photo-1582719478250-c89cae4dc85b?w=800', 'https://images.unsplash.com/photo-1566073771259-6a8506099945?w=800'] - - # Enterprise homepage fields - hero_video_url = 'https://videos.unsplash.com/video-1564501049412-61c2a3083791' - hero_video_poster = 'https://images.unsplash.com/photo-1564501049412-61c2a3083791?w=1200' - features_section_title = 'Why Choose Us' - features_section_subtitle = 'Discover what makes us the perfect choice for your stay' - stats_section_title = 'Our Achievements' - stats_section_subtitle = 'Numbers that speak for themselves' - rooms_section_title = 'Luxurious Rooms & Suites' - rooms_section_subtitle = 'Experience comfort and elegance in every room' - rooms_section_button_text = 'View All Rooms' - rooms_section_button_link = '/rooms' - rooms_section_enabled = True - services_section_button_text = 'Explore All Services' - services_section_button_link = '/services' - services_section_limit = 4 - - # Sections enabled configuration - sections_enabled = { - 'features': True, - 'luxury': True, - 'gallery': True, - 'testimonials': True, - 'stats': True, - 'amenities': True, - 'about_preview': True, - 'services': True, - 'experiences': True, - 'awards': True, - 'cta': True, - 'partners': True, - 'rooms': True, - 'newsletter': True, - 'trust_badges': True, - 'promotions': True, - 'blog': True - } - - # Newsletter section - newsletter_section_title = 'Stay Connected' - newsletter_section_subtitle = 'Subscribe to our newsletter for exclusive offers and updates' - newsletter_placeholder = 'Enter your email address' - newsletter_button_text = 'Subscribe' - newsletter_enabled = True - - # Trust badges - trust_badges = [ - { - 'name': '5-Star Rating', - 'logo': 'https://images.unsplash.com/photo-1579783902614-a3fb3927b6a5?w=200', - 'description': 'Awarded 5 stars by leading travel organizations', - 'link': '#' - }, - { - 'name': 'TripAdvisor Excellence', - 'logo': 'https://images.unsplash.com/photo-1606761568499-6d2451b23c66?w=200', - 'description': 'Certificate of Excellence winner', - 'link': '#' - }, - { - 'name': 'Green Certified', - 'logo': 'https://images.unsplash.com/photo-1473341304170-971dccb5ac1e?w=200', - 'description': 'Eco-friendly and sustainable practices', - 'link': '#' - }, - { - 'name': 'Luxury Collection', - 'logo': 'https://images.unsplash.com/photo-1599305445671-ac291c95aaa9?w=200', - 'description': 'Member of the world\'s finest luxury hotels', - 'link': '#' - } - ] - trust_badges_section_title = 'Trusted & Recognized' - trust_badges_section_subtitle = 'Awards and certifications that validate our commitment to excellence' - trust_badges_enabled = True - - # Promotions - Mix of valid and expired for testing - # Calculate dates relative to current date - today = datetime.now() - next_month = today + timedelta(days=30) - next_3_months = today + timedelta(days=90) - next_6_months = today + timedelta(days=180) - expired_1_month_ago = today - timedelta(days=30) - expired_3_months_ago = today - timedelta(days=90) - - promotions = [ - { - 'title': 'Early Bird Special', - 'description': 'Book 30 days in advance and save 20% on your stay. Perfect for planning ahead!', - 'image': 'https://images.unsplash.com/photo-1564501049412-61c2a3083791?w=600', - 'discount': '20% OFF', - 'valid_until': next_3_months.strftime('%Y-%m-%d'), - 'link': '/rooms', - 'button_text': 'Book Now', - 'code': 'EARLYBIRD20' - }, - { - 'title': 'Weekend Getaway', - 'description': 'Perfect weekend escape with complimentary breakfast and spa access. Relax and unwind!', - 'image': 'https://images.unsplash.com/photo-1571896349842-33c89424de2d?w=600', - 'discount': '30% OFF', - 'valid_until': next_month.strftime('%Y-%m-%d'), - 'link': '/rooms', - 'button_text': 'View Offer', - 'code': 'WEEKEND30' - }, - { - 'title': 'Luxury Suite Package', - 'description': 'Experience our premium suites with exclusive amenities, fine dining, and concierge service', - 'image': 'https://images.unsplash.com/photo-1582719478250-c89cae4dc85b?w=600', - 'discount': 'Save $200', - 'valid_until': next_6_months.strftime('%Y-%m-%d'), - 'link': '/rooms', - 'button_text': 'Explore Suites', - 'code': 'LUXURY200' - }, - { - 'title': 'Honeymoon Special', - 'description': 'Romantic getaway with champagne, flowers, special amenities, and complimentary room upgrade', - 'image': 'https://images.unsplash.com/photo-1596394516093-501ba68a0ba6?w=600', - 'discount': '25% OFF', - 'valid_until': next_3_months.strftime('%Y-%m-%d'), - 'link': '/rooms', - 'button_text': 'Book Package', - 'code': 'HONEYMOON25' - }, - { - 'title': 'Family Fun Package', - 'description': 'Perfect for families! Includes family room, kids activities, and complimentary meals for children under 12', - 'image': 'https://images.unsplash.com/photo-1566073771259-6a8506099945?w=600', - 'discount': '15% OFF', - 'valid_until': next_6_months.strftime('%Y-%m-%d'), - 'link': '/rooms', - 'button_text': 'Book Now', - 'code': 'FAMILY15' - }, - { - 'title': 'Business Traveler', - 'description': 'Extended stay discounts for business travelers. Includes high-speed WiFi, workspace, and airport transfer', - 'image': 'https://images.unsplash.com/photo-1551882547-ff40c63fe5fa?w=600', - 'discount': '10% OFF', - 'valid_until': next_3_months.strftime('%Y-%m-%d'), - 'link': '/rooms', - 'button_text': 'Learn More', - 'code': 'BUSINESS10' - }, - # Expired promotions for testing display logic - { - 'title': 'Summer Special', - 'description': 'Enjoy 25% off on all room bookings this summer. Limited time offer!', - 'image': 'https://images.unsplash.com/photo-1564501049412-61c2a3083791?w=600', - 'discount': '25% OFF', - 'valid_until': expired_3_months_ago.strftime('%Y-%m-%d'), - 'link': '/rooms', - 'button_text': 'Book Now', - 'code': 'SUMMER25' - }, - { - 'title': 'New Year Celebration', - 'description': 'Ring in the new year with our special celebration package. Includes party access and premium amenities', - 'image': 'https://images.unsplash.com/photo-1590490360182-c33d57733427?w=600', - 'discount': '35% OFF', - 'valid_until': expired_1_month_ago.strftime('%Y-%m-%d'), - 'link': '/rooms', - 'button_text': 'View Offer', - 'code': 'NEWYEAR35' - } - ] - promotions_section_title = 'Special Offers' - promotions_section_subtitle = 'Exclusive deals and packages designed just for you' - promotions_enabled = True - - # Blog section - blog_section_title = 'Latest News & Updates' - blog_section_subtitle = 'Stay informed about our latest news, events, and travel tips' - blog_posts_limit = 3 - blog_enabled = True - - homepage_data = { - 'page_type': PageType.HOME, - 'title': 'Luxury Hotel - Experience Unparalleled Elegance', - 'subtitle': 'Where timeless luxury meets modern sophistication', - 'description': 'Discover a world of refined elegance and exceptional service', - 'hero_title': 'Welcome to Luxury', - 'hero_subtitle': 'Experience the pinnacle of hospitality', - 'hero_image': 'https://images.unsplash.com/photo-1564501049412-61c2a3083791?w=1200', - 'hero_video_url': hero_video_url, - 'hero_video_poster': hero_video_poster, - 'features': json.dumps(features), - 'features_section_title': features_section_title, - 'features_section_subtitle': features_section_subtitle, - 'luxury_section_title': 'Experience Unparalleled Luxury', - 'luxury_section_subtitle': 'Where elegance meets comfort in every detail', - 'luxury_section_image': 'https://images.unsplash.com/photo-1571896349842-33c89424de2d?w=1200', - 'luxury_features': json.dumps(luxury_features), - 'luxury_gallery_section_title': 'Our Luxury Gallery', - 'luxury_gallery_section_subtitle': 'A glimpse into our world of elegance', - 'luxury_gallery': json.dumps(luxury_gallery), - 'luxury_testimonials_section_title': 'What Our Guests Say', - 'luxury_testimonials_section_subtitle': 'Testimonials from our valued guests', - 'luxury_testimonials': json.dumps(luxury_testimonials), - 'luxury_services_section_title': 'Premium Services', - 'luxury_services_section_subtitle': 'Indulge in our world-class amenities', - 'luxury_services': json.dumps(luxury_services), - 'services_section_button_text': services_section_button_text, - 'services_section_button_link': services_section_button_link, - 'services_section_limit': services_section_limit, - 'luxury_experiences_section_title': 'Exclusive Experiences', - 'luxury_experiences_section_subtitle': 'Create unforgettable memories', - 'luxury_experiences': json.dumps(luxury_experiences), - 'awards_section_title': 'Awards & Recognition', - 'awards_section_subtitle': 'Recognized for excellence worldwide', - 'awards': json.dumps(awards), - 'partners_section_title': 'Our Partners', - 'partners_section_subtitle': 'Trusted by leading brands', - 'partners': json.dumps(partners), - 'amenities_section_title': 'Premium Amenities', - 'amenities_section_subtitle': 'Everything you need for a perfect stay', - 'amenities': json.dumps(amenities), - 'testimonials_section_title': 'Guest Reviews', - 'testimonials_section_subtitle': 'Hear from our satisfied guests', - 'testimonials': json.dumps(testimonials), - 'gallery_section_title': 'Photo Gallery', - 'gallery_section_subtitle': 'Explore our beautiful spaces', - 'gallery_images': json.dumps(gallery_images), - 'about_preview_title': 'About Our Luxury Hotel', - 'about_preview_subtitle': 'A legacy of excellence', - 'about_preview_content': 'Discover a world of refined elegance and exceptional service. Our hotel combines timeless luxury with modern amenities to create an unforgettable experience. With over 50,000 satisfied guests and numerous awards, we continue to set the standard for luxury hospitality.', - 'about_preview_image': 'https://images.unsplash.com/photo-1582719478250-c89cae4dc85b?w=800', - 'stats': json.dumps(stats), - 'stats_section_title': stats_section_title, - 'stats_section_subtitle': stats_section_subtitle, - 'rooms_section_title': rooms_section_title, - 'rooms_section_subtitle': rooms_section_subtitle, - 'rooms_section_button_text': rooms_section_button_text, - 'rooms_section_button_link': rooms_section_button_link, - 'rooms_section_enabled': rooms_section_enabled, - 'sections_enabled': json.dumps(sections_enabled), - 'newsletter_section_title': newsletter_section_title, - 'newsletter_section_subtitle': newsletter_section_subtitle, - 'newsletter_placeholder': newsletter_placeholder, - 'newsletter_button_text': newsletter_button_text, - 'newsletter_enabled': newsletter_enabled, - 'trust_badges_section_title': trust_badges_section_title, - 'trust_badges_section_subtitle': trust_badges_section_subtitle, - 'trust_badges': json.dumps(trust_badges), - 'trust_badges_enabled': trust_badges_enabled, - 'promotions_section_title': promotions_section_title, - 'promotions_section_subtitle': promotions_section_subtitle, - 'promotions': json.dumps(promotions), - 'promotions_enabled': promotions_enabled, - 'blog_section_title': blog_section_title, - 'blog_section_subtitle': blog_section_subtitle, - 'blog_posts_limit': blog_posts_limit, - 'blog_enabled': blog_enabled, - 'cta_title': 'Ready to Experience Luxury?', - 'cta_subtitle': 'Book your stay today and discover the difference', - 'cta_button_text': 'Book Now', - 'cta_button_link': '/rooms', - 'cta_image': 'https://images.unsplash.com/photo-1566073771259-6a8506099945?w=1200', - 'is_active': True - } - if existing: - for key, value in homepage_data.items(): - if key != 'page_type': - setattr(existing, key, value) - print('✓ Updated existing homepage content') - else: - new_content = PageContent(**homepage_data) - db.add(new_content) - print('✓ Created new homepage content') - db.commit() - -def seed_footer_content(db: Session): - existing = db.query(PageContent).filter(PageContent.page_type == PageType.FOOTER).first() - contact_info = {'phone': '+1 (555) 123-4567', 'email': 'info@luxuryhotel.com', 'address': '123 Luxury Avenue, Premium District, City 12345'} - social_links = {'facebook': 'https://facebook.com/luxuryhotel', 'twitter': 'https://twitter.com/luxuryhotel', 'instagram': 'https://instagram.com/luxuryhotel', 'linkedin': 'https://linkedin.com/company/luxuryhotel', 'youtube': 'https://youtube.com/luxuryhotel'} - footer_links = {'quick_links': [{'label': 'Home', 'url': '/'}, {'label': 'Rooms & Suites', 'url': '/rooms'}, {'label': 'About Us', 'url': '/about'}, {'label': 'Contact', 'url': '/contact'}, {'label': 'Gallery', 'url': '/gallery'}], 'support_links': [{'label': 'FAQ', 'url': '/faq'}, {'label': 'Privacy Policy', 'url': '/privacy'}, {'label': 'Terms of Service', 'url': '/terms'}, {'label': 'Cancellation Policy', 'url': '/cancellation'}, {'label': 'Accessibility', 'url': '/accessibility'}]} - badges = [{'text': '5-Star Rated', 'icon': 'Star'}, {'text': 'Award Winning', 'icon': 'Award'}, {'text': 'Eco Certified', 'icon': 'Leaf'}, {'text': 'Luxury Collection', 'icon': 'Crown'}] - footer_data = {'page_type': PageType.FOOTER, 'title': 'Luxury Hotel', 'subtitle': 'Experience Unparalleled Elegance', 'description': 'Your gateway to luxury hospitality and exceptional service', 'contact_info': json.dumps(contact_info), 'social_links': json.dumps(social_links), 'footer_links': json.dumps(footer_links), 'badges': json.dumps(badges), 'copyright_text': '© {YEAR} Luxury Hotel. All rights reserved.', 'is_active': True} - if existing: - for key, value in footer_data.items(): - if key != 'page_type': - setattr(existing, key, value) - print('✓ Updated existing footer content') - else: - new_content = PageContent(**footer_data) - db.add(new_content) - print('✓ Created new footer content') - db.commit() - -def main(): - db: Session = SessionLocal() - try: - print('=' * 80) - print('SEEDING HOMEPAGE AND FOOTER CONTENT') - print('=' * 80) - print() - print('Seeding homepage content...') - seed_homepage_content(db) - print('\nSeeding footer content...') - seed_footer_content(db) - print('\n' + '=' * 80) - print('✓ All content seeded successfully!') - print('=' * 80) - except Exception as e: - db.rollback() - print(f'\n✗ Error seeding content: {e}') - import traceback - traceback.print_exc() - raise - finally: - db.close() -if __name__ == '__main__': - main() \ No newline at end of file diff --git a/Backend/seeds_data/seed_initial_data.py b/Backend/seeds_data/seed_initial_data.py deleted file mode 100644 index 0cce2563..00000000 --- a/Backend/seeds_data/seed_initial_data.py +++ /dev/null @@ -1,163 +0,0 @@ -import sys -import os -from pathlib import Path -# Add both the seeds_data directory and the Backend directory to the path -sys.path.insert(0, str(Path(__file__).parent)) -sys.path.insert(0, str(Path(__file__).parent.parent)) -from sqlalchemy.orm import Session -from src.shared.config.database import SessionLocal -# Import all models needed for SQLAlchemy relationship setup -from src.auth.models.role import Role -from src.auth.models.user import User -from src.rooms.models.room_type import RoomType -from src.rooms.models.room import Room -from src.rooms.models.rate_plan import RatePlan # For RoomType relationship -from src.bookings.models.booking import Booking # For Room relationship -import bcrypt -from datetime import datetime - -def get_db(): - db = SessionLocal() - try: - return db - finally: - pass - -def seed_roles(db: Session): - print('=' * 80) - print('SEEDING ROLES') - print('=' * 80) - - roles_data = [ - {'name': 'admin', 'description': 'Administrator with full access'}, - {'name': 'staff', 'description': 'Staff member with limited admin access'}, - {'name': 'customer', 'description': 'Regular customer'}, - {'name': 'accountant', 'description': 'Accountant role with access to financial data, payments, and invoices'}, - {'name': 'housekeeping', 'description': 'Housekeeping staff role with access to room cleaning tasks and status updates'} - ] - - for role_data in roles_data: - existing = db.query(Role).filter(Role.name == role_data['name']).first() - if existing: - print(f' ✓ Role "{role_data["name"]}" already exists') - else: - role = Role(**role_data) - db.add(role) - print(f' ✓ Created role: {role_data["name"]}') - - db.commit() - print('✓ Roles seeded successfully!\n') - -def seed_room_types(db: Session): - print('=' * 80) - print('SEEDING ROOM TYPES') - print('=' * 80) - - room_types_data = [ - { - 'name': 'Standard Room', - 'description': 'Comfortable and well-appointed standard accommodation', - 'base_price': 150.00, - 'capacity': 2, - 'amenities': ['Free WiFi', 'Air Conditioning', 'TV', 'Minibar', 'Safe'] - }, - { - 'name': 'Superior Room', - 'description': 'Spacious room with enhanced amenities and better views', - 'base_price': 200.00, - 'capacity': 2, - 'amenities': ['Free WiFi', 'Air Conditioning', 'Smart TV', 'Minibar', 'Safe', 'Coffee Maker'] - }, - { - 'name': 'Deluxe Room', - 'description': 'Luxurious room with premium furnishings and amenities', - 'base_price': 280.00, - 'capacity': 3, - 'amenities': ['Free WiFi', 'Air Conditioning', 'Smart TV', 'Netflix', 'Minibar', 'Safe', 'Coffee Maker', 'Premium Toiletries'] - }, - { - 'name': 'Executive Suite', - 'description': 'Elegant suite with separate living area and premium amenities', - 'base_price': 400.00, - 'capacity': 4, - 'amenities': ['Free WiFi', 'Air Conditioning', 'Smart TV', 'Netflix', 'Minibar', 'Safe', 'Espresso Machine', 'Premium Toiletries', 'Bathrobes', 'Work Desk'] - }, - { - 'name': 'Presidential Suite', - 'description': 'The ultimate in luxury with expansive space and exclusive amenities', - 'base_price': 800.00, - 'capacity': 6, - 'amenities': ['Free WiFi', 'Air Conditioning', 'Smart TV', 'Netflix', 'Private Bar', 'Jacuzzi', 'Butler Service', 'Premium Toiletries', 'Bathrobes', 'Private Terrace'] - } - ] - - import json - for rt_data in room_types_data: - existing = db.query(RoomType).filter(RoomType.name == rt_data['name']).first() - if existing: - print(f' ✓ Room type "{rt_data["name"]}" already exists') - else: - amenities = rt_data.pop('amenities') - room_type = RoomType(**rt_data, amenities=json.dumps(amenities)) - db.add(room_type) - print(f' ✓ Created room type: {rt_data["name"]} (€{rt_data["base_price"]:.2f}/night)') - - db.commit() - print('✓ Room types seeded successfully!\n') - -def seed_admin_user(db: Session): - print('=' * 80) - print('SEEDING ADMIN USER') - print('=' * 80) - - admin_role = db.query(Role).filter(Role.name == 'admin').first() - if not admin_role: - print(' ❌ Admin role not found! Please seed roles first.') - return - - admin_email = 'admin@hotel.com' - existing_admin = db.query(User).filter(User.email == admin_email).first() - - if existing_admin: - print(f' ✓ Admin user "{admin_email}" already exists') - else: - password = 'admin123' # Default password - should be changed in production - password_bytes = password.encode('utf-8') - salt = bcrypt.gensalt() - hashed_password = bcrypt.hashpw(password_bytes, salt).decode('utf-8') - - admin_user = User( - email=admin_email, - password=hashed_password, - full_name='Administrator', - role_id=admin_role.id, - is_active=True, - currency='EUR' - ) - db.add(admin_user) - db.commit() - print(f' ✓ Created admin user: {admin_email}') - print(f' ⚠️ Default password: admin123 (please change in production!)') - - print('✓ Admin user seeded successfully!\n') - -def main(): - db = get_db() - try: - seed_roles(db) - seed_room_types(db) - seed_admin_user(db) - print('=' * 80) - print('✅ Initial data seeding completed successfully!') - print('=' * 80) - except Exception as e: - print(f'\n❌ Error: {e}') - import traceback - traceback.print_exc() - db.rollback() - finally: - db.close() - -if __name__ == '__main__': - main() - diff --git a/Backend/seeds_data/seed_loyalty_rewards.py b/Backend/seeds_data/seed_loyalty_rewards.py deleted file mode 100644 index f55e398f..00000000 --- a/Backend/seeds_data/seed_loyalty_rewards.py +++ /dev/null @@ -1,303 +0,0 @@ -import sys -import os -from pathlib import Path -sys.path.insert(0, str(Path(__file__).parent.parent)) -from sqlalchemy.orm import Session -from src.shared.config.database import SessionLocal -from src.models.loyalty_reward import LoyaltyReward, RewardType -from src.models.loyalty_tier import LoyaltyTier, TierLevel -from datetime import datetime, timedelta - -def get_db(): - db = SessionLocal() - try: - return db - finally: - pass - -def seed_loyalty_rewards(db: Session): - print('=' * 80) - print('SEEDING LOYALTY REWARDS') - print('=' * 80) - - # Get tier IDs for tier-specific rewards - bronze_tier = db.query(LoyaltyTier).filter(LoyaltyTier.level == TierLevel.bronze).first() - silver_tier = db.query(LoyaltyTier).filter(LoyaltyTier.level == TierLevel.silver).first() - gold_tier = db.query(LoyaltyTier).filter(LoyaltyTier.level == TierLevel.gold).first() - platinum_tier = db.query(LoyaltyTier).filter(LoyaltyTier.level == TierLevel.platinum).first() - - # Create default tiers if they don't exist - if not bronze_tier: - from src.services.loyalty_service import LoyaltyService - LoyaltyService.create_default_tiers(db) - db.refresh() - bronze_tier = db.query(LoyaltyTier).filter(LoyaltyTier.level == TierLevel.bronze).first() - silver_tier = db.query(LoyaltyTier).filter(LoyaltyTier.level == TierLevel.silver).first() - gold_tier = db.query(LoyaltyTier).filter(LoyaltyTier.level == TierLevel.gold).first() - platinum_tier = db.query(LoyaltyTier).filter(LoyaltyTier.level == TierLevel.platinum).first() - - # Sample rewards data - rewards_data = [ - # Discount Rewards (Available to all tiers) - { - 'name': '5% Booking Discount', - 'description': 'Get 5% off your next booking. Valid for bookings over $100.', - 'reward_type': RewardType.discount, - 'points_cost': 5000, - 'discount_percentage': 5.0, - 'max_discount_amount': 50.0, - 'min_booking_amount': 100.0, - 'applicable_tier_id': None, # Available to all tiers - 'stock_quantity': None, # Unlimited - 'icon': '🎫', - 'is_active': True - }, - { - 'name': '10% Booking Discount', - 'description': 'Get 10% off your next booking. Valid for bookings over $200.', - 'reward_type': RewardType.discount, - 'points_cost': 10000, - 'discount_percentage': 10.0, - 'max_discount_amount': 100.0, - 'min_booking_amount': 200.0, - 'applicable_tier_id': silver_tier.id if silver_tier else None, - 'stock_quantity': None, - 'icon': '🎫', - 'is_active': True - }, - { - 'name': '15% Premium Discount', - 'description': 'Get 15% off your next booking. Maximum discount $150. Valid for bookings over $300.', - 'reward_type': RewardType.discount, - 'points_cost': 15000, - 'discount_percentage': 15.0, - 'max_discount_amount': 150.0, - 'min_booking_amount': 300.0, - 'applicable_tier_id': gold_tier.id if gold_tier else None, - 'stock_quantity': None, - 'icon': '💎', - 'is_active': True - }, - { - 'name': '20% VIP Discount', - 'description': 'Exclusive 20% discount for Platinum members. Maximum discount $200. Valid for bookings over $500.', - 'reward_type': RewardType.discount, - 'points_cost': 25000, - 'discount_percentage': 20.0, - 'max_discount_amount': 200.0, - 'min_booking_amount': 500.0, - 'applicable_tier_id': platinum_tier.id if platinum_tier else None, - 'stock_quantity': None, - 'icon': '👑', - 'is_active': True - }, - - # Room Upgrade Rewards - { - 'name': 'Complimentary Room Upgrade', - 'description': 'Upgrade to the next room category at no extra cost. Subject to availability at check-in.', - 'reward_type': RewardType.room_upgrade, - 'points_cost': 20000, - 'applicable_tier_id': silver_tier.id if silver_tier else None, - 'stock_quantity': 50, # Limited stock - 'icon': '🛏️', - 'is_active': True - }, - { - 'name': 'Premium Suite Upgrade', - 'description': 'Upgrade to a premium suite or executive room. Subject to availability.', - 'reward_type': RewardType.room_upgrade, - 'points_cost': 35000, - 'applicable_tier_id': gold_tier.id if gold_tier else None, - 'stock_quantity': 30, - 'icon': '🏨', - 'is_active': True - }, - { - 'name': 'Luxury Suite Upgrade', - 'description': 'Upgrade to our most luxurious suite category. Ultimate comfort guaranteed. Subject to availability.', - 'reward_type': RewardType.room_upgrade, - 'points_cost': 50000, - 'applicable_tier_id': platinum_tier.id if platinum_tier else None, - 'stock_quantity': 20, - 'icon': '✨', - 'is_active': True - }, - - # Amenity Rewards - { - 'name': 'Welcome Amenity Package', - 'description': 'Complimentary welcome basket with fruits, chocolates, and wine upon arrival.', - 'reward_type': RewardType.amenity, - 'points_cost': 3000, - 'applicable_tier_id': None, - 'stock_quantity': None, - 'icon': '🍾', - 'is_active': True - }, - { - 'name': 'Breakfast for Two', - 'description': 'Complimentary breakfast buffet for two guests during your stay.', - 'reward_type': RewardType.amenity, - 'points_cost': 8000, - 'applicable_tier_id': None, - 'stock_quantity': None, - 'icon': '🍳', - 'is_active': True - }, - { - 'name': 'Spa Treatment Voucher', - 'description': 'One complimentary spa treatment of your choice (60 minutes). Valid for 90 days.', - 'reward_type': RewardType.amenity, - 'points_cost': 12000, - 'applicable_tier_id': silver_tier.id if silver_tier else None, - 'stock_quantity': 40, - 'icon': '💆', - 'is_active': True, - 'valid_until': datetime.utcnow() + timedelta(days=90) - }, - { - 'name': 'Romantic Dinner Package', - 'description': 'Private romantic dinner for two with wine pairing at our fine dining restaurant.', - 'reward_type': RewardType.amenity, - 'points_cost': 18000, - 'applicable_tier_id': gold_tier.id if gold_tier else None, - 'stock_quantity': 25, - 'icon': '🍽️', - 'is_active': True - }, - { - 'name': 'VIP Airport Transfer', - 'description': 'Complimentary luxury airport transfer (one-way) in premium vehicle.', - 'reward_type': RewardType.amenity, - 'points_cost': 15000, - 'applicable_tier_id': platinum_tier.id if platinum_tier else None, - 'stock_quantity': 20, - 'icon': '🚗', - 'is_active': True - }, - - # Voucher Rewards - { - 'name': '$50 Hotel Credit', - 'description': 'Redeem for $50 credit towards room service, spa, or dining at the hotel. Valid for 6 months.', - 'reward_type': RewardType.voucher, - 'points_cost': 10000, - 'discount_amount': 50.0, - 'applicable_tier_id': None, - 'stock_quantity': None, - 'icon': '💳', - 'is_active': True, - 'valid_until': datetime.utcnow() + timedelta(days=180) - }, - { - 'name': '$100 Hotel Credit', - 'description': 'Redeem for $100 credit towards any hotel service. Valid for 6 months.', - 'reward_type': RewardType.voucher, - 'points_cost': 20000, - 'discount_amount': 100.0, - 'applicable_tier_id': silver_tier.id if silver_tier else None, - 'stock_quantity': None, - 'icon': '💵', - 'is_active': True, - 'valid_until': datetime.utcnow() + timedelta(days=180) - }, - { - 'name': '$200 Premium Credit', - 'description': 'Redeem for $200 credit towards premium services. Perfect for special occasions. Valid for 1 year.', - 'reward_type': RewardType.voucher, - 'points_cost': 40000, - 'discount_amount': 200.0, - 'applicable_tier_id': gold_tier.id if gold_tier else None, - 'stock_quantity': None, - 'icon': '💰', - 'is_active': True, - 'valid_until': datetime.utcnow() + timedelta(days=365) - }, - - # Cashback Rewards - { - 'name': 'Early Check-in Benefit', - 'description': 'Guaranteed early check-in (12:00 PM) at no extra charge. Subject to availability.', - 'reward_type': RewardType.amenity, - 'points_cost': 2000, - 'applicable_tier_id': None, - 'stock_quantity': None, - 'icon': '⏰', - 'is_active': True - }, - { - 'name': 'Late Check-out Benefit', - 'description': 'Extended check-out until 2:00 PM at no extra charge. Subject to availability.', - 'reward_type': RewardType.amenity, - 'points_cost': 2000, - 'applicable_tier_id': None, - 'stock_quantity': None, - 'icon': '🕐', - 'is_active': True - }, - { - 'name': 'Free Night Stay', - 'description': 'One complimentary night stay in a standard room. Valid for bookings of 2+ nights.', - 'reward_type': RewardType.voucher, - 'points_cost': 30000, - 'applicable_tier_id': gold_tier.id if gold_tier else None, - 'stock_quantity': 15, - 'icon': '🌙', - 'is_active': True, - 'valid_until': datetime.utcnow() + timedelta(days=180) - }, - { - 'name': 'Complimentary Room Service', - 'description': '$75 credit for room service orders. Valid for one stay.', - 'reward_type': RewardType.amenity, - 'points_cost': 6000, - 'discount_amount': 75.0, - 'applicable_tier_id': None, - 'stock_quantity': None, - 'icon': '🍽️', - 'is_active': True - }, - ] - - created_count = 0 - skipped_count = 0 - - for reward_data in rewards_data: - # Check if reward already exists by name - existing = db.query(LoyaltyReward).filter(LoyaltyReward.name == reward_data['name']).first() - - if existing: - print(f' ⚠️ Reward "{reward_data["name"]}" already exists, skipping...') - skipped_count += 1 - continue - - # Create reward object - reward = LoyaltyReward(**reward_data) - db.add(reward) - print(f' ✓ Created reward: {reward_data["name"]} ({reward_data["points_cost"]:,} points)') - created_count += 1 - - db.commit() - print('\n✓ Loyalty rewards seeded successfully!') - print(f' - Created: {created_count} reward(s)') - print(f' - Skipped: {skipped_count} reward(s) (already exist)') - print('=' * 80) - -def main(): - db = get_db() - try: - seed_loyalty_rewards(db) - print('\n✅ Loyalty rewards seeding completed successfully!') - print('=' * 80) - except Exception as e: - print(f'\n❌ Error: {e}') - import traceback - traceback.print_exc() - db.rollback() - finally: - db.close() - -if __name__ == '__main__': - main() - diff --git a/Backend/seeds_data/seed_luxury_content.py b/Backend/seeds_data/seed_luxury_content.py deleted file mode 100644 index a4c31127..00000000 --- a/Backend/seeds_data/seed_luxury_content.py +++ /dev/null @@ -1,42 +0,0 @@ -import sys -import os -import json -sys.path.insert(0, os.path.join(os.path.dirname(__file__), 'src')) -from sqlalchemy.orm import Session -from src.shared.config.database import SessionLocal, engine -from src.models.page_content import PageContent -from src.models.user import User - -def seed_luxury_content(): - db: Session = SessionLocal() - try: - existing = db.query(PageContent).filter(PageContent.page_type == 'home').first() - luxury_features = [{'icon': 'Sparkles', 'title': 'Premium Amenities', 'description': 'World-class facilities designed for your comfort and relaxation'}, {'icon': 'Crown', 'title': 'Royal Service', 'description': 'Dedicated concierge service available 24/7 for all your needs'}, {'icon': 'Award', 'title': 'Award-Winning', 'description': 'Recognized for excellence in hospitality and guest satisfaction'}, {'icon': 'Shield', 'title': 'Secure & Private', 'description': 'Your privacy and security are our top priorities'}, {'icon': 'Heart', 'title': 'Personalized Care', 'description': 'Tailored experiences crafted just for you'}, {'icon': 'Gem', 'title': 'Luxury Design', 'description': 'Elegantly designed spaces with attention to every detail'}] - luxury_testimonials = [{'name': 'Sarah Johnson', 'title': 'Business Executive', 'quote': 'An absolutely stunning experience. The attention to detail and level of service exceeded all expectations.', 'image': ''}, {'name': 'Michael Chen', 'title': 'Travel Enthusiast', 'quote': 'The epitome of luxury. Every moment was perfect, from check-in to check-out.', 'image': ''}, {'name': 'Emma Williams', 'title': 'Luxury Traveler', 'quote': 'This hotel redefines what luxury means. I will definitely return.', 'image': ''}] - if existing: - existing.luxury_section_title = 'Experience Unparalleled Luxury' - existing.luxury_section_subtitle = 'Where elegance meets comfort in every detail' - existing.luxury_section_image = None - existing.luxury_features = json.dumps(luxury_features) - existing.luxury_gallery = json.dumps([]) - existing.luxury_testimonials = json.dumps(luxury_testimonials) - existing.about_preview_title = 'About Our Luxury Hotel' - existing.about_preview_content = 'Discover a world of refined elegance and exceptional service. Our hotel combines timeless luxury with modern amenities to create an unforgettable experience.' - existing.about_preview_image = None - print('✓ Updated existing home page content with luxury sections') - else: - new_content = PageContent(page_type='home', luxury_section_title='Experience Unparalleled Luxury', luxury_section_subtitle='Where elegance meets comfort in every detail', luxury_section_image=None, luxury_features=json.dumps(luxury_features), luxury_gallery=json.dumps([]), luxury_testimonials=json.dumps(luxury_testimonials), about_preview_title='About Our Luxury Hotel', about_preview_content='Discover a world of refined elegance and exceptional service. Our hotel combines timeless luxury with modern amenities to create an unforgettable experience.', about_preview_image=None, is_active=True) - db.add(new_content) - print('✓ Created new home page content with luxury sections') - db.commit() - print('✓ Luxury content seeded successfully!') - except Exception as e: - db.rollback() - print(f'✗ Error seeding luxury content: {e}') - raise - finally: - db.close() -if __name__ == '__main__': - print('Seeding luxury content...') - seed_luxury_content() - print('Done!') \ No newline at end of file diff --git a/Backend/seeds_data/seed_policy_pages.py b/Backend/seeds_data/seed_policy_pages.py deleted file mode 100755 index 6d262696..00000000 --- a/Backend/seeds_data/seed_policy_pages.py +++ /dev/null @@ -1,517 +0,0 @@ -#!/usr/bin/env python3 - -import sys -import os -from pathlib import Path -import json - -sys.path.insert(0, str(Path(__file__).parent)) - -from sqlalchemy.orm import Session -from src.shared.config.database import SessionLocal -from src.models.page_content import PageContent, PageType -from datetime import datetime - -def get_db(): - db = SessionLocal() - try: - return db - finally: - pass - -def seed_privacy_policy(db: Session): - print("=" * 80) - print("SEEDING PRIVACY POLICY PAGE CONTENT") - print("=" * 80) - - privacy_content = """ -

Introduction

-

At our hotel, we are committed to protecting your privacy and ensuring the security of your personal information. This Privacy Policy explains how we collect, use, disclose, and safeguard your information when you visit our website or use our services.

- -

Information We Collect

-

We collect information that you provide directly to us, including:

-
    -
  • Personal identification information (name, email address, phone number)
  • -
  • Payment information (credit card details, billing address)
  • -
  • Booking and reservation details
  • -
  • Preferences and special requests
  • -
- -

How We Use Your Information

-

We use the information we collect to:

-
    -
  • Process and manage your bookings and reservations
  • -
  • Communicate with you about your bookings and our services
  • -
  • Improve our services and customer experience
  • -
  • Send you promotional materials (with your consent)
  • -
  • Comply with legal obligations
  • -
- -

Data Security

-

We implement appropriate technical and organizational measures to protect your personal information against unauthorized access, alteration, disclosure, or destruction.

- -

Your Rights

-

You have the right to:

-
    -
  • Access your personal information
  • -
  • Correct inaccurate information
  • -
  • Request deletion of your information
  • -
  • Object to processing of your information
  • -
  • Data portability
  • -
- -

Contact Us

-

If you have any questions about this Privacy Policy, please contact us at privacy@hotel.com.

- -

Last updated: """ + datetime.now().strftime("%B %d, %Y") + """

- """ - - privacy_data = { - "title": "Privacy Policy", - "subtitle": "Your privacy is important to us", - "description": "Learn how we collect, use, and protect your personal information.", - "content": privacy_content, - "meta_title": "Privacy Policy - Luxury Hotel | Data Protection & Privacy", - "meta_description": "Read our privacy policy to understand how we collect, use, and protect your personal information when you use our hotel booking services." - } - - existing = db.query(PageContent).filter(PageContent.page_type == PageType.PRIVACY).first() - - if existing: - for key, value in privacy_data.items(): - setattr(existing, key, value) - existing.updated_at = datetime.utcnow() - print("✓ Updated existing privacy policy page content") - else: - new_content = PageContent( - page_type=PageType.PRIVACY, - **privacy_data - ) - db.add(new_content) - print("✓ Created new privacy policy page content") - - db.commit() - print("\n✅ Privacy policy page content seeded successfully!") - print("=" * 80) - -def seed_terms_conditions(db: Session): - print("=" * 80) - print("SEEDING TERMS & CONDITIONS PAGE CONTENT") - print("=" * 80) - - terms_content = """ -

Agreement to Terms

-

By accessing and using our hotel's website and services, you accept and agree to be bound by the terms and provision of this agreement.

- -

Booking Terms

-

When making a reservation with us, you agree to:

-
    -
  • Provide accurate and complete information
  • -
  • Be responsible for all charges incurred during your stay
  • -
  • Comply with hotel policies and regulations
  • -
  • Respect other guests and hotel property
  • -
- -

Payment Terms

-

Payment terms include:

-
    -
  • A 20% deposit is required to secure your booking
  • -
  • The remaining balance is due on arrival at the hotel
  • -
  • All prices are subject to applicable taxes and fees
  • -
  • Payment methods accepted: credit cards, debit cards, and cash
  • -
- -

Cancellation Policy

-

Our cancellation policy is as follows:

-
    -
  • Cancellations made 48 hours or more before check-in: Full refund of deposit
  • -
  • Cancellations made less than 48 hours before check-in: Deposit is non-refundable
  • -
  • No-shows: Full booking amount is charged
  • -
- -

Check-in and Check-out

-

Standard check-in time is 3:00 PM and check-out time is 11:00 AM. Early check-in and late check-out may be available upon request and subject to availability.

- -

Guest Responsibilities

-

Guests are responsible for:

-
    -
  • Any damage to hotel property
  • -
  • Compliance with all hotel rules and regulations
  • -
  • Respecting quiet hours and other guests
  • -
  • Proper use of hotel facilities
  • -
- -

Limitation of Liability

-

The hotel shall not be liable for any loss, damage, or injury to persons or property during your stay, except where such loss, damage, or injury is caused by our negligence.

- -

Modifications to Terms

-

We reserve the right to modify these terms at any time. Changes will be effective immediately upon posting on our website.

- -

Contact Information

-

For questions about these terms, please contact us at legal@hotel.com.

- -

Last updated: """ + datetime.now().strftime("%B %d, %Y") + """

- """ - - terms_data = { - "title": "Terms & Conditions", - "subtitle": "Please read these terms carefully", - "description": "Terms and conditions governing your use of our hotel booking services.", - "content": terms_content, - "meta_title": "Terms & Conditions - Luxury Hotel | Booking Terms & Policies", - "meta_description": "Read our terms and conditions to understand the rules and policies governing your bookings and stay at our luxury hotel." - } - - existing = db.query(PageContent).filter(PageContent.page_type == PageType.TERMS).first() - - if existing: - for key, value in terms_data.items(): - setattr(existing, key, value) - existing.updated_at = datetime.utcnow() - print("✓ Updated existing terms & conditions page content") - else: - new_content = PageContent( - page_type=PageType.TERMS, - **terms_data - ) - db.add(new_content) - print("✓ Created new terms & conditions page content") - - db.commit() - print("\n✅ Terms & conditions page content seeded successfully!") - print("=" * 80) - -def seed_refunds_policy(db: Session): - print("=" * 80) - print("SEEDING REFUNDS POLICY PAGE CONTENT") - print("=" * 80) - - refunds_content = """ -

Refund Policy Overview

-

At our hotel, we understand that plans can change. This policy outlines our refund procedures and timelines for various scenarios.

- -

Booking Cancellations

-

Refunds for cancelled bookings are processed as follows:

-
    -
  • More than 48 hours before check-in: Full refund of the 20% deposit
  • -
  • 48 hours or less before check-in: Deposit is non-refundable
  • -
  • No-show: No refund will be issued
  • -
- -

Early Check-out

-

If you check out earlier than your reserved departure date:

-
    -
  • You will be charged for the nights you stayed
  • -
  • The remaining 80% balance for unused nights will be refunded
  • -
  • Refunds are processed within 5-7 business days
  • -
- -

Service Issues

-

If you experience service issues during your stay:

-
    -
  • Please report the issue immediately to our front desk
  • -
  • We will make every effort to resolve the issue promptly
  • -
  • If the issue cannot be resolved, partial or full refunds may be considered on a case-by-case basis
  • -
- -

Refund Processing Time

-

Refunds are typically processed within:

-
    -
  • Credit/Debit Cards: 5-7 business days
  • -
  • Bank Transfers: 7-10 business days
  • -
  • Cash Payments: Refunds will be processed via bank transfer
  • -
- -

Refund Method

-

Refunds will be issued to the original payment method used for the booking. If the original payment method is no longer available, please contact us to arrange an alternative refund method.

- -

Non-Refundable Bookings

-

Some special offers or promotional rates may be non-refundable. This will be clearly stated at the time of booking.

- -

Force Majeure

-

In cases of force majeure (natural disasters, pandemics, government restrictions, etc.), we will work with you to reschedule your booking or provide appropriate refunds based on the circumstances.

- -

Dispute Resolution

-

If you have concerns about a refund decision, please contact our customer service team. We are committed to resolving all disputes fairly and promptly.

- -

Contact Us

-

For refund inquiries, please contact us at refunds@hotel.com or call our customer service line.

- -

Last updated: """ + datetime.now().strftime("%B %d, %Y") + """

- """ - - refunds_data = { - "title": "Refunds Policy", - "subtitle": "Our commitment to fair refunds", - "description": "Learn about our refund policies and procedures for bookings and cancellations.", - "content": refunds_content, - "meta_title": "Refunds Policy - Luxury Hotel | Cancellation & Refund Terms", - "meta_description": "Understand our refund policy, including cancellation terms, processing times, and how to request refunds for your hotel bookings." - } - - existing = db.query(PageContent).filter(PageContent.page_type == PageType.REFUNDS).first() - - if existing: - for key, value in refunds_data.items(): - setattr(existing, key, value) - existing.updated_at = datetime.utcnow() - print("✓ Updated existing refunds policy page content") - else: - new_content = PageContent( - page_type=PageType.REFUNDS, - **refunds_data - ) - db.add(new_content) - print("✓ Created new refunds policy page content") - - db.commit() - print("\n✅ Refunds policy page content seeded successfully!") - print("=" * 80) - -def seed_cancellation_policy(db: Session): - print("=" * 80) - print("SEEDING CANCELLATION POLICY PAGE CONTENT") - print("=" * 80) - - cancellation_content = """ -

Cancellation Policy Overview

-

We understand that plans can change. This policy outlines our cancellation procedures and fees.

- -

Standard Cancellation Terms

-

For standard bookings, the following cancellation terms apply:

-
    -
  • More than 48 hours before check-in: Full refund of the 20% deposit
  • -
  • 48 hours or less before check-in: Deposit is non-refundable
  • -
  • No-show: No refund will be issued
  • -
- -

Special Rate Bookings

-

Some special rates or promotional offers may have different cancellation terms. Please review your booking confirmation for specific details.

- -

How to Cancel

-

To cancel your booking:

-
    -
  • Log into your account and visit "My Bookings"
  • -
  • Select the booking you wish to cancel
  • -
  • Click "Cancel Booking" and confirm
  • -
  • Or contact us directly via phone or email
  • -
- -

Refund Processing

-

Refunds will be processed to the original payment method within 5-10 business days after cancellation confirmation.

- -

Last updated: """ + datetime.now().strftime("%B %d, %Y") + """

- """ - - cancellation_data = { - "title": "Cancellation Policy", - "subtitle": "Flexible cancellation options for your peace of mind", - "description": "Learn about our cancellation policy, fees, and refund procedures.", - "content": cancellation_content, - "meta_title": "Cancellation Policy - Luxury Hotel | Booking Cancellation Terms", - "meta_description": "Review our cancellation policy to understand cancellation fees, refund procedures, and terms for modifying or canceling your hotel booking." - } - - existing = db.query(PageContent).filter(PageContent.page_type == PageType.CANCELLATION).first() - - if existing: - for key, value in cancellation_data.items(): - setattr(existing, key, value) - existing.updated_at = datetime.utcnow() - print("✓ Updated existing cancellation policy page content") - else: - new_content = PageContent( - page_type=PageType.CANCELLATION, - **cancellation_data - ) - db.add(new_content) - print("✓ Created new cancellation policy page content") - - db.commit() - print("\n✅ Cancellation policy page content seeded successfully!") - print("=" * 80) - -def seed_accessibility_policy(db: Session): - print("=" * 80) - print("SEEDING ACCESSIBILITY PAGE CONTENT") - print("=" * 80) - - accessibility_content = """ -

Our Commitment to Accessibility

-

We are committed to ensuring that our hotel and website are accessible to all guests, regardless of ability. We strive to provide an inclusive experience for everyone.

- -

Hotel Accessibility Features

-

Our hotel offers the following accessibility features:

-
    -
  • Wheelchair-accessible rooms with roll-in showers
  • -
  • Accessible parking spaces
  • -
  • Elevator access to all floors
  • -
  • Ramp access to main entrances
  • -
  • Accessible public restrooms
  • -
  • Visual and auditory emergency alarms
  • -
  • Service animal friendly
  • -
- -

Website Accessibility

-

We are continuously working to improve the accessibility of our website. Our website includes:

-
    -
  • Keyboard navigation support
  • -
  • Screen reader compatibility
  • -
  • Alt text for images
  • -
  • High contrast options
  • -
  • Resizable text
  • -
- -

Requesting Accommodations

-

If you require specific accommodations during your stay, please contact us at least 48 hours before your arrival. We will do our best to accommodate your needs.

- -

Feedback

-

We welcome feedback on how we can improve accessibility. Please contact us with your suggestions or concerns.

- -

Last updated: """ + datetime.now().strftime("%B %d, %Y") + """

- """ - - accessibility_data = { - "title": "Accessibility", - "subtitle": "Committed to providing an inclusive experience for all guests", - "description": "Learn about our accessibility features and accommodations.", - "content": accessibility_content, - "meta_title": "Accessibility - Luxury Hotel | Accessible Accommodations", - "meta_description": "Discover our commitment to accessibility, including accessible rooms, facilities, and website features for guests with disabilities." - } - - existing = db.query(PageContent).filter(PageContent.page_type == PageType.ACCESSIBILITY).first() - - if existing: - for key, value in accessibility_data.items(): - setattr(existing, key, value) - existing.updated_at = datetime.utcnow() - print("✓ Updated existing accessibility page content") - else: - new_content = PageContent( - page_type=PageType.ACCESSIBILITY, - **accessibility_data - ) - db.add(new_content) - print("✓ Created new accessibility page content") - - db.commit() - print("\n✅ Accessibility page content seeded successfully!") - print("=" * 80) - -def seed_faq_page(db: Session): - print("=" * 80) - print("SEEDING FAQ PAGE CONTENT") - print("=" * 80) - - faq_content = """ -

Frequently Asked Questions

-

Find answers to common questions about our hotel, bookings, and services.

- -

Booking & Reservations

-

How do I make a reservation?

-

You can make a reservation online through our website, by phone, or by email. Simply select your dates, choose your room, and complete the booking process.

- -

What is the deposit requirement?

-

A 20% deposit is required to secure your booking. The remaining balance is due upon arrival at the hotel.

- -

Can I modify my booking?

-

Yes, you can modify your booking by logging into your account and visiting "My Bookings", or by contacting us directly. Changes are subject to availability and may incur fees.

- -

Check-in & Check-out

-

What are your check-in and check-out times?

-

Check-in is from 3:00 PM, and check-out is by 11:00 AM. Early check-in and late check-out may be available upon request, subject to availability.

- -

Do you offer early check-in or late check-out?

-

Early check-in and late check-out are available upon request, subject to availability. Additional fees may apply.

- -

Payment & Cancellation

-

What payment methods do you accept?

-

We accept major credit cards, debit cards, and bank transfers. Payment can be made online or at the hotel.

- -

What is your cancellation policy?

-

For cancellations made more than 48 hours before check-in, the deposit is fully refundable. Cancellations made 48 hours or less before check-in are non-refundable. Please see our Cancellation Policy page for full details.

- -

Hotel Services & Amenities

-

What amenities are included?

-

Our hotel offers complimentary Wi-Fi, parking, fitness center access, and more. Please check the room details for specific amenities.

- -

Do you have parking available?

-

Yes, we offer complimentary parking for all guests. Valet parking is also available for an additional fee.

- -

Is Wi-Fi available?

-

Yes, complimentary high-speed Wi-Fi is available throughout the hotel.

- -

Special Requests

-

Can I request a specific room?

-

Yes, you can make special requests when booking. We will do our best to accommodate your preferences, subject to availability.

- -

Do you accommodate dietary restrictions?

-

Yes, please inform us of any dietary restrictions or allergies when making your reservation, and we will do our best to accommodate your needs.

- -

Contact & Support

-

How can I contact the hotel?

-

You can contact us by phone, email, or through our website's contact form. Our team is available 24/7 to assist you.

- -

Last updated: """ + datetime.now().strftime("%B %d, %Y") + """

- """ - - faq_data = { - "title": "Frequently Asked Questions", - "subtitle": "Find answers to common questions", - "description": "Get answers to frequently asked questions about bookings, services, and policies.", - "content": faq_content, - "meta_title": "FAQ - Luxury Hotel | Frequently Asked Questions", - "meta_description": "Find answers to common questions about hotel bookings, check-in, payment, cancellation, amenities, and more." - } - - existing = db.query(PageContent).filter(PageContent.page_type == PageType.FAQ).first() - - if existing: - for key, value in faq_data.items(): - setattr(existing, key, value) - existing.updated_at = datetime.utcnow() - print("✓ Updated existing FAQ page content") - else: - new_content = PageContent( - page_type=PageType.FAQ, - **faq_data - ) - db.add(new_content) - print("✓ Created new FAQ page content") - - db.commit() - print("\n✅ FAQ page content seeded successfully!") - print("=" * 80) - -def main(): - db = get_db() - try: - print("\n") - seed_privacy_policy(db) - print("\n") - seed_terms_conditions(db) - print("\n") - seed_refunds_policy(db) - print("\n") - seed_cancellation_policy(db) - print("\n") - seed_accessibility_policy(db) - print("\n") - seed_faq_page(db) - print("\n") - print("=" * 80) - print("✅ ALL POLICY PAGES SEEDED SUCCESSFULLY!") - print("=" * 80) - print("\n") - except Exception as e: - print(f"\n❌ Error: {e}") - import traceback - traceback.print_exc() - db.rollback() - finally: - db.close() - -if __name__ == "__main__": - main() - diff --git a/Backend/seeds_data/seed_promotions.py b/Backend/seeds_data/seed_promotions.py deleted file mode 100644 index 12d65624..00000000 --- a/Backend/seeds_data/seed_promotions.py +++ /dev/null @@ -1,157 +0,0 @@ -import sys -import os -from datetime import datetime, timedelta -# Add parent directory to path to import from src -sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__)))) -from sqlalchemy.orm import Session -from src.shared.config.database import SessionLocal -from src.loyalty.models.promotion import Promotion, DiscountType - -def seed_promotions(db: Session): - """Seed promotions that match the homepage promotion codes""" - - # Calculate dates relative to current UTC date - # Use UTC consistently to match validation logic - now = datetime.utcnow() - - # Start date: Start of today (00:00:00) to ensure promotion is immediately active - start_date = datetime(now.year, now.month, now.day, 0, 0, 0) - - # End dates: future dates at end of day (23:59:59) - next_month_date = now + timedelta(days=30) - next_month = datetime(next_month_date.year, next_month_date.month, next_month_date.day, 23, 59, 59) - - next_3_months_date = now + timedelta(days=90) - next_3_months = datetime(next_3_months_date.year, next_3_months_date.month, next_3_months_date.day, 23, 59, 59) - - next_6_months_date = now + timedelta(days=180) - next_6_months = datetime(next_6_months_date.year, next_6_months_date.month, next_6_months_date.day, 23, 59, 59) - - promotions_data = [ - { - 'code': 'EARLYBIRD20', - 'name': 'Early Bird Special', - 'description': 'Book 30 days in advance and save 20% on your stay. Perfect for planning ahead!', - 'discount_type': DiscountType.percentage, - 'discount_value': 20.00, - 'start_date': start_date, - 'end_date': next_3_months, - 'is_active': True, - 'min_booking_amount': None, - 'max_discount_amount': None, - 'usage_limit': None, - }, - { - 'code': 'WEEKEND30', - 'name': 'Weekend Getaway', - 'description': 'Perfect weekend escape with complimentary breakfast and spa access. Relax and unwind!', - 'discount_type': DiscountType.percentage, - 'discount_value': 30.00, - 'start_date': start_date, - 'end_date': next_month, - 'is_active': True, - 'min_booking_amount': None, - 'max_discount_amount': None, - 'usage_limit': None, - }, - { - 'code': 'LUXURY200', - 'name': 'Luxury Suite Package', - 'description': 'Experience our premium suites with exclusive amenities, fine dining, and concierge service', - 'discount_type': DiscountType.fixed_amount, - 'discount_value': 200.00, - 'start_date': start_date, - 'end_date': next_6_months, - 'is_active': True, - 'min_booking_amount': None, # No minimum for now - 'max_discount_amount': None, - 'usage_limit': None, - }, - { - 'code': 'HONEYMOON25', - 'name': 'Honeymoon Special', - 'description': 'Romantic getaway with champagne, flowers, special amenities, and complimentary room upgrade', - 'discount_type': DiscountType.percentage, - 'discount_value': 25.00, - 'start_date': start_date, - 'end_date': next_3_months, - 'is_active': True, - 'min_booking_amount': None, - 'max_discount_amount': None, - 'usage_limit': None, - }, - { - 'code': 'FAMILY15', - 'name': 'Family Fun Package', - 'description': 'Perfect for families! Includes family room, kids activities, and complimentary meals for children under 12', - 'discount_type': DiscountType.percentage, - 'discount_value': 15.00, - 'start_date': start_date, - 'end_date': next_6_months, - 'is_active': True, - 'min_booking_amount': None, - 'max_discount_amount': None, - 'usage_limit': None, - }, - { - 'code': 'BUSINESS10', - 'name': 'Business Traveler', - 'description': 'Extended stay discounts for business travelers. Includes high-speed WiFi, workspace, and airport transfer', - 'discount_type': DiscountType.percentage, - 'discount_value': 10.00, - 'start_date': start_date, - 'end_date': next_3_months, - 'is_active': True, - 'min_booking_amount': None, - 'max_discount_amount': None, - 'usage_limit': None, - }, - ] - - created_count = 0 - updated_count = 0 - - for promo_data in promotions_data: - existing = db.query(Promotion).filter(Promotion.code == promo_data['code']).first() - - if existing: - # Update existing promotion - for key, value in promo_data.items(): - if key != 'code': # Don't update the code - setattr(existing, key, value) - existing.updated_at = datetime.utcnow() - updated_count += 1 - print(f'✓ Updated promotion: {promo_data["code"]}') - else: - # Create new promotion - promotion = Promotion(**promo_data) - db.add(promotion) - created_count += 1 - print(f'✓ Created promotion: {promo_data["code"]}') - - db.commit() - print(f'\n✓ Promotions seeded: {created_count} created, {updated_count} updated') - -def main(): - db: Session = SessionLocal() - try: - print('=' * 80) - print('SEEDING PROMOTIONS') - print('=' * 80) - print() - seed_promotions(db) - print('\n' + '=' * 80) - print('✓ All promotions seeded successfully!') - print('=' * 80) - except Exception as e: - db.rollback() - print(f'\n✗ Error seeding promotions: {e}') - import traceback - traceback.print_exc() - raise - finally: - db.close() - -if __name__ == '__main__': - main() - diff --git a/Backend/seeds_data/seed_rooms.py b/Backend/seeds_data/seed_rooms.py deleted file mode 100644 index 9f2c4ca4..00000000 --- a/Backend/seeds_data/seed_rooms.py +++ /dev/null @@ -1,141 +0,0 @@ -import sys -import os -from pathlib import Path -# Add both the seeds_data directory and the Backend directory to the path -sys.path.insert(0, str(Path(__file__).parent)) -sys.path.insert(0, str(Path(__file__).parent.parent)) -from sqlalchemy.orm import Session -from src.shared.config.database import SessionLocal, engine -from src.rooms.models.room import Room, RoomStatus -from src.rooms.models.room_type import RoomType -from datetime import datetime -import json -import random - -def get_db(): - db = SessionLocal() - try: - return db - finally: - pass - -def seed_rooms(db: Session): - print('=' * 80) - print('SEEDING ROOMS - DELETING EXISTING AND CREATING 50 NEW LUXURY ROOMS') - print('=' * 80) - room_types = db.query(RoomType).all() - if not room_types: - print('❌ No room types found! Please create room types first.') - return - print(f'\n✓ Found {len(room_types)} room type(s)') - for rt in room_types: - print(f' - {rt.name} (ID: {rt.id}, Base Price: {rt.base_price})') - from src.bookings.models.booking import Booking - from src.reviews.models.review import Review - from src.reviews.models.favorite import Favorite - existing_rooms = db.query(Room).all() - if existing_rooms: - print(f'\n🗑️ Deleting {len(existing_rooms)} existing room(s)...') - room_ids = [room.id for room in existing_rooms] - bookings_with_rooms = db.query(Booking).filter(Booking.room_id.in_(room_ids)).all() - if bookings_with_rooms: - print(f' ⚠️ Found {len(bookings_with_rooms)} booking(s) referencing these rooms') - for booking in bookings_with_rooms: - db.delete(booking) - print(f' ✓ Deleted {len(bookings_with_rooms)} booking(s)') - reviews_with_rooms = db.query(Review).filter(Review.room_id.in_(room_ids)).all() - if reviews_with_rooms: - print(f' ⚠️ Found {len(reviews_with_rooms)} review(s) referencing these rooms') - for review in reviews_with_rooms: - db.delete(review) - print(f' ✓ Deleted {len(reviews_with_rooms)} review(s)') - favorites_with_rooms = db.query(Favorite).filter(Favorite.room_id.in_(room_ids)).all() - if favorites_with_rooms: - print(f' ⚠️ Found {len(favorites_with_rooms)} favorite(s) referencing these rooms') - for favorite in favorites_with_rooms: - db.delete(favorite) - print(f' ✓ Deleted {len(favorites_with_rooms)} favorite(s)') - for room in existing_rooms: - db.delete(room) - db.commit() - print(f'✓ Deleted {len(existing_rooms)} room(s)') - views = ['Ocean View', 'City View', 'Garden View', 'Mountain View', 'Pool View', 'Beach View', 'Panoramic View', 'Sea View'] - room_sizes = ['35 sqm', '40 sqm', '45 sqm', '50 sqm', '55 sqm', '60 sqm', '70 sqm', '80 sqm', '90 sqm', '100 sqm', '120 sqm', '150 sqm', '180 sqm', '200 sqm', '250 sqm'] - luxury_room_images = ['https://images.unsplash.com/photo-1631049307264-da0ec9d70304?w=1200&h=800&fit=crop', 'https://images.unsplash.com/photo-1611892440504-42a792e24d32?w=1200&h=800&fit=crop', 'https://images.unsplash.com/photo-1590490360182-c33d57733427?w=1200&h=800&fit=crop', 'https://images.unsplash.com/photo-1564501049412-61c2a3083791?w=1200&h=800&fit=crop', 'https://images.unsplash.com/photo-1578683010236-d716f9a3f461?w=1200&h=800&fit=crop', 'https://images.unsplash.com/photo-1582719478250-c89cae4dc85b?w=1200&h=800&fit=crop', 'https://images.unsplash.com/photo-1596394516093-501ba68a0ba6?w=1200&h=800&fit=crop', 'https://images.unsplash.com/photo-1618221195710-dd6b41faaea8?w=1200&h=800&fit=crop', 'https://images.unsplash.com/photo-1566665797739-1674de7a421a?w=1200&h=800&fit=crop', 'https://images.unsplash.com/photo-1566073771259-6a8506099945?w=1200&h=800&fit=crop', 'https://images.unsplash.com/photo-1618773928121-c32242e63f39?w=1200&h=800&fit=crop', 'https://images.unsplash.com/photo-1582719508461-905c673771fd?w=1200&h=800&fit=crop', 'https://images.unsplash.com/photo-1595576508898-0ad5c879a061?w=1200&h=800&fit=crop', 'https://images.unsplash.com/photo-1571003123894-1f0594d2b5d9?w=1200&h=800&fit=crop', 'https://images.unsplash.com/photo-1566073771259-6a8506099945?w=1200&h=800&fit=crop', 'https://images.unsplash.com/photo-1578683010236-d716f9a3f461?w=1200&h=800&fit=crop', 'https://images.unsplash.com/photo-1596394516093-501ba68a0ba6?w=1200&h=800&fit=crop', 'https://images.unsplash.com/photo-1631049307264-da0ec9d70304?w=1200&h=800&fit=crop', 'https://images.unsplash.com/photo-1611892440504-42a792e24d32?w=1200&h=800&fit=crop', 'https://images.unsplash.com/photo-1590490360182-c33d57733427?w=1200&h=800&fit=crop', 'https://images.unsplash.com/photo-1564501049412-61c2a3083791?w=1200&h=800&fit=crop', 'https://images.unsplash.com/photo-1582719478250-c89cae4dc85b?w=1200&h=800&fit=crop', 'https://images.unsplash.com/photo-1618221195710-dd6b41faaea8?w=1200&h=800&fit=crop', 'https://images.unsplash.com/photo-1566665797739-1674de7a421a?w=1200&h=800&fit=crop', 'https://images.unsplash.com/photo-1618773928121-c32242e63f39?w=1200&h=800&fit=crop', 'https://images.unsplash.com/photo-1582719508461-905c673771fd?w=1200&h=800&fit=crop', 'https://images.unsplash.com/photo-1595576508898-0ad5c879a061?w=1200&h=800&fit=crop', 'https://images.unsplash.com/photo-1571003123894-1f0594d2b5d9?w=1200&h=800&fit=crop'] - all_amenities = ['Free WiFi', 'High-Speed Internet', 'Smart TV', 'Netflix', 'Air Conditioning', 'Climate Control', 'Private Balcony', 'Ocean View', 'City View', 'Minibar', 'Coffee Maker', 'Espresso Machine', 'Refrigerator', 'Safe', 'Iron & Ironing Board', 'Hair Dryer', 'Premium Toiletries', 'Bathrobes', 'Slippers', 'Work Desk', 'Ergonomic Chair', 'USB Charging Ports', 'Bluetooth Speaker', 'Sound System', 'Blackout Curtains', 'Pillow Menu', 'Turndown Service', 'Room Service', '24/7 Concierge'] - premium_amenities = ['Jacuzzi Bathtub', 'Steam Shower', 'Rain Shower', 'Bidet', 'Private Pool', 'Outdoor Terrace', 'Fireplace', 'Wine Cellar', 'Private Bar', 'Butler Service', 'Private Elevator', 'Helipad Access'] - room_configs = [((1, 3), 8, 'Garden View', (35, 45), 8, False), ((1, 3), 8, 'City View', (40, 50), 9, False), ((4, 6), 6, 'City View', (45, 55), 10, False), ((4, 6), 6, 'Pool View', (50, 60), 11, True), ((7, 9), 5, 'Ocean View', (55, 70), 12, True), ((7, 9), 5, 'Mountain View', (60, 75), 12, False), ((10, 12), 4, 'Panoramic View', (80, 100), 14, True), ((10, 12), 4, 'Sea View', (90, 110), 15, True), ((13, 15), 3, 'Ocean View', (120, 150), 16, True), ((13, 15), 3, 'Beach View', (130, 160), 17, True), ((16, 16), 2, 'Panoramic View', (200, 250), 20, True)] - rooms_created = [] - room_counter = 101 - print(f'\n🏨 Creating 50 luxury rooms...\n') - for config in room_configs: - floor_range, rooms_per_floor, view_type, size_range, amenities_count, featured = config - for floor in range(floor_range[0], floor_range[1] + 1): - for _ in range(rooms_per_floor): - if len(rooms_created) >= 50: - break - if floor <= 3: - room_type = random.choice([rt for rt in room_types if 'standard' in rt.name.lower() or 'superior' in rt.name.lower()] or room_types) - elif floor <= 6: - room_type = random.choice([rt for rt in room_types if 'superior' in rt.name.lower() or 'deluxe' in rt.name.lower()] or room_types) - elif floor <= 9: - room_type = random.choice([rt for rt in room_types if 'deluxe' in rt.name.lower() or 'executive' in rt.name.lower()] or room_types) - elif floor <= 12: - room_type = random.choice([rt for rt in room_types if 'executive' in rt.name.lower() or 'suite' in rt.name.lower()] or room_types) - else: - room_type = random.choice([rt for rt in room_types if 'suite' in rt.name.lower() or 'presidential' in rt.name.lower()] or room_types) - if not room_type: - room_type = random.choice(room_types) - base_price = float(room_type.base_price) - floor_premium = (floor - 1) * 5 - view_premium = 20 if 'Ocean' in view_type or 'Sea' in view_type or 'Beach' in view_type else 0 - view_premium += 15 if 'Panoramic' in view_type else 0 - view_premium += 10 if 'Mountain' in view_type else 0 - view_premium += 5 if 'Pool' in view_type else 0 - random_variation = base_price * random.uniform(-0.05, 0.1) - size_min, size_max = size_range - size_premium = (size_min + size_max) / 2 * 0.5 - price = base_price + floor_premium + view_premium + random_variation + size_premium - price = max(base_price * 0.95, price) - price = round(price, 2) - selected_amenities = random.sample(all_amenities, min(amenities_count, len(all_amenities))) - if floor >= 13: - premium_count = min(2, len(premium_amenities)) - selected_amenities.extend(random.sample(premium_amenities, premium_count)) - size_min, size_max = size_range - room_size = f'{random.randint(size_min, size_max)} sqm' - capacity = room_type.capacity - if random.random() > 0.7: - capacity = max(1, capacity + random.randint(-1, 1)) - room_number = f'{floor}{room_counter % 100:02d}' - room_counter += 1 - shuffled_images = luxury_room_images.copy() - random.shuffle(shuffled_images) - image_urls = shuffled_images[:3] - descriptions = [f'Elegantly designed {view_type.lower()} room with modern luxury amenities and breathtaking views.', f'Spacious {view_type.lower()} accommodation featuring premium furnishings and world-class comfort.', f'Luxurious {view_type.lower()} room with sophisticated decor and exceptional attention to detail.', f'Exquisite {view_type.lower()} suite offering unparalleled elegance and personalized service.', f'Opulent {view_type.lower()} accommodation with bespoke interiors and premium amenities.'] - description = random.choice(descriptions) - status_weights = [0.85, 0.05, 0.05, 0.05] - status = random.choices([RoomStatus.available, RoomStatus.occupied, RoomStatus.maintenance, RoomStatus.cleaning], weights=status_weights)[0] - room = Room(room_type_id=room_type.id, room_number=room_number, floor=floor, status=status, price=price, featured=featured, capacity=capacity, room_size=room_size, view=view_type, images=json.dumps(image_urls), amenities=json.dumps(selected_amenities), description=description) - db.add(room) - rooms_created.append({'number': room_number, 'floor': floor, 'type': room_type.name, 'view': view_type, 'price': price}) - print(f' ✓ Created Room {room_number} - Floor {floor}, {room_type.name}, {view_type}, {room_size}, €{price:.2f}') - db.commit() - print(f'\n✅ Successfully created {len(rooms_created)} luxury rooms!') - print(f'\n📊 Summary:') - featured_count = sum((1 for r in rooms_created if any((config[5] and r['floor'] >= config[0][0] and (r['floor'] <= config[0][1]) for config in room_configs)))) - print(f' - Featured rooms: {featured_count}') - print(f' - Floors: {min((r['floor'] for r in rooms_created))} - {max((r['floor'] for r in rooms_created))}') - print(f' - Price range: €{min((r['price'] for r in rooms_created)):.2f} - €{max((r['price'] for r in rooms_created)):.2f}') - print('=' * 80) -if __name__ == '__main__': - db = get_db() - try: - seed_rooms(db) - except Exception as e: - print(f'\n❌ Error: {e}') - import traceback - traceback.print_exc() - db.rollback() - finally: - db.close() \ No newline at end of file diff --git a/Backend/seeds_data/seed_services.py b/Backend/seeds_data/seed_services.py deleted file mode 100644 index a382e99f..00000000 --- a/Backend/seeds_data/seed_services.py +++ /dev/null @@ -1,218 +0,0 @@ -import sys -import os -import json -import re -from pathlib import Path -# Add parent directory to path to import from src -sys.path.insert(0, str(Path(__file__).parent.parent)) -from sqlalchemy.orm import Session -from src.shared.config.database import SessionLocal -# Import all models to ensure relationships are set up -from src.models import * # This ensures all models are loaded and relationships are configured -from src.hotel_services.models.service import Service - -def generate_slug(name: str) -> str: - """Generate a URL-friendly slug from a name""" - slug = name.lower() - slug = re.sub(r'[^a-z0-9\s-]', '', slug) - slug = re.sub(r'\s+', '-', slug) - slug = re.sub(r'-+', '-', slug) - return slug.strip('-') - -def seed_services(db: Session): - """Seed initial services data""" - print('Seeding services...') - - services_data = [ - { - 'name': 'Room Service', - 'description': '24/7 in-room dining service with a wide selection of gourmet meals, snacks, and beverages delivered directly to your room.', - 'price': 25.00, - 'category': 'Dining', - 'slug': 'room-service', - 'image': 'https://images.unsplash.com/photo-1556911220-bff31c812dba?w=600', - 'content': '

Enjoy the convenience of 24/7 room service with our extensive menu featuring international cuisine, local specialties, and premium beverages. Our professional staff ensures your meals are delivered hot, fresh, and beautifully presented.

From breakfast in bed to late-night snacks, we cater to all your dining needs with the highest standards of quality and service.

', - 'sections': json.dumps([]), - 'meta_title': 'Room Service - Luxury Hotel', - 'meta_description': '24/7 in-room dining service with gourmet meals delivered to your room.', - 'meta_keywords': 'room service, in-room dining, hotel service, 24/7 service', - 'is_active': True - }, - { - 'name': 'Spa & Massage', - 'description': 'Relaxing spa treatments and professional massage therapy to rejuvenate your mind and body.', - 'price': 120.00, - 'category': 'Wellness', - 'slug': 'spa-massage', - 'image': 'https://images.unsplash.com/photo-1544161515-4ab6ce6db874?w=600', - 'content': '

Indulge in our world-class spa treatments designed to restore balance and vitality. Our expert therapists offer a range of services including Swedish massage, deep tissue massage, hot stone therapy, and aromatherapy.

Each treatment is customized to your preferences, using premium products and ancient techniques to provide an unparalleled wellness experience.

', - 'sections': json.dumps([]), - 'meta_title': 'Spa & Massage Services - Luxury Hotel', - 'meta_description': 'Professional spa treatments and massage therapy for ultimate relaxation and rejuvenation.', - 'meta_keywords': 'spa, massage, wellness, relaxation, therapy', - 'is_active': True - }, - { - 'name': 'Laundry Service', - 'description': 'Professional dry cleaning and laundry service with same-day or next-day delivery options.', - 'price': 15.00, - 'category': 'Housekeeping', - 'slug': 'laundry-service', - 'image': 'https://images.unsplash.com/photo-1582735689369-4fe89db7114c?w=600', - 'content': '

Keep your wardrobe fresh and clean with our professional laundry and dry cleaning service. We handle everything from delicate garments to business suits with the utmost care and attention.

Choose from same-day express service or standard next-day delivery. All items are professionally cleaned, pressed, and returned to your room.

', - 'sections': json.dumps([]), - 'meta_title': 'Laundry & Dry Cleaning Service - Luxury Hotel', - 'meta_description': 'Professional laundry and dry cleaning service with same-day or next-day delivery.', - 'meta_keywords': 'laundry, dry cleaning, hotel service, cleaning', - 'is_active': True - }, - { - 'name': 'Airport Transfer', - 'description': 'Complimentary airport pickup and drop-off service in luxury vehicles with professional drivers.', - 'price': 50.00, - 'category': 'Transportation', - 'slug': 'airport-transfer', - 'image': 'https://images.unsplash.com/photo-1449824913935-59a10b8d2000?w=600', - 'content': '

Travel in comfort and style with our premium airport transfer service. Our fleet of luxury vehicles, including sedans and SUVs, ensures a smooth and comfortable journey to or from the airport.

Our professional drivers are punctual, courteous, and knowledgeable about the local area. Flight monitoring ensures we adjust to any delays or early arrivals.

', - 'sections': json.dumps([]), - 'meta_title': 'Airport Transfer Service - Luxury Hotel', - 'meta_description': 'Premium airport pickup and drop-off service in luxury vehicles.', - 'meta_keywords': 'airport transfer, transportation, airport shuttle, luxury car', - 'is_active': True - }, - { - 'name': 'Concierge Service', - 'description': 'Personalized assistance for restaurant reservations, event tickets, tours, and special requests.', - 'price': 0.00, - 'category': 'Concierge', - 'slug': 'concierge-service', - 'image': 'https://images.unsplash.com/photo-1558618666-fcd25c85cd64?w=600', - 'content': '

Our dedicated concierge team is available 24/7 to ensure your stay is nothing short of extraordinary. From restaurant reservations and event tickets to private tours and transportation arrangements, we handle every detail with precision and care.

Whether you need assistance with business arrangements, special celebrations, or unique local experiences, our concierge team has the expertise and connections to make it happen.

', - 'sections': json.dumps([]), - 'meta_title': 'Concierge Services - Luxury Hotel', - 'meta_description': 'Personalized assistance for all your travel and entertainment needs, available 24/7.', - 'meta_keywords': 'concierge, personal assistant, travel services, luxury service', - 'is_active': True - }, - { - 'name': 'Fitness Center Access', - 'description': 'Access to our state-of-the-art fitness center with modern equipment and personal training options.', - 'price': 20.00, - 'category': 'Wellness', - 'slug': 'fitness-center', - 'image': 'https://images.unsplash.com/photo-1534438327276-14e5300c3a48?w=600', - 'content': '

Maintain your fitness routine at our fully equipped fitness center featuring the latest cardio and strength training equipment. Our facilities are open 24/7 for your convenience.

Enhance your workout with personal training sessions, group fitness classes, or yoga sessions led by certified instructors. Towels, water, and fresh fruit are provided.

', - 'sections': json.dumps([]), - 'meta_title': 'Fitness Center - Luxury Hotel', - 'meta_description': 'State-of-the-art fitness center with modern equipment and personal training options.', - 'meta_keywords': 'fitness center, gym, workout, exercise, personal training', - 'is_active': True - }, - { - 'name': 'Business Center', - 'description': 'Fully equipped business center with meeting rooms, printing, copying, and secretarial services.', - 'price': 30.00, - 'category': 'Business', - 'slug': 'business-center', - 'image': 'https://images.unsplash.com/photo-1497366216548-37526070297c?w=600', - 'content': '

Stay productive with our fully equipped business center featuring private meeting rooms, high-speed internet, printing and copying services, and professional secretarial support.

Our meeting rooms can accommodate small groups and are equipped with presentation equipment, video conferencing capabilities, and refreshments.

', - 'sections': json.dumps([]), - 'meta_title': 'Business Center Services - Luxury Hotel', - 'meta_description': 'Fully equipped business center with meeting rooms and professional services.', - 'meta_keywords': 'business center, meeting room, conference, office services', - 'is_active': True - }, - { - 'name': 'Valet Parking', - 'description': 'Secure valet parking service with 24/7 vehicle care and quick retrieval.', - 'price': 35.00, - 'category': 'Transportation', - 'slug': 'valet-parking', - 'image': 'https://images.unsplash.com/photo-1502877338535-766e1452684a?w=600', - 'content': '

Enjoy the convenience of valet parking with our professional service. Your vehicle will be safely parked and secured, ready for quick retrieval whenever you need it.

Our valet team is available 24/7 and can also assist with luggage handling and vehicle care services.

', - 'sections': json.dumps([]), - 'meta_title': 'Valet Parking Service - Luxury Hotel', - 'meta_description': 'Secure valet parking service with 24/7 vehicle care and quick retrieval.', - 'meta_keywords': 'valet parking, parking service, car service, vehicle care', - 'is_active': True - }, - { - 'name': 'Babysitting Service', - 'description': 'Professional and certified babysitting service for your peace of mind.', - 'price': 25.00, - 'category': 'Family', - 'slug': 'babysitting-service', - 'image': 'https://images.unsplash.com/photo-1503454537195-1dcabb73ffb9?w=600', - 'content': '

Enjoy your time knowing your children are in safe hands with our professional babysitting service. Our certified caregivers are experienced, background-checked, and trained in child safety and first aid.

Available for both in-room care and supervised activities, we ensure your children are entertained and well-cared for while you enjoy your stay.

', - 'sections': json.dumps([]), - 'meta_title': 'Babysitting Service - Luxury Hotel', - 'meta_description': 'Professional and certified babysitting service for your peace of mind.', - 'meta_keywords': 'babysitting, childcare, kids service, family service', - 'is_active': True - }, - { - 'name': 'Pet Care Service', - 'description': 'Pet-friendly accommodations with pet care services including walking, feeding, and grooming.', - 'price': 20.00, - 'category': 'Pet Services', - 'slug': 'pet-care-service', - 'image': 'https://images.unsplash.com/photo-1601758228041-f3b2795255f1?w=600', - 'content': '

Your furry friends are welcome at our hotel! We offer pet-friendly accommodations and a range of pet care services including daily walks, feeding, and grooming.

Our pet care team ensures your pets are comfortable and well-cared for during your stay. Pet amenities including beds, bowls, and treats are provided.

', - 'sections': json.dumps([]), - 'meta_title': 'Pet Care Services - Luxury Hotel', - 'meta_description': 'Pet-friendly accommodations with professional pet care services.', - 'meta_keywords': 'pet care, pet service, dog walking, pet friendly', - 'is_active': True - } - ] - - created_count = 0 - updated_count = 0 - - for service_data in services_data: - # Check if service already exists by slug - existing = db.query(Service).filter(Service.slug == service_data['slug']).first() - - if existing: - # Update existing service - for key, value in service_data.items(): - if key != 'slug': # Don't update slug - setattr(existing, key, value) - updated_count += 1 - print(f' ✓ Updated service: {service_data["name"]}') - else: - # Create new service - service = Service(**service_data) - db.add(service) - created_count += 1 - print(f' ✓ Created service: {service_data["name"]}') - - db.commit() - print(f'\n✓ Services seeded successfully!') - print(f' - Created: {created_count}') - print(f' - Updated: {updated_count}') - print(f' - Total: {len(services_data)}\n') - -def main(): - db: Session = SessionLocal() - try: - print('=' * 80) - print('SEEDING SERVICES') - print('=' * 80) - print() - seed_services(db) - print('=' * 80) - print('✓ All services data seeded successfully!') - print('=' * 80) - except Exception as e: - db.rollback() - print(f'\n✗ Error seeding services: {e}') - import traceback - traceback.print_exc() - raise - finally: - db.close() - -if __name__ == '__main__': - main() - diff --git a/Backend/seeds_data/seed_services_enterprise.py b/Backend/seeds_data/seed_services_enterprise.py deleted file mode 100644 index b2190617..00000000 --- a/Backend/seeds_data/seed_services_enterprise.py +++ /dev/null @@ -1,756 +0,0 @@ -import sys -import os -import json -import re -from pathlib import Path -# Add parent directory to path to import from src -sys.path.insert(0, str(Path(__file__).parent.parent)) -from sqlalchemy.orm import Session -from src.shared.config.database import SessionLocal -# Import all models to ensure relationships are set up -from src.models import * # This ensures all models are loaded and relationships are configured -from src.hotel_services.models.service import Service - -def generate_slug(name: str) -> str: - """Generate a URL-friendly slug from a name""" - slug = name.lower() - slug = re.sub(r'[^a-z0-9\s-]', '', slug) - slug = re.sub(r'\s+', '-', slug) - slug = re.sub(r'-+', '-', slug) - return slug.strip('-') - -def seed_enterprise_services(db: Session): - """Seed enterprise-level services with rich detail page content""" - print('Seeding enterprise services...') - - services_data = [ - { - 'name': 'Luxury Spa & Wellness Retreat', - 'description': 'Indulge in our world-class spa treatments designed to restore balance and vitality. Experience ultimate relaxation with our expert therapists.', - 'price': 250.00, - 'category': 'Wellness', - 'slug': 'luxury-spa-wellness-retreat', - 'image': 'https://images.unsplash.com/photo-1544161515-4ab6ce6db874?w=1200&h=800&fit=crop', - 'content': '''
-

Experience Ultimate Relaxation

-

Our Luxury Spa & Wellness Retreat offers an unparalleled journey of rejuvenation and tranquility. Nestled in a serene environment, our spa combines ancient healing traditions with modern wellness techniques to create a transformative experience.

- -

What's Included

-
    -
  • 90-minute signature massage therapy
  • -
  • Access to steam room and sauna
  • -
  • Complimentary herbal tea and refreshments
  • -
  • Premium aromatherapy oils and products
  • -
  • Relaxation lounge access
  • -
- -

Our Signature Treatments

-

Choose from our curated selection of treatments including Swedish massage, deep tissue therapy, hot stone massage, and aromatherapy sessions. Each treatment is customized to your specific needs and preferences.

- -

Expert Therapists

-

Our team of certified therapists brings years of experience and a deep understanding of holistic wellness. They are trained in various massage techniques and wellness practices to ensure you receive the highest quality care.

-
''', - 'sections': json.dumps([ - { - 'type': 'hero', - 'title': 'Transform Your Wellbeing', - 'content': 'Discover a sanctuary of peace and rejuvenation where every detail is designed to restore your mind, body, and spirit.', - 'image': 'https://images.unsplash.com/photo-1544161515-4ab6ce6db874?w=1200&h=600&fit=crop' - }, - { - 'type': 'features', - 'title': 'Why Choose Our Spa', - 'features': [ - {'title': 'Expert Therapists', 'description': 'Certified professionals with years of experience', 'icon': 'User'}, - {'title': 'Premium Products', 'description': 'Luxury skincare and aromatherapy products', 'icon': 'Sparkles'}, - {'title': 'Customized Treatments', 'description': 'Personalized sessions tailored to your needs', 'icon': 'Heart'}, - {'title': 'Serene Environment', 'description': 'Peaceful setting designed for relaxation', 'icon': 'Leaf'} - ] - }, - { - 'type': 'quote', - 'quote': 'The most luxurious spa experience I\'ve ever had. Truly transformative.', - 'author': 'Sarah M., Guest' - } - ]), - 'meta_title': 'Luxury Spa & Wellness Retreat - Premium Hotel Services', - 'meta_description': 'Experience ultimate relaxation with our world-class spa treatments. Expert therapists, premium products, and a serene environment await you.', - 'meta_keywords': 'luxury spa, wellness retreat, massage therapy, hotel spa, relaxation, aromatherapy, wellness services', - 'is_active': True - }, - { - 'name': 'Fine Dining Experience', - 'description': 'Savor culinary excellence at our Michelin-starred restaurants. World-renowned chefs craft exquisite dishes using the finest ingredients.', - 'price': 150.00, - 'category': 'Dining', - 'slug': 'fine-dining-experience', - 'image': 'https://images.unsplash.com/photo-1414235077428-338989a2e8c0?w=1200&h=800&fit=crop', - 'content': '''
-

Culinary Excellence Awaits

-

Embark on a gastronomic journey at our award-winning restaurants, where culinary artistry meets exceptional service. Our Michelin-starred chefs create masterpieces that celebrate both local traditions and international flavors.

- -

Our Restaurants

-
    -
  • The Grand Ballroom: Elegant fine dining with seasonal tasting menus
  • -
  • Sky Terrace: Rooftop dining with panoramic city views
  • -
  • Chef's Table: Intimate 8-seat private dining experience
  • -
  • Wine Cellar: Exclusive wine pairing dinners
  • -
- -

What's Included

-
    -
  • Multi-course tasting menu
  • -
  • Wine pairing recommendations
  • -
  • Complimentary amuse-bouche
  • -
  • Professional sommelier service
  • -
  • Personalized menu customization
  • -
- -

Reservation Information

-

Reservations are recommended and can be made through our concierge or directly at the restaurant. Special dietary requirements and preferences are accommodated with advance notice.

-
''', - 'sections': json.dumps([ - { - 'type': 'hero', - 'title': 'A Culinary Journey Like No Other', - 'content': 'Where every dish tells a story and every meal becomes a memory.', - 'image': 'https://images.unsplash.com/photo-1414235077428-338989a2e8c0?w=1200&h=600&fit=crop' - }, - { - 'type': 'gallery', - 'title': 'Our Culinary Creations', - 'images': [ - 'https://images.unsplash.com/photo-1414235077428-338989a2e8c0?w=800', - 'https://images.unsplash.com/photo-1556911220-bff31c812dba?w=800', - 'https://images.unsplash.com/photo-1517248135467-4c7edcad34c4?w=800' - ] - }, - { - 'type': 'quote', - 'quote': 'An extraordinary dining experience that exceeded all expectations. The attention to detail is remarkable.', - 'author': 'Michael R., Food Critic' - } - ]), - 'meta_title': 'Fine Dining Experience - Michelin-Starred Restaurant', - 'meta_description': 'Savor culinary excellence at our Michelin-starred restaurants. World-renowned chefs, exquisite dishes, and exceptional service.', - 'meta_keywords': 'fine dining, michelin star, luxury restaurant, gourmet cuisine, fine dining hotel', - 'is_active': True - }, - { - 'name': '24/7 Premium Room Service', - 'description': 'Enjoy the convenience of round-the-clock in-room dining with our extensive menu featuring international cuisine and premium beverages.', - 'price': 35.00, - 'category': 'Dining', - 'slug': 'premium-room-service', - 'image': 'https://images.unsplash.com/photo-1556911220-bff31c812dba?w=1200&h=800&fit=crop', - 'content': '''
-

Dining at Your Convenience

-

Experience the ultimate in-room dining service available 24 hours a day. From breakfast in bed to late-night snacks, our extensive menu caters to every craving with the highest standards of quality and presentation.

- -

Menu Highlights

-
    -
  • Breakfast: Continental, American, and healthy options
  • -
  • Lunch & Dinner: International cuisine, local specialties, and chef's recommendations
  • -
  • Desserts: Artisanal pastries and premium ice creams
  • -
  • Beverages: Premium wines, craft cocktails, and specialty coffees
  • -
- -

Service Features

-
    -
  • Average delivery time: 25-30 minutes
  • -
  • Professional table setup in your room
  • -
  • Hot meals served at optimal temperature
  • -
  • Special dietary accommodations available
  • -
  • Complimentary bread and butter service
  • -
- -

How to Order

-

Simply call our room service line from your in-room phone or use our mobile app. Our team is available 24/7 to take your order and ensure prompt delivery.

-
''', - 'sections': json.dumps([ - { - 'type': 'features', - 'title': 'Why Choose Our Room Service', - 'features': [ - {'title': '24/7 Availability', 'description': 'Order anytime, day or night', 'icon': 'Clock'}, - {'title': 'Fast Delivery', 'description': 'Average 25-30 minute delivery time', 'icon': 'Zap'}, - {'title': 'Premium Quality', 'description': 'Restaurant-quality meals in your room', 'icon': 'Award'}, - {'title': 'Professional Service', 'description': 'Elegant table setup and presentation', 'icon': 'UserCheck'} - ] - } - ]), - 'meta_title': '24/7 Premium Room Service - Luxury Hotel', - 'meta_description': 'Enjoy round-the-clock in-room dining with our extensive menu. International cuisine, premium beverages, and professional service delivered to your room.', - 'meta_keywords': 'room service, in-room dining, 24/7 service, hotel dining, room service menu', - 'is_active': True - }, - { - 'name': 'Executive Business Center', - 'description': 'Fully equipped business center with private meeting rooms, high-speed internet, printing services, and professional secretarial support.', - 'price': 75.00, - 'category': 'Business', - 'slug': 'executive-business-center', - 'image': 'https://images.unsplash.com/photo-1497366216548-37526070297c?w=1200&h=800&fit=crop', - 'content': '''
-

Your Office Away From Office

-

Stay productive with our state-of-the-art Executive Business Center, designed to meet all your professional needs. Whether you need a quiet workspace, a meeting room, or professional support services, we have everything you need.

- -

Facilities & Services

-
    -
  • Private Meeting Rooms: Various sizes accommodating 2-20 people
  • -
  • High-Speed Internet: Fiber-optic connection with secure Wi-Fi
  • -
  • Printing & Copying: Color and black & white printing, scanning, and binding
  • -
  • Presentation Equipment: Projectors, screens, video conferencing
  • -
  • Secretarial Services: Typing, translation, and administrative support
  • -
  • Refreshments: Complimentary coffee, tea, and water
  • -
- -

Meeting Room Features

-
    -
  • Soundproof walls for privacy
  • -
  • Ergonomic seating and modern furniture
  • -
  • Whiteboards and flip charts
  • -
  • Video conferencing capabilities
  • -
  • Climate control and natural lighting
  • -
- -

Reservation

-

Meeting rooms can be reserved in advance through our concierge or business center. Hourly and daily rates available. Special packages for extended stays.

-
''', - 'sections': json.dumps([ - { - 'type': 'hero', - 'title': 'Productivity Meets Luxury', - 'content': 'A professional workspace designed for success, equipped with everything you need to stay productive.', - 'image': 'https://images.unsplash.com/photo-1497366216548-37526070297c?w=1200&h=600&fit=crop' - }, - { - 'type': 'features', - 'title': 'Everything You Need', - 'features': [ - {'title': 'Private Meeting Rooms', 'description': 'Various sizes for any business need', 'icon': 'Users'}, - {'title': 'High-Speed Internet', 'description': 'Fiber-optic connection with secure Wi-Fi', 'icon': 'Wifi'}, - {'title': 'Professional Support', 'description': 'Secretarial and administrative services', 'icon': 'Briefcase'}, - {'title': 'Modern Equipment', 'description': 'Latest technology and presentation tools', 'icon': 'Monitor'} - ] - } - ]), - 'meta_title': 'Executive Business Center - Professional Workspace', - 'meta_description': 'Fully equipped business center with meeting rooms, high-speed internet, printing services, and professional support. Your office away from office.', - 'meta_keywords': 'business center, meeting room, conference room, office services, hotel business center', - 'is_active': True - }, - { - 'name': 'Luxury Airport Transfer', - 'description': 'Travel in comfort and style with our premium airport transfer service. Luxury vehicles, professional drivers, and flight monitoring for a seamless journey.', - 'price': 85.00, - 'category': 'Transportation', - 'slug': 'luxury-airport-transfer', - 'image': 'https://images.unsplash.com/photo-1449824913935-59a10b8d2000?w=1200&h=800&fit=crop', - 'content': '''
-

Arrive in Style

-

Begin or end your journey with our premium airport transfer service. Our fleet of luxury vehicles and professional drivers ensure a comfortable, punctual, and stress-free experience.

- -

Our Fleet

-
    -
  • Luxury Sedans: Premium sedans for up to 3 passengers
  • -
  • Executive SUVs: Spacious SUVs for up to 6 passengers
  • -
  • Luxury Vans: Large vehicles for groups up to 8 passengers
  • -
  • VIP Limousines: Ultimate luxury for special occasions
  • -
- -

Service Features

-
    -
  • Flight monitoring for delays and early arrivals
  • -
  • Meet & greet service at the airport
  • -
  • Complimentary bottled water and newspapers
  • -
  • Luggage assistance
  • -
  • Wi-Fi connectivity in vehicles
  • -
  • Professional, licensed, and insured drivers
  • -
- -

Booking Information

-

Reservations should be made at least 24 hours in advance. Please provide flight details for arrival transfers. Our team monitors flights and adjusts pickup times accordingly.

-
''', - 'sections': json.dumps([ - { - 'type': 'hero', - 'title': 'Your Journey Starts Here', - 'content': 'Experience the comfort and convenience of premium airport transfers.', - 'image': 'https://images.unsplash.com/photo-1449824913935-59a10b8d2000?w=1200&h=600&fit=crop' - }, - { - 'type': 'features', - 'title': 'Why Choose Our Transfer Service', - 'features': [ - {'title': 'Luxury Fleet', 'description': 'Premium vehicles for every need', 'icon': 'Car'}, - {'title': 'Professional Drivers', 'description': 'Licensed, experienced, and courteous', 'icon': 'User'}, - {'title': 'Flight Monitoring', 'description': 'Automatic updates for delays', 'icon': 'Plane'}, - {'title': 'Complimentary Amenities', 'description': 'Water, Wi-Fi, and newspapers', 'icon': 'Gift'} - ] - } - ]), - 'meta_title': 'Luxury Airport Transfer - Premium Transportation', - 'meta_description': 'Travel in comfort with our premium airport transfer service. Luxury vehicles, professional drivers, and flight monitoring for a seamless journey.', - 'meta_keywords': 'airport transfer, luxury transportation, airport shuttle, hotel transfer, airport service', - 'is_active': True - }, - { - 'name': 'Personal Concierge Service', - 'description': 'Dedicated 24/7 concierge assistance for restaurant reservations, event tickets, tours, transportation, and all your special requests.', - 'price': 0.00, - 'category': 'Concierge', - 'slug': 'personal-concierge-service', - 'image': 'https://images.unsplash.com/photo-1558618666-fcd25c85cd64?w=1200&h=800&fit=crop', - 'content': '''
-

Your Personal Assistant

-

Our dedicated concierge team is available 24/7 to ensure your stay is nothing short of extraordinary. From restaurant reservations and event tickets to private tours and unique experiences, we handle every detail with precision and care.

- -

Services We Provide

-
    -
  • Dining: Restaurant reservations at the finest establishments
  • -
  • Entertainment: Theater tickets, concerts, and event access
  • -
  • Tours & Activities: Private tours, cultural experiences, and adventure activities
  • -
  • Transportation: Car rentals, chauffeur services, and travel arrangements
  • -
  • Business Services: Meeting room bookings, translation services, and more
  • -
  • Special Requests: Gift arrangements, celebrations, and unique experiences
  • -
- -

How We Can Help

-

Whether you need last-minute reservations at a popular restaurant, tickets to a sold-out show, or help planning a special celebration, our concierge team has the expertise and connections to make it happen. No request is too big or too small.

- -

Contact Us

-

Reach our concierge team 24/7 via phone, email, or in-person at the concierge desk. We're here to make your stay unforgettable.

-
''', - 'sections': json.dumps([ - { - 'type': 'hero', - 'title': 'Making Your Dreams Come True', - 'content': 'Your personal assistant, available 24/7 to fulfill every request.', - 'image': 'https://images.unsplash.com/photo-1558618666-fcd25c85cd64?w=1200&h=600&fit=crop' - }, - { - 'type': 'cta', - 'title': 'Need Assistance?', - 'cta_text': 'Contact Our Concierge', - 'cta_link': '/contact', - 'content': 'Our team is standing by to help with any request, big or small.' - } - ]), - 'meta_title': 'Personal Concierge Service - 24/7 Assistance', - 'meta_description': 'Dedicated 24/7 concierge service for restaurant reservations, event tickets, tours, and all your special requests. Making your stay extraordinary.', - 'meta_keywords': 'concierge service, personal assistant, hotel concierge, travel services, luxury service', - 'is_active': True - }, - { - 'name': 'State-of-the-Art Fitness Center', - 'description': 'Access our fully equipped fitness center with modern equipment, personal training options, and group fitness classes. Open 24/7 for your convenience.', - 'price': 30.00, - 'category': 'Wellness', - 'slug': 'fitness-center-access', - 'image': 'https://images.unsplash.com/photo-1534438327276-14e5300c3a48?w=1200&h=800&fit=crop', - 'content': '''
-

Stay Fit, Stay Strong

-

Maintain your fitness routine at our state-of-the-art fitness center featuring the latest cardio and strength training equipment. Our facilities are designed to meet the needs of both casual exercisers and serious athletes.

- -

Equipment & Facilities

-
    -
  • Cardio Equipment: Treadmills, ellipticals, stationary bikes, and rowing machines
  • -
  • Strength Training: Free weights, weight machines, and functional training equipment
  • -
  • Group Fitness Studio: Space for yoga, Pilates, and group classes
  • -
  • Locker Rooms: Spacious lockers, showers, and sauna access
  • -
  • Complimentary Amenities: Towels, water, fresh fruit, and protein bars
  • -
- -

Additional Services

-
    -
  • Personal Training: One-on-one sessions with certified trainers
  • -
  • Group Classes: Yoga, Pilates, spinning, and HIIT classes
  • -
  • Fitness Assessments: Body composition analysis and fitness evaluations
  • -
  • Nutritional Guidance: Consultation with our wellness experts
  • -
- -

Operating Hours

-

Our fitness center is open 24/7 for your convenience. Personal training and group classes are available by appointment. Check the schedule at the front desk or contact our fitness team.

-
''', - 'sections': json.dumps([ - { - 'type': 'hero', - 'title': 'Your Fitness Journey Continues', - 'content': 'World-class equipment and expert guidance to help you achieve your fitness goals.', - 'image': 'https://images.unsplash.com/photo-1534438327276-14e5300c3a48?w=1200&h=600&fit=crop' - }, - { - 'type': 'features', - 'title': 'Why Our Fitness Center', - 'features': [ - {'title': '24/7 Access', 'description': 'Work out on your schedule', 'icon': 'Clock'}, - {'title': 'Modern Equipment', 'description': 'Latest cardio and strength training machines', 'icon': 'Activity'}, - {'title': 'Expert Trainers', 'description': 'Certified personal trainers available', 'icon': 'User'}, - {'title': 'Group Classes', 'description': 'Yoga, Pilates, and more', 'icon': 'Users'} - ] - } - ]), - 'meta_title': 'State-of-the-Art Fitness Center - 24/7 Access', - 'meta_description': 'Fully equipped fitness center with modern equipment, personal training, and group classes. Open 24/7 for your convenience.', - 'meta_keywords': 'fitness center, gym, hotel gym, workout, exercise, personal training, 24/7 gym', - 'is_active': True - }, - { - 'name': 'Premium Laundry & Dry Cleaning', - 'description': 'Professional laundry and dry cleaning service with same-day express or next-day standard delivery. Expert care for all your garments.', - 'price': 20.00, - 'category': 'Housekeeping', - 'slug': 'premium-laundry-dry-cleaning', - 'image': 'https://images.unsplash.com/photo-1582735689369-4fe89db7114c?w=1200&h=800&fit=crop', - 'content': '''
-

Expert Garment Care

-

Keep your wardrobe fresh and impeccably maintained with our professional laundry and dry cleaning service. We handle everything from delicate silk garments to business suits with the utmost care and attention to detail.

- -

Our Services

-
    -
  • Dry Cleaning: Professional cleaning for suits, dresses, and delicate fabrics
  • -
  • Laundry Service: Washing, drying, and pressing for everyday garments
  • -
  • Pressing Only: Professional pressing and steaming services
  • -
  • Alterations: Minor repairs and adjustments available
  • -
  • Specialty Items: Wedding dresses, formal wear, and designer garments
  • -
- -

Delivery Options

-
    -
  • Express Service: Same-day delivery (orders before 9 AM)
  • -
  • Standard Service: Next-day delivery
  • -
  • Bulk Service: Special rates for multiple items
  • -
- -

How to Use

-

Simply place your items in the laundry bag provided in your room and call housekeeping. Our team will collect your items, process them with care, and return them to your room at the specified time.

-
''', - 'sections': json.dumps([ - { - 'type': 'features', - 'title': 'Why Choose Our Service', - 'features': [ - {'title': 'Expert Care', 'description': 'Professional handling of all garment types', 'icon': 'Shield'}, - {'title': 'Fast Service', 'description': 'Same-day express option available', 'icon': 'Zap'}, - {'title': 'Quality Guarantee', 'description': 'Satisfaction guaranteed on all services', 'icon': 'CheckCircle'}, - {'title': 'Eco-Friendly', 'description': 'Environmentally conscious cleaning methods', 'icon': 'Leaf'} - ] - } - ]), - 'meta_title': 'Premium Laundry & Dry Cleaning - Professional Service', - 'meta_description': 'Professional laundry and dry cleaning with same-day or next-day delivery. Expert care for all your garments.', - 'meta_keywords': 'laundry service, dry cleaning, hotel laundry, garment care, cleaning service', - 'is_active': True - }, - { - 'name': 'Valet Parking Service', - 'description': 'Secure valet parking with 24/7 vehicle care, quick retrieval, and optional car wash services. Your vehicle is in safe hands.', - 'price': 45.00, - 'category': 'Transportation', - 'slug': 'valet-parking-service', - 'image': 'https://images.unsplash.com/photo-1502877338535-766e1452684a?w=1200&h=800&fit=crop', - 'content': '''
-

Secure & Convenient Parking

-

Enjoy the ultimate convenience of valet parking with our professional service. Your vehicle will be safely parked and secured, ready for quick retrieval whenever you need it. Our valet team is available 24/7 to assist you.

- -

Service Features

-
    -
  • Secure, monitored parking facility
  • -
  • 24/7 valet service availability
  • -
  • Quick vehicle retrieval (average 5 minutes)
  • -
  • Complimentary vehicle inspection
  • -
  • Luggage assistance included
  • -
  • Optional car wash and detailing services
  • -
- -

Additional Services

-
    -
  • Car Wash: Exterior wash and interior vacuum
  • -
  • Detailing: Full interior and exterior detailing
  • -
  • Battery Jump Start: Assistance with vehicle issues
  • -
  • Tire Pressure Check: Complimentary tire service
  • -
- -

Pricing

-

Daily rates available for extended stays. Weekly and monthly packages offer significant savings. Contact our valet team for special rates.

-
''', - 'sections': json.dumps([ - { - 'type': 'features', - 'title': 'Why Choose Our Valet Service', - 'features': [ - {'title': 'Secure Facility', 'description': 'Monitored and protected parking', 'icon': 'Shield'}, - {'title': 'Quick Service', 'description': 'Average 5-minute retrieval time', 'icon': 'Clock'}, - {'title': '24/7 Availability', 'description': 'Service available around the clock', 'icon': 'Sun'}, - {'title': 'Additional Services', 'description': 'Car wash and detailing available', 'icon': 'Sparkles'} - ] - } - ]), - 'meta_title': 'Valet Parking Service - Secure & Convenient', - 'meta_description': 'Secure valet parking with 24/7 service, quick retrieval, and optional car care services. Your vehicle is in safe hands.', - 'meta_keywords': 'valet parking, parking service, hotel parking, car service, valet', - 'is_active': True - }, - { - 'name': 'Professional Babysitting Service', - 'description': 'Certified and experienced babysitters available for in-room care and supervised activities. Background-checked professionals for your peace of mind.', - 'price': 35.00, - 'category': 'Family', - 'slug': 'professional-babysitting-service', - 'image': 'https://images.unsplash.com/photo-1503454537195-1dcabb73ffb9?w=1200&h=800&fit=crop', - 'content': '''
-

Your Children in Safe Hands

-

Enjoy your time knowing your children are in the care of our professional babysitting service. Our certified caregivers are experienced, background-checked, and trained in child safety and first aid.

- -

Our Caregivers

-
    -
  • Certified in CPR and first aid
  • -
  • Background-checked and verified
  • -
  • Experienced with children of all ages
  • -
  • Multilingual capabilities available
  • -
  • References available upon request
  • -
- -

Services Offered

-
    -
  • In-Room Care: Supervised care in your hotel room
  • -
  • Activity Supervision: Accompany children to hotel activities
  • -
  • Evening Care: Bedtime routines and overnight care
  • -
  • Group Care: Multiple children from the same family
  • -
- -

Booking Information

-

Reservations should be made at least 4 hours in advance. Same-day service may be available subject to caregiver availability. Minimum booking: 2 hours.

-
''', - 'sections': json.dumps([ - { - 'type': 'hero', - 'title': 'Peace of Mind for Parents', - 'content': 'Certified professionals ensuring your children are safe, happy, and well-cared for.', - 'image': 'https://images.unsplash.com/photo-1503454537195-1dcabb73ffb9?w=1200&h=600&fit=crop' - }, - { - 'type': 'features', - 'title': 'Why Parents Trust Us', - 'features': [ - {'title': 'Certified Caregivers', 'description': 'CPR and first aid certified', 'icon': 'Shield'}, - {'title': 'Background Checked', 'description': 'Thoroughly vetted professionals', 'icon': 'UserCheck'}, - {'title': 'Experienced', 'description': 'Years of childcare experience', 'icon': 'Heart'}, - {'title': 'Flexible Service', 'description': 'In-room or activity supervision', 'icon': 'Clock'} - ] - } - ]), - 'meta_title': 'Professional Babysitting Service - Certified Caregivers', - 'meta_description': 'Certified and experienced babysitters for in-room care and supervised activities. Background-checked professionals for your peace of mind.', - 'meta_keywords': 'babysitting service, childcare, hotel babysitting, kids care, family services', - 'is_active': True - }, - { - 'name': 'Pet Care & Accommodation', - 'description': 'Pet-friendly accommodations with professional pet care services including walking, feeding, grooming, and pet-sitting. Your furry friends are welcome!', - 'price': 25.00, - 'category': 'Pet Services', - 'slug': 'pet-care-accommodation', - 'image': 'https://images.unsplash.com/photo-1601758228041-f3b2795255f1?w=1200&h=800&fit=crop', - 'content': '''
-

Your Pets Are Family Too

-

We welcome your furry family members! Our pet-friendly accommodations and professional pet care services ensure your pets are as comfortable and well-cared for as you are during your stay.

- -

Pet Amenities

-
    -
  • Comfortable pet beds and blankets
  • -
  • Food and water bowls
  • -
  • Complimentary treats and toys
  • -
  • Pet waste bags and disposal
  • -
  • Designated pet relief areas
  • -
- -

Pet Care Services

-
    -
  • Dog Walking: Regular walks and exercise
  • -
  • Pet Sitting: In-room care while you're away
  • -
  • Feeding Service: Scheduled feeding times
  • -
  • Grooming: Basic grooming and bathing
  • -
  • Veterinary Referrals: Local vet recommendations
  • -
- -

Pet Policy

-

Pets up to 50 lbs are welcome. A pet fee applies per night. Please inform us in advance about your pet's stay. We ask that pets be leashed in public areas and that owners clean up after their pets.

-
''', - 'sections': json.dumps([ - { - 'type': 'hero', - 'title': 'A Home Away From Home for Your Pets', - 'content': 'Because your pets deserve the same luxury experience as you.', - 'image': 'https://images.unsplash.com/photo-1601758228041-f3b2795255f1?w=1200&h=600&fit=crop' - }, - { - 'type': 'features', - 'title': 'Pet-Friendly Features', - 'features': [ - {'title': 'Pet Amenities', 'description': 'Beds, bowls, treats, and toys provided', 'icon': 'Heart'}, - {'title': 'Professional Care', 'description': 'Walking, feeding, and grooming services', 'icon': 'User'}, - {'title': 'Designated Areas', 'description': 'Pet relief areas and walking paths', 'icon': 'MapPin'}, - {'title': 'Vet Referrals', 'description': 'Local veterinary recommendations', 'icon': 'Stethoscope'} - ] - } - ]), - 'meta_title': 'Pet Care & Accommodation - Pet-Friendly Hotel', - 'meta_description': 'Pet-friendly accommodations with professional pet care services. Walking, feeding, grooming, and pet-sitting available. Your pets are welcome!', - 'meta_keywords': 'pet care, pet friendly hotel, dog walking, pet services, pet accommodation', - 'is_active': True - }, - { - 'name': 'Premium Wine & Spirits Collection', - 'description': 'Extensive collection of fine wines, premium spirits, and craft cocktails. Expert sommelier service and private wine tastings available.', - 'price': 0.00, - 'category': 'Dining', - 'slug': 'premium-wine-spirits-collection', - 'image': 'https://images.unsplash.com/photo-1514362545857-3bc16c4c7d1b?w=1200&h=800&fit=crop', - 'content': '''
-

Curated Excellence

-

Discover our extensive collection of fine wines, premium spirits, and artisanal cocktails. Our master sommelier has curated a selection that spans the globe, featuring rare vintages, limited editions, and exceptional spirits.

- -

Our Collection

-
    -
  • Fine Wines: Over 500 labels from renowned vineyards worldwide
  • -
  • Premium Spirits: Rare whiskeys, cognacs, and artisanal spirits
  • -
  • Craft Cocktails: Signature cocktails created by our expert mixologists
  • -
  • Champagne & Sparkling: Exclusive selection of premium bubbles
  • -
- -

Services

-
    -
  • Sommelier Service: Expert wine recommendations and pairings
  • -
  • Wine Tastings: Private tastings and educational sessions
  • -
  • Bar Service: Craft cocktails at our premium bars
  • -
  • Private Events: Wine dinners and tasting events
  • -
- -

Locations

-

Enjoy our collection at our signature bars, restaurants, or through our room service. Our sommelier is available for consultations and recommendations.

-
''', - 'sections': json.dumps([ - { - 'type': 'hero', - 'title': 'A World of Flavors', - 'content': 'Curated by experts, enjoyed by connoisseurs.', - 'image': 'https://images.unsplash.com/photo-1514362545857-3bc16c4c7d1b?w=1200&h=600&fit=crop' - }, - { - 'type': 'quote', - 'quote': 'An exceptional collection that rivals the finest establishments in the world.', - 'author': 'Wine Enthusiast Magazine' - } - ]), - 'meta_title': 'Premium Wine & Spirits Collection - Fine Beverages', - 'meta_description': 'Extensive collection of fine wines, premium spirits, and craft cocktails. Expert sommelier service and private tastings available.', - 'meta_keywords': 'wine collection, premium spirits, sommelier, wine tasting, luxury bar, craft cocktails', - 'is_active': True - }, - { - 'name': 'Private Event & Catering Services', - 'description': 'Professional event planning and catering services for weddings, corporate events, celebrations, and private gatherings. Make your special occasion unforgettable.', - 'price': 0.00, - 'category': 'Entertainment', - 'slug': 'private-event-catering-services', - 'image': 'https://images.unsplash.com/photo-1519167758481-83f550bb49b3?w=1200&h=800&fit=crop', - 'content': '''
-

Unforgettable Events

-

From intimate gatherings to grand celebrations, our professional event planning and catering team will ensure your special occasion is executed flawlessly. We handle every detail so you can enjoy your event.

- -

Event Types

-
    -
  • Weddings: Ceremonies, receptions, and rehearsal dinners
  • -
  • Corporate Events: Conferences, meetings, and team building
  • -
  • Celebrations: Birthdays, anniversaries, and milestones
  • -
  • Private Dinners: Intimate gatherings and special occasions
  • -
- -

Our Services

-
    -
  • Complete event planning and coordination
  • -
  • Customized menu design and catering
  • -
  • Venue selection and setup
  • -
  • Floral arrangements and decorations
  • -
  • Entertainment coordination
  • -
  • Photography and videography services
  • -
  • Technical support and AV equipment
  • -
- -

Planning Process

-

Our event specialists will work with you from initial consultation through event execution. We offer flexible packages and can customize services to meet your specific needs and budget.

-
''', - 'sections': json.dumps([ - { - 'type': 'hero', - 'title': 'Making Memories That Last', - 'content': 'Professional event planning and catering for your most important occasions.', - 'image': 'https://images.unsplash.com/photo-1519167758481-83f550bb49b3?w=1200&h=600&fit=crop' - }, - { - 'type': 'cta', - 'title': 'Planning an Event?', - 'cta_text': 'Contact Our Event Team', - 'cta_link': '/contact', - 'content': 'Let us help you create an unforgettable experience.' - } - ]), - 'meta_title': 'Private Event & Catering Services - Professional Planning', - 'meta_description': 'Professional event planning and catering for weddings, corporate events, and celebrations. Make your special occasion unforgettable.', - 'meta_keywords': 'event planning, catering, wedding planning, corporate events, private events, hotel events', - 'is_active': True - } - ] - - created_count = 0 - updated_count = 0 - - for service_data in services_data: - # Check if service already exists by slug - existing = db.query(Service).filter(Service.slug == service_data['slug']).first() - - if existing: - # Update existing service - for key, value in service_data.items(): - if key != 'slug': # Don't update slug - setattr(existing, key, value) - updated_count += 1 - print(f' ✓ Updated service: {service_data["name"]}') - else: - # Create new service - service = Service(**service_data) - db.add(service) - created_count += 1 - print(f' ✓ Created service: {service_data["name"]}') - - db.commit() - print(f'\n✓ Enterprise services seeded successfully!') - print(f' - Created: {created_count}') - print(f' - Updated: {updated_count}') - print(f' - Total: {len(services_data)}\n') - -def main(): - db: Session = SessionLocal() - try: - print('=' * 80) - print('SEEDING ENTERPRISE SERVICES') - print('=' * 80) - print() - seed_enterprise_services(db) - print('=' * 80) - print('✓ All enterprise services data seeded successfully!') - print('=' * 80) - except Exception as e: - db.rollback() - print(f'\n✗ Error seeding services: {e}') - import traceback - traceback.print_exc() - raise - finally: - db.close() - -if __name__ == '__main__': - main() - diff --git a/Backend/seeds_data/seed_users.py b/Backend/seeds_data/seed_users.py deleted file mode 100644 index ec765224..00000000 --- a/Backend/seeds_data/seed_users.py +++ /dev/null @@ -1,194 +0,0 @@ -import sys -import os -from pathlib import Path -# Add both the seeds_data directory and the Backend directory to the path -sys.path.insert(0, str(Path(__file__).parent)) -sys.path.insert(0, str(Path(__file__).parent.parent)) -from sqlalchemy.orm import Session -from src.shared.config.database import SessionLocal -from src.auth.models.role import Role -from src.auth.models.user import User -import bcrypt -from datetime import datetime - -def get_db(): - db = SessionLocal() - try: - return db - finally: - pass - -def seed_users(db: Session): - print('=' * 80) - print('SEEDING USERS') - print('=' * 80) - - # Get roles - admin_role = db.query(Role).filter(Role.name == 'admin').first() - staff_role = db.query(Role).filter(Role.name == 'staff').first() - customer_role = db.query(Role).filter(Role.name == 'customer').first() - housekeeping_role = db.query(Role).filter(Role.name == 'housekeeping').first() - - if not admin_role or not staff_role or not customer_role: - print(' ❌ Roles not found! Please seed roles first.') - return - - users_data = [ - { - 'email': 'gnxsoft@gnxsoft.com', - 'password': 'gnxsoft123', - 'full_name': 'GNXSoft Admin', - 'phone': '+1 (555) 111-2222', - 'role': 'admin', - 'currency': 'EUR', - 'is_active': True - }, - { - 'email': 'admin@gnxsoft.com', - 'password': 'admin123', - 'full_name': 'Administrator', - 'phone': '+1 (555) 222-3333', - 'role': 'admin', - 'currency': 'EUR', - 'is_active': True - }, - { - 'email': 'staff@gnxsoft.com', - 'password': 'staff123', - 'full_name': 'Staff Member', - 'phone': '+1 (555) 333-4444', - 'role': 'staff', - 'currency': 'EUR', - 'is_active': True - }, - { - 'email': 'customer@gnxsoft.com', - 'password': 'customer123', - 'full_name': 'Customer User', - 'phone': '+1 (555) 444-5555', - 'role': 'customer', - 'currency': 'EUR', - 'is_active': True - }, - { - 'email': 'john.doe@gnxsoft.com', - 'password': 'customer123', - 'full_name': 'John Doe', - 'phone': '+1 (555) 555-6666', - 'role': 'customer', - 'currency': 'USD', - 'is_active': True - }, - { - 'email': 'jane.smith@gnxsoft.com', - 'password': 'customer123', - 'full_name': 'Jane Smith', - 'phone': '+1 (555) 666-7777', - 'role': 'customer', - 'currency': 'EUR', - 'is_active': True - }, - { - 'email': 'robert.wilson@gnxsoft.com', - 'password': 'customer123', - 'full_name': 'Robert Wilson', - 'phone': '+1 (555) 777-8888', - 'role': 'customer', - 'currency': 'GBP', - 'is_active': True - }, - { - 'email': 'maria.garcia@gnxsoft.com', - 'password': 'customer123', - 'full_name': 'Maria Garcia', - 'phone': '+1 (555) 888-9999', - 'role': 'customer', - 'currency': 'EUR', - 'is_active': True - } - ] - - # Add housekeeping users if role exists - if housekeeping_role: - users_data.extend([ - { - 'email': 'housekeeping@gnxsoft.com', - 'password': 'housekeeping123', - 'full_name': 'Housekeeping Staff', - 'phone': '+1 (555) 999-0000', - 'role': 'housekeeping', - 'currency': 'EUR', - 'is_active': True - }, - { - 'email': 'housekeeping2@gnxsoft.com', - 'password': 'housekeeping123', - 'full_name': 'Housekeeping Staff 2', - 'phone': '+1 (555) 999-0001', - 'role': 'housekeeping', - 'currency': 'EUR', - 'is_active': True - } - ]) - - role_map = { - 'admin': admin_role.id, - 'staff': staff_role.id, - 'customer': customer_role.id - } - - if housekeeping_role: - role_map['housekeeping'] = housekeeping_role.id - - created_count = 0 - skipped_count = 0 - - for user_data in users_data: - existing = db.query(User).filter(User.email == user_data['email']).first() - if existing: - print(f' ⚠️ User "{user_data["email"]}" already exists, skipping...') - skipped_count += 1 - continue - - password = user_data.pop('password') - role_name = user_data.pop('role') - role_id = role_map[role_name] - - password_bytes = password.encode('utf-8') - salt = bcrypt.gensalt() - hashed_password = bcrypt.hashpw(password_bytes, salt).decode('utf-8') - - user = User( - email=user_data['email'], - password=hashed_password, - full_name=user_data['full_name'], - phone=user_data.get('phone'), - role_id=role_id, - currency=user_data.get('currency', 'EUR'), - is_active=user_data.get('is_active', True) - ) - db.add(user) - print(f' ✓ Created user: {user_data["email"]} ({role_name}) - Password: {password}') - created_count += 1 - - db.commit() - print(f'\n✓ Users seeded successfully!') - print(f' - Created: {created_count} user(s)') - print(f' - Skipped: {skipped_count} user(s) (already exist)') - print('=' * 80) - -def main(): - db = get_db() - try: - seed_users(db) - except Exception as e: - print(f'\n❌ Error: {e}') - import traceback - traceback.print_exc() - db.rollback() - finally: - db.close() - -if __name__ == '__main__': - main() - diff --git a/Backend/src/__pycache__/__init__.cpython-312.pyc b/Backend/src/__pycache__/__init__.cpython-312.pyc index 2fb27bd06a6caab3342aa8db88858f7ee5e4e9b6..7e95d83d7f1a95b1457c6c3db58748591c468dc2 100644 GIT binary patch delta 19 ZcmbQiID?V{BmO;xX&@$)P4-&FyB%%i65*L?@E$eFEcUj@R7T@>X zB92+NsDI43FfPU)Sr$k9Yg?9#HzsOK6c`(>i~&O^Wo!k<0tw2pWD|`M?_MO5c$c+l zu6Lj3x$pDi-roDiIGDQu#Dpk11oGMY!IP1}6Jn9YQg&hENimK(VJ8rzTuD*7P&e#G z7vV+J1A9z{luPI`yo`EbuepvYKcOq|3QE8P>VtjgD!hvNVZUjMDc8^d95Cli${-qo zL*`skuA`6PusMHA`5BGC5i|-%&9$oJ9Ysl)Bnu6W$*;A7hOhCC+=~3MbNX2eO;-?r z@Gn2k;e8zLa8^9a&{QIpNFl#+mmVUJGs68f}@@EWcs)Gp7~hU@SYdW znfi*^H7;=ctJbjnbq?>~@VgvdS;W>?IDDok)3fO1o<+Hr9aG})c5kLJ2e>g?N;1_L zq8b@qb;GP@qOF8oUJZwr0Rm z$3PY~wpQn)T)G@W!SMc&ZcK0e#%8-mM2;BkFP+K)_wWm~RbURkUAsYiKyb>Y=^<5D z=kdAPE#Lv3sI9Oq68@DTzH-e1?&FCaFN5Fl=D=Fdp9HJso-9p|HL3gQdLD-YemkY= z-}u8oxy?#i^n-CBa2kMlTvu0Za}Y3OoT$?P_|34r>HxrwUG*P<8GN#S9hf(MthZQ5 zLfx-_O6V+V9u zQ%7lh+C+7XIyf~sd_axp&C7P$MRlB-M6FrVWwdO#K@AghxJidwbV!pS^++hP>@!K% zdEpppaw?HfG%PP0rf_UeAmIVODi#gO2j!@)(q^jGwxAz4a9Qx6 z<0xqd`3l-jP1LZk8AzSCCxctbH38`t1t4W&kY!zn8`j62X1?zmT2^xEPz P)w6Ev z1nCt2Ffp3R&4NZkvY22Z27@o+Ke~)D3uD7lU_UHl>$HnYoXbcyl0})``)1=3?=^jY zoO|!*eDAsEo_CTvGX@rK0)Bw!OE~=Py6cOyf5g`sdOT-0oZu6H3tPjYcwXv-z0w7E zLF$8jI+Mg7q$EsA7vV*H9ThK0{jguU3@=Lqa6lS_gVGgvMfb(TAEgvb>GQaFRZ7FO zJ`ao6qz~YAeg1}cLmGlZ(l8v>*RuGIGy?e%yink%u(Jc~)6h#+Z{_Hh>S+T>mE!>S z4?o7>R~g(|=6#$JXF2LhD|{$WbVx0u=kYaz&oOv?xi>+HzcPd6xzI_=gQ7cLpzf2r z?hz6sUr0*8PxHc+I<%^SUVtqO{vLxT8QgR)J$}2L!5R8)25(~U#!Bz{!hT3Us;jV5 zoAF#FJ;!+l_f^sLaRxub;4=*VP&GY%D}$e6@En7$wbA46Vel~qci6q#3akBhw4S8& zZZGp69c28AZbpAK*3j>GkipL}_&kIAYU%Og41T7z&^}EvYcRuz-Rhv{a*DxojzV)u zF?0FTUTBOoiBVvmTraRshM0MoR?}dlr36=cvpFGMt`8bMU#z{Xp_rU zJho!J*JVrG62`-aUf;lR9YB6C%!PSz0#4|o2YU1|3$yy@f-XFkiVn#Mo%m5a{4NJ4 z4V;k04`UCd_X+Q#@X3E4PXp)s-|b1-c2w_v%AUgq9~N@qx85w}xYJ-+2d7X+u??MY z^I%ZF@b_*jNTKu3I4$kuif~$(Msx1x%@a7aYecc_sIU&tZ&1!5e3-(g^&O-C^47Ib{IzXruoHa0eanudyv+EbCiLiW-Z{tzkIq+0R_F{C<~GDT?FFGtk2y#FWS$`BW?v?;0}&fFj&CAQh00g%jj5l&KngaknQw1;p delta 20 acmeCl>&fFj&CAQh00e2XbT)D`ngakmAO#Nq diff --git a/Backend/src/ai/services/__pycache__/__init__.cpython-312.pyc b/Backend/src/ai/services/__pycache__/__init__.cpython-312.pyc index d5f3c54ef82ca9da57c229c5d089c02146af57de..debe952c7383c8cd1e566bb949640bd644f0a87d 100644 GIT binary patch delta 19 ZcmZ3&xP+1WG%qg~0}$MDFrLUg696tj1jhgX delta 19 ZcmZ3&xP+1WG%qg~0}yPRsWXv#CIBxA1oZ#_ diff --git a/Backend/src/ai/services/__pycache__/ai_assistant_service.cpython-312.pyc b/Backend/src/ai/services/__pycache__/ai_assistant_service.cpython-312.pyc index 86b15cec90eb6b0a7bbc1868c563bf0bbb51716b..664c856cdc5dacbc8154be036aab3b96be622d54 100644 GIT binary patch delta 22 ccmex(i1FhgM()$Ryj%=GaLd7XBX?RN0AE!HGXMYp delta 22 ccmex(i1FhgM()$Ryj%=G;5$oaBX?RN09|ti`2YX_ diff --git a/Backend/src/ai/services/__pycache__/ai_chat_service.cpython-312.pyc b/Backend/src/ai/services/__pycache__/ai_chat_service.cpython-312.pyc index 4c5c54e9e967278a14a1c0c1a7ad31af8a380acd..bf14b00927c5f7a4cbbb5b3178ff5ccd1f2260f3 100644 GIT binary patch delta 22 ccmbQUih0f|X71Cxyj%=GaLd7XBe&pH08S(Zd;kCd delta 22 ccmbQUih0f|X71Cxyj%=G;5$oaBe&pH08By#LI3~& diff --git a/Backend/src/ai/services/__pycache__/ai_knowledge_base.cpython-312.pyc b/Backend/src/ai/services/__pycache__/ai_knowledge_base.cpython-312.pyc index 019189ac8ef4dffa6c8d78275976ed03d4e66d3e..0f4f360129936204ef7212c03db945f175dcb08a 100644 GIT binary patch delta 20 acmX?|b~=swG%qg~0}$MDFy6@RUult9Fa`ib83lF# diff --git a/Backend/src/ai/services/__pycache__/ai_learning_service.cpython-312.pyc b/Backend/src/ai/services/__pycache__/ai_learning_service.cpython-312.pyc index c4aaf45e037781abd03a25919e9cef10cd4746ee..71ef80b34dff0f99421656ed5615cc20e529dd6b 100644 GIT binary patch delta 22 ccmeBL#?-ZpiTgA!FBbz4+;TA9$o+p308APN`2YX_ delta 22 ccmeBL#?-ZpiTgA!FBbz4_|DSV$o+p307^IpzW@LL diff --git a/Backend/src/ai/services/__pycache__/ai_role_access_service.cpython-312.pyc b/Backend/src/ai/services/__pycache__/ai_role_access_service.cpython-312.pyc index 2ff6bc957c2481a1b639dcbdec62fa2af7b37c5f..2f0613efa471f38d5db2f5534a4583a0f1359089 100644 GIT binary patch delta 22 ccmZ3wnsMoBM()$Ryj%=GaLd7XBloOO08j)5l>h($ delta 22 ccmZ3wnsMoBM()$Ryj%=G;5JKVBloOO08Q}*Q~&?~ diff --git a/Backend/src/ai/services/__pycache__/ai_training_scheduler.cpython-312.pyc b/Backend/src/ai/services/__pycache__/ai_training_scheduler.cpython-312.pyc index fd4b1bf28d8c140ac9e3d0151075796e52f56f25..4fd42325ee4ffe115155c0a388e227100fbd7e6e 100644 GIT binary patch delta 20 acmZ4Nu-Jk7G%qg~0}$MDFy6>5p#T6oTm=FE delta 20 acmZ4Nu-Jk7G%qg~0}!~)(%Hx@p#T6mNd&rcvg`6G%qg~0}$MDFy6?0hywsTI0cFT delta 20 acmX>rcvg`6G%qg~0}%Mm(%Hy;hywsRRs~Q1 diff --git a/Backend/src/auth/__pycache__/__init__.cpython-312.pyc b/Backend/src/auth/__pycache__/__init__.cpython-312.pyc index c416a74c12991eebae1b017f66b32742100bc3ab..2c6959abca1474797d374df4570ec9b5a3300fa3 100644 GIT binary patch delta 19 ZcmbQsIG2(8G%qg~0}$MDFrLUg2>>lV1hN1C delta 19 ZcmbQsIG2(8G%qg~0}$+-sWXv#5&$k41mgez diff --git a/Backend/src/auth/models/__pycache__/__init__.cpython-312.pyc b/Backend/src/auth/models/__pycache__/__init__.cpython-312.pyc index 423d60eada172c45dff82f2f345f56526847135d..bbc1c9288b79e073c19cacc4c465b01f92e78794 100644 GIT binary patch delta 19 ZcmZ3&xP+1WG%qg~0}$MDFrLUg696tj1jhgX delta 19 ZcmZ3&xP+1WG%qg~0}$+-sWXv#CIBxS1o!{| diff --git a/Backend/src/auth/models/__pycache__/email_verification_token.cpython-312.pyc b/Backend/src/auth/models/__pycache__/email_verification_token.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f12869477782ac262db6432139b232139f719a1c GIT binary patch literal 1418 zcmaJ>y>A>v6rbJO@B1*9IJQ6nA}ErL#BGr{Qp87L&WSN{B9tRYTV%D_8Q*QZvwNQ1 z1s~NRgLCQ(sk*pM{+#xwMX~LUb-#HXvPWSHj-uu0IZ{C}^ z-|KY?!CG0n9R6HE=&4Y~OFaR{cL98lFv3!VsN_mic4b;|D^zh6s=6xGTul;wInt@& z8U?OICN*6Xu!7adqE)vlAsO93SbKo5PO3YQPb{}KFl_TkKwIP5$4QjanCqX!8R-(n zwc8mB<1RPaenvVWC0w6Rl8E>*x2`9Qgx&a4GO#6HVV>rdR(1EZe^VuwymtScGWuot zALg0=W4H(H+9Vl`tqK&`DNF%wH$M?tS@^!^?yx z?bsDw?X!^jY~Zbu0awEqlXYJA^DGJDfDuaK>}w-W2}@fczHZChi1R4&??r?);e1Cg zK)^0q9*1i=VP`=t9auP|!T?b^CM$j(Wu;zWv*6`M66bw!I|?gTK8G|n?HO)(UhGri zdED|mn&3PVxaN6lxgVW)>YkU0DoT}!$uMy_xEx|;2%w9qJE{9B!4x3e3zgpFKp!fYI~YPA{Rv>Bj3$ zo208*(sve(_;8Pyht3lrP+xlzply*aySY|lMXM$He0O9$2F#)Yl9y}42K+OS>vF8<^^boLiU z%_Z;`?9#IM>#bjI{c$%KHL(bs-P9ge-~Oh}>~YOE?K-#8waAZx9-)KN85I*LW>ECK z99QF%*-98KI$X|TChhr*;8u{tD`B?<7skH_{~)Y3PQ)$>ROGz`=(+Jhd1*dkEl|au nLwX*>-xW!co}lGF(efd>aERVKM32BIgvYjNf>p?2` z2lS@m#iP;%J$m#gcqzDo9Vi|=^(Is=z37{y?K&YZzxUp6-kbT&wr-Yl= zB1Zgnc$@SriI*7(yu^>fxZ`)hH!$!L;BATe5KtRlOj>!b+-kedb|1hCM35t4)i&VmM}2qeRN{6M5u+ zo7F1r*Qx?{1e;jum-gq6_R3a;kKFa*cqwA|h94&p>+#XG6UeVzSIDUYbOH*kXi|FnMC6F=27t$JZ>G8(|s*-fTeFD6DGhFBnT=2gFC=Iwo^o z8YG#Y5x9CECWE%sS+BL=cB5_zXF%d9Ym6JN8+w$uE;n75MmP-wF1zkx>IJ)*it8q# zTkbM(P)tb8WgjzL09~xk1y5W+UK#Gui#tr5A1jK4mL{z*TH+?`3KoD}FJXpAsAB#* zv<(>T+_pOrC3ZVpwwokgNTRNNBT7hcrV&L8aJTFR?1F^Yj#4^mB7i zonE=VQJZ*m{>|~%7e5>v)GolJvGJG2+f(oDclM{N>(loKV-HqtZIs4eYU}ouL82ii;nM$xU>46P^C8YSN^%ivJ+- H&1(DuL1QZ$ literal 0 HcmV?d00001 diff --git a/Backend/src/auth/models/__pycache__/password_reset_token.cpython-312.pyc b/Backend/src/auth/models/__pycache__/password_reset_token.cpython-312.pyc index ee709746181238bbf81c09c365d346d16b858ceb..ded345703ce60bb4aad55d6959b2dfd56bbc178c 100644 GIT binary patch delta 20 acmZ3-wT_GXG%qg~0}$MDFy6?m%nATCVFa82 delta 20 acmZ3-wT_GXG%qg~0}!~)(%HzZ%nATAP6S&3 diff --git a/Backend/src/auth/models/__pycache__/refresh_token.cpython-312.pyc b/Backend/src/auth/models/__pycache__/refresh_token.cpython-312.pyc index cd3e30cefd8aae0afc8eced99ecf1c6779dd06d5..332347fd5e6adf3c8a0b79c70db4ee60345ad88a 100644 GIT binary patch delta 20 acmey#@sor5G%qg~0}$MDFy6?W#{vLA&;@t^ delta 20 acmey#@sor5G%qg~0}!~)(%HzJ#{vL8y#+S_ diff --git a/Backend/src/auth/models/__pycache__/role.cpython-312.pyc b/Backend/src/auth/models/__pycache__/role.cpython-312.pyc index 00c502df4c2dc83c4cd7b95229c38e1dd7411075..ecd5c73d78b12b0c0ef9fb0bc09eb2a0d5debd7e 100644 GIT binary patch delta 20 acmbQpIgyk5G%qg~0}$MDFy6@B#sUB_v;@Kc delta 20 acmbQpIgyk5G%qg~0}!~)(%Hz}#sUB@p#*^d diff --git a/Backend/src/auth/models/__pycache__/user.cpython-312.pyc b/Backend/src/auth/models/__pycache__/user.cpython-312.pyc index dcf5d51f5d7d116cf4af8e830e4a75a5b7cac261..cc9a0948e478fbd08a47062e599ce23d1571d9b5 100644 GIT binary patch delta 1142 zcmZXS%}*0S7{+(EEvYo!Qro4a1=>RSSfJ&zdu;r_w|8y&wT!YOQBa_A%xGuYvV5)&^ei zmHfJ!%xF7wKxZkS(}5ZdLdZY|8SSD|i@MbigWU~dBaDVG1c)-$1HI5^7&=^|{U96Y z2%`gJs)fWI)HgfI_z)B$5H-lh7#{vlKF;_EjIwxR`j`pE$6Pd1Prx>1P;`0NYX7mcBFjtz_EoXKXFh=Vso9lmCSAxXxqHew%2gb9)A{@}MTJ}0d_hrnc0&yyno&`@fFPAF zL;>Y9{W38OQkyU-6)R~)YUl01tSt@{oUQKQs0b3%a6tO>Vkt7ekQtfq61*|75U zOY3~3(q@!bgQW^IS-#Sucdb^l;lt(!{CC`BJ9J3?w~PDe)BVrk6Y0+05-!_ri~i6% z?}r;l<`Z9BGkeN^ZTtM_-qLAsNQ=a^#Im-sdlG!EnLAEB-C8(yw4x=}esJ72|4{hF xao(ix&Foec{NDb;m!sQLXxSp=k9BTSfu|d2K`r2UvBw$XlfvtX-yHoi*+1}^3=RMQ delta 840 zcmZ{gOG^S#7>4JJj%4YWrB-HYW9Bu@OE-!ZQ7t0eMKJ46(nx}V7C|7jsn&-!(KZMi zf^gG+=pWR72qN0F>dZGboG}`hbKp4-?{|5ReMaOLuXj*j-}Y_3smM>VpO8Q|PPT|g z_jVk{iy){0dM(DoSPCt0VSaLdYbLK<4~0q~kVo0@(;NCC&^Rl>L+7gW=y) z5N&A@(`hqlh?lrFrZC)IFp8|dwU}wvi)f^IJnJeP)|Cg?|G^I?mp15-eZ_ zMuF&o-^tV@vLJ*wHj8WwLNKmRSmjel!!QXEeafI%UrqOL6k;Yeim4f-aa(K_*>qoQ z4yj@@^T-k~14%A(u19Afh18s1Eg(*_Sc&zUv8F8|&q5CJT*y4qxj%LZc>#*p-n^Ak zMqYw4+gioiMa7^6sKP>@UPXNomTdaM>2hX;-bk0CCU#d{7oww$ScWMHBsH&B$qdemyscbHH9sQFPA@xAIxUY5y%yc z5@cjxVsK|j;b>t<;Y{UU%?#4bzz`)gabArA^DT~)#FEsK%-qyloFFnKHK!!;76*t~ zm7kZo*?`fO$ww5Z{^frlp~-xUtu!yQur#$u9LOyKOXz|m7{LOWUl_rP*i%x|5=(PR z5UMnpiljk0#3%1$*5d-X0fav%P5#KNtX0ASWP?E#8;pgZR|Cxiff|M^j>!rvmZGdh z+(7Ov=Dhs!B3>}7v?O_QI!lj=0+83h@P&;*K%&23@;m z`T~dbWI@(Bf@(m8Man>;7-YCYk?Q1qtnQ5JliAo-sB41cK<t<;Y{UQ%?#4Xzz`)kaZwE;(`0!@(am;@woGawK*5*)frKXWEw<9U%)-*t zA~7Jh2rQusl3*+no4k-&LBV7htXs& z);WSIKqWV!<8ui^C>2KczG$)vm}MC;{?!vEF1GPB{sUy9`=)8T7ue PC@`8$Q2ELLq`=w$^IUvO diff --git a/Backend/src/auth/models/email_verification_token.py b/Backend/src/auth/models/email_verification_token.py new file mode 100644 index 00000000..186b5d4b --- /dev/null +++ b/Backend/src/auth/models/email_verification_token.py @@ -0,0 +1,17 @@ +from sqlalchemy import Column, Integer, String, DateTime, Boolean, ForeignKey +from sqlalchemy.orm import relationship +from datetime import datetime +from ...shared.config.database import Base + +class EmailVerificationToken(Base): + __tablename__ = 'email_verification_tokens' + id = Column(Integer, primary_key=True, index=True, autoincrement=True) + user_id = Column(Integer, ForeignKey('users.id'), nullable=False, index=True) + token = Column(String(255), unique=True, nullable=False, index=True) + email = Column(String(100), nullable=False) # Email being verified (may differ from user.email if email changed) + expires_at = Column(DateTime, nullable=False, index=True) + used = Column(Boolean, default=False, nullable=False) + created_at = Column(DateTime, default=datetime.utcnow, nullable=False) + updated_at = Column(DateTime, default=datetime.utcnow, onupdate=datetime.utcnow, nullable=False) + user = relationship('User') + diff --git a/Backend/src/auth/models/password_history.py b/Backend/src/auth/models/password_history.py new file mode 100644 index 00000000..f9dd32ac --- /dev/null +++ b/Backend/src/auth/models/password_history.py @@ -0,0 +1,13 @@ +from sqlalchemy import Column, Integer, String, DateTime, ForeignKey +from sqlalchemy.orm import relationship +from datetime import datetime +from ...shared.config.database import Base + +class PasswordHistory(Base): + __tablename__ = 'password_history' + id = Column(Integer, primary_key=True, index=True, autoincrement=True) + user_id = Column(Integer, ForeignKey('users.id'), nullable=False, index=True) + password_hash = Column(String(255), nullable=False) # Hashed password + created_at = Column(DateTime, default=datetime.utcnow, nullable=False, index=True) + user = relationship('User', back_populates='password_history') + diff --git a/Backend/src/auth/models/user.py b/Backend/src/auth/models/user.py index c36af38c..b47283a3 100644 --- a/Backend/src/auth/models/user.py +++ b/Backend/src/auth/models/user.py @@ -15,6 +15,7 @@ class User(Base): avatar = Column(String(255), nullable=True) currency = Column(String(3), nullable=False, default='VND') is_active = Column(Boolean, nullable=False, default=True) + email_verified = Column(Boolean, nullable=False, default=False, index=True) # Email verification status mfa_enabled = Column(Boolean, nullable=False, default=False) mfa_secret = Column(String(255), nullable=True) mfa_backup_codes = Column(Text, nullable=True) @@ -23,6 +24,9 @@ class User(Base): failed_login_attempts = Column(Integer, nullable=False, default=0) locked_until = Column(DateTime, nullable=True) + # Password expiry (optional - can be None for no expiry) + password_changed_at = Column(DateTime, nullable=True, index=True) + # Guest Profile & CRM fields is_vip = Column(Boolean, nullable=False, default=False) lifetime_value = Column(Numeric(10, 2), nullable=True, default=0) # Total revenue from guest @@ -50,4 +54,6 @@ class User(Base): guest_notes = relationship('GuestNote', foreign_keys='GuestNote.user_id', back_populates='user', cascade='all, delete-orphan') guest_tags = relationship('GuestTag', secondary='guest_tag_associations', back_populates='users') guest_communications = relationship('GuestCommunication', foreign_keys='GuestCommunication.user_id', back_populates='user', cascade='all, delete-orphan') - guest_segments = relationship('GuestSegment', secondary='guest_segment_associations', back_populates='users') \ No newline at end of file + guest_segments = relationship('GuestSegment', secondary='guest_segment_associations', back_populates='users') + email_verification_tokens = relationship('EmailVerificationToken', back_populates='user', cascade='all, delete-orphan') + password_history = relationship('PasswordHistory', back_populates='user', cascade='all, delete-orphan', order_by='PasswordHistory.created_at.desc()') \ No newline at end of file diff --git a/Backend/src/auth/models/user_session.py b/Backend/src/auth/models/user_session.py index 78913732..56902b51 100644 --- a/Backend/src/auth/models/user_session.py +++ b/Backend/src/auth/models/user_session.py @@ -3,7 +3,7 @@ User session management model. """ from sqlalchemy import Column, Integer, String, DateTime, ForeignKey, Boolean, Text from sqlalchemy.orm import relationship -from datetime import datetime, timedelta +from datetime import datetime, timedelta, timezone from ...shared.config.database import Base from ...shared.config.settings import settings @@ -34,7 +34,7 @@ class UserSession(Base): @property def is_expired(self) -> bool: """Check if session is expired.""" - return datetime.utcnow() > self.expires_at + return datetime.now(timezone.utc) > self.expires_at @property def is_valid(self) -> bool: diff --git a/Backend/src/auth/routes/__pycache__/__init__.cpython-312.pyc b/Backend/src/auth/routes/__pycache__/__init__.cpython-312.pyc index 9d3fae39dd9f3c90a982231aa5d288c6ed7f05bf..2d4f573f24f92d0026594e439a92e3899e7c4530 100644 GIT binary patch delta 19 ZcmZ3&xP+1WG%qg~0}$MDFrLUg696tj1jhgX delta 19 ZcmZ3&xP+1WG%qg~0}$+-sWXv#CIBxS1o!{| diff --git a/Backend/src/auth/routes/__pycache__/auth_routes.cpython-312.pyc b/Backend/src/auth/routes/__pycache__/auth_routes.cpython-312.pyc index 1e301a81399fe161dc34b94175185ad1baf19f84..070930ae40a5cb3e6f28a68007c5dcaef90cc0e1 100644 GIT binary patch delta 6541 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 Gi~j`~IERw} delta 2691 zcmZuzeN0=|6~FgBzvpLTV`3Ye0yS><2!pI0Exg)u9Z>@E)lh^O0u* zPGkqjNJks0uDgFO)4Knf!MawSsz{T%n5-XDC+&G;BZ=q~Rn3&BQ)`k|Nu#dXz3;`; z)A|Izd+vF^bKbr8cg}mhe*wMsIV}9pXw(C8y(8=mrRQEP+>YMh-l`2~cH4z&(KxCR znitq*N+8!jm%s}xk?t|yfDZzJ6Mhis8S5SBg#h~)8*Ih@lUk5>X#9|$u&R^=D14yAzO=IVf4n1JnpkJ zhv`SlP+cbiqE0wSo?2ba2&JM{I3)60Pv?csyh#5k*7uNF9+%v zCV_CaATv97=2@YSjTd~W*7fu7ID38%o zWNk}oV->lOgf_vgXqS;XKMMtrWY4fOFy_cH$fF(P(OVI*5*$BLt`YbZE#45Gz}_xz ztrRBg)8#&CVl)&H9aED+FeVC)=+wxF7>$ljMIxu95kkSe-F|4s*Sj4B-DE2Lm4XjH z>@LN2U*`ZX?WT^uP?QgoncW5t=0MhJ zVF%C#KGD-(k+p)dD%sT~9}UPsQTC5!Ovh#Zc(zzqr2p!R68v)SjJJ~no`vnLaKT;U zZUN~!=-#hM*B4N`iTcy~A+=j{?aj<8a_id-%oT%yOs;G%Yj0$(G_urgX4+fvOy3>- zKj^Y3RN-)c0Ke2{#9trOK^LhOwqp=D5;L;^~XLU@eO1-9-q?UvZ!&7w#&(= zXY40D$wz@IDNRzCq3~x4X#!3?-t<@C*wKpPtSXZt&WrTEB95X9OQwn}swmg!T?$Sr z$|5mTQ8Ze%18&$V*KPYUwta67U)H{FOdDl?VBPCk4g0 z=Q&SnGYLNnJtc6V!Hqx)x`F2R1;qLz^`!wMW*X@{7A9TbW;}(=Y9UJ|s}{ynlIk3B zBX}LZB(~OErE8j}YvS^XY=by%@WIK+z<6*>ls>|rik0lg#My)`qnl`i!M~1K;W4Gj zQ39$>uE;lN!I`Iuzek!`L+IohBzsLV|KHQ3pY1St>{kdSpZ^y08c`|MF^$PbL zO=-=G-=)UiK2~hh<|n{^m@30}1hbRxa%xm{M@g8Z?9e;~yNVcpP+6uVN*z zmI&|Fkzcxj@|qF040c(h!q93Gpl8dlU|@=9EhhasyW z@~GO}Arpy07uDu0F}Adc!wufD&R1mkir4nNp7`DD#o52}2b3fCW=uz9{>Y<~4xV&1 zx=18BX)|1?t^*gT@f)4T#H6a+HYRN|5Hnr5)1zlr^(?VhO^nB!`sidAgtzgo=uXm? z{n7pKDqf1Z^q`fs*sj*}=hX3SVUwZ*H%w!} zcpx|(j0L4YG;~^&PEk@W>DzN2n(g6S1JvWX`Ev9Pz@76gteyO(h@@Va|Av7_@wsyn zS4bR^A@!egrKmvpQYqhsYk1dUsgw4dl%&u{;bRI)*C_HR2cqoFjwcpN^(`b5`2*3N zDZF?IwUomFbj@hZGSs+fuF100$a279%W4&q2fCuWI%?iy0NS2KiuXx;{=B!o!~4O( zE8UxbhaFJf(Uet;ONZ_%Bc->&ETT8RG~-v7dS}}Y%iibK+6Ob?ld=?F3!mBqS~vq` z`<|>~ToTk#9uD1A95hFH7Ew~x3=sd*viY*bp*2{3-RY9|y4ReZjPF_5KeXlx&{T2w aS_jP#haV8-=tvVhP7}mQ0zCKf{r>`d8@X5j diff --git a/Backend/src/auth/routes/__pycache__/session_routes.cpython-312.pyc b/Backend/src/auth/routes/__pycache__/session_routes.cpython-312.pyc index 90723a603a49639001f6ea923ef09b7b4e248f86..0e7ece270e460921060576801419fd675db28dce 100644 GIT binary patch delta 20 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 UqoW6H^ZX;-6Z|OoIV{5e0!x^g4f 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 delta 7083 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 delta 1740 zcmZ`(O>7%g5PomH-d%gW@va@miIcQ${u(E7X=oFrO$!Cl7Mju^fgl(m<9N5o={gQ? zH-A!55dtA3pbdjm4!Pulh!QRYsR(hXD#4{(EF(qQ1Eohe6(KIPsJvMxAp|j!KhK+) zH*e>AGw;Fh*GIJ5nieKplmRaL?Bj!6TY_8(@Zaz21nz3rU{h|y!r&!ke^T;-Z_HY3k%f4GCtWPr zuEkh0tSHSf|C2DAgW1w))(y9n!PIHKc#GVN5IuHv;r)eWwHEE#jP_Tf{V)(ZOb^1V zp%!`z=0itY&s-L!L>|6J*l|~eHMt$0Q)I|S2E@x`Dheav3lj=!;IS;r!Ba|3ey(7b zOrJT{jyBCMIBvdBbW3w3cafzr_yC910NeRm*2N7D7M#X!=Ko$2bTtVN!&!O`vTCn1 zzA|3x8iInFrUy6PR>$e%86M_y!1_@0NgqJ1A0dsnu25TE;GXZx8fAvzU%gs3NtO1pIl^zxx*7p%PF!E zu4cqt#h=7Yn9{-4*{a!#pX_^=FL~oN5F>tFSyGl;YkK#lK2X&M)?eAoo~mX~-8@^( zj@9(@Fwxi(+P}KLmN{P4kHd$JgRMwdaqDs6Dj_>lF~K>?!$@MEKkb(U_(e{0a-=YS zcYNW!$!itgq^kWLq~2Ue06T_| zM%ZbyEmAz$T9_#@%VeYI_WNNMF%O%@=qE6i><;Bu^0n^aYGfF$B&YZo{+fJo90R?8 zfq;~-ClH?Euu2$`=1)+4EE_hiHh)Pq-->gZiLxzUB-LNJR`@8@!e6=1Q*Bg*?@}GFMbLK|!7mn5c~PhSisv1R z&6SE4dlvmWAMmGgqFga&ZR;`i0(am=I!|)A7oe2>#-DTX4~fvuJLJF}(hKKW4~e+- EZ}GKsBme*a diff --git a/Backend/src/auth/services/auth_service.py b/Backend/src/auth/services/auth_service.py index 244ecd15..a8e3e1f1 100644 --- a/Backend/src/auth/services/auth_service.py +++ b/Backend/src/auth/services/auth_service.py @@ -10,13 +10,18 @@ import logging from ..models.user import User from ..models.refresh_token import RefreshToken from ..models.password_reset_token import PasswordResetToken +from ..models.email_verification_token import EmailVerificationToken +from ..models.password_history import PasswordHistory from ..models.role import Role from ...shared.utils.mailer import send_email from ...shared.utils.email_templates import ( welcome_email_template, password_reset_email_template, - password_changed_email_template + password_changed_email_template, + email_verification_template, + email_changed_verification_template ) +from ...auth.services.session_service import session_service from ...shared.config.settings import settings import os @@ -137,6 +142,7 @@ class AuthService: "avatar": user.avatar, "currency": getattr(user, 'currency', 'VND'), "role": user.role.name if user.role else "customer", + "emailVerified": getattr(user, 'email_verified', True), # Default to True for backward compatibility "createdAt": user.created_at.isoformat() if user.created_at else None, "updatedAt": user.updated_at.isoformat() if user.updated_at else None, } @@ -160,7 +166,9 @@ class AuthService: email=email, password=hashed_password, phone=phone, - role_id=3 + role_id=3, + email_verified=False, # Email not verified on registration + password_changed_at=datetime.utcnow() # Set initial password change timestamp ) db.add(user) db.commit() @@ -168,6 +176,20 @@ class AuthService: user.role = db.query(Role).filter(Role.id == user.role_id).first() + # Generate email verification token + verification_token = secrets.token_hex(32) + hashed_verification_token = hashlib.sha256(verification_token.encode()).hexdigest() + expires_at = datetime.utcnow() + timedelta(hours=24) # 24 hour expiration + + verification_token_obj = EmailVerificationToken( + user_id=user.id, + token=hashed_verification_token, + email=email, + expires_at=expires_at + ) + db.add(verification_token_obj) + db.commit() + tokens = self.generate_tokens(user.id) expires_at = datetime.utcnow() + timedelta(days=7) @@ -179,17 +201,19 @@ class AuthService: db.add(refresh_token) db.commit() + # Send welcome email with verification link try: client_url = settings.CLIENT_URL or os.getenv("CLIENT_URL", "http://localhost:5173") - email_html = welcome_email_template(user.full_name, user.email, client_url) + verification_url = f"{client_url}/verify-email/{verification_token}" + email_html = email_verification_template(verification_url, user.full_name) await send_email( to=user.email, - subject="Welcome to Hotel Booking", + subject="Welcome to Hotel Booking - Verify Your Email", html=email_html ) - logger.info(f"Welcome email sent successfully to {user.email}") + logger.info(f"Verification email sent successfully to {user.email}") except Exception as e: - logger.error(f"Failed to send welcome email to {user.email}: {type(e).__name__}: {str(e)}", exc_info=True) + logger.error(f"Failed to send verification email to {user.email}: {type(e).__name__}: {str(e)}", exc_info=True) return { "user": self.format_user_response(user), @@ -212,6 +236,13 @@ class AuthService: if not user.is_active: logger.warning(f"Login attempt for inactive user: {email}") raise ValueError("Account is disabled. Please contact support.") + + # Check password expiry (if enabled) + if settings.PASSWORD_EXPIRY_DAYS > 0 and user.password_changed_at: + expiry_date = user.password_changed_at + timedelta(days=settings.PASSWORD_EXPIRY_DAYS) + if datetime.utcnow() > expiry_date: + days_expired = (datetime.utcnow() - expiry_date).days + raise ValueError(f"Your password has expired {days_expired} day(s) ago. Please reset your password to continue.") # Check if account is locked (reset if lockout expired) if user.locked_until: @@ -248,12 +279,18 @@ class AuthService: # SECURITY: Don't reveal remaining attempts to prevent enumeration raise ValueError("Invalid email or password") + # Check email verification (warn but allow login for better UX) + email_verification_required = not user.email_verified + if email_verification_required: + logger.info(f"Login attempt for unverified email: {email}") + if user.mfa_enabled: if not mfa_token: return { "requires_mfa": True, - "user_id": user.id + "user_id": user.id, + "email_verified": user.email_verified } @@ -411,27 +448,118 @@ class AuthService: if not self.verify_password(current_password, user.password): raise ValueError("Current password is incorrect") + # Check password minimum age + if user.password_changed_at and settings.PASSWORD_MIN_AGE_DAYS > 0: + min_age_date = user.password_changed_at + timedelta(days=settings.PASSWORD_MIN_AGE_DAYS) + if datetime.utcnow() < min_age_date: + days_remaining = (min_age_date - datetime.utcnow()).days + 1 + raise ValueError(f"Password cannot be changed yet. Minimum age is {settings.PASSWORD_MIN_AGE_DAYS} days. Please try again in {days_remaining} day(s).") + # Validate new password strength from ...shared.utils.password_validation import validate_password_strength is_valid, errors = validate_password_strength(password) if not is_valid: error_message = 'New password does not meet requirements: ' + '; '.join(errors) raise ValueError(error_message) + + # Check password history to prevent reuse + hashed_new_password = self.hash_password(password) + if settings.PASSWORD_HISTORY_COUNT > 0: + # Get recent password history + recent_passwords = db.query(PasswordHistory).filter( + PasswordHistory.user_id == user.id + ).order_by(PasswordHistory.created_at.desc()).limit(settings.PASSWORD_HISTORY_COUNT).all() + + # Check if new password matches any recent password + for old_password in recent_passwords: + if self.verify_password(password, old_password.password_hash): + raise ValueError(f"Password cannot be reused. You must use a password that hasn't been used in your last {settings.PASSWORD_HISTORY_COUNT} password changes.") + + # Check if new password is same as current password + if self.verify_password(password, user.password): + raise ValueError("New password must be different from your current password") - user.password = self.hash_password(password) + # SECURITY: Revoke all existing sessions and refresh tokens on password change + # This prevents compromised sessions from remaining valid after password change + from ..models.refresh_token import RefreshToken + revoked_sessions = session_service.revoke_all_user_sessions(db, user.id) + revoked_tokens = db.query(RefreshToken).filter(RefreshToken.user_id == user.id).delete() + logger.info(f"Password change for user {user.id}: Revoked {revoked_sessions} sessions and {revoked_tokens} refresh tokens") + + # Save current password to history before changing + if settings.PASSWORD_HISTORY_COUNT > 0: + password_history_entry = PasswordHistory( + user_id=user.id, + password_hash=user.password + ) + db.add(password_history_entry) + + # Clean up old password history (keep only the configured number) + old_passwords = db.query(PasswordHistory).filter( + PasswordHistory.user_id == user.id + ).order_by(PasswordHistory.created_at.desc()).offset(settings.PASSWORD_HISTORY_COUNT).all() + for old_pwd in old_passwords: + db.delete(old_pwd) + + # Update password and timestamp + user.password = hashed_new_password + user.password_changed_at = datetime.utcnow() if full_name is not None: user.full_name = full_name + email_verification_required = False + verification_token = None + if email is not None: # Normalize email (lowercase and trim) email = email.lower().strip() - existing_user = db.query(User).filter( - User.email == email, - User.id != user_id - ).first() - if existing_user: - raise ValueError("Email already registered") - user.email = email + + # If email is changing, require re-verification + if email != user.email: + existing_user = db.query(User).filter( + User.email == email, + User.id != user_id + ).first() + if existing_user: + raise ValueError("Email already in use") + + # Create email verification token for new email + verification_token = secrets.token_hex(32) + hashed_verification_token = hashlib.sha256(verification_token.encode()).hexdigest() + expires_at = datetime.utcnow() + timedelta(hours=24) + + # Mark email as unverified until new email is verified + user.email_verified = False + email_verification_required = True + + # Delete old verification tokens for this user + db.query(EmailVerificationToken).filter(EmailVerificationToken.user_id == user.id).delete() + + verification_token_obj = EmailVerificationToken( + user_id=user.id, + token=hashed_verification_token, + email=email, # New email to verify + expires_at=expires_at + ) + db.add(verification_token_obj) + + # Update email (but it's not verified yet) + user.email = email + + # Send verification email to new address + try: + client_url = settings.CLIENT_URL or os.getenv("CLIENT_URL", "http://localhost:5173") + verification_url = f"{client_url}/verify-email/{verification_token}" + email_html = email_changed_verification_template(verification_url, user.full_name, email) + await send_email( + to=email, + subject="Verify Your New Email Address", + html=email_html + ) + logger.info(f"Email change verification sent to {email}") + except Exception as e: + logger.error(f"Failed to send email change verification to {email}: {type(e).__name__}: {str(e)}", exc_info=True) + if phone_number is not None: user.phone = phone_number if currency is not None: @@ -446,7 +574,12 @@ class AuthService: user.role = db.query(Role).filter(Role.id == user.role_id).first() - return self.format_user_response(user) + response = self.format_user_response(user) + if email_verification_required: + response["email_verification_required"] = True + response["message"] = "Profile updated. Please verify your new email address. A verification link has been sent." + + return response def generate_reset_token(self) -> tuple: reset_token = secrets.token_hex(32) @@ -524,14 +657,50 @@ class AuthService: if self.verify_password(password, user.password): raise ValueError("New password must be different from the old password") - hashed_password = self.hash_password(password) + # Check password history to prevent reuse (if enabled) + hashed_new_password = self.hash_password(password) + if settings.PASSWORD_HISTORY_COUNT > 0: + # Get recent password history + recent_passwords = db.query(PasswordHistory).filter( + PasswordHistory.user_id == user.id + ).order_by(PasswordHistory.created_at.desc()).limit(settings.PASSWORD_HISTORY_COUNT).all() + + # Check if new password matches any recent password + for old_password in recent_passwords: + if self.verify_password(password, old_password.password_hash): + raise ValueError(f"Password cannot be reused. You must use a password that hasn't been used in your last {settings.PASSWORD_HISTORY_COUNT} password changes.") + + # Save current password to history before changing + if settings.PASSWORD_HISTORY_COUNT > 0: + password_history_entry = PasswordHistory( + user_id=user.id, + password_hash=user.password + ) + db.add(password_history_entry) + + # Clean up old password history (keep only the configured number) + old_passwords = db.query(PasswordHistory).filter( + PasswordHistory.user_id == user.id + ).order_by(PasswordHistory.created_at.desc()).offset(settings.PASSWORD_HISTORY_COUNT).all() + for old_pwd in old_passwords: + db.delete(old_pwd) - user.password = hashed_password + user.password = hashed_new_password + user.password_changed_at = datetime.utcnow() + + # SECURITY: Revoke all existing sessions and refresh tokens on password reset + # This prevents compromised sessions from remaining valid after password change + from ..models.refresh_token import RefreshToken + revoked_sessions = session_service.revoke_all_user_sessions(db, user.id) + revoked_tokens = db.query(RefreshToken).filter(RefreshToken.user_id == user.id).delete() + db.commit() reset_token.used = True db.commit() + logger.info(f"Password reset for user {user.id}: Revoked {revoked_sessions} sessions and {revoked_tokens} refresh tokens") + try: logger.info(f"Attempting to send password changed confirmation email to {user.email}") email_html = password_changed_email_template(user.email) @@ -546,7 +715,101 @@ class AuthService: return { "success": True, - "message": "Password has been reset successfully" + "message": "Password has been reset successfully. All existing sessions have been revoked for security." + } + + async def verify_email(self, db: Session, token: str) -> dict: + """Verify email address using verification token.""" + if not token: + raise ValueError("Verification token is required") + + hashed_token = hashlib.sha256(token.encode()).hexdigest() + + verification_token = db.query(EmailVerificationToken).filter( + EmailVerificationToken.token == hashed_token, + EmailVerificationToken.expires_at > datetime.utcnow(), + EmailVerificationToken.used == False + ).first() + + if not verification_token: + raise ValueError("Invalid or expired verification token") + + user = db.query(User).filter(User.id == verification_token.user_id).first() + if not user: + raise ValueError("User not found") + + # Update email if it was changed (verification token contains the new email) + if verification_token.email != user.email: + # Check if new email is already in use + existing_user = db.query(User).filter(User.email == verification_token.email).first() + if existing_user and existing_user.id != user.id: + raise ValueError("Email address is already in use") + user.email = verification_token.email + + # Mark email as verified + user.email_verified = True + verification_token.used = True + + # Delete all other verification tokens for this user + db.query(EmailVerificationToken).filter( + EmailVerificationToken.user_id == user.id, + EmailVerificationToken.id != verification_token.id + ).delete() + + db.commit() + + logger.info(f"Email verified for user {user.id}: {user.email}") + + return { + "success": True, + "message": "Email address verified successfully", + "email": user.email + } + + async def resend_verification_email(self, db: Session, user_id: int) -> dict: + """Resend email verification link.""" + user = db.query(User).filter(User.id == user_id).first() + if not user: + raise ValueError("User not found") + + if user.email_verified: + raise ValueError("Email is already verified") + + # Delete old verification tokens + db.query(EmailVerificationToken).filter(EmailVerificationToken.user_id == user.id).delete() + + # Create new verification token + verification_token = secrets.token_hex(32) + hashed_verification_token = hashlib.sha256(verification_token.encode()).hexdigest() + expires_at = datetime.utcnow() + timedelta(hours=24) + + verification_token_obj = EmailVerificationToken( + user_id=user.id, + token=hashed_verification_token, + email=user.email, + expires_at=expires_at + ) + db.add(verification_token_obj) + db.commit() + + # Send verification email + try: + client_url = settings.CLIENT_URL or os.getenv("CLIENT_URL", "http://localhost:5173") + verification_url = f"{client_url}/verify-email/{verification_token}" + email_html = email_verification_template(verification_url, user.full_name) + await send_email( + to=user.email, + subject="Verify Your Email Address", + html=email_html + ) + logger.info(f"Verification email resent to {user.email}") + except Exception as e: + logger.error(f"Failed to resend verification email to {user.email}: {type(e).__name__}: {str(e)}", exc_info=True) + raise ValueError("Failed to send verification email. Please try again later.") + + return { + "success": True, + "message": "Verification email sent successfully" } auth_service = AuthService() diff --git a/Backend/src/auth/services/session_service.py b/Backend/src/auth/services/session_service.py index cda89bdf..31afba0f 100644 --- a/Backend/src/auth/services/session_service.py +++ b/Backend/src/auth/services/session_service.py @@ -1,9 +1,9 @@ """ User session management service. """ -from sqlalchemy.orm import Session +from sqlalchemy.orm import Session, noload from typing import Optional, List -from datetime import datetime, timedelta +from datetime import datetime, timedelta, timezone import secrets from ..models.user_session import UserSession from ...shared.config.settings import settings @@ -27,7 +27,7 @@ class SessionService: refresh_token = secrets.token_urlsafe(64) # Calculate expiration - expires_at = datetime.utcnow() + timedelta(minutes=settings.JWT_ACCESS_TOKEN_EXPIRE_MINUTES) + expires_at = datetime.now(timezone.utc) + timedelta(minutes=settings.JWT_ACCESS_TOKEN_EXPIRE_MINUTES) session = UserSession( user_id=user_id, @@ -52,7 +52,7 @@ class SessionService: session_token: str ) -> Optional[UserSession]: """Get a session by token.""" - return db.query(UserSession).filter( + return db.query(UserSession).options(noload(UserSession.user)).filter( UserSession.session_token == session_token, UserSession.is_active == True ).first() @@ -65,7 +65,7 @@ class SessionService: """Update session last activity timestamp.""" session = SessionService.get_session(db, session_token) if session and session.is_valid: - session.last_activity = datetime.utcnow() + session.last_activity = datetime.now(timezone.utc) db.commit() db.refresh(session) return session @@ -119,12 +119,12 @@ class SessionService: active_only: bool = True ) -> List[UserSession]: """Get all sessions for a user.""" - query = db.query(UserSession).filter(UserSession.user_id == user_id) + query = db.query(UserSession).options(noload(UserSession.user)).filter(UserSession.user_id == user_id) if active_only: query = query.filter( UserSession.is_active == True, - UserSession.expires_at > datetime.utcnow() + UserSession.expires_at > datetime.now(timezone.utc) ) return query.order_by(UserSession.last_activity.desc()).all() @@ -133,7 +133,7 @@ class SessionService: def cleanup_expired_sessions(db: Session) -> int: """Clean up expired sessions.""" expired = db.query(UserSession).filter( - UserSession.expires_at < datetime.utcnow(), + UserSession.expires_at < datetime.now(timezone.utc), UserSession.is_active == True ).all() diff --git a/Backend/src/bookings/__pycache__/__init__.cpython-312.pyc b/Backend/src/bookings/__pycache__/__init__.cpython-312.pyc index 7a64eda0a2e33556b5422c5b87face143b94c659..63542337ffb6a24c7ea7b6bb246774f66f0bf004 100644 GIT binary patch delta 19 ZcmZ3;xR80?bD+bE}PN=98oH(f=< zf)iw5gyMyP@rtiXmRW|`%#UW})chzV4Q(i>&_%ufFDaw-lU{;WGT}tQK$>*O$`;+Z&^hH0qgDXpZs1vZe5n`meG z88Ajl?XGuut+tXNw`ZjB@%)W#ZH^sVK1>3UG=;stBVyKLbu9K zx|i^trR$M^K6YA9!K#hWs6LPr zAPliKBb=(wq~q!QVYVj|*R->=Fh}@7*hrXX?U^{GT_oKQ?vGS})Dqie!ajUtg(hr4 zkX%uQ2CtpGMO8Dn~ ztTr14EV7AgWNF9AoFGgQq6y0^&5V5IH`0D~+l+M0fTV*eN2T3cVYQdqT$eo4Y{-lr z1jU*hR3xt3E0@B}@cHw0vearsizgj$@<LR+ZK!S8S*%p2^?V=B&x+&_S zLgMM7!jMS8KHuf5MWvNW+06W?Hd|(8N*_8}WOw#H%Zun-{P>^e|38Q4Ih>m_`inDq zW3SPeAgHS`$?VI!Wo!>8HX}UGS6l3ISNf{zBjGM&%Z(#hA_DSYWCswa&lo)|-Gd;c zi-J%)K3@x{zt%`NW3OAyY<^=SFpNb;shKw9d4FHQQy=*s@gI zk?4 zTe+=;H4FEZ?`Dj{FvV#-pPQyg4vyggmE^*v^UJD1S98&r9l!7q=N>c8a@egRoKWU< zRe8$Y#ijfGU2Ju$II!y6ERyL=95&U_q{zHs3y;~QfUV~YCou~Uk% zZi$b^YKYZOve}W1*HmH05{%GEJ94FVwgZeq3^NDc(y$%74e{n9Tz#h$6sSj}QQrLj zz|XC0&lCvuVoR2?>W z_LbMx6_;1Kd=>uBH0i`MgcNx_>Q?A8wQ5*VGCjB?V!86%hb?PSr6gZKw+`Es$Yp$3 zfH%}3!+}U^04<`C|6y2HMSMi*8U1cX0)O095??SpWb4 diff --git a/Backend/src/bookings/routes/__pycache__/group_booking_routes.cpython-312.pyc b/Backend/src/bookings/routes/__pycache__/group_booking_routes.cpython-312.pyc index a7dc3927867cb31f22b47683a76b561706570baf..2129db1eaf0b38b3e9ba1f0aff4a87d047b4257e 100644 GIT binary patch delta 22 ccmbRFiE-v9M()$Ryj%=GaLd7XBR5|q09W+}qW}N^ delta 22 ccmbRFiE-v9M()$Ryj%=G;5$oaBR5|q09F$QX#fBK diff --git a/Backend/src/bookings/routes/__pycache__/upsell_routes.cpython-312.pyc b/Backend/src/bookings/routes/__pycache__/upsell_routes.cpython-312.pyc index ebe41c947fbb5cc666b3e67de81d231329b0728d..042eaa901d9e39664410797194b0de24ff76dffd 100644 GIT binary patch delta 20 acmX@5bV`Z)G%qg~0}$MDFy6>*F9-lVEd?w9 delta 20 acmX@5bV`Z)G%qg~0}u%9H`vH+F9-lSpakFm diff --git a/Backend/src/bookings/routes/booking_routes.py b/Backend/src/bookings/routes/booking_routes.py index b31d5184..70b24c78 100644 --- a/Backend/src/bookings/routes/booking_routes.py +++ b/Backend/src/bookings/routes/booking_routes.py @@ -549,8 +549,9 @@ async def get_booking_by_id(id: int, request: Request, current_user: User=Depend booking = db.query(Booking).options(selectinload(Booking.payments), selectinload(Booking.service_usages).selectinload(ServiceUsage.service), joinedload(Booking.user), joinedload(Booking.room).joinedload(Room.room_type)).filter(Booking.id == id).first() if not booking: raise HTTPException(status_code=404, detail='Booking not found') - from ...shared.utils.role_helpers import is_admin - if not is_admin(current_user, db) and booking.user_id != current_user.id: + from ...shared.utils.role_helpers import can_manage_bookings + # Allow admin/staff to view any booking, customers can only view their own + if not can_manage_bookings(current_user, db) and booking.user_id != current_user.id: raise HTTPException(status_code=403, detail='Forbidden') import logging logger = logging.getLogger(__name__) diff --git a/Backend/src/bookings/schemas/__pycache__/__init__.cpython-312.pyc b/Backend/src/bookings/schemas/__pycache__/__init__.cpython-312.pyc index c37c7b96e7ce332b5885bebd555facc84d31409e..b3369d8148f168f4b3e7ab30c3446a05f9f3117b 100644 GIT binary patch delta 20 acmaFC^n!`|G%qg~0}$MDFy6==%Lo8HO$9ap delta 20 acmaFC^n!`|G%qg~0}yy^(Amfx%Lo8F+64~) diff --git a/Backend/src/bookings/schemas/__pycache__/admin_booking.cpython-312.pyc b/Backend/src/bookings/schemas/__pycache__/admin_booking.cpython-312.pyc index 323c197cef8abf0698126c34c2961f369e061f51..d84142d80166fec9b408c0691be0a9ce75907c3b 100644 GIT binary patch delta 20 acmdm?vqOjbG%qg~0}$MDFy6?mD+T~N$^{Pq delta 20 acmdm?vqOjbG%qg~0}yy^(AmhXD+T~MR|Mz) diff --git a/Backend/src/bookings/schemas/__pycache__/booking.cpython-312.pyc b/Backend/src/bookings/schemas/__pycache__/booking.cpython-312.pyc index 355324fb897e0628a2da860d230f50caddc79461..5d64bf84f3ed27977a6ce64fde0428dda403f0c7 100644 GIT binary patch delta 20 acmezB{MDKJG%qg~0}$MDFy6@hN)Z4_nFfCV delta 20 acmezB{MDKJG%qg~0}$-EuCbB(l_CI3{s!p) diff --git a/Backend/src/bookings/services/__pycache__/__init__.cpython-312.pyc b/Backend/src/bookings/services/__pycache__/__init__.cpython-312.pyc index a09bd7b3f8347d546015fb8617101473816658e9..2f4d803589c34f52eb2ec0d324865af3c227894f 100644 GIT binary patch delta 19 ZcmZ3*xQdbcG%qg~0}$MDFrLUg9{?{O1la%p delta 19 ZcmZ3*xQdbcG%qg~0}$+)sWXv#J^(Nb1q}cI diff --git a/Backend/src/bookings/services/__pycache__/group_booking_service.cpython-312.pyc b/Backend/src/bookings/services/__pycache__/group_booking_service.cpython-312.pyc index 790145e456830e35446032cf0c09e2c343cd694e..e80ecf964016f63d785d25e366b8639283283750 100644 GIT binary patch delta 22 ccmaF1h4I-IM()$Ryj%=GaLd7XBX@KZ09#WA?*IS* delta 22 ccmaF1h4I-IM()$Ryj%=GpeL)lkvlpH09CIB8UO$Q diff --git a/Backend/src/compliance/__pycache__/__init__.cpython-312.pyc b/Backend/src/compliance/__pycache__/__init__.cpython-312.pyc index 9e495488f33d2ed696df61ce25e23b4f1b19d5a8..2a319b99d9e217b8f8206fe8cb4cd51ea0bc7bed 100644 GIT binary patch delta 19 ZcmX@hc$Sg-G%qg~0}$MDFrLVL2mmxL1wsG- delta 19 ZcmX@hc$Sg-G%qg~0}yZ=)0xP92mmp}1n&R< diff --git a/Backend/src/compliance/models/__pycache__/__init__.cpython-312.pyc b/Backend/src/compliance/models/__pycache__/__init__.cpython-312.pyc index b4aa50cf5e5b3e70d1c1804c2738835c694c60cc..54397cf933c8ac9b5bee709306b4f2b28132cf0b 100644 GIT binary patch delta 20 acmZ3+wv3JYG%qg~0}$MDFy6>5%?toDj|6%E delta 20 acmZ3+wv3JYG%qg~0}#aj(Amf>%?toEUj(oK diff --git a/Backend/src/compliance/models/__pycache__/consent.cpython-312.pyc b/Backend/src/compliance/models/__pycache__/consent.cpython-312.pyc index 11c02eade3aa6bc36028b7251d88cea079c03e7e..de7f40654211ab384af77f9ca7a2b68d1f5506a6 100644 GIT binary patch delta 20 acmX>peo~zKG%qg~0}$MDFy6?$j~f6ya|Mk6 delta 20 acmX>peo~zKG%qg~0}wR*(%Hzpj~f6!LG%qg~0}$MDFy6>Lg9iXM%mp9- delta 20 acmZ21xmc3>G%qg~0}!nJsk4!L1`hx^#08}Q diff --git a/Backend/src/compliance/models/__pycache__/data_processing_record.cpython-312.pyc b/Backend/src/compliance/models/__pycache__/data_processing_record.cpython-312.pyc index ee86fd7f019a3df31e6116cf0a0f9b77bb98088c..26b117748b627b19283a78a7694eb18fc114d012 100644 GIT binary patch delta 20 acmca0c|nrLiyHto(*+>_ delta 20 acmZ1~zEqt1G%qg~0}!Blql509#)NfdBvi diff --git a/Backend/src/compliance/services/__pycache__/breach_service.cpython-312.pyc b/Backend/src/compliance/services/__pycache__/breach_service.cpython-312.pyc index 1e5ea226298e1c9cd3bc4d1ecc9ea72b41f94303..ed9f78130094812db26d271196f3a6b2cbabe5c8 100644 GIT binary patch delta 20 acmdmQz2BPqG%qg~0}$MDFy6?$MHT=+1qI0f delta 20 acmdmQz2BPqG%qg~0}#CVsk4!Li!1;{wg!y= diff --git a/Backend/src/compliance/services/__pycache__/consent_service.cpython-312.pyc b/Backend/src/compliance/services/__pycache__/consent_service.cpython-312.pyc index 94a022fc61ddf62854bfcaccb85df56eb250ddf8..4bd2dc211d0e020291c58c90ad222a8165f3e719 100644 GIT binary patch delta 20 acmbPhJJ*)`G%qg~0}$MDFy6>LNe%!y{sm|N delta 20 acmbPhJJ*)`G%qg~0}!nJsk4!Lk{kd%_66+# diff --git a/Backend/src/compliance/services/__pycache__/data_processing_service.cpython-312.pyc b/Backend/src/compliance/services/__pycache__/data_processing_service.cpython-312.pyc index 1ded8ca0479590ba178732dfefa4ed8047393223..67df3812f80292a860b471bcef0c58641c249f0e 100644 GIT binary patch delta 20 acmeyS^G%2QG%qg~0}$MDFy6?WEd~HZdIiY< delta 20 acmeyS^G%2QG%qg~0}!nJsk4zgTMPh5at2NS diff --git a/Backend/src/compliance/services/__pycache__/gdpr_service.cpython-312.pyc b/Backend/src/compliance/services/__pycache__/gdpr_service.cpython-312.pyc index 806cce884e7c02dc221302a87f629ab06843a032..8eda84e1e4e6c3dab4d0cd57f86254dd91464c00 100644 GIT binary patch delta 22 ccmcb2gX!K4ChpU`yj%=GaLd7XBX{r`0AKD0a{vGU delta 22 ccmcb2gX!K4ChpU`yj%=Gu=20YM(*G>0Ak_?_y7O^ diff --git a/Backend/src/compliance/services/__pycache__/retention_service.cpython-312.pyc b/Backend/src/compliance/services/__pycache__/retention_service.cpython-312.pyc index ef9898322207f2f5a84217c0664ef2a17b122cdd..cd3ee08302785848fabd29dd365e876af0c81087 100644 GIT binary patch delta 20 acmdm@yG57#G%qg~0}$MDFy6?$QVak*P6dSk delta 20 acmdm@yG57#G%qg~0}!nJsk4!Lr5FG|Mg|H1 diff --git a/Backend/src/content/__pycache__/__init__.cpython-312.pyc b/Backend/src/content/__pycache__/__init__.cpython-312.pyc index 897554ea08b61b2bf330c2a608210cf3ca9adaf1..16867f69cdd8fff2b9a8afe9a244997f876d6e9f 100644 GIT binary patch delta 19 ZcmZ3$xPX!SG%qg~0}$MDFrLUg6#y-*1iJtL delta 19 ZcmZ3$xPX!SG%qg~0}z~;sWXv#DgZ9x1p5F0 diff --git a/Backend/src/content/models/__pycache__/__init__.cpython-312.pyc b/Backend/src/content/models/__pycache__/__init__.cpython-312.pyc index e850999fc2f700c2518c187ccb46316c7f1f30bd..fd5394da32ccbc7098176a442e91e5185f48868a 100644 GIT binary patch delta 19 ZcmZ3^xSWyuG%qg~0}$MDFrLUg2LLXx1keBg delta 19 ZcmZ3^xSWyuG%qg~0}z~;sWXv#4gfFZ1rPuL diff --git a/Backend/src/content/models/__pycache__/banner.cpython-312.pyc b/Backend/src/content/models/__pycache__/banner.cpython-312.pyc index bb7b6a3d8461d3195164801232766e525828ca82..eb53e765654380ffba1ae0d63ecd71b7f14cd4bc 100644 GIT binary patch delta 20 acmZ3%zk;9pG%qg~0}$MDFy6>LmmL5$Cj}M& delta 20 acmZ3%zk;9pG%qg~0}!~)(%Hy8mmL5!6a>`( diff --git a/Backend/src/content/models/__pycache__/blog.cpython-312.pyc b/Backend/src/content/models/__pycache__/blog.cpython-312.pyc index 3819401e0702ee5b23671d77d1da0a0625eb79b6..11d7e2b70584b729cef09c61f813c3b11401eddb 100644 GIT binary patch delta 20 acmbQlKZ&3FG%qg~0}$MDFy6@B&JF-Fw*=Gx delta 20 acmbQlKZ&3FG%qg~0}!~)(%Hz}&JF-Dqy&=y diff --git a/Backend/src/content/models/__pycache__/cookie_integration_config.cpython-312.pyc b/Backend/src/content/models/__pycache__/cookie_integration_config.cpython-312.pyc index f09cce18a043efcbdf01ea1acdd285cffce28ec0..eaa9060a76a1decf03496a20fef53e7567be37e1 100644 GIT binary patch delta 20 acmZ3?wU~?hG%qg~0}$MDFy6>5!3qE~sRVlf delta 20 acmZ3?wU~?hG%qg~0}!~)(%Hx@!3qE|mIOKg diff --git a/Backend/src/content/models/__pycache__/cookie_policy.cpython-312.pyc b/Backend/src/content/models/__pycache__/cookie_policy.cpython-312.pyc index 0c3250ab716d484991eb6fbedd4f9559c054b4d0..936470f02b75d5011e435c579b89269bfc392d20 100644 GIT binary patch delta 20 acmZ3+wTz4VG%qg~0}$MDFy6>5%?bcCAq0c~ delta 20 acmZ3+wTz4VG%qg~0}!~)(%Hx@%?bcA4g^C0 diff --git a/Backend/src/content/models/__pycache__/page_content.cpython-312.pyc b/Backend/src/content/models/__pycache__/page_content.cpython-312.pyc index d6b11905e0d9920b9c13daa137eb482a22fd90f4..f682eba8b420ec450ae13e444b653ffaedb985f9 100644 GIT binary patch delta 20 acmdmPz1^DoG%qg~0}$MDFy6?$Miu}*#Rahd delta 20 acmdmPz1^DoG%qg~0}wb}Gup_#Miu}*90jfb diff --git a/Backend/src/content/routes/__pycache__/__init__.cpython-312.pyc b/Backend/src/content/routes/__pycache__/__init__.cpython-312.pyc index dda245670ee120b37f57d012956a86956ef73183..db43bb5cde0e605a25e3f35a1b58a272e56d1307 100644 GIT binary patch delta 19 ZcmZ3^xSWyuG%qg~0}$MDFrLUg2LLXx1keBg delta 19 ZcmZ3^xSWyuG%qg~0}z~;sWXv#4gfFZ1rPuL diff --git a/Backend/src/content/routes/__pycache__/about_routes.cpython-312.pyc b/Backend/src/content/routes/__pycache__/about_routes.cpython-312.pyc index e444aa69c78a2d2c39e6045c56b6e1798443a768..2250711602584e7e153a5b5a3c8383a3115797cc 100644 GIT binary patch delta 20 acmcbjd_|f2G%qg~0}$MDFy6?0QV;+?;RVb9 delta 20 acmcbjd_|f2G%qg~0}%Mm(%Hy;QV;+={{@l& diff --git a/Backend/src/content/routes/__pycache__/accessibility_routes.cpython-312.pyc b/Backend/src/content/routes/__pycache__/accessibility_routes.cpython-312.pyc index 0a4fba7142869f8a256da82528656551c8ba3a93..fcb9bc3d5233fe2ae9c8e0d4996874cb09d07eab 100644 GIT binary patch delta 20 acmX>ubzF-3G%qg~0}$MDFy6>*!wUdAkp&L` delta 20 acmX>ubzF-3G%qg~0}%Mm(%Hyu!wUd8uLRWq diff --git a/Backend/src/content/routes/__pycache__/admin_privacy_routes.cpython-312.pyc b/Backend/src/content/routes/__pycache__/admin_privacy_routes.cpython-312.pyc index e64893be91ce251dc031f3641bc61fcef2a942ea..f1269c6792de0dde6d102667ca7db227cf57a512 100644 GIT binary patch delta 20 acmew&_eGBTG%qg~0}$MDFy6?W$qxWSD+Qnc delta 20 acmew&_eGBTG%qg~0}%Mm(%HzJ$qxWQNd;yA diff --git a/Backend/src/content/routes/__pycache__/banner_routes.cpython-312.pyc b/Backend/src/content/routes/__pycache__/banner_routes.cpython-312.pyc index 9e22c9be04eab3416b918e42515d28bef72c42a8..be77e1b6b2a87b73ec48f7b529f69cdbbc59d64a 100644 GIT binary patch delta 20 acmZoGYAfPC&CAQh00g%jj5l)swg3P>^advY delta 20 acmZoGYAfPC&CAQh00did^*3_=wg3P>mbxex;G%qg~0}$MDFy6>*%?kiKX$1@b delta 20 acmX>mbxex;G%qg~0}%Mm(%Hyu%?kiIhXm39 diff --git a/Backend/src/content/routes/__pycache__/contact_content_routes.cpython-312.pyc b/Backend/src/content/routes/__pycache__/contact_content_routes.cpython-312.pyc index 859c77d26050d198db5751935c1f4b2bcb702aab..375a419627ec1f7aedc31733aee54526627d300e 100644 GIT binary patch delta 20 acmZpbZI$Id&CAQh00g%jj5l&u@c{rbt_08k delta 20 acmZpbZI$Id&CAQh00h3XbT)EV@c{rZ%mkJI diff --git a/Backend/src/content/routes/__pycache__/contact_routes.cpython-312.pyc b/Backend/src/content/routes/__pycache__/contact_routes.cpython-312.pyc index 563a58a6a240f9a946fe0de1a77c9c41895632a1..cc4e9a4fe256dcb6b62e40ad09b693aec2b749c3 100644 GIT binary patch delta 20 acmZ3fxKfe(G%qg~0}$MDFy6>LPXGWo-~~ni delta 20 acmZ3fxKfe(G%qg~0}#agHQLBMPXGWp*9C+C diff --git a/Backend/src/content/routes/__pycache__/faq_routes.cpython-312.pyc b/Backend/src/content/routes/__pycache__/faq_routes.cpython-312.pyc index 187b17b6dd1174e9be11266ea0c27f7dfd2aaab6..721b1796e95d1e78d9b4a4ad65110a8a18e1ccec 100644 GIT binary patch delta 20 acmaDP`ACxcG%qg~0}$MDFy6?0od*Cwqy^mo delta 20 acmaDP`ACxcG%qg~0}%Mm(%Hy;od*Cu!UdxM diff --git a/Backend/src/content/routes/__pycache__/footer_routes.cpython-312.pyc b/Backend/src/content/routes/__pycache__/footer_routes.cpython-312.pyc index 05ba952b4bbff3ffc4e4e05212524abd0fc23502..91fabe7ff168e9c07e1aaa4f552a22d05841ab24 100644 GIT binary patch delta 20 acmZpcYL?fpG%qg~0}$MDFy6>5%?kiFX#}hQ delta 20 acmZ1`wM>fpG%qg~0}%Mm(%Hx@%?kiDhXir} diff --git a/Backend/src/content/routes/__pycache__/terms_routes.cpython-312.pyc b/Backend/src/content/routes/__pycache__/terms_routes.cpython-312.pyc index 345ebbff1cc7bed741f5bfa157ab7ca61fbbc60b..71a606fd8e911b892183457d42d9ede5058975cb 100644 GIT binary patch delta 20 acmbOtHARa1G%qg~0}$MDFy6?`$qN88nFMwK delta 20 acmbOtHARa1G%qg~0}%Mm(%Hz($qN86w*))@ diff --git a/Backend/src/content/schemas/__pycache__/__init__.cpython-312.pyc b/Backend/src/content/schemas/__pycache__/__init__.cpython-312.pyc index 7255efda72e8203c14d7603ad4a05ed55fd380ed..700ed089d063fda335c31ec79815141b5d18de6d 100644 GIT binary patch delta 19 ZcmZ3%xPp=UG%qg~0}$MDFrLUg7XU8R1k(Tj delta 19 ZcmZ3%xPp=UG%qg~0}z~;sWXv#E&wnJ1rq=O diff --git a/Backend/src/content/schemas/__pycache__/admin_privacy.cpython-312.pyc b/Backend/src/content/schemas/__pycache__/admin_privacy.cpython-312.pyc index 63eb6dcb792273d304da7728be0ec7b6a738e50a..2d7a63ab5edf4713e7b1a89c5520d74cf090e9d6 100644 GIT binary patch delta 20 acmZn`Z5HJ|&CAQh00g%jj5l&uZ~*`@Is~== delta 20 acmZn`Z5HJ|&CAQh00d7W6gF~KZ~*`@u>{2c diff --git a/Backend/src/content/schemas/__pycache__/blog.cpython-312.pyc b/Backend/src/content/schemas/__pycache__/blog.cpython-312.pyc index 3f6926ef77210053e626ed5dc41490adf217f42f..c15e9703fe2f332d63df28a097a56cf5324f9a0e 100644 GIT binary patch delta 20 acmX>ib3}&wG%qg~0}$MDFy6>*$p-*CVg(BT delta 20 acmX>ib3}&wG%qg~0}x!+)Y`~x$p-*BdIaPE diff --git a/Backend/src/content/schemas/__pycache__/page_content.cpython-312.pyc b/Backend/src/content/schemas/__pycache__/page_content.cpython-312.pyc index ac941a19c273c3c4c6840469a41e20e8b2dc8ff0..43dacdd5770de9818f7856750255580d613dc471 100644 GIT binary patch delta 20 acmX>ebUcXrG%qg~0}$MDFy6>*qX_^*jRl(k delta 20 acmX>ebUcXrG%qg~0}xERYP6BtMiT%;%yO diff --git a/Backend/src/guest_management/__pycache__/__init__.cpython-312.pyc b/Backend/src/guest_management/__pycache__/__init__.cpython-312.pyc index 2ed39734a0b7a63bc9ccf588447812ece684d4d6..bf5f3acd2fc21a99f430dbba05f529a34d6a41d8 100644 GIT binary patch delta 19 ZcmZ3sWXv#9sn>?1snhX diff --git a/Backend/src/guest_management/models/__pycache__/__init__.cpython-312.pyc b/Backend/src/guest_management/models/__pycache__/__init__.cpython-312.pyc index d76ca8c079655ac15d3aa669d32642fecc082bd1..710cf27967decbf17bf776a10b0040ac6637b65d 100644 GIT binary patch delta 19 ZcmdnMxPg)TG%qg~0}$MDFrLW06aX*%1nU3* delta 19 ZcmdnMxPg)TG%qg~0}z~>sWXv#DF8861u*~s diff --git a/Backend/src/guest_management/models/__pycache__/guest_communication.cpython-312.pyc b/Backend/src/guest_management/models/__pycache__/guest_communication.cpython-312.pyc index a9d43166e83bd7ffb626998a1d0539ab9037597b..8b0d8cfaf0f249dbc765f5e1259f80425c32b3e8 100644 GIT binary patch delta 20 acmbO#G*yWEG%qg~0}$MDFy6?`#R&j1odjh7 delta 20 acmbO#G*yWEG%qg~0}!~)(%Hz(#R&i~iUcG8 diff --git a/Backend/src/guest_management/models/__pycache__/guest_complaint.cpython-312.pyc b/Backend/src/guest_management/models/__pycache__/guest_complaint.cpython-312.pyc index a4444237b1dcae05c627efbd313f05f5c4c7ab05..f3f4901732fdac6d77189a02b202f2596c09a7cc 100644 GIT binary patch delta 20 acmX@9c2bS|G%qg~0}$MDFy6>*Cky~RmjyEb delta 20 acmX@9c2bS|G%qg~0}yQAq_dIRP8a|`D+PN1 diff --git a/Backend/src/guest_management/models/__pycache__/guest_note.cpython-312.pyc b/Backend/src/guest_management/models/__pycache__/guest_note.cpython-312.pyc index fc463d5b50821cabd713fb5cbc4d83380304083f..7240649df7ac9167743c523f86e4c759feac62d9 100644 GIT binary patch delta 20 acmX@XeS(|&G%qg~0}$MDFy6?$mlXgyl?7}7 delta 20 acmX@XeS(|&G%qg~0}!~)(%HzpmlXgwf(0u8 diff --git a/Backend/src/guest_management/models/__pycache__/guest_preference.cpython-312.pyc b/Backend/src/guest_management/models/__pycache__/guest_preference.cpython-312.pyc index 56de9772f6ab1a8290bfc207e34a03d67d7aaedc..03ef858778815d7ca53fd61937ba515fee87efa0 100644 GIT binary patch delta 20 acmdnQzlopwG%qg~0}$MDFy6?$oE-o+w*@o+ delta 20 acmdnQzlopwG%qg~0}!~)(%HzpoE-o)qy+N- diff --git a/Backend/src/guest_management/models/__pycache__/guest_segment.cpython-312.pyc b/Backend/src/guest_management/models/__pycache__/guest_segment.cpython-312.pyc index 816f553fcd9e8d38c816b88b14635d7e0e79360b..a3de53fd317e3ddc18d84dbcd9ba2228f3b678b2 100644 GIT binary patch delta 20 acmey)`<<8jG%qg~0}$MDFy6@hh7ABhHU<6w delta 20 acmey)`<<8jG%qg~0}!~)(%H!Uh7ABfBL%$x diff --git a/Backend/src/guest_management/models/__pycache__/guest_tag.cpython-312.pyc b/Backend/src/guest_management/models/__pycache__/guest_tag.cpython-312.pyc index 0ed4ea5b535d8367fce369f5cbc4ae2ecc2bc9e7..00bbbbedc76c04657129ffa429bce01eaf7b6010 100644 GIT binary patch delta 20 acmbQmGmD4&G%qg~0}$MDFy6?`&jtW8iUef< delta 20 acmbQmGmD4&G%qg~0}!~)(%Hz(&jtW6cLXE= diff --git a/Backend/src/guest_management/routes/__pycache__/__init__.cpython-312.pyc b/Backend/src/guest_management/routes/__pycache__/__init__.cpython-312.pyc index 12f2b3f7467c2b2a9fa5757d5ec6c6eb0f81451e..3c3f1ff87e6df25a42b5a9f6067549bae7c03123 100644 GIT binary patch delta 19 ZcmdnMxPg)TG%qg~0}$MDFrLW06aX*%1nU3* delta 19 ZcmdnMxPg)TG%qg~0}z~>sWXv#DF8861u*~s diff --git a/Backend/src/guest_management/routes/__pycache__/complaint_routes.cpython-312.pyc b/Backend/src/guest_management/routes/__pycache__/complaint_routes.cpython-312.pyc index 2a4db58031873d17b18ca9b902ee00cdb75d188d..6e4a739110b24e3ba70482a8dd6fa6a5d53f09ec 100644 GIT binary patch delta 21 bcmeCa#Mpg_k^3|+FBbz4+;T8p$ejrQO1lOb delta 21 bcmeCa#Mpg_k^3|+FBbz47#uQK$ejrQNj(Mb diff --git a/Backend/src/guest_management/routes/__pycache__/guest_profile_routes.cpython-312.pyc b/Backend/src/guest_management/routes/__pycache__/guest_profile_routes.cpython-312.pyc index 5a7354dc2f0620ac212e53366cadb11167dac724..8f5acc286a870e713b1c9530c43aaed02b8da698 100644 GIT binary patch delta 22 ccmaF!h4IZ7M()$Ryj%=GaLd7XBX?pI0A@7@p#T5? delta 22 ccmaF!h4IZ7M()$Ryj%=GptH|lBX?pI0AyGPZU6uP diff --git a/Backend/src/guest_management/schemas/__pycache__/__init__.cpython-312.pyc b/Backend/src/guest_management/schemas/__pycache__/__init__.cpython-312.pyc index ca27c4e3ee814bdcd18c704da5db3b906039aab1..c548b20d531d272b1a94df4a1c79c240536be935 100644 GIT binary patch delta 19 ZcmdnUxRH_jG%qg~0}$MDFrLW03;-}91nvL; delta 19 ZcmdnUxRH_jG%qg~0}z~>sWXv#82~YR1vCHv diff --git a/Backend/src/guest_management/schemas/__pycache__/complaint.cpython-312.pyc b/Backend/src/guest_management/schemas/__pycache__/complaint.cpython-312.pyc index e5647029fb0d7c3ab4a0be040f3d00e9bd9ad915..498e63ab9e0c0f862583b7134a119695d2bdf7cb 100644 GIT binary patch delta 20 acmZ2&xZ05WG%qg~0}$MDFy6?$Kmq_ecm;F- delta 20 acmZ2&xZ05WG%qg~0}#Y*(%HzpKmq_dodsh6 diff --git a/Backend/src/guest_management/services/__pycache__/__init__.cpython-312.pyc b/Backend/src/guest_management/services/__pycache__/__init__.cpython-312.pyc index 7a9e891fdeafc568bfcee497415e50d593525bf3..7fa86b58a607383b2448049ded1b04541d43ecac 100644 GIT binary patch delta 19 ZcmdnQxQUVbG%qg~0}$MDFrLW08~`v!1n~d> delta 19 ZcmdnQxQUVbG%qg~0}z~>sWXv#IRG)B1vdZy diff --git a/Backend/src/guest_management/services/__pycache__/guest_profile_service.cpython-312.pyc b/Backend/src/guest_management/services/__pycache__/guest_profile_service.cpython-312.pyc index c320d87ac5b8192cf2661b61acbe3a6676642d38..edbcd4f32146fc01fe63c8f64827eb257c2535ef 100644 GIT binary patch delta 22 ccmZqfXKe0gPx# delta 22 ccmZqfXKe0g5$OZs1+5~F= delta 20 acmbQkGlz%!G%qg~0}#Y+G}y>3$OZs11_WFH diff --git a/Backend/src/hotel_services/models/__pycache__/inventory_transaction.cpython-312.pyc b/Backend/src/hotel_services/models/__pycache__/inventory_transaction.cpython-312.pyc index 3495eb741c278f61f6c9ec8e43cef3ebf6574991..bb45046661f9473ae4af21d11cdcff03309a1b6e 100644 GIT binary patch delta 20 acmZ1{xK5D!G%qg~0}$MDFy6?$m;(SeU delta 20 acmdnSw~decG%qg~0}v?vFx<$k%?5CkOyI1q8_e delta 20 acmZ3fv{H%tG%qg~0}!~)(%Hx@CkOyF@&t$g diff --git a/Backend/src/hotel_services/models/__pycache__/service_usage.cpython-312.pyc b/Backend/src/hotel_services/models/__pycache__/service_usage.cpython-312.pyc index 6e39411b3203be39e25383985132693ef515b3e5..c03c1ea2bb350f4e537ae201f3e81c28498d53b0 100644 GIT binary patch delta 20 acmcc0bCrktG%qg~0}$MDFy6@R#RdR7!UYxp delta 20 acmcc0bCrktG%qg~0}!~)(%H!E#RdR5uLRWq diff --git a/Backend/src/hotel_services/models/__pycache__/staff_shift.cpython-312.pyc b/Backend/src/hotel_services/models/__pycache__/staff_shift.cpython-312.pyc index 83821bdf68d7dc894b6d589a8b99a7d369d55cce..90a3de929356cf36a39c466e5d72a5ca69ebc31e 100644 GIT binary patch delta 20 acmaE&{Y0DlG%qg~0}$MDFy6?0QxpJ0g$57+ delta 20 acmaE&{Y0DlG%qg~0}y!bGuX&|QxpI~a|QYU diff --git a/Backend/src/hotel_services/routes/__pycache__/__init__.cpython-312.pyc b/Backend/src/hotel_services/routes/__pycache__/__init__.cpython-312.pyc index 3500959363799bfe717fc88b421dccaaef274d5f..6903f84498c0951dbdcc036d7cd886b1743573cf 100644 GIT binary patch delta 20 acmbQqG?R(@G%qg~0}$MDFy6?`#|Qv0^#n-( delta 20 acmbQqG?R(@G%qg~0}%Y(ZLpD>j}ZVgy#(X{ diff --git a/Backend/src/hotel_services/routes/__pycache__/guest_request_routes.cpython-312.pyc b/Backend/src/hotel_services/routes/__pycache__/guest_request_routes.cpython-312.pyc index a99a8339a96b8d6fec9f27267460e287dcecc593..ec0e1d129551cf80fcdb46db75edc7745f77daed 100644 GIT binary patch delta 21 bcmZ2-m2t^cMy}Jmyj%=GaLZvM*Q_i6P&@|5 delta 21 bcmZ2-m2t^cMy}Jmyj%=GutsDf*Q_i6PD}=E diff --git a/Backend/src/hotel_services/routes/__pycache__/inventory_routes.cpython-312.pyc b/Backend/src/hotel_services/routes/__pycache__/inventory_routes.cpython-312.pyc index 32ad694ebc57a31872f6bc550b81d0b21c4199ce..a129092e18ff265f40736fec6af22859bc40e785 100644 GIT binary patch delta 22 ccmZ2;hjGmvM()$Ryj%=GaLd7XBe!B609U~Vr2qf` delta 22 ccmZ2;hjGmvM()$Ryj%=G5WCS}Be!B609Ne=mH+?% diff --git a/Backend/src/hotel_services/routes/__pycache__/service_booking_routes.cpython-312.pyc b/Backend/src/hotel_services/routes/__pycache__/service_booking_routes.cpython-312.pyc index b1ebfc2402edc1ff4278915dae6476d5fa50f68c..45bdcb4e1706a6ef44267052955ba35b7d6865b0 100644 GIT binary patch delta 22 ccmZ3}!nme|k^3|+FBbz4+;TA9$gSuE07@+d$p8QV delta 22 ccmZ3}!nme|k^3|+FBbz4=*jAC$V0ASe%O8@`> delta 22 ccmaEVj`96DM()$Ryj%=G@OQVtM(&h!0A!&D<^TWy diff --git a/Backend/src/hotel_services/schemas/__pycache__/__init__.cpython-312.pyc b/Backend/src/hotel_services/schemas/__pycache__/__init__.cpython-312.pyc index ea3f7387c78c76fbc816ad98198c4f07cab99776..078c45972d847e00ba82445de57347257c75556b 100644 GIT binary patch delta 19 ZcmZ3_xSo;wG%qg~0}$MDFrLW01OPAC1n2+& delta 19 ZcmZ3_xSo;wG%qg~0}vdUsWXv#2>>wl1tb6f diff --git a/Backend/src/hotel_services/schemas/__pycache__/service_booking.cpython-312.pyc b/Backend/src/hotel_services/schemas/__pycache__/service_booking.cpython-312.pyc index d717c24ca5091a9d07092bccc5ee784df9363864..631d263f58d8a665c267fdcb8584b1df4f81acbf 100644 GIT binary patch delta 20 acmbOwF-wB`G%qg~0}$MDFy6?`&jSE7Km>yT delta 20 acmbOwF-wB`G%qg~0}!~)(%Hz(&jSE5Ed)XU diff --git a/Backend/src/hotel_services/services/__pycache__/__init__.cpython-312.pyc b/Backend/src/hotel_services/services/__pycache__/__init__.cpython-312.pyc index b638c0c2d9a0662c64156ed29c8078ef77eaccb2..0409831a03d8c99943620a66f8ef6601ee1669bb 100644 GIT binary patch delta 19 ZcmdnMxPg)TG%qg~0}$MDFrLW06aX*%1nU3* delta 19 ZcmdnMxPg)TG%qg~0}vdUsWXv#DF87V1t$Oi diff --git a/Backend/src/hotel_services/services/__pycache__/task_service.cpython-312.pyc b/Backend/src/hotel_services/services/__pycache__/task_service.cpython-312.pyc index 132b7c05d6ffab930849c7afdacbbbc0b5b13894..64820312e06f98de7b2d6f4ac4bed70509670793 100644 GIT binary patch delta 22 ccmey~&G@~Wk^3|+FBbz4+;TA9$o<9@09e`wI{*Lx delta 22 ccmey~&G@~Wk^3|+FBbz4xXsep$o<9@09MBa`Tzg` diff --git a/Backend/src/integrations/__pycache__/__init__.cpython-312.pyc b/Backend/src/integrations/__pycache__/__init__.cpython-312.pyc index 428681ec6c3e0c0931b7cf9c143c329c14cdf5cb..59aa11950bd6de30d4b49c1c3387ec8fdeb741ac 100644 GIT binary patch delta 19 ZcmaFL_>__RG%qg~0}$MDFrLVL3jjB!1&ROw delta 19 ZcmaFL_>__RG%qg~0}yZ=)0xP93jj4d1vdZy diff --git a/Backend/src/integrations/models/__pycache__/api_key.cpython-312.pyc b/Backend/src/integrations/models/__pycache__/api_key.cpython-312.pyc index f2b7e32af25ed4adf6bde76c9ae2a1e3c33c15b3..9efa12dbf6a02f79c0b1a63fa3f71e26c2274b57 100644 GIT binary patch delta 20 acmbOrJVBWIG%qg~0}$MDFy6@B$_W56`2^Si delta 20 acmbOrJVBWIG%qg~0}yZ=)7i+~$_W54JOqUR diff --git a/Backend/src/integrations/models/__pycache__/webhook.cpython-312.pyc b/Backend/src/integrations/models/__pycache__/webhook.cpython-312.pyc index af6446d15299d53636f47d4ea45519b9f369dd3a..3843d3e9e8e2398f56ab2212ad2abc0a1bc949cd 100644 GIT binary patch delta 20 acmdlXzeAq;G%qg~0}$MDFy6?$mLC8*?*(oE delta 20 acmdlXzeAq;G%qg~0}yZ=)7i+qmLC8(G6fp| diff --git a/Backend/src/integrations/routes/__pycache__/__init__.cpython-312.pyc b/Backend/src/integrations/routes/__pycache__/__init__.cpython-312.pyc index d547dd0b7c6e3f63bf6b6828862abba7ee3c8f00..5186b38e53a63a9d918d603670bb82ebf0d1fc15 100644 GIT binary patch delta 19 ZcmaFE_=b`DG%qg~0}$MDFrLW$5CAx-1)l%_ delta 19 ZcmaFE_=b`DG%qg~0}yZ=)0xQq5CAqm1xx?{ diff --git a/Backend/src/integrations/routes/__pycache__/api_key_routes.cpython-312.pyc b/Backend/src/integrations/routes/__pycache__/api_key_routes.cpython-312.pyc index 714e21f06ce9d40ecee1e33f14c14131f53e5892..09a389d238019e2d9463bf3a0dddd36861c0dc6b 100644 GIT binary patch delta 20 acmeCP@3ZGV&CAQh00g%jj5l&O%L4#7?*%{r delta 20 acmeCP@3ZGV&CAQh00f)P=xpR}mInYj`~{r= diff --git a/Backend/src/integrations/routes/__pycache__/webhook_routes.cpython-312.pyc b/Backend/src/integrations/routes/__pycache__/webhook_routes.cpython-312.pyc index ecbe715ea400d2159c078ba8b3da7ee02bfea1f7..31f5a438506aab30d4c5593f32c1933624448ab5 100644 GIT binary patch delta 20 acmX@>ch-;lG%qg~0}$MDFy6@Rqz(W>>jk3# delta 20 acmX@>ch-;lG%qg~0}yOFqqC9QNgV)1_yzy~ diff --git a/Backend/src/integrations/services/__pycache__/api_key_service.cpython-312.pyc b/Backend/src/integrations/services/__pycache__/api_key_service.cpython-312.pyc index aa8e3c26f371ccb0745589748b35e6dde206d05d..eac63bc50c104e199c4d44897b3bbd7ec062cd13 100644 GIT binary patch delta 20 acmcbvcU_PBG%qg~0}$MDFy6@RBMtyS>jiND delta 20 acmcbvcU_PBG%qg~0}yOFqqC9QM;rh`_yx`Y diff --git a/Backend/src/integrations/services/__pycache__/webhook_service.cpython-312.pyc b/Backend/src/integrations/services/__pycache__/webhook_service.cpython-312.pyc index 7e281af3c91c37a5b8fe2ef5a6008cbfb3952c0b..89253973be2d50b6517547933169976249aeb486 100644 GIT binary patch delta 20 acmX@)eaM^pG%qg~0}$MDFy6?$T@?UA#Rd8R delta 20 acmX@)eaM^pG%qg~0}yOFqqC8FyD9)g(gs%m diff --git a/Backend/src/loyalty/__pycache__/__init__.cpython-312.pyc b/Backend/src/loyalty/__pycache__/__init__.cpython-312.pyc index ba4eab9c71918fa018e20d91310905fc0bb41ca9..c593269aa572bce712c5009cb96db57a630729ea 100644 GIT binary patch delta 19 ZcmZ3$xPX!SG%qg~0}$MDFrLUg6#y-*1iJtL delta 19 ZcmZ3$xPX!SG%qg~0}z~^sWXv#DgZ9@1pWX3 diff --git a/Backend/src/loyalty/models/__pycache__/__init__.cpython-312.pyc b/Backend/src/loyalty/models/__pycache__/__init__.cpython-312.pyc index 056da99d39300f247096f636fe7fa72652a1b887..c667b43ef5f2f12775617fc4721dacc199a39ca8 100644 GIT binary patch delta 19 ZcmZ3^xSWyuG%qg~0}$MDFrLUg2LLXx1keBg delta 19 ZcmZ3^xSWyuG%qg~0}z~^sWXv#4gfFr1rq=O diff --git a/Backend/src/loyalty/models/__pycache__/loyalty_point_transaction.cpython-312.pyc b/Backend/src/loyalty/models/__pycache__/loyalty_point_transaction.cpython-312.pyc index 6a34b30199193b6d6a55abe70b5b16116b64793c..1f812dcef7241d57432999928e1caf455ab3e4d7 100644 GIT binary patch delta 20 acmcaCbXkb|G%qg~0}$MDFy6@R!3h97O$8qS delta 20 acmcaCbXkb|G%qg~0}!~)(%H!E!3h95It1PT diff --git a/Backend/src/loyalty/models/__pycache__/loyalty_reward.cpython-312.pyc b/Backend/src/loyalty/models/__pycache__/loyalty_reward.cpython-312.pyc index 1870f29ab8601f4ffaf951dfed325ab9d2c0e12a..567908485416db58831b123164dd0b08d0a52970 100644 GIT binary patch delta 20 acmZ3juv&rpG%qg~0}$MDFy6?mAOHY33jo diff --git a/Backend/src/loyalty/models/__pycache__/loyalty_tier.cpython-312.pyc b/Backend/src/loyalty/models/__pycache__/loyalty_tier.cpython-312.pyc index 1dcc6afe4aeb6896698978be88f843bb1590d825..c05b6106e2b3bd5f45f23e8f18f39b1a695fe8f1 100644 GIT binary patch delta 20 acmbOuFh_v5$N>N|Yy@=x delta 20 acmbOuFh_vN`Sp+ly diff --git a/Backend/src/loyalty/models/__pycache__/package.cpython-312.pyc b/Backend/src/loyalty/models/__pycache__/package.cpython-312.pyc index 4a507db1113e803a822ac6acf248b2276aa51491..eb8af0ac3b0ead14377c68cfd6c4a1416aa65a30 100644 GIT binary patch delta 20 acmeBC>`~-C&CAQh00g%jj5l&O3IG5!SOo6? delta 20 acmeBC>`~-C&CAQh00eHcbT)D~3IG5yMFg$@ diff --git a/Backend/src/loyalty/models/__pycache__/promotion.cpython-312.pyc b/Backend/src/loyalty/models/__pycache__/promotion.cpython-312.pyc index ac43f59762ea51d5b8919f73d63cb0cf986534dc..e3a3ed2a88ae9b23af293378b7a764235f73b5fb 100644 GIT binary patch delta 19 ZcmZ3ex=@wtG%qg~0}$MD*vK_q2mmvJ1q1*9 delta 19 ZcmZ3ex=@wtG%qg~0}#wo+Q>Cs2mmo`1f~E0 diff --git a/Backend/src/loyalty/models/__pycache__/referral.cpython-312.pyc b/Backend/src/loyalty/models/__pycache__/referral.cpython-312.pyc index eaf636f35805bf6743c8997a96e5e38308d827f7..827cc96e4058738d1b12548d46cc2d630e2a8904 100644 GIT binary patch delta 20 acmca3a7TdqG%qg~0}$MDFy6==$N>O7Yy~v{ delta 20 acmca3a7TdqG%qg~0}!~)(%Hxz$N>O5Sp@U| diff --git a/Backend/src/loyalty/models/__pycache__/reward_redemption.cpython-312.pyc b/Backend/src/loyalty/models/__pycache__/reward_redemption.cpython-312.pyc index 626950bfcd521022488fd09eb06873dc0ee0ecac..8fc1cd1f089e993093600fe5e881e2183c97b17b 100644 GIT binary patch delta 20 acmX>jct()>G%qg~0}$MDFy6?0kOKfb5Cw+- delta 20 acmX>jct()>G%qg~0}!~)(%Hy;kOKfY{RKt< diff --git a/Backend/src/loyalty/models/__pycache__/user_loyalty.cpython-312.pyc b/Backend/src/loyalty/models/__pycache__/user_loyalty.cpython-312.pyc index 88438bd98bc89a8298aa9e69cbb120c034c9c577..dd21c493ecc06af170feba63f771d4012ed9608a 100644 GIT binary patch delta 20 acmca4cuA1^G%qg~0}$MDFy6?0oC5$o00o%< delta 20 acmca4cuA1^G%qg~0}!~)(%Hy;oC5$l?FCo> diff --git a/Backend/src/loyalty/routes/__pycache__/__init__.cpython-312.pyc b/Backend/src/loyalty/routes/__pycache__/__init__.cpython-312.pyc index 9330ba510fe12fd7bef5b4d930cdf3c3f03afd9e..eae6177e7ed488bd8c39b1964d5c1776dea5c23b 100644 GIT binary patch delta 19 ZcmZ3^xSWyuG%qg~0}$MDFrLUg2LLXx1keBg delta 19 ZcmZ3^xSWyuG%qg~0}z~^sWXv#4gfFr1rq=O diff --git a/Backend/src/loyalty/routes/__pycache__/loyalty_routes.cpython-312.pyc b/Backend/src/loyalty/routes/__pycache__/loyalty_routes.cpython-312.pyc index 4df75e392c9e44ad8c93f3e689d5314523c557fe..80f382cb67c465351f99af4c25239583a1b03a46 100644 GIT binary patch delta 22 ccmaF&nCabPChpU`yj%=GaLd7XBlqKt0A)}JJ^%m! delta 22 ccmaF&nCabPChpU`yj%=G@L`tDM()QO0cYa~rvLx| diff --git a/Backend/src/loyalty/routes/__pycache__/package_routes.cpython-312.pyc b/Backend/src/loyalty/routes/__pycache__/package_routes.cpython-312.pyc index d23536a8c5d3059b816cda1d5347f9c5c7c46a65..5253b124d64f10044b1e405f771003838574d4bd 100644 GIT binary patch delta 22 ccmZ2`fN|{sM()$Ryj%=GaLd7XBezll08^Rs diff --git a/Backend/src/loyalty/schemas/__pycache__/__init__.cpython-312.pyc b/Backend/src/loyalty/schemas/__pycache__/__init__.cpython-312.pyc index cb20a0ca3a4165e6388b50c63165e444b404c7e4..accad83ded5e311ad17fc89a894efa516d5a7e2b 100644 GIT binary patch delta 19 ZcmZ3%xPp=UG%qg~0}$MDFrLUg7XU8R1k(Tj delta 19 ZcmZ3%xPp=UG%qg~0}z~^sWXv#E&wnb1r`7R diff --git a/Backend/src/loyalty/schemas/__pycache__/promotion.cpython-312.pyc b/Backend/src/loyalty/schemas/__pycache__/promotion.cpython-312.pyc index e160df48a18ac5d2aea0f87073a43f3ec68157e4..88ff61cead042e6b9c47167d92b01e1f48aaf50c 100644 GIT binary patch delta 19 ZcmbQ{KFyu$G%qg~0}$MD*vQqR3;;HD1vmfz delta 19 ZcmbQ{KFyu$G%qg~0}#wo+Q`+T3;;A=1lj-q diff --git a/Backend/src/loyalty/services/__pycache__/__init__.cpython-312.pyc b/Backend/src/loyalty/services/__pycache__/__init__.cpython-312.pyc index bceb968b912daa3f33a4684e8bda886ee4b87a7b..16e2015da84cb6fb0cbaee4bcac0904857f76a4a 100644 GIT binary patch delta 19 ZcmZ3w1sMPU diff --git a/Backend/src/loyalty/services/__pycache__/loyalty_service.cpython-312.pyc b/Backend/src/loyalty/services/__pycache__/loyalty_service.cpython-312.pyc index 7dedbdf6dcf6f3d7fd470ece36905897f4ae9671..2a6b2a61545db5c98064e0afcffb864b1733b5c3 100644 GIT binary patch delta 22 ccmdn~hjIHKM()$Ryj%=GaLd7XBezZ+0A7j*761SM delta 22 ccmdn~hjIHKM()$Ryj%=GpeL)lkz1z@09fV*K>z>% diff --git a/Backend/src/main.py b/Backend/src/main.py index 3132864a..af99f453 100644 --- a/Backend/src/main.py +++ b/Backend/src/main.py @@ -304,7 +304,7 @@ from .reviews.routes import review_routes, favorite_routes from .loyalty.routes import promotion_routes, loyalty_routes, package_routes from .guest_management.routes import guest_profile_routes from .guest_management.routes.complaint_routes import router as complaint_routes -from .notifications.routes import chat_routes, notification_routes, email_campaign_routes +from .notifications.routes import chat_routes, notification_routes, email_campaign_routes, team_chat_routes from .analytics.routes import analytics_routes, report_routes, audit_routes from .security.routes import security_routes, compliance_routes from .system.routes import system_settings_routes, workflow_routes, task_routes, approval_routes, backup_routes @@ -353,6 +353,7 @@ app.include_router(cancellation_routes.router, prefix=api_prefix) app.include_router(accessibility_routes.router, prefix=api_prefix) app.include_router(faq_routes.router, prefix=api_prefix) app.include_router(chat_routes.router, prefix=api_prefix) +app.include_router(team_chat_routes.router, prefix=api_prefix) app.include_router(loyalty_routes.router, prefix=api_prefix) app.include_router(guest_profile_routes.router, prefix=api_prefix) app.include_router(complaint_routes, prefix=api_prefix) diff --git a/Backend/src/models/__pycache__/__init__.cpython-312.pyc b/Backend/src/models/__pycache__/__init__.cpython-312.pyc index 7555c912390b919ccddeb8337ae043c06fb4a0c0..a15242bc5376fc8c920e6a8871e9f52eef94a5f9 100644 GIT binary patch delta 20 acmbQ{IL(p!G%qg~0}$MDFy6@BtpETzcm-Vm delta 20 acmbQ{IL(p!G%qg~0}yy88E)k6RsaAuQ3UP) diff --git a/Backend/src/notifications/__pycache__/__init__.cpython-312.pyc b/Backend/src/notifications/__pycache__/__init__.cpython-312.pyc index 3e3cf66ba62beb0c32838c37bb3da23dfb1f3352..efe089e8665fc77901932f6271e61d40bda97580 100644 GIT binary patch delta 19 ZcmZ3+xQvneG%qg~0}$MDFrLUg8vrhg1kC^d delta 19 ZcmZ3+xQvneG%qg~0}x!9sWXv#HUKaP1sMPU diff --git a/Backend/src/notifications/models/__init__.py b/Backend/src/notifications/models/__init__.py index e69de29b..c237c30e 100644 --- a/Backend/src/notifications/models/__init__.py +++ b/Backend/src/notifications/models/__init__.py @@ -0,0 +1,24 @@ +from .notification import Notification +from .email_campaign import Campaign as EmailCampaign +from .team_chat import ( + TeamChannel, + TeamMessage, + TeamMessageReadReceipt, + UserPresence, + ChannelType, + MessagePriority, + team_channel_members +) + +__all__ = [ + 'Notification', + 'EmailCampaign', + 'TeamChannel', + 'TeamMessage', + 'TeamMessageReadReceipt', + 'UserPresence', + 'ChannelType', + 'MessagePriority', + 'team_channel_members' +] + diff --git a/Backend/src/notifications/models/__pycache__/__init__.cpython-312.pyc b/Backend/src/notifications/models/__pycache__/__init__.cpython-312.pyc index b3198eee8b3fb890fa9d7d1cb39915990ddd966c..c12826a1359a00ce0b380653c222bef59e05c8fb 100644 GIT binary patch literal 574 zcma)(y>1jS5XbGkkKMi93lcif(;#gDE)X4}NI*&fQ51#7jb(O+jdlK5*+$|@3Z8+U z0*Png4J@TVsnR8+h?EMO+mlk_;-{JM%ztL=U(4kJ#q;CqbMYG^bdj9h$wuSmFdE-b zhdL~g!W83VXEIY0I{jx)zdL|;$UID_DL#S{QR-38$Q delta 20 acmbQAJwKcKG%qg~0}$jrFxtpH#S{QSqy`iK diff --git a/Backend/src/notifications/models/__pycache__/notification.cpython-312.pyc b/Backend/src/notifications/models/__pycache__/notification.cpython-312.pyc index 806278dac9d36396eafc6b47f1f4740029660be6..3e05570e2c39533f7a7f1a64b96e5cf2a0ccce3a 100644 GIT binary patch delta 20 acmdmBvB84-G%qg~0}$MDFy6?mDgyvKKm`>5 delta 20 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" + + +class TeamMessage(Base): + """ + Messages within team channels. + """ + __tablename__ = 'team_messages' + + id = Column(Integer, primary_key=True, index=True, autoincrement=True) + channel_id = Column(Integer, ForeignKey('team_channels.id'), nullable=False, index=True) + sender_id = Column(Integer, ForeignKey('users.id'), nullable=False, index=True) + + # Message content + content = Column(Text, nullable=False) + priority = Column(Enum(MessagePriority), default=MessagePriority.normal, nullable=False) + + # For replies/threads + reply_to_id = Column(Integer, ForeignKey('team_messages.id'), nullable=True) + + # Message metadata + is_edited = Column(Boolean, default=False, nullable=False) + edited_at = Column(DateTime, nullable=True) + is_deleted = Column(Boolean, default=False, nullable=False) + deleted_at = Column(DateTime, nullable=True) + + # For task/booking references + reference_type = Column(String(50), nullable=True) # 'booking', 'task', 'room', etc. + reference_id = Column(Integer, nullable=True) + + # Timestamps + created_at = Column(DateTime, default=datetime.utcnow, nullable=False) + + # Relationships + channel = relationship('TeamChannel', back_populates='messages') + sender = relationship('User', foreign_keys=[sender_id]) + reply_to = relationship('TeamMessage', remote_side=[id], backref='replies') + read_receipts = relationship('TeamMessageReadReceipt', back_populates='message', cascade='all, delete-orphan') + + def __repr__(self): + return f"" + + +class TeamMessageReadReceipt(Base): + """ + Track which users have read which messages. + """ + __tablename__ = 'team_message_read_receipts' + + id = Column(Integer, primary_key=True, index=True, autoincrement=True) + message_id = Column(Integer, ForeignKey('team_messages.id'), nullable=False, index=True) + user_id = Column(Integer, ForeignKey('users.id'), nullable=False, index=True) + read_at = Column(DateTime, default=datetime.utcnow, nullable=False) + + # Relationships + message = relationship('TeamMessage', back_populates='read_receipts') + user = relationship('User') + + def __repr__(self): + return f"" + + +class UserPresence(Base): + """ + Track user online/offline status for real-time features. + """ + __tablename__ = 'user_presence' + + id = Column(Integer, primary_key=True, index=True, autoincrement=True) + user_id = Column(Integer, ForeignKey('users.id'), unique=True, nullable=False, index=True) + + # Status + status = Column(String(20), default='offline', nullable=False) # online, away, busy, offline + custom_status = Column(String(100), nullable=True) # Custom status message + + # Activity tracking + last_seen_at = Column(DateTime, default=datetime.utcnow, nullable=False) + last_active_at = Column(DateTime, default=datetime.utcnow, nullable=False) + + # Device info + device_type = Column(String(50), nullable=True) # web, mobile, desktop + + # Relationships + user = relationship('User', backref='presence') + + def __repr__(self): + return f"" + diff --git a/Backend/src/notifications/routes/__pycache__/__init__.cpython-312.pyc b/Backend/src/notifications/routes/__pycache__/__init__.cpython-312.pyc index c42d055037c3c3ab3fc6bf00d7c5ec0c7dd69653..68d76c95130edb809a1614ab4de6afcb42d11ece 100644 GIT binary patch delta 19 ZcmZ3>xR#OoG%qg~0}$MDFrLW02mmjR1mXYy delta 19 ZcmZ3>xR#OoG%qg~0}x!9sWXv#5dbj@1ug&p diff --git a/Backend/src/notifications/routes/__pycache__/chat_routes.cpython-312.pyc b/Backend/src/notifications/routes/__pycache__/chat_routes.cpython-312.pyc index c4d8e4fd04d468d80c4ca3d8efb19bbb9ce1474f..ec20bb589c4d79ce6ba4b56fc1763604ff4a4162 100644 GIT binary patch delta 22 ccmZ4WmvPl!M()$Ryj%=GaLd7XBlr9|09}FyaR2}S delta 22 bcmZ4WmvPl!M()$Ryj%<*P@un&dwv}NSeORG diff --git a/Backend/src/notifications/routes/__pycache__/email_campaign_routes.cpython-312.pyc b/Backend/src/notifications/routes/__pycache__/email_campaign_routes.cpython-312.pyc index 7c6e0a3b9cdd0d2907a116fb759d503917730238..2c7c8e8217a724ad22024000bd936fcbd18b6425 100644 GIT binary patch delta 22 ccmex5i|OkuChpU`yj%=GaLd7XBX?FW09rZ+9RL6T delta 22 ccmex5i|OkuChpU`yj%=GF!_PeM((U$09*tIbpQYW diff --git a/Backend/src/notifications/routes/__pycache__/notification_routes.cpython-312.pyc b/Backend/src/notifications/routes/__pycache__/notification_routes.cpython-312.pyc index ba0d92487570643745887473273a19f91ff79223..c8cf2753d0302a2e0f6a1f2f8cde68a256d949b0 100644 GIT binary patch delta 22 ccmaENmGRwGM()$Ryj%=GaLd7XBlqJh0Aj)i*#H0l delta 22 ccmaENmGRwGM()$Ryj%=G@T5?GBlqJh0Av~n5C8xG diff --git a/Backend/src/notifications/routes/__pycache__/team_chat_routes.cpython-312.pyc b/Backend/src/notifications/routes/__pycache__/team_chat_routes.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..bcc6f5c6086da75bfb39ba5d90a362b9a8eade19 GIT binary patch literal 44123 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 literal 0 HcmV?d00001 diff --git a/Backend/src/notifications/routes/team_chat_routes.py b/Backend/src/notifications/routes/team_chat_routes.py new file mode 100644 index 00000000..97ef9763 --- /dev/null +++ b/Backend/src/notifications/routes/team_chat_routes.py @@ -0,0 +1,857 @@ +""" +Internal Team Chat Routes for enterprise communication. +Enables messaging between admin, staff, and housekeeping users. +""" +from fastapi import APIRouter, Depends, HTTPException, status, WebSocket, WebSocketDisconnect, Query +from sqlalchemy.orm import Session, joinedload +from sqlalchemy import and_, or_, desc, func +from typing import List, Optional +from datetime import datetime +from pydantic import BaseModel, Field +import json + +from ...shared.config.database import get_db +from ...shared.config.logging_config import get_logger +from ...security.middleware.auth import get_current_user, authorize_roles +from ...auth.models.user import User +from ...auth.models.role import Role +from ..models.team_chat import ( + TeamChannel, TeamMessage, TeamMessageReadReceipt, UserPresence, + ChannelType, MessagePriority, team_channel_members +) + +logger = get_logger(__name__) +router = APIRouter(prefix='/team-chat', tags=['team-chat']) + + +# ============== Pydantic Schemas ============== + +class ChannelCreate(BaseModel): + name: Optional[str] = None + description: Optional[str] = None + channel_type: ChannelType = ChannelType.group + department: Optional[str] = None + is_private: bool = False + member_ids: List[int] = Field(default_factory=list) + + +class ChannelUpdate(BaseModel): + name: Optional[str] = None + description: Optional[str] = None + is_private: Optional[bool] = None + + +class MessageCreate(BaseModel): + content: str = Field(..., min_length=1, max_length=5000) + priority: MessagePriority = MessagePriority.normal + reply_to_id: Optional[int] = None + reference_type: Optional[str] = None + reference_id: Optional[int] = None + + +class MessageUpdate(BaseModel): + content: str = Field(..., min_length=1, max_length=5000) + + +class DirectMessageCreate(BaseModel): + recipient_id: int + content: str = Field(..., min_length=1, max_length=5000) + priority: MessagePriority = MessagePriority.normal + + +class PresenceUpdate(BaseModel): + status: str = Field(..., pattern='^(online|away|busy|offline)$') + custom_status: Optional[str] = Field(None, max_length=100) + + +# ============== WebSocket Manager ============== + +class TeamChatManager: + """Manages WebSocket connections for team chat.""" + + def __init__(self): + # Map of channel_id -> list of (user_id, websocket) + self.channel_connections: dict[int, list[tuple[int, WebSocket]]] = {} + # Map of user_id -> websocket for direct notifications + self.user_connections: dict[int, WebSocket] = {} + + async def connect(self, websocket: WebSocket, user_id: int, channel_id: Optional[int] = None): + await websocket.accept() + self.user_connections[user_id] = websocket + if channel_id: + if channel_id not in self.channel_connections: + self.channel_connections[channel_id] = [] + self.channel_connections[channel_id].append((user_id, websocket)) + + def disconnect(self, user_id: int, channel_id: Optional[int] = None): + if user_id in self.user_connections: + del self.user_connections[user_id] + if channel_id and channel_id in self.channel_connections: + self.channel_connections[channel_id] = [ + (uid, ws) for uid, ws in self.channel_connections[channel_id] + if uid != user_id + ] + + async def broadcast_to_channel(self, channel_id: int, message: dict, exclude_user_id: Optional[int] = None): + """Send message to all users in a channel.""" + if channel_id not in self.channel_connections: + return + + disconnected = [] + for user_id, websocket in self.channel_connections[channel_id]: + if exclude_user_id and user_id == exclude_user_id: + continue + try: + await websocket.send_json(message) + except Exception as e: + logger.error(f"Error sending to user {user_id}: {e}") + disconnected.append(user_id) + + # Clean up disconnected + for uid in disconnected: + self.disconnect(uid, channel_id) + + async def send_to_user(self, user_id: int, message: dict): + """Send message directly to a user.""" + if user_id in self.user_connections: + try: + await self.user_connections[user_id].send_json(message) + except Exception as e: + logger.error(f"Error sending to user {user_id}: {e}") + self.disconnect(user_id) + + async def broadcast_to_users(self, user_ids: List[int], message: dict): + """Send message to multiple users.""" + for user_id in user_ids: + await self.send_to_user(user_id, message) + + +manager = TeamChatManager() + + +# ============== Helper Functions ============== + +def get_or_create_direct_channel(db: Session, user1_id: int, user2_id: int) -> TeamChannel: + """Get or create a direct message channel between two users.""" + # Look for existing direct channel + existing = db.query(TeamChannel).filter( + TeamChannel.channel_type == ChannelType.direct, + TeamChannel.members.any(User.id == user1_id), + TeamChannel.members.any(User.id == user2_id) + ).first() + + if existing: + return existing + + # Create new direct channel + user1 = db.query(User).get(user1_id) + user2 = db.query(User).get(user2_id) + + if not user1 or not user2: + raise HTTPException(status_code=404, detail="User not found") + + channel = TeamChannel( + channel_type=ChannelType.direct, + created_by=user1_id, + is_private=True + ) + channel.members = [user1, user2] + db.add(channel) + db.commit() + db.refresh(channel) + return channel + + +def serialize_channel(channel: TeamChannel, current_user_id: int, unread_count: int = 0) -> dict: + """Serialize channel for API response.""" + other_members = [m for m in channel.members if m.id != current_user_id] + + return { + "id": channel.id, + "name": channel.name if channel.channel_type != ChannelType.direct else ( + other_members[0].full_name if other_members else "Direct Message" + ), + "description": channel.description, + "channel_type": channel.channel_type.value, + "department": channel.department, + "is_private": channel.is_private, + "is_active": channel.is_active, + "created_at": channel.created_at.isoformat(), + "last_message_at": channel.last_message_at.isoformat() if channel.last_message_at else None, + "unread_count": unread_count, + "members": [ + { + "id": m.id, + "full_name": m.full_name, + "email": m.email, + "avatar_url": m.avatar_url, + "role": m.role.name if m.role else None + } + for m in channel.members + ], + "last_message": serialize_message(channel.messages[-1]) if channel.messages else None + } + + +def serialize_message(message: TeamMessage) -> dict: + """Serialize message for API response.""" + return { + "id": message.id, + "channel_id": message.channel_id, + "sender_id": message.sender_id, + "sender": { + "id": message.sender.id, + "full_name": message.sender.full_name, + "avatar_url": message.sender.avatar_url, + "role": message.sender.role.name if message.sender.role else None + } if message.sender else None, + "content": message.content if not message.is_deleted else "[Message deleted]", + "priority": message.priority.value, + "reply_to_id": message.reply_to_id, + "reference_type": message.reference_type, + "reference_id": message.reference_id, + "is_edited": message.is_edited, + "is_deleted": message.is_deleted, + "created_at": message.created_at.isoformat(), + "edited_at": message.edited_at.isoformat() if message.edited_at else None + } + + +# ============== Channel Endpoints ============== + +@router.get('/channels') +async def get_my_channels( + current_user: User = Depends(authorize_roles('admin', 'staff', 'housekeeping')), + db: Session = Depends(get_db) +): + """Get all channels the current user is a member of.""" + channels = db.query(TeamChannel).options( + joinedload(TeamChannel.members), + joinedload(TeamChannel.messages).joinedload(TeamMessage.sender) + ).filter( + TeamChannel.is_active == True, + TeamChannel.members.any(User.id == current_user.id) + ).order_by(desc(TeamChannel.last_message_at)).all() + + result = [] + for channel in channels: + # Count unread messages + last_read = db.execute( + team_channel_members.select().where( + and_( + team_channel_members.c.channel_id == channel.id, + team_channel_members.c.user_id == current_user.id + ) + ) + ).first() + + unread_count = 0 + if last_read and last_read.last_read_at: + unread_count = db.query(func.count(TeamMessage.id)).filter( + TeamMessage.channel_id == channel.id, + TeamMessage.created_at > last_read.last_read_at, + TeamMessage.sender_id != current_user.id, + TeamMessage.is_deleted == False + ).scalar() + else: + unread_count = db.query(func.count(TeamMessage.id)).filter( + TeamMessage.channel_id == channel.id, + TeamMessage.sender_id != current_user.id, + TeamMessage.is_deleted == False + ).scalar() + + result.append(serialize_channel(channel, current_user.id, unread_count)) + + return {"success": True, "data": result} + + +@router.post('/channels') +async def create_channel( + channel_data: ChannelCreate, + current_user: User = Depends(authorize_roles('admin', 'staff', 'housekeeping')), + db: Session = Depends(get_db) +): + """Create a new channel.""" + # Only admins can create department or announcement channels + if channel_data.channel_type in [ChannelType.department, ChannelType.announcement]: + if current_user.role.name != 'admin': + raise HTTPException( + status_code=status.HTTP_403_FORBIDDEN, + detail="Only admins can create department or announcement channels" + ) + + channel = TeamChannel( + name=channel_data.name, + description=channel_data.description, + channel_type=channel_data.channel_type, + department=channel_data.department, + is_private=channel_data.is_private, + created_by=current_user.id + ) + + # Add creator as member + channel.members.append(current_user) + + # Add other members + if channel_data.member_ids: + members = db.query(User).filter(User.id.in_(channel_data.member_ids)).all() + for member in members: + if member not in channel.members: + channel.members.append(member) + + db.add(channel) + db.commit() + db.refresh(channel) + + logger.info(f"Channel created: {channel.id} by user {current_user.id}") + + return {"success": True, "data": serialize_channel(channel, current_user.id)} + + +@router.get('/channels/{channel_id}') +async def get_channel( + channel_id: int, + current_user: User = Depends(authorize_roles('admin', 'staff', 'housekeeping')), + db: Session = Depends(get_db) +): + """Get channel details.""" + channel = db.query(TeamChannel).options( + joinedload(TeamChannel.members) + ).filter( + TeamChannel.id == channel_id, + TeamChannel.is_active == True + ).first() + + if not channel: + raise HTTPException(status_code=404, detail="Channel not found") + + # Check membership + if current_user not in channel.members and current_user.role.name != 'admin': + raise HTTPException(status_code=403, detail="Not a member of this channel") + + return {"success": True, "data": serialize_channel(channel, current_user.id)} + + +@router.put('/channels/{channel_id}') +async def update_channel( + channel_id: int, + channel_data: ChannelUpdate, + current_user: User = Depends(authorize_roles('admin', 'staff')), + db: Session = Depends(get_db) +): + """Update channel settings.""" + channel = db.query(TeamChannel).filter(TeamChannel.id == channel_id).first() + + if not channel: + raise HTTPException(status_code=404, detail="Channel not found") + + # Only creator or admin can update + if channel.created_by != current_user.id and current_user.role.name != 'admin': + raise HTTPException(status_code=403, detail="Not authorized to update this channel") + + if channel_data.name is not None: + channel.name = channel_data.name + if channel_data.description is not None: + channel.description = channel_data.description + if channel_data.is_private is not None: + channel.is_private = channel_data.is_private + + db.commit() + db.refresh(channel) + + return {"success": True, "data": serialize_channel(channel, current_user.id)} + + +@router.post('/channels/{channel_id}/members') +async def add_channel_members( + channel_id: int, + member_ids: List[int], + current_user: User = Depends(authorize_roles('admin', 'staff')), + db: Session = Depends(get_db) +): + """Add members to a channel.""" + channel = db.query(TeamChannel).options( + joinedload(TeamChannel.members) + ).filter(TeamChannel.id == channel_id).first() + + if not channel: + raise HTTPException(status_code=404, detail="Channel not found") + + # Check authorization + if channel.created_by != current_user.id and current_user.role.name != 'admin': + raise HTTPException(status_code=403, detail="Not authorized") + + new_members = db.query(User).filter(User.id.in_(member_ids)).all() + for member in new_members: + if member not in channel.members: + channel.members.append(member) + + db.commit() + + return {"success": True, "message": f"Added {len(new_members)} members"} + + +@router.delete('/channels/{channel_id}/members/{user_id}') +async def remove_channel_member( + channel_id: int, + user_id: int, + current_user: User = Depends(authorize_roles('admin', 'staff')), + db: Session = Depends(get_db) +): + """Remove a member from a channel.""" + channel = db.query(TeamChannel).options( + joinedload(TeamChannel.members) + ).filter(TeamChannel.id == channel_id).first() + + if not channel: + raise HTTPException(status_code=404, detail="Channel not found") + + # Check authorization + if channel.created_by != current_user.id and current_user.role.name != 'admin': + if user_id != current_user.id: # Users can leave themselves + raise HTTPException(status_code=403, detail="Not authorized") + + member_to_remove = next((m for m in channel.members if m.id == user_id), None) + if member_to_remove: + channel.members.remove(member_to_remove) + db.commit() + + return {"success": True, "message": "Member removed"} + + +# ============== Message Endpoints ============== + +@router.get('/channels/{channel_id}/messages') +async def get_channel_messages( + channel_id: int, + limit: int = Query(50, ge=1, le=100), + before_id: Optional[int] = None, + current_user: User = Depends(authorize_roles('admin', 'staff', 'housekeeping')), + db: Session = Depends(get_db) +): + """Get messages from a channel.""" + channel = db.query(TeamChannel).filter( + TeamChannel.id == channel_id, + TeamChannel.members.any(User.id == current_user.id) + ).first() + + if not channel: + raise HTTPException(status_code=404, detail="Channel not found or not a member") + + query = db.query(TeamMessage).options( + joinedload(TeamMessage.sender) + ).filter(TeamMessage.channel_id == channel_id) + + if before_id: + query = query.filter(TeamMessage.id < before_id) + + messages = query.order_by(desc(TeamMessage.created_at)).limit(limit).all() + + # Mark as read + db.execute( + team_channel_members.update().where( + and_( + team_channel_members.c.channel_id == channel_id, + team_channel_members.c.user_id == current_user.id + ) + ).values(last_read_at=datetime.utcnow()) + ) + db.commit() + + return { + "success": True, + "data": [serialize_message(m) for m in reversed(messages)] + } + + +@router.post('/channels/{channel_id}/messages') +async def send_message( + channel_id: int, + message_data: MessageCreate, + current_user: User = Depends(authorize_roles('admin', 'staff', 'housekeeping')), + db: Session = Depends(get_db) +): + """Send a message to a channel.""" + channel = db.query(TeamChannel).options( + joinedload(TeamChannel.members) + ).filter( + TeamChannel.id == channel_id, + TeamChannel.members.any(User.id == current_user.id) + ).first() + + if not channel: + raise HTTPException(status_code=404, detail="Channel not found or not a member") + + # Check if announcement channel (only admins can post) + if channel.channel_type == ChannelType.announcement and current_user.role.name != 'admin': + raise HTTPException(status_code=403, detail="Only admins can post in announcement channels") + + message = TeamMessage( + channel_id=channel_id, + sender_id=current_user.id, + content=message_data.content, + priority=message_data.priority, + reply_to_id=message_data.reply_to_id, + reference_type=message_data.reference_type, + reference_id=message_data.reference_id + ) + + db.add(message) + channel.last_message_at = datetime.utcnow() + db.commit() + db.refresh(message) + + # Broadcast to channel members via WebSocket + serialized = serialize_message(message) + await manager.broadcast_to_channel(channel_id, { + "type": "new_message", + "data": serialized + }, exclude_user_id=current_user.id) + + # Also notify users not connected to channel + member_ids = [m.id for m in channel.members if m.id != current_user.id] + await manager.broadcast_to_users(member_ids, { + "type": "new_message_notification", + "data": { + "channel_id": channel_id, + "channel_name": channel.name, + "message": serialized + } + }) + + return {"success": True, "data": serialized} + + +@router.put('/messages/{message_id}') +async def edit_message( + message_id: int, + message_data: MessageUpdate, + current_user: User = Depends(authorize_roles('admin', 'staff', 'housekeeping')), + db: Session = Depends(get_db) +): + """Edit a message.""" + message = db.query(TeamMessage).filter(TeamMessage.id == message_id).first() + + if not message: + raise HTTPException(status_code=404, detail="Message not found") + + if message.sender_id != current_user.id and current_user.role.name != 'admin': + raise HTTPException(status_code=403, detail="Not authorized to edit this message") + + message.content = message_data.content + message.is_edited = True + message.edited_at = datetime.utcnow() + + db.commit() + db.refresh(message) + + # Broadcast update + await manager.broadcast_to_channel(message.channel_id, { + "type": "message_edited", + "data": serialize_message(message) + }) + + return {"success": True, "data": serialize_message(message)} + + +@router.delete('/messages/{message_id}') +async def delete_message( + message_id: int, + current_user: User = Depends(authorize_roles('admin', 'staff', 'housekeeping')), + db: Session = Depends(get_db) +): + """Delete a message (soft delete).""" + message = db.query(TeamMessage).filter(TeamMessage.id == message_id).first() + + if not message: + raise HTTPException(status_code=404, detail="Message not found") + + if message.sender_id != current_user.id and current_user.role.name != 'admin': + raise HTTPException(status_code=403, detail="Not authorized to delete this message") + + message.is_deleted = True + message.deleted_at = datetime.utcnow() + + db.commit() + + # Broadcast deletion + await manager.broadcast_to_channel(message.channel_id, { + "type": "message_deleted", + "data": {"id": message_id, "channel_id": message.channel_id} + }) + + return {"success": True, "message": "Message deleted"} + + +# ============== Direct Message Endpoints ============== + +@router.post('/direct') +async def send_direct_message( + dm_data: DirectMessageCreate, + current_user: User = Depends(authorize_roles('admin', 'staff', 'housekeeping')), + db: Session = Depends(get_db) +): + """Send a direct message to another user.""" + # Verify recipient exists and is staff/admin/housekeeping + recipient = db.query(User).options( + joinedload(User.role) + ).filter(User.id == dm_data.recipient_id).first() + + if not recipient: + raise HTTPException(status_code=404, detail="Recipient not found") + + if recipient.role.name not in ['admin', 'staff', 'housekeeping']: + raise HTTPException(status_code=400, detail="Can only message staff members") + + # Get or create direct channel + channel = get_or_create_direct_channel(db, current_user.id, dm_data.recipient_id) + + # Send message + message = TeamMessage( + channel_id=channel.id, + sender_id=current_user.id, + content=dm_data.content, + priority=dm_data.priority + ) + + db.add(message) + channel.last_message_at = datetime.utcnow() + db.commit() + db.refresh(message) + + serialized = serialize_message(message) + + # Notify recipient + await manager.send_to_user(dm_data.recipient_id, { + "type": "new_direct_message", + "data": { + "channel_id": channel.id, + "sender": { + "id": current_user.id, + "full_name": current_user.full_name, + "avatar_url": current_user.avatar_url + }, + "message": serialized + } + }) + + return {"success": True, "data": {"channel_id": channel.id, "message": serialized}} + + +# ============== User/Presence Endpoints ============== + +@router.get('/users') +async def get_team_users( + role: Optional[str] = None, + current_user: User = Depends(authorize_roles('admin', 'staff', 'housekeeping')), + db: Session = Depends(get_db) +): + """Get all team users (admin, staff, housekeeping) for messaging.""" + query = db.query(User).options( + joinedload(User.role), + joinedload(User.presence) + ).join(Role).filter( + Role.name.in_(['admin', 'staff', 'housekeeping']), + User.is_active == True, + User.id != current_user.id + ) + + if role: + query = query.filter(Role.name == role) + + users = query.order_by(User.full_name).all() + + return { + "success": True, + "data": [ + { + "id": u.id, + "full_name": u.full_name, + "email": u.email, + "avatar_url": u.avatar_url, + "role": u.role.name if u.role else None, + "status": u.presence.status if u.presence else 'offline', + "last_seen": u.presence.last_seen_at.isoformat() if u.presence else None + } + for u in users + ] + } + + +@router.put('/presence') +async def update_presence( + presence_data: PresenceUpdate, + current_user: User = Depends(authorize_roles('admin', 'staff', 'housekeeping')), + db: Session = Depends(get_db) +): + """Update user presence status.""" + presence = db.query(UserPresence).filter(UserPresence.user_id == current_user.id).first() + + if not presence: + presence = UserPresence(user_id=current_user.id) + db.add(presence) + + presence.status = presence_data.status + presence.custom_status = presence_data.custom_status + presence.last_seen_at = datetime.utcnow() + presence.last_active_at = datetime.utcnow() + + db.commit() + + return {"success": True, "message": "Presence updated"} + + +# ============== Department Channels ============== + +@router.post('/departments/init') +async def initialize_department_channels( + current_user: User = Depends(authorize_roles('admin')), + db: Session = Depends(get_db) +): + """Initialize default department channels (admin only).""" + departments = [ + {"name": "Housekeeping Team", "department": "housekeeping", "description": "Channel for housekeeping coordination"}, + {"name": "Front Desk", "department": "front-desk", "description": "Front desk staff communication"}, + {"name": "Management", "department": "management", "description": "Management team discussions"}, + {"name": "Announcements", "department": "all", "description": "Hotel-wide announcements"} + ] + + created = [] + for dept in departments: + existing = db.query(TeamChannel).filter( + TeamChannel.department == dept["department"], + TeamChannel.channel_type == ChannelType.department + ).first() + + if not existing: + channel = TeamChannel( + name=dept["name"], + description=dept["description"], + channel_type=ChannelType.department if dept["department"] != "all" else ChannelType.announcement, + department=dept["department"], + created_by=current_user.id, + is_private=False + ) + db.add(channel) + created.append(dept["name"]) + + db.commit() + + return {"success": True, "message": f"Created channels: {', '.join(created)}" if created else "All channels already exist"} + + +@router.post('/departments/{department}/join') +async def join_department_channel( + department: str, + current_user: User = Depends(authorize_roles('admin', 'staff', 'housekeeping')), + db: Session = Depends(get_db) +): + """Join a department channel.""" + channel = db.query(TeamChannel).options( + joinedload(TeamChannel.members) + ).filter( + TeamChannel.department == department, + TeamChannel.channel_type.in_([ChannelType.department, ChannelType.announcement]) + ).first() + + if not channel: + raise HTTPException(status_code=404, detail="Department channel not found") + + if current_user not in channel.members: + channel.members.append(current_user) + db.commit() + + return {"success": True, "data": serialize_channel(channel, current_user.id)} + + +# ============== WebSocket Endpoint ============== + +@router.websocket('/ws') +async def websocket_endpoint( + websocket: WebSocket, + db: Session = Depends(get_db) +): + """WebSocket endpoint for real-time team chat.""" + user_id = None + try: + await websocket.accept() + + # Wait for authentication message + auth_data = await websocket.receive_json() + if auth_data.get("type") != "auth": + await websocket.close(code=4001, reason="Authentication required") + return + + # In production, verify JWT token here + user_id = auth_data.get("user_id") + if not user_id: + await websocket.close(code=4001, reason="Invalid authentication") + return + + # Verify user exists and has correct role + user = db.query(User).options(joinedload(User.role)).filter(User.id == user_id).first() + if not user or user.role.name not in ['admin', 'staff', 'housekeeping']: + await websocket.close(code=4003, reason="Unauthorized") + return + + # Update presence + presence = db.query(UserPresence).filter(UserPresence.user_id == user_id).first() + if not presence: + presence = UserPresence(user_id=user_id, status='online') + db.add(presence) + else: + presence.status = 'online' + presence.last_seen_at = datetime.utcnow() + db.commit() + + # Store connection + manager.user_connections[user_id] = websocket + + await websocket.send_json({"type": "connected", "user_id": user_id}) + + # Listen for messages + while True: + data = await websocket.receive_json() + msg_type = data.get("type") + + if msg_type == "join_channel": + channel_id = data.get("channel_id") + if channel_id not in manager.channel_connections: + manager.channel_connections[channel_id] = [] + manager.channel_connections[channel_id].append((user_id, websocket)) + await websocket.send_json({"type": "joined_channel", "channel_id": channel_id}) + + elif msg_type == "leave_channel": + channel_id = data.get("channel_id") + manager.disconnect(user_id, channel_id) + await websocket.send_json({"type": "left_channel", "channel_id": channel_id}) + + elif msg_type == "typing": + channel_id = data.get("channel_id") + await manager.broadcast_to_channel(channel_id, { + "type": "user_typing", + "data": {"user_id": user_id, "channel_id": channel_id} + }, exclude_user_id=user_id) + + elif msg_type == "ping": + await websocket.send_json({"type": "pong"}) + # Update presence + presence = db.query(UserPresence).filter(UserPresence.user_id == user_id).first() + if presence: + presence.last_active_at = datetime.utcnow() + db.commit() + + except WebSocketDisconnect: + logger.info(f"User {user_id} disconnected from team chat") + except Exception as e: + logger.error(f"WebSocket error: {e}") + finally: + if user_id: + manager.disconnect(user_id) + # Update presence to offline + presence = db.query(UserPresence).filter(UserPresence.user_id == user_id).first() + if presence: + presence.status = 'offline' + presence.last_seen_at = datetime.utcnow() + db.commit() + diff --git a/Backend/src/notifications/services/__pycache__/__init__.cpython-312.pyc b/Backend/src/notifications/services/__pycache__/__init__.cpython-312.pyc index ad2ab781f281345b3319ade1bc123124e85f02b1..857b918d9292262218f6826aac275c10866161d9 100644 GIT binary patch delta 19 ZcmZ3_xSo;wG%qg~0}$MDFrLW01OPAC1n2+& delta 19 ZcmZ3_xSo;wG%qg~0}x!9sWXv#2>>xw1vCHv diff --git a/Backend/src/notifications/services/__pycache__/email_campaign_service.cpython-312.pyc b/Backend/src/notifications/services/__pycache__/email_campaign_service.cpython-312.pyc index f4582c0b5bbb87256bcf28a73a0ea1b9598f0c0b..fc03af490667746c1d7b5f2d8b09e7908377714f 100644 GIT binary patch delta 22 ccmbQak8$QcM()$Ryj%=GaLd7XBR5|>08j4*ApigX delta 22 ccmbQak8$QcM()$Ryj%=GkoUl7BR5|>08q9DQ~&?~ diff --git a/Backend/src/notifications/services/__pycache__/notification_service.cpython-312.pyc b/Backend/src/notifications/services/__pycache__/notification_service.cpython-312.pyc index f1ce042f06d14496e3d926a72ede158f07e7e9f2..5cd0ffc3e338d6eeb0e2df3a176d64e883f6a9fa 100644 GIT binary patch delta 22 ccmaFY%J{C8k^3|+FBbz4+;TA9$o<#}09I-T5dZ)H delta 22 ccmaFY%J{C8k^3|+FBbz4_|DSV$o<#}091$u*8l(j diff --git a/Backend/src/payments/__pycache__/__init__.cpython-312.pyc b/Backend/src/payments/__pycache__/__init__.cpython-312.pyc index b93d10e4454f7f3cfd10840f927f9729db42c35e..0bbff8ff65d055813103a1f633e6346b2a8e6733 100644 GIT binary patch delta 19 ZcmZ3;xR8$Oiy89|Z;g diff --git a/Backend/src/payments/models/__pycache__/chart_of_accounts.cpython-312.pyc b/Backend/src/payments/models/__pycache__/chart_of_accounts.cpython-312.pyc index 8badf297dfa4afb87ddf285ebf7fcf55d5950e41..784fd0bba7bdad8cdfb96fdca8503c83c29d6483 100644 GIT binary patch delta 20 acmew={#Bg&G%qg~0}$MDFy6@hiW>k!Qw9+L delta 20 acmew={#Bg&G%qg~0}!~x8E)i$#SH*I;{}%h diff --git a/Backend/src/payments/models/__pycache__/financial_approval.cpython-312.pyc b/Backend/src/payments/models/__pycache__/financial_approval.cpython-312.pyc index 721646904af9f7168779f96b280e350ca4d3a6d0..1d94df36d711e8213979fa81c67fbe16783c69ca 100644 GIT binary patch delta 20 acmZ3fuu_5hG%qg~0}$MDFy6>5CjbC9yadDm delta 20 acmZ3fuu_5hG%qg~0}yy88E)j36951-l>}7) diff --git a/Backend/src/payments/models/__pycache__/financial_audit_trail.cpython-312.pyc b/Backend/src/payments/models/__pycache__/financial_audit_trail.cpython-312.pyc index da17d16a98d703791e4b3bd63a56d15225145621..bdc12a582a86ba02e2554bdbb23f5bd9a8e87069 100644 GIT binary patch delta 20 acmZpaYLwzW&CAQh00g%jj5l(B;{gCNpanbt delta 20 acmZpaYLwzW&CAQh00hUP4L5Rs;{gCNtOY>; diff --git a/Backend/src/payments/models/__pycache__/fiscal_period.cpython-312.pyc b/Backend/src/payments/models/__pycache__/fiscal_period.cpython-312.pyc index f1363ced3819c4a71870c41e7fc37533a626d980..b084c8d81e3d6bdaf18edc4bf1e1580a76e4a41f 100644 GIT binary patch delta 20 acmdlYv_**fG%qg~0}$MDFy6?m$q4{Abp*ly delta 20 acmdlYv_**fG%qg~0}!~x8E)j({#Ts)G%qg~0}$MDFy6@hi5mb!lLjdO delta 20 acmew>{#Ts)G%qg~0}!~)(%H!Ui5mbyfCcCP diff --git a/Backend/src/payments/models/__pycache__/reconciliation_exception.cpython-312.pyc b/Backend/src/payments/models/__pycache__/reconciliation_exception.cpython-312.pyc index 4b7440f5e9cbc22df560210ea9999cb0908981ce..e33e106a63ab4d2809288e818e8e91764277cfbe 100644 GIT binary patch delta 20 acmew*`%9MlG%qg~0}$MDFy6@ho(}*-_69Ei delta 20 acmew*`%9MlG%qg~0}yy88E)i$&j$cO&jr8$ diff --git a/Backend/src/payments/routes/__pycache__/__init__.cpython-312.pyc b/Backend/src/payments/routes/__pycache__/__init__.cpython-312.pyc index c0332186192c3027448e2caf13f7a67ccb24a122..4248664759e8f802550bbf5b71e34886f981d37b 100644 GIT binary patch delta 19 ZcmZ3%xPp=UG%qg~0}$MDFrLUg7XU8R1k(Tj delta 19 ZcmZ3%xPp=UG%qg~0}$+=sWXv#E&wmo1quKF diff --git a/Backend/src/payments/routes/__pycache__/accountant_security_routes.cpython-312.pyc b/Backend/src/payments/routes/__pycache__/accountant_security_routes.cpython-312.pyc index df825680d94a895509d3e1b8b584d4ed8b12e148..e27141bdc928a6010d38b8c4676c93219d953060 100644 GIT binary patch delta 20 acmeyF^fQV3G%qg~0}$MDFy6?WX9xgIr3P65 delta 20 acmeyF^fQV3G%qg~0}yy88E)jxGXwxieg*0P diff --git a/Backend/src/payments/routes/__pycache__/approval_routes.cpython-312.pyc b/Backend/src/payments/routes/__pycache__/approval_routes.cpython-312.pyc index 4ea69c237ba9899f671f77666f89ab7603c26a83..df5164602290b41efecb9f831204db4320770b77 100644 GIT binary patch delta 22 ccmew{pYg|hM()$Ryj%=GaLd7XBllZ>09+dfZ~y=R delta 22 ccmew{pYg|hM()$Ryj%=GuqM@TBllZ>09&mGWdHyG diff --git a/Backend/src/payments/routes/__pycache__/audit_trail_routes.cpython-312.pyc b/Backend/src/payments/routes/__pycache__/audit_trail_routes.cpython-312.pyc index 495abc10164bde6f418eb66ade0984333c63c1bd..7d670356d5eb735c414c782aed14626bc972138e 100644 GIT binary patch delta 21 bcmaE`iSfZEMy}Jmyj%=GaLZvMS6CzfQ@94C delta 21 bcmaE`iSfZEMy}Jmyj%=GuvmB_S6CzfQH=&b diff --git a/Backend/src/payments/routes/__pycache__/financial_routes.cpython-312.pyc b/Backend/src/payments/routes/__pycache__/financial_routes.cpython-312.pyc index d67e744bbab8ab8b92a993d23182647e7d971baf..4d70eb5a74a61ca3374469469c59d176458b80e1 100644 GIT binary patch delta 21 bcmccgi}BJgMy}Jmyj%=GaLZvMmq#rCTm}a& delta 21 bcmccgi}BJgMy}Jmyj%=GuvmB_mq#rCS=$E6 diff --git a/Backend/src/payments/routes/__pycache__/gl_routes.cpython-312.pyc b/Backend/src/payments/routes/__pycache__/gl_routes.cpython-312.pyc index 5befd71442c9f98c766fd87c4b8da387b5d15273..10c864102fa396b283e5f386368044082600e92d 100644 GIT binary patch delta 19 ZcmaD6|0162G%qg~0}$MD*vNHH9{@$&25JBR delta 19 ZcmaD6|0162G%qg~0}w10-pF-N9{@wL1_l5C diff --git a/Backend/src/payments/routes/__pycache__/invoice_routes.cpython-312.pyc b/Backend/src/payments/routes/__pycache__/invoice_routes.cpython-312.pyc index 42f9777b809610a5c40de62e6cf258a11880da98..c6bf8c5829124559a4025f8a92efd6eeacfbd9f1 100644 GIT binary patch delta 3012 zcma)8U2Gdg5cVdvlQ?zULQ*GAlQ{pqCUKKEN!vJ0)AT3(OVz3kLgvA8yqok|+n4U0 z)20+6s?rAp59vzbM=HD^q$-stH3;zr5=a&Bf_OkW=o=46I)6Xxq19hczSS&llg?NR^U_x4W6?TrL)&09AV=*iN;}}`WSi+$ zRz6cjwX2>L6^bi9Scrve6LEKEQ

2OS>JKL!fD3)Vt~+ni6=PpglA~x382cV}E@Xj(B6jHtkHIo;u~up2DMY?Gam z;nqhO-sR97Eyg^&F6LFHi~KpWR8C_K8+#T)+DN|2bDac;?N8>YZY4~{=k=6$)4NQx z{9xIR(#9xc%r48pLPDoJ0yFMK=tbxgFZn2miC=sZB39Y3kt^+K!#JmBXL(GdDzm-= zsEM#8|832P-5&{Hg&HLUQAk;_uP1Jz>)!vL2?MA+9WB7x0h zL>vgTdq;6)Ow0vZy!&uiFKz^ahxic~YaT8|{V2ys_(_CG0Mi2y#veZpBYV>AE(uTP)Od_l$w&O_!$e5E{kU6tjDA6hs(D zkh|G0zNzai;Z(Ro6P0IBtRtKiPlZM+&*ShQ!XfcisIhAThldd)AscuPj-N(YV?_pj zRQwQ%4r9m;mNvjtva||{tf~}eNsATu;xB>L-uzVk-LgeV$_X@rX*;b!A+d|8bdIt_ zE^9JNbMtvzm386I%~7yJR|%KC)3}-exKtiqT~<_Nalru4O1UJqs_^!V&eGK6xb<<( zrxI}?K zYPL}KMTB~UYY6Ld=To_pHLxy$vaBU38wxc{b#bJeRX-bHI!lsV)}=mFtc{)P5t zZ&NWV92w%TAUF~tKIy8dkpvd=z~@khi~C)J1+qH2H6ZImcY9Ehg(V;v(`xt@9A6MG zcQ-A{9W>zl3PK}*U5tA!2}iHUoJ{It8Iot@aWqvpXnGCpuhqHS&xI}&zKS5pseneyZoLyRrv{@^?0p-`YP-h90f**}}5znNOy3O!KOG%Ya-pE=8R9I2zi7 zsj|z=Tq?y(6RTC+kJdxSEE~|sIng%|_dbiSjftg!230|lxyRNTDoP&Kd%^`F9i2&< zNz3A@Mc+U<_5s^VS(;hQ_NI(XMz?qq3Vmr~HjzwOx{+0sFCM}d)~XT<5<-^wLr&JH zwJTC-on@hg&hfW#MN%#ITCH5sLbrhb8ADP3n7Xv9l)BWef{TFP26JD-W8TSsI@nK2 z{;bLWGc;b>A#*Td^)XFXRVOl&7IDnmuj&C8=`Dey$LdNn#`+p;g;bb)lfSEc2k(-g#w#38etQnyNz%EZDvdIifB-Ez7+{jss%kyuS>d=_6T2&fOp}u?0 zFfF)m;6}4c=W>>6WAePNpe7azzk~1@0ygSD;Bm=w{jhu_W6)fhjq-aSBk-8V#NC6V RrT1LB^WKSo+x;EL{sj?hnM(iw delta 3034 zcmah~TWlLe6!pZ9Bz7F9P`<#;CPCbl=7U56$V zm5TBK0*Q7Ys1ia#6+$6VK{cp9g+HW9NJ#Jj(n5duMgrO&R0)Z>v$nIbidbonX6D|x zbMLu#?)Dfjlr5H}9zI978rQ6%{o1{v>}oIRU5l|J)s^#gIZdu-$KJy;?Ax!;?Gf?@+_2wx zXyqtwz)kyp_5gK6nu!Cq5GU#P@?&r-ABDsyK>BeT|Jz9o?jR*A<@neQ`<~&7WoaPi zi&fe~>>JeDT!cGK+78@h(jMg6>)?5$j(b$Z|L1TJcjKNtt6?w~0gt!W$5g@fCcchk96g&IC02i<#^89>Vf~Y zGDw0ZD?=tLC%Ba~_)=Nu3y+>W>wYYK+- z0JH2-xOQ5yQ?Zoygf4>cECulHoCDk8=8aIjuF zr_f~?W0Epl0)OccTdUm-#6WJ@u2`f>Qqg23<)2nC3Hx>Al!^^O=f8Q!{Svz*9%|-68fTqbT_#YPoy!4rc)}> zBpXeGR8)*Ry@9zMoK1x|dmW?+4%;REtk@tU34#;{$x7GQ$E{U!5Ub=ArYHre3ZMaq zGelUMe5!jkDA|;iv>J^id9`WuWl*}pVY`pHgDtEv;K`*W6lj^<0!iI0r3y8i;AQR4 z)=k(?UxD3_GoG_ok_p&*rupe`z}ELZ1PW~*>>Qj7x%eQTBAfJG*aGlI z=A*V|$3i|o6u6^r0~Dmj<4?xuI>G*!>feavI!8W3RDnI0SxImx$Le%YLR%~uY^xRI ziQ5hgO4YOhlsDOKu<4qJs1fGZ0giIe^KpoS@=X3WW8(fii?&h|Z6ARBgBu{?+w6kH z9RNXADIev@GPt@8LV&v&+WpXmf^2`HA#*Xbh=vbWKHN+3>GsW7B26TRQIk;FMw=7W znPiU!eBF>Vy;x1h<3v@n6|FmBap*C+n-Wz?(>RH0TN{Ko*TA5J*4XodOO9d{{JDYL&wk^m?VfsbVpoCCS^@`$I@8V zqWs0!egiKPrA#cz-AQ4GeWN!`m z1_b}lC|14Pa3|k-zTg{wgI_SX7gdv)1Y<+Ktu)a zt5H?-9BYp>qoT~I$nQ3nseahR=&NirrUMDL{Y zuwau@D@yjIgyRdkh}(1>4!nh0q+i1J(hEGv=lBbkpkKk_`>cGby-vj7=JWi`fB_HX z>{J7)%*azZLgSg4nZM9Aj~c(keNua}orpGp89zWX2fZX3O~sNV8a3Q?P$jJqO5uv@ zR+)EcC_sbY^RQ;yP*hDkHoA2qtr?9AE+hR607`-01Nau;Y756F{I`g!`?O>i ZjMHEF8sfjY!2X#V&y3G|Y_?zc{9mwym6ZSh diff --git a/Backend/src/payments/routes/__pycache__/payment_routes.cpython-312.pyc b/Backend/src/payments/routes/__pycache__/payment_routes.cpython-312.pyc index 2010991c75326fd4976db827587d44b132c99abe..0cf102afa1b69baf25deb9d152097d57f6d2a2c7 100644 GIT binary patch delta 25 fcmew~h4s@ER_@chyj%=GaLd8Ck$WpQW4adrZLtSj delta 25 fcmew~h4s@ER_@chyj%=Ga53Jnk$WpQW4adrZe9m) diff --git a/Backend/src/payments/routes/__pycache__/reconciliation_routes.cpython-312.pyc b/Backend/src/payments/routes/__pycache__/reconciliation_routes.cpython-312.pyc index 8d8340369cde6b9f9efeec5f79fd9cd8ebe4eaad..1118222e2255d916cb04b33526abe2365e7520ad 100644 GIT binary patch delta 19 ZcmbOlF*SngG%qg~0}$MD*vQ4L0{}Og1mFMw delta 19 ZcmbOlF*SngG%qg~0}w10-pIwR0{}H|1bhGh diff --git a/Backend/src/payments/routes/invoice_routes.py b/Backend/src/payments/routes/invoice_routes.py index 2a27a8a2..181367b7 100644 --- a/Backend/src/payments/routes/invoice_routes.py +++ b/Backend/src/payments/routes/invoice_routes.py @@ -15,6 +15,7 @@ from ...shared.utils.response_helpers import success_response from ...shared.utils.request_helpers import get_request_id from ..services.financial_audit_service import financial_audit_service from ..models.financial_audit_trail import FinancialActionType +from ...analytics.services.audit_service import audit_service from ..schemas.invoice import ( CreateInvoiceRequest, UpdateInvoiceRequest, diff --git a/Backend/src/payments/schemas/__pycache__/__init__.cpython-312.pyc b/Backend/src/payments/schemas/__pycache__/__init__.cpython-312.pyc index d9ad208fc86b50faac11dab017e4aba83d892746..ea3c2405aa6699fc385db8dcd5f94fea7117889f 100644 GIT binary patch delta 19 ZcmZ3&CAQh00g%jj5l)E=>h;eB?Wf? delta 20 ZcmeB-?u_O>&CAQh00d>Jh8wx-bOAa&1vUTx diff --git a/Backend/src/payments/services/__pycache__/borica_service.cpython-312.pyc b/Backend/src/payments/services/__pycache__/borica_service.cpython-312.pyc index 6a758d4e5feb9b8b761eb65e2e7fcc3fe52080a9..7882102f99bfb5e7e86cae7e510c024a890b878f 100644 GIT binary patch delta 22 ccmbO;k#WvMM()$Ryj%=GaLd7XBlkoP07`xaIRF3v delta 22 ccmbO;k#WvMM()$Ryj%=GFjH1{BlkoP07u6K&j0`b diff --git a/Backend/src/payments/services/__pycache__/financial_audit_service.cpython-312.pyc b/Backend/src/payments/services/__pycache__/financial_audit_service.cpython-312.pyc index 012dfe6ca6140caaace051ee021b7dd1794ddbf0..46da3dc2488cab5af82e9452a483f6ea7b57dc69 100644 GIT binary patch delta 20 acmZ3hyH=O`G%qg~0}$MDFy6?$NDKfwHU)41 delta 20 acmZ3hyH=O`G%qg~0}xD)Gu+6%NDKfv3k694 diff --git a/Backend/src/payments/services/__pycache__/gl_service.cpython-312.pyc b/Backend/src/payments/services/__pycache__/gl_service.cpython-312.pyc index 0a2ad71638edff5dee6e68b7a5240ee49051df0c..5165c7ffe2124a32e627582df16380109f2e35b2 100644 GIT binary patch delta 20 acmeAu>L}tq&CAQh00g%jj5l)swEzG>LL}tq&CAQh00b^^h8wy6S^xk%)CIEu diff --git a/Backend/src/payments/services/__pycache__/invoice_service.cpython-312.pyc b/Backend/src/payments/services/__pycache__/invoice_service.cpython-312.pyc index 4b948d440a19fa170abb5e2d443f7f45d6edb9a0..b538847f7dee1cd0084ac7b1101966871f2d10fc 100644 GIT binary patch delta 22 ccmaF8oALE-M()$Ryj%=GaLd7XBlm+?0A4-^j{pDw delta 22 ccmaF8oALE-M()$Ryj%=Gpc84hk^4a`09ptJ_y7O^ diff --git a/Backend/src/payments/services/__pycache__/paypal_service.cpython-312.pyc b/Backend/src/payments/services/__pycache__/paypal_service.cpython-312.pyc index 77d2f93853eff0b99232252eeebc6fa49184f65b..5a1f83664ab6c3bab9dc6be46f23e51174a4e3f6 100644 GIT binary patch delta 22 ccmZqJ$Jnrsk^3|+FBbz4+;TA9$o(}A08P6F)c^nh delta 22 ccmZqJ$Jnrsk^3|+FBbz4_|DSV$o(}A087~hn*aa+ diff --git a/Backend/src/payments/services/__pycache__/reconciliation_service.cpython-312.pyc b/Backend/src/payments/services/__pycache__/reconciliation_service.cpython-312.pyc index 7a30bd925331f69935b83c484c0c7630805949bd..289e709e65a195c709b9d66771de67fed6d91b95 100644 GIT binary patch delta 20 acmeyH|2LoeG%qg~0}$MDFy6@h$s7Pt9|r{h delta 20 acmeyH|2LoeG%qg~0}yy88E)kMWDWpL_y(2$ diff --git a/Backend/src/payments/services/__pycache__/stripe_service.cpython-312.pyc b/Backend/src/payments/services/__pycache__/stripe_service.cpython-312.pyc index 72273307823d88f7403171cb587c5c5add36bb01..1432001cc449cae675da94e29590342112d923e7 100644 GIT binary patch delta 22 ccmZoTz}Rqrk^3|+FBbz4+;TA9$o(}Q08R=9+5i9m delta 22 ccmZoTz}Rqrk^3|+FBbz4_|DSV$o(}Q08A(bpa1{> diff --git a/Backend/src/reviews/__pycache__/__init__.cpython-312.pyc b/Backend/src/reviews/__pycache__/__init__.cpython-312.pyc index 8fa3381538ece3205ac7888628424836ab9b5d91..18b87e96c585ff5654bf71eac3e0a6ce0d87f456 100644 GIT binary patch delta 19 ZcmZ3$xPX!SG%qg~0}$MDFrLUg6#y-*1iJtL delta 19 ZcmZ3$xPX!SG%qg~0}x!CsWXv#DgZAS1q1*9 diff --git a/Backend/src/reviews/models/__pycache__/__init__.cpython-312.pyc b/Backend/src/reviews/models/__pycache__/__init__.cpython-312.pyc index 4ad77b12635660ac78e82c64d1051f9aeebcd523..5220242413c471b50e6b6ca1197368b0dd24fe2f 100644 GIT binary patch delta 19 ZcmZ3^xSWyuG%qg~0}$MDFrLUg2LLXx1keBg delta 19 ZcmZ3^xSWyuG%qg~0}x!CsWXv#4gfG41sMPU diff --git a/Backend/src/reviews/models/__pycache__/favorite.cpython-312.pyc b/Backend/src/reviews/models/__pycache__/favorite.cpython-312.pyc index e218dbde7fe7396c2be597c60202505358c82532..22a12f8bd0c86d74178ee65f45a777aa5697f74b 100644 GIT binary patch delta 20 acmX@Wd4QAqG%qg~0}$MDFy6?$l?4Df3j|IU1 diff --git a/Backend/src/reviews/routes/__pycache__/review_routes.cpython-312.pyc b/Backend/src/reviews/routes/__pycache__/review_routes.cpython-312.pyc index 67fe535778840f8a6730487338932503793ed8ef..76e93d5f113b3d1eda51ce7958c644073bb937d3 100644 GIT binary patch delta 22 ccmcb*n(^vtM()$Ryj%=GaLd7XBloFL09X_UB>(^b delta 22 ccmcb*n(^vtM()$Ryj%=GuzZQZM($Ig09g13Qvd(} diff --git a/Backend/src/reviews/schemas/__pycache__/__init__.cpython-312.pyc b/Backend/src/reviews/schemas/__pycache__/__init__.cpython-312.pyc index 9dcbbe5c30e5b8fad9a7d38107e57f430b94a982..e895e6fcc2500a3613ecda6722cc247f26d5b191 100644 GIT binary patch delta 19 ZcmZ3%xPp=UG%qg~0}$MDFrLUg7XU8R1k(Tj delta 19 ZcmZ3%xPp=UG%qg~0}x!CsWXv#E&wn<1snhX diff --git a/Backend/src/reviews/schemas/__pycache__/review.cpython-312.pyc b/Backend/src/reviews/schemas/__pycache__/review.cpython-312.pyc index 620f7b67fae66ad02671bbedb3aaa175c2fe84ec..fa2856ba4a7492732a042db2efa0393ccc42f129 100644 GIT binary patch delta 20 acmX@YafE~WG%qg~0}$MDFy6>*$pQd4hy>XH delta 20 acmX@YafE~WG%qg~0}!09*4)T#$pQd5PXzk_ diff --git a/Backend/src/rooms/__pycache__/__init__.cpython-312.pyc b/Backend/src/rooms/__pycache__/__init__.cpython-312.pyc index 705966d32324e92d0c2b90ec36122328ecacfd8c..c9d71fce0a4fce5001f715e261ea42f3851001ee 100644 GIT binary patch delta 19 ZcmbQoIFFJ0G%qg~0}$MDFrLUg82~L~1hoJF delta 19 ZcmbQoIFFJ0G%qg~0}vdXsWXv#G5{`a1nvL; diff --git a/Backend/src/rooms/models/__pycache__/__init__.cpython-312.pyc b/Backend/src/rooms/models/__pycache__/__init__.cpython-312.pyc index cadfed9e6d03d7cf8d56cb92fb51890fc26ca3d1..2689690b77b16b419d9142059a08d80d2a695d89 100644 GIT binary patch delta 19 ZcmZ3=xRjCmG%qg~0}$MDFrLUg3ji)=1j+ya delta 19 ZcmZ3=xRjCmG%qg~0}vdXsWXv#7631C1p@#8 diff --git a/Backend/src/rooms/models/__pycache__/rate_plan.cpython-312.pyc b/Backend/src/rooms/models/__pycache__/rate_plan.cpython-312.pyc index d1d813c0d80df902a80da12ba30a90a819cd7b1d..3ab2983e0cfbb9901a6bfc46d9c8e6c2be895aba 100644 GIT binary patch delta 20 acmZ3jwpxw*G%qg~0}$MDFy6?mAPfLF=LFdR delta 20 acmZ3jwpxw*G%qg~0}!~)(%HzZAPfLD)C8CS diff --git a/Backend/src/rooms/models/__pycache__/room.cpython-312.pyc b/Backend/src/rooms/models/__pycache__/room.cpython-312.pyc index 6fbf789f06d78fa593a66292218142d240224d7d..69adb46ca6cc5744f2d844d1882f4c08171fe53e 100644 GIT binary patch delta 20 acmew+@=b*MG%qg~0}$MDFy6?W%>@8L4h4+> delta 20 acmew+@=b*MG%qg~0}!~)(%HzJ%>@8I`vpt@ diff --git a/Backend/src/rooms/models/__pycache__/room_attribute.cpython-312.pyc b/Backend/src/rooms/models/__pycache__/room_attribute.cpython-312.pyc index 96582ddc41cdf8085170f38b16ddaa91c1fa8bfa..4299011e50f1b3ca46e534bccda6d4ca2b632158 100644 GIT binary patch delta 20 acmaFG^NNT2G%qg~0}$MDFy6==&jtWL3I$aF delta 20 acmaFG^NNT2G%qg~0}!~)(%Hxz&jtWI_XQLH diff --git a/Backend/src/rooms/models/__pycache__/room_inspection.cpython-312.pyc b/Backend/src/rooms/models/__pycache__/room_inspection.cpython-312.pyc index 1c15dba03bacd841195aaec18ce905aa75fa2de1..eb5bcc751f9ca9897b33c671de74d018b8b5a4c5 100644 GIT binary patch delta 20 acmZ1>xk8frG%qg~0}$MDFy6>Lmj?hhlm#yU delta 20 acmZ1>xk8frG%qg~0}!~)(%Hy8mj?hffduXV diff --git a/Backend/src/rooms/models/__pycache__/room_maintenance.cpython-312.pyc b/Backend/src/rooms/models/__pycache__/room_maintenance.cpython-312.pyc index 75335f567786cce2d3a816bb6920157332b526ee..02c33d808aa255cdda3a477d32355e553d26147e 100644 GIT binary patch delta 20 acmZ1@u||UXG%qg~0}$MDFy6?m$O8a35CpjZ delta 20 acmZ1@u||UXG%qg~0}!~)(%HzZ$O8a0{RDUb diff --git a/Backend/src/rooms/models/__pycache__/room_type.cpython-312.pyc b/Backend/src/rooms/models/__pycache__/room_type.cpython-312.pyc index 717372ac392fb66b20d86f9926486188706b96e2..0e722a52ed0e6fb28619c5ec475c72ec6ad3ba6a 100644 GIT binary patch delta 20 acmcc2eVLp4G%qg~0}$MDFy6?0f)xNfO$Chr delta 20 acmcc2eVLp4G%qg~0}!~)(%Hy;f)xNdIt5Gs diff --git a/Backend/src/rooms/routes/__pycache__/__init__.cpython-312.pyc b/Backend/src/rooms/routes/__pycache__/__init__.cpython-312.pyc index 0496561a6ff9b45a60a763e92b85cc91051e75ce..1802ba08bcc5a290f6da9ed301506f0f5b5cd6fb 100644 GIT binary patch delta 19 ZcmZ3=xRjCmG%qg~0}$MDFrLUg3ji)=1j+ya delta 19 ZcmZ3=xRjCmG%qg~0}vdXsWXv#7631C1p@#8 diff --git a/Backend/src/rooms/routes/__pycache__/advanced_room_routes.cpython-312.pyc b/Backend/src/rooms/routes/__pycache__/advanced_room_routes.cpython-312.pyc index 01667954ee61ef370eb053f7eccd23cea18ec028..d48560afa21908478cec9e9f7325b975437ece27 100644 GIT binary patch delta 21 bcmezUn)&x@X0Fq`yj%=GaLZvM*T=5_Vk!uS delta 21 bcmezUn)&x@X0Fq`yj%=GutsDf*T=5_U^)mb diff --git a/Backend/src/rooms/routes/__pycache__/rate_plan_routes.cpython-312.pyc b/Backend/src/rooms/routes/__pycache__/rate_plan_routes.cpython-312.pyc index f4cb5eea4adfe5069bd82aef108cb27efcb455cc..724a3406258d1975124ff9d466b983f6f22592b0 100644 GIT binary patch delta 22 ccmaEIgYn4?M()$Ryj%=GaLd7XBX?vD0APy;LjV8( delta 22 ccmaEIgYn4?M()$Ryj%=G;5$oaBX?vD0A8sF2><{9 diff --git a/Backend/src/rooms/routes/__pycache__/room_routes.cpython-312.pyc b/Backend/src/rooms/routes/__pycache__/room_routes.cpython-312.pyc index c235dbd149dd03b3dedef6e3fe2ffc3bf149c671..1fc99c0da299cb5d3b8d5e5b5dea9b282f435014 100644 GIT binary patch delta 18528 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 A)Bpeg delta 10341 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 R7*oV^S+(SpPJa^Q_w9o(m diff --git a/Backend/src/rooms/routes/room_routes.py b/Backend/src/rooms/routes/room_routes.py index 0343f983..14173a5b 100644 --- a/Backend/src/rooms/routes/room_routes.py +++ b/Backend/src/rooms/routes/room_routes.py @@ -11,7 +11,7 @@ from ...auth.models.user import User from ..models.room import Room, RoomStatus from ...analytics.services.audit_service import audit_service from ..models.room_type import RoomType -from ..schemas.room import CreateRoomRequest, UpdateRoomRequest, BulkDeleteRoomsRequest, UpdateAmenityRequest +from ..schemas.room import CreateRoomRequest, UpdateRoomRequest, BulkDeleteRoomsRequest, UpdateAmenityRequest, CreateRoomTypeRequest, UpdateRoomTypeRequest from ...shared.utils.response_helpers import success_response from ...reviews.models.review import Review, ReviewStatus from ...bookings.models.booking import Booking, BookingStatus @@ -192,6 +192,7 @@ async def get_room_types(db: Session=Depends(get_db)): 'description': rt.description, 'base_price': float(rt.base_price) if rt.base_price else 0.0, 'capacity': rt.capacity, + 'amenities': rt.amenities if rt.amenities else [], } for rt in room_types ] @@ -200,6 +201,221 @@ async def get_room_types(db: Session=Depends(get_db)): logger.error(f'Error fetching room types: {str(e)}', exc_info=True) raise HTTPException(status_code=500, detail=str(e)) + +@router.get('/room-types/{id}') +async def get_room_type(id: int, db: Session=Depends(get_db)): + """Get a specific room type by ID.""" + try: + room_type = db.query(RoomType).filter(RoomType.id == id).first() + if not room_type: + raise HTTPException(status_code=404, detail='Room type not found') + + room_type_dict = { + 'id': room_type.id, + 'name': room_type.name, + 'description': room_type.description, + 'base_price': float(room_type.base_price) if room_type.base_price else 0.0, + 'capacity': room_type.capacity, + 'amenities': room_type.amenities if room_type.amenities else [], + 'created_at': room_type.created_at.isoformat() if room_type.created_at else None, + 'updated_at': room_type.updated_at.isoformat() if room_type.updated_at else None, + } + return success_response(data={'room_type': room_type_dict}, message='Room type retrieved successfully') + except HTTPException: + raise + except Exception as e: + logger.error(f'Error fetching room type: {str(e)}', exc_info=True) + raise HTTPException(status_code=500, detail=str(e)) + + +@router.post('/room-types', dependencies=[Depends(authorize_roles('admin'))]) +async def create_room_type( + room_type_data: CreateRoomTypeRequest, + request: Request, + current_user: User=Depends(authorize_roles('admin')), + db: Session=Depends(get_db) +): + """Create a new room type.""" + try: + # Check for duplicate name + existing = db.query(RoomType).filter(RoomType.name == room_type_data.name).first() + if existing: + raise HTTPException(status_code=400, detail='Room type with this name already exists') + + room_type = RoomType( + name=room_type_data.name, + description=room_type_data.description, + base_price=room_type_data.base_price, + capacity=room_type_data.capacity, + amenities=room_type_data.amenities or [] + ) + + db.add(room_type) + db.commit() + db.refresh(room_type) + + # Audit log + audit_service.log_action( + db=db, + user_id=current_user.id, + action='create', + resource_type='room_type', + resource_id=room_type.id, + details={'name': room_type.name, 'base_price': float(room_type.base_price)} + ) + + room_type_dict = { + 'id': room_type.id, + 'name': room_type.name, + 'description': room_type.description, + 'base_price': float(room_type.base_price) if room_type.base_price else 0.0, + 'capacity': room_type.capacity, + 'amenities': room_type.amenities if room_type.amenities else [], + 'created_at': room_type.created_at.isoformat() if room_type.created_at else None, + 'updated_at': room_type.updated_at.isoformat() if room_type.updated_at else None, + } + + return success_response(data={'room_type': room_type_dict}, message='Room type created successfully') + except HTTPException: + db.rollback() + raise + except IntegrityError as e: + db.rollback() + logger.error(f'Database integrity error during room type creation: {str(e)}') + raise HTTPException(status_code=409, detail='Room type conflict detected. Please check room type name.') + except Exception as e: + db.rollback() + logger.error(f'Error creating room type: {str(e)}', exc_info=True) + raise HTTPException(status_code=500, detail='An error occurred while creating the room type') + + +@router.put('/room-types/{id}', dependencies=[Depends(authorize_roles('admin'))]) +async def update_room_type( + id: int, + room_type_data: UpdateRoomTypeRequest, + request: Request, + current_user: User=Depends(authorize_roles('admin')), + db: Session=Depends(get_db) +): + """Update a room type.""" + try: + room_type = db.query(RoomType).filter(RoomType.id == id).first() + if not room_type: + raise HTTPException(status_code=404, detail='Room type not found') + + # Check for duplicate name if name is being updated + if room_type_data.name and room_type_data.name != room_type.name: + existing = db.query(RoomType).filter(RoomType.name == room_type_data.name).first() + if existing: + raise HTTPException(status_code=400, detail='Room type with this name already exists') + + # Update fields + update_data = room_type_data.model_dump(exclude_unset=True) + for key, value in update_data.items(): + setattr(room_type, key, value) + + db.commit() + db.refresh(room_type) + + # Audit log + audit_service.log_action( + db=db, + user_id=current_user.id, + action='update', + resource_type='room_type', + resource_id=room_type.id, + details=update_data + ) + + room_type_dict = { + 'id': room_type.id, + 'name': room_type.name, + 'description': room_type.description, + 'base_price': float(room_type.base_price) if room_type.base_price else 0.0, + 'capacity': room_type.capacity, + 'amenities': room_type.amenities if room_type.amenities else [], + 'created_at': room_type.created_at.isoformat() if room_type.created_at else None, + 'updated_at': room_type.updated_at.isoformat() if room_type.updated_at else None, + } + + return success_response(data={'room_type': room_type_dict}, message='Room type updated successfully') + except HTTPException: + db.rollback() + raise + except IntegrityError as e: + db.rollback() + logger.error(f'Database integrity error during room type update: {str(e)}') + raise HTTPException(status_code=409, detail='Room type conflict detected. Please check room type name.') + except Exception as e: + db.rollback() + logger.error(f'Error updating room type: {str(e)}', exc_info=True) + raise HTTPException(status_code=500, detail='An error occurred while updating the room type') + + +@router.delete('/room-types/{id}', dependencies=[Depends(authorize_roles('admin'))]) +async def delete_room_type( + id: int, + request: Request, + current_user: User=Depends(authorize_roles('admin')), + db: Session=Depends(get_db) +): + """Delete a room type.""" + try: + room_type = db.query(RoomType).filter(RoomType.id == id).first() + if not room_type: + raise HTTPException(status_code=404, detail='Room type not found') + + # Check if room type is being used by any rooms + rooms_count = db.query(Room).filter(Room.room_type_id == id).count() + if rooms_count > 0: + raise HTTPException( + status_code=400, + detail=f'Cannot delete room type. It is being used by {rooms_count} room(s). Please remove or reassign rooms first.' + ) + + # Check if room type is being used by any rate plans + from ..models.rate_plan import RatePlan + rate_plans_count = db.query(RatePlan).filter(RatePlan.room_type_id == id).count() + if rate_plans_count > 0: + raise HTTPException( + status_code=400, + detail=f'Cannot delete room type. It is being used by {rate_plans_count} rate plan(s). Please remove or reassign rate plans first.' + ) + + # Check if room type is being used by any packages + from ...loyalty.models.package import Package + packages_count = db.query(Package).filter(Package.room_type_id == id).count() + if packages_count > 0: + raise HTTPException( + status_code=400, + detail=f'Cannot delete room type. It is being used by {packages_count} package(s). Please remove or reassign packages first.' + ) + + # Store name for audit log + room_type_name = room_type.name + + db.delete(room_type) + db.commit() + + # Audit log + audit_service.log_action( + db=db, + user_id=current_user.id, + action='delete', + resource_type='room_type', + resource_id=id, + details={'name': room_type_name} + ) + + return success_response(message='Room type deleted successfully') + except HTTPException: + db.rollback() + raise + except Exception as e: + db.rollback() + logger.error(f'Error deleting room type: {str(e)}', exc_info=True) + raise HTTPException(status_code=500, detail='An error occurred while deleting the room type') + @router.get('/available') async def search_available_rooms(request: Request, from_date: str=Query(..., alias='from'), to_date: str=Query(..., alias='to'), roomId: Optional[int]=Query(None, alias='roomId'), type: Optional[str]=Query(None), capacity: Optional[int]=Query(None), page: int=Query(1, ge=1), limit: int=Query(12, ge=1, le=100), db: Session=Depends(get_db)): try: @@ -359,6 +575,19 @@ async def create_room(room_data: CreateRoomRequest, request: Request, current_us # Use price from request or default to room type base price room_price = room_data.price if room_data.price is not None else float(room_type.base_price) if room_type.base_price else 0.0 + # Inherit amenities from room type if not provided or empty + room_amenities = room_data.amenities if room_data.amenities else [] + if not room_amenities and room_type.amenities: + # Convert room type amenities to list if needed + if isinstance(room_type.amenities, list): + room_amenities = room_type.amenities + elif isinstance(room_type.amenities, str): + try: + import json + room_amenities = json.loads(room_type.amenities) + except: + room_amenities = [s.strip() for s in room_type.amenities.split(',') if s.strip()] + room = Room( room_type_id=room_data.room_type_id, room_number=room_data.room_number, @@ -370,7 +599,7 @@ async def create_room(room_data: CreateRoomRequest, request: Request, current_us capacity=room_data.capacity, room_size=room_data.room_size, view=room_data.view, - amenities=room_data.amenities or [] + amenities=room_amenities ) db.add(room) db.flush() @@ -415,6 +644,29 @@ async def update_room(id: int, room_data: UpdateRoomRequest, request: Request, c db.rollback() raise HTTPException(status_code=404, detail='Room type not found') room.room_type_id = room_data.room_type_id + + # Inherit amenities from room type if amenities not provided in update + if not room_data.amenities and room_type.amenities: + # Convert room type amenities to list if needed + if isinstance(room_type.amenities, list): + room.amenities = room_type.amenities + elif isinstance(room_type.amenities, str): + try: + import json + room.amenities = json.loads(room_type.amenities) + except: + room.amenities = [s.strip() for s in room_type.amenities.split(',') if s.strip()] + elif not room_data.amenities: + # If room type not changed but amenities not provided, inherit from current room type + if room.room_type and room.room_type.amenities: + if isinstance(room.room_type.amenities, list): + room.amenities = room.room_type.amenities + elif isinstance(room.room_type.amenities, str): + try: + import json + room.amenities = json.loads(room.room_type.amenities) + except: + room.amenities = [s.strip() for s in room.room_type.amenities.split(',') if s.strip()] if room_data.room_number is not None: # Check for duplicate room number diff --git a/Backend/src/rooms/schemas/__pycache__/__init__.cpython-312.pyc b/Backend/src/rooms/schemas/__pycache__/__init__.cpython-312.pyc index a1376572fc9e615d5b4c92e8953f4ee9d7f7cde9..11681ab6bfbf3a4e1f06e9177d10bb97beba4629 100644 GIT binary patch delta 20 acmZ3_w4RCkG%qg~0}$MDFy6?m!UzB~Wdw@= delta 20 acmZ3_w4RCkG%qg~0}ya*)Y-_b!UzB{Dg+|{ diff --git a/Backend/src/rooms/schemas/__pycache__/room.cpython-312.pyc b/Backend/src/rooms/schemas/__pycache__/room.cpython-312.pyc index c1e78f7c79ff130d6a08c8a1e912420fb45160e0..af7cabc0803198eb000d668e5d2aab01e13acbf5 100644 GIT binary patch delta 2452 zcmai$O-vg{6vub%#Wwy}e_=2N!x|I7sq#s4Ngy#U2@q0}hLAR-5iy<#*$S{TYm`DG zL8V4Yq^gDPAymo%^^^!7Xu0Ips@GhQ>_hBZrKnO5Ra1qkYEFG`Yz#)RVu|0*zWL9* znc4T><(H#tG5NW}VHMz)o$6K-ffd;=Zme|PKWY#L1Y-Y6AP#C+H=;lg#_c>RL)5t^ z>X>&$+&^yoEQwDyQ#DPZczp9~({<5v8iugr0L=hU6c*M0Gxv$F^;4EkF{URhPsC%o zz4no50ENf&r?pK=A2x>o1^Y~r(CLXpa`u)w^;BRn?1^r^to=z8W1Ej`!$#XN3}FJ+ zt^X;r;0bJ=MDzkQT(yE}G18~sbE=T_cjtxXehi#N3qj?Jk18_~q06Pr0tP&Ad!<6rL|;Zq=q7+Lu_6wEA{oS9I`?$PK*--By7 zd?aG8zSAkp#aFhwQ@%#N#LuvI-|7g)i2l+SFD{Pg!}ZU5s~+VH%K5SJQ`|S%H16n)tkSX9ywI((QpAtiec@J2=<4=c0r8Ol5mEJ)ZKVeKgJ z?FtCh5=>2{)#NPez!`X*;x69=V{wftDW)cGa&^ zR2iL9({$m$XeypilXIG);k|NKP2Yx{&>3}ZMuBsfRnscfu*d}=nvAj$xJD#)5iaZ! z;v>L<R3dk5qxvFrHHS(i};}3BIifTUmtu5{#xMkaE}e(v^ZnY zce`%Gmm~WWaf9dQJCEXhvJ7ZwdBA-kFCEOge9MWo_{IlYXUB4`t4sY4!ddBRKGd<6 zekN_5kLN;@OT)|l)$mF%D^2G8!BtRiow$p?-|?dL+>4g>7tO&!u=j79$uGY$T3W2HjMh5SmlujpC&^u_ z?6@|xC=mnNHDfK?5Ufhg+&>m#+p!v`?8K3g%PK3VY$cU*kIG0~#GUc%v8;(YN;>Zz zU0ue9#>FQqjLR^YvzW9btuIMkq`quiFma_0j9f7e?AwU;ZSl+-B7uT$EJfaGQCZ%x z=*X@`SqfIdeOW9lbR}bmN)Iv(W9YPE)m3#^3rcwL6u$;=n}8h`fBI|ZnIrFXTjd70 z+rEeKY!VRzM7-~)bY9x~%KdGXUbV>geFfroF*RZZ{bq;X`{ALi6t7z2ZJkeG#8z}7*LD+X+_LIhab~5P`nT4A-s@@6zw`9SxJRCCBqFmh z{b9rVJ^YhPFwVb7+;4nQl`DN?>4E=U=BDXs_63OX<*&u{zZ%Ykw*`Yp#cgY|Xj&cG T7T~gdS{B`_L;nbH;m7(vE`0@4 delta 755 zcmZ4Bbijb`G%qg~0}w2krkA-^Xd<5kW6MPKR+dU0P2P=n_Omc*Zl1#`&B$oDc?VlG zqmV67WsxC}C}si@3JOK`lT|q!8H*>UbEq>qPVVPe!Dukqf^)i~8%Uu6h+qd1tU%%x zcXCc*adB>HNk)E3kpoEB10>9oo1c=J6Q7))mzJ5nlA*{EBxAo>fNK*Y8<@>Gd9AqQ z=7-$6%-moTLG~9JO_t;@QZfNCEkT40kSJyb5(*$!fkYgDM3v&?dI9OlC-^;qt_zU! zk#PpexPS7L>P#W1`+ZgLJ>rSg9v315iwa&P{J7O33#v+MS^4;Km;f_ilRXTBn&{TSTM0U zN3ahX8nK&%Wf|F^VGtlEIoU?!g0dA*l_ql$JbG@i7v<;Y#%HD=f@HG3Xh$T-Tt7`7 z+#X8-SqF9-!egMwgSavs#6ojmB1kN8vVd43B(@SKmy4aY#Tjy0Am!jt0tXtJVVNM= z%*plQ8hqd&0P#WY4W8_-U}6Lg3$T4)b*OrOao7M8QfW@AT~RJj7b6fCdrsc2;Ku!x Lfr&Ad5geuf$=Z@~ diff --git a/Backend/src/rooms/schemas/room.py b/Backend/src/rooms/schemas/room.py index de0c54d1..2a30c6a7 100644 --- a/Backend/src/rooms/schemas/room.py +++ b/Backend/src/rooms/schemas/room.py @@ -110,3 +110,51 @@ class UpdateAmenityRequest(BaseModel): """Schema for updating/renaming an amenity.""" new_name: str = Field(..., min_length=1, max_length=100, description="New name for the amenity") + +class CreateRoomTypeRequest(BaseModel): + """Schema for creating a room type.""" + name: str = Field(..., min_length=1, max_length=100, description="Room type name") + description: Optional[str] = Field(None, max_length=2000, description="Room type description") + base_price: float = Field(..., ge=0, description="Base price for this room type") + capacity: int = Field(..., ge=1, le=20, description="Room capacity") + amenities: Optional[List[str]] = Field(default_factory=list, description="List of amenities") + + @field_validator('amenities') + @classmethod + def validate_amenities(cls, v: Optional[List[str]]) -> List[str]: + """Ensure amenities is a list.""" + if v is None: + return [] + if not isinstance(v, list): + return [] + return v + + model_config = { + "json_schema_extra": { + "example": { + "name": "Deluxe Suite", + "description": "Spacious suite with premium amenities", + "base_price": 250.00, + "capacity": 2, + "amenities": ["WiFi", "TV", "AC", "Mini Bar"] + } + } + } + + +class UpdateRoomTypeRequest(BaseModel): + """Schema for updating a room type.""" + name: Optional[str] = Field(None, min_length=1, max_length=100, description="Room type name") + description: Optional[str] = Field(None, max_length=2000, description="Room type description") + base_price: Optional[float] = Field(None, ge=0, description="Base price for this room type") + capacity: Optional[int] = Field(None, ge=1, le=20, description="Room capacity") + amenities: Optional[List[str]] = Field(None, description="List of amenities") + + @field_validator('amenities') + @classmethod + def validate_amenities(cls, v: Optional[List[str]]) -> Optional[List[str]]: + """Ensure amenities is a list.""" + if v is not None and not isinstance(v, list): + return [] + return v + diff --git a/Backend/src/rooms/services/__pycache__/__init__.cpython-312.pyc b/Backend/src/rooms/services/__pycache__/__init__.cpython-312.pyc index b71fe8699fd3a1803fb4c010d9d23e382d084926..cf292b7e334a34e50481f106e6e8744938eaabce 100644 GIT binary patch delta 19 ZcmZ3^xSWyuG%qg~0}$MDFrLUg2LLXx1keBg delta 19 ZcmZ3^xSWyuG%qg~0}vdXsWXv#4gfE^1qlEE diff --git a/Backend/src/rooms/services/__pycache__/room_assignment_service.cpython-312.pyc b/Backend/src/rooms/services/__pycache__/room_assignment_service.cpython-312.pyc index c6f90e81c2d4427a3fb8f410502fa93a42c0c15c..53e2e0a43a6daed98fde202c62809bc92bf0343e 100644 GIT binary patch delta 20 acmZ1(wla+SG%qg~0}$MDFy6>5rwsrrg9CiQz diff --git a/Backend/src/security/models/__pycache__/security_event.cpython-312.pyc b/Backend/src/security/models/__pycache__/security_event.cpython-312.pyc index b0fe234ee2841fcd5c7332ab3c1cc33af6a0bc71..f2a68d8fc31c2e17001891ed9d989e547e191ea1 100644 GIT binary patch delta 20 acmexh_Q8z%G%qg~0}$MDFy6?WDh&Wd_XW@Z delta 20 acmexh_Q8z%G%qg~0}!~)(%HzJDh&Wb5&IkZ9T?AwR delta 20 acmZ3)w1|oOG%qg~0}!xo*4fA{&IkZ683X$O diff --git a/Backend/src/security/routes/__pycache__/compliance_routes.cpython-312.pyc b/Backend/src/security/routes/__pycache__/compliance_routes.cpython-312.pyc index bc147be92cc2f5aa37d69afd40ce4a05bd04388f..8a8dea89871e99d780fe15b6e535fed11fa04411 100644 GIT binary patch delta 20 acmZ4Mzt*4oG%qg~0}$MDFy6?$NF4w`4+X^l delta 20 acmZ4Mzt*4oG%qg~0}x1U)!E3sNF4w@Y6Wuu diff --git a/Backend/src/security/routes/__pycache__/security_routes.cpython-312.pyc b/Backend/src/security/routes/__pycache__/security_routes.cpython-312.pyc index bbe3e3d179d2f30042fef7f6cb63e2db43155483..43113bfd394074f810be8d2bb61b5f3bf11646e3 100644 GIT binary patch delta 22 ccmccB!gQ;JiTgA!FBbz4+;TA9$nD<*08&f_l>h($ delta 22 ccmccB!gQ;JiTgA!FBbz4EZC^Ck=wrs08=>z#Q*>R diff --git a/Backend/src/security/services/__pycache__/__init__.cpython-312.pyc b/Backend/src/security/services/__pycache__/__init__.cpython-312.pyc index 726bec273ea77c44a08b7e671e6725b9410e229d..a44d7da02fc97402629c39a42fbabe3c32089ef2 100644 GIT binary patch delta 19 ZcmZ3*xQdbcG%qg~0}$MDFrLUg9{?{O1la%p delta 19 ZcmZ3*xQdbcG%qg~0}$MrsWXv#J^(Pl1uFmm diff --git a/Backend/src/security/services/__pycache__/encryption_service.cpython-312.pyc b/Backend/src/security/services/__pycache__/encryption_service.cpython-312.pyc index 6739aa2b6f95cfa0ba9d996cde81b729a91529e9..20d41b4ed629456471770230b077be5583486938 100644 GIT binary patch delta 20 acmZ3Wwm^;hG%qg~0}$MDFy6>5DhvQOF9f&% delta 20 acmZ3Wwm^;hG%qg~0}!~)(%Hx@DhvQM90Yd& diff --git a/Backend/src/security/services/__pycache__/gdpr_service.cpython-312.pyc b/Backend/src/security/services/__pycache__/gdpr_service.cpython-312.pyc index 88fafe044ec695177c678a9532610630474d6f0c..6e0ebe81ebe2a4033267069b29d88a22dbb263b4 100644 GIT binary patch delta 20 acmbQ7HaU&^G%qg~0}$MDFy6?`VGIC1M+Gqe delta 20 acmbQ7HaU&^G%qg~0}w3OsI!rq!x#WRGzDP* diff --git a/Backend/src/security/services/__pycache__/privacy_admin_service.cpython-312.pyc b/Backend/src/security/services/__pycache__/privacy_admin_service.cpython-312.pyc index b2f7dc3df7bf2a3b0ab25fd24b044401e9e8098b..03b7e8f66e6aa2824629f8e84409dd44984d82e6 100644 GIT binary patch delta 20 acmeBB=}_T5&CAQh00g%jj5l)s6$Ah^B?W2# delta 20 acmeBB=}_T5&CAQh00eHcbT)GT6$Ah?5(Oy$ diff --git a/Backend/src/security/services/__pycache__/security_monitoring_service.cpython-312.pyc b/Backend/src/security/services/__pycache__/security_monitoring_service.cpython-312.pyc index 91a369f1e44c0abe6e7274334773973bc1e9e5ce..746ebf72b05dfb03b73ae52a72952fc1a556d8b6 100644 GIT binary patch delta 20 acmZ4Ow%U#RG%qg~0}$MDFy6?mpbP*#cLgZ` delta 20 acmZ4Ow%U#RG%qg~0}%Mm(%HzZpbP*zl?3kq diff --git a/Backend/src/security/services/__pycache__/security_scan_service.cpython-312.pyc b/Backend/src/security/services/__pycache__/security_scan_service.cpython-312.pyc index 53cb46d053aee0924d872962fce9bfdbeb4b0682..91e3db4022bd44fab4e0cadf897877b2a991364e 100644 GIT binary patch delta 20 acmaE!|2&`jG%qg~0}$MDFy6?0#~c7nuLi>a delta 20 acmaE!|2&`jG%qg~0}%Mm(%Hy;#~c7l%?618 diff --git a/Backend/src/shared/__pycache__/__init__.cpython-312.pyc b/Backend/src/shared/__pycache__/__init__.cpython-312.pyc index 20bee4880f298a8c53d0575dc2cdc1acccdd0c4b..eb31c31c1c438143302c09b714eb425aafbe77c6 100644 GIT binary patch delta 19 ZcmbQwIG>UGG%qg~0}$MDFrLUg1pqCG1h@bI delta 19 ZcmbQwIG>UGG%qg~0}$MwsWXv#3IH!h1rGoK diff --git a/Backend/src/shared/config/__pycache__/__init__.cpython-312.pyc b/Backend/src/shared/config/__pycache__/__init__.cpython-312.pyc index 24835475ff8e0e9c2e316aa36f86bd8570d3a755..865a2bf887420a5a590d7c119683d43f3b7b8afc 100644 GIT binary patch delta 19 ZcmZ3+xQvneG%qg~0}$MDFrLUg8vrhg1kC^d delta 19 ZcmZ3+xQvneG%qg~0}$MwsWXv#HUKb61tb6f diff --git a/Backend/src/shared/config/__pycache__/database.cpython-312.pyc b/Backend/src/shared/config/__pycache__/database.cpython-312.pyc index 9f479635c9ba6e9715901790bcc866fe30f80387..49a2776c182473ee3655f47b39c5f397d43b1e8e 100644 GIT binary patch delta 20 acmZ1>v_gpcG%qg~0}$MDFy6>5%LxEAl?0vu delta 20 acmZ1>v_gpcG%qg~0}$MGQrgHZ%LxEAVFZ!@ diff --git a/Backend/src/shared/config/__pycache__/logging_config.cpython-312.pyc b/Backend/src/shared/config/__pycache__/logging_config.cpython-312.pyc index a606bb5f27cea890a746ea539cbf122c4e7a6133..2c93c4471a19f3a42d7f968b9a6e285f593ab26d 100644 GIT binary patch delta 20 acmew_^r!V3UIQ3baE delta 20 acmew_^5St#)_=`7Q!`flRe#j^9q@3BKfd?g-{<>#oO91! zuJ`^rkoMionW+-}>(ENP-4&7;= z$RDeeGg{4QHd-st1vr^juHm#6)dB5beWiAl;dLCZAC^%4MF$@&2j}AC z3~HuDHgMNQv`J`@hi6dQz^RiID3#Gxv__$F;7O^e!a~eQF zfi7pcAx^W=9)T9KTuq=lP;xIZJ(`Uog0qA<_j2bx)GN@HjP`Nbj|K!<%IJPh51>JT zmaz$=oc5q0pdC{iR?hH?93P}7;*fA6RtYC!n7b0tVWGupw&^c%x{!REWQra^M+HwM z>vN2ID$sF(S{XgTX*N13P#as|DNc*fh(PTu_q0II0BxOGU=_oJ<81V*ki3SKeodgS z3$&Wiv(uE^NN%&ei{2AFbUJeeTI{J4CwN(61_0FH&S~83(uh8E5izpI(hV}5N+fo zVnVcueZUgX=R(`f>^xk1G8Aq`UkE3v1?NqFWWEFwx`l2GEA6fHdXrwa^j$aKj+LYw zSE3qxG5brK+`7Ims38^ihP+yz>J6yK-KVSh%T=2i2u_8UsjK0c3P5vwZc}wj%htx` z+RnOdO^)Wa&f4m>mVT=<;_t$m8thR+8s6&-MszhaRbN-bK^Db}w}AH3;eXAL^rs}* z>J3AZRu;>f^@Cz7rBRJZ8QhhFtfJCCrv-<@-hf9hwEEosF66d@OHZaUB>lA310_ho z+@rDEbH@}}Cpg1GbtGejTu#2u$d@;e-!cZ|GGfo_Am3z~X7oWeEL_#f$?usK*+qWN zGNo95oK-$*V> z*c%L(Q#IaCI}PShkT=Lliz5lPKb}thwWN~?ORgM=r7s;Yr0k(lr`e^QB5xH`%Dv=X zLBF{Wl9q$8flA=60wf8f62t~#C;f#c@^)eNf(CeWf;56Ofi#1(fV7hPg~d?>w-}@c z!~^05*#)v2#0TOB34nyC#El^>7{Xe(Pm4kfc1L>|Ji9^`-L z&X@*4BNbSL{(bCFQB+=|E*f)>+roF%$hh*{Xx<$qazA&;WqG{nz}?)zaV2xK=8iIW zKWFjSp2w0@Rb!Ztq}*D=xRNni@|Pqf)?O{1qtKW4Oz9)V^(HicH$DBX;)$5OK{oVR zKqDaUP>ClZ+!gVd6XGe%)9KeeliBdzghR5qA|vq{4c(0eD-1F{^jc-T>k5>C=;VT* zUhCgRt3QY$K5W-+QVaYp^ja#96J%NbMY2DXG9OCm52Ta{#gQNvyt02ng6khHGTXXP HfuHJs=aX+2 delta 2132 zcmZ9M{ZCs}7{`0sTPTD9id$kfVqN$ z&GE8{XD=~JbS_b+z}&1F{Y8!bWQ=k1m&N`8CTdJH(ZuKvdY*%v9p#5ld!NtuJomZh z9{T;%N5`|j+O#Rt!2eQDdBQ)|FK7QnijtY6)tInD!>VP)h|XXLTJ?0@0zN9u7T=+vW{B04=ar(S>?0*R2~G z+Mr#rPGR>+yB`iH_CaAg?pao@`4W5Jppw}xZvVKY_WL!ptSuk zpjel%Pe^+h2GJJdzVe+d5yL$xbqx$Di%a!fmSb+?ZzHT!D@4nqa*Z9HQLJ0oh+;<+ zTPf@@X`?WzSdXw{(o%?_Wp~Y66XWo#lB^PQKPQui;kaU}g`JRglAnkvhK3nfK$@W!kl7v2zy#uJNq)tmT<#aCF2vB zd6{v;f@1x`E=p^MCB+8BZ08hvUa^hBzNFY?vkGE@3Z8 zdzpQl-WRaLt4gL>WL}dQJ6u(4i?FXtdyREkY>7AEO(oMRGH+o3j3I|n<&fw-|Tn%)WTDo3hIIZ`(< z1MkCovs&;`{+Z;Tk4@ZieUMzrSkzcy&Kjv;-{e#i57TlZ#LC8U?<3yiT<+Iez{8hP z0WW^5LR521Ztm9O@$j)wtim4|8X1P6MhwK#Ii?NY?hZ{GsF$7JGH<5%tC`HZ|GGw^ z?DK6UoIh{#k}BrNFD83gTmBUBvMbgBR%o?ljbjhO;h z+siRLgW=4cp~$%2Olg#g)pQ=!0%DP!DXk-M_G#(XEwVdZLUjRgk^NNK#y6^_tdY=U zyll#tF~aK|u5P-({;2TrrPc09mm9OSh%`hUVh5rDf$yFM5KZi^+eTX0FK%Z+2NpUJ zU5H-9A;kK|Fi)i?q2u)tLJ%yMfyiZ+deyzNw$p{-E_-!Wh1RdwZBN>tbic zof)b{#48*rGw8$PA(ttYAu@v_vC#Tz++pSA{q4&$-{Pe^Nt@qD_+fMeT3u_{2CM5+ q|99X&E&h=xj7RiF`XO5m6lAxUNcoE=ely_buU+huK#_+34gUaS8`w1f diff --git a/Backend/src/shared/config/settings.py b/Backend/src/shared/config/settings.py index 3b2b739a..f2df89bb 100644 --- a/Backend/src/shared/config/settings.py +++ b/Backend/src/shared/config/settings.py @@ -23,6 +23,9 @@ class Settings(BaseSettings): JWT_REFRESH_TOKEN_EXPIRE_DAYS: int = Field(default=3, description='JWT refresh token expiration in days (reduced from 7 for better security)') MAX_LOGIN_ATTEMPTS: int = Field(default=5, description='Maximum failed login attempts before account lockout') ACCOUNT_LOCKOUT_DURATION_MINUTES: int = Field(default=30, description='Account lockout duration in minutes after max failed attempts') + PASSWORD_EXPIRY_DAYS: int = Field(default=0, description='Password expiry in days (0 = no expiry, 90 = 90 days)') + PASSWORD_HISTORY_COUNT: int = Field(default=5, description='Number of previous passwords to prevent reuse (0 = disabled)') + PASSWORD_MIN_AGE_DAYS: int = Field(default=1, description='Minimum days before password can be changed again (0 = no minimum)') ENCRYPTION_KEY: str = Field(default='', description='Base64-encoded encryption key for data encryption at rest') CLIENT_URL: str = Field(default='http://localhost:5173', description='Frontend client URL') CORS_ORIGINS: List[str] = Field(default_factory=lambda: ['http://localhost:5173', 'http://localhost:3000', 'http://127.0.0.1:5173'], description='Allowed CORS origins') diff --git a/Backend/src/shared/middleware/__pycache__/__init__.cpython-312.pyc b/Backend/src/shared/middleware/__pycache__/__init__.cpython-312.pyc index 5d59f3c06bdf26b30dca03150ddf1c354e0bea60..cf43e0d9055f45452b66022652304ae11adee26c 100644 GIT binary patch delta 19 ZcmZ3*xQdbcG%qg~0}$MDFrLUg9{?{O1la%p delta 19 ZcmZ3*xQdbcG%qg~0}$MwsWXv#J^(P@1uy^r diff --git a/Backend/src/shared/middleware/__pycache__/api_versioning.cpython-312.pyc b/Backend/src/shared/middleware/__pycache__/api_versioning.cpython-312.pyc index aba68c1f3ffb5dd8755243c645ca243ee9b8af83..624fdcc813b3011374440c773dc4910b60157174 100644 GIT binary patch delta 20 acmeAW?GWWY&CAQh00g%jj5l)EasdD`0tCeX delta 20 acmeAW?GWWY&CAQh00bPzbT)F=asdD@MFesH diff --git a/Backend/src/shared/middleware/__pycache__/cookie_consent.cpython-312.pyc b/Backend/src/shared/middleware/__pycache__/cookie_consent.cpython-312.pyc index 4339a78b8d34f4949b0f0d9253540a8bae2eb663..1f8f596ed44a5993a3660600bede4784495b12e5 100644 GIT binary patch delta 20 acmX>gb3lgsG%qg~0}$MDFy6>*$_D^C!UX>S delta 20 acmX>gb3lgsG%qg~0}!~)(%Hyu$_D^AuLQmT diff --git a/Backend/src/shared/middleware/__pycache__/error_handler.cpython-312.pyc b/Backend/src/shared/middleware/__pycache__/error_handler.cpython-312.pyc index 37f2996912ddafdd578e322d903d014c812ec015..f49123c30bd61a2a67841fa5984cf8e452e21672 100644 GIT binary patch delta 19 ZcmeCS>$c-Q&CAQh00g%jj2Cjt0{}9O1f>7~ delta 19 ZcmeCS>$c-Q&CAQh00jHj>n!A!2LLnr1o8j? diff --git a/Backend/src/shared/middleware/__pycache__/request_id.cpython-312.pyc b/Backend/src/shared/middleware/__pycache__/request_id.cpython-312.pyc index 25e02fecdd3d456a00262e55a52f504ac15d962a..2107c11168f954b8f0cffe430942acf3381ed565 100644 GIT binary patch delta 20 acmaDX`dF0vG%qg~0}$MDFy6?0g9`vaItA7M delta 20 acmaDX`dF0vG%qg~0}!~)(%Hy;g9`vYCk2%N diff --git a/Backend/src/shared/middleware/__pycache__/request_size_limit.cpython-312.pyc b/Backend/src/shared/middleware/__pycache__/request_size_limit.cpython-312.pyc index 178ce627d74e2750f4aeb437ee38697338d6719f..10fb20c12ee4a4b730929936e56719c81cc35af2 100644 GIT binary patch delta 20 acmdljx?7a{G%qg~0}$MDFy6?$feQdR`UPG9 delta 20 acmdljx?7a{G%qg~0}!~)(%HzpfeQdP=LH=A diff --git a/Backend/src/shared/middleware/__pycache__/timeout.cpython-312.pyc b/Backend/src/shared/middleware/__pycache__/timeout.cpython-312.pyc index d98056386738d96bc9a52ec287e34b30e0ac2082..4e542960933d3d1550dca3bf08dddad33d08dda7 100644 GIT binary patch delta 20 acmdnUzmcE&G%qg~0}$MDFy6?$j2!?sj|DLR delta 20 acmdnUzmcE&G%qg~0}!~)(%Hzpj2!?qd<5_S diff --git a/Backend/src/shared/utils/__pycache__/__init__.cpython-312.pyc b/Backend/src/shared/utils/__pycache__/__init__.cpython-312.pyc index b3ad74e655f44b8a8897b4f0f6175ba88ca3229f..d33c9467e1823407f145d7584262f5029034fe8d 100644 GIT binary patch delta 19 ZcmZ3=xRjCmG%qg~0}$MDFrLUg3ji)=1j+ya delta 19 ZcmZ3=xRjCmG%qg~0}$MwsWXv#7633M1t95!3+R17X)zt delta 20 acmZ3?wwR6kG%qg~0}!xSDsAMJU+>K|Q7>rHUn*;}2 z;Si*%hf2{LsD#o>E478RMYW2eKBTCJ_Q0VVQ3)w3RV5CUdU8uusa)EB)*HtdE{rwb z{{KIZ|DT!f^P}(4Z;w&+eVfh9K#NW9i~AEx)eUH6smq6UFX6yKt!Ttn=w{Iv3X>j0Wh9(3_w)LvMlJDsID0u?D-uTFi^A zSknmQ;5Lz6(9CuS8r5J&X?SPJdZjdKg3UUi({gv>u0_Mh_N^jtU#S2$B=f+$U8R*< z8JwkkP2#It+tuT4*sjjR;60^ndSDBhlBP3bFO1h`9G<=T6%=!!r(~C~Z@jNX$!w;usB>wPaA)ep^7)xS0O_Dp3rekql@Io0q zq~AG9Mj9Fqw(+MEqL3DO^|Tp2Ll=tbLZP^jpUCjhL_B&ao}A?6DUqL;k>ym9pAZwN zIa2G2ppVG3Yo%Vx{A|*0{`YF>AQUWQAg!-g=!eWbaGfcz`nsBek*T%6Gh1LdhofL+c62HBE^yo>N9h_;hU3c6#R6lxgbanY#%;#y zNB`c>G7+`RCMrRDt#ircsP)@n%UJW&90pc5>7PO%a8PwGWjB{=pl7+nuW6`Xz$ zl$Dv;_2AqShOy@8M1zVVn`O&G(rffUrldF*Q4bZ>s02}lu|QYp{4IT~GCs4Fd{$Y_ zEn9LrS>rRXl5PPlr_buiG-vOt+GMT9bz{y@#&sQV+@NyZT*h^Bt;*bvEfp-cma*Ix z5_~GlTQ#n!Zyploo@Y7-OrQU#BMpo`_i(MN>29A-}d!t=I#nv z$W!q&4_EgR(%5ZQc?96=C9SS7`h?1)K`Z_Fs<)(a^JS$%zH!!*E1gG4v&*E4Vlzv{ z1$lYtFg#PG9Jn$$9HrwGn&2Q-JWEj&9Ys+T?-aj49GI%(IIOx4J^cefr8snsW2nF} z$I%(IcCEnZ!pH&cON(Vl6N`VXWvyE2JO$+Uv!|#A!fcd^#Sb54P35g7bpx-7^W~n!AW71touIa;$Z4g{>B?0=sAIg$BAd4nTvoq{}%}yvXer$EuR?B zvuG?o{brMio1n9zWGQ&ibCQ}t3KuC{qL84VCRMA^QvDnBph?mZ+J#~y6gq2=VAgE@ z=|7$EW*&w`5#9Quswb-J;spQB>f z)IUJ=oh5ol8@hN>-Y~=xDM8-QPoz=_iJn=a6-bNZ>+vS@dtlOkjr4cq*YWE|T2YR@ x+fiWXcQsu6u7#hdexbh=1$3+GXh657js|qfxgk0YjIp=rJb1kR{CMO)^gkDCXMq3! delta 734 zcmY+9-%C?r7{|}M&KYNGTj|u?RxVF7dv(@@kPAk$Us~x_8%uKN!P$F;%efOrBeGx$ zM$p}Op^Gl;ItXuGkgg*l=w4zFDE?cc1+HOakBiey;>? z>|MOPJyQ>KleKz(k_^<@wVK~hnb%NDGHctA3qFtZ|HlSd5IQ=*I>EZYPJwlUg$zFn z8vzzEPO#I4%Ls%(f}L@^9`IB<7j<%H9k2JGT7wY}EYra7j2Jt&p%hNGj$m=;fEbAN zLErgm`-k| delta 20 acmZ2uwZ@A3G%qg~0}#B=(cj3eC<_2Ra0N>M diff --git a/Backend/src/shared/utils/__pycache__/mailer.cpython-312.pyc b/Backend/src/shared/utils/__pycache__/mailer.cpython-312.pyc index d301d46f673b48629b652c2988fb930210a7b1c7..db50c40de5699dcb620266310388bfdfc72cfd7a 100644 GIT binary patch delta 20 acmexr_|=g6G%qg~0}$MDFy6@hN&)~!2nJFB delta 20 acmexr_|=g6G%qg~0}!~)(%H!UN&)~x^#&0D diff --git a/Backend/src/shared/utils/__pycache__/request_helpers.cpython-312.pyc b/Backend/src/shared/utils/__pycache__/request_helpers.cpython-312.pyc index 66fd6248592499284d0a342618c1f6d8279e9a7b..4a49ccb0f5ae92e034e800289758a844acbdde95 100644 GIT binary patch delta 20 acmdnOwuO!RG%qg~0}$MDFy6?m$qWEBzXYTJ delta 20 acmdnOwuO!RG%qg~0}#~T)!4|b$qWECxdht) diff --git a/Backend/src/shared/utils/__pycache__/response_helpers.cpython-312.pyc b/Backend/src/shared/utils/__pycache__/response_helpers.cpython-312.pyc index 33fc08a03d1f634c09dfefbdcdf4ddaf6ddbee84..b5231bab3a2cea3bae58ba9fc247dd3aa231adf3 100644 GIT binary patch delta 20 acmdlfv{Q)tG%qg~0}$MDFy6?m#|Z#9Jp|DJ delta 20 acmdlfv{Q)tG%qg~0}#~R)!4|b#|Z#AFa-wy diff --git a/Backend/src/shared/utils/__pycache__/role_helpers.cpython-312.pyc b/Backend/src/shared/utils/__pycache__/role_helpers.cpython-312.pyc index e3be2ac2e672edd8ece7294e7d5ac0deae5a47a8..fa11ae41db1041146f9b1e933af43c4fa9319f77 100644 GIT binary patch delta 294 zcmccYwZn_|G%qg~0}!NC8)t6V$oofZvX4aim)@)|q0Y#e1ype#h>Ir+NqA3g zkk*{MT=FSn&g5RHJ&gI2y`-`GfbA1m744*bB(cdvV`n?t_q+aJ0k-_QQ2fh zxdmKRKrSzg>puCDTs&6|P)Hadv`9XUs}3k62@)y>YLc65pb){BH`!i5bn-j}X|4vK zq&!HnVDe#wOFkfX73F}4d=LS0L{TY-0NGpwvabkaLlMZ#q6QEV4 str: company_name = company_settings.get("company_name") or "Hotel Booking" return get_base_template(content, f"Password Reset - {company_name}", reset_url.split('/reset-password')[0] if '/reset-password' in reset_url else "http://localhost:5173") +def email_verification_template(verification_url: str, name: str) -> str: + content = f""" +

+

Verify Your Email Address

+

+ Hi {name}, +

+

+ Thank you for registering! Please verify your email address by clicking the button below. +

+
+

+ If the button doesn't work, copy and paste this link into your browser:
+ {verification_url} +

+

+ This link will expire in 24 hours for security reasons. +

+

+ If you did not create an account, please ignore this email. +

+
+ """ + company_settings = _get_company_settings() + company_name = company_settings.get("company_name") or "Hotel Booking" + return get_base_template(content, f"Verify Your Email - {company_name}", verification_url.split('/verify-email')[0] if '/verify-email' in verification_url else "http://localhost:5173") + +def email_changed_verification_template(verification_url: str, name: str, new_email: str) -> str: + content = f""" +
+

Verify Your New Email Address

+

+ Hi {name}, +

+

+ You have requested to change your email address to {new_email}. Please verify this new email address by clicking the button below. +

+ +

+ If the button doesn't work, copy and paste this link into your browser:
+ {verification_url} +

+

+ This link will expire in 24 hours for security reasons. +

+

+ If you did not request this change, please contact us immediately to secure your account. +

+
+ """ + company_settings = _get_company_settings() + company_name = company_settings.get("company_name") or "Hotel Booking" + return get_base_template(content, f"Verify Your New Email - {company_name}", verification_url.split('/verify-email')[0] if '/verify-email' in verification_url else "http://localhost:5173") + def password_changed_email_template(email: str) -> str: content = f"""
diff --git a/Backend/src/shared/utils/role_helpers.py b/Backend/src/shared/utils/role_helpers.py index c0d7bc3a..29a29c92 100644 --- a/Backend/src/shared/utils/role_helpers.py +++ b/Backend/src/shared/utils/role_helpers.py @@ -210,10 +210,10 @@ def user_has_permissions(user: User, db: Session, permissions: list[str]) -> boo def can_access_all_payments(user: User, db: Session) -> bool: """ Check if user can see all payments. - - Admins and any accountant family role may view all. + - Admins, staff, and any accountant family role may view all. """ role_name = get_user_role_name(user, db) - if role_name == "admin": + if role_name in {"admin", "staff"}: return True if is_accountant(user, db): return True diff --git a/Backend/src/system/models/__pycache__/approval_workflow.cpython-312.pyc b/Backend/src/system/models/__pycache__/approval_workflow.cpython-312.pyc index b21fca354c122ac6a0ba889a6c253a527c944d8c..56a3ef79a929e57e3e899ef020c49d0fa51fc76b 100644 GIT binary patch delta 20 acmX>uc3h16G%qg~0}$MDFy6>*!wmpB{{;mA delta 20 acmX>uc3h16G%qg~0}$LhuCtNbh8qArA_a*6 diff --git a/Backend/src/system/models/__pycache__/system_settings.cpython-312.pyc b/Backend/src/system/models/__pycache__/system_settings.cpython-312.pyc index b29ab2f8d95dc50cd85f6d7cc92ad3380384907b..44b350dc64b98ffa6d5a9c68ab547fce0836970a 100644 GIT binary patch delta 20 acmaFC`GS-CG%qg~0}$MDFy6?0mjwVnOa;dP delta 20 acmaFC`GS-CG%qg~0}!~)(%Hy;mjwVlIR%CQ diff --git a/Backend/src/system/models/__pycache__/workflow.cpython-312.pyc b/Backend/src/system/models/__pycache__/workflow.cpython-312.pyc index e670a2e58153615d5a45795c95b77457d1d72d52..e9a9ce6cc9d224be5b38695225b4456d8b916e72 100644 GIT binary patch delta 20 acmca*e#@NuG%qg~0}$MDFy6?0UK#*Hs|FAN delta 20 acmca*e#@NuG%qg~0}!~)(%Hy;UK#*Fm<7)O diff --git a/Backend/src/system/routes/__pycache__/__init__.cpython-312.pyc b/Backend/src/system/routes/__pycache__/__init__.cpython-312.pyc index e4fd42fc11382d89c5824902e63162f934c7c889..e3ee97060e7ad0a6774906ce6820c6765000323d 100644 GIT binary patch delta 20 acmX@de2$s>G%qg~0}$MDFy6?0m=ORvVFhXc delta 20 acmX@de2$s>G%qg~0}yz9)!E2>m=ORvj0K1Q diff --git a/Backend/src/system/routes/__pycache__/approval_routes.cpython-312.pyc b/Backend/src/system/routes/__pycache__/approval_routes.cpython-312.pyc index fb3c18ecc6735731c71b3b3a149341e93b8c6b3b..4dab27e67824a5922157944a3e4a2c095482d38c 100644 GIT binary patch delta 20 acmaFr^VEm?G%qg~0}$MDFy6==r3L^;Vg=>^ delta 20 acmaFr^VEm?G%qg~0}yOFqqC7aN(}%>Zw5mE diff --git a/Backend/src/system/routes/__pycache__/backup_routes.cpython-312.pyc b/Backend/src/system/routes/__pycache__/backup_routes.cpython-312.pyc index 797975e36da9919e69edf84dacdd229aa930fa50..3604b2bd18b708f8398da58f90b458c6171f07b9 100644 GIT binary patch delta 20 acmZ2!w$hCIG%qg~0}$MDFy6>5Ck+5P-vs*r delta 20 acmZ2!w$hCIG%qg~0}x1k)7i)^Ck+5Ozy#_5 diff --git a/Backend/src/system/routes/__pycache__/system_settings_routes.cpython-312.pyc b/Backend/src/system/routes/__pycache__/system_settings_routes.cpython-312.pyc index 9837915f1d58f354a9b4d759de145bc7b3fa98a9..8bc550029166ecb7d2bec63ff49a24c28f26d06b 100644 GIT binary patch delta 25 fcmbRJk7f2h7Vgu$yj%=GaLd8Ck$WpQqkugCZ*~VB delta 25 fcmbRJk7f2h7Vgu$yj%=Ga4g!ek$WpQqkugCZ;=Nh diff --git a/Backend/src/system/routes/__pycache__/task_routes.cpython-312.pyc b/Backend/src/system/routes/__pycache__/task_routes.cpython-312.pyc index 0a2ad1f53c0c368f306e52eb594643a963b41d26..3e6ac6371fa862c97aab535da4e20b2e81d8606b 100644 GIT binary patch delta 22 ccmex8kMZ|BM()$Ryj%=GaLd7XBX@y609$ni_W%F@ delta 22 ccmex8kMZ|BM()$Ryj%=G;5$oaBX@y609lg;y#N3J diff --git a/Backend/src/system/routes/__pycache__/workflow_routes.cpython-312.pyc b/Backend/src/system/routes/__pycache__/workflow_routes.cpython-312.pyc index f5c4458759686cc8071da7fadeca1ec43ea6607c..22661157af67ea48158068f89b4752de8cf9eafe 100644 GIT binary patch delta 20 acmdm0x~r7?G%qg~0}$MDFy6?$-U*9F}G delta 20 acmaFv_S}v8G%qg~0}$LhuCtLlMi~G}`UYVD diff --git a/Backend/src/system/services/__pycache__/backup_service.cpython-312.pyc b/Backend/src/system/services/__pycache__/backup_service.cpython-312.pyc index de4faaf9dd08e9a2cc341f43ec7970e6106f528e..bda64e1e9aa60fe736b376439ee6510f511fae8e 100644 GIT binary patch delta 20 acmZ1;zC4`!G%qg~0}$MDFy6>LM;ib@Lj}hG delta 20 acmZ1;zC4`!G%qg~0}!k~t+SDPjy3>7H3lF6 diff --git a/Backend/src/system/services/__pycache__/workflow_service.cpython-312.pyc b/Backend/src/system/services/__pycache__/workflow_service.cpython-312.pyc index dfdd7ddc26184a2b89107abfc4d9dcaa8890d814..fb62c73690d1b5b30825f7c1fd0822b4e973dd1a 100644 GIT binary patch delta 20 acmexX@~wpXG%qg~0}$MDFy6?WZ3O^Nz6N~& delta 20 acmexX@~wpXG%qg~0}%Mm(%HzJZ3O^L+y+Ac diff --git a/Backend/venv/lib/python3.12/site-packages/PIL/__pycache__/AvifImagePlugin.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/PIL/__pycache__/AvifImagePlugin.cpython-312.pyc index e49fbd2629d813ac05d86fc350ec560222261b04..ce3659519bedfccdb88c6fde375d8ad9c1b264e0 100644 GIT binary patch delta 27 hcmbOhH7$z!G%qg~0}$MDFy6>Lk(u$<=DEz3ngDQZ2uJ_` delta 27 hcmbOhH7$z!G%qg~0}!xC>u%(p$jta_^IYaiO#ow12WJ2P diff --git a/Backend/venv/lib/python3.12/site-packages/PIL/__pycache__/BlpImagePlugin.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/PIL/__pycache__/BlpImagePlugin.cpython-312.pyc index 62784cda1dfd1c6b570d44ab3220c66d112e4888..a2f7bcb27e81d62b94830790087310d103c5d459 100644 GIT binary patch delta 22 ccmZ3mhjGCkM()$Ryj%=GaLd7XBe!TA08q^aF#rGn delta 22 ccmZ3mhjGCkM()$Ryj%=Gz#^@?ky|tl07>@+FaQ7m diff --git a/Backend/venv/lib/python3.12/site-packages/PIL/__pycache__/BmpImagePlugin.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/PIL/__pycache__/BmpImagePlugin.cpython-312.pyc index 706bf52c225d11f5ae546959dfe30ca9674e7d11..31b0f6826c526de21a2e376ecd34fea2dc0e56cf 100644 GIT binary patch delta 22 ccmbQx%Q&Hzk^3|+FBbz4+;TA9$ldA&07u*g3jhEB delta 22 ccmbQx%Q&Hzk^3|+FBbz4ut@7}YcVG%qg~0}$MDFy6?W#03CArUh~U delta 20 acmaDW@>YcVG%qg~0}!xC>u%&u;sO9U&;)S+ diff --git a/Backend/venv/lib/python3.12/site-packages/PIL/__pycache__/CurImagePlugin.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/PIL/__pycache__/CurImagePlugin.cpython-312.pyc index ba10f26bf151e247fd5fe1d4cda46744e184521d..fe06af0d6c9b4ea52bacc8de5109562fa1c15ad8 100644 GIT binary patch delta 20 acmdlev{8urG%qg~0}$MDFy6?m#t8s6{RFuH delta 20 acmdlev{8urG%qg~0}!xC>u%&$;{*UOCj+nc211@G%qg~0}$MDFy6@R%nblM7X=ys delta 20 acmX>nc211@G%qg~0}!xC>u%(B<^}*YK?E59 diff --git a/Backend/venv/lib/python3.12/site-packages/PIL/__pycache__/DdsImagePlugin.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/PIL/__pycache__/DdsImagePlugin.cpython-312.pyc index bc24199d1806c36eac30d164797d6e449aa3d0c2..3e94aa8b43685619a0e2bcd881ef5b2de4f2321d 100644 GIT binary patch delta 29 jcmeykkMZL^M()$Ryj%=GaLd7XBe$9<Ln~(9<=H+~A^#O$v32XoW delta 27 hcmcaobESs+G%qg~0}!xC>u%(p&Byp_^K!nm`T%$J2#Wv! diff --git a/Backend/venv/lib/python3.12/site-packages/PIL/__pycache__/ExifTags.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/PIL/__pycache__/ExifTags.cpython-312.pyc index 5b4a88c229fa8d45cc6355e05305d1586baa2269..738487e40429a58ee600d28137edf2e3d003b0ed 100644 GIT binary patch delta 20 acmZ1xwIYi9G%qg~0}$MDFy6>5s|x@>*#%Mn delta 20 acmZ1xwIYi9G%qg~0}!xC>u%(h)dc`K0|Ze3 diff --git a/Backend/venv/lib/python3.12/site-packages/PIL/__pycache__/FitsImagePlugin.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/PIL/__pycache__/FitsImagePlugin.cpython-312.pyc index c97a4cbf0bf8769137d81f9877d398ee5d58a399..7c09c75d8a24a410f3d88766fa71f700868faff7 100644 GIT binary patch delta 20 acmbQCKSQ7UG%qg~0}$MDFy6@BD-HlSHw88T delta 20 acmbQCKSQ7UG%qg~0}!xC>u%)k6$bz@VFWb* diff --git a/Backend/venv/lib/python3.12/site-packages/PIL/__pycache__/FliImagePlugin.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/PIL/__pycache__/FliImagePlugin.cpython-312.pyc index 2bdeffe01f626fae63fcb6d89dd707bf6b85b9d4..7f6e9f6a44cddc8f13066368ec734a70e5b5dfaa 100644 GIT binary patch delta 20 acmeCO=(6BG&CAQh00g%jj5l)smj(bhPX(d? delta 20 acmeCO=(6BG&CAQh00b=3x*NIwO9KEgc?6*V diff --git a/Backend/venv/lib/python3.12/site-packages/PIL/__pycache__/FpxImagePlugin.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/PIL/__pycache__/FpxImagePlugin.cpython-312.pyc index 2ff1f758dc049be1ca1c6c4464e09db60660fc2c..544a746fd12b9d6bcbec76a57e504984da5d345e 100644 GIT binary patch delta 20 acmZ2&v)YFHG%qg~0}$MDFy6?mAO`?E3Iz}V delta 20 acmZ2&v)YFHG%qg~0}!xC>u%&$kOKfUGz1R- diff --git a/Backend/venv/lib/python3.12/site-packages/PIL/__pycache__/FtexImagePlugin.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/PIL/__pycache__/FtexImagePlugin.cpython-312.pyc index 0940ce30479f373a66b99441249426b717e2b126..75d2d2c5ae57d972723ccac9ec761020e6e247a3 100644 GIT binary patch delta 20 acmdm|xlfb(G%qg~0}$MDFy6?$Sp)z*Oa++$ delta 20 acmdm|xlfb(G%qg~0}!xC>u%)UECK*Fb_AFJ diff --git a/Backend/venv/lib/python3.12/site-packages/PIL/__pycache__/GbrImagePlugin.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/PIL/__pycache__/GbrImagePlugin.cpython-312.pyc index 44790ac89497effcc211af24e773bdce78f80763..16d32dba9f4c1107c6b48114f61a09d9a0470d13 100644 GIT binary patch delta 20 acmaDZ^IV4eG%qg~0}$MDFy6==!v_FB+68m~ delta 20 acmaDZ^IV4eG%qg~0}!xC>u%(Z;R66V1O#&c diff --git a/Backend/venv/lib/python3.12/site-packages/PIL/__pycache__/GifImagePlugin.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/PIL/__pycache__/GifImagePlugin.cpython-312.pyc index 0904ccb598e5c3f572be88a34c9a4fd1f6f1a50d..70e5b8e5f3983dea78dee0ad814be5b1aaa32d9e 100644 GIT binary patch delta 22 ccmX^AnCbjuChpU`yj%=GaLd7XBlnSw0AL#j;Q#;t delta 22 ccmX^AnCbjuChpU`yj%=Gz#^@?k^9I-09i!_-~a#s diff --git a/Backend/venv/lib/python3.12/site-packages/PIL/__pycache__/GimpGradientFile.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/PIL/__pycache__/GimpGradientFile.cpython-312.pyc index 730b8437725e6fac65f1441dd78241f75a2d58e3..b18043562bd0dbb4cf0741588d64c6d84ba9d2c9 100644 GIT binary patch delta 20 acmZ3gy;Pg~G%qg~0}$MDFy6>LOB4V(tp!s6 delta 20 acmZ3gy;Pg~G%qg~0}!xC>u%(pB?uC@G%qg~0}$MDFy6?$i3uC@G%qg~0}!xC>u%)U#03B|bOd7n diff --git a/Backend/venv/lib/python3.12/site-packages/PIL/__pycache__/GribStubImagePlugin.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/PIL/__pycache__/GribStubImagePlugin.cpython-312.pyc index 86a4fe6062519ba1c771f897bb73bc0af16ae0f1..2adfa1b43b7b01e82a1cfa455454fbf761d6eb56 100644 GIT binary patch delta 20 acmX>qdQ_DAG%qg~0}$MDFy6?$iwgidiUoWC delta 20 acmX>qdQ_DAG%qg~0}!xC>u%)U#RUK~v;=zq diff --git a/Backend/venv/lib/python3.12/site-packages/PIL/__pycache__/Hdf5StubImagePlugin.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/PIL/__pycache__/Hdf5StubImagePlugin.cpython-312.pyc index 0aea02062202b8c423324079551f330220c41ba6..30a7ace658950586e0a8dac654ab5bc5d77ba611 100644 GIT binary patch delta 20 acmew?@>zuYG%qg~0}$MDFy6?W!36+8mIZ_W delta 20 acmew?@>zuYG%qg~0}!xC>u%)E-~s?TzyyN; diff --git a/Backend/venv/lib/python3.12/site-packages/PIL/__pycache__/IcnsImagePlugin.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/PIL/__pycache__/IcnsImagePlugin.cpython-312.pyc index 19cf49c6ba9f29bb6bb0e0e592439ac7fabe25f7..c9cf4273c08d4fdde48b970b7bc64077220daf30 100644 GIT binary patch delta 29 jcmX@z%y_z)k^3|+FBbz4+;TA9$jxHQcx$tO?QRwTg9ZqF delta 29 jcmX@z%y_z)k^3|+FBbz4ut@7}u%)UX$=5Eg#~Q@ diff --git a/Backend/venv/lib/python3.12/site-packages/PIL/__pycache__/ImImagePlugin.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/PIL/__pycache__/ImImagePlugin.cpython-312.pyc index cfbc175dc6d806b67232b06077955ffbee598acf..190732de3474d0034b98f59df12c05b6985811cb 100644 GIT binary patch delta 20 acmZ3Rwlu%&$G6n!Ufdqa4 diff --git a/Backend/venv/lib/python3.12/site-packages/PIL/__pycache__/Image.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/PIL/__pycache__/Image.cpython-312.pyc index 1327a106b6812800098f48944f94f32725268331..3b725ace77e115e210364b68ef018dd506b3de2e 100644 GIT binary patch delta 28 icmeCY#?^U^i~BS$FBbz4+;T8(u%(}qYVHu%)UYXAU10tG?< diff --git a/Backend/venv/lib/python3.12/site-packages/PIL/__pycache__/ImageDraw.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/PIL/__pycache__/ImageDraw.cpython-312.pyc index 0966f4094a5c1a1064127ac23497d455a91cd199..4d56c7a6494a01c1a7e4012bd7363fb8b372a8a2 100644 GIT binary patch delta 22 ccmaF2mg(JEChpU`yj%=GaLd7XBlqKJ09^YAw*UYD delta 22 ccmaF2mg(JEChpU`yj%=Gz#^@?k^Av909GXiwg3PC diff --git a/Backend/venv/lib/python3.12/site-packages/PIL/__pycache__/ImageFile.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/PIL/__pycache__/ImageFile.cpython-312.pyc index 9564f464091d37c0602860ae4130904da0251cb0..fa530f2449c2e5ebc9c0f8d2f2cffc24f934e842 100644 GIT binary patch delta 22 ccmdlrjcM03ChpU`yj%=GaLd7XBe#Ax08g_9VgLXD delta 22 ccmdlrjcM03ChpU`yj%=Gz#^@?kz2nT07%^hVE_OC diff --git a/Backend/venv/lib/python3.12/site-packages/PIL/__pycache__/ImageFont.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/PIL/__pycache__/ImageFont.cpython-312.pyc index 087ceae1acea319b2cf99ed32244803fd3251881..ba3ae349622b0a8a30f7901a57351c8ccf2492f1 100644 GIT binary patch delta 25 fcmbO;nPtvo7Vgu$yj%=GaLd8Ck$WpQ<3vsXU7`k+ delta 25 fcmbO;nPtvo7Vgu$yj%=Gz#^^N$i0=DaUv%GQ^^IC diff --git a/Backend/venv/lib/python3.12/site-packages/PIL/__pycache__/ImageMath.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/PIL/__pycache__/ImageMath.cpython-312.pyc index 0a651be1a8b808b35ab4f1e359e2a9c04095c771..131747db5a1c3d800135b7f67e669e215cb74258 100644 GIT binary patch delta 20 acmexW@T-9PG%qg~0}$MDFy6?WZvg;L%m#k| delta 20 acmexW@T-9PG%qg~0}!xC>u%)Ew*UZ0_62?b diff --git a/Backend/venv/lib/python3.12/site-packages/PIL/__pycache__/ImageMode.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/PIL/__pycache__/ImageMode.cpython-312.pyc index de57bf6200fe789ca5322debf3b81fcd88caaf68..0f98b98b265e7abe8031a9a387e389a3c9a90e9f 100644 GIT binary patch delta 20 acmbO(GF^oGG%qg~0}$MDFy6?`!vz2{HUw}0 delta 20 acmbO(GF^oGG%qg~0}!xC>u%)c;Q|0GU;}Re diff --git a/Backend/venv/lib/python3.12/site-packages/PIL/__pycache__/ImageOps.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/PIL/__pycache__/ImageOps.cpython-312.pyc index 0502a130e14fa538a6a1b1b7a445a7040e770869..5ae7c81fc01c782657e4859f084dee3be0e8b413 100644 GIT binary patch delta 22 ccmdn}mT~u6M()$Ryj%=GaLd7XBlm_f0A1w=d;kCd delta 22 ccmdn}mT~u6M()$Ryj%=Gz#^@?k$XcK09OwNdjJ3c diff --git a/Backend/venv/lib/python3.12/site-packages/PIL/__pycache__/ImagePalette.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/PIL/__pycache__/ImagePalette.cpython-312.pyc index f9cae4864928225d960ef9543a3420127da38834..c651b28d8dfeb7a4d18602478550c072f8fc9706 100644 GIT binary patch delta 40 qcmeB-?~La@&CAQh00g%jj5l)I%JAJ{u%)srWC#FGMFwR6 delta 20 acmeyH^f!t7G%qg~0}!xC>u%&OG6VoeZv|uk diff --git a/Backend/venv/lib/python3.12/site-packages/PIL/__pycache__/ImtImagePlugin.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/PIL/__pycache__/ImtImagePlugin.cpython-312.pyc index 98959057bf61bd81571bf9cd2444452e48e31455..a607797a22983de2e0f97c0bbb560bf8701db9f0 100644 GIT binary patch delta 20 acmew&{6(1iG%qg~0}$MDFy6@hk`n+znFa&^ delta 20 acmew&{6(1iG%qg~0}!xC>u%(J$q4{E!vzBX diff --git a/Backend/venv/lib/python3.12/site-packages/PIL/__pycache__/IptcImagePlugin.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/PIL/__pycache__/IptcImagePlugin.cpython-312.pyc index 1cd71b21200326e104c2d36eff44ecdca3e34128..b829d9547793fd55372332f80f3edc90a8fe16a5 100644 GIT binary patch delta 20 acmbPZKgXW?G%qg~0}$MDFy6>LQ62z09|dXv delta 20 acmbPZKgXW?G%qg~0}!xC>u%(pC=UQMNd##C diff --git a/Backend/venv/lib/python3.12/site-packages/PIL/__pycache__/Jpeg2KImagePlugin.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/PIL/__pycache__/Jpeg2KImagePlugin.cpython-312.pyc index 5560e5163ad39c274e9ed4f7506b49a0d0af2d2c..3ef31ddfde14a53d11370e1055c2f0037c7623db 100644 GIT binary patch delta 29 jcmaFR$M~R+k^3|+FBbz4+;TA9$bDO$@z&<&@|EfUlMo6J delta 29 jcmaFR$M~R+k^3|+FBbz4ut@7}_-pfX`AT&Fh4Tq7 diff --git a/Backend/venv/lib/python3.12/site-packages/PIL/__pycache__/JpegImagePlugin.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/PIL/__pycache__/JpegImagePlugin.cpython-312.pyc index edf0e0ad3d2b042fe6d1930e22afec6a6a0b1f43..57691e42bdcfdca6bb26bb26922a839e6a276630 100644 GIT binary patch delta 32 ncmbQ<$~3)|iTgA!FBbz4+;TA9$bBb(u%)UDh~iT=>*jP diff --git a/Backend/venv/lib/python3.12/site-packages/PIL/__pycache__/McIdasImagePlugin.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/PIL/__pycache__/McIdasImagePlugin.cpython-312.pyc index ad0f862250bd4b176cac1ad0d0062333663adc60..3354a71092276b96ebac2d1bcba4d8b2ea040c67 100644 GIT binary patch delta 20 acmdlaxJi)vG%qg~0}$MDFy6?$oC5$j00lV! delta 20 acmdlaxJi)vG%qg~0}!xC>u%&;&H(^1Dg-zH diff --git a/Backend/venv/lib/python3.12/site-packages/PIL/__pycache__/MicImagePlugin.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/PIL/__pycache__/MicImagePlugin.cpython-312.pyc index 1dbf0ec20271136dd66311a968996cf47fb9e082..702084aa66e2f54e8035f566e7843537cbe0162b 100644 GIT binary patch delta 20 acmcaCb6JM_G%qg~0}$MDFy6@R!3O|6x&=4@ delta 20 acmcaCb6JM_G%qg~0}!xC>u%)s-~#|Qu%&$<4JG%qg~0}$MDFy6@Rt^@!>Mg^Gw delta 20 acmccQa><4JG%qg~0}!xC>u%(BR{{V$a0HkD diff --git a/Backend/venv/lib/python3.12/site-packages/PIL/__pycache__/MspImagePlugin.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/PIL/__pycache__/MspImagePlugin.cpython-312.pyc index c021194ecd17caa66209b4b553124ecfe0c95313..72a3914f4b019c86aca27f3ee5f38ea0b3d2fe3d 100644 GIT binary patch delta 27 hcmaE(_ePKVG%qg~0}$MDFy6@B&%=0Y^K71rTmX6}2;%?% delta 27 hcmaE(_ePKVG%qg~0}!xC>u%)k=VAP{c{a~QE&y!`2m$~A diff --git a/Backend/venv/lib/python3.12/site-packages/PIL/__pycache__/PaletteFile.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/PIL/__pycache__/PaletteFile.cpython-312.pyc index 8f4e9e652b1620413393f1a7626e095da2cfd031..a58e62f01b56885f05211230069616b7374e99ca 100644 GIT binary patch delta 20 acmeC?@8;(|&CAQh00g%jj5l&Oumb=wp9H@E delta 20 ZcmeC?@8;(|&CAQh00b=3x*NG0*a0fZ1HJ$N diff --git a/Backend/venv/lib/python3.12/site-packages/PIL/__pycache__/PalmImagePlugin.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/PIL/__pycache__/PalmImagePlugin.cpython-312.pyc index 94a0d1dab996f33f0857d9436f3272cd8231ba93..a39d2e0dc83eba36d552eff4110e4b1a0914284f 100644 GIT binary patch delta 20 acmX@-e$JiyG%qg~0}$MDFy6?0SQ!9B69yCj delta 20 acmX@-e$JiyG%qg~0}!xC>u%&etPB7>Jp~g0 diff --git a/Backend/venv/lib/python3.12/site-packages/PIL/__pycache__/PcdImagePlugin.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/PIL/__pycache__/PcdImagePlugin.cpython-312.pyc index a2ea2ab3f9e9a4c7ad2c1c8f493a82465b2d9f92..a2c5ec1226729acb814d37092d9923f43089fe2b 100644 GIT binary patch delta 20 acmZ1>yh51!G%qg~0}$MDFy6>LmlFUsxdk8q delta 20 acmZ1>yh51!G%qg~0}!xC>u%(p%LxE4;{+c7 diff --git a/Backend/venv/lib/python3.12/site-packages/PIL/__pycache__/PcxImagePlugin.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/PIL/__pycache__/PcxImagePlugin.cpython-312.pyc index dee4a389be258a6841029f4c5b4256f3d542b97b..db4a54671ba2379b592729b868f2cf278a32e9b0 100644 GIT binary patch delta 20 acmexh`N5L=G%qg~0}$MDFy6@hR0aS?WCm9N delta 20 acmexh`N5L=G%qg~0}!xC>u%(JDgyvOjs;c# diff --git a/Backend/venv/lib/python3.12/site-packages/PIL/__pycache__/PdfImagePlugin.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/PIL/__pycache__/PdfImagePlugin.cpython-312.pyc index 6c46add3dc2c5df142984decb5bcff50e65b1bf7..f66fb264fb383147ade88f08199b82caf866d6b9 100644 GIT binary patch delta 20 acmbQ}Gtr0pG%qg~0}$MDFy6?`rUn2yLImmn delta 20 acmbQ}Gtr0pG%qg~0}!xC>u%&`Qv(1qYy;^4 diff --git a/Backend/venv/lib/python3.12/site-packages/PIL/__pycache__/PdfParser.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/PIL/__pycache__/PdfParser.cpython-312.pyc index eb983a9eca14a100a316ac69e2fc7170efba3d7e..bb55fd67675588f0c72c2648ebf40645dc36dd98 100644 GIT binary patch delta 43 vcmex4hxz9mX71Cxyj%=GaLd7XBew((mE&7X>H) delta 20 acmZ3-zmA{#G%qg~0}!xC>u%&;%nkrBK?ElN diff --git a/Backend/venv/lib/python3.12/site-packages/PIL/__pycache__/PngImagePlugin.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/PIL/__pycache__/PngImagePlugin.cpython-312.pyc index 63fe188e2942400df2277ba81e580159412ed002..08cd5791514345e9deeef5e7206a0ee85a18d974 100644 GIT binary patch delta 29 jcmbRLoO%9pX71Cxyj%=GaLd7XBR7XPu%)EGzS1jy#;3g diff --git a/Backend/venv/lib/python3.12/site-packages/PIL/__pycache__/PsdImagePlugin.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/PIL/__pycache__/PsdImagePlugin.cpython-312.pyc index ecf6769b89680c6487ad3f63b5047e512d71972c..d700d7b63dfc91d6d4e6275f1a6c920429c825d5 100644 GIT binary patch delta 20 acmZ1;wmgjcG%qg~0}$MDFy6>5qYVH*9|c7K delta 20 acmZ1;wmgjcG%qg~0}!xC>u%(h(FOoGNd!ay diff --git a/Backend/venv/lib/python3.12/site-packages/PIL/__pycache__/QoiImagePlugin.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/PIL/__pycache__/QoiImagePlugin.cpython-312.pyc index 2dde70f034c7ab0b1e82142ed7d4e23ac15c03e9..690a27e4cf4b8fde4d7c074e36e64c34e2c0ebc3 100644 GIT binary patch delta 20 acmdlHu_J=}G%qg~0}$MDFy6?ms{;T+5Cwez delta 20 acmdlHu_J=}G%qg~0}!xC>u%)M)d2uIIs|+G diff --git a/Backend/venv/lib/python3.12/site-packages/PIL/__pycache__/SgiImagePlugin.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/PIL/__pycache__/SgiImagePlugin.cpython-312.pyc index 9bdbaa1b147abf1857e02bd4eb88ef59d02faa12..05421d50feea52c6e8b080c00d77d91f18adf5d8 100644 GIT binary patch delta 20 acmca>ch`>lG%qg~0}$MDFy6==Bo6>YBL%Af delta 20 acmca>ch`>lG%qg~0}!xC>u%%@k_P}iO$4d{ diff --git a/Backend/venv/lib/python3.12/site-packages/PIL/__pycache__/SpiderImagePlugin.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/PIL/__pycache__/SpiderImagePlugin.cpython-312.pyc index 26eefcfe549e363dcd012ee621aff77300053af8..4bf0e81e3e6eddc801339c9fcde943624088ed69 100644 GIT binary patch delta 27 hcmdm!xF?bOG%qg~0}$MDFy6@Rro(t^bC6CJ3jlXC2r2*o delta 27 hcmdm!xF?bOG%qg~0}!xC>u%(B(_#FzIY=jq1psOn2T1?` diff --git a/Backend/venv/lib/python3.12/site-packages/PIL/__pycache__/SunImagePlugin.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/PIL/__pycache__/SunImagePlugin.cpython-312.pyc index 5baa51a1cc6c500b15d8e8709400f44350f47962..2d245e84b87dd37d3441e6da00a0e0c348f0f39b 100644 GIT binary patch delta 20 acmca3bw`T(G%qg~0}$MDFy6==$O`~I*#%Aj delta 20 acmca3bw`T(G%qg~0}!xC>u%%@LRUQC4zXf&x delta 20 acmZ2rzrddRG%qg~0}!xC>u%(pDh~iO=>&BE diff --git a/Backend/venv/lib/python3.12/site-packages/PIL/__pycache__/TiffImagePlugin.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/PIL/__pycache__/TiffImagePlugin.cpython-312.pyc index 95052453b404ef80c6373652da63902355eb3017..43e0b40ac48cf2d3fce8e52dcf88f4c95530c0be 100644 GIT binary patch delta 50 zcmex2i|yYmHty5Byj%=GaLd7XBe$Y7!ZFv~4QyIai>e%mAb7}e|n Dy~h!A delta 50 zcmex2i|yYmHty5Byj%=Gz#^@?k=xgt@z>@^^BQI#bZy diff --git a/Backend/venv/lib/python3.12/site-packages/PIL/__pycache__/TiffTags.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/PIL/__pycache__/TiffTags.cpython-312.pyc index b31fe02ed4fb3784fe404314d930e2614656313e..fa622dc777db05406081a62ba92ff5df7cf00f8f 100644 GIT binary patch delta 22 ccmbOljpM()$Ryj%=GaLd7XBR9Jj07yp#qW}N^ delta 22 ccmbOljpM()$Ryj%=Gz#^@?k(=EM06}pCq5uE@ diff --git a/Backend/venv/lib/python3.12/site-packages/PIL/__pycache__/WebPImagePlugin.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/PIL/__pycache__/WebPImagePlugin.cpython-312.pyc index 1b4732d959ab482b13c862a8d450c1ecf4834eb7..ead312ecc54b0ca92a223b8c7d240007d25d8b99 100644 GIT binary patch delta 20 acmeyE_A!n7G%qg~0}$MDFy6?WW()vK_XbM< delta 20 acmeyE_A!n7G%qg~0}!xC>u%&uGX?-gAq7eR diff --git a/Backend/venv/lib/python3.12/site-packages/PIL/__pycache__/WmfImagePlugin.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/PIL/__pycache__/WmfImagePlugin.cpython-312.pyc index 174bd2983600ec4784862ed1187237272926f239..e58c493ff73bfceb067a5a24dd0d9ef867b551f8 100644 GIT binary patch delta 20 acmaED_}Y;BG%qg~0}$MDFy6@hKmq_ocm^~8 delta 20 acmaED_}Y;BG%qg~0}!xC>u%(JAOQeAq6ISm diff --git a/Backend/venv/lib/python3.12/site-packages/PIL/__pycache__/XVThumbImagePlugin.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/PIL/__pycache__/XVThumbImagePlugin.cpython-312.pyc index ffaab72c631ccb8b9abd62f0fa89c7c9a40f5051..dcab552e403632ceef73c6ba1991b26172590b6e 100644 GIT binary patch delta 20 acmX>hazcdrG%qg~0}$MDFy6>*%LM>B-UR~y delta 20 acmX>hazcdrG%qg~0}!xC>u%(>1~&iz diff --git a/Backend/venv/lib/python3.12/site-packages/PIL/__pycache__/XpmImagePlugin.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/PIL/__pycache__/XpmImagePlugin.cpython-312.pyc index b32ce92c84bc52c203e031511d506192542b15c6..b19a92fe65513742abff7a2e09d0bcdb952d81e6 100644 GIT binary patch delta 20 acmeA-=r`a#&CAQh00g%jj5l(#NB{se^aP#& delta 20 ZcmeA-=r`a#&CAQh00b=3x*NG!BmgfS1DyZ> diff --git a/Backend/venv/lib/python3.12/site-packages/PIL/__pycache__/__init__.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/PIL/__pycache__/__init__.cpython-312.pyc index f3772970f4b22ac9d1988a14669d595739aa1c54..d1deb24a44cfa42a62032b16af488dd4b659409d 100644 GIT binary patch delta 20 acmey%|CgWpG%qg~0}$MDFy6@hi5&n#Zw3_r delta 20 acmey%|CgWpG%qg~0}!xC>u%)!#0~&FnFSO8 diff --git a/Backend/venv/lib/python3.12/site-packages/PIL/__pycache__/_binary.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/PIL/__pycache__/_binary.cpython-312.pyc index b0d684f5097e3288dbb63be845fe829b31c0f8d8..782fbdba23ba9e232d3f003811aa05476db4120a 100644 GIT binary patch delta 20 acmaDO^+t;OG%qg~0}$MDFy6?W$O`~LSp|Lo delta 20 acmaDO^+t;OG%qg~0}!xC>u%&und`_7AG%qg~0}$MDFy6>5&Bl0ZvpU;yW&mhN2TT9} delta 27 hcmX>nd`_7AG%qg~0}!xC>u%(hW@G%dS)FY;GXPsF25SHS diff --git a/Backend/venv/lib/python3.12/site-packages/PIL/__pycache__/_typing.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/PIL/__pycache__/_typing.cpython-312.pyc index 5c8070374096f7fc24d800359573309b562027c5..2caffa1d531f218db7ddd8d87dc256aeddccb0b5 100644 GIT binary patch delta 20 acmcb?bAyNbG%qg~0}$MDFy6@R%LV{EIt3p9 delta 20 acmcb?bAyNbG%qg~0}!xC>u%)sWdi^;WCR`n diff --git a/Backend/venv/lib/python3.12/site-packages/PIL/__pycache__/_util.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/PIL/__pycache__/_util.cpython-312.pyc index a3eb7298080a9603c6d10944d6798bc549670d26..daaa1ed698adb7a4504bdf73b58b03a39427ec11 100644 GIT binary patch delta 20 acmZ3(vxbNJG%qg~0}$MDFy6?m$OZs4S_GQ_ delta 20 acmZ3(vxbNJG%qg~0}!xC>u%&$WCH*$gaeuY diff --git a/Backend/venv/lib/python3.12/site-packages/PIL/__pycache__/_version.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/PIL/__pycache__/_version.cpython-312.pyc index 4ff633c643ee387fd418242cea0103b616e2f478..3ae58b9a3af65a007e94af6fc2a33a1662807236 100644 GIT binary patch delta 19 ZcmeBV>SW?R&CAQh00g%jj3;vc0{|-g1o!{| delta 19 ZcmeBV>SW?R&CAQh00b=3x)Zto0RSZ@1NQ&` diff --git a/Backend/venv/lib/python3.12/site-packages/PIL/__pycache__/features.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/PIL/__pycache__/features.cpython-312.pyc index 5d581fe26c101a8f3908c5bad9c15bec515401ef..37f2cb8e57fd52fce709dc2cf19a1a5fa0e4d162 100644 GIT binary patch delta 34 ncmX?=c`B3pG%qg~0}$MDFy6@B!pnGT^90^hSs?XI>k20T$h{0R delta 34 ncmX?=c`B3pG%qg~0}!xC>u%(3;br`_c>-^$ERg!9b%hfEwmA!O diff --git a/Backend/venv/lib/python3.12/site-packages/__pycache__/png.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/__pycache__/png.cpython-312.pyc index d8f25b2a204f82b827c0faf649e041d1bc0a5bee..67c1fc5dc4299ed898ec5b8ca1374d536d017e9a 100644 GIT binary patch delta 25 fcmbQeo^|$mR_@chyj%=GaLd8Ck$WpQ}2Xs$nW) zaU@d=nq4V}e&mU6uRp}d6(fvBBJeK+*$!mXws%`X`6)JI8t8ebNU-B)N x(?>zID1CFr*t81F{Dk@h>Th68zY5S_i<+~vb4sD%(aH4s4;4e5eHR8T~F4`hk%k{r3)J@zhNomkjfD*gk1 zi%rUKjfGXZU>Zr~o|q{fZ{EzCkB?$84<>3SRgWWpuQXW%`6siwAuqszqn71D4!Fg! zj{?iZ0dWa}p}hqnvklroz=?}_#w9mK?ZW`yKp$0{q`+8D=*Ux&v81@5aX0kE#O#HN zl{o*Z#wJgkuIxzFmlZro&(KZ^wt?%4oj8m&ecw#VE~e^CTDMa8vllLcQ0e$gYo*^| zW^|a}(zXf&ZOH*W6;UTvAw5^I@b?-@bv)UkjpltvNKSh~_NedO(Qp{Im8|X`9MZ^( z#a?I{nk^AgW-20zDPx}WV#fBv;XGRp6z}@tNH3dh=~Ge7z!W2d#)XYnI?C@pI8$Py u@+UbSk>j7Sv-%ALm8UkWZ9ZI%*LNPTra2?bqb1{f%C5k3u7uxE3I771<8xd9 literal 0 HcmV?d00001 diff --git a/Backend/venv/lib/python3.12/site-packages/_pytest/__pycache__/_argcomplete.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/_pytest/__pycache__/_argcomplete.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..568acb8322149f918c585f8c62a3c50114bf46ae GIT binary patch literal 4962 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 UTIJD3@^NG5=#$Zpk4n(~AKQg&>Hq)$ literal 0 HcmV?d00001 diff --git a/Backend/venv/lib/python3.12/site-packages/_pytest/__pycache__/_version.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/_pytest/__pycache__/_version.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8c486203e3286c1f50be41ea8a49157a6a143f18 GIT binary patch literal 592 zcmYLGzi-n(6h8Z6$N6D36``V4rB(ul4Dks9VyPG!0<9pSq6rcf=#mmS4XJ*B7GY7g63K}=HkdiBOtPYftufA2(>TwfCqdb^qWMI}~z>(l+P5XbU)5L}{oeYqbQDcA)|A z4V?j^^B3gE?=jNhC*&TBy2200jxU&3-uC@2^d;Nv!!F|v=`-FZo_j!ofjIJc#kz5m zM6O`v01WL8iwFgUMS?6I!U_iG##YaFjy-laT!C)zu_$^DaEcX0In|M}@?IO7KXKt# z>S|nE{d9eVNBbk=Gx=H>uUS8enf%*)Y!)V{5MSDypv`z`eS+4fS2o6I VW0-r_iLaH%2 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 literal 0 HcmV?d00001 diff --git a/Backend/venv/lib/python3.12/site-packages/_pytest/__pycache__/capture.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/_pytest/__pycache__/capture.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..fb6cb78479768a9ac58a6704d807d67c5592cbdc GIT binary patch literal 53953 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 UkMSYd3Wt})-T3gEH^k%r3sN5X^Z)<= literal 0 HcmV?d00001 diff --git a/Backend/venv/lib/python3.12/site-packages/_pytest/__pycache__/deprecated.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/_pytest/__pycache__/deprecated.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..12add6be0fb12dbe3b8c3352f8cdb442843acaf5 GIT binary patch literal 4699 zcmcgvOK&4t6)wM$v^(!dclt4+x-+e|QK~F@05ySWjVEyus}tMU4&5Cgl`B=(b}8j5 ztE!x|6C!273L(L6*nmc2#SBY!`~)^5A)&@%BpzZhyMzFXS@E4)k9K;75o&2jBv;*Y z&pq$+om;<~m`Drw`^M^9hP@yNf1^eCmkeGm8Zkk5Ptb*3L67NiGuDak#$)uJFcY2R zZj!$z@t)dE@%I$oM|MYILR-*Bei_>xjSFmqrS#Dc9)NlSUxqG93BYR8z0IsjGuER9d zGi*!jFxORE%oSBj7xxU$744>|**X(@F4IM3y6mvc93~o;=(QQ&+EZPIh3cgZSL~Xq zWr5SP#XTlEtYaTw6>wYZxhHn}9&fPR8utV&?t2u z7GWC)`Xm|K+P-)Ql_FH?f&I`!R=aJxXX@!8?XcLl)-yU}GMt3kylLXyay`|8n>uS6 zWH+}ILOZtJGg%;vTww(y6#G&!d-fzIu`tBEQ_`yhFd#U({?(l z=P^CpPeX@BF+*q%{WC6{F|@X5F+X(v8H%vsL^+YupHP)%V}m3e!*kJBJe0sd2llS} zdsROJMeE_qt=Z2S^(X^?)2BXP?Q=p@Fau<%Vax*(2#MOXAo<#Tohuo$t9+8(e0Gd2L%?5gW(; z+et&r93veqc9Kok7!!3{b63Q+=XKqcT#i<?-QtsJv*VBRxXF02?-yeqf8j=ALe z_Dir|;-*W7j)A0EoI={wH_u*Z%QT~DXh{4k{$^ZeHnWX%-3~en6@m~2MYIf} zrJ};oDQJ=?N{TNhJp5$`>Ztxs5cIymOkHUj&v|w))qW&gbyWv~+P1y_n#CrjD;$Uj;6nMPt?G(l8J?k<3NWJS zSF^9hw^2U&1sT+$6xsV-$9~?=WI6sAC|JYms$LreKlB_$*K4b`X)?`2ix5s#fMFHpeZ02nNKK~462?bnJEkYi2O=D6E8jXi}5Qb9;h zR#4?Ktz;UoCWqnkIKPZI41Ns$#mS-+p;Y4h9=N>X}u3jm$@AjqiqET`~)2RoYEh# z6+xqm8T5uI%RBf|Q3n7GjKb{_=;Qd^BW+U$LiYhKG-ixe&++f!0kDV}0%hPBMurEx17a~ZD-Vw>D%T(cFZE=O z>0N;oU=jkW*^mn%0ko$HQbUFQkmao=r(Zh~p)?ewM6&oT#+3{Jr;F+#axh;8V}|P+ zJQ#5pt_D^~3qHW;dMnT;Al*hUmhtnR@B_h}^`d<*_?Q#$DfsJn_;C{x`uNW#N}td{ zTz=EYg|=_917>F94!_%uR;tDC2jLy9aIn2^?2h2Li0e5mRy=_}>$zOYra}5va_s6)KQ+%f)h{H_m_6L(%n`!$> z=&~~dwLc~O^Y}Rx{&;onPh;ahe)9gzAI6r>62kcW1?WQd=3rD&aDi2n!C2Uoz8?#L z9yuU$P;(uMnv?!7`*W$Uo90&8_MeT+E%etP$0aLuR_XZx%_yr zgu6|7YpbwYFISZfl2CqJsg|EUQ;M}>saUV%>zjj#TD@9att;h9y;v?eQ)K31zPhoq zT`1L+N};++&$YsOerKybv{QdpfwA?fvbtF=t`-I}(V1{(Fi#4Vt-?lr^_fD-6z~k@ zOXanK!fjfwMbt@hrKXh1@PfFe9v7ZHDOcB&?b-$>%pyefd}$R&L!Sn7!wR^@p!5gyGW&`#Dg>hr=(DI~S?MT>NwjCSH@s>hF`)*C1;awon9a gpT(1@2N$VP9)Pol@z|R`tDgyYys!V09y|g60a?`uNB{r; literal 0 HcmV?d00001 diff --git a/Backend/venv/lib/python3.12/site-packages/_pytest/__pycache__/doctest.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/_pytest/__pycache__/doctest.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a1c038419078ff3aa073f87d7ed2a7f4cf10863e GIT binary patch literal 34174 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 literal 0 HcmV?d00001 diff --git a/Backend/venv/lib/python3.12/site-packages/_pytest/__pycache__/faulthandler.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/_pytest/__pycache__/faulthandler.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a1aaa761f62be6733cfd68e444675e611fc7e4df GIT binary patch literal 4331 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 literal 0 HcmV?d00001 diff --git a/Backend/venv/lib/python3.12/site-packages/_pytest/__pycache__/fixtures.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/_pytest/__pycache__/fixtures.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..7fb620a55fea20b91b453624ec6ea839d45ca112 GIT binary patch literal 71919 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˘_7b)GoN=nV{zl+Uw$@P=z2Ea_3Y~I=T;l~*2Sa0sqI>xUaRe$cYWclEwNeC zx^G80zaSyPS?1=hb+Mb}26p9xy9&W0`QVYY;4|}%V*8G7IEVWnIJ|$c>t0Rc;`CBx zy=HH*zV-UhwV`YLZ;+B`{PFokzO=^SWnuZkQf8%g<;2RN)s_Qyec#&f0s<6QnXAJc z>K>d<{Vo+O`YR$?V;Yvk;D!_C8z`*`GynkuPNj%G3kMqk>$}BXGrXtLZBmIX*=Ko1 z%jWK03ot=L^no*irT(&O=%u;Dt15jaVTkmB0DW7^5;iPKY}nyLu;?H&_lzJd%|36n z97y#In$Bb?(eLLR6JAWhJ`|rfzbZPW{xiBDxj2nvE%Y(Zf5AQXOV0gE&hsVL_9fTE z%I05l{x7*5UvfLYdVPb#&x&xLel{lYv3O{% z@yho1wl58@^PRu7wex%L+d13L4XSM%^YKTQoEsc|mJi>jpN$STA6!Ngepa5ned^B6 zJD2YCl>+8aJBH@w|5t>(K8q7NXyc5gXSqz^~Q~ta8B(r<)HgHxi7{O8@P; WpR<{vjpkaj89!$80}fS&k^ccs?GP;h literal 0 HcmV?d00001 diff --git a/Backend/venv/lib/python3.12/site-packages/_pytest/__pycache__/hookspec.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/_pytest/__pycache__/hookspec.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..dda888a0f669beb2bc7823aff94b0d7d1131d450 GIT binary patch literal 35122 zcmeHwdvILWdEep2<90l)J#Ht$G=F$D!znYZXWC9Xvn1R8 z;lKL(ednC}*aZkuqBE%{5Owdl_nzl>zW4dg*&nZ6+mpcGq0s~R|Ai0sZ@o#} z`sdw=#McsTB9(Ak+}1)%u{G7&!gO1qt=OJwmvlSQ9jOjUcOc!F>XdXR(p{-8Np~UL zo$8i!H`1$8t0cV&>7G=NqNt&#Ma!rJ1x)H+G8Evzs0rg~cv-fHzG z`mwHXU+O-&Z%A#xeSKkLaZ_rObNpD1YM{0+p zHzB<HD|c zgOTq~neT^!zU*@!aUb_Oy~EqlA9v8}b`LN$-RXWXQtoM%^LoGcL{M(OdmviQU564M zij??pQ%fv?`n@&oi1*BND_fD4+TAB3<&L;dA>Xk3XhZGY?%~h3r;aw&`n3CDsdd!U z^-QF$V=lk4-6LM7dz3lcLG-lS9YtNo-QRbQ;r?t>oyWaa_gVKjDajr`Cv|tbCn9y9 za8H_C&$}<6)>EkUG-^BPzU97%`}6L1+>hY?g8K*V1n#HMhgFe2w7Zjdd%CIZ@47EV zS~=77{iCK;&eY4&uTJ-sNQoDlN}K`2UzM?^yu)dZ&Fjc zT)W+~k^07(>if8xjzK&V$^8-cdu|rv8gDAaS(rlGIrM=r6?_BC+(_w(rc#Zw>qT-; zHsv0}n5NyCNbfq`*+_|(+&o%;-RtoVqX*A$wBF(AHr_FV#Nc!2`$t#IRY0znF~3FJ zU%|bE`>U?Bj#&xutkd=JCADNf=iE=QpRN*^ce>?BKVNhI(5;~4$C^qKisP8Gs_rvJ z(SfnFN2saOJs+v*?2zek9dfT#3HOiO z&tN1O(AqEIo)wDxthdH{#vReUHjsYnxB z7m&{tnEwORbqRUDNX)`4_PD={Z=Tfg4?!)z0!jwP15Sp^>2`s8zlwa*v3wC4U7|#f z`)epM(*%)lMuf+?UjimwjzDBK3K6E=KX$*2n)0TmP%`|w`xW;$+<#;+uv;+o8H=NO z&SivOjnw|S;ZqSzm~MB!hWgLBZ@OQ1f7AU2#&5Y;r~6y@Qm{R8ue!gD=c4;Nz$)Pc z?wtFNqc|q~@(S{l+_&9t;_l=AySUHIuN(NM3)vICf6gh-dAa;_K9{ZJ{ZiSP_LVa? zU-8NnXRc74$>Y_9*?ex+$tusum(Kg=JlC0;w|VlFvR9by$(H2hR5f3y^1p*T z69X-^_OWbb7WcLzrFlLc%jYV*pURhc?>e2Go6DDGknDbOj{V3Mn4a)HQT0kW59yA{ z>Rf?|wUe)o9Z!#*I6nHq$urOK%S$B`Kw=$-!_l11s&k&goBLlrGJXcR(xa!3ojQ5u zczSI7_}G#0iR0-LFTVJ~8RY0Xm9Kb8T3dVkV$PGs$Gth04qu!sP5XG!IqH|D^U}-X z7xR@--(`n3jtR8J1X!oDrR`eQ~idW>FE#uxXTF92mNOV72E#(L@rcZm7>@=Q{?mX?g zRShvy4~FF{mhG8DTftNJXtq!=BkY~@R51_e>#x$=4a_|;i=wCenV{6_Q^%h>GWu$I z?8xMaTBk;sNp@itQ|haHuC`XAPfozIOp?OC+prHjMIyz;qvd=jLnc^}94cD6dr# zt$q;y-)hC>jl?Zn6FH`%e+_fI@V}18eCfIj^qd*LV&>UXp4$L>p)dnkNjrMl9I!0# zsY({CLPKQb*$U<<-u};Tj?^H4G0+NHk*?ReOjBjT$#K*WZnbR&vN}&%V>}_D4&w7D z{#V1iJj%?SKuItZwFM6=K|A}K9f`!a5Rj+9%4ekPP`NS>^zw!4l^rtid?|0<=7iZf z=d%T{ra?h8(i2G12b@Wl6`=SO>MWH=eEu{jPUMEFmYR?}j^*T0^XQ2cBb?t%hW%mnz`#r>r5-Zi1~_eA0n=4lW3y{X+T2x zI0q?BdIwZNP~apWEbNyc~mU)8nF=Y0!3;25$27E1Kmxvf#P5#1?wBg za70umO#qr&Sc7nI%~dgJP&Hr>6ge@KJm9L^sA?rFn4gH=VnhV32q2b%ouDPPku58YJ3^-9ZN z7SL>iYVVO&W=K4$GLC9-ssR{N5A`d9vPPp5eE3d_dIFQFl{&2;SWM7mfQ#x$8Y#-LXNZ?0Jrsy^;P}!Fs!?xR8ff@JrAVK(~=8 zH^?T86>5QD62N10(eRzn5-4Xf)Px{=fLv7>i6Qu8F`F-C(&So}0E9UW%_*P!Jg7>r zI8=A6+9@b+^t;$poBo+kFj|Ph*f_Atm@yl?-(p< z4;}{3-M4RmT6=zaJ~kFkgc0#$ZUqc!uU(p^fD&zo@7mXj8{A7h3-l z_ROh)Ua7_Y{kP>s>N({7a~2P^!LG9QBgz`ZiqzKw@4%Q*^|Y7~&m%4Lx!G*l6R$8o z%)knP)voJ)pM*lKnFz13-<^ z;9W!4QDcRkwSH!Jzfe&Lp^MZXs4RsD1@dRFU&a)-q2I9x1 z${vWc<5~ALgcY>uY%WqlI~iz7iVGM+$irJhdrRlUtb*?t_qXHca#aPfYSf&AN#|Lr z^I0qcnEpeimcXHc@ydu#>MG%<9t=khXJRoZ)X%4ITQauiYF)sxF`Jj3fD&OM{ag=5rSM3S6$F-w1+3;`%8YYx^_1ntBB4fmq2J#TQ~ zmFEiCd8-VB^~or6@Bq+y?5BxoB&n03osk(Z*kgFI0bz{sn|DiFUnjs*qeAz-CbUv7 zAj@K$^>zs8)K0w3tsrn0{;Sb>tN|SGE^u9A^=h^Z3)MLd+=7zG!2*QJ8xl{X0D-6= z&4O-*04zGf<-=VL{qFP@sC-xxk#@&puqoS z@j%4opsU3GSY1S!St#B)Y()cXdUrBDLvBsFx9%FZ8#Q9+I(d47@ z)hanO_F`QI_Z9N-NX{2P?cz(OYLN{*F6=Z`=iuzG%!W%ISS!xMS<9IP$0p@N*It@3U^D`w(vsF~oByuBYF^bZwXw}Lb$$Aw! zt#%;S!ba^b&lX-A)o}6E*%fj82Q*LMFoxSU1XAdh68QQ`i)X?`Ypa9}%xdL`?+J&Q2^L7Rr)E;Y=a@c7qm2J(twtC zg=sB3N?HAlH-e{vv*Z2E>Xzo(KW0 zr5(Dw9H@1b@jjcppi(y10PO5Cy*Gt)8Ra6^Xsq`u_WH9C2UJ9}7Y_$P1LvHVoJlhJ z>6|xz0os>=Jr%Ri5gk|ho2RE7AFI?H9U@{mL_I?16UP3xif7m>HI1(?+}-&8vo-O} z3bO&2udp^I=-wY)HZ%lazhT`lRIr5|Ez5$(W!9`8{~n5aTG&Kn{*hyc1CZB71$(Ul zKXw>lwS-NrW|8-$7!+%(bx?`OEal+)iel+cL)9yUiEcD`S^|qQVOIk|M4c)wqztNr zaX{9OO})x!VPb_Bvz6SeXmjve+8`K;IgLgHP27iV03|#$qYbw}$N_O>!5xBe9){ip z2t~*~0ccLkS|I=p6&)W)R!kQNR(4!p#HsX1OT zSX%X4uFU(9xRKsvB3jtbLFQTyg(iSz1rIulF&sn14mP1PojnhH!`L&K>9W=qV?3u# z<$>zU$>N=cgy!ZgCXtx*sMR?XoQ}~D)|p5+>V8~m?TielwIP}TuW1yE0=ObkO`%3( z&%i$f>4yjbvdZCr=(Sbij7jL4u{b%@tf7cN=evh!7&IPdL>dyqvhEm?dJGE*g?J&p zu^PON^3!BoV>7OaS++21ixZ% zX;E{81_o#)@rD2vER`l_Rtldl$AGZnn7{s63thn_C*v9s2$=+4NW65spMjXA8`ys3aE7m8-V4d7xoMn*A`wT zgT{qTrvV?@mO%pH8c(h7J4>?JY3%^m-beib0r2DPx)An zFm0J>pr|$V0jxsNaGYe%V<{oa$XzhwOvV5qgOCXbSw;Ij3~s#_!cn^=Zs)1s%o>yd zsH_Bq_l^-@4D!I+YTRQ2xN}ur_?Bo}*(!K2pr30TG1g<;Y7UhI+X7-l)TUj2=Yb>Y z0xogp64TBiQnY__<9FZu!=Xt#V(#D@=9;N2>u*xMUX8UY ze711&08J5nTPAz3Y8zSgMPKiFsaM7^|AGm(xD%Km_Do6`jIzWIG`T(M+H${$P+W>jXd%$Q zESoS|5g8cNBFoD}itBxkMD?Zkn9%~bUPux)_1JmPDpol+>v0#JJ5=$9ro1734H>4> zAJaR*8-+b06ay4i#9FVYz*Z~yTOy9W(<<&`^(ks{P__~_M#+W*T6Ss`B88(f5`Phw zO`Uo=YTcG=uPBo~i3-S^s0rwuN5cMTKchj}fVAX9$;zb_RS_vQ!O&wWcR`$IW4}$5 z2V*>PDlc0rthL^V4siuTk8Q+xmSIJFa84exC3O!X_+kOT@Le!d$W!sr^wY&g)f<8h z0l6g~x)E@bZ=!+#(g>;(TskHE>s(M;xy8e$;FEZlBsWHBA5b8^ z=-bU?bX&TXM~9{m`DL)%EFH9}&tfvw8@Swd?yYoIpGVIB6Px=LXL`PArb!NeH_v~A z^Q=DCIKeiI!4e53STk1j1!Qdl9|%qV940XK*M_G^U`F<6IK#k7!$+ffMi6q?yv#KT zZfv#72D1!(qqQwcNk8QvOuI~m6o)kNo4O6~2wT<#?O|-foq)hV&F8t%gtoryHPH&s zyjL0EN;)}nDOae16~NDkI6=#Aq#iMy@nITdC;Nl2^U&D%w1~-;*oh_E(X|=FPMV8_ z?XX;^3~=lr12NV?8o-TuXzW^^ohccKx`bT!-PJ5DeBH2HOcCmmVTh_P>lT5W?C0>P zm1(Wf3ai^p6Ekz3WF)4SoUS+%eGenIi>`L$Y)Jhw2L3>N;CPDtHKJz`8N#tg(bMWq zk)YVS$4~+cv?H5qu-BA`X+dJ^CpZMPmd9ZFV4~Q|Cyg_Vz324M1u1Lrkj31` z8JWQ{BQc?rSk+GlLQ|7nKZew`b~dxHZWLGA zsjm@CXH_3Et|)L{kFjI3<`*tx+V~pk#^ZWrSF~eUiSz@6&^DqrZ3U@qZ$ssoY+d+d zGtvAU)iL2DOJg8mrWN%@kGX|o7)vB>1jD1=k1B3fT#Od|tBrGR*IFzS3tb0_Td{D6 z*j-54g~c%)Dlgo-ag5Ok4P3b7?wnb{SkN}Pm57i#oLR(_LuOex-CHG_v}mMWj&P%% z(Qt5r1sn7e?KV+gMyBUuP{T6hZoIrB;#m06gs1dINCAajZ_rhTOOD_qS;x&*vRtgF z=478)xtg!Y5&$47z{J{x-amtAL8z3G{NjrJEB~JwNf{nYb{#EC0UkoJMP% zj(Ou-wKqOX00JxtYrfenCb~$v;-|3+BO~W1)K`!dCxbCDL(7^ccktis{eRKN}qG^BPV&I$P_aG6)!`Z78@BxUw{s#>`F}Q>&&wgv?`S z1mo)CxS=zl<+z?`%i@DW=8e z5ZL*}ZGJ7`&&>X}8)Hf^+6`&w-UshR%2SuT+ zw{%0TH`M{}l2Xvc_9aGq~EpN2I zpYyR@G|&Lm?;!sd;^eK6kyoMIB#lDO%Z9;^BmvVAiK&fH4K z^@;(ZrD1S*yJwPQ%#k$ia=9DP*|ZngE=YpAi+_>FQv4pe{k>SXYpwoVt-at)S85$H zdpREX7X51=k}U1^abe!*Gd4Aq^zu7ZRO~K>1k0DPLxqd#Tw&()bAbvP26BVxaDTr& ziNaJP#v{v@uvtaNltpSb!r?+5+YikwW@Uq&&=n0`2}LRE%@yWBPdWs`>sVR`Q-#L| z8wu!0MI0XNW3IZ}7gEo@d}$w)AzeHu4JUJU4zmI&g`gm@Cn-Q#gJ!clK!deP38@He zVmm8I-F3nVaMMwu0ok7Y8t zT)Wn3zYSzkzt78CxRi-rY)o&VwuY5P5vZa#>Q9i!Q-6Sr@5FJnlb|m7wRRk3I8$pU zlB|fXv%p_Nd0Zvt@i&-#gOi*LSwFQH8EzYrjX&5lbO>991UfGP|3WPUlZ7B#*;ffG zjmM7&rb`e@R_Y8fU$jGxc@lh|U8kQZ(t|u)1Bx*`8Z|;WYyuB6ER!*~DSe?dA@&#! z2h38w97jd{L8wjYx_!M;Q-(mabsI4xu2s>sirn7-q-3T%f(Kz0VEqG@hfoxIkjdy5 z>7ZGJXqU@!h@)|rK|1IY&-6)HW_vOq&Eph?rm)s>4sb@UFpBmyJ+QOVMM7@*Mh?Ta z^K?n>h_xQKefy{vX$L9JrpxWy2QkI?XuuQ!)v{fk2YE$Kq9agAqY7*aSJ3s80yp!t z_e##Ak#1;-1{&7mfwBpIp#?h5Wu-1fIBU+HWAubJsZ$lOXzzN!@KSs_U#fiR06d1i(ty|LA<(Q*XivICA zx|;DhyfES=;Obzxc4M{`6MBBkR%Rg{1Y>3q^9oFu_BEHb8=Ohi0bIgc$3D2C|4B@bFznq0w_%&A{c&cY#EePq@Lg9GB}Oy+#y zpgM>EtJiV+KWUPGuu4#Q2jIH`yVk@u%fJg<2@36L+Ggti$k)84OB8YF_K4; zSiNj=7IDv3_Y4%qkgUSUNI1jS^ODXqI{? zM?|&=PQe=HkNZx4w0m^_D z9jdFbvi}4upbIn|MlmdmaeZVWcJ8_JDQA)~IYnnK$Drm~}v3RVjGT>}XUVUf)ww6r=ypFTmR@AyjX z#K3d=hB$be9c%$hGEL(hJ2EkG{1|&M@xsZmF`Ya02iZtsdZs0b?g{HM(Eq|5IdR=-N|J7 z;GwCOIG}M{`uoO@kH2&VsZaLJdps4k4_q9^&ZnEgGIR$ukGGxG&PsUdL`o40iCxwn z(OO|l2Hc?@tH%b$Py8ifD@wI?8sZCk z%`b$!wpXL=-a!W`**nCfS#aKac14x(6X?g7S&q*_oJudig6BXXp_e0=TEjhT=Zvuw zHweu~JCyh`UQn~iWdqr$Gl3B!lGOSDz+Qs=Tj5dawq-2iV7GbNKEkU<`2%1u4lazh z2`UYa)~2sQ+6wFj3I1531&RSvf5Vb4ryv~GNvxn#X3=ECF@$W=6chEtjyUOz`S6l) z|DBG_ix{i>fOyc3d9qJmCNqK`1rRTVfwul&j<+6`g;U09X@?nD0M%zAF#k+Vf(g;8 zgj0oUG7SX`zBCnBW_8!Z5(kY+OmSYqVLAFptc7){nr$#4&|W5}0#Dx{Ha8Y+$r#v8bm%krS~~M z9ad^*wYeYESF~253pqHx$15yr%sg(6Ukdz0|B{^JU-9x;Uf#f^!B1qFh#47FMK0{( z9F%{Jyc01dk^@VR{gE3*eL{bZ3=vl_p$Tmfks;J^2mh$B%@1F2#43N+CZI~N!e-bQ6m(@K|JL=f0viqZ_o$8icd zPkkRKa507@wJvPVg6LAJ7vJQGRJX9}xIJm}BpzQoim15Y&5B0C!v8dQMO7~l7NUDw z1Q^#kAr&|Z@p5%eR>K7Erm?6b(j7l;!K1$AXIpT78$%nge5R-4kP7_rtaHAcELY&Xgey^I&~P6!V6CO#LI0i>wUcEulN=$^n4RyU(|{Gze**}r ze~U{@PqXeE3kLy%`T??iDK--;(d)vg2vBjf&y-Imiqxub1b5RI@2Jx)y1!%<4NFkA z1-)gDEvSEoT)!RbGtSL`F|x3hJrg`(Fj0<-Ci=(cDC7Am+*nb@17B)54LoH|WwE-6 zFe~{OPzmA-vG$1@_@=74qi@67u-uaZ5^# zVe-V0P}ENvm4M9J%n1&6iV`S$7SGQ&QEfm@#23{r-uYNHdY&38(z8SZhgK-_yf~L~=0lA#l zZ==;m0e`pyB_5oo7s#@OC?^%{+12O%aRpTyZV~_(nup0;zqT!UEMf{j%CGOMFl-baM$CNCR#AsWjM7zKT%%wHG^_@78Z z?Q?y>$mx?LI1150=Qtvp&Ym@8J0rFI2iDR>oE!rY=&^pH)|F1XelDG^b#XH!7vV8u z_+7oqJb#Q-(SxjTFn&VeJcNYm;-#CHRlM}@vYMAQxagnto0(T@`LMzKYGN`xgG;Sr zR`#RTZ7hs(?LOU78ip3NZ0PoCeXKkj)nFaGhz_alHI7MA4>EtyW$We9$n!A2ML@zI&6E?9 z@l&K&*=4MX{63}pf};Fxmi%N=tqpdS;xF8&qpYC~3|k%JBY#Yx)~PKaIo?~&o|fa9 zYwfgJC>ic~6174_Q ziXas^pva`;XI|v@B*m5XvuqMr%vU&Yvc>T}y1ame?x) zc3eyBlz({XTuW^GX=3+J6HonhTkl`BuluX^jn~=-e%k)%HU4|}TKnE>?fb8_56a^s z*V^&#A$i#+Uv(OJkaOr-`#$;f*tPZpNZ;s8tl9Bq|9@Kj;AgvUtV^`^Tt4`hE!%Fk zcDHojYD=_kuQPRHi~UeR zJpaSCcV1k4{M6#m>6?6M+Ci$mWexhXVMo1<_lE}c{ooVQ4Br6`w>ogY(I3{nyQTZh z`Fa93)IPm9boeIIrc$KpCt6mawzXU8ZM-`eHSdodx;p*#E=fzRcz0`CJF1o`(oouf ze4Dq|+j!rd)b}Tzkvk#fzVY#!9r$M2LaM%R9kQ<9Sa0KfCz|4Y|6#db@7Qsx1JAem zJ8mwIm(M)1m&>Bakp>ItN;K6Hz>8=LGH16;vu07^F;`=Q>t5!K(fx!%V6{rlt| z&LLi!t|8Sp`|CHoyLr#z`n?(lhWG3HhdylZpy$%T%Uj;udBuI}(7TTvTYTjB;+|*U zUH$B0$8$^JhQTWI`pSqNL;pLEFYZ5jlLIk*U}_TveWN$*KB2Q_lY!Q5eIFb)&{}&b z_r}?q0x^w=$Q>QUeQ0e}J%QU>vsceACZE2^v}p~gD3bJ{p`PA)8}GY-SGW^S(~BLO zZ+76pltQZhdabyNkYAtVcrLy z2uMgzKm!dCq|D1Z^WtvdeQOWKSnoyULeRKh@7;Vk_vXlDf3bH@(5aqV(vvNq=lZrN zlI^%(BiX}`==;Hu0NDVJFXk6Jwh4{a`?h0(I_nACuC~eToda_Feok&bbZ_xn{bE}c?*|#-`Fcmsr307SFHd}V)upEwN&a|QAGzO@!2Npfrg{hNfaLmJ^)9Bm z6KghIes*#7&iX1o_9Qx2$17Ql*EgOKF0a|tHr8k7w~bFDN9(*_?|AuU2kvG{kg7ip zLGY6;z$4tR_wJ~7;Eu-EZmxGR)t%_K(YVNN>H1 zsqV!3t(U8BPF#8LO8L#Ri(4OATsK%>#V_c3&&}0Hv3=);36u-{{ys%Ef@d* literal 0 HcmV?d00001 diff --git a/Backend/venv/lib/python3.12/site-packages/_pytest/__pycache__/junitxml.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/_pytest/__pycache__/junitxml.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f93dd4a51d3bc3d5c11982ed43a82c5d3902c2b7 GIT binary patch literal 34416 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 literal 0 HcmV?d00001 diff --git a/Backend/venv/lib/python3.12/site-packages/_pytest/__pycache__/legacypath.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/_pytest/__pycache__/legacypath.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ef32be471031d783739342b913f5c70912d92cda GIT binary patch literal 25026 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 literal 0 HcmV?d00001 diff --git a/Backend/venv/lib/python3.12/site-packages/_pytest/__pycache__/logging.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/_pytest/__pycache__/logging.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c5d1d1153e745a87a5daab29ef466ca4b90c228c GIT binary patch literal 45236 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 QJiA9Uls+*alA*W%7m2)EGXMYp literal 0 HcmV?d00001 diff --git a/Backend/venv/lib/python3.12/site-packages/_pytest/__pycache__/monkeypatch.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/_pytest/__pycache__/monkeypatch.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..956211db4940d8b7edb99c0ae22a2b1037b3f4ae GIT binary patch literal 16805 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 literal 0 HcmV?d00001 diff --git a/Backend/venv/lib/python3.12/site-packages/_pytest/__pycache__/nodes.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/_pytest/__pycache__/nodes.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..9165e73923aea8e3538adc8dbf55e7c8159b8ea1 GIT binary patch literal 31293 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 R>))__w)ZDcO&a)y|KHR}HjDrO literal 0 HcmV?d00001 diff --git a/Backend/venv/lib/python3.12/site-packages/_pytest/__pycache__/nose.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/_pytest/__pycache__/nose.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ac4ceeddc726f7e7fc3679ab8e77961e0373b0a7 GIT binary patch literal 2018 zcmZuyO>7fK6rR~#+Z+ERb_f)Tii`+R+$gaqqK68h3TT>A;UJQ#tvReVJL9m){#di) zfRU+ODH5fp^iYulhxAlXA~i>j^wdKyprj&flT*_JH`BCI#i?(0y>_TrY2Ung@6GJ{ z`QF=KGnpiU=gfuE=5idNKg1?_)HbuX49q=5P#F4f^i^^)- zfpRbDrG2E2W=R&_G|g31l3P^D{dK9(e=C2r=Hxl`xK}e_$=_fm=hVqpT$XoSkB+?% z_mm3QSFgM7ylGc0;M1kasgJa&&#qjVygCj0>@4LK^Cqt`YU^yCGLR{saB7Ql<2A?N zrt1j1Y539w-J_9A98Pdnw{(yD3V2}qaYo@D$7n|tgb@QO!@Ktg$Q^tS@s75ExD?m` zS#5J3uD@=f{NI9sMFV|{c_Px>#dA^3A`z?vgFLA6J|VEH!W(!n0(~ar_tS511**NM zMzz7HjtX+gk9iPW)!1(;Vmkou-Z+r&UyJQ7n(M^YJpw+VxlTk~dF0a+Do7N#xcV^CyJ1(In5rwKifjp7W=BqD@*IkujoPjMyp_;&r+|bfd;Bw3{X_9 zzf#Xyx;;bmbGL>jGeVyaML>nOlWrmJn{|$`L~Jg+Yc`OH1Tj^eeUt# zFC#yXY#b{!(VmFCknoeHXF49&9fLAaPbLb0} zKzMKXyW!=JSEhfw_QSPJ<F~q=UiRazk$7I_90T4LQOcK{b3^X()hq%mvbdr>lof!TWkiCQ`Q}x>gag zZpU~}bjO>zf_FM$t~avlt_`UXYv46Gx{WAnv8ZFkG=uN8jiFoOg+yuGS2azfM$-y% zSjD(a0d55Phy%!8h|&Rqldv=9ExJIh>4NGfU>fP1GbRG|RRMl|#-hILaptQxbmjn( zJzo(V6OH7@Vcgj|FT_K@ybZG8d+Z&d1$=4k>E@?G2LiV|82Tt5JOO$_$O+sXhu5nC zX`=1Sz|z$6;EJ-5IoTZFN@SW}ZS@Uo=Z>!oZR85;15a{inwOp@azdCour$7zItuJ= z|B>aPm3P;S^`X`Ijs6dspKdGZJD0z{ysZvAQ;$AXkFLDGKJs{aQ@!-$^Dq99rC9uB z62(%B6I-di09l0tenQiTYiJr91W)|lc0-OCu2V5*nLvx*9|;MqGHU3Yk}xCLNYM`5 z3zM0N#A14QOeCOtaX1Qs7W6ykYmWG#K<0y{6rJS9Vg68qvlC*Y%($)<77x7yyDUGk- rW!^$!eW3gmta~z&4u`7Na1Lje7Fr0Fm8oD^KM^dC2LBeqz?J_1$xGmK literal 0 HcmV?d00001 diff --git a/Backend/venv/lib/python3.12/site-packages/_pytest/__pycache__/outcomes.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/_pytest/__pycache__/outcomes.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..5945dfd0a0dd24ecc40a47e28d66c274579b2dad GIT binary patch literal 12180 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 Zv@IR>G3S_k->DKJ#79TJp)K9%{{W%YI)VTI literal 0 HcmV?d00001 diff --git a/Backend/venv/lib/python3.12/site-packages/_pytest/__pycache__/pathlib.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/_pytest/__pycache__/pathlib.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..28f04e3383a63bedd650a2e6523b0a3a918bdadd GIT binary patch literal 33921 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 CZmuE# literal 0 HcmV?d00001 diff --git a/Backend/venv/lib/python3.12/site-packages/_pytest/__pycache__/pytester.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/_pytest/__pycache__/pytester.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..872bc4334c96a001df8d91d3fa1d6099696fafbd GIT binary patch literal 85237 zcmeFa33y!Bbtd>~UjbBM-&w>$qDTVZzCc_A0^m-NA|T5ui3W;z4OegM%)1B^A36KC)m~Oh`p6Ps(`34e{j-{UI zp8wqYwki}Ux#KV2;V?AH>quwQG)%6@Gj8~e3~?CjSOaP&>FGw1I_- z5Z)Nt$il?~b%ViBkcCSIHVtkLZD!%pfh~jep?VfB8)z783^lTFIl@~*TUodQ;ccO9 zEL=ITeQ-x;2Me!5cxPxQ3kMM1723tZ>k-}^+RegM2=58)Vc}|o_lEYeaLvHJ!KP3X z3)c=jGq^vrpM^IJ92h(pI>^Es5k3?;#KLt0&ki<+nprqFaCopK)WX7>23iN(LTxO( z8Q~+LBP_gS;OOA7&@mRSNBDT?I14u*d?Iv$g&PM>4xS2~V&Sa_pAMa7;cW=FhuT?q z`@osOv!SyryaVCqLeH`A&Vh4-9ia{u-ZjuU_xqOz11pL9tmngj9#|Rm%%V%>v$?zTf_?iC2i%QVNKtsdSWi#*kW4 zT5(qD5TBD;(3*3-PO-y~q8BNik&47l_O)4j-VoQvQt3(tAqR z7=FYT)cS=kJu%IfwKSKNUU(6`5L(j<1FZjELfp%0TxgKJJCAo?(cTTQcU^ebt-Tvo zat`C|IrXj9`y=d&3y3?Z#)ZDh-u2+!Y3-dnW)4cRP+e<(Bz$2&5(5{;0;1F#9vz4V z1Ch~@kzqL+=pB{=Q7IDbALSSL>Pf&aQK9 zFPuBx+2;N$>bv%!De34P8VpB!E+Xjch|0+8_!)$)XTwo?XK5Z9qo|hfzyQ^RqFVcV zqWEf6w$9NJUP|ZK2t{RezIe8+tL0c*%gN*INAbe;{1CE3!2g02zI;*|qv}ur zGF8-de5k)=c&N9(4-eTL5{r644v&mTR84!de-KTiP{;77%nJ8+^-0mLL3C|@Pk1Cc zDpRqx-hN(Xd;6KrjmhJEW*uudcJ`;Jz`s_fvK3TCvWyYyHudVUhB2UK}32 z+&?%%t+x(_S<1Y#Y_Ry3r^7?xK3=!8VL8G=**zDfp37bR5k9K;)Y032O{rP-5gt58 z-N$;^(IG`5yiYu*hlegpV;DR(qOO+VfdTXZ8zL(PXOODV8}6s-cu_5Y(Xbr3+&@C^ zm0!;VWGhPpBOC&pJ;SJmEKzIxgW=0k*U;$T1xc2~F0r5bG)pPuoJ85-g}W0OXiqtv z(%=X|(~&S$ga#>#cfbo_d58~&?TFIbj#K>vK?BJ=-gHUs3P;c>G{BKqVdIss+&IvG zp)nGPG!FJOjv(@?n6!_uo=e(g37s_5qhKnA9vrw^@VEL3Zg+%n;gT_yB>@fvk0M$` zt7yA#e;1q!U8X0cb%;*UCAvk=eQ!!yDkbd_v&8KCIqIx731dRg*B-Oi*AGO7dz0=6 z`a|l9%A-=!N^g$Ds?LoL1&*`^7yv{9{k;KtALx$+!dEbAY-(APcJw4VBxx1V(MgAb z7?ReD7_`qk_4V@T5bwUEtAA)j9_|5rBwgCupjmD~MN$6f1tm82A{ER(0)Dv=Kw=a> z#PCZbFd88o6CMg|)biUH0QT9a=ddwQhtDq#4+ZK60}RjugA$&_pjCbrrOAh=NJr1b z;eJ#{Zlkg|9}(;^vc5k zYL;KnoOFdnahTy7bdo6c5A`E%AIgf*s0Thf-*|C&P-^TOy4Kh#MJ`8&M;ea}N2P)K z!!%8Y`Wg?1doD{uV&fHQ=n8{0-l!c7+qO4G0GstANPr0&Y3$;aZ&cgRFfx|(@rN$0 z7V=3H`vR5UgWGjs+3H@h<|nNA%TC{NPT6u+-mQ7<)KF2nS)t8ew+OX{*feosQ2V}1g&)FMb(`qk6_NS|rJ-mf*c7-lOppv1 z>g&h21}Hk9MiY#6ugM2+*v;wdMa(@StqnnY(g{LwB|L!X>OV!(RXha>)Izvgk_k5g z=>mqjMh3!B(B{Ep7N^039K|P{veXBfh_pTqn=G%cf&L*0Q}Q%x8k_iN8?l9ffP8{p zs!+uT74%6ah#J9P

gzDo56<-}t3(OkY`aR6feBUdXMTbS!&vmpnBIPtBrd!?HJb z$s0&`154gu!W*31xai&fm>{t%VJ%yB`d7>**Z#k;S#5TiG9*ydE_FCpMZCHrNJ7Yj zRUKAyl0~vgHp$j&CO%E!)y&{Ov67PN+PFXig-YG}eFI-)dj*(Exo z`Dz$^x9f&=!rUiJSTHGz)c5+Y=vK>U70!nQVZv$_#?9ka^=-s-(>rd>_@zfpGhrLI ziC!8fP%@!Zn6TqH%kbE`Zn$E7m$js7cUt9hc_W8;=f6?&W+8n=%F zZq#%p;pWR$VcgOo1atVrkJ;*v^bT$P%v?Xxc_e5{+9OeMcr?m>C0S0|*yKrCqhKbJ zPOz54AOL+Jt(ahI!HGaA4}YtjxP3l8yk?R~NMIfpu9y(^A#72?ZiKB$*ov@?!l<^r zJ!$GC@;o3#B{69klm?TQDC%bExhmcRpA?CP$y@6rc6>{>bo%G!)yq z2GukWze;gkj08699~kZl4@3?&@GmAQqvN;%G2|89IduEb?2d)JjUNlP{Oo04$!vby zSNpMG@o!kpr-%I7k1cq3tUlQAuwoYqN?F{B%a)bRu)=31_h%+Srn&Z4H1$3+H3oC! zHiVKEa0^Kbn8u`eIFhuZdL#WJmJr9!wj~{{ZC`4C{?w_Yoz+rG=2NsR^9u<@=6>LouY@IJy zDA@B!mLtdgx7mWnKeb^cM{s#pa_z3{H}h5m{Cqcmm43hu6c$gqALkd{Iez>2jQHA_ zj|Hb|_hjpbIR(?=FOM&mRJ>Jsw{*63p(HqMUoI${X}GRX(<+Am&>+kNH zeQx&L%z?fJ{|lgIv|C*IXmW7L)Lz zFlN0fT(i6=Tr~x4?I4)M3&hOzSFkpd&m(*UoF;*zJcL`)ai*h9mWSnJE-hUp@hoS9 z*}HotIfgWb*(RUEbF6yp@UJ22|08|454Y>WirMBWe&j8@)jrieb8tTYeedoSr;uO# zvrim?zxd74rIOu=lHKu~Js%4uSILKY#VZ#4eik8;@k&vt@Q+J&TmG48x1|$|tB2N! zSNS?M>5R%_z5OzHdn;JZ!F!hW_Vyklkt1SOjlWgMhJ=$?syqpQsf2C9EDFD7x??g4 zI#;KUfM`;Qvz-6M2<4L&M_PH7aZ9Uk%i3eUDD;@mqrMZ?ajVE!g>Rd0x~zDMH|Ebz z69f4L8B%iVqukJcdT!&kD;UU|o^k7K^UZ84NEG7i@>S6i)p*KryGm4IfUrIYiEjww z_Etfy?XR0e+ijC*$6M6M@YaF1PP|3whPO}58L3?$#u-=wDi^Wt+olNzQfSNp#!$JU zel;X|E)iWyyT%=A8`6JiSviJ&F|j_qnlbcGESNRk_N0GgY-FqpLKu=4boCE`O(nRB zm2aXeP#dAe=K#1`EO8)kieeomi78wdP5mACTiuSE3VP?!pb3-Ck?G7m2fCYnE2>D9 zxMym|>>I|n_smIi!&dnMf<|ulGuQq;$d#^*$OmKl*Um>}fdzs?OnDcUuhHS2;Q^fn zYG3~@Wla3ie-eInU3kymIP=`=)zjfS8xsD;PgkiKuM`xSVjgPuVF?`}HT@zRD&Is2 z@-NfvS8y{nQJ%(&zgy$}8FE-PG%lz&F8HZ@oAP&4!+TbB`shDl1}18xB%rUL{RcB`p8O)#GsQA2KiNbV<)~bvQ7Ejo-{$!G9+E?>IGxr zr8xo#7-PVaHt;eKqpjsHik<+jvEUbm?B7CFB2dwAFn;VWSn}5-{51>y4U_gicV<2E zynf>cxpgzm)7z$>du``?xpfaVe6YEB{<*p4 zx$wKK?`>{QP?zy?I-s_xy;eYD-$EJAEfk`iJA9{)&`x?HVH~;d& zw!;bE;T4O!Ap0l&#@Q{4{>Bv>9>6d9D_0x{edH8!H_dKX^aod56yX;96)PT!@M;lR z6p=0X8x2|J&^w>t-!#|yz0>zjCw%)>{PZeU@K>$mAvD+Jjk1XIB?7j9pzxcURZous90IR9Dj5)%DfU@BojI z3CYWZvl%jDfG1y}N8%*p^>o`zHxhlwzk%C5f$>p{@#HJq=kRs{e-T>F-vB#NX)B$z z&OSf4W8N~i_wBAkVAraEcPr1D?6%_BonQ!U#UJ?ud-hDtT>hf1VZ~fv+cVd?BH(BK z#rUB!iCt$uriWFFU~l}0VtJWVQqm!FiE+|(mdT%+<-QbzM+_Zf>S#e{Twjk1D#^j3 z#uR(=9FwvJ!U2*uLLhhbVt>!Yz;G{EddMjQ;Hin3fede07A3ik9)gN6kf(JM6V7F| z^uaMCIH#nB%n_?1Xa$s9sR#&Qh9Odf98i}92f`P?{s*w`0dL3hqhcZr;05oY`k*m$ z_%U#JNrxh^lkX$q4=IwU@O9x6x8N<9eqq5=5w})wRu}KJiwFf>t2MZ#%0Eazg>|?U zat^C#7j5{pjah;YRs&W(TXm+gZbWWbFXyuS#!cfw7ef3R6ByZmh}_wwj20MO;#GNb z=wnqX1R#ZYGuqV^%hkrSL4EhHkuXA_hc#gFx=HIVXYrO%2I@t%U^SuqQ^wnrNur{{ zzyy}Sm(*TS^TO{XO~RtT95-i_wkS&pFp=gCrNy?S*9ZnlOV`Mt{5|B9^g>p~lrjA= zlAIyfAGwI$A?U*LK4@Y61K~HuKk22r3V9J~9YNX&$|olcE@LHnx1~k>TcnRP;D%LR zQ8kdwvA2&c6xC09mz~~QSyNd{&Z>m7YIgrp^|OiUXBVB#5aq_5Wvq)aUQPH?{vF(c zcKN#${!O|OB9}MPZJurq==KiXPSK63$l->-_g~>JQi>a41(Pi>o4q37XC5d3KcCnw zwsQ7a(#}MPk(7B%GA}l+2N9r!0hnx44(sWe_T4Jqdh6cuz$r@nGXeM$GFg*?Q7Xe;_07)@uMuv%fq=5;H4q^63FicVd zV=|MbF4kc5&>x^?Nz*kWQm!a#oy!@d#uUm(>Y{vrX~t_zQgDn9VkPp_Z# z&u)7=e=hGg%D&nBo~J%;t^X81jQai$S*6z3tfkf-e4t$_tgiC@&?T6#MKMcO()(Z* zv)L;`rU}WVourtOLw1M`_6!MS$T?;mvj$yBpMt4G0#~LLeFos%j2>d>PGl&F5EjrQ zQb7F*2n=*W_#Bq|MwvvKsWtF|;(7A0EI}ZR&I39G)@Wfo7# z%1l}bsuWB~aI0PvroYu=xUmJU8e{mqWc)&TKW>mAGW@DxJr%!Nh{TJ~8-uLdM@PhP zR7%9jhY=Eh0`scaqCDX&pZU_Fvu3%V z1i0AEaj}90kyH@0IeP&QKTliLWhtN42bh2|6Lx+Bv})XhyY)LZP;pzk{3DbU%iW*e zkU-2*w`o(%96X4w_(P;gT1f%Sk}I?*X%bUrF8WfIMr2T;Ox?nx{tx67*@+vv#p}Cu zdg}C&w=&_aT<``aP0QY_$-c=G%YMSOC*D3WdvHE){<-vJt z>0IY3{j4}GwgWTOs{(#LatqD^C;?r**&Uxioa9@v;RUM|%dQ7GX_rR{tv*E4jXVos zJkjzd1R%hB(A|J*arD|D;voCG4Wvf%|;9Ir9!=Cs71jIn>trQ1wZGvg*R;U4gC}A#3HmTQy&#eh@rZo z)`s$7|5SqSi!-#i)X<`m3@t88jsH1oU2bS`$j24T?uHcMT&J}j^HN7 zOU3>jpR55;H%8htG6dajIKVZnSS2uP8inc-iB<_SElogWdt?d7p4n41^$dVMHFa|~ zP?ABn6j}|HFNtFD1xh?~@x5JWTx-7&&QOPp6R!3~196w)^(bZJDU zPrwslLUxJtq>)b16eZaOk1>ld>YEgLVOD#?I{|au^f+4ZK*nmiq@o%1Q~ZuwpkP!= zK?#t0@(YG9w)Uip`jL@Y)~X(@0!Tzj32UyN#qC#3cZ4a+C4|ziO!QvY@{VIgp%(wH z(sUA!@>P`u8bacY2=z0VnCpD~VCO>_t0kyX z2#2hZeO&;_letiOqyia0_DBQ|f|(_6MZ#OLSlKW)_F%(8W%K*q!<-SIa*P-226~xB z)2vAcIP4x6u&`Ro?;{DTu3A%NrDF?|)Gt=^ITdB8yi`w>%K12zbI7&GIhhSZ2C{8a z=9EmVI8=R7lo7jR5!Pj0)Nj-eiaF)IA2> zjV;4cSRoogRzXrvr62@TRGakb%#eMUy!1udrP4?6k{Qi-u#Pk<>qvkoK+x+m?aN;8%qT@b(NG){ZE+py6{s^ z!L;;d$D(IF^yPO>-ah%->B+X`^|kMmzFqo3PRmUGT=aXfd$9-4zt?#9+t&ATTH?-@ zPw^8W^!UBJX1Dc+7Ax*a2dt6gekqbNa1JD51ILY8L=!Z1<_U`dqic3jP_R%+c4cDm zVJ(GP)0N2vi!iqQBMdxAh0-ojqZ%&*SSD-}c7yIr$fVC2w~#rAS{@8ct_uSD)-mB6 zcU~gMO}oZzm+LS>Uoq&ptmC$E=etUqpqV7R$1WIxSdmM<`mFz|spVorKDKC)nnKs~ ziFV{|kVbPUw;PBolGnu58#WWtG)Sj+v(=cmSagTGj?t}$DW|z zKA6mIKVy9NnW;YMX+NWXVWs&J%jp>&9T34NC{8P%; z-vvw7aF28W29g*1MUt4C`jc*YL(qK3X1QXzkPmo+d@I@Qb9wapkdPe zVRpfC>H4=e-`zYLexqUP&sWWUeW7Ca$AUMj*>u}AZJF*Q zJDR53O|$v$<<&mQFPYgq8=dQ1%-{Z~sBETfwh0(u;@-q!(Sb+B6*EKk#ra+DUVgCi zVgCEYM}Asd5wC3czIFcj-}OA`cv!Pod~~@uu$*5olQ;9#yG6H8O*em-U-HOTFg-Zi zIk$U$=lj0BD+N^YC&hxlVEP-g(bBmDU}j{3Z9<>| zgiH*GM0lE17gHESpG{#4Dc3V0m~j(LVaN*$K_4`#f=VdYxaEK_4wb)2=m3ujQz?=+ zSiWQFGm#xxM)`2Yd_ZUH3Y`IZoUp^V%FYz%s^Ng9&Ii)a(3xn<$dGE5b}F(W@~luJ zJE)Ppy)%}dHgkwF1Y))=P)0PxtN~~oxqi_uub`=h$zg}38BCJcWRTxP9EAUDMm(f+ zpU~}Z=tiKPv@w06{Lc}N5ZX@xdIu&T6&uS>0e0mrwr&ZLNqhr#fC2fVqQGoEQJ{sQ zEwJTsl}{a=Y@UoR=j7drO~qz97ji(Yitn7bePZUT)2Ek<%D(McaUdDlr_{|^XRpnT z#{IkEzTK0yWoOnc@0540=6jp&ZTg^K*X(oCy)$2Z?b3S%yB3|hA342~owr_`dU1Mm zA*h5n|VW81Np>cBVieA#+B~UPjoD79R+Vhu)m+#_c6yPyAb1LC?C=@=epOv@!sGmt4jDGeP z+^M)-F%wXH9{?^xK!tdp*i#r=wliwgV<^)L}+1#AO8XzUF){XHVR@2i)f#wj_K# zZF<*}kLY^@>Ti<<_mIMf>Ge)UwR*rQ;Hr1EgK3za|h- zDG=}&tlo)N1Rit6c4_)_(#vo_f%cm;Fye5OgjIZ_R)FnWUQXZ^Hlo3}ELfSCGNDZb4F3ul%SZjElV#O&4&=3(~ zT``89E0{jCkk|OJ;BZw>wtSdZG}H3dvAf6S?C+H~%?{5-CvV2`mh-N2 zw)MT@x@Ek`E1z}Eb$l;$FSJyDAW?tdfw)lL@?M~2*;jZc>vq;m&-=crl^o;=0}Wr{ zU*wkmhx*;H_w?^uwOI0?zO`g!f8rFpIg?ku^~{X_n};6dmM{AbE%}Zld`Fh^D`u{& zTFn03Rg0ApTeHY=##d-0EGc*l?Rpa3Sc5Z@9?%8a^M{=yk+cpo#QYNV`Y!-O=OLdb zmooYHQpznV#YQ($uBY@I;Uk9eLu~y$kPB`i-bPBLsn(x4v=r8*`%z>vnyR(>h~$koSYq|GD(rmiKa6x#(f8Aei{Vi*~HASpN{lNO7<|%yv<6sm>7qFGNUEQ>Y_8k%hK=ZhliBieRB;ypuB@_j4U{4*YSuX z%5b{@B>|@eEH!*)2<$Cww&Akk09~94cuAt66cdS+q(GE0>Nn}z-$HS0wlF$?n`7CZ zr%{Au@3TO@`Rp%G6)Sn3if-PFghywav|W>X)PU4?fN zWg(@kKiGQJz~?8kz-SEVU0<5g^(k@xg8IIi_5E_7W+|{O5!kj6*zrNm&Y5kmTc(?T z)&5@2&bV_Yu+&b*u)daCXXT)x4Sr^JmC!m9a9~dX+`kBe5HYYl2~QJi+pz)82H7Hm z?fX_;+Q+n0TpCBa)47C6fi0lwRA>xZl4Xi1A-4PymzAk&;Cw3c}R`v=HDnyFZ}NU($_g#7%gAMxpTm0D_%A9 zIA^CJ>86CMB4bj!WsCbGn}f2>pYE8co857@K3=dfkyE!qZ;>Ags-4N2jm3+%C33eX zTsuC_LWEKzB`H+0*qbqny_vFDMHYKuOI}*OV#e2yh^?#sD5ug^@;I+>#fD$P{{?CF zanSp0A*X0MGBvnDsbQ?{&Y7H;xfIW-OSpooetP$;N$-OH5BFA^DPwoFnV!^Nh{-kC z_CgXpk=Ss6j8ONk*b8kNAG@;Q$Y8n@_HFcAFg-DQDPFWS;op{UZeROm#b$Qx{K#T; z+gEM)dS$E0wreIj+j4h|vfTBN-EDKv0{-wb4@E709!A(tyyJycdiK zr?5q%Wq5F;2NO%X2wh-~39E&;8I_?bl>}E~ib>4@#R4SIt!C4$o1bHG%GD>_WP=vT zLx>%Li7Ux*!}7qGo465GOA!def|EP6fhl|d3weCVmg$?QsZrhdgP}NS;@?DZ))cz1HN@3ygC2uR?EVLDOez7+GX){*&Fv}-5 zJF3-bN~4vWQ%qlA{lZnN(SGtb!j-Ww>jl3>Eu)%80(GjrFSNA%a6=?xT|+&E4Kgf2 zkXyBMlKTYwAB{-8qXQ`(iw0m?N#ccT(a09K9D&gcEK5n}3#v%HjH1v%Fg_3!OIQ$y z2I@*0MI+tGGjtI)6eFx$Xpr*<}w4sNI)E=Nd@RcZ-xi@W2{s3$^*_w%-P>F z3fO|tdIq557A=tmYAcdQ;0+3CwW*;%PgA!FAlV03dy`KX($2-9*nD0v_W2D zD2};~N$D7$l35q1SQnEjA4ag0qCaO$WE8n*U zl)k90HO1U7i<@6=cv*Z|jKn;3cnAjSUcS0Hn9@nA;l}E}Mds=D#>`8MU9ls!NDhff zzF~o^hHPXh49ib9d4hqTPgu`l4+hyHdl2@*%2e?&gST$H&62X$yoXJ)3cjHnZmFx^ z#R6C>!*2=xvhkOLKOg@5_{)_LB1ycMr-i64xne%7Q2nqzElj%3jSiiYBJd9vJJbm* z1^`8vuqf1L{c8{|JnQEc7Eh$Nhp$g&awZe!?7vG+8t zW3Bkeg1^=O6}MDx3%V*5+sH7y{Bn__7lVB#p5d#ci}GO?{55#gu&#DR3X(OjDH;sua=#= zw6s+}`(zzlW_&D|TxH8erIW3{a*SL)lzkQ<&Cn~p<}BfdS-$3g<%jD`xTi33nwW>` zPNI#>D{+HBC-W{mZ3vN#a=nWlqATTFZQytu-81Rg)NfH6;-u29UMtyUfZZ{-$4>6o z`WsUudH~zBvDvzg`{-%lOyPlAQGE%>H@sA#|3GcS_TI=r=!DoP-$i-MHH`dUD5QZx zx|~_2O&6&H4!Jb8cm!#{4z2ly4(29}T%99t0Lnm`KCE_+m!f^4TeWwy0p+Yanf!^N3T%H;(r z60n161iHJwR>kwGY6@)I5~$+YDGy4H5#^EP${r@V4cpJaL*y~nkX?~ctR&>IF4i=T zJZ@k}jLV2DmQoeT#fmg&Zb*rMZ(Sim6ocs%efdi{5Lj%Svwkn@Ue-d+?znR|6E2|CX|I50&E=YVKiXLWTC4gYiOKGqS{=~qz%{8!b6w^f??||TaTq5 z+OYG$M$FR7N_JTWQlKdnUNhf>CW~CDkXUudYZVN7ZmrI*C|)z)G{dQh{St}O(k_)I zqjcvjmr^>mm$TBH6E64)Bg~j~jgu*+(huV<)TI( zmn}>RgtlvBgUDf?gE3pMV1Eds!C1%eiGl?u0|>U7HOvEA0&$S%V8~ab3gELz$m9ah zP?00Qp`NjS7!x5@$9a&o?dR${ZZwK%4|iGW)Jodbe$c62Y2txyT6UK>=`=pKbgGQ1TaKAw}yrN4>vZ(Zj@g1YLW!b{@xmk1mPFx^4}AqIF3RTmo=|ku^yzA@;Ct4@?8<*oczB)jhX*ST*V@z66Y?4AH^()_4#RPcBT<<& zqe(XwuJA_3ocd^nljsBD204O4faz6SnqGzYI3W`2dg0WxQFXiz!j2?#WC)L zhD9j@D?wY(9{Z_V9i?XG(-)LUAx{y=FZ$uLO;iaUL<&#}Vr8!F1OV4fLJm0a)NT4X?OZNx=uIK*KQiySr7;SA-DV-FkP? zD_Fw}(`IUN&#qhleD6%d@6N%Hawd75*d8gr;eNXr$z?(2ZDkHbQbYLZtG5 z(|zLTrG>e#MQSEyA<&%Wsv13lZKq{KC<<~jd;|slan+t(v6=v!=P7^OpIJdFQ=@?P(?6`e;g>r?(lso&A0))75iMpr<9j0A0 znslv}<7Qa#Lmi71x&i=5MXgAdcBv}?eb<=M7%+E@8~v48PoK; zA*{k9N%bdolWiT(lA=?9LuE@>`MOARxM7F84dyhs&m<`VAtrjk9#d@4wnE?nha1ch zhZBI~l*t;qJ?VtAPBpV9zx5E0y_?jWowJlVDjtK|9si8 zTv`QLL=N_zyxH>B$-5^Pis~{$r)Cwk1;x=m;i-(uefe3uNA~GgCYsOo1)FX-4NH$q zf&@*vr01z}3%Vyo9r8aXH$vZOmzoniY?T>r{`3Toh)KNANxNBi}+E^2-P( zO@jTGLyl7RI{zI7GA)+nKcedW8r@`iqy??a zOdd28)y?b4P*mxY>-h>*imdQ|1`|I|&aFe=JVg7XPfeX#@~%sG*TDluAp24EhIgKM z`3slcvNTtj+oLg^o=>3d16tmUU+N%^mllw(0F>1&cMa9?4jVNDhjHcV0bJe44q zq^H&};7#iCbts6aGNC>gZNK*Q??&&pki)=*jZN{Qrq98Hz4)5R>GYOqA)3gBPS6^u zC4dPO89^D+Way|=Ln*8LH3AqmUB)OBquUK+X%IXyx*IEA({5!x-=b!($0wL3bz8pY zz2{9hYj0YJwBPnmdS36K?Tv45OBB@V1YRDXa?*HR0v-lI-=Z9KQvM8)@?HF6N|OSe zD(YP=1tQh?yyqdGCSNikoB#mNG0^IW*8Qj>JITm)gLyzvx9Z{qH?!z~&lxBD{=4A! z-z|AXj|2}gVit5h+3-CBPcqQZ_@Li`uNW1z!)J_F%EdeK7n3KR7ybCn$GZZ&gRhuS zA#^rHcrFI>0N*h1S8^U+Uf`t!zD~X(7D~DB)KVsuOBGV3?g>ULmextRlrLjFN|1_5 zc8jH8KLYHlGQ2BS-aEw#E%wjdd z8a2@Qlqin(hg}W zm5LI#A=OT$Co1r~9nZUzXBx8|c;1b?_o&}sB-yB7e0L&lueb}4v-?f6NTaCrkGO|m z2Wjo%Uck=2v{;NcVw(`V4|zQE#Mmap?ni7&-b#P%FqWsZ<{6|vkd~WQYCt>agtvnk zV-6tZ5XQJ0tv0scAcLl@sN*4w%Cl*)UbR1v_p`{M899W}6U~@Isrek12ufORI6{ZT zR;dwVPS8xylrkzPrw#eENUfK?iJ?imp77S*YY~rR=$)g;{fKmwkCb>U<>@${j!Bi$ zajAlOO*+zRWxeMVPoSMApngJt*7HyJo{gtdJdM#lCAQxXLZ|U& z4{|u8!OK~+uU&i&UV~`tt>QU6pAkD)f6#L$p3mY8i|5gYDI<;}T-4Gz)O-o0Jck~? zAijXFzbu^uo_Y~I7(xrq;q6N)Z(qjSjFc~trEf02^iLw=Ff^$#e73&|DXi< zVB573SR{$<_bllPETbYt?n}dIU$7- z%Gb)o?iJNI#PBtIXOOiVI*cx)*Hp`7fZpZd@4=4|R$!N*Z7NG5M9IBUdaR~|g0yA5 z8n6Ev^3fDeNLj0=P(x};CjC}ws>adprH#fX9!5@eYu~EO^AmHTbwt{AsXpxm9(DgN z=p)_ZNyZ+=Hdfmk!gsh;qTbI?z42?@a*c!~TL0o;ANwWR_?~u&wkS5^@(Zoos)qGn zwRP%fqLubb`}BAHMQOoQ@K)8rIb$cpR`LYohcwQ)!&VC6O{I|GBc&|e1SAz z$n<<5A;@m0BO#sYQHb(kR4itN*?eOzQyE@xWpFMZxOlQ*5dFIPqZS7y` zYCV4L2)=c|WR?{8$!sNkb8G9Fvz;AD>#;MZ+mfE=JKE0S%Ol56wZUWei(M^ePMtZ| zku+@$RxE&1Z;=^k?wJ`w(fFcci3!@G{wX!sjVl zt~nI5NG9n^W_3Y^s$133njo3WEbS<<7Lly!Qt>A|ztFjm5g6ksLNGm5LB`keWx|Z# zr^>rvvkTJ&^6q?^JwqF)9O38a;!=E6iS#vH=w5jkc7tAWH>R2ELfZ&c>=mvTu+wQv zc%bDLM2Jk~|?qpIx-RXZuTZn-wNRNI!QZCj{C>P2T2xt_%)o11AKt9QP0@a=<(FwHM2yEAcn zVyS3zqGx13%=YQN8uh_Xz0pDmS^zr&F zapx8amdqSphKSiU<%;J9@9&t4E;TkM8k-k3A6|5}JmxXe^>YQ2u0>~~@*K~tnrovM z+kcviIC%}Hk9O(UzUt#DG{w^G{1^9;7NvGa7tkQ4(-RZw8z~0RiF%f zW;%#UG2udbrTzr@rGPItiTZ#lMreb4oRrP9zIFWW@tFg2rg+Y#xO3Cm4n}fbzgYyH z)WMnDGNw>aD?U!UKKGjp@|CB5LtI^${0O-DG!6t>u>EW(Fgg~u(S>IU%93Z;E;fE|h( z9bu;C;xJN>V=h@5#1Y6WV?w~`(0Fn9Dp^(pB6?=fY4;#ESYQpnH6GxUcA}7fM0RStq9X>QQ{Za1rN+tcwn~Q@P5-fjt$ac zMnlO-FVZ+~IE|;)X|=Zl3JCk8U05mEE)n@pyKr(Hj5y(J4gEzI&M_6>%hLwK)VCEi zrvnC?!lgnUZ@gd9){**K{k*zN$HD4~(Fyms`x04^q+ORt)suF?WxV^oN3UUYy_#U$ zrL`Le3uiJaWqsvEUwJN7sbA^8Yqio?5xXZL6vdB%JLa3eKe`w^Fujer<~Rn|9C7dQAMJSf)j!&e0H}t30{a*kqLpz->1i6 z3cX3UAK{j?gW5RPF)ucp)5N=LmBD@hRJ?48O0>-+AfwORt@WA@HQ_C!Xx- z$epj>{`zdsV$mjY9G2Viu;t;dAA94^e>vXyV%!&k{~Gce2E&LIr^$7~^!n(V9p9~; zfn9PPc|kv6y5B)w&`+2?f{gV&%Stf_;-mNF)%u9h<~PC_hS50CQ`lI-Ya|k0CAlnHyrPrSFK)Q3>Z^gAP2s-)3@e-`@tuUM7(T9x7>tUs^wIUXJC|_pGABb8~{S{ z(9qWq=!UZy!`2q15NdU5Db2KN2XC3VGQ0`0(=M<$R2&kp-PJT{u#y~Q`-jvW`#Rr7 z)uqb90)aLX@j;>ec807 zT4G^MTbxpAidA-|rt&uNrfTV%lpP|em7#uPM>lIHjj#^V_c*m(3*(px38SXv^mzw* z(Ri$36zZxPaFl!%Hb&8ccAFa5j+4B!jGy!&|ez8W}|WgJ1bGDil+e$EzC5o{O_ z=#3{#-=L!Wx~ksc;RaO5aCjNDSpCpgi@FO{4Gj&3grGow0#pF`2wU?p?EkL_@&8L; z2i4?`%Yl;{0KRx;3a&; zm)9E*crsqneXf!qBR2d3a~=`qlQ0qmN>G4O8**iyaFW!-rm;F>4U_f(+JNd%=6LH4UUG zA5b^Ya*?kF6!8jyjQq#cIn)4jp~4_R?Sro9>FqNxNZPxz)I&8$Py2Y8mFP?%J38)B zPBFIgKKBNuTVS>rTedVAwz7`JH-;0Fp2h}bfS}h^2*R=H^6(|JzX8GzY=OlTSWEGL zo=K-?h(@R92ZEp+(GH9(i8$kNcf(d~ipOlM5&$=smW%v8_39ds^Ya<2)SapxD@_4D zEdz>s-T;Q+vhr^c7``xXCom+x(tKv3Anp1>>=pGZK#fKl7Xeqe1B26X5uS4rI} z(bm6pLDk<7AvcX(GIVyU)Efp{LK1gHbOk<)5el|fEF9Q~FE{F+GX9Baa^MXEN&u*5 z#@3EEL&XBmTDSaqi*28lV*z&cp;$9t_XAsPzMb4)$zF@$-z{vfe=Y` z;5hed!-^+HhO48XWk|^b)z>jOeMpy@FY8B+q8WKaa}7j~r=_BFf<2@_8x5`i z+rR>x%?gBjltXq0zF?6(qu7Nqcz_7=lS*!;&ADjY2zXHNwikw>f7`gGg&PAK0vma5 z%4m}JDRQtwXb1g~k@Nn{g2c?*AS`$oUDrvv5!uM(a4VLVHWO&n$#O;|=QS!hm*`}U zg`Dki=k{OR6nN>2OaX9sIw1dia{!+{brK-{AM`9h{Xb_KAO#KS-|IY3%lrjR1Y~EN z3G9(!sn4AXU`ddg%?0`2uOYT@p?+CX>Ke;WnFq>SBF<|jLhr0NcVr=FN8GuCO#~)` ziTQ>jjO#zue_477%godhE;LSspLCY{Ztt6HeN0+j+GMlj3?`hx z`_*&eyTSLJJ2?nE#5XCdDGebq6INSsdy>7txGCl#wiNb(ls4^BrRlKP!qIW?)%bfU zTEM!<=!M`@Brn7atnE=%BtR5I`yB;R_ZljrP&N=eg3;K{3fl}c-Q>Szf9a5ic` z#F(fQ=^@&>mi?6}i9r#@=>#M@+Qh*EB7!0A8SaB=1Q}0IrkDXK zg{y4QXE+>M%TJwgG%)i2f?LuCpVvJX<^K)g)TN7K@bbtQhTpib<8OWgW1yTTwBi+> zFoGCLm}*TQSa7b_?Itgf@VZAws``0=@Lit~S!XQ630OyMdt7oNKzCs&`jf~7&zoskI({XS6@J3;|C75HV#xP8Jov=eS_G<#jOHiG6i z5UFr#B2E|7w5VjeE230rku~3I7zs-zy{4|YVka*?tv1a#Q&F>e*6Sf^$EiK7mXWGx znfeVJ^az=BwyH`IcspZ!2XvrMD?>hz`MXTDMoyJ#ee_?I37Bx{y5UUvUbMhvsI3bs zPObMv_%1>JJB@vhV|xCqWmplnDgL*(Kwu->l4@>D4fYi9d)6B(rrOVR2Q57@>A19sLp5x(!HhvkbeQ(UCS;9+qXYa_5BmAwp09UL1|~ z56FLvhoGCUD_Mls&}CgokKrkq1<8dR?t(2cxv)*TNYTL#zQ)$r@Yn^3l@56-1z82O zyr>0qTo|cdGWj-2dTB7!(K1L_jj#VH(Ve%@T*f&Rmm7_Jw-^pGOBIcY zipHgi{fUbG@dKR;70+WoxvSMQd3rf7u#{Je6Efr8+IU{=a%scN=B3hxL}|l(*3#C) ziLHm@r7cq@$q9I?30_JVlUZE;miw-I^7wLb^=yBlxDla}nmN~eTcU1XqNHi^#N(V| ze*DWKjx=0XciRi2)g^y*!e71UuU%djyzTvI;rivG!1U$#`r|*|{Nsvv{tM8C7Ue=4 z>d!?nQr7ot>%l;VLdku&(b;Y87Of^jBU{kJ3%2VnRW&l zYOdK&_2DFX_>xlCTameICEKiwuWP8WdOF#IF1d$YD~hwXBM3YDByivG z;KmG9pc2CVZ}=F4fFeqE)}s;FR*=9w=^>4Q;*yw~a}ao9wpD? z^hNb6hrDohVGj8;hv!Lkn@ci3H5E60mIIW5`OHc6R5_Yk^8bUnv&ylB7oA}rS#zo! z9SllMHZbwZn?EOH`fcO`+l*2nuXHK5Hj!I9+q;m9^M&D3^vxYJkvH}xa;oFb>Ud7| zBd_oE+&e|Li|(wuy>2#d!C$-J-9Rh0Z0??dET!iiaWa?QyPRFHlwF(1uKjLgZrg8M znZ5X+Af8>jkbUT(DUp2`HW%tgbqQzPe9@1-{Kqf-@TIu3ZqfOiZu^k3`nIB;ghf`* zreO^Oh9I8ah-r|VE<*~lJ`Xdw%+c`xPAXS?yy1IGCOm>%m6;2!-JEeBp|)p_*Mrr? zqN_d`uE@Z*j$45l%=ay7{vz9K49t+Zlsr9mH3ZB+wnpsAWY>7#rsl0+27B0#ZZ&Ae zz6f$qg-8RCj~V8>0$ttAt2`9x5knmFILdJWoAAcX1>7E*FjJkDLJX>CriH8GxJ7P{ zab^8PanmmVIs7;D$`Kisbc%~N3qtT&N3%Sco!S_N5o8-BZA3KZvuN7O4tnRLn~QD% zdgn$+oyts_KSFRHpL|iH%~@S(k1a-mcJ;{uLC!rnE1Ay7gPJNh^;0 zUGmo?{57+k3;s;qqL zI+MyB$3+0Grc7+jp!o`_O>$JOtIf2mRt~;1VX<7r7RwpUoiR-`HUU{Gm%hYB z)%MAhQK>M>V+}VDNkAhV?ZDvkGlXR`-l%@deF*a?a>So>sFk8opaQufoPA<2G*M}+ z9hg1Rf}~793(tMqZg1w$2_jUn4u{zlts}?dyI@}j7WDMg>6wj7rJE9^o96Z`l6ei}fP@&oSCVGhc0k^TpC%!kutH!1(xAc{ z34FukQVO0a83R^DL)}Fys45)WAq^UamyIAGgZLm05I7DcOo!dnF(;4!Mg|%z9;40D z@I9qLoLCak1%*(N)3F`^I5?07rof&mKzUsdVnv=_Ip;$$)#LDq)I1%J)S!+wY|*AH zLei{ALECGYoB=Ihk z8Cx1BohtHAy0nI^?h^@AaZ3;gGziC0#_H}GCeOf;MwB|Djry9r$w;yv z(iaY91ijeb1khmP)s(jVNgY2eJ91G?pvQ#>hI%U4&}gT^!(fz^dN2zOFgAK7K#in%XGY&icmEJsE_R_OjL-@9 zt$G=ZUuQ=_rvs%=|C%=;R&rL|OOYP6fxvVppaEc-Pg3|ZQ)d9C-s(xyBbZuWUhr4V zhG#nx{yJdMoXW{48KlvHoEyQVbKQy&8zMIjpxq@=^6@TdF2@5=+Tf*xVP)>!Xmp0bd zDf>)F0YHk}#;2 zJ3zIJ==EP>1Y|;(DvXjOkyemBoB^e+3+b?#qqIpS-Lc|y&{Sh~5@eo4?to03E?7A! z-Wr}7j#oCsvv<$uzn8rmJmdPBcgo)`k2ka~tZ)0kcVwn{+JC3;wZgdX$fOOoWt^SZ zGf7*^KmFJu_>Y=cZQjXi7OZ^Nidp_PRoOQ*jD3sbb3*EZ%hG`!xeD#;K@_`)n3Mj7 zVcs9(=~dxX&*w>dVQkW3YHzTU{@wG zG+7h&sJ3z)*Yqsf3A{LqR$sqPIHKAbb;_gWE?ViNY1u#Jd77pP`XelrjzVih&iAxd zILQyY?oVgj5!K{hmrB!`hDTP?p>cEM0JJNbcO5;Q=um5goq#TR)3{4yhdE`^#9RvK z->IQ!l^S9txuezUv)ZT7ayiGXShxT-CeWgBw;F?Gh{pGyrHM1R8JZT zy2Ae_1{J6coSgxiG1gAUf~mCDxWD-C89%bU6ksPbkM@k24OWIX0r~i@r+i7sIx+HRZx^nD(ZS4+(jcj#t!7sC%$6 zg>i%M6VaQ}F`e=#wgV9rJ*i}HT>T!ZxE^VQHd`|@(eMaP%rUxs=uxK?{iHRNnE-$F-*5$U zldgVR7)7yfDCzGX!q%*Q5rUH8$mC9m1OvoFRTtyMXbh}Hp|BG&a zPPYJVNzd{2&bD*so9k1cwS zFMA7lA39D|F^m?0gmf9&wO({U}i8E1_NMl5AGWzL5K%LQiMQIA|+C?NLfb|10V+A z4bTsuD2_l&c4;@DBS(N`o5P3>hbd(>DrrlIH?@HiWlh;qLRn5Sqk#-)1a7E`QXB78 zLqaav^w!pXfA_m)@Ic9SHnsam^y}%@ue)C#fB*fT6;nH(-;E-@1>ZWfP}GtrYIz_2 zbJq7R1}ZOl&U@lby~)6iY4O8?K;+?Q=lRFD=e323^@)o0^BeDdzvAAd($-{Yd)yCx zYss~WMo_X`<_Y!ZPj_Fw@WU!!pVRik zb$2`Q;~l3+VZOJoI@8-8p>~9{E!Uv?L1Zw5P~_-SMWsN+lDx)@6AeYt&|o9BiIVS( zRb!fHqD??K#UpuWQ`V)tWfI7vB|B}Zh9k7BlcvM?ikD4)V1nTS(Fl1{%3&7k?J&C_ z8kty7asj0eDy1Kx^_F!RnnqBKFl4+8LGH=i)ksw5ldnzS1k zPgK4OMjhIf_qDt7^z)71q&4ioQ3W%Ht}}UXca*0y$e6c}Tw$tA@j3{r!01MRSQG;=#&4yh@2Lz>`$nh=8w`CkQP(Dh&OKAbn^Z)PXq4F&d|C)G+yY<&AWko%9385{ z_Bo?Xe*>CwfwnDzqS*9HD`tANZ9migu7cuaxi>Hiz&%ybePEqt5L~F-pV13@SK>`U zYTIfp3jbQ4`p4AtJl6CNOKYO*UTT$_-yGnm1a-PZ2W8+3FbpiwNf|=-B!&Rggph5F zEF%x49Q#hg58&}Wh&*r^vmo+vc{F>Uf~2SHU%W=_g7I(7<- zCVoI*8B?ZV-i=RF;TF`*d8o9dC^MAqTq(1_VCIC&Z#S?0Ep;woU>qKE?%;Ewjoinc{&Hk0BmX&Hz$gllf|uP@15$ME?9)QO=nHQ zSu^jfTXK3{*nM{Qg0mbl^O1e?&gzvZ;D<5GjGp?qtv>FlUvk5vnU7wJST4HHyOV*Y zSnV4fuXZF`y5HRSgZsXJ-(T*z(wo>qLR=ollm*yNQTdbwc00)y#Vj6Z=C8ORSX~WE-jW4xZNghS@2$USHRU&aiVO|uTs-;}$cDdNAAI1fzBNuW z?X4o;j%MNQX8X=2%iEovzHZAq=0IPW`JGY|#mnq{jp93XW{NkMDBkFzcvsHOR^grQ z7QFS>br!_`y3s`OCKhk)slC^oiF(mVfuUZDh9Vg$xH{zs z5u}a{nUx{4t^{JQXI=Ud^az`AX=H6#*`B{$H_^}G~y)8GbigEj5#>WZwy zRS%EK3K3x<1}VgvAg`i32#;-E#n(Jp>>%cqbe=%sJ%G>f_^G@BV>`-cq@1XWU}YZ( z&|)hg-Wvyq?;r*{$-}4miT0CeSwY%C4f3soC*LC|GLDA~iueNy1x<;9rkFoj&@p8r zZ$VqmZi(FaeqO_3LF;taLP2Yypf&brykPrWQKDdb+_`-bT%IS+J`s81eOL2hK^x_1 zOBA%l4#f+4<{AAK&4a={Z! zKQfQ(zoc@2t!X)Ah zAdeAe1ezy?F4)xrD(vomZs|JF=rE$26_A3J>FhXAfU!u{1!Vk}8{(AVn!=FgKRdYa z88H`SLMkJ35)FD(g=8{#WAKn5f{wh-1?5Jcgqd4TqLpho0KtCfmBJ$|fl0=y1{hTY zBp~8J#wS21=4xX>jY`f;hH7kcxs?wxl3u2PPzFoMq9uV~wXNM`?GvVLWEvpnOT%P3 z07`iLnzWp`8dYjaHpj z%tS%8LMCX-#@5y1(Fb@a4Id=u)Sw7+eL31xloz-?RE?_5BzO11E82F9ute*U)76N4 znsPG*Q&>{tUCgPAZ{P_t+%EOt6-73W;hnG3BX!L)^6*O8Je@S4PV-oo`Yx^hV<_rb zVL2e!E1AbxJ@~I{`)NUYWkYZ+KX9&crg9;_Baz<`duq=AgYxf} zC-Zks(wc;Su~DjDGotzMea+Dn}G8U?Ncr4(z~>bDa1> z=~>sLX>}IAc4U@ySrbMJiT5y3@xc&b^Vwjk@E1vg(RgCZvrSum#A;V32O$WYL8I$z zndgp!AeIlNzs&y6ocF9jXxo5V7CqM{5lGn&5o+M-4~=P*avbP1EP&=yhSH?uraeIO zz@lptYWkSwKqKB^d~sjRw0|MLI+0%;?TRxY4V!zxR-Ukx&)X_Bd%4`{0V!AwsXH)= zPrUg4W^az-iAzGPzO)|U@dv?L3m7pZ;+Pkqw813{uSD6lHa02 zKU-NYqnB9E!O|Pd!J$tinP;l?tga6JFw1lvHA)=@Epxc_>1yc=lh)Izr(p-;AJFZ1 z`iz4HZoE7A^qFQ0sYNhpym9F=rjFzxFe&o2z{Kw!CMe5HUj81QGsr_-B8z|eX9eOJ_a;4cFz5KqJW{nP zPv@BJj<~O9!FO-M2kVah>5<4VsUSJvo6_!>`tnMIm!>QIE#Hgab1a$F5F_(JmBd4$ zcHzHMKwqZduqt$;u|;{;>gLia(;j>IzxcFgSOA!QT)G!)CtJFhjTQn}W_4nGcw6xi zT-sM><_dmR#zJ_I3HctO5!T#_D6_?igYkGhA7Z%cE?UU1NkA}d0~1B3p(SffBaugw zo`$%sfeji=K-sv+GssV5P(}rOm~#TkmQ(9om=a#6pH1G7*&iC}=LluYHotSef8?k158?8k~_3k6t&i%GS4 z{NxE@cmvHNAze~Z8NX$!1?PSivz5#1;2V4qVsHeDoAY%?YuUTgQ3SkD&maLa`pSxd=EBvmHnB4#8P8 zJ#yi|#iQqs&gZqr3bIiBO%#w;91!vy9~M`|o!#;3?xeGOddoFm(YcnHmJ37ChL?`U zp;>eHVnNMx*SWi9?gCXO`Va!Vk_XzYmyYbweNzw2JDV4)I!UskGf@RsNb#z^xt8~< z`r@`e_$bPo9wC6pq|Ku{lAh+cO?I#RI6grIf@m&KGZ_f}1tQqWR!{KL5XB6FjH4#<7%!nKL?eSt0?nml3;p(!4CMVAb%(wE$t5WtWwXN;C^Lk z#qkE=EuE5s3@;c$$dE_&sj^5ggJM{M9I4X~H?o@a4fGl(TSd_I3?oxWR5VvOiUuNb zw#`?M+`s(?PBXoIoeXc*lQpz7$dNfvGgwaYMf?jT9SQu;>sV@AJ6rVUm48~9T-TFq zyL)QKg0ni|td2G$FujY*7K+;v#ci=KCW^ZVgR6q(j;Dyt>IvvjEEZRO(@hv$6;ZbQ zY{LgH=Xi*~CF2b-rVyDi2l+U|`2`UL^YFL)9efxFmWcApP-lnmgse-M>JVR5pBPP6 zBSO^#)yys^qRUGK?h=W?lyxb!fRAsuk3%*B?WgOYDuyGHy3(HXTi=Y~Jp z#Yla6&V|NN=y(tgn@05;dM_hS=-3=9G6OmtrIRe%h-t^p@;$3=-rB~Ey&4C(fdRN+ zy!U~<5BBW8Hv>m|Z0sa4;|~lTfUBERgQKtrFvg8utHcywU!33xX08tOq#Rn2QZtqT zc&%_t7{Y`GxrF#_Z1pzh^Nl_i4-ZRYqs+(%`Fj9j03SsckS~=3ypNc~hX|BCLcv!k z=%X?u3O=TQTqUGL)@!VmlsI&342}|ds7BclB5^gex>+`9fYJ^kNQodf0*kSsGzDql zc)@Wz)!8Ov*?I`-6{1cc1eJm(|AixGkC5&{(p?2^Zh7U!-RE~-eBk^8Fo!YSb)n{B z^ZDkNTBGByoVs)>HaYiDvT=L7q$laT8wb$}uu-S(hkZG~xx&DddFqa{_G@|G=^YFH zx&;2`)h(6QU0id1&D7mfr@nsQlB+l(UN|}Ls?SKiR$4{R&))Zmw{*c9On8IQ;<$Iu zY|-VMgm=#sxGC6!vvNkUiv@vmch1}yFKCH7TM&}x1DNiRMd;wf(II#Xr<|YK1$RKM z^0u!;hQV~c=J8K)@4w`@gLqkfzpmwq=Bpx)KweXV@l`NmUt{1PD2fZiLB@yw~Ji^Xu-jZX=^2UoACGH*$ugvLahx?hn~#zVlrfaI&g6~y?1FI~&41m6+0EBk4co*%>EPPkz&PUD@B1{Tn0SsI*4AKjYMmd6Sl|#I!zJ<$ag#{TAgd z?XJB)p~@Z}>Cm1lv5B=xOzUy1u=PsnGpbV1%F&#-L(4VkoOFG@weXBxFUiQ{7FDBa zM}kU;+8r{2d5or_Q_Epee`^#;xmsbJFm5`9gUe%}zL-cN@D47KXz--l_{sB2tE69B zCH)zm-s~CtcR24s6oH*wxJoKF3a(HQbVnebO_sxueWBbIyBHsQlCTR#3YZ|lEn*rv zl&zBM#OTUbNE{qt&!j)>CvpP0JRwzeoMKj`a>xq5D^Q&_wO*>9eIwxv?M%6no1-Nj zBIlQm!qz!sB63|CrOXLQW9U#R8IJulR7U;|c_&->9k9!Dc#M==@I@dvgm9*0?nzZb zy!<8?S0VkwjJE5#oHJ(Oe{?_JHT#}A0n2)!mB&DK;>m2u156!;dw3ni5s4af;-uc( zE`4GZJz$>EERA0G}K20s|csOAEe zc!7${&|yudoR`Oh7D+WIquIJ{pd&PNBJ@Z&ciY0gAMRb)FXl`L-me(`t3Udywdh+c zAIs%Nt*H9}6d;|#Jb<$!MlB<<9zG8y1jkMuWV{>Qq|kSpd?etND&bBLDn?F9R4B$A zWD9am2}TztBpbXT$S}c7tBQ#wtJDRELye{irMj(qo^XDWi~VQPetN&SJGTCU`J(;2Jz9Iw zoha`9B@^@cT2-}4J7k1yD2v3TyTdj%Vuwe&Q>IfX>&c0cP12j}&~obV==x4jW$19E zy_vGJ15E!&XgpJ-nEHzFw`FSdx2+6c7D9#^9B0L|Is;K>fVUdyoGG}633#><_N;qu zsCcZ60SW%?-5*~6v^sYhHYNx6XG7GtViLf zDrG%22sY2xkN~NRPx0+3k6dg&+}Dr8jKE zocz0y5}J+Z^H{0l+!0}riXnOHW{=jPye`($Y!J*R)}_oRI#cEm+($a4UTVN31s~Dt zPgAgyep0)~iO>bmGN3@OpzI(}8pVUKQ@;WaQlEF>rC))vxYHz5R71)C6JIe_+HB)| zad*?qo=eNW*CdxX~c|u{;vXE2gp6Y|3vbXSsr_Vke z_cYMN$eYPq@Kz_h)$`ukn^uSG&a^;5K=2mBv0qWyxg#@2UOWb;e^v|Ze3n*SY&qW& zeFS3D)4ex0qj@)}jp^+s!R@8CM@FdS^)UKrZ;tt5554iotB=f$#2!hu_p!7qzD1w^ zT;ojRi_HtZhJ>#n>1#s!4bpCcD_X_`kg$r) zR(p?WF#xfCldFE(y5xl!q^R$w-a688tpCL)9#RKDmL+F?+}{wDqM>-pwz%)EpE|db z^{yV%Ev8=jHGi>iF3@TDQ&XpBVBRq#&U^F=46w6&f|h2yh{1B2L~7(+INz{X{MWn z4FKfUj#n)VCUfPhZ=gu@4dbo8fVducO4+e-qCX&rvO<;}X@5iAKs5Geg==71K6Un~ z3rw>lmZS4`Cq0EiGkOAV@t)Z68}|e`-cm%*Xq?04)ECU|0SV2t4+U#vM56{&@36Uj zNSe`oCp9VKJM+}<>>tw2bzSOv^sU6>%>Gtu>|oNfA#U3s%dJQmv{0H{L`S5*WgC7m zoK6oT3@M#tya0xQX};h(V};3lD~Y!gPlZN`32f7h%DP}{Nt8vjNz6~wXqc0tW)xYO zMG*A!Pl^!PhPAUZIndJ0ksP6%$(&Fwedq{aky=+?Rz>)!;EqbJRrPnxAscjfp}(t& zUW*XDwhz9EQJ`Vt3yxbw*Um)zh{+kSDiJ|<;vzu`F8hmPIr)+!07z#b?f5G{9)Mvc z$UKotR1zZQnYkPa@~da0fr0iDz+dEf!wr6M%@G(b=?R74QEhA#oEq}Zq3IFe4IHBZ zaasL1m#gIsqJgAbFea&PMH!($VbPFF9h|-(@_O?40VdO|Ji&)aaGCy;P7smNL2CGX zgaB824Sg+%U63HevBPlD!*bB~kJ35um{uz9UbR`I9LY|R#0LM2_UXD?rj-y_%p_0j z|2zaAYL`6B+6ZeW#{Z`XF`UgeF=4hDKBk{z6#M~YC!|>sc_E0xRgMTP=a%E%q!_)(R8?i1 zn;nCs-N+uUc#!RSfc9z|by`h-Ptfc|6oH+)fur9`&I)cBe)fqg;=FS&jKF%UqCjI| z`MEx3O?cX1Mz*r%;<59`e(LLq8eh$>?_1QHIcN63~2Q^ zGKK9zR-@yy23|Gb3ReAXfTaR@U&F}JMUvQxN0bmO&O_Hu1RxfS*hiDF|EyVbXN>0W z>EI`aXiA@GWHF|DLSlCCludG6GM|^0q;&Y;A)t?JrZCt9oj3rq6AX^3ut5bK8hlcK zNT!Yp);J%LAh-Pkz{nSq-hxlqNd>pdIVF1#%)Z0ThLeKg28SJ?R0&QaP}`0=1iz1@a{;bT*vqOI#bHaZnfdbY-GTR8>c z655_IrB$ryNpyo=RWH+)hbHPZq2dRcw24$5vTBp|2rX_kE%Mn%XMJom(aIhWuxgo)&j&K_<{*r)_1IxzK+^c z<_%q8m=`*6x_v`e@Bqlj8N!v)Ma+wEnX<~+JY_ispM(iCI@E;iEU^PzoRs<00V2K~ z8#_oRM!xa5B;wRb-==`+;y**H1Rk8RW?>hYn0GpY)mQM4)yaL+{24tZVwAGjXqxiH z_A+a#viz03)_BX^>bAsM`72sm)D*~CID~?#$mv*p(zkXhcPY>Jt@ZIh>wI3@ ztpClx!scCx&AXDD?@O$^4_*l3`EBq(vgCmkp=j>Br->zX%sbaCLLReu26T|Rgs(38 zJ4xTV1>c5*Z^P_F(zj(Q_nNn2I+rOJ48=Ci?Vb1D2f+!OQ>Q|;@s+KYpg^?_wkKs- z2Tsc~g+-8c+c!ziqp>)G+ews|S#Ac9dWEGCh`?31y?KAOy@|g?ddk+{&tB@6%JGv) zx}-e){ezsdBltyb$qGcfw6@!V_NCXL(+j#Eb`+dsCoLtlKPWq63E>XY) zb3djS$t^Hb49vlw^j|6Me^J2ffDx})YNdc=cO?%6Bqzrd38WJGSwR6EqNQqzF`J}B zkz~r)On;hd?U4c&)2WjD6eAr2=`jipP|!yOFj=7%de=)oNu)q>P{0VPL`L8TULs|1 z^y-@w`xXU+ElGb&0WGa;Q(#^6E(I^*;rMk-*MB2ix8{g87@qPLK6~%Avg&8=n=VdT zt3S1xL|3E)1`I?OOh%UlZ@5~;x@-AWX%Tk_0F||*b17yMimKCgiaD{Hq$w9Dhz|F% zhhmSLgdBI;Y!*wWLlB)5OP4K5LfU2$TO+m5+!b4wa~xuQI^Ynu#M|#$7I04otYT4o zZEsq@{fcv$Zp%(lEC=DSBzQe9C>C6EdD9~9By|a~9}w;Ch#W}-n&DeKolEI3bLF4z zjTB7Zd-f}7JEdSz7NzN3G!{*CQEZ2)Qd}27MYzQ*>^3{jZgUgMlnB~oj<`0uJ}uxD z>jIfnT$}dh;H4o-S{Dsb(z>+QBDO|R0B$k>qV+o4AR}#BJ8POt-Y(C$5j}Ulwpn zH~GY_7~aM$-6Cu^?J!-pxWzjb{pGN}wLad|9k1<9RNR^HZ%I@7HM?tB#62B!i20HF zs3l&%F&^BQDBT2-te8KCQgKTM?0DK2t&KNsj@Q61RCiiH3VjT2*Na+3cQg>Iy;PAF z5S^=ArW*#TKrC1+Do&P-i(={%! zoca^D=+H9V(v?oJDTx~0qQVrfi_g=V{6Ju=r8@7S4Wx`#fiG+i#_7c5pc z+_3kV#BzvsP4A1Bw#5tE5}x+7NNJc2WmReR7}LN}w4BFM_nKSq8HFGL$Ag{mvd%=| z`m}|T?z)@Zui1UeB7UbIH95pRrtF+7jj~dN<)sJ>LBMbnk&aQE8lLWrm$b(HtqFHq z!rs0tB0XJHgnlZFj>p@!#T&OJs_#k*NV&XonQrN|c0BEi)yCKK#9Mk2b$8RK7F~Xl zKEDWy;vUmOm_0?J10?xKZ@hYaynKD42)+a;X?ribvk8RX>9x6HW8`FXU%X{Yynaif zYHM0R%H_Jt6K}OFQxpaIi)avdWdD@ z75$4vRcQ;|8(Y}@nmvEIK4Og=j(8Hjri8tDS;SM!^@g>t^k3>(8#0R)xGm9Gu zl;9TIOi3G2*cVI>n{HT2#kJYfi;}kOynOQeV`+NKCK&GNZlP-vfr@R5MI{6pwk@`< zW%q0L0D*{Y*Mn}cFj9~faElGI+uSps(l3UO4`DY^F9oq)rd>`mPZi1uS)Q{#ZV6e3 zt;5Wh7op}OAl@N02X>%xrB>Qby7AUtW7>8ND^TMHDA@R<(2qCybz0y^h*_d`fU(C; z$A`zVso4x$2CV8lyOi9|g6GCD&m&4*EU<9Fy#lXbx`q5P@r@R0SCei~a5(Y<9c65iJdidwaU zjV8Qpc;Z%7|6rEY+AN0O?14OoM6wnzZZ=Z9Oawkz z7DpMT0VplQ9Oy~C10xzEP%%*mvqubCqO2xIs>0m^^mxzU1hiVDj*(H8h4XrYTlm?% zW7QnnbRtIkIr)hOZ!hNJETKCO;z!CxK0!bg98OuGvT{^9g+z&za#F60>J(jHnk1Y} zZ^4&H-^I@?UEfq83BHg~G2SWTyuIN{YABnHhR^e9Y7U?{9JL*sEVbzNy>R^O@dbBX z!d;hiH;}6#8DXzX*eWAmhA}NQr8HqHjjWruRnSqqWTqt2^&;HIEZGXCcP4FR+{t&W z;RD+`KG_+UJ~ta#CnTHW$PBCgj|NyFTgDVPslkNsJ|`>#XX}G?7KhjwyLWcqt9uB= z=$s3EO1G6TBo8mqwfq+-Mh8PofFEWRegKvz@FQdy7GcRa2e2eJlsjx27KiN|$_zV3 zEJUzJ4mkzy*pM#|`Q(%kFUgKn=ZaJZQeC>#ykR#=7Y~|;JtJmbGTM<7aw4BM~G1LF9t>5-AF7=$lm8alTCLt1HA60jO`myzt(cv5qt^)YE4kGf(ga?K0wjUW#9$?GKp$VerGcup%TIv`BEW{chp-vPB54bQl za~SCd$$p*_Fw_0Bf>lf{(j{p_(P)5gXXV#`54BL=X|KhS-l7zYc=_W3+QI zesf+w2owGM`xFi&J>xS{5Z4OZR7 zHlcjl#g52(jNDFk!yZK+lXWTk3S%=q^AI<^Km!ArLCA2z^4Z~ohrt)p4>t8zM@JCC zspG^mBJNaocW^^TCmTb0N*Af%kO_QZ*UR=xFp#8j6C67Rwt@0K2AjWtK_K9bzPf-L zACTt|)3dO1`}aL$*^C9KWKoR5@!$EzI8s)f?I+rM};HQ@d$&HrH zxnK(>Y{6*J>&40zoq>v~{YNy)+xH)77AaE;J!gT@!acuz&q>2@k%c~@F3V^czJ<$e zZf7mi@OO&rxV35WtN6hBCGUOvviqKERcrR&*NLREyo6r9|#R@ z3$NFAx-@JspgPf4`K4YOhawdGtng;n+vdNqy=A*na3z%7zAt&_{%5&We8?P0KOi*d zGJ?#}FEp$sT>Y6X*-rJ+N;Me&MDzX+Y!9;ql!7O5nw5kIXRt$vV98*TdM=?ehT&pT zx|ZMtgtUek*Ub>t<0**a;J-o1l`LqEJ0R2m^;OM021F*vIEM=1&2T7oe3FgB2Ivo%~-N9RB$FN%l z>m|k);I8UvOJR5fQ24*1kz^aNl{R2$8D*!${t;jW3d5N#_4g>>r+6q0P(Tdll;!yN z!IcbWnj7IN{g4|>y*?W7uc8p(_Bk?c4{JZLY!=N)<~M>t<}ZbLS$hy1_fv2|0{4|G6uPGuFk{dXV`?0_X!~M9kh)BSkH}}X;K5^K2S{orGz66m zJrY7D?Dk53i&2LdcN#x9DndQSq>GWtc8mngpr2Ff0D?@h!juQwti0JUjgN4degb7Z z+)tC|Q53@XM1kt4|CQ29rODzpvM$hi_MWMpsR``55&ze}@^W#^AA9nH>J2bMa4tL( zj#ftpFV#mInk!@1oB#P**GJWcm}Gh^YD#;NfJVR7yFru0(!@ zu7varybDC=1>CsRQq&?ScDV?v3)kv1IO19oP1|OBUN4A! z;f!EQjEPDg((u#Z&_&Y`rSLBzsv$#q zR^8_`T%5#+;eCy!4lYi+8vHJb`z##jb0Um-;Svbc$tsB4JP?z$!`YW$&baKW>(Jnn zOzwp3QB2T8Irk8ZaVV!74b}unn+;g)X=pUDZA^YsmR0GX%?jQGAYekK9U)%A0GV14 z-wScrhC9;HvC($*H_mI!DiYjaodTjf9)uzkovj%L4MPMtLdyy#D@EVf2X%G__c3}a z-kg9eE!n3U<7a;Dl&0uMYUA1++(X;5+$p*NKX&>qwblC>x-BhY_z59*>Nio2iOX=6 zZO=4Q*!G+WSEWBgdbmWturko^VVaiJm=)ND1M)UZE3E`p3L*_JH^w$!ZUr{}fo(5e zU50Z}J;1Cw7YW>9!!kpNRhxxkbIu@Ht@({+p$_@}?WP|;6AcWg1?otozvisVY=}C` z{%_1WoZo3r|21bFYtm=TIu+aytRQg1G|;vqqQ`)KNF&;1P0fM*1>ivA5!%lt*5CN9U6^{6{)CYwPvUSCW;gqGY}62Juos>lxg1| zs40+(>`N;Frzk^XL=agA+ImKWXH@XP^d3JoTk#<);e}^xArW3SfecNXe)p^R?ZEH6 zNpadFJp@w?h1qojAy&^kFrwg?bP{?kRiYiVzh+&bT+PuBd~5>T(53Vc3{hCl*q`6Z z&UGkDNtgDlQkrejLP+=R%UtDMyOBwZkYmyYBO92Ibm_`QC#}-M@JYHag!aB< z{;v6q%ecNtmr?>dI~w)PZ`~r)Y+$e>qvpKv4&(NPjB9tT(jUfSm-lOx?Ovs9gT98T zE@I?lU6X1~5&@LVF#7ON$n$HB!)NptN_@^LFhaRksT`y}@8Fj)MIIgn8SmI>g8c9& zcx;%Qk8|mL;4A|J89O_%A+ht&#-_&{GORwyn8`lbK*R4~SNUDOJ#=PD_1{mFMbxqC zw!;pNgF_Q1LHXvI>9W6%alIX80=EML91Ic(hZ;j^bjfYe9%iP(U?&Jq; zdWgTE!uibapaZtD12EH=Xd!<==X9Ld$%=jo4iE>qHVJQNMl0~KB!9~H^|2wC0n;7K z4e-v4m-l=&4jL|zomFz%38W*U;JthIGyj`A85cS19DWL;&l}Pmw$zVz-^zQsd)w2e z4u>WVojG$$B&Jh0jyH%PC0sO0#!}UTj{IWqmTh#5eN6W)D@LL_TmVO;gRl@EJjof| zMA3pNv5&Dd=%fT>e~7eK##5HT14E2Wo3g_`pG@CfwDJTwtb;f#wGrz@CG_KHXC-+&yAx7j#x#jO+ zI+?>E@()7_*pRG^qc|paLDN#Z7&gMNlyE?gg6P-qSwcX5hOLa*DD{>CQEz=^&80O9 zHQkAt?s?ChOTMyr<;FLyb6@;R=fb8viA{Ur8~4V`A4vKhj5{A(%%rp7SLsaY`JU+t z5Z%ZD=OQD(FL?{5_a?oy(ZPhb5puDU?V-p9o?mrgAPA<#Q} zC|-G2#IhJD=XM${xaH_#dGkW~+C=%<+2YG$ynJo4eCJQBR~~)OjiO3QQB+9my8$Ic)yG)|GkgMP|+1_*(q9eXsL#udcsIYUrE4 zU4JV_8l#;&qod&-1x{5Y@CBKr2Qn42YM*CJD|E}h;;An~T8Vib*NyqgbKgfaX#Cvw za@XtTH*BxkW(#IRNf;TZ-SR9y_euYN*+Fco8#GIn5oEHdyxG-+%k{7}`{_JY8APWT z%#%f@Cy~Ep?#RzAa52E=iWNDPOFh^99l$l4E7p)1in#JQ1pFJ-b5_X0PD5mr9SzRD zz*P7voQ-nXNhMcfA4p%Ev_NBwbj8fywVbixZ6iLCs!YSq0tPukq7lEH)PG;kRZk}> z|7lWH=~14sa@7;2*7`|Z&Ceg06xnIu^Ve@%rGE7UtJNQZL4D(|U*+5EtCVfr`EuOV89tz?ioNl%9nItLjw@m~vg?qpb5*xVhI{*fmCClve>1^EU2DoVpK z8d`~&M3qe7{-0@$UB!D?V{VzK0z;>sY&3-1VYwkV>|Zd!mb#}TQWv$%!wpDDV;mkV zA-WuEj2CsT*jb7B*S=8Nktpqmothhtmv$secf1V&`X3#c_kKag6a2WiA$wo%zWgxT z*YEqu{`f-=zxUX@|B=Opmgxr+rlL~rlXDNVa(mz2f2Hn6kAL8OFkMLPgthF9eVqCz z1K`pYMt{pY5U4u};@Q_3OQr~wo~8Jj3{x2E$h>zym@f-7EHs!>8%k36a8x}d|kwIUH1B9O_oT zkYqeE=v%6fK1fuV!okmysA9aU6|&7F=o9wnVK{ceUr}>O%jj9*6Zp~V`u)>!Ss08f zag}F_dj2i)alZr@E8e3KWo?>ha zhzc)Vqkz#LKc(1B3fKn4*4!&p%Ka1&J(7tLvY?W_!j8Pp3D?cJ&@}Ry#pXyTy8irO zl7erJ?I0<5nDEIF>mvoENmHNpiqLfsAxyt%w)fSoa}Du^?TH|CMv#2@(3SDGjxSR* z?Y2NTm1QBNn@-Yy!7c5uh+i}*LaP*?gNhB^(+-yyTr8@LjL#fTTPVJ6^W6H&mbsS8 zp?LRhDC4nIrX_)==}H?U`=d}wp?mDm?D(swnBvQRlepak+?#ZpNQ-GbtieEwiR(5Y z2K9ukcSEG#B|c!%Rfr#VY^FLMfUXF1c_@+&@~j1>~1un8sQX;`8`9;Z-Lnr83Hs#z>` zr#VNwgR3>&!PT1XNPBIfBic(}?4W_cE$uH9D;J?QWubdrTWn}{eeCf$f4qHbqHY^c zeQ+PUv$i5vy2C0Klkx#>Q9r3}6{nqMv1EGRrx@xIHcP-sB^Dr4A!r_#XzHdEQ~q=y z?x6GV&uEH$je>KOw~b;G6gxq|GxYNv3YH1{_fgt+C;&MWZq^Y?nW0BO=uCW1Mk zrev7Pfh9!{p}4{zoBm8;kib4yv?D}-uOt`6NWFlsAEIe-Ek7T{h_}F2S1R|^@ZeEc zNsx%%o3bA!+eG9ZP9juKBI2d=It2tj;D1dPbcaAWC}OlIp*tz3DNdkEDHWdmm^yn0 zBxP~%kjkhGLixE?;CA}(O8Uvv6oVA2rl5v`S_G*QtpsXM2iTkB!i_$^j-LCJ=kRX} z2ZH3pP^zZ~UgZHycfgZ2{8u+np^fy+sXQa%h6M7p0D(KXrN_rcj}D(kV}}kgT~F<6 z$^FB)1lbaad?IYK}`J6q(BBa{>;(CtzEhrl3TpQfVUvqz#;M z^AGHo?XXBs(Ubcqc!Yv4Q1B`R4Eh4w6{H_f@I4CJX{6Rsuz`ZD6x@w~nGifd>da74 z5~TeUFtyPUiZRXCO%&^*pp^pBWXRI%gwP!K#j#EDW8Nc!F#bQ$WSF8dnXa2HChM|I zFcp6!aPk-R|Q0B*?;8exGJ<=6_BCss?f@^A;i;4maUnEjqEA% z;Ag{Cq2;Qu=6a4`&A)1GylQR!N2?Doub>J31)p^T&WaUji`i{{){%A;nQ|gugwmWT zCuW7xoGB;W>EKDYQ4(%9OYbsmye=R}?>0l)29~}|mD67WtTI)`^5D1DR0%LHr{8qv zn#!*W2-1GDsUz}ebm;u=V%IWt#3ryakxG}TBkd5(xi`%vCU06mKyT-!+0RYv!51y2 zva~><{D>t0_L%KAFf>JSb%>PT~RXKcr8UA%5XqI4r=t5&mBqXmJQX^9CXwI_?$#s&X1cVOxOIT(mkCf!ZX z=3$_yYYv)Bj5m$4LcEg^`y&Gm=-9M cU!~~H6J;J#=XC+W&ANVz32yZ$Wc$kh0UtwYX#fBK literal 0 HcmV?d00001 diff --git a/Backend/venv/lib/python3.12/site-packages/_pytest/__pycache__/pytester_assertions.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/_pytest/__pycache__/pytester_assertions.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d0549ebc6ed4dac2e10094694aebb655b89d6ce3 GIT binary patch literal 2491 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 literal 0 HcmV?d00001 diff --git a/Backend/venv/lib/python3.12/site-packages/_pytest/__pycache__/python_api.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/_pytest/__pycache__/python_api.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..eade7ca20514a9efc1468cee4c46bebd09be8eca GIT binary patch literal 43210 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 literal 0 HcmV?d00001 diff --git a/Backend/venv/lib/python3.12/site-packages/_pytest/__pycache__/recwarn.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/_pytest/__pycache__/recwarn.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..4c5939dce3dc6551ec8ef7cd1ed4e497de3696ba GIT binary patch literal 13888 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 C*rhK3 literal 0 HcmV?d00001 diff --git a/Backend/venv/lib/python3.12/site-packages/_pytest/__pycache__/runner.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/_pytest/__pycache__/runner.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..5d93f2bc8f52196a27a8e0616ab5b916953f2298 GIT binary patch literal 23059 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 E1A86w-T(jq literal 0 HcmV?d00001 diff --git a/Backend/venv/lib/python3.12/site-packages/_pytest/__pycache__/scope.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/_pytest/__pycache__/scope.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..89b1fd854a47840ebc3557ebdd6d4519a3ea5e0e GIT binary patch literal 3753 zcmahLTWl29_0DU(4|^ZR2F$CMfMXWS8cL}evJk+ScbpW5N^Db&hM8+Tcy?yFGwa8) zR^5t9R*Dp&G{RLI$(8y6qEdh9U-|A2#!};qK%#1XBK2dzN!9SxbMEZg6e0CWbLQOF zIp?1D-#R*y1jfO^1NQM0A^*flYs8w!N?Ic1HnB*FSdt|>Qdus^65@)Zl+}_daMjVu zu~JOn8sKfEHi@t{o`Q2RCtgmJ5-?9#Z9PD?lw_(*P7y19gIEbB-%}!9_nItADVeZ# zmbwR=ag;h>o@O1b`3dqd`B*X)o0#&?;)HxC6EZ_)q`FimpUO9rDlwHAX@-)#=cP~`a;s(drvooA9Nps<;~)&I z#NVr+<_rh$jt?%qKco+y9vVD%X805=w4JvD29oEsu+3+_4+q1xieZi$S6CQ}LIak5*k1NtrL3Rk$}Sto#wcZNf-N0!NlFg8P;fOD?IF!Zb@Q!mg#2Vqz8(GjL!r zi;G#J6c@9kn59YyF>4pI4OaSwT1r|QtPK29R@Nd`2WuZytsKldSUN$hjn+C#vAS5s z>SkG%!62|YEHWCm*5A-p-99(nnePcT;a0VOB`J&x3@q(~0e$MZ3>^i%qykpAFN1S5 zy@mSdiJ*G7=>Xt!cw12Nh2sgGgX4{IuS^|p5_|>BHU{=%ydQ`f;1~X(=o(&)#@-`G zjx-NZ#H0O_O;yt(9Yp2B|J}%0i}d}-Jg_tpS?pDk#bR-9Qviy%5R|urM#7{n1RgfZ zER469a7auf)C41r_6%bYGoHXnTazJ&JOHyM(=f&vgpq4DGYISvqQZxnX5|8a+av%O zjXFVtVE(YA@m+-QbkNL5gw)CJh$Vk6w{p)fr2y%O0q2z(h=jLCNM5aNxgfX-8@X&M zXueZer@$dgk=jNKU$mjH!QQe5(JJ=8Mp5%hnAS%I--9?fGkoIA;Lu2z{E6XI*%0R* z4^#TF^XH@ek-KuJ`pg*(HQTk=l#kRYeNh@1^U7@CiaRxMg8ActR~b0%1bIF;@faPB{UdOuH{}* zYP7T;&mRTwidKI!`1|xySKpoOi(PvjrS|-P1#=2SLQPZ&6MdyM5EoIg50KaBSzgm^ zT@rDk)aAM|4);dLU1>NkiHE{_w*UdY6F`_m$JB*ihAF`^n)nzxm|3E?$8_BZbiLLd zJv*BH2#)yM0nC!e-8&XeEOzJTl8@K#T)4Qne$QNLIny(LZZXsMFy1GgGz`oz`ROiZ z4b5V{$wO@t>#K>}S_6}Xc;+oYpq;^1hLoilXkQW}SaT4mQbw@vD*F=zt>c}L@tq^1NBKVrCcJDQa)j< z$A$t`gX5G9(MgTS(G1yR1I42o@mj))oz?E~Jh zR!M_qTs8sOf0EHj1MWZ-Fg+Jm0$_;5X@z?ewgt69C^lk`B_3)JlBV9}tIQ0VB?iSk z6IG>`jzf;KT@cE)`jNUH@T$2=f0WyhfShSsh6(|tJZe%5$7vO>QNwl$s}hU63EhB- z%eB7iGxYk*6%VMnvmqJ+9cr&0HB^AN>-x2-;h^8atWDP~ z&(w9Eg*#zJ*A3T&HV%6&A69cnvl9XI*MxT=_#T2C07CV$=Q%u&Xi79{Wd_y83Keh( zj#0;d2;eReu`IGeBp(_BrS(4r@GJ66O=|JRCbDhU?CCjYN$p$Sw0(AHuDGObU*5c9 z_T=38C3VO0mfqP@b003Ly=&Nts%dYoqyaS2ineS1RD;0pj=F-sMv}yGPtOiNQ@XY8 z<(}S#_!ss^|3kMq6CXg~T!q5z3O^FPV zI(_EU>1HpGSNK-k!15bPQ$7l@Z{I$l&lmAxWY{D8G%RD6;eQ68p-7VSOpZ(Hx1B^< z|Ag#(LN-4k^dCz0iJE_!+xW2O{9^9i*|Xqca`qefu+%+wVuipDv><02xbW<#Ofu_k z9sKq9Z0gGc#rr>9I&kKT+}S@A7Y^R(z12J4{Yn2)?(A&35ht7J-_vj3`tid4J41gS xzB~MA$Dxm|Jxag*i_~{33DS8^`tEt0WQsmI(t}jTv1052U3XkoAN)WC_+RVH-dF$t literal 0 HcmV?d00001 diff --git a/Backend/venv/lib/python3.12/site-packages/_pytest/__pycache__/setuponly.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/_pytest/__pycache__/setuponly.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..1017692366926a99eb9205ad6bd8805079013a0d GIT binary patch literal 4942 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 literal 0 HcmV?d00001 diff --git a/Backend/venv/lib/python3.12/site-packages/_pytest/__pycache__/setupplan.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/_pytest/__pycache__/setupplan.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..30b7db92d5779e28b5d172da48ea468f3527214d GIT binary patch literal 1950 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 literal 0 HcmV?d00001 diff --git a/Backend/venv/lib/python3.12/site-packages/_pytest/__pycache__/stash.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/_pytest/__pycache__/stash.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..845b8c5ff8b365c839bb1ddf2b2c2df6f77085a2 GIT binary patch literal 4448 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 LF!UqAnxFK)rA!u` literal 0 HcmV?d00001 diff --git a/Backend/venv/lib/python3.12/site-packages/_pytest/__pycache__/terminal.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/_pytest/__pycache__/terminal.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..23ea2204a514d18849477789ad7bb488fcc6d8a7 GIT binary patch literal 72330 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

nzL(PT2E1&KtW^h33$nH(p6O zi^KKduF(0A0W_N%2OhesBKw%TuX?bYV8QpsQ>jAt56(tf-nu9k`lA!~3;Qt17jW-F zB$#*4T=q^+ z0VB}4s`7G^&TR{3Tj=VH3+;h_=aLqDv=pnX z%3N!;MAx*0)vjA|G|?Qpn+#;Kh|sn7D>7=wmbUc(BpzTGz|ULz0!WDN%b zbeGHV`xHxR9ZW2GN`P22S#ZSa3+ZSkHO3Zpwk9(mz}Vo(Omp}@qD5jg1q&3gc`fh< zb8A1_3cgFvF!`|;spJWI`cl?x%D?lXUr^54Kd#p_EQ}c93`-!cLQvIvV*JA zBD-N&Ch6`3JlH&;?l(8jYz}`@wsl2MA-FN{5ON!PVy3tuY3sc)u;45S9S?Vfhr;_L zTNQGPD4s(&IZ}pFz;-ao$Vn5_`F3m-+w(->w9Hz&A_5v$&y_&{R^J5h#`DAycWb=n=`Z%QX%2~nZuz05P@zS{`D7SI(sFZ zbI31H1_tDdZXC{(;quEM5hp$se0wT&KdrRvX*T?{Nso|=?U4Z968;b^AALJm}J_IlG;4 zLp)!%R_*tG6W>mV4!9jEIy0@yQ=m~dNtMT8%z4eAt$8%(3$_sNa4MgX7b#?ACq!ln z;U32dk(ojm0wSac2+=vib@Mn##~|0TG~m5B?_ni5ZO$nVX^Nrd8&UahMzR=eK}|$9 zTK3EKGsf7js2!W3ysIhPnl}=v0qFDkY4acG|7E^T1RS_dTWHfgBK|%gF>MCRj#loV z`0w#@s8T^}G;QV9B#E1hg@6J5S_0cM6wn^X-7(P0&itH;pHgZEWe|6U8HdD!n3p;x z+M3n}(gJP5lgouh|1kkJVZY*jdcBDi3TiI`LsX1{muV582C+q8K)+9qU9-6Sa~wI_ zA@k$%y!qP9YZAlr5I%(2phj}2`9b5Ht5Y%`jQ1rP$!wzpWgqiF$<_G~&K3G@?YOxk z2`>)A_g&4Bc^A$drJvM(R4cXaN}6{`uI5x-)BCk|YGre6$P_k3Ous0uj(p<-W9;~k z?aAW4km(_85cNgdVrP=>u8~e+3Sbve zsfFxfPeT}uA;=~?FA${5M};b1Rw@~L{R~E zll!|Uy2L~?V=Ykd7R{9b6a~w-&?dP%<-$(PkZ>UMD!C4Xlx5MI+h(>!tkHu>TL(4> zTM_JI7XN`Y+z@f!Y?ExglCd{#BwwUROE75|CgU{hyKwp9Fo{(R2k0CFnWgb@CZ5ARk15huTnZZ7Q&V0a53GGz#Y)%GoXK&t@?^uv=QlcN_$(iRE>BV!QtpTU;_WT)%$s^#yZLv<#0+t^|2}UZ6>*c`G#o~gwPI|WCs2Z39exu?eOcFGT{2FB%#Cg z0&pgP6HVp(%q02vBM|6%=`zIYXz~)}Mw!7(*bB0C!4Xk8LDPs%nfd#+_>PE!G|37F zxgHBYPg_NTN0E+QoS8ddatmGIPDVg1A6Qk;-Cyu0)E&SddgI0m;B&)cdY5FB}a&eoDDt$L?F zYJK}CT!Bla9Z>IZm4+M(F!K4@_g<6CHKErCcW5Hn&=30NTwRj6OLBEVaroBjH($rX zr4Mz5&gH5+HD_z(Roar(?NW7zRJuO2kN6DUkOQLmPEYvSeTR>%MDRDU?F6h#+EB%l z2w*Z}cyjnGWc*-cL;O90$p1`V_$~$SP$@s97>m%Ru&uFf2f3em3zLkTm>3I+1ZU|& zBD#%@o)Kx`OPe5Cjyb@2j7AdmSu;_@HT_1b%iuK`D03W@t8(xnkm043nZAJT06Xn?NVBje-H* z8G2@bf_?;Fnzvn?2wWZ;*&)W!N<5(pQUW-rUjMkjpf@g>b^4;8=}La4bNx)`WTBOX zu1C5xk90MUbmfn9-bcEsN4m0XSk2OvEEo6jhXNI>qz~a==^TGWg>eUEnjh)fAL*JN z=~^D?Iv?p!0ExOsIzRhERxSI(O_W5jR)jw{6g@Jw{&!;o0M+N0bk!N7#Z_>_2214S z)soKhg{fY@J$&KT#LbB>bVz=2NMEe)i&TE0LzHQ`rq`Py$20H|pf|;gi!9DuHCXg} z^mLnIx=nGW+^hFSycr#$X#XNbkGpjRz%=Ld;NaTz?a}8mIz;ik34bCu+n-n`_a6A1 z?toELP|k{EYT>zhUhkFl-d`0|=sg)70?I}Wbh$}aQ248YXI=WbjE+LeD$MX3FVz<6 zJ<(clboHJD+JR{HB`|jJn8&NHCEh8b=vfve_|@!zdxM`oO^vP1bXVw$NY~0hafP49 zts8l~@6f#->6xK>n?IdkHx>l*qJV;#P1X7m5GFGQ#0!qn@I~3tkP&c!4mVjtjnJbT zjI>01;EB*J!6B%1oeZvEAr%0(AJ+37C1m{7S^C%_xC?H$KrXGqIF)5gR()T15PTzj zUle>QL@@!b343A}?z+H6!st}m^d&K4Z1AoH%qrAZZPK?yp98B)-x32S3{j?}1cOnT O(IJW(zMzQB=>G>)ejb(p literal 0 HcmV?d00001 diff --git a/Backend/venv/lib/python3.12/site-packages/_pytest/__pycache__/threadexception.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/_pytest/__pycache__/threadexception.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..450a22270e2877235228d2ccd66031f240c06a46 GIT binary patch literal 4537 zcmcH+?{5^>@$KH;Z{PWBE(Y_ozslP1{GEa1(3ns~Xy^t69Sj>yi zi)NrG%tq?)EWYT{J%1hptr zof5-^AC(=WWT__L67py*4GvA|G5KA^{S3DhU)9eNP@AgC(@eMk?} zFpbbCsu({#0%JbXqkzTuoTvxJB6Go=>qZJgVz^JMl)_H|q)Tk%eBQV`i z$#UpLM=q+CdY&?wQv;doGh|0NtL*d1lQs~3 zQlMs;vh1419mvS4Eo;Tr2DnK-C`YHVT~?Zi9J7&9eyZmRr6SFpw=U*hr}l(XD(BuPIn>;96lg)u zxuXy@sHNvFQ0qd@G)8mfic=_AFK74e%h`rQ_mqJE%x&isSfRF)^VI2UGh42>5k)a9 z!%>v!ZEKo6+oahJg4rnmvt;?e;W_Dgbos53IqAJ*9q*|%f;QsB*GD%D=E;n(QXdt< z5-^<+SQ0ytbwS5*8~J3JA(tEEYMJhPj$o*_0id;`06?nr1`sF8(lA=xJb74|Ck{Zb zjjt5CF$bdhvomBo)TC|oEq=u}>kN6PaV^P>`Z3InwSpMygdJE90#u@BXYZ;}MWGNg z8Q7u!IoE9x?M8MPz%2QqciU3$o@(zNFh_E^umAVcx2La1A4WDWcdna@b4|DrjF%21 z3pb1yL{2xvr$#jiHfc8BW z)>WAfd|8%Sq>AFk6s1_wCr!jV6y@iWs@YfxD~evy6ost=9?vs2A{It~$=ppGRc-2> z25FyRh+%yI76=!S>w}-j0Xmrd698AqW3f9JsSk+3(?UHW1bgeDKrmg4MT0$m?cR86 z|D8m2Q?}Zjs|8`E79udWr`k183*#_Cx_WPIsit<;qBx9^Sn{hlVBV28_e2huFTULlttKK@pm7XWdH`SF$B+902W>c;B( z-|1I-&X)vToDn{N683k2OX7^EOXGNxw&tKS@HXDj#9I9t5@3L9Yim$qNN8(oP-1Xw zYxmGGpxtX|dm7^FCDD1onsDd34aVs37O#Vbo9`qHDQ&eti#i3--~4fYbq=qk8p{6AFw3@c7L#=n%?0LGSzgZ9+tYg>w!=@`Iv+f$+@Agk|goM zjZ@c7efaIAjmN7SkAG}G*m&|`$D2=jQOGA;)W;nD+s2rDB|damcyDO)(7wR^Oce0@ z`+`FU!}kZnfR8|Z6UXE{#ndv?ly2Bz6;rhx4LJRVI_!t9z8}C^;o=y$+%JF<0*3gj zV30f6Ah{ky7vp8bg1{BbcEBdBpy;MOJNuS^LVL2z4g%4ecqBd|Zi>HkzWAUsyCh}* zB4wY}@nv60ZV=uVdZe474FcqVL6~wQApe-bzL5*C18_pS`0Lul*WeE!`#uo<7>UuF z*!KW@1NvN5ob_$uIPh0Phj-16f)JQ-S|Vk-8PDlhq_7+SH;A=|&65{A?@Ae7Bg0V6 zf(Wp_YGpjO7l%B@;InZf=tV}cY;x0a4e&GD^z}4y$jh;Z*>PaQFlhf7KrJ8$!sjH# zf1Qs=-y_oVh-`X9HgmZCOOkjJ*(LNmCID)AAt9U+?o<}{9;xm;S|>QF$wcg$?fG@z zFZ*td+};0Bc&R1|LhhEaIPhw9>v#W2U{DVbaW9{S+_{4K^@oBtee2xf&cW)ISAFVz X&!fK6ySV#c^;?Hp)Q|BB9O`p)4&0!B{drE3hR`d$p!&~HGp%IZ!x%Ry%*-H5o6^oqQx zU=*0C)7Y>?&s67U7~lKlCHQ8k7N%gi27O`R-m{euHGs(bNkS6>&qO}-Abd}HH+{yq z&KYYH?{%Mt1u=Goo`8v7&glrYL`!u^PlO#iUDI#ciE8^uYrhP7l;vZgIGqYLrIoy( zV05I_-f(A^TIs}g4TP)|ma=XH+D$#I=Pw_=bOU}hi=YKx1KH0I9zu-qW3Ygue=7*D S-J(yoX!UQr^{a0_Lis;cbFqm4 literal 0 HcmV?d00001 diff --git a/Backend/venv/lib/python3.12/site-packages/_pytest/__pycache__/tmpdir.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/_pytest/__pycache__/tmpdir.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..206131f691dc782d07cce449110e915d0008a807 GIT binary patch literal 13166 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 literal 0 HcmV?d00001 diff --git a/Backend/venv/lib/python3.12/site-packages/_pytest/__pycache__/unittest.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/_pytest/__pycache__/unittest.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..9210cb0b0d4a9ea318de5793b7b42ecb273973f4 GIT binary patch literal 18266 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 literal 0 HcmV?d00001 diff --git a/Backend/venv/lib/python3.12/site-packages/_pytest/__pycache__/warning_types.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/_pytest/__pycache__/warning_types.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..80cf4ea1f1b3ab5e7431862455ec778e4edd75d8 GIT binary patch literal 6931 zcmbUlOKcm*b(WtcMUnbYmSoG8Jc+-oZK{qF!&RKXvK_^VYsGc!q$QB9R@@P_@^Y7* zT}q}ZrE22>HB!_*6o`T#s1E_^z&YgDW0Gqx5?nyaCI%c7J@iJ0LQ%MvzBju|(X^se zU65~Q=gsH+-<$bsDwQDcJa^`pKHEvi-|-`O;(nv{;}9Y55she)L2}+(%1PoolncQ- zWQ2>6Ttq@#*oYS8oGjWAXvcCf(T+kpo{NjN4DFU&i)hD;M6os3Dv=O*nP~CrL~CKm zyJ2tdT#B`d{si>5vQ*H2*C#F4=HruqPi=s2_wj9jZ{Gml;p001-?;(4Q|z7wY!^$h z^xcS0SC{DD2L0WvE1)X3P4xCaZ!gI>QsxK$#05t)lA9bUn|VjK%*&M$ zgYWRLS%FvVWo9z2=b;(#F)@6

pVoPUxm;Y9SCoE1?!=N)B&ZexWI}X$6c!ie4tgI`0jnR)I zZd_4Jwa663O(;sy(#i(5lZx_-vTFF4n4)M_UQs?KHKgs)_~4{fWP=6s+TdAcUv;d~ z;5o}-#*x#Obrt9tJgw%hGE*CzX6E#up^p#3ev_7YEPM2sL0fm&krE703(Ou=JW2+A zY83}0V`obhj=n5F3K}+kT_;~gPCV$`@#|N4IzVn&aD5kr2!?H&apw}7;Xq9w#b^CS zqr{v^=1Yx&aA6MR-X!YDD$84emQkKWiXiF`kG3vsbq4^yd=|cmyx713j@U8_X^(|7 zYJRd#`p|cfp2tD7WRwfKN#QrGa@{K16qHa_(N^uv80bX?5cD-NaJGQ~L~faZE}sF* zoX`t_@H5REpdIJMkTMsfQr))8U>uuB96gvLc&d@$V+{l&a?1qw1_T=h6CNHAeX*J7 znMq~__M+R=v>d9A8;m*@@FHeYl}_l;1Kin_;<#m?TGao+nsy>@2o5&#mTTY*kz3|% zyT{vER^lu#Sts6CV7 zdYiF@F2oT$-^kXb2DT9S7+X>3z^9f4@MPwK{269ZEuxW$h!(vbspnR?B4=XmF3%EQ zx>ka8S!AZ88p9<$(B6ju%V4CeVDSnq+hB9xSQ-O2W0ckB*=UKL=CX+dh35)nN4o^E z&ny@f2;?9EMu#uHLW_D~(xG{fM?ttGgN)T^(s`>`G8m+`im-06Sd)c|J`t1Lm|B8t zUSzK9$vy8EAVMf8oG=RK86lhynS&y9N)ouoz?}3+=&s)%yk94o@aXK&FZ~VXQMaJO zb)Hp&0?zZxqFSl51b#>zkY+~Wdtn!-IAjQ{Mb*iK+;HBoMX!x?Qpzz;xw5Sz&$D|r zQ%BYtbRH(y`vEMFZ`#wV$#W~o*Ors7t#0344U^PGsYXJnwpuvSk*JbLOG4zv(M*hE zPUme1+7WaBa9c%~DKaP&G&gKJoM#Z%lvDR$AA(`{+ZZ{nlZTN=G+s@Tbl<|O5278_ zP&ArYe7#EGwY2ZdxA?AwiQM@R5ng`A74q<}KY<=LE4p@j61if6xo8H{&REQ!L)@>`&k1$_%Y|U57Y57gkYEh z)-P<(rwZ#l)kG_=nE4~>j0(}%D*&=$Se@#o1t|{1gk?e&m`01Y%cYXVp>*^nZjyJ8 zfE+o3%kZzEVo@tm&`KLV^tMOudry3>G76eJ7e%O*APi z62z8bIbpL9gN*N$`Z16vM=*sA%qpJyV%L`Cyf2Wm?s0%I%ZC)WjGQ_V6DIJCsAl3IWa2A+lzFe=|G1FR}I zf@y3VMIeqp*yV&IJcmQB<1D%j(`rn5cCQTi7-n7bz5-{(^@COR^wF`GtT=H64mr zCm8OF_Bin6#)GoKjXMnT8>qmQufo;^o9}}G`5*y6o5bLc$GX~20lWu^dZRRr34E$C z!NXX5rUKD>p8{%3xuQ)i?Yy1EJNbwPy850~e+nD18c6P^;YR!65zlr0$wEm#I z>*oB8`KA7&ilJXFl3O9ITSWGldzo>6w!pERDo7S2wG<@LXgrI)#N?(}N}$T!_tu zpu+U&l}IJJhd6lGB%Zx+mYJ7Bq+xYA;9^ex04_!6!T=+4p%2K1(Ey`Ge-qN8^YYvB zj5I^8g?~n7q>McKZ35HkD|l`fC3j%eLr{yWMaaXRUwf$-&0b@0AEslL!8DFNo}I5x z!18d+tLhz$CX>u4K|OC#!zu(`<6VLU=OBo^xGIE|5?p>jIc&iR+|)2Sq2meSgiFD8 zMM3aEL%+)CBwS|E8LpP#JYqv|!wI6G@Kb=n3TnOr!3K{Hx?RkOxo(%D_-t}k(4mg4 zC<@%z#qred9S*#kBR3x4UD*KgOlvlpzzFw98XC>C;>BFv((p2_EpI6kI=3Bfm>Yv& zQGz(<#tO{AWko6Nwkk@&u*OxxhB z*tYGaazj~39a>HuS{V7dz31kyZv1L-`d<6~g>$Q^u9eila%x~str~!_tGc?%!*-j=o!1>|6{l9>0C?cHf<&ciy;jZmH+Fdu_-6a&{?x z>Oa*e4t->A2U*eUbkh zCS&HZKLS_{OOo^zNqV_7J+7J}C8 z{u*|`Nh}nrV#hjaaTC;$@19j`LailX)y4Ux>?yIe_*@z|-th6%iAJK@rNr$QK7|dS z;gbce>Rv%{TUWnH z`~Ma_un?-su*RyCT#|fgWjCS~RKz-=Dta Ny+3o-#J5O*{{=ygz8wGn literal 0 HcmV?d00001 diff --git a/Backend/venv/lib/python3.12/site-packages/_pytest/__pycache__/warnings.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/_pytest/__pycache__/warnings.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..de7bd254e0368dd7b824d3838887916dbcf96869 GIT binary patch literal 6656 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 ht$Xj%N$nv^&LhA)l`Bgelx6ck%^Y-x1 None: self.directories = directories - def __call__(self, prefix: str, **kwargs: Any) -> list[str]: + def __call__(self, prefix: str, **kwargs: Any) -> List[str]: # Only called on non option completions. if os.sep in prefix[1:]: prefix_dir = len(os.path.dirname(prefix) + os.sep) @@ -104,7 +103,7 @@ if os.environ.get("_ARGCOMPLETE"): import argcomplete.completers except ImportError: sys.exit(-1) - filescompleter: FastFilesCompleter | None = FastFilesCompleter() + filescompleter: Optional[FastFilesCompleter] = FastFilesCompleter() def try_argcomplete(parser: argparse.ArgumentParser) -> None: argcomplete.autocomplete(parser, always_complete_options=False) diff --git a/Backend/venv/lib/python3.12/site-packages/_pytest/_code/__init__.py b/Backend/venv/lib/python3.12/site-packages/_pytest/_code/__init__.py index 7f67a2e3..511d0dde 100644 --- a/Backend/venv/lib/python3.12/site-packages/_pytest/_code/__init__.py +++ b/Backend/venv/lib/python3.12/site-packages/_pytest/_code/__init__.py @@ -1,7 +1,4 @@ """Python inspection/code generation API.""" - -from __future__ import annotations - from .code import Code from .code import ExceptionInfo from .code import filter_traceback @@ -12,15 +9,14 @@ from .code import TracebackEntry from .source import getrawcode from .source import Source - __all__ = [ "Code", "ExceptionInfo", - "Frame", - "Source", - "Traceback", - "TracebackEntry", "filter_traceback", + "Frame", "getfslineno", "getrawcode", + "Traceback", + "TracebackEntry", + "Source", ] diff --git a/Backend/venv/lib/python3.12/site-packages/_pytest/_code/__pycache__/__init__.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/_pytest/_code/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..3d2abcddcd6be8b4f5a653a649e1fd3a471b6e2e GIT binary patch literal 643 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 cRobZ2$lO literal 0 HcmV?d00001 diff --git a/Backend/venv/lib/python3.12/site-packages/_pytest/_code/__pycache__/source.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/_pytest/_code/__pycache__/source.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f280bac0010def5f7a9d0dc3812b23ddc96b00d6 GIT binary patch literal 11426 zcmcIqdu$uWnV;n@-=rvs5+%{LM9H!(+IrZQ9mnz`abzie#Ll_0(?m_e(%h9qnIhHQ zRb;6Ys<;M9HEvBe?U_P+XBzFnGTNfb;eZ;r-XXoBhdcBiGEypLs{%e;|G55hpd$lK zeFxlq-z;}Y$#hcma07B?cHTSRH^1*O`zxo@Mj-6(?G8J(5c2Q%poNM;X6>&TLT(bC z@JxgZswp$b&}YM-fu`&rOH*!;qp5Mw2&o}r8Z!@?8SKMGEMwL|E6sC|w+-58-Uxa7 zpq=JTkar9^XxXDKd+To3BQT<_6U`H9ju}rT9zHBFmpxu zTA>QwjHP4S_y$<-rYXk1`S-YnvwlW#TntM>NDheM;Sm|0Ehl9`3|@=~dR~r+kmp_s zOSJywaXB1|1|wJ>drJ@_u^wydGg*lMoZlE}< zhR%spu2G+bT9^-d)A2ao4K*GZqXyDCx^@GlZT*zN-=LTVViRIWn11V6)E6Ebn~-tO zeX)z9Kn&kVEW(GQ!@i(TqOE+P7%%vS#NhCl5S2S^HXnp9jtEiTgoN$XvD!L2JN@lG zc|_2`thwquF_h^8LiEXL3V4UqcvKtn8x){ zXV{Vzuz$`9wi4N+joeDadWL+?+{IP0uaRrdPm;@!PBMP>Y^bn>bT}ktH~iO*LUfui z0OWDIy)OAjw?;JSbi2q3Il-dTc#BEJTINGi$Al6}> zMSHnv*M_&nYU%GFnk65*s&lQ|6UV=GYSmenVsE{&>}<_7Y`)zv-%u`KS&<(76zR>&uj0 zY9nNT++)uAInfI(RjOB#ZnF0afD}lhYQ>PR@ z(q`MB?JQY!HKexvz_aXXTXi>Q9L+hG`}*|Ubn3$GFU@}`>uSqb+SZ^UQP@ku)VfW; zQo0Ga8#e*3MbuvIk$Z);bi&iRwb%mzU_3ZcW3ZrVeL;HJZs@Rva$%M{u-L^8$o&Zu zir7uu15xQ@B5FeACfSFr5qq8-AK!z%kOG;{qpIivN@9-pc+;5?*r?BCuOj!+30*V#eNs#oHDRLCR2#`sXu{JjD zXH|AY7Er8FVNyjK33pe6k*8AVS!g7^1`#l)y*3%T)xB(Q%DL-q_T1=6g>F2TakM;e zRbRh6cR4i$47%#^WtxvKdHOPyeXI42?^zNjbB!&xN9RWu+&^i!*RVM7(^ubrHPd)B zaq`;BIrrv_W3x(n{m{ZxxG?;$wL`Ry^kh`uJg6!JO&ATRJnuIs9I&-W_vao%-(AAt zO8^t9f$K{ElNP)HjU*KEco5ym<2O&;IJM+z%2=BIAJ)i5geYC2_#94KvOsen0Cljw z3jI{l=RRy#Sy*0mavzf5ov&pqjZdylKRjs|7wj^o1Qd1QJ!3!tA2(crJr(GKvA_1Dh0&_GhkaR~%b{ z7=)v%joJKv9Fw`WOEzm;q3yv8`;<{(cj3sh<#v{5d3F=j0R(W;2`G{N0V0qHwVqpS>iB!sgp@GmD%{D? zH!r1I@9w;_bKyd^rF*62V7BGpa?7EdqbhlB?o^^L&k|Qn*;XI59C}bumF&|87+BnM z?~B=%{VOepvMq;}TaM%$uH>G%6Nz3Nr245XKWaJhyQ;c(>l3D&xAFGQ`JL$t3*8xS zSHg7NG3U5(F5$|#Y7K*w}_-!!R5Mz1gSMb|BHB!=0dwpnRf?pb;NQDISIh)m5+;*OMM=bsa?=YygTR z6zj7D6uR0?@196la|aInbo%}2UwdCzkW>BX^Y5Mc(ECEddJXouK4Yo><0mZH)XUJZ z=N(;~V#2ASv2}Z{Lp^E&Xm^yeH;U%g>#+L(TX5XqK(k(u?67|q3j3$>D#*zoC^evs z`6frgp%K{Bs2l`ko9?Q*L3AM#V;2Qc-?_F>YyuTHu()GmzTN&#Fk-4uGuK8FgVA9@ z+rQJWT6%)Se%zRK+ow26yG^?bN2s)L5IeO(G)wX(;_5_2rNr5nie*TJWWc4p@;m77eB4vX1${ z&bl4_IyH#fL#U^AtF)DRf74iPD_t_R!2o~J z5>SONGtD83fin>7_GoZS2m};cATSo=CnA`41Oi`~2u2Dupb7G^5EPqKF(B@MffVjy zEEW+_H^xCmg3?GJAX;#W0~j@8ga#LQ9ng>vK~*9mGPn3VM!gvIVML_>^00^|5M_9g z67&^(q?R0-ed=+b-?EHPEka)84^E;T`0EYv^I!eZQ#nn({UY)cPj zn|9|3JTG3j-~EB*{*mndlWX{#uVIY7R9m`xzGDq0@a0X6u_@)oeAAlAYVy07 zfjog^;qn?L`3lb1lb5LQR0x{(0@_Fo)kXli1Gpj@0LBdnu>qWmEJI!cpPuG2Ea)p7=qm=JN0;5T+L|-&uEpS}@YU8$*#@*S*-HYy}#{F5#ri4BD3aBL&HSfGS+n?(^_-l7h zng{#s^o`TsJM*EtXSV<9OF4U0@|ncZ4A=1KBP(&#B3spe?5YEIld=B4KQWP-LlU}I zuhbv2lZCotUhe01>#;ia=N<;)f*(#6r@((0S*OD2#Qj_7jl=~IhTO(Lw^*0r+7?G) zOI5FIoDthgWG+A&NMmFg2xz~ETZ&8&FY%e{jxA@=WdU{%`y)=P86YxPXKLV$aq^zw zuXL~U6~=GUL7(0@6co;(m{<_ILle;uUjK9=+Thy<0%!aEjL5@?(~Y1uMR*^2EkNFa zt_61%B_sIFv=fv9h*cbuK_k65A*(J<#SA@yP^7vvI2nAOq7McYw?YI01{Y0dQ8=7- zy}yDs#OQ7KOJ9Zvn1f@D&K!6n;&btgWz(mt_6DS~^J9wxsqB3GZ{~_smnSKuPAzat zu8suvvE6mcmhS!$w_M+`>fVy#7y6dndozx`t2TGWvu|-=@x@Hd;U(LV40lArvwg*0 zLB4JEvh$3WrF>ofoDV_MQdwQ@l!MIDPa!lfgyPxPFkn2FtG0DV4Z$Rah$yI zpTO#D$su567)}l4JhCOVDE>Bt;$@P=TX_Jl#u7Kn$hI^Tuh=fV4uE0e$&58_iCa;sVL#eKFY$9{sec5#gjSGS!N|oJKLz@g zC`2TIx=;Kr@f-}SaFfBvr2;ld@|dhRRoQj|oG=kVR4l!bpd=j^h7@~$0V46C@|ZLg z4V9Kuz!`~&LAX;7(7Pd1aC{t0Bvtx_=~Ploltnx@)PV8Z)Vgu3GrbjzObC*QvPofh zg+tv?VWCuUfK@AqGF)zf^S8v1L8hj1v?xrKIsn^%Zp>m%lwlEj#VgSGJMfn}8H%AM z(y(c^f7Mxe{nfcwll(hxenK3^g9!$`zrkBuZ@102{h)WHb$_;Xf2QG?kL(9P@K$8{I)GY1p zPqK>J^Pn)!)^zaB_PZT-Iu@J3_p}(ywjB7V=Gli<=#{U6wdcLWX#d9Pw@+U^v+8b2 zn-)wy*2A-o$bq+-QSf`&%FE956vyPis}RlswjA`wkCQqTrGN@ zYLl;LD_Rn4&R$t4Rgn<&7sU#!0HgphshGj4q`1gIg%wjR8fO40W@}~rLLF?(GN`9v7q$kR;m|uqUA!}&eTA*PEg(SIapOij-8_v)bu801 zy(lN+=75gnya_)iD7VVEF>dmb;)e#`w1K9sBhu*R;<#EaVH;xLlNF2het@fB9?e(` zByJu>Lu^BcTfPl+yXNLlO*Dx|p0W-T>=4ii-)+>tVF-BCcf}gFj_!K0p4ZnS8RAw6 z_8i88-I*~(nJ5eMGS`kE-p5Tt;C|jp_JC3_2_DJUU~RCvPgR8!ECR49)G+GPa>Z0` z(egtEP-m+deCJlJteD1)NbMODe1b47qs>o)rT|~Nswu#J>sfHi4o3lsMS7+<;j$2- zU`=s(ou-9nsT=-lIH3N`0&qEALhuA+C6fFW{=1oAOMb@P|H9u}X4Sja z$IMp0hx!T>%VbcDf~!qZDndayG!oFC9a0#twuizIyicQ2(KsFy0qIa`6z>;QJJ9|D zd|h#=AEl89pEpS0^$Wpw4yvf(K|_tfmmT40L2=;+8Xypb04*=hn*G{pb!~F! z-CYSY8lj#QXKU8ky5!vckQl6oRvk4fj^?bRIo-DG*tP0uxEa0?PMa6%7oS=3^dw&V zgAp1%vXE;3f@iUAsp{a{r)K*S-FX|a*k`}G3RffBZ?@lPU#e(Iun){Oa2KANd+o~C zV5a(}mAakTx}8gP?Fq+&rfs+5^YMkgY}4MwJ=v!HD@{kTO-GiRo=Z5EEt@}f_N2Gp zZNJmLFtIq0fx8)JPr{Hln5%NR@KP7znStdG?f~;KLoTJS7orAjPD98cB6A#RL^_E<_aMssjzh zxQI56>Tg4-s=C)ux~T3qbXbUA!U(ic@X+;wiG-i^sHQD-&Y|k6u*U|@tH+3P)^6<4 zff0%^IO(cO@TmAV@CeKXH@^_WYctGmi0wC|;y1)ae-4O$OPYR5Hql?5mZ|?OssDrN zO@`U_kYJpDi8V9cTF&28iCS>H8$pG68v?Lq|ei2@xo8veE-cg zEXjKrrYCtKHE`n$xa1gctt@ok34B(E_8Be-5Pas*4elmG)l4kGk|G@ph$iGNG zAIlsY$R0YshV}Wwq;7MrdD}y4JJSTrk!K+Vl`n6E6qK#Xn!Fiv7C1u5(9Pi+!&zrz g9vj11FxeB`*AL7cNcN`O8T;m}amyn+)X*LKUqw}X*Z=?k literal 0 HcmV?d00001 diff --git a/Backend/venv/lib/python3.12/site-packages/_pytest/_code/code.py b/Backend/venv/lib/python3.12/site-packages/_pytest/_code/code.py index add2a493..9b051332 100644 --- a/Backend/venv/lib/python3.12/site-packages/_pytest/_code/code.py +++ b/Backend/venv/lib/python3.12/site-packages/_pytest/_code/code.py @@ -1,37 +1,36 @@ -# mypy: allow-untyped-defs -from __future__ import annotations - import ast -from collections.abc import Callable -from collections.abc import Iterable -from collections.abc import Mapping -from collections.abc import Sequence import dataclasses import inspect +import os +import re +import sys +import traceback from inspect import CO_VARARGS from inspect import CO_VARKEYWORDS from io import StringIO -import os from pathlib import Path -import re -import sys -from traceback import extract_tb -from traceback import format_exception from traceback import format_exception_only -from traceback import FrameSummary from types import CodeType from types import FrameType from types import TracebackType from typing import Any +from typing import Callable from typing import ClassVar -from typing import Final -from typing import final +from typing import Dict from typing import Generic -from typing import Literal +from typing import Iterable +from typing import List +from typing import Mapping +from typing import Optional from typing import overload -from typing import SupportsIndex -from typing import TypeAlias +from typing import Pattern +from typing import Sequence +from typing import Set +from typing import Tuple +from typing import Type +from typing import TYPE_CHECKING from typing import TypeVar +from typing import Union import pluggy @@ -43,19 +42,22 @@ from _pytest._code.source import Source from _pytest._io import TerminalWriter from _pytest._io.saferepr import safeformat from _pytest._io.saferepr import saferepr +from _pytest.compat import final from _pytest.compat import get_real_func from _pytest.deprecated import check_ispytest from _pytest.pathlib import absolutepath from _pytest.pathlib import bestrelpath +if TYPE_CHECKING: + from typing_extensions import Final + from typing_extensions import Literal + from typing_extensions import SupportsIndex -if sys.version_info < (3, 11): + _TracebackStyle = Literal["long", "short", "line", "no", "native", "value", "auto"] + +if sys.version_info[:2] < (3, 11): from exceptiongroup import BaseExceptionGroup -TracebackStyle = Literal["long", "short", "line", "no", "native", "value", "auto"] - -EXCEPTION_OR_MORE = type[BaseException] | tuple[type[BaseException], ...] - class Code: """Wrapper around Python code objects.""" @@ -66,7 +68,7 @@ class Code: self.raw = obj @classmethod - def from_function(cls, obj: object) -> Code: + def from_function(cls, obj: object) -> "Code": return cls(getrawcode(obj)) def __eq__(self, other): @@ -84,7 +86,7 @@ class Code: return self.raw.co_name @property - def path(self) -> Path | str: + def path(self) -> Union[Path, str]: """Return a path object pointing to source code, or an ``str`` in case of ``OSError`` / non-existing file.""" if not self.raw.co_filename: @@ -101,17 +103,17 @@ class Code: return self.raw.co_filename @property - def fullsource(self) -> Source | None: + def fullsource(self) -> Optional["Source"]: """Return a _pytest._code.Source object for the full source file of the code.""" full, _ = findsource(self.raw) return full - def source(self) -> Source: + def source(self) -> "Source": """Return a _pytest._code.Source object for the code object's source only.""" # return source only for that part of code return Source(self.raw) - def getargs(self, var: bool = False) -> tuple[str, ...]: + def getargs(self, var: bool = False) -> Tuple[str, ...]: """Return a tuple with the argument names for the code object. If 'var' is set True also return the names of the variable and @@ -140,11 +142,11 @@ class Frame: return self.raw.f_lineno - 1 @property - def f_globals(self) -> dict[str, Any]: + def f_globals(self) -> Dict[str, Any]: return self.raw.f_globals @property - def f_locals(self) -> dict[str, Any]: + def f_locals(self) -> Dict[str, Any]: return self.raw.f_locals @property @@ -152,7 +154,7 @@ class Frame: return Code(self.raw.f_code) @property - def statement(self) -> Source: + def statement(self) -> "Source": """Statement this frame is at.""" if self.code.fullsource is None: return Source("") @@ -196,59 +198,20 @@ class TracebackEntry: def __init__( self, rawentry: TracebackType, - repr_style: Literal["short", "long"] | None = None, + repr_style: Optional['Literal["short", "long"]'] = None, ) -> None: - self._rawentry: Final = rawentry - self._repr_style: Final = repr_style + self._rawentry: "Final" = rawentry + self._repr_style: "Final" = repr_style def with_repr_style( - self, repr_style: Literal["short", "long"] | None - ) -> TracebackEntry: + self, repr_style: Optional['Literal["short", "long"]'] + ) -> "TracebackEntry": return TracebackEntry(self._rawentry, repr_style) @property def lineno(self) -> int: return self._rawentry.tb_lineno - 1 - def get_python_framesummary(self) -> FrameSummary: - # Python's built-in traceback module implements all the nitty gritty - # details to get column numbers of out frames. - stack_summary = extract_tb(self._rawentry, limit=1) - return stack_summary[0] - - # Column and end line numbers introduced in python 3.11 - if sys.version_info < (3, 11): - - @property - def end_lineno_relative(self) -> int | None: - return None - - @property - def colno(self) -> int | None: - return None - - @property - def end_colno(self) -> int | None: - return None - else: - - @property - def end_lineno_relative(self) -> int | None: - frame_summary = self.get_python_framesummary() - if frame_summary.end_lineno is None: # pragma: no cover - return None - return frame_summary.end_lineno - 1 - self.frame.code.firstlineno - - @property - def colno(self) -> int | None: - """Starting byte offset of the expression in the traceback entry.""" - return self.get_python_framesummary().colno - - @property - def end_colno(self) -> int | None: - """Ending byte offset of the expression in the traceback entry.""" - return self.get_python_framesummary().end_colno - @property def frame(self) -> Frame: return Frame(self._rawentry.tb_frame) @@ -258,22 +221,22 @@ class TracebackEntry: return self.lineno - self.frame.code.firstlineno def __repr__(self) -> str: - return f"" + return "" % (self.frame.code.path, self.lineno + 1) @property - def statement(self) -> Source: + def statement(self) -> "Source": """_pytest._code.Source object for the current statement.""" source = self.frame.code.fullsource assert source is not None return source.getstatement(self.lineno) @property - def path(self) -> Path | str: + def path(self) -> Union[Path, str]: """Path to the source code.""" return self.frame.code.path @property - def locals(self) -> dict[str, Any]: + def locals(self) -> Dict[str, Any]: """Locals of underlying frame.""" return self.frame.f_locals @@ -281,8 +244,8 @@ class TracebackEntry: return self.frame.code.firstlineno def getsource( - self, astcache: dict[str | Path, ast.AST] | None = None - ) -> Source | None: + self, astcache: Optional[Dict[Union[str, Path], ast.AST]] = None + ) -> Optional["Source"]: """Return failing source code.""" # we use the passed in astcache to not reparse asttrees # within exception info printing @@ -308,7 +271,7 @@ class TracebackEntry: source = property(getsource) - def ishidden(self, excinfo: ExceptionInfo[BaseException] | None) -> bool: + def ishidden(self, excinfo: Optional["ExceptionInfo[BaseException]"]) -> bool: """Return True if the current frame has a var __tracebackhide__ resolving to True. @@ -317,7 +280,9 @@ class TracebackEntry: Mostly for internal use. """ - tbh: bool | Callable[[ExceptionInfo[BaseException] | None], bool] = False + tbh: Union[ + bool, Callable[[Optional[ExceptionInfo[BaseException]]], bool] + ] = False for maybe_ns_dct in (self.frame.f_locals, self.frame.f_globals): # in normal cases, f_locals and f_globals are dictionaries # however via `exec(...)` / `eval(...)` they can be other types @@ -344,7 +309,12 @@ class TracebackEntry: # This output does not quite match Python's repr for traceback entries, # but changing it to do so would break certain plugins. See # https://github.com/pytest-dev/pytest/pull/7535/ for details. - return f" File '{self.path}':{self.lineno + 1} in {name}\n {line}\n" + return " File %r:%d in %s\n %s\n" % ( + str(self.path), + self.lineno + 1, + name, + line, + ) @property def name(self) -> str: @@ -352,18 +322,18 @@ class TracebackEntry: return self.frame.code.raw.co_name -class Traceback(list[TracebackEntry]): +class Traceback(List[TracebackEntry]): """Traceback objects encapsulate and offer higher level access to Traceback entries.""" def __init__( self, - tb: TracebackType | Iterable[TracebackEntry], + tb: Union[TracebackType, Iterable[TracebackEntry]], ) -> None: """Initialize from given python traceback object and ExceptionInfo.""" if isinstance(tb, TracebackType): def f(cur: TracebackType) -> Iterable[TracebackEntry]: - cur_: TracebackType | None = cur + cur_: Optional[TracebackType] = cur while cur_ is not None: yield TracebackEntry(cur_) cur_ = cur_.tb_next @@ -374,11 +344,11 @@ class Traceback(list[TracebackEntry]): def cut( self, - path: os.PathLike[str] | str | None = None, - lineno: int | None = None, - firstlineno: int | None = None, - excludepath: os.PathLike[str] | None = None, - ) -> Traceback: + path: Optional[Union["os.PathLike[str]", str]] = None, + lineno: Optional[int] = None, + firstlineno: Optional[int] = None, + excludepath: Optional["os.PathLike[str]"] = None, + ) -> "Traceback": """Return a Traceback instance wrapping part of this Traceback. By providing any combination of path, lineno and firstlineno, the @@ -409,12 +379,16 @@ class Traceback(list[TracebackEntry]): return self @overload - def __getitem__(self, key: SupportsIndex) -> TracebackEntry: ... + def __getitem__(self, key: "SupportsIndex") -> TracebackEntry: + ... @overload - def __getitem__(self, key: slice) -> Traceback: ... + def __getitem__(self, key: slice) -> "Traceback": + ... - def __getitem__(self, key: SupportsIndex | slice) -> TracebackEntry | Traceback: + def __getitem__( + self, key: Union["SupportsIndex", slice] + ) -> Union[TracebackEntry, "Traceback"]: if isinstance(key, slice): return self.__class__(super().__getitem__(key)) else: @@ -422,9 +396,12 @@ class Traceback(list[TracebackEntry]): def filter( self, - excinfo_or_fn: ExceptionInfo[BaseException] | Callable[[TracebackEntry], bool], - /, - ) -> Traceback: + # TODO(py38): change to positional only. + _excinfo_or_fn: Union[ + "ExceptionInfo[BaseException]", + Callable[[TracebackEntry], bool], + ], + ) -> "Traceback": """Return a Traceback instance with certain items removed. If the filter is an `ExceptionInfo`, removes all the ``TracebackEntry``s @@ -434,60 +411,34 @@ class Traceback(list[TracebackEntry]): ``TracebackEntry`` instance, and should return True when the item should be added to the ``Traceback``, False when not. """ - if isinstance(excinfo_or_fn, ExceptionInfo): - fn = lambda x: not x.ishidden(excinfo_or_fn) # noqa: E731 + if isinstance(_excinfo_or_fn, ExceptionInfo): + fn = lambda x: not x.ishidden(_excinfo_or_fn) # noqa: E731 else: - fn = excinfo_or_fn + fn = _excinfo_or_fn return Traceback(filter(fn, self)) - def recursionindex(self) -> int | None: + def recursionindex(self) -> Optional[int]: """Return the index of the frame/TracebackEntry where recursion originates if appropriate, None if no recursion occurred.""" - cache: dict[tuple[Any, int, int], list[dict[str, Any]]] = {} + cache: Dict[Tuple[Any, int, int], List[Dict[str, Any]]] = {} for i, entry in enumerate(self): # id for the code.raw is needed to work around # the strange metaprogramming in the decorator lib from pypi # which generates code objects that have hash/value equality # XXX needs a test key = entry.frame.code.path, id(entry.frame.code.raw), entry.lineno + # print "checking for recursion at", key values = cache.setdefault(key, []) - # Since Python 3.13 f_locals is a proxy, freeze it. - loc = dict(entry.frame.f_locals) if values: + f = entry.frame + loc = f.f_locals for otherloc in values: if otherloc == loc: return i - values.append(loc) + values.append(entry.frame.f_locals) return None -def stringify_exception( - exc: BaseException, include_subexception_msg: bool = True -) -> str: - try: - notes = getattr(exc, "__notes__", []) - except KeyError: - # Workaround for https://github.com/python/cpython/issues/98778 on - # some 3.10 and 3.11 patch versions. - HTTPError = getattr(sys.modules.get("urllib.error", None), "HTTPError", ()) - if sys.version_info < (3, 12) and isinstance(exc, HTTPError): - notes = [] - else: # pragma: no cover - # exception not related to above bug, reraise - raise - if not include_subexception_msg and isinstance(exc, BaseExceptionGroup): - message = exc.message - else: - message = str(exc) - - return "\n".join( - [ - message, - *notes, - ] - ) - - E = TypeVar("E", bound=BaseException, covariant=True) @@ -498,15 +449,15 @@ class ExceptionInfo(Generic[E]): _assert_start_repr: ClassVar = "AssertionError('assert " - _excinfo: tuple[type[E], E, TracebackType] | None + _excinfo: Optional[Tuple[Type["E"], "E", TracebackType]] _striptext: str - _traceback: Traceback | None + _traceback: Optional[Traceback] def __init__( self, - excinfo: tuple[type[E], E, TracebackType] | None, + excinfo: Optional[Tuple[Type["E"], "E", TracebackType]], striptext: str = "", - traceback: Traceback | None = None, + traceback: Optional[Traceback] = None, *, _ispytest: bool = False, ) -> None: @@ -522,8 +473,8 @@ class ExceptionInfo(Generic[E]): # This is OK to ignore because this class is (conceptually) readonly. # See https://github.com/python/mypy/issues/7049. exception: E, # type: ignore[misc] - exprinfo: str | None = None, - ) -> ExceptionInfo[E]: + exprinfo: Optional[str] = None, + ) -> "ExceptionInfo[E]": """Return an ExceptionInfo for an existing exception. The exception must have a non-``None`` ``__traceback__`` attribute, @@ -538,19 +489,18 @@ class ExceptionInfo(Generic[E]): .. versionadded:: 7.4 """ - assert exception.__traceback__, ( - "Exceptions passed to ExcInfo.from_exception(...)" - " must have a non-None __traceback__." - ) + assert ( + exception.__traceback__ + ), "Exceptions passed to ExcInfo.from_exception(...) must have a non-None __traceback__." exc_info = (type(exception), exception, exception.__traceback__) return cls.from_exc_info(exc_info, exprinfo) @classmethod def from_exc_info( cls, - exc_info: tuple[type[E], E, TracebackType], - exprinfo: str | None = None, - ) -> ExceptionInfo[E]: + exc_info: Tuple[Type[E], E, TracebackType], + exprinfo: Optional[str] = None, + ) -> "ExceptionInfo[E]": """Like :func:`from_exception`, but using old-style exc_info tuple.""" _striptext = "" if exprinfo is None and isinstance(exc_info[1], AssertionError): @@ -563,7 +513,9 @@ class ExceptionInfo(Generic[E]): return cls(exc_info, _striptext, _ispytest=True) @classmethod - def from_current(cls, exprinfo: str | None = None) -> ExceptionInfo[BaseException]: + def from_current( + cls, exprinfo: Optional[str] = None + ) -> "ExceptionInfo[BaseException]": """Return an ExceptionInfo matching the current traceback. .. warning:: @@ -583,45 +535,45 @@ class ExceptionInfo(Generic[E]): return ExceptionInfo.from_exc_info(exc_info, exprinfo) @classmethod - def for_later(cls) -> ExceptionInfo[E]: + def for_later(cls) -> "ExceptionInfo[E]": """Return an unfilled ExceptionInfo.""" return cls(None, _ispytest=True) - def fill_unfilled(self, exc_info: tuple[type[E], E, TracebackType]) -> None: + def fill_unfilled(self, exc_info: Tuple[Type[E], E, TracebackType]) -> None: """Fill an unfilled ExceptionInfo created with ``for_later()``.""" assert self._excinfo is None, "ExceptionInfo was already filled" self._excinfo = exc_info @property - def type(self) -> type[E]: + def type(self) -> Type[E]: """The exception class.""" - assert self._excinfo is not None, ( - ".type can only be used after the context manager exits" - ) + assert ( + self._excinfo is not None + ), ".type can only be used after the context manager exits" return self._excinfo[0] @property def value(self) -> E: """The exception value.""" - assert self._excinfo is not None, ( - ".value can only be used after the context manager exits" - ) + assert ( + self._excinfo is not None + ), ".value can only be used after the context manager exits" return self._excinfo[1] @property def tb(self) -> TracebackType: """The exception raw traceback.""" - assert self._excinfo is not None, ( - ".tb can only be used after the context manager exits" - ) + assert ( + self._excinfo is not None + ), ".tb can only be used after the context manager exits" return self._excinfo[2] @property def typename(self) -> str: """The type name of the exception.""" - assert self._excinfo is not None, ( - ".typename can only be used after the context manager exits" - ) + assert ( + self._excinfo is not None + ), ".typename can only be used after the context manager exits" return self.type.__name__ @property @@ -638,7 +590,9 @@ class ExceptionInfo(Generic[E]): def __repr__(self) -> str: if self._excinfo is None: return "" - return f"<{self.__class__.__name__} {saferepr(self._excinfo[1])} tblen={len(self.traceback)}>" + return "<{} {} tblen={}>".format( + self.__class__.__name__, saferepr(self._excinfo[1]), len(self.traceback) + ) def exconly(self, tryshort: bool = False) -> str: """Return the exception as a string. @@ -648,23 +602,6 @@ class ExceptionInfo(Generic[E]): representation is returned (so 'AssertionError: ' is removed from the beginning). """ - - def _get_single_subexc( - eg: BaseExceptionGroup[BaseException], - ) -> BaseException | None: - if len(eg.exceptions) != 1: - return None - if isinstance(e := eg.exceptions[0], BaseExceptionGroup): - return _get_single_subexc(e) - return e - - if ( - tryshort - and isinstance(self.value, BaseExceptionGroup) - and (subexc := _get_single_subexc(self.value)) is not None - ): - return f"{subexc!r} [single exception in {type(self.value).__name__}]" - lines = format_exception_only(self.type, self.value) text = "".join(lines) text = text.rstrip() @@ -673,14 +610,16 @@ class ExceptionInfo(Generic[E]): text = text[len(self._striptext) :] return text - def errisinstance(self, exc: EXCEPTION_OR_MORE) -> bool: + def errisinstance( + self, exc: Union[Type[BaseException], Tuple[Type[BaseException], ...]] + ) -> bool: """Return True if the exception is an instance of exc. Consider using ``isinstance(excinfo.value, exc)`` instead. """ return isinstance(self.value, exc) - def _getreprcrash(self) -> ReprFileLocation | None: + def _getreprcrash(self) -> Optional["ReprFileLocation"]: # Find last non-hidden traceback entry that led to the exception of the # traceback, or None if all hidden. for i in range(-1, -len(self.traceback) - 1, -1): @@ -694,14 +633,15 @@ class ExceptionInfo(Generic[E]): def getrepr( self, showlocals: bool = False, - style: TracebackStyle = "long", + style: "_TracebackStyle" = "long", abspath: bool = False, - tbfilter: bool | Callable[[ExceptionInfo[BaseException]], Traceback] = True, + tbfilter: Union[ + bool, Callable[["ExceptionInfo[BaseException]"], Traceback] + ] = True, funcargs: bool = False, truncate_locals: bool = True, - truncate_args: bool = True, chain: bool = True, - ) -> ReprExceptionInfo | ExceptionChainRepr: + ) -> Union["ReprExceptionInfo", "ExceptionChainRepr"]: """Return str()able representation of this exception info. :param bool showlocals: @@ -730,9 +670,6 @@ class ExceptionInfo(Generic[E]): :param bool truncate_locals: With ``showlocals==True``, make sure locals can be safely represented as strings. - :param bool truncate_args: - With ``showargs==True``, make sure args can be safely represented as strings. - :param bool chain: If chained exceptions in Python 3 should be shown. @@ -743,7 +680,7 @@ class ExceptionInfo(Generic[E]): if style == "native": return ReprExceptionInfo( reprtraceback=ReprTracebackNative( - format_exception( + traceback.format_exception( self.type, self.value, self.traceback[0]._rawentry if self.traceback else None, @@ -759,108 +696,25 @@ class ExceptionInfo(Generic[E]): tbfilter=tbfilter, funcargs=funcargs, truncate_locals=truncate_locals, - truncate_args=truncate_args, chain=chain, ) return fmt.repr_excinfo(self) - def match(self, regexp: str | re.Pattern[str]) -> Literal[True]: + def match(self, regexp: Union[str, Pattern[str]]) -> "Literal[True]": """Check whether the regular expression `regexp` matches the string representation of the exception using :func:`python:re.search`. If it matches `True` is returned, otherwise an `AssertionError` is raised. """ __tracebackhide__ = True - value = stringify_exception(self.value) - msg = ( - f"Regex pattern did not match.\n" - f" Expected regex: {regexp!r}\n" - f" Actual message: {value!r}" - ) + value = str(self.value) + msg = f"Regex pattern did not match.\n Regex: {regexp!r}\n Input: {value!r}" if regexp == value: msg += "\n Did you mean to `re.escape()` the regex?" assert re.search(regexp, value), msg # Return True to allow for "assert excinfo.match()". return True - def _group_contains( - self, - exc_group: BaseExceptionGroup[BaseException], - expected_exception: EXCEPTION_OR_MORE, - match: str | re.Pattern[str] | None, - target_depth: int | None = None, - current_depth: int = 1, - ) -> bool: - """Return `True` if a `BaseExceptionGroup` contains a matching exception.""" - if (target_depth is not None) and (current_depth > target_depth): - # already descended past the target depth - return False - for exc in exc_group.exceptions: - if isinstance(exc, BaseExceptionGroup): - if self._group_contains( - exc, expected_exception, match, target_depth, current_depth + 1 - ): - return True - if (target_depth is not None) and (current_depth != target_depth): - # not at the target depth, no match - continue - if not isinstance(exc, expected_exception): - continue - if match is not None: - value = stringify_exception(exc) - if not re.search(match, value): - continue - return True - return False - - def group_contains( - self, - expected_exception: EXCEPTION_OR_MORE, - *, - match: str | re.Pattern[str] | None = None, - depth: int | None = None, - ) -> bool: - """Check whether a captured exception group contains a matching exception. - - :param Type[BaseException] | Tuple[Type[BaseException]] expected_exception: - The expected exception type, or a tuple if one of multiple possible - exception types are expected. - - :param str | re.Pattern[str] | None match: - If specified, a string containing a regular expression, - or a regular expression object, that is tested against the string - representation of the exception and its `PEP-678 ` `__notes__` - using :func:`re.search`. - - To match a literal string that may contain :ref:`special characters - `, the pattern can first be escaped with :func:`re.escape`. - - :param Optional[int] depth: - If `None`, will search for a matching exception at any nesting depth. - If >= 1, will only match an exception if it's at the specified depth (depth = 1 being - the exceptions contained within the topmost exception group). - - .. versionadded:: 8.0 - - .. warning:: - This helper makes it easy to check for the presence of specific exceptions, - but it is very bad for checking that the group does *not* contain - *any other exceptions*. - You should instead consider using :class:`pytest.RaisesGroup` - - """ - msg = "Captured exception is not an instance of `BaseExceptionGroup`" - assert isinstance(self.value, BaseExceptionGroup), msg - msg = "`depth` must be >= 1 if specified" - assert (depth is None) or (depth >= 1), msg - return self._group_contains(self.value, expected_exception, match, depth) - - -# Type alias for the `tbfilter` setting: -# bool: If True, it should be filtered using Traceback.filter() -# callable: A callable that takes an ExceptionInfo and returns the filtered traceback. -TracebackFilter: TypeAlias = bool | Callable[[ExceptionInfo[BaseException]], Traceback] - @dataclasses.dataclass class FormattedExcinfo: @@ -871,18 +725,17 @@ class FormattedExcinfo: fail_marker: ClassVar = "E" showlocals: bool = False - style: TracebackStyle = "long" + style: "_TracebackStyle" = "long" abspath: bool = True - tbfilter: TracebackFilter = True + tbfilter: Union[bool, Callable[[ExceptionInfo[BaseException]], Traceback]] = True funcargs: bool = False truncate_locals: bool = True - truncate_args: bool = True chain: bool = True - astcache: dict[str | Path, ast.AST] = dataclasses.field( + astcache: Dict[Union[str, Path], ast.AST] = dataclasses.field( default_factory=dict, init=False, repr=False ) - def _getindent(self, source: Source) -> int: + def _getindent(self, source: "Source") -> int: # Figure out indent for the given source. try: s = str(source.getstatement(len(source) - 1)) @@ -897,34 +750,27 @@ class FormattedExcinfo: return 0 return 4 + (len(s) - len(s.lstrip())) - def _getentrysource(self, entry: TracebackEntry) -> Source | None: + def _getentrysource(self, entry: TracebackEntry) -> Optional["Source"]: source = entry.getsource(self.astcache) if source is not None: source = source.deindent() return source - def repr_args(self, entry: TracebackEntry) -> ReprFuncArgs | None: + def repr_args(self, entry: TracebackEntry) -> Optional["ReprFuncArgs"]: if self.funcargs: args = [] for argname, argvalue in entry.frame.getargs(var=True): - if self.truncate_args: - str_repr = saferepr(argvalue) - else: - str_repr = saferepr(argvalue, maxsize=None) - args.append((argname, str_repr)) + args.append((argname, saferepr(argvalue))) return ReprFuncArgs(args) return None def get_source( self, - source: Source | None, + source: Optional["Source"], line_index: int = -1, - excinfo: ExceptionInfo[BaseException] | None = None, + excinfo: Optional[ExceptionInfo[BaseException]] = None, short: bool = False, - end_line_index: int | None = None, - colno: int | None = None, - end_colno: int | None = None, - ) -> list[str]: + ) -> List[str]: """Return formatted and marked up source lines.""" lines = [] if source is not None and line_index < 0: @@ -937,30 +783,10 @@ class FormattedExcinfo: space_prefix = " " if short: lines.append(space_prefix + source.lines[line_index].strip()) - lines.extend( - self.get_highlight_arrows_for_line( - raw_line=source.raw_lines[line_index], - line=source.lines[line_index].strip(), - lineno=line_index, - end_lineno=end_line_index, - colno=colno, - end_colno=end_colno, - ) - ) else: for line in source.lines[:line_index]: lines.append(space_prefix + line) lines.append(self.flow_marker + " " + source.lines[line_index]) - lines.extend( - self.get_highlight_arrows_for_line( - raw_line=source.raw_lines[line_index], - line=source.lines[line_index], - lineno=line_index, - end_lineno=end_line_index, - colno=colno, - end_colno=end_colno, - ) - ) for line in source.lines[line_index + 1 :]: lines.append(space_prefix + line) if excinfo is not None: @@ -968,49 +794,12 @@ class FormattedExcinfo: lines.extend(self.get_exconly(excinfo, indent=indent, markall=True)) return lines - def get_highlight_arrows_for_line( - self, - line: str, - raw_line: str, - lineno: int | None, - end_lineno: int | None, - colno: int | None, - end_colno: int | None, - ) -> list[str]: - """Return characters highlighting a source line. - - Example with colno and end_colno pointing to the bar expression: - "foo() + bar()" - returns " ^^^^^" - """ - if lineno != end_lineno: - # Don't handle expressions that span multiple lines. - return [] - if colno is None or end_colno is None: - # Can't do anything without column information. - return [] - - num_stripped_chars = len(raw_line) - len(line) - - start_char_offset = _byte_offset_to_character_offset(raw_line, colno) - end_char_offset = _byte_offset_to_character_offset(raw_line, end_colno) - num_carets = end_char_offset - start_char_offset - # If the highlight would span the whole line, it is redundant, don't - # show it. - if num_carets >= len(line.strip()): - return [] - - highlights = " " - highlights += " " * (start_char_offset - num_stripped_chars + 1) - highlights += "^" * num_carets - return [highlights] - def get_exconly( self, excinfo: ExceptionInfo[BaseException], indent: int = 4, markall: bool = False, - ) -> list[str]: + ) -> List[str]: lines = [] indentstr = " " * indent # Get the real exception information out. @@ -1022,7 +811,7 @@ class FormattedExcinfo: failindent = indentstr return lines - def repr_locals(self, locals: Mapping[str, object]) -> ReprLocals | None: + def repr_locals(self, locals: Mapping[str, object]) -> Optional["ReprLocals"]: if self.showlocals: lines = [] keys = [loc for loc in locals if loc[0] != "@"] @@ -1050,10 +839,10 @@ class FormattedExcinfo: def repr_traceback_entry( self, - entry: TracebackEntry | None, - excinfo: ExceptionInfo[BaseException] | None = None, - ) -> ReprEntry: - lines: list[str] = [] + entry: Optional[TracebackEntry], + excinfo: Optional[ExceptionInfo[BaseException]] = None, + ) -> "ReprEntry": + lines: List[str] = [] style = ( entry._repr_style if entry is not None and entry._repr_style is not None @@ -1064,28 +853,16 @@ class FormattedExcinfo: if source is None: source = Source("???") line_index = 0 - end_line_index, colno, end_colno = None, None, None else: - line_index = entry.relline - end_line_index = entry.end_lineno_relative - colno = entry.colno - end_colno = entry.end_colno + line_index = entry.lineno - entry.getfirstlinesource() short = style == "short" reprargs = self.repr_args(entry) if not short else None - s = self.get_source( - source=source, - line_index=line_index, - excinfo=excinfo, - short=short, - end_line_index=end_line_index, - colno=colno, - end_colno=end_colno, - ) + s = self.get_source(source, line_index, excinfo, short=short) lines.extend(s) if short: - message = f"in {entry.name}" + message = "in %s" % (entry.name) else: - message = (excinfo and excinfo.typename) or "" + message = excinfo and excinfo.typename or "" entry_path = entry.path path = self._makepath(entry_path) reprfileloc = ReprFileLocation(path, entry.lineno + 1, message) @@ -1100,7 +877,7 @@ class FormattedExcinfo: lines.extend(self.get_exconly(excinfo, indent=4)) return ReprEntry(lines, None, None, None, style) - def _makepath(self, path: Path | str) -> str: + def _makepath(self, path: Union[Path, str]) -> str: if not self.abspath and isinstance(path, Path): try: np = bestrelpath(Path.cwd(), path) @@ -1110,8 +887,12 @@ class FormattedExcinfo: return np return str(path) - def repr_traceback(self, excinfo: ExceptionInfo[BaseException]) -> ReprTraceback: - traceback = filter_excinfo_traceback(self.tbfilter, excinfo) + def repr_traceback(self, excinfo: ExceptionInfo[BaseException]) -> "ReprTraceback": + traceback = excinfo.traceback + if callable(self.tbfilter): + traceback = self.tbfilter(excinfo) + elif self.tbfilter: + traceback = traceback.filter(excinfo) if isinstance(excinfo.value, RecursionError): traceback, extraline = self._truncate_recursive_traceback(traceback) @@ -1137,7 +918,7 @@ class FormattedExcinfo: def _truncate_recursive_traceback( self, traceback: Traceback - ) -> tuple[Traceback, str | None]: + ) -> Tuple[Traceback, Optional[str]]: """Truncate the given recursive traceback trying to find the starting point of the recursion. @@ -1154,11 +935,16 @@ class FormattedExcinfo: recursionindex = traceback.recursionindex() except Exception as e: max_frames = 10 - extraline: str | None = ( + extraline: Optional[str] = ( "!!! Recursion error detected, but an error occurred locating the origin of recursion.\n" " The following exception happened when comparing locals in the stack frame:\n" - f" {type(e).__name__}: {e!s}\n" - f" Displaying first and last {max_frames} stack frames out of {len(traceback)}." + " {exc_type}: {exc_msg}\n" + " Displaying first and last {max_frames} stack frames out of {total}." + ).format( + exc_type=type(e).__name__, + exc_msg=str(e), + max_frames=max_frames, + total=len(traceback), ) # Type ignored because adding two instances of a List subtype # currently incorrectly has type List instead of the subtype. @@ -1172,12 +958,16 @@ class FormattedExcinfo: return traceback, extraline - def repr_excinfo(self, excinfo: ExceptionInfo[BaseException]) -> ExceptionChainRepr: - repr_chain: list[tuple[ReprTraceback, ReprFileLocation | None, str | None]] = [] - e: BaseException | None = excinfo.value - excinfo_: ExceptionInfo[BaseException] | None = excinfo + def repr_excinfo( + self, excinfo: ExceptionInfo[BaseException] + ) -> "ExceptionChainRepr": + repr_chain: List[ + Tuple[ReprTraceback, Optional[ReprFileLocation], Optional[str]] + ] = [] + e: Optional[BaseException] = excinfo.value + excinfo_: Optional[ExceptionInfo[BaseException]] = excinfo descr = None - seen: set[int] = set() + seen: Set[int] = set() while e is not None and id(e) not in seen: seen.add(id(e)) @@ -1185,15 +975,14 @@ class FormattedExcinfo: # Fall back to native traceback as a temporary workaround until # full support for exception groups added to ExceptionInfo. # See https://github.com/pytest-dev/pytest/issues/9159 - reprtraceback: ReprTraceback | ReprTracebackNative if isinstance(e, BaseExceptionGroup): - # don't filter any sub-exceptions since they shouldn't have any internal frames - traceback = filter_excinfo_traceback(self.tbfilter, excinfo) - reprtraceback = ReprTracebackNative( - format_exception( - type(excinfo.value), - excinfo.value, - traceback[0]._rawentry, + reprtraceback: Union[ + ReprTracebackNative, ReprTraceback + ] = ReprTracebackNative( + traceback.format_exception( + type(excinfo_.value), + excinfo_.value, + excinfo_.traceback[0]._rawentry, ) ) else: @@ -1202,7 +991,9 @@ class FormattedExcinfo: else: # Fallback to native repr if the exception doesn't have a traceback: # ExceptionInfo objects require a full traceback to work. - reprtraceback = ReprTracebackNative(format_exception(type(e), e, None)) + reprtraceback = ReprTracebackNative( + traceback.format_exception(type(e), e, None) + ) reprcrash = None repr_chain += [(reprtraceback, reprcrash, descr)] @@ -1243,9 +1034,9 @@ class TerminalRepr: @dataclasses.dataclass(eq=False) class ExceptionRepr(TerminalRepr): # Provided by subclasses. - reprtraceback: ReprTraceback - reprcrash: ReprFileLocation | None - sections: list[tuple[str, str, str]] = dataclasses.field( + reprtraceback: "ReprTraceback" + reprcrash: Optional["ReprFileLocation"] + sections: List[Tuple[str, str, str]] = dataclasses.field( init=False, default_factory=list ) @@ -1260,11 +1051,13 @@ class ExceptionRepr(TerminalRepr): @dataclasses.dataclass(eq=False) class ExceptionChainRepr(ExceptionRepr): - chain: Sequence[tuple[ReprTraceback, ReprFileLocation | None, str | None]] + chain: Sequence[Tuple["ReprTraceback", Optional["ReprFileLocation"], Optional[str]]] def __init__( self, - chain: Sequence[tuple[ReprTraceback, ReprFileLocation | None, str | None]], + chain: Sequence[ + Tuple["ReprTraceback", Optional["ReprFileLocation"], Optional[str]] + ], ) -> None: # reprcrash and reprtraceback of the outermost (the newest) exception # in the chain. @@ -1285,8 +1078,8 @@ class ExceptionChainRepr(ExceptionRepr): @dataclasses.dataclass(eq=False) class ReprExceptionInfo(ExceptionRepr): - reprtraceback: ReprTraceback - reprcrash: ReprFileLocation | None + reprtraceback: "ReprTraceback" + reprcrash: Optional["ReprFileLocation"] def toterminal(self, tw: TerminalWriter) -> None: self.reprtraceback.toterminal(tw) @@ -1295,9 +1088,9 @@ class ReprExceptionInfo(ExceptionRepr): @dataclasses.dataclass(eq=False) class ReprTraceback(TerminalRepr): - reprentries: Sequence[ReprEntry | ReprEntryNative] - extraline: str | None - style: TracebackStyle + reprentries: Sequence[Union["ReprEntry", "ReprEntryNative"]] + extraline: Optional[str] + style: "_TracebackStyle" entrysep: ClassVar = "_ " @@ -1309,8 +1102,10 @@ class ReprTraceback(TerminalRepr): entry.toterminal(tw) if i < len(self.reprentries) - 1: next_entry = self.reprentries[i + 1] - if entry.style == "long" or ( - entry.style == "short" and next_entry.style == "long" + if ( + entry.style == "long" + or entry.style == "short" + and next_entry.style == "long" ): tw.sep(self.entrysep) @@ -1329,7 +1124,7 @@ class ReprTracebackNative(ReprTraceback): class ReprEntryNative(TerminalRepr): lines: Sequence[str] - style: ClassVar[TracebackStyle] = "native" + style: ClassVar["_TracebackStyle"] = "native" def toterminal(self, tw: TerminalWriter) -> None: tw.write("".join(self.lines)) @@ -1338,10 +1133,10 @@ class ReprEntryNative(TerminalRepr): @dataclasses.dataclass(eq=False) class ReprEntry(TerminalRepr): lines: Sequence[str] - reprfuncargs: ReprFuncArgs | None - reprlocals: ReprLocals | None - reprfileloc: ReprFileLocation | None - style: TracebackStyle + reprfuncargs: Optional["ReprFuncArgs"] + reprlocals: Optional["ReprLocals"] + reprfileloc: Optional["ReprFileLocation"] + style: "_TracebackStyle" def _write_entry_lines(self, tw: TerminalWriter) -> None: """Write the source code portions of a list of traceback entries with syntax highlighting. @@ -1356,16 +1151,8 @@ class ReprEntry(TerminalRepr): the "E" prefix) using syntax highlighting, taking care to not highlighting the ">" character, as doing so might break line continuations. """ - if not self.lines: - return - if self.style == "value": - # Using tw.write instead of tw.line for testing purposes due to TWMock implementation; - # lines written with TWMock.line and TWMock._write_source cannot be distinguished - # from each other, whereas lines written with TWMock.write are marked with TWMock.WRITE - for line in self.lines: - tw.write(line) - tw.write("\n") + if not self.lines: return # separate indents and source lines that are not failures: we want to @@ -1373,9 +1160,9 @@ class ReprEntry(TerminalRepr): # such as "> assert 0" fail_marker = f"{FormattedExcinfo.fail_marker} " indent_size = len(fail_marker) - indents: list[str] = [] - source_lines: list[str] = [] - failure_lines: list[str] = [] + indents: List[str] = [] + source_lines: List[str] = [] + failure_lines: List[str] = [] for index, line in enumerate(self.lines): is_failure_line = line.startswith(fail_marker) if is_failure_line: @@ -1383,8 +1170,11 @@ class ReprEntry(TerminalRepr): failure_lines.extend(self.lines[index:]) break else: - indents.append(line[:indent_size]) - source_lines.append(line[indent_size:]) + if self.style == "value": + source_lines.append(line) + else: + indents.append(line[:indent_size]) + source_lines.append(line[indent_size:]) tw._write_source(source_lines, indents) @@ -1451,7 +1241,7 @@ class ReprLocals(TerminalRepr): @dataclasses.dataclass(eq=False) class ReprFuncArgs(TerminalRepr): - args: Sequence[tuple[str, object]] + args: Sequence[Tuple[str, object]] def toterminal(self, tw: TerminalWriter) -> None: if self.args: @@ -1472,7 +1262,7 @@ class ReprFuncArgs(TerminalRepr): tw.line("") -def getfslineno(obj: object) -> tuple[str | Path, int]: +def getfslineno(obj: object) -> Tuple[Union[str, Path], int]: """Return source location (path, lineno) for the given object. If the source cannot be determined return ("", -1). @@ -1484,7 +1274,7 @@ def getfslineno(obj: object) -> tuple[str | Path, int]: # in 6ec13a2b9. It ("place_as") appears to be something very custom. obj = get_real_func(obj) if hasattr(obj, "place_as"): - obj = obj.place_as + obj = obj.place_as # type: ignore[attr-defined] try: code = Code.from_function(obj) @@ -1494,7 +1284,7 @@ def getfslineno(obj: object) -> tuple[str | Path, int]: except TypeError: return "", -1 - fspath = (fn and absolutepath(fn)) or "" + fspath = fn and absolutepath(fn) or "" lineno = -1 if fspath: try: @@ -1506,12 +1296,6 @@ def getfslineno(obj: object) -> tuple[str | Path, int]: return code.path, code.firstlineno -def _byte_offset_to_character_offset(str, offset): - """Converts a byte based offset in a string to a code-point.""" - as_utf8 = str.encode("utf-8") - return len(as_utf8[:offset].decode("utf-8", errors="replace")) - - # Relative paths that we use to filter traceback entries from appearing to the user; # see filter_traceback. # note: if we need to add more paths than what we have now we should probably use a list @@ -1551,15 +1335,3 @@ def filter_traceback(entry: TracebackEntry) -> bool: return False return True - - -def filter_excinfo_traceback( - tbfilter: TracebackFilter, excinfo: ExceptionInfo[BaseException] -) -> Traceback: - """Filter the exception traceback in ``excinfo`` according to ``tbfilter``.""" - if callable(tbfilter): - return tbfilter(excinfo) - elif tbfilter: - return excinfo.traceback.filter(excinfo) - else: - return excinfo.traceback diff --git a/Backend/venv/lib/python3.12/site-packages/_pytest/_code/source.py b/Backend/venv/lib/python3.12/site-packages/_pytest/_code/source.py index 99c242dd..208cfb80 100644 --- a/Backend/venv/lib/python3.12/site-packages/_pytest/_code/source.py +++ b/Backend/venv/lib/python3.12/site-packages/_pytest/_code/source.py @@ -1,16 +1,17 @@ -# mypy: allow-untyped-defs -from __future__ import annotations - import ast -from bisect import bisect_right -from collections.abc import Iterable -from collections.abc import Iterator import inspect import textwrap import tokenize import types -from typing import overload import warnings +from bisect import bisect_right +from typing import Iterable +from typing import Iterator +from typing import List +from typing import Optional +from typing import overload +from typing import Tuple +from typing import Union class Source: @@ -21,17 +22,13 @@ class Source: def __init__(self, obj: object = None) -> None: if not obj: - self.lines: list[str] = [] - self.raw_lines: list[str] = [] + self.lines: List[str] = [] elif isinstance(obj, Source): self.lines = obj.lines - self.raw_lines = obj.raw_lines - elif isinstance(obj, tuple | list): + elif isinstance(obj, (tuple, list)): self.lines = deindent(x.rstrip("\n") for x in obj) - self.raw_lines = list(x.rstrip("\n") for x in obj) elif isinstance(obj, str): self.lines = deindent(obj.split("\n")) - self.raw_lines = obj.split("\n") else: try: rawcode = getrawcode(obj) @@ -39,7 +36,6 @@ class Source: except TypeError: src = inspect.getsource(obj) # type: ignore[arg-type] self.lines = deindent(src.split("\n")) - self.raw_lines = src.split("\n") def __eq__(self, other: object) -> bool: if not isinstance(other, Source): @@ -50,12 +46,14 @@ class Source: __hash__ = None # type: ignore @overload - def __getitem__(self, key: int) -> str: ... + def __getitem__(self, key: int) -> str: + ... @overload - def __getitem__(self, key: slice) -> Source: ... + def __getitem__(self, key: slice) -> "Source": + ... - def __getitem__(self, key: int | slice) -> str | Source: + def __getitem__(self, key: Union[int, slice]) -> Union[str, "Source"]: if isinstance(key, int): return self.lines[key] else: @@ -63,7 +61,6 @@ class Source: raise IndexError("cannot slice a Source with a step") newsource = Source() newsource.lines = self.lines[key.start : key.stop] - newsource.raw_lines = self.raw_lines[key.start : key.stop] return newsource def __iter__(self) -> Iterator[str]: @@ -72,7 +69,7 @@ class Source: def __len__(self) -> int: return len(self.lines) - def strip(self) -> Source: + def strip(self) -> "Source": """Return new Source object with trailing and leading blank lines removed.""" start, end = 0, len(self) while start < end and not self.lines[start].strip(): @@ -80,37 +77,34 @@ class Source: while end > start and not self.lines[end - 1].strip(): end -= 1 source = Source() - source.raw_lines = self.raw_lines source.lines[:] = self.lines[start:end] return source - def indent(self, indent: str = " " * 4) -> Source: + def indent(self, indent: str = " " * 4) -> "Source": """Return a copy of the source object with all lines indented by the given indent-string.""" newsource = Source() - newsource.raw_lines = self.raw_lines newsource.lines = [(indent + line) for line in self.lines] return newsource - def getstatement(self, lineno: int) -> Source: + def getstatement(self, lineno: int) -> "Source": """Return Source statement which contains the given linenumber (counted from 0).""" start, end = self.getstatementrange(lineno) return self[start:end] - def getstatementrange(self, lineno: int) -> tuple[int, int]: + def getstatementrange(self, lineno: int) -> Tuple[int, int]: """Return (start, end) tuple which spans the minimal statement region which containing the given lineno.""" if not (0 <= lineno < len(self)): raise IndexError("lineno out of range") - _ast, start, end = getstatementrange_ast(lineno, self) + ast, start, end = getstatementrange_ast(lineno, self) return start, end - def deindent(self) -> Source: + def deindent(self) -> "Source": """Return a new Source object deindented.""" newsource = Source() newsource.lines[:] = deindent(self.lines) - newsource.raw_lines = self.raw_lines return newsource def __str__(self) -> str: @@ -122,14 +116,13 @@ class Source: # -def findsource(obj) -> tuple[Source | None, int]: +def findsource(obj) -> Tuple[Optional[Source], int]: try: sourcelines, lineno = inspect.findsource(obj) except Exception: return None, -1 source = Source() source.lines = [line.rstrip() for line in sourcelines] - source.raw_lines = sourcelines return source, lineno @@ -146,23 +139,24 @@ def getrawcode(obj: object, trycall: bool = True) -> types.CodeType: raise TypeError(f"could not get code object for {obj!r}") -def deindent(lines: Iterable[str]) -> list[str]: +def deindent(lines: Iterable[str]) -> List[str]: return textwrap.dedent("\n".join(lines)).splitlines() -def get_statement_startend2(lineno: int, node: ast.AST) -> tuple[int, int | None]: +def get_statement_startend2(lineno: int, node: ast.AST) -> Tuple[int, Optional[int]]: # Flatten all statements and except handlers into one lineno-list. # AST's line numbers start indexing at 1. - values: list[int] = [] + values: List[int] = [] for x in ast.walk(node): - if isinstance(x, ast.stmt | ast.ExceptHandler): - # The lineno points to the class/def, so need to include the decorators. - if isinstance(x, ast.ClassDef | ast.FunctionDef | ast.AsyncFunctionDef): + if isinstance(x, (ast.stmt, ast.ExceptHandler)): + # Before Python 3.8, the lineno of a decorated class or function pointed at the decorator. + # Since Python 3.8, the lineno points to the class/def, so need to include the decorators. + if isinstance(x, (ast.ClassDef, ast.FunctionDef, ast.AsyncFunctionDef)): for d in x.decorator_list: values.append(d.lineno - 1) values.append(x.lineno - 1) for name in ("finalbody", "orelse"): - val: list[ast.stmt] | None = getattr(x, name, None) + val: Optional[List[ast.stmt]] = getattr(x, name, None) if val: # Treat the finally/orelse part as its own statement. values.append(val[0].lineno - 1 - 1) @@ -180,8 +174,8 @@ def getstatementrange_ast( lineno: int, source: Source, assertion: bool = False, - astnode: ast.AST | None = None, -) -> tuple[ast.AST, int, int]: + astnode: Optional[ast.AST] = None, +) -> Tuple[ast.AST, int, int]: if astnode is None: content = str(source) # See #4260: @@ -203,9 +197,7 @@ def getstatementrange_ast( # by using the BlockFinder helper used which inspect.getsource() uses itself. block_finder = inspect.BlockFinder() # If we start with an indented line, put blockfinder to "started" mode. - block_finder.started = ( - bool(source.lines[start]) and source.lines[start][0].isspace() - ) + block_finder.started = source.lines[start][0].isspace() it = ((x + "\n") for x in source.lines[start:end]) try: for tok in tokenize.generate_tokens(lambda: next(it)): diff --git a/Backend/venv/lib/python3.12/site-packages/_pytest/_io/__init__.py b/Backend/venv/lib/python3.12/site-packages/_pytest/_io/__init__.py index b0155b18..db001e91 100644 --- a/Backend/venv/lib/python3.12/site-packages/_pytest/_io/__init__.py +++ b/Backend/venv/lib/python3.12/site-packages/_pytest/_io/__init__.py @@ -1,5 +1,3 @@ -from __future__ import annotations - from .terminalwriter import get_terminal_width from .terminalwriter import TerminalWriter diff --git a/Backend/venv/lib/python3.12/site-packages/_pytest/_io/__pycache__/__init__.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/_pytest/_io/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..840161614c88593d93677ea732c76b0511090ae0 GIT binary patch literal 334 zcmXw#ze>bF5XN`&#|z3`AqZk^6XCMxVJ8-+g_V^cTr)&>NtSGO!)CoRrB5OF2KOw! zfCR3xvI|^yl@q<2V&YJjlG6--Pkr4@ESl?O`SyIAKevQw0mjU5@VPVe33viJ=V;wm!D|IA}*ZeDNRl z{vXi}08*s@mSl|{*`zEtrC^zUWw)X(oT=EIaYBu!#uQR#Y??k7LUT43dd`%5VpZdE zqbJGv1*`G$xI!S!M9lybQ9B0GFaW8g14yc76J3>tzbJ8S`|s%=Ri9w%d`jtxBr9^( TMI=1>3XZ$bKk(iLHp2K9m=0Sy literal 0 HcmV?d00001 diff --git a/Backend/venv/lib/python3.12/site-packages/_pytest/_io/__pycache__/saferepr.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/_pytest/_io/__pycache__/saferepr.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..1684c21635f43e5483328090662a3d37534af9da GIT binary patch literal 7557 zcmc&(Yit`=cD^&i;hQ2U>TO4!_!Tp;MSJbFYsZPh#PVa4RU9kXZnRj8$DE-wGDR|X zhSp;#uj6=8skLDmZV_cSZMjH(D0NX}f&OrT{)mD8DB3^LDutO@1u)tGh5ykj6>GRa z(R1z$hmxyoVW2>-&3n(>xv#nByXSo8>YpQ#Ac6GV*Y@kJ?S%XrJ~UE`Bdna|2>Fnx zMCEd1$S%1d4xafOKPC(b9M%aSdxktr_JAx7iA)wj_6~VL_G&)Wr}?uU)qmA96i@?N z(5>^TL8uFYvRU=Rr;mJv&wp=A@RO3cBHx}0{Zwt0O6m>`Qs4?gnQ{zK% zEv~j^dG;o(d9`piG*%N@E1SWuwp|s666zNAzESH{+o86N&D#O_k6K=;nI)RffG*r5f`nhcat*Q%VGXAHwoGn2@*vqpOuo^_ z^faU_znxH?BUgy&ZPYgl|xQCcdRR&a3AFtxG%3Ei|JuPTPtKatVc zS6d!)vZz^pSVruQ{3hwKk{T(DX{q7-MC!O^Trdm8)Tx50<@UTL!5%mpp4rY>svi>aJ`K2@AFM+*7HlJ{D-FSc%9i0`PLofoR5`BxXBsbBk3bpe_@Hli@(m0*Ni z-=7wQyF3TEC1?|wjH@?jfE&QHeIJBx)Als43Zt(6prMn>ycu$3u7QowaHFnSnz$I2 z%5J*`)}Inf-P3@OjWEeDBTNHkR5DF2k!wG)%W=*{kY`}3yOb|d&Cv3uaz3X?upc%! zq+O4>KbD{p&Wn~YCB>BXPWN?D>G}D@C&McOANJM>FM1!X z21ulLBS4+vYVCbrrjC6fETxVw^!0!7)ymJ;cieO9a{C49hpBOc?rDXGZpRX?5%s>0fp6cegpDsrG7W{p+Q26qx6_|o#Fl!`47^anTko^&Cy++Wj z4)H2CB&Z>k*F2iY9G0MYRgWrWy)z`ssotxRA?8X|j~2*!Se^fBcqoWY4cw~8>K&Il zLngSPFl=4e@(+T6I}68T>Zd`rA870FSu#i9tmO1D-84Yf;4B%XoC%gx!flcYS?6>~ zN*>QzCRb85gN=b_1J4k6Dhd9(N5N>EOtnOD92_;Hl<~LnHe`Rs0WP7m(=6cUI-vHp^URSl_dZ|d@_@)PksTxguE0CV?wDnKhfrV% z{I8${z@4!5;BFi#DpVPhoD*`yt;ct#vr@ibN&|(wwp$w4b2-VRrF=#)wI{X$T~)#4!AK*zYEPm~m{gHW zDC|A7d$P5ySr;x-A1f9N4RkeWtIts^sK?eV@(5fCF19(=fKLAD=PxEjOEgMFjiT?> z^SUX^Rsi?JL^ZNgMR&puCOwwN&~n*kjTMmPOinQjS#F%T%gkERB($H3H^A4|7P$>%MvN<{Q=ctv4%NJxs!}8%Jl4E`+u%$9m@W z&8dHx`zW^*dtoLG26e{&Xf;COTR%Or5bXmR6=nymC@AmScc)Jt4C*oY^2F%xgB_i&34*O>>vHL8oj&F3C?- z&$5_QQY7H%ra1`(>?_c5+gnIL4VcRr)*%pcSb1NNdDat(ob=;si6->ns$i z2dT@-A3(N_lyhaip`KA}@kCmy<|LV05V_@S}>3qrV8(EJONhNiAM_oaU!0XCIMO>BKjL& zLytqNEc^_-yaKAzL&9wkSiHLwdhT9m_hM-G{NPe(--2f!JLenInhEI2NDW6r8wJ#Z zWDTuZfAxb%Vu>Aee$7D#!qPyJbI|!qKvCepL%H^#D>!8XMR}=|cQCYvMF&p@0Br`!jd*ZSGyr!>M*upRoTdOCfu-k4 zEYKM*lyWMr0pO_Q;5JJ-cdqe8=gyf3zHw#JUhN22J}0Jl$>!1VGR1+lki3T4YyK^aM1x z2tNaP8W^w+xV`!+)V7@HnoHa|vJie|?N!$AGh{gbm2eNa5$qv94;&Ug2^|prhC3|$ zt$0|-z&khLr3$8%Gm!m{=oVsIRnSDu%i>!PT$zgS^J;$02Qe+rYJE@x@oct*MYutX za9K1Pf@n5m^`>*M$;NTrC@N-V1f0nk=7i2LA4I2KT=!`2xWc+fs?$d^q+L`ShC9ie zW-!MyuB+xqvX35yHCtXVjG8iLdG)*smrzy!EK*?{xsc_{6u{9zM8+7D9lg396#Alp zK%K1oD`XgtY#fbjWWY^iVJtP{k5O->M#4t;zeTcW#8rYW~?zA zfanJH7ouYx=&PqJmc6%~@i{VyH#=h4e-tL-N!eFk*G}c|F6OrLr4V;R%a@=}k{@`0 ztSIS&D6p}+mN2Z@cWW3+;<KM7Ixs4)6+xZD}P{Sd&N8Ft$ODJpC7u@|3&)mPJih?Q41$3{j&qi z@F&BJ!qNk9Av;u zzw-3gJ)6W$_hTJ(5z4xk#1obMH+^*068?Gt2V@K`*-d->s8LH~hszRGxWyfz??6?i;hPXU z2tjsaUIyVw#)ClpYwotwexqZvj`#3D{A?H@X`_FL8BPfPo9)Xnl*Q)S==x?)210S! z;f^l0>ANt(U%}7V1{pZ@7zsaLi?+|bGr!|b=PKUg{<}Bw{_srpgF;>8#SUA=+}mKf z2cX9TG>QYsE{Y#(`5Y2rdEu`fc+J9e%e2fik6U9emSG@{j~Ig50X%~Q2Jn{WEF3bM zp``J-{doV0^gD07EuZZ_b5{O-`iJu1>7jm#l#;O$<`t~SIzwr15Psfg#MWpG;X@(9eWw+xJwYvYKJ+}PD8CKpG{VO80c__tTkuVq( z^Cl~BMeww`vzOac{lUE*hZlDoUM28QKf#eiTP>cbZQ4=~1i2147wtX2jet}Ox7GzH m?}wvx5#M+TNIsPO$n;*DeW}r-rL~Sd-~@RCt5J~H2LCsqd*^Nd literal 0 HcmV?d00001 diff --git a/Backend/venv/lib/python3.12/site-packages/_pytest/_io/__pycache__/terminalwriter.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/_pytest/_io/__pycache__/terminalwriter.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..1357d70f00e4821620f83a8bf8051177c9b74c8e GIT binary patch literal 10097 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/Hx{Lc8Xi+saVS1soE4sh z)l zaqi^a0#l3lv?FeNDeX7DlhUe!x34#a)WUvaA9@+0+M^eoCp;)64nQ+uG%1u&zJ>+c zYP3hQQ8S{;5todNQhfpr8ol%1#PO)rA>c$$QnSY7aT-U0u$4}rW+_&gp=aSZbswxO zNH-;@4^Gyv(^6|%@4#U7EdZ0`A^2q;^nzYby`?VfeKUE_xATF!KIb~IVf_^1FSRs@AC!xr)l!nwgrp zz1fN_Q>L7^diLzh+4-KVw{6M0FXP>p^>$2IABau!Cl)Se#r+U1vidWQ`l+7jli+sU zJayyL^uXLTnCc_Pwuc-v>N@B{$mX>!4=G4eRyKYQ_xNZR`meAn%6KE)2w~V!o{8h&A=fKBoG}eXH;IvXqn7s^7 zY(@`%S@PgXBlb$Q!(as7V%KQS$N;J-T}9D{F+(i{Xeb%{ecN*?ywOrW4@wn=ob^zl z2dxK{_H*=M_q2SC7Oh1s+^bcbyL|EZg^R(9Cy$>w9z1il`#8Mf!9tp&v;o5+{ezmI zCMKeCQYvi{3-5d*V1>o2Atgd};!sG!=p4K_grX4%>LHwQP;7lE-5Lfcrx{ca8T-C9lI zsXGvk#|9#U0r^^3roSFgl{ertX*5Q80Wht;K)f2z^($<(8UR3lhoF29yHpjsL~-j? zcr3>UcIEG|(PA_zx3O4e6a)CguZUP@f~Qm1UX7=({$*X!kgE2^6Fu>YQ=1Bc2C>$E>hjJ z=xY2d=c$`LJac%-6UcZ1kBAB8s}l1pQ+fE;hr8ap^q{)-w)K{EK9H^633j2gYDExy z?mQ7H+<6D_*6U-pXFS_W$M!J4?m2yTpfGr`ac{PIAB;Z1ln&=$t^a!LC$2iQ4z=)w z-#i1a3D(*tDn4ibeN{J0-aB&i0J(eMn5pXs_bb-k?c#prWB?W%;a>P13boG=e#Y<- z7SWCM`!sk|!SG!$2(~#m5|_rJh&zJ8uZ@MGg%)0lgcC{(1}La?6}*-yF9HBAQsVH- z7+)+EX`NLF=UaEdo4wN|Oea%a8?v1a0QYjywVUUGEBJ`9@+Y z&$FD+Jh%H1foz2{Dj+~)axMv#8KDw*P-vM`^8~W_1h9zEg8iy!J;X_I3Rc)YuR?fL z*j|_du)M`0c;|NK31kb+G`q8V1xxu_A~xrmS|3`QgvL)RymQQue%28V2B}U{Fpff_f0`*VfnLAP(Ub*|tu^y_n7*&jXBw@1RUeOx zf)k5ZJLM+`ya;}Zpcw(>QWU9G&V6Dzq{~yM@^ffFZ$U-X4YJEH_sPMJiS=Vr_A#-2 zLh9)Mn%|O5pAa$cFf$c%T`L5#yw}c{=Jw?YWb@JrX8C%;n*WpiBFBJwK?q06njg{% Hy7>P9DQFG3 literal 0 HcmV?d00001 diff --git a/Backend/venv/lib/python3.12/site-packages/_pytest/_io/__pycache__/wcwidth.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/_pytest/_io/__pycache__/wcwidth.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..876576b02fcb535da27ab7ebb1ca40e21211d0f2 GIT binary patch literal 1675 zcmbVM&1)M+6rb5$X(g>Tl4F-RDQzY(HCC~`bsYB;3XYxNLuyD1Ef|Wk*%@0Kt#;L! zm7O&*H8ck$DMh#Bm_rXKIrIr33qWGw);P&Ai{6 zpG`A|U`)+Sx_@d2{Vo^#Bh{Pi&coypqKIM-El8<&xT-8D7%7M;RDFiKo>XHhO)+gr zqv?CvvtIZ@is}dY%sp)(9pO^8Ev@q<9A`aVUvzAz%-R%GF?QlKXJMWDPVcwLe^fyE z?IO@VLg9g}f%dmw#}qfPquf<0=Mds4s#Fw^N~B`cz*MV@AS6a;>X=Vj`il2_j1kq3 zSu%;Gm{_vMEV<k!siorDPqQp!yz2Ull!H}Lwf%@Vfmg5kg4mo9pE1fP2?Ii1QSX zwSgPznhDx9U$I)8nJ z=i%5uvVIV8)(?2q_S`j=6uqQzcxF(XN;uKwp|a`-d6mFH!p}%+1~gp<0?SeO#2ml| z0ved7Hm z$3Ed7fJwHnxCYQsF~+~5)4!qfuhU2|nv>tY-%*CJ*%TcFq9xu)v8y7bnCLq None: - """Handle pretty printing operations onto a stream using a set of - configured parameters. - - indent - Number of spaces to indent for each level of nesting. - - width - Attempted maximum number of columns in the output. - - depth - The maximum depth to print out nested structures. - - """ - if indent < 0: - raise ValueError("indent must be >= 0") - if depth is not None and depth <= 0: - raise ValueError("depth must be > 0") - if not width: - raise ValueError("width must be != 0") - self._depth = depth - self._indent_per_level = indent - self._width = width - - def pformat(self, object: Any) -> str: - sio = _StringIO() - self._format(object, sio, 0, 0, set(), 0) - return sio.getvalue() - - def _format( - self, - object: Any, - stream: IO[str], - indent: int, - allowance: int, - context: set[int], - level: int, - ) -> None: - objid = id(object) - if objid in context: - stream.write(_recursion(object)) - return - - p = self._dispatch.get(type(object).__repr__, None) - if p is not None: - context.add(objid) - p(self, object, stream, indent, allowance, context, level + 1) - context.remove(objid) - elif ( - _dataclasses.is_dataclass(object) - and not isinstance(object, type) - and object.__dataclass_params__.repr # type:ignore[attr-defined] - and - # Check dataclass has generated repr method. - hasattr(object.__repr__, "__wrapped__") - and "__create_fn__" in object.__repr__.__wrapped__.__qualname__ - ): - context.add(objid) - self._pprint_dataclass( - object, stream, indent, allowance, context, level + 1 - ) - context.remove(objid) - else: - stream.write(self._repr(object, context, level)) - - def _pprint_dataclass( - self, - object: Any, - stream: IO[str], - indent: int, - allowance: int, - context: set[int], - level: int, - ) -> None: - cls_name = object.__class__.__name__ - items = [ - (f.name, getattr(object, f.name)) - for f in _dataclasses.fields(object) - if f.repr - ] - stream.write(cls_name + "(") - self._format_namespace_items(items, stream, indent, allowance, context, level) - stream.write(")") - - _dispatch: dict[ - Callable[..., str], - Callable[[PrettyPrinter, Any, IO[str], int, int, set[int], int], None], - ] = {} - - def _pprint_dict( - self, - object: Any, - stream: IO[str], - indent: int, - allowance: int, - context: set[int], - level: int, - ) -> None: - write = stream.write - write("{") - items = sorted(object.items(), key=_safe_tuple) - self._format_dict_items(items, stream, indent, allowance, context, level) - write("}") - - _dispatch[dict.__repr__] = _pprint_dict - - def _pprint_ordered_dict( - self, - object: Any, - stream: IO[str], - indent: int, - allowance: int, - context: set[int], - level: int, - ) -> None: - if not len(object): - stream.write(repr(object)) - return - cls = object.__class__ - stream.write(cls.__name__ + "(") - self._pprint_dict(object, stream, indent, allowance, context, level) - stream.write(")") - - _dispatch[_collections.OrderedDict.__repr__] = _pprint_ordered_dict - - def _pprint_list( - self, - object: Any, - stream: IO[str], - indent: int, - allowance: int, - context: set[int], - level: int, - ) -> None: - stream.write("[") - self._format_items(object, stream, indent, allowance, context, level) - stream.write("]") - - _dispatch[list.__repr__] = _pprint_list - - def _pprint_tuple( - self, - object: Any, - stream: IO[str], - indent: int, - allowance: int, - context: set[int], - level: int, - ) -> None: - stream.write("(") - self._format_items(object, stream, indent, allowance, context, level) - stream.write(")") - - _dispatch[tuple.__repr__] = _pprint_tuple - - def _pprint_set( - self, - object: Any, - stream: IO[str], - indent: int, - allowance: int, - context: set[int], - level: int, - ) -> None: - if not len(object): - stream.write(repr(object)) - return - typ = object.__class__ - if typ is set: - stream.write("{") - endchar = "}" - else: - stream.write(typ.__name__ + "({") - endchar = "})" - object = sorted(object, key=_safe_key) - self._format_items(object, stream, indent, allowance, context, level) - stream.write(endchar) - - _dispatch[set.__repr__] = _pprint_set - _dispatch[frozenset.__repr__] = _pprint_set - - def _pprint_str( - self, - object: Any, - stream: IO[str], - indent: int, - allowance: int, - context: set[int], - level: int, - ) -> None: - write = stream.write - if not len(object): - write(repr(object)) - return - chunks = [] - lines = object.splitlines(True) - if level == 1: - indent += 1 - allowance += 1 - max_width1 = max_width = self._width - indent - for i, line in enumerate(lines): - rep = repr(line) - if i == len(lines) - 1: - max_width1 -= allowance - if len(rep) <= max_width1: - chunks.append(rep) - else: - # A list of alternating (non-space, space) strings - parts = re.findall(r"\S*\s*", line) - assert parts - assert not parts[-1] - parts.pop() # drop empty last part - max_width2 = max_width - current = "" - for j, part in enumerate(parts): - candidate = current + part - if j == len(parts) - 1 and i == len(lines) - 1: - max_width2 -= allowance - if len(repr(candidate)) > max_width2: - if current: - chunks.append(repr(current)) - current = part - else: - current = candidate - if current: - chunks.append(repr(current)) - if len(chunks) == 1: - write(rep) - return - if level == 1: - write("(") - for i, rep in enumerate(chunks): - if i > 0: - write("\n" + " " * indent) - write(rep) - if level == 1: - write(")") - - _dispatch[str.__repr__] = _pprint_str - - def _pprint_bytes( - self, - object: Any, - stream: IO[str], - indent: int, - allowance: int, - context: set[int], - level: int, - ) -> None: - write = stream.write - if len(object) <= 4: - write(repr(object)) - return - parens = level == 1 - if parens: - indent += 1 - allowance += 1 - write("(") - delim = "" - for rep in _wrap_bytes_repr(object, self._width - indent, allowance): - write(delim) - write(rep) - if not delim: - delim = "\n" + " " * indent - if parens: - write(")") - - _dispatch[bytes.__repr__] = _pprint_bytes - - def _pprint_bytearray( - self, - object: Any, - stream: IO[str], - indent: int, - allowance: int, - context: set[int], - level: int, - ) -> None: - write = stream.write - write("bytearray(") - self._pprint_bytes( - bytes(object), stream, indent + 10, allowance + 1, context, level + 1 - ) - write(")") - - _dispatch[bytearray.__repr__] = _pprint_bytearray - - def _pprint_mappingproxy( - self, - object: Any, - stream: IO[str], - indent: int, - allowance: int, - context: set[int], - level: int, - ) -> None: - stream.write("mappingproxy(") - self._format(object.copy(), stream, indent, allowance, context, level) - stream.write(")") - - _dispatch[_types.MappingProxyType.__repr__] = _pprint_mappingproxy - - def _pprint_simplenamespace( - self, - object: Any, - stream: IO[str], - indent: int, - allowance: int, - context: set[int], - level: int, - ) -> None: - if type(object) is _types.SimpleNamespace: - # The SimpleNamespace repr is "namespace" instead of the class - # name, so we do the same here. For subclasses; use the class name. - cls_name = "namespace" - else: - cls_name = object.__class__.__name__ - items = object.__dict__.items() - stream.write(cls_name + "(") - self._format_namespace_items(items, stream, indent, allowance, context, level) - stream.write(")") - - _dispatch[_types.SimpleNamespace.__repr__] = _pprint_simplenamespace - - def _format_dict_items( - self, - items: list[tuple[Any, Any]], - stream: IO[str], - indent: int, - allowance: int, - context: set[int], - level: int, - ) -> None: - if not items: - return - - write = stream.write - item_indent = indent + self._indent_per_level - delimnl = "\n" + " " * item_indent - for key, ent in items: - write(delimnl) - write(self._repr(key, context, level)) - write(": ") - self._format(ent, stream, item_indent, 1, context, level) - write(",") - - write("\n" + " " * indent) - - def _format_namespace_items( - self, - items: list[tuple[Any, Any]], - stream: IO[str], - indent: int, - allowance: int, - context: set[int], - level: int, - ) -> None: - if not items: - return - - write = stream.write - item_indent = indent + self._indent_per_level - delimnl = "\n" + " " * item_indent - for key, ent in items: - write(delimnl) - write(key) - write("=") - if id(ent) in context: - # Special-case representation of recursion to match standard - # recursive dataclass repr. - write("...") - else: - self._format( - ent, - stream, - item_indent + len(key) + 1, - 1, - context, - level, - ) - - write(",") - - write("\n" + " " * indent) - - def _format_items( - self, - items: list[Any], - stream: IO[str], - indent: int, - allowance: int, - context: set[int], - level: int, - ) -> None: - if not items: - return - - write = stream.write - item_indent = indent + self._indent_per_level - delimnl = "\n" + " " * item_indent - - for item in items: - write(delimnl) - self._format(item, stream, item_indent, 1, context, level) - write(",") - - write("\n" + " " * indent) - - def _repr(self, object: Any, context: set[int], level: int) -> str: - return self._safe_repr(object, context.copy(), self._depth, level) - - def _pprint_default_dict( - self, - object: Any, - stream: IO[str], - indent: int, - allowance: int, - context: set[int], - level: int, - ) -> None: - rdf = self._repr(object.default_factory, context, level) - stream.write(f"{object.__class__.__name__}({rdf}, ") - self._pprint_dict(object, stream, indent, allowance, context, level) - stream.write(")") - - _dispatch[_collections.defaultdict.__repr__] = _pprint_default_dict - - def _pprint_counter( - self, - object: Any, - stream: IO[str], - indent: int, - allowance: int, - context: set[int], - level: int, - ) -> None: - stream.write(object.__class__.__name__ + "(") - - if object: - stream.write("{") - items = object.most_common() - self._format_dict_items(items, stream, indent, allowance, context, level) - stream.write("}") - - stream.write(")") - - _dispatch[_collections.Counter.__repr__] = _pprint_counter - - def _pprint_chain_map( - self, - object: Any, - stream: IO[str], - indent: int, - allowance: int, - context: set[int], - level: int, - ) -> None: - if not len(object.maps) or (len(object.maps) == 1 and not len(object.maps[0])): - stream.write(repr(object)) - return - - stream.write(object.__class__.__name__ + "(") - self._format_items(object.maps, stream, indent, allowance, context, level) - stream.write(")") - - _dispatch[_collections.ChainMap.__repr__] = _pprint_chain_map - - def _pprint_deque( - self, - object: Any, - stream: IO[str], - indent: int, - allowance: int, - context: set[int], - level: int, - ) -> None: - stream.write(object.__class__.__name__ + "(") - if object.maxlen is not None: - stream.write(f"maxlen={object.maxlen}, ") - stream.write("[") - - self._format_items(object, stream, indent, allowance + 1, context, level) - stream.write("])") - - _dispatch[_collections.deque.__repr__] = _pprint_deque - - def _pprint_user_dict( - self, - object: Any, - stream: IO[str], - indent: int, - allowance: int, - context: set[int], - level: int, - ) -> None: - self._format(object.data, stream, indent, allowance, context, level - 1) - - _dispatch[_collections.UserDict.__repr__] = _pprint_user_dict - - def _pprint_user_list( - self, - object: Any, - stream: IO[str], - indent: int, - allowance: int, - context: set[int], - level: int, - ) -> None: - self._format(object.data, stream, indent, allowance, context, level - 1) - - _dispatch[_collections.UserList.__repr__] = _pprint_user_list - - def _pprint_user_string( - self, - object: Any, - stream: IO[str], - indent: int, - allowance: int, - context: set[int], - level: int, - ) -> None: - self._format(object.data, stream, indent, allowance, context, level - 1) - - _dispatch[_collections.UserString.__repr__] = _pprint_user_string - - def _safe_repr( - self, object: Any, context: set[int], maxlevels: int | None, level: int - ) -> str: - typ = type(object) - if typ in _builtin_scalars: - return repr(object) - - r = getattr(typ, "__repr__", None) - - if issubclass(typ, dict) and r is dict.__repr__: - if not object: - return "{}" - objid = id(object) - if maxlevels and level >= maxlevels: - return "{...}" - if objid in context: - return _recursion(object) - context.add(objid) - components: list[str] = [] - append = components.append - level += 1 - for k, v in sorted(object.items(), key=_safe_tuple): - krepr = self._safe_repr(k, context, maxlevels, level) - vrepr = self._safe_repr(v, context, maxlevels, level) - append(f"{krepr}: {vrepr}") - context.remove(objid) - return "{{{}}}".format(", ".join(components)) - - if (issubclass(typ, list) and r is list.__repr__) or ( - issubclass(typ, tuple) and r is tuple.__repr__ - ): - if issubclass(typ, list): - if not object: - return "[]" - format = "[%s]" - elif len(object) == 1: - format = "(%s,)" - else: - if not object: - return "()" - format = "(%s)" - objid = id(object) - if maxlevels and level >= maxlevels: - return format % "..." - if objid in context: - return _recursion(object) - context.add(objid) - components = [] - append = components.append - level += 1 - for o in object: - orepr = self._safe_repr(o, context, maxlevels, level) - append(orepr) - context.remove(objid) - return format % ", ".join(components) - - return repr(object) - - -_builtin_scalars = frozenset( - {str, bytes, bytearray, float, complex, bool, type(None), int} -) - - -def _recursion(object: Any) -> str: - return f"" - - -def _wrap_bytes_repr(object: Any, width: int, allowance: int) -> Iterator[str]: - current = b"" - last = len(object) // 4 * 4 - for i in range(0, len(object), 4): - part = object[i : i + 4] - candidate = current + part - if i == last: - width -= allowance - if len(repr(candidate)) > width: - if current: - yield repr(current) - current = part - else: - current = candidate - if current: - yield repr(current) diff --git a/Backend/venv/lib/python3.12/site-packages/_pytest/_io/saferepr.py b/Backend/venv/lib/python3.12/site-packages/_pytest/_io/saferepr.py index cee70e33..c7018722 100644 --- a/Backend/venv/lib/python3.12/site-packages/_pytest/_io/saferepr.py +++ b/Backend/venv/lib/python3.12/site-packages/_pytest/_io/saferepr.py @@ -1,7 +1,9 @@ -from __future__ import annotations - import pprint import reprlib +from typing import Any +from typing import Dict +from typing import IO +from typing import Optional def _try_repr_or_str(obj: object) -> str: @@ -18,10 +20,10 @@ def _format_repr_exception(exc: BaseException, obj: object) -> str: exc_info = _try_repr_or_str(exc) except (KeyboardInterrupt, SystemExit): raise - except BaseException as inner_exc: - exc_info = f"unpresentable exception ({_try_repr_or_str(inner_exc)})" - return ( - f"<[{exc_info} raised in repr()] {type(obj).__name__} object at 0x{id(obj):x}>" + except BaseException as exc: + exc_info = f"unpresentable exception ({_try_repr_or_str(exc)})" + return "<[{} raised in repr()] {} object at 0x{:x}>".format( + exc_info, type(obj).__name__, id(obj) ) @@ -39,7 +41,7 @@ class SafeRepr(reprlib.Repr): information on exceptions raised during the call. """ - def __init__(self, maxsize: int | None, use_ascii: bool = False) -> None: + def __init__(self, maxsize: Optional[int], use_ascii: bool = False) -> None: """ :param maxsize: If not None, will truncate the resulting repr to that specific size, using ellipsis @@ -60,6 +62,7 @@ class SafeRepr(reprlib.Repr): s = ascii(x) else: s = super().repr(x) + except (KeyboardInterrupt, SystemExit): raise except BaseException as exc: @@ -97,7 +100,7 @@ DEFAULT_REPR_MAX_SIZE = 240 def saferepr( - obj: object, maxsize: int | None = DEFAULT_REPR_MAX_SIZE, use_ascii: bool = False + obj: object, maxsize: Optional[int] = DEFAULT_REPR_MAX_SIZE, use_ascii: bool = False ) -> str: """Return a size-limited safe repr-string for the given object. @@ -108,6 +111,7 @@ def saferepr( This function is a wrapper around the Repr/reprlib functionality of the stdlib. """ + return SafeRepr(maxsize, use_ascii).repr(obj) @@ -128,3 +132,49 @@ def saferepr_unlimited(obj: object, use_ascii: bool = True) -> str: return repr(obj) except Exception as exc: return _format_repr_exception(exc, obj) + + +class AlwaysDispatchingPrettyPrinter(pprint.PrettyPrinter): + """PrettyPrinter that always dispatches (regardless of width).""" + + def _format( + self, + object: object, + stream: IO[str], + indent: int, + allowance: int, + context: Dict[int, Any], + level: int, + ) -> None: + # Type ignored because _dispatch is private. + p = self._dispatch.get(type(object).__repr__, None) # type: ignore[attr-defined] + + objid = id(object) + if objid in context or p is None: + # Type ignored because _format is private. + super()._format( # type: ignore[misc] + object, + stream, + indent, + allowance, + context, + level, + ) + return + + context[objid] = 1 + p(self, object, stream, indent, allowance, context, level + 1) + del context[objid] + + +def _pformat_dispatch( + object: object, + indent: int = 1, + width: int = 80, + depth: Optional[int] = None, + *, + compact: bool = False, +) -> str: + return AlwaysDispatchingPrettyPrinter( + indent=indent, width=width, depth=depth, compact=compact + ).pformat(object) diff --git a/Backend/venv/lib/python3.12/site-packages/_pytest/_io/terminalwriter.py b/Backend/venv/lib/python3.12/site-packages/_pytest/_io/terminalwriter.py index 9191b4ed..379035d8 100644 --- a/Backend/venv/lib/python3.12/site-packages/_pytest/_io/terminalwriter.py +++ b/Backend/venv/lib/python3.12/site-packages/_pytest/_io/terminalwriter.py @@ -1,23 +1,13 @@ """Helper functions for writing to terminals and files.""" - -from __future__ import annotations - -from collections.abc import Sequence import os import shutil import sys -from typing import final -from typing import Literal +from typing import Optional +from typing import Sequence from typing import TextIO -import pygments -from pygments.formatters.terminal import TerminalFormatter -from pygments.lexer import Lexer -from pygments.lexers.diff import DiffLexer -from pygments.lexers.python import PythonLexer - -from ..compat import assert_never from .wcwidth import wcswidth +from _pytest.compat import final # This code was initially copied from py 1.8.1, file _io/terminalwriter.py. @@ -38,9 +28,9 @@ def should_do_markup(file: TextIO) -> bool: return True if os.environ.get("PY_COLORS") == "0": return False - if os.environ.get("NO_COLOR"): + if "NO_COLOR" in os.environ: return False - if os.environ.get("FORCE_COLOR"): + if "FORCE_COLOR" in os.environ: return True return ( hasattr(file, "isatty") and file.isatty() and os.environ.get("TERM") != "dumb" @@ -72,7 +62,7 @@ class TerminalWriter: invert=7, ) - def __init__(self, file: TextIO | None = None) -> None: + def __init__(self, file: Optional[TextIO] = None) -> None: if file is None: file = sys.stdout if hasattr(file, "isatty") and file.isatty() and sys.platform == "win32": @@ -86,7 +76,7 @@ class TerminalWriter: self._file = file self.hasmarkup = should_do_markup(file) self._current_line = "" - self._terminal_width: int | None = None + self._terminal_width: Optional[int] = None self.code_highlight = True @property @@ -111,14 +101,14 @@ class TerminalWriter: if self.hasmarkup: esc = [self._esctable[name] for name, on in markup.items() if on] if esc: - text = "".join(f"\x1b[{cod}m" for cod in esc) + text + "\x1b[0m" + text = "".join("\x1b[%sm" % cod for cod in esc) + text + "\x1b[0m" return text def sep( self, sepchar: str, - title: str | None = None, - fullwidth: int | None = None, + title: Optional[str] = None, + fullwidth: Optional[int] = None, **markup: bool, ) -> None: if fullwidth is None: @@ -161,23 +151,20 @@ class TerminalWriter: msg = self.markup(msg, **markup) - self.write_raw(msg, flush=flush) + try: + self._file.write(msg) + except UnicodeEncodeError: + # Some environments don't support printing general Unicode + # strings, due to misconfiguration or otherwise; in that case, + # print the string escaped to ASCII. + # When the Unicode situation improves we should consider + # letting the error propagate instead of masking it (see #7475 + # for one brief attempt). + msg = msg.encode("unicode-escape").decode("ascii") + self._file.write(msg) - def write_raw(self, msg: str, *, flush: bool = False) -> None: - try: - self._file.write(msg) - except UnicodeEncodeError: - # Some environments don't support printing general Unicode - # strings, due to misconfiguration or otherwise; in that case, - # print the string escaped to ASCII. - # When the Unicode situation improves we should consider - # letting the error propagate instead of masking it (see #7475 - # for one brief attempt). - msg = msg.encode("unicode-escape").decode("ascii") - self._file.write(msg) - - if flush: - self.flush() + if flush: + self.flush() def line(self, s: str = "", **markup: bool) -> None: self.write(s, **markup) @@ -195,64 +182,52 @@ class TerminalWriter: """ if indents and len(indents) != len(lines): raise ValueError( - f"indents size ({len(indents)}) should have same size as lines ({len(lines)})" + "indents size ({}) should have same size as lines ({})".format( + len(indents), len(lines) + ) ) if not indents: indents = [""] * len(lines) source = "\n".join(lines) new_lines = self._highlight(source).splitlines() - # Would be better to strict=True but that fails some CI jobs. - for indent, new_line in zip(indents, new_lines, strict=False): + for indent, new_line in zip(indents, new_lines): self.line(indent + new_line) - def _get_pygments_lexer(self, lexer: Literal["python", "diff"]) -> Lexer: - if lexer == "python": - return PythonLexer() - elif lexer == "diff": - return DiffLexer() - else: - assert_never(lexer) - - def _get_pygments_formatter(self) -> TerminalFormatter: + def _highlight(self, source: str) -> str: + """Highlight the given source code if we have markup support.""" from _pytest.config.exceptions import UsageError - theme = os.getenv("PYTEST_THEME") - theme_mode = os.getenv("PYTEST_THEME_MODE", "dark") - - try: - return TerminalFormatter(bg=theme_mode, style=theme) - except pygments.util.ClassNotFound as e: - raise UsageError( - f"PYTEST_THEME environment variable has an invalid value: '{theme}'. " - "Hint: See available pygments styles with `pygmentize -L styles`." - ) from e - except pygments.util.OptionError as e: - raise UsageError( - f"PYTEST_THEME_MODE environment variable has an invalid value: '{theme_mode}'. " - "The allowed values are 'dark' (default) and 'light'." - ) from e - - def _highlight( - self, source: str, lexer: Literal["diff", "python"] = "python" - ) -> str: - """Highlight the given source if we have markup support.""" - if not source or not self.hasmarkup or not self.code_highlight: + if not self.hasmarkup or not self.code_highlight: return source - - pygments_lexer = self._get_pygments_lexer(lexer) - pygments_formatter = self._get_pygments_formatter() - - highlighted: str = pygments.highlight( - source, pygments_lexer, pygments_formatter - ) - # pygments terminal formatter may add a newline when there wasn't one. - # We don't want this, remove. - if highlighted[-1] == "\n" and source[-1] != "\n": - highlighted = highlighted[:-1] - - # Some lexers will not set the initial color explicitly - # which may lead to the previous color being propagated to the - # start of the expression, so reset first. - highlighted = "\x1b[0m" + highlighted - - return highlighted + try: + from pygments.formatters.terminal import TerminalFormatter + from pygments.lexers.python import PythonLexer + from pygments import highlight + import pygments.util + except ImportError: + return source + else: + try: + highlighted: str = highlight( + source, + PythonLexer(), + TerminalFormatter( + bg=os.getenv("PYTEST_THEME_MODE", "dark"), + style=os.getenv("PYTEST_THEME"), + ), + ) + return highlighted + except pygments.util.ClassNotFound: + raise UsageError( + "PYTEST_THEME environment variable had an invalid value: '{}'. " + "Only valid pygment styles are allowed.".format( + os.getenv("PYTEST_THEME") + ) + ) + except pygments.util.OptionError: + raise UsageError( + "PYTEST_THEME_MODE environment variable had an invalid value: '{}'. " + "The only allowed values are 'dark' and 'light'.".format( + os.getenv("PYTEST_THEME_MODE") + ) + ) diff --git a/Backend/venv/lib/python3.12/site-packages/_pytest/_io/wcwidth.py b/Backend/venv/lib/python3.12/site-packages/_pytest/_io/wcwidth.py index 23886ff1..e5c7bf4d 100644 --- a/Backend/venv/lib/python3.12/site-packages/_pytest/_io/wcwidth.py +++ b/Backend/venv/lib/python3.12/site-packages/_pytest/_io/wcwidth.py @@ -1,7 +1,5 @@ -from __future__ import annotations - -from functools import lru_cache import unicodedata +from functools import lru_cache @lru_cache(100) diff --git a/Backend/venv/lib/python3.12/site-packages/_pytest/_py/__pycache__/__init__.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/_pytest/_py/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..fb60b7397026b2e1a28c5d5abae171a031a3e206 GIT binary patch literal 194 zcmX@j%ge<81g6f$nIQTxh(HIQS%4zb87dhx8U0o=6fpsLpFwJVCF*D7=cekX=T+#t zq!wqFx8=sM-+XJ_W6>pLYTXQ$?+=$EDDmFeeXCg~ScmSp7T8S5Du=@(~~ zr0Ny`6(pvo7VF0YWm1bvK(u~*d}dx|NqoFsLFF$Fo80`A(wtPgB37V{j6hrrVtiy~ KWMnL22C@K%DKg;z literal 0 HcmV?d00001 diff --git a/Backend/venv/lib/python3.12/site-packages/_pytest/_py/__pycache__/error.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/_pytest/_py/__pycache__/error.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e0109df9ae73ceafe4960b98a77b76c0f8af7c15 GIT binary patch literal 4798 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 SxU&@QoRJ@SIqnEM&;J46)&ULx literal 0 HcmV?d00001 diff --git a/Backend/venv/lib/python3.12/site-packages/_pytest/_py/__pycache__/path.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/_pytest/_py/__pycache__/path.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..5acd0c3464c5377c4707a9bb8af11718245fc881 GIT binary patch literal 68782 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 literal 0 HcmV?d00001 diff --git a/Backend/venv/lib/python3.12/site-packages/_pytest/_py/error.py b/Backend/venv/lib/python3.12/site-packages/_pytest/_py/error.py index dace2376..0b8f2d53 100644 --- a/Backend/venv/lib/python3.12/site-packages/_pytest/_py/error.py +++ b/Backend/venv/lib/python3.12/site-packages/_pytest/_py/error.py @@ -1,15 +1,13 @@ """create errno-specific classes for IO or os calls.""" - from __future__ import annotations -from collections.abc import Callable import errno import os import sys +from typing import Callable from typing import TYPE_CHECKING from typing import TypeVar - if TYPE_CHECKING: from typing_extensions import ParamSpec @@ -41,7 +39,7 @@ _winerrnomap = { 3: errno.ENOENT, 17: errno.EEXIST, 18: errno.EXDEV, - 13: errno.EBUSY, # empty cd drive, but ENOMEDIUM seems unavailable + 13: errno.EBUSY, # empty cd drive, but ENOMEDIUM seems unavailiable 22: errno.ENOTDIR, 20: errno.ENOTDIR, 267: errno.ENOTDIR, @@ -69,7 +67,7 @@ class ErrorMaker: try: return self._errno2class[eno] except KeyError: - clsname = errno.errorcode.get(eno, f"UnknownErrno{eno}") + clsname = errno.errorcode.get(eno, "UnknownErrno%d" % (eno,)) errorcls = type( clsname, (Error,), @@ -90,23 +88,15 @@ class ErrorMaker: except OSError as value: if not hasattr(value, "errno"): raise + errno = value.errno if sys.platform == "win32": try: - # error: Invalid index type "Optional[int]" for "dict[int, int]"; expected type "int" [index] - # OK to ignore because we catch the KeyError below. - cls = self._geterrnoclass(_winerrnomap[value.errno]) # type:ignore[index] + cls = self._geterrnoclass(_winerrnomap[errno]) except KeyError: raise value else: # we are not on Windows, or we got a proper OSError - if value.errno is None: - cls = type( - "UnknownErrnoNone", - (Error,), - {"__module__": "py.error", "__doc__": None}, - ) - else: - cls = self._geterrnoclass(value.errno) + cls = self._geterrnoclass(errno) raise cls(f"{func.__name__}{args!r}") diff --git a/Backend/venv/lib/python3.12/site-packages/_pytest/_py/path.py b/Backend/venv/lib/python3.12/site-packages/_pytest/_py/path.py index b7131b08..73a070d1 100644 --- a/Backend/venv/lib/python3.12/site-packages/_pytest/_py/path.py +++ b/Backend/venv/lib/python3.12/site-packages/_pytest/_py/path.py @@ -1,15 +1,16 @@ -# mypy: allow-untyped-defs """local path implementation.""" - from __future__ import annotations import atexit -from collections.abc import Callable -from contextlib import contextmanager import fnmatch import importlib.util import io import os +import posixpath +import sys +import uuid +import warnings +from contextlib import contextmanager from os.path import abspath from os.path import dirname from os.path import exists @@ -18,21 +19,19 @@ from os.path import isdir from os.path import isfile from os.path import islink from os.path import normpath -import posixpath from stat import S_ISDIR from stat import S_ISLNK from stat import S_ISREG -import sys from typing import Any +from typing import Callable from typing import cast -from typing import Literal from typing import overload from typing import TYPE_CHECKING -import uuid -import warnings from . import error +if TYPE_CHECKING: + from typing import Literal # Moved from local.py. iswin32 = sys.platform == "win32" or (getattr(os, "_name", False) == "nt") @@ -161,13 +160,15 @@ class Visitor: ) if not self.breadthfirst: for subdir in dirs: - yield from self.gen(subdir) + for p in self.gen(subdir): + yield p for p in self.optsort(entries): if self.fil is None or self.fil(p): yield p if self.breadthfirst: for subdir in dirs: - yield from self.gen(subdir) + for p in self.gen(subdir): + yield p class FNMatcher: @@ -204,10 +205,12 @@ class Stat: if TYPE_CHECKING: @property - def size(self) -> int: ... + def size(self) -> int: + ... @property - def mtime(self) -> float: ... + def mtime(self) -> float: + ... def __getattr__(self, name: str) -> Any: return getattr(self._osstatresult, "st_" + name) @@ -222,7 +225,7 @@ class Stat: raise NotImplementedError("XXX win32") import pwd - entry = error.checked_call(pwd.getpwuid, self.uid) # type:ignore[attr-defined,unused-ignore] + entry = error.checked_call(pwd.getpwuid, self.uid) # type:ignore[attr-defined] return entry[0] @property @@ -232,7 +235,7 @@ class Stat: raise NotImplementedError("XXX win32") import grp - entry = error.checked_call(grp.getgrgid, self.gid) # type:ignore[attr-defined,unused-ignore] + entry = error.checked_call(grp.getgrgid, self.gid) # type:ignore[attr-defined] return entry[0] def isdir(self): @@ -250,7 +253,7 @@ def getuserid(user): import pwd if not isinstance(user, int): - user = pwd.getpwnam(user)[2] # type:ignore[attr-defined,unused-ignore] + user = pwd.getpwnam(user)[2] # type:ignore[attr-defined] return user @@ -258,7 +261,7 @@ def getgroupid(group): import grp if not isinstance(group, int): - group = grp.getgrnam(group)[2] # type:ignore[attr-defined,unused-ignore] + group = grp.getgrnam(group)[2] # type:ignore[attr-defined] return group @@ -315,7 +318,7 @@ class LocalPath: def readlink(self) -> str: """Return value of a symbolic link.""" # https://github.com/python/mypy/issues/12278 - return error.checked_call(os.readlink, self.strpath) # type: ignore[arg-type,return-value,unused-ignore] + return error.checked_call(os.readlink, self.strpath) # type: ignore[arg-type,return-value] def mklinkto(self, oldname): """Posix style hard link to another name.""" @@ -432,7 +435,7 @@ class LocalPath: """Return a string which is the relative part of the path to the given 'relpath'. """ - if not isinstance(relpath, str | LocalPath): + if not isinstance(relpath, (str, LocalPath)): raise TypeError(f"{relpath!r}: not a string or path object") strrelpath = str(relpath) if strrelpath and strrelpath[-1] != self.sep: @@ -449,7 +452,7 @@ class LocalPath: def ensure_dir(self, *args): """Ensure the path joined with args is a directory.""" - return self.ensure(*args, dir=True) + return self.ensure(*args, **{"dir": True}) def bestrelpath(self, dest): """Return a string which is a relative path from self @@ -652,12 +655,12 @@ class LocalPath: if not kw: obj.strpath = self.strpath return obj - drive, dirname, _basename, purebasename, ext = self._getbyspec( + drive, dirname, basename, purebasename, ext = self._getbyspec( "drive,dirname,basename,purebasename,ext" ) if "basename" in kw: if "purebasename" in kw or "ext" in kw: - raise ValueError(f"invalid specification {kw!r}") + raise ValueError("invalid specification %r" % kw) else: pb = kw.setdefault("purebasename", purebasename) try: @@ -674,7 +677,7 @@ class LocalPath: else: kw.setdefault("dirname", dirname) kw.setdefault("sep", self.sep) - obj.strpath = normpath("{dirname}{sep}{basename}".format(**kw)) + obj.strpath = normpath("%(dirname)s%(sep)s%(basename)s" % kw) return obj def _getbyspec(self, spec: str) -> list[str]: @@ -703,7 +706,7 @@ class LocalPath: elif name == "ext": res.append(ext) else: - raise ValueError(f"invalid part specification {name!r}") + raise ValueError("invalid part specification %r" % name) return res def dirpath(self, *args, **kwargs): @@ -754,12 +757,7 @@ class LocalPath: if ensure: self.dirpath().ensure(dir=1) if encoding: - return error.checked_call( - io.open, - self.strpath, - mode, - encoding=encoding, - ) + return error.checked_call(io.open, self.strpath, mode, encoding=encoding) return error.checked_call(open, self.strpath, mode) def _fastjoin(self, name): @@ -777,11 +775,11 @@ class LocalPath: valid checkers:: - file = 1 # is a file - file = 0 # is not a file (may not even exist) - dir = 1 # is a dir - link = 1 # is a link - exists = 1 # exists + file=1 # is a file + file=0 # is not a file (may not even exist) + dir=1 # is a dir + link=1 # is a link + exists=1 # exists You can specify multiple checker definitions, for example:: @@ -834,7 +832,7 @@ class LocalPath: def copy(self, target, mode=False, stat=False): """Copy path to target. - If mode is True, will copy permission from path to target. + If mode is True, will copy copy permission from path to target. If stat is True, copy permission, last modification time, last access time, and flags from path to target. """ @@ -959,10 +957,12 @@ class LocalPath: return p @overload - def stat(self, raising: Literal[True] = ...) -> Stat: ... + def stat(self, raising: Literal[True] = ...) -> Stat: + ... @overload - def stat(self, raising: Literal[False]) -> Stat | None: ... + def stat(self, raising: Literal[False]) -> Stat | None: + ... def stat(self, raising: bool = True) -> Stat | None: """Return an os.stat() tuple.""" @@ -1024,7 +1024,7 @@ class LocalPath: return self.stat().atime def __repr__(self): - return f"local({self.strpath!r})" + return "local(%r)" % self.strpath def __str__(self): """Return string representation of the Path.""" @@ -1045,7 +1045,7 @@ class LocalPath: def pypkgpath(self): """Return the Python package path by looking for the last directory upwards which still contains an __init__.py. - Return None if a pkgpath cannot be determined. + Return None if a pkgpath can not be determined. """ pkgpath = None for parent in self.parts(reverse=True): @@ -1096,7 +1096,9 @@ class LocalPath: modname = self.purebasename spec = importlib.util.spec_from_file_location(modname, str(self)) if spec is None or spec.loader is None: - raise ImportError(f"Can't find module {modname} at location {self!s}") + raise ImportError( + f"Can't find module {modname} at location {str(self)}" + ) mod = importlib.util.module_from_spec(spec) spec.loader.exec_module(mod) return mod @@ -1161,8 +1163,7 @@ class LocalPath: where the 'self' path points to executable. The process is directly invoked and not through a system shell. """ - from subprocess import PIPE - from subprocess import Popen + from subprocess import Popen, PIPE popen_opts.pop("stdout", None) popen_opts.pop("stderr", None) @@ -1262,14 +1263,13 @@ class LocalPath: @classmethod def mkdtemp(cls, rootdir=None): """Return a Path object pointing to a fresh new temporary directory - (which we created ourselves). + (which we created ourself). """ import tempfile if rootdir is None: rootdir = cls.get_temproot() - path = error.checked_call(tempfile.mkdtemp, dir=str(rootdir)) - return cls(path) + return cls(error.checked_call(tempfile.mkdtemp, dir=str(rootdir))) @classmethod def make_numbered_dir( diff --git a/Backend/venv/lib/python3.12/site-packages/_pytest/_version.py b/Backend/venv/lib/python3.12/site-packages/_pytest/_version.py index 25a26b42..d530ef48 100644 --- a/Backend/venv/lib/python3.12/site-packages/_pytest/_version.py +++ b/Backend/venv/lib/python3.12/site-packages/_pytest/_version.py @@ -1,34 +1,16 @@ -# file generated by setuptools-scm +# file generated by setuptools_scm # don't change, don't track in version control - -__all__ = [ - "__version__", - "__version_tuple__", - "version", - "version_tuple", - "__commit_id__", - "commit_id", -] - TYPE_CHECKING = False if TYPE_CHECKING: - from typing import Tuple - from typing import Union - + from typing import Tuple, Union VERSION_TUPLE = Tuple[Union[int, str], ...] - COMMIT_ID = Union[str, None] else: VERSION_TUPLE = object - COMMIT_ID = object version: str __version__: str __version_tuple__: VERSION_TUPLE version_tuple: VERSION_TUPLE -commit_id: COMMIT_ID -__commit_id__: COMMIT_ID -__version__ = version = '9.0.1' -__version_tuple__ = version_tuple = (9, 0, 1) - -__commit_id__ = commit_id = None +__version__ = version = '7.4.3' +__version_tuple__ = version_tuple = (7, 4, 3) diff --git a/Backend/venv/lib/python3.12/site-packages/_pytest/assertion/__init__.py b/Backend/venv/lib/python3.12/site-packages/_pytest/assertion/__init__.py index 22f3ca8e..a46e5813 100644 --- a/Backend/venv/lib/python3.12/site-packages/_pytest/assertion/__init__.py +++ b/Backend/venv/lib/python3.12/site-packages/_pytest/assertion/__init__.py @@ -1,12 +1,9 @@ -# mypy: allow-untyped-defs """Support for presenting detailed information in failing assertions.""" - -from __future__ import annotations - -from collections.abc import Generator import sys from typing import Any -from typing import Protocol +from typing import Generator +from typing import List +from typing import Optional from typing import TYPE_CHECKING from _pytest.assertion import rewrite @@ -18,7 +15,6 @@ from _pytest.config import hookimpl from _pytest.config.argparsing import Parser from _pytest.nodes import Item - if TYPE_CHECKING: from _pytest.main import Session @@ -47,26 +43,6 @@ def pytest_addoption(parser: Parser) -> None: "Make sure to delete any previously generated pyc cache files.", ) - parser.addini( - "truncation_limit_lines", - default=None, - help="Set threshold of LINES after which truncation will take effect", - ) - parser.addini( - "truncation_limit_chars", - default=None, - help=("Set threshold of CHARS after which truncation will take effect"), - ) - - Config._add_verbosity_ini( - parser, - Config.VERBOSITY_ASSERTIONS, - help=( - "Specify a verbosity level for assertions, overriding the main level. " - "Higher levels will provide more detailed explanation when an assertion fails." - ), - ) - def register_assert_rewrite(*names: str) -> None: """Register one or more module names to be rewritten on import. @@ -83,18 +59,15 @@ def register_assert_rewrite(*names: str) -> None: if not isinstance(name, str): msg = "expected module names as *args, got {0} instead" # type: ignore[unreachable] raise TypeError(msg.format(repr(names))) - rewrite_hook: RewriteHook for hook in sys.meta_path: if isinstance(hook, rewrite.AssertionRewritingHook): - rewrite_hook = hook + importhook = hook break else: - rewrite_hook = DummyRewriteHook() - rewrite_hook.mark_rewrite(*names) - - -class RewriteHook(Protocol): - def mark_rewrite(self, *names: str) -> None: ... + # TODO(typing): Add a protocol for mark_rewrite() and use it + # for importhook and for PytestPluginManager.rewrite_hook. + importhook = DummyRewriteHook() # type: ignore + importhook.mark_rewrite(*names) class DummyRewriteHook: @@ -110,7 +83,7 @@ class AssertionState: def __init__(self, config: Config, mode) -> None: self.mode = mode self.trace = config.trace.root.get("assertion") - self.hook: rewrite.AssertionRewritingHook | None = None + self.hook: Optional[rewrite.AssertionRewritingHook] = None def install_importhook(config: Config) -> rewrite.AssertionRewritingHook: @@ -129,7 +102,7 @@ def install_importhook(config: Config) -> rewrite.AssertionRewritingHook: return hook -def pytest_collection(session: Session) -> None: +def pytest_collection(session: "Session") -> None: # This hook is only called when test modules are collected # so for example not in the managing process of pytest-xdist # (which does not collect test modules). @@ -139,17 +112,18 @@ def pytest_collection(session: Session) -> None: assertstate.hook.set_session(session) -@hookimpl(wrapper=True, tryfirst=True) -def pytest_runtest_protocol(item: Item) -> Generator[None, object, object]: +@hookimpl(tryfirst=True, hookwrapper=True) +def pytest_runtest_protocol(item: Item) -> Generator[None, None, None]: """Setup the pytest_assertrepr_compare and pytest_assertion_pass hooks. The rewrite module will use util._reprcompare if it exists to use custom reporting via the pytest_assertrepr_compare hook. This sets up this custom comparison for the test. """ + ihook = item.ihook - def callbinrepr(op, left: object, right: object) -> str | None: + def callbinrepr(op, left: object, right: object) -> Optional[str]: """Call the pytest_assertrepr_compare hook and prepare the result. This uses the first result from the hook and then ensures the @@ -188,14 +162,13 @@ def pytest_runtest_protocol(item: Item) -> Generator[None, object, object]: util._assertion_pass = call_assertion_pass_hook - try: - return (yield) - finally: - util._reprcompare, util._assertion_pass = saved_assert_hooks - util._config = None + yield + + util._reprcompare, util._assertion_pass = saved_assert_hooks + util._config = None -def pytest_sessionfinish(session: Session) -> None: +def pytest_sessionfinish(session: "Session") -> None: assertstate = session.config.stash.get(assertstate_key, None) if assertstate: if assertstate.hook is not None: @@ -204,5 +177,5 @@ def pytest_sessionfinish(session: Session) -> None: def pytest_assertrepr_compare( config: Config, op: str, left: Any, right: Any -) -> list[str] | None: +) -> Optional[List[str]]: return util.assertrepr_compare(config=config, op=op, left=left, right=right) diff --git a/Backend/venv/lib/python3.12/site-packages/_pytest/assertion/__pycache__/__init__.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/_pytest/assertion/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..1d5f6f8ac4c8e4e879c3077ddeb69ac83e4c62ac GIT binary patch literal 9189 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 literal 0 HcmV?d00001 diff --git a/Backend/venv/lib/python3.12/site-packages/_pytest/assertion/__pycache__/rewrite.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/_pytest/assertion/__pycache__/rewrite.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..029c4590fefc39b822e5da92a55fb626ecf92693 GIT binary patch literal 62503 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 literal 0 HcmV?d00001 diff --git a/Backend/venv/lib/python3.12/site-packages/_pytest/assertion/__pycache__/truncate.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/_pytest/assertion/__pycache__/truncate.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..35cc8108e2df142eb895a31d50f0596f20db05e8 GIT binary patch literal 3663 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 literal 0 HcmV?d00001 diff --git a/Backend/venv/lib/python3.12/site-packages/_pytest/assertion/__pycache__/util.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/_pytest/assertion/__pycache__/util.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b9308856cb084e7bb205e4af106a3e3a85838fed GIT binary patch literal 21235 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 (3, 12): - from importlib.resources.abc import TraversableResources -else: - from importlib.abc import TraversableResources -if sys.version_info < (3, 11): - from importlib.readers import FileReader -else: - from importlib.resources.readers import FileReader - +from typing import Union from _pytest._io.saferepr import DEFAULT_REPR_MAX_SIZE from _pytest._io.saferepr import saferepr -from _pytest._io.saferepr import saferepr_unlimited from _pytest._version import version from _pytest.assertion import util +from _pytest.assertion.util import ( # noqa: F401 + format_explanation as _format_explanation, +) from _pytest.config import Config -from _pytest.fixtures import FixtureFunctionDefinition from _pytest.main import Session from _pytest.pathlib import absolutepath from _pytest.pathlib import fnmatch_ex from _pytest.stash import StashKey - -# fmt: off -from _pytest.assertion.util import format_explanation as _format_explanation # noqa:F401, isort:skip -# fmt:on - if TYPE_CHECKING: from _pytest.assertion import AssertionState +if sys.version_info >= (3, 8): + namedExpr = ast.NamedExpr + astNameConstant = ast.Constant + astStr = ast.Constant + astNum = ast.Constant +else: + namedExpr = ast.Expr + astNameConstant = ast.NameConstant + astStr = ast.Str + astNum = ast.Num + class Sentinel: pass @@ -66,7 +65,7 @@ assertstate_key = StashKey["AssertionState"]() # pytest caches rewritten pycs in pycache dirs PYTEST_TAG = f"{sys.implementation.cache_tag}-pytest-{version}" -PYC_EXT = ".py" + ((__debug__ and "c") or "o") +PYC_EXT = ".py" + (__debug__ and "c" or "o") PYC_TAIL = "." + PYTEST_TAG + PYC_EXT # Special marker that denotes we have just left a scope definition @@ -82,17 +81,17 @@ class AssertionRewritingHook(importlib.abc.MetaPathFinder, importlib.abc.Loader) self.fnpats = config.getini("python_files") except ValueError: self.fnpats = ["test_*.py", "*_test.py"] - self.session: Session | None = None - self._rewritten_names: dict[str, Path] = {} - self._must_rewrite: set[str] = set() + self.session: Optional[Session] = None + self._rewritten_names: Dict[str, Path] = {} + self._must_rewrite: Set[str] = set() # flag to guard against trying to rewrite a pyc file while we are already writing another pyc file, # which might result in infinite recursion (#3506) self._writing_pyc = False self._basenames_to_check_rewrite = {"conftest"} - self._marked_for_rewrite_cache: dict[str, bool] = {} + self._marked_for_rewrite_cache: Dict[str, bool] = {} self._session_paths_checked = False - def set_session(self, session: Session | None) -> None: + def set_session(self, session: Optional[Session]) -> None: self.session = session self._session_paths_checked = False @@ -102,28 +101,18 @@ class AssertionRewritingHook(importlib.abc.MetaPathFinder, importlib.abc.Loader) def find_spec( self, name: str, - path: Sequence[str | bytes] | None = None, - target: types.ModuleType | None = None, - ) -> importlib.machinery.ModuleSpec | None: + path: Optional[Sequence[Union[str, bytes]]] = None, + target: Optional[types.ModuleType] = None, + ) -> Optional[importlib.machinery.ModuleSpec]: if self._writing_pyc: return None state = self.config.stash[assertstate_key] if self._early_rewrite_bailout(name, state): return None - state.trace(f"find_module called for: {name}") + state.trace("find_module called for: %s" % name) # Type ignored because mypy is confused about the `self` binding here. spec = self._find_spec(name, path) # type: ignore - - if spec is None and path is not None: - # With --import-mode=importlib, PathFinder cannot find spec without modifying `sys.path`, - # causing inability to assert rewriting (#12659). - # At this point, try using the file path to find the module spec. - for _path_str in path: - spec = importlib.util.spec_from_file_location(name, _path_str) - if spec is not None: - break - if ( # the import machinery could not find a file to import spec is None @@ -151,7 +140,7 @@ class AssertionRewritingHook(importlib.abc.MetaPathFinder, importlib.abc.Loader) def create_module( self, spec: importlib.machinery.ModuleSpec - ) -> types.ModuleType | None: + ) -> Optional[types.ModuleType]: return None # default behaviour is fine def exec_module(self, module: types.ModuleType) -> None: @@ -196,7 +185,7 @@ class AssertionRewritingHook(importlib.abc.MetaPathFinder, importlib.abc.Loader) state.trace(f"found cached rewritten pyc for {fn}") exec(co, module.__dict__) - def _early_rewrite_bailout(self, name: str, state: AssertionState) -> bool: + def _early_rewrite_bailout(self, name: str, state: "AssertionState") -> bool: """A fast way to get out of rewriting modules. Profiling has shown that the call to PathFinder.find_spec (inside of @@ -235,7 +224,7 @@ class AssertionRewritingHook(importlib.abc.MetaPathFinder, importlib.abc.Loader) state.trace(f"early skip of rewriting module: {name}") return True - def _should_rewrite(self, name: str, fn: str, state: AssertionState) -> bool: + def _should_rewrite(self, name: str, fn: str, state: "AssertionState") -> bool: # always rewrite conftest files if os.path.basename(fn) == "conftest.py": state.trace(f"rewriting conftest file: {fn!r}") @@ -256,7 +245,7 @@ class AssertionRewritingHook(importlib.abc.MetaPathFinder, importlib.abc.Loader) return self._is_marked_for_rewrite(name, state) - def _is_marked_for_rewrite(self, name: str, state: AssertionState) -> bool: + def _is_marked_for_rewrite(self, name: str, state: "AssertionState") -> bool: try: return self._marked_for_rewrite_cache[name] except KeyError: @@ -292,18 +281,31 @@ class AssertionRewritingHook(importlib.abc.MetaPathFinder, importlib.abc.Loader) self.config.issue_config_time_warning( PytestAssertRewriteWarning( - f"Module already imported so cannot be rewritten; {name}" + "Module already imported so cannot be rewritten: %s" % name ), stacklevel=5, ) - def get_data(self, pathname: str | bytes) -> bytes: + def get_data(self, pathname: Union[str, bytes]) -> bytes: """Optional PEP302 get_data API.""" with open(pathname, "rb") as f: return f.read() - def get_resource_reader(self, name: str) -> TraversableResources: - return FileReader(types.SimpleNamespace(path=self._rewritten_names[name])) # type: ignore[arg-type] + if sys.version_info >= (3, 10): + if sys.version_info >= (3, 12): + from importlib.resources.abc import TraversableResources + else: + from importlib.abc import TraversableResources + + def get_resource_reader(self, name: str) -> TraversableResources: # type: ignore + if sys.version_info < (3, 11): + from importlib.readers import FileReader + else: + from importlib.resources.readers import FileReader + + return FileReader( # type:ignore[no-any-return] + types.SimpleNamespace(path=self._rewritten_names[name]) + ) def _write_pyc_fp( @@ -325,7 +327,7 @@ def _write_pyc_fp( def _write_pyc( - state: AssertionState, + state: "AssertionState", co: types.CodeType, source_stat: os.stat_result, pyc: Path, @@ -349,7 +351,7 @@ def _write_pyc( return True -def _rewrite_test(fn: Path, config: Config) -> tuple[os.stat_result, types.CodeType]: +def _rewrite_test(fn: Path, config: Config) -> Tuple[os.stat_result, types.CodeType]: """Read and rewrite *fn* and return the code object.""" stat = os.stat(fn) source = fn.read_bytes() @@ -362,7 +364,7 @@ def _rewrite_test(fn: Path, config: Config) -> tuple[os.stat_result, types.CodeT def _read_pyc( source: Path, pyc: Path, trace: Callable[[str], None] = lambda x: None -) -> types.CodeType | None: +) -> Optional[types.CodeType]: """Possibly read a pytest pyc containing rewritten code. Return rewritten code if successful or None if not. @@ -382,21 +384,21 @@ def _read_pyc( return None # Check for invalid or out of date pyc file. if len(data) != (16): - trace(f"_read_pyc({source}): invalid pyc (too short)") + trace("_read_pyc(%s): invalid pyc (too short)" % source) return None if data[:4] != importlib.util.MAGIC_NUMBER: - trace(f"_read_pyc({source}): invalid pyc (bad magic number)") + trace("_read_pyc(%s): invalid pyc (bad magic number)" % source) return None if data[4:8] != b"\x00\x00\x00\x00": - trace(f"_read_pyc({source}): invalid pyc (unsupported flags)") + trace("_read_pyc(%s): invalid pyc (unsupported flags)" % source) return None mtime_data = data[8:12] if int.from_bytes(mtime_data, "little") != mtime & 0xFFFFFFFF: - trace(f"_read_pyc({source}): out of date") + trace("_read_pyc(%s): out of date" % source) return None size_data = data[12:16] if int.from_bytes(size_data, "little") != size & 0xFFFFFFFF: - trace(f"_read_pyc({source}): invalid pyc (incorrect size)") + trace("_read_pyc(%s): invalid pyc (incorrect size)" % source) return None try: co = marshal.load(fp) @@ -404,7 +406,7 @@ def _read_pyc( trace(f"_read_pyc({source}): marshal.load error {e}") return None if not isinstance(co, types.CodeType): - trace(f"_read_pyc({source}): not a code object") + trace("_read_pyc(%s): not a code object" % source) return None return co @@ -412,8 +414,8 @@ def _read_pyc( def rewrite_asserts( mod: ast.Module, source: bytes, - module_path: str | None = None, - config: Config | None = None, + module_path: Optional[str] = None, + config: Optional[Config] = None, ) -> None: """Rewrite the assert statements in mod.""" AssertionRewriter(module_path, config, source).run(mod) @@ -429,22 +431,13 @@ def _saferepr(obj: object) -> str: sequences, especially '\n{' and '\n}' are likely to be present in JSON reprs. """ - if isinstance(obj, types.MethodType): - # for bound methods, skip redundant information - return obj.__name__ - maxsize = _get_maxsize_for_saferepr(util._config) - if not maxsize: - return saferepr_unlimited(obj).replace("\n", "\\n") return saferepr(obj, maxsize=maxsize).replace("\n", "\\n") -def _get_maxsize_for_saferepr(config: Config | None) -> int | None: +def _get_maxsize_for_saferepr(config: Optional[Config]) -> Optional[int]: """Get `maxsize` configuration for saferepr based on the given config object.""" - if config is None: - verbosity = 0 - else: - verbosity = config.get_verbosity(Config.VERBOSITY_ASSERTIONS) + verbosity = config.getoption("verbose") if config is not None else 0 if verbosity >= 2: return None if verbosity >= 1: @@ -465,7 +458,7 @@ def _format_assertmsg(obj: object) -> str: # However in either case we want to preserve the newline. replaces = [("\n", "\n~"), ("%", "%%")] if not isinstance(obj, str): - obj = saferepr(obj, _get_maxsize_for_saferepr(util._config)) + obj = saferepr(obj) replaces.append(("\\n", "\n~")) for r1, r2 in replaces: @@ -476,8 +469,7 @@ def _format_assertmsg(obj: object) -> str: def _should_repr_global_name(obj: object) -> bool: if callable(obj): - # For pytest fixtures the __repr__ method provides more information than the function name. - return isinstance(obj, FixtureFunctionDefinition) + return False try: return not hasattr(obj, "__name__") @@ -486,7 +478,7 @@ def _should_repr_global_name(obj: object) -> bool: def _format_boolop(explanations: Iterable[str], is_or: bool) -> str: - explanation = "(" + ((is_or and " or ") or " and ").join(explanations) + ")" + explanation = "(" + (is_or and " or " or " and ").join(explanations) + ")" return explanation.replace("%", "%%") @@ -496,7 +488,7 @@ def _call_reprcompare( expls: Sequence[str], each_obj: Sequence[object], ) -> str: - for i, res, expl in zip(range(len(ops)), results, expls, strict=True): + for i, res, expl in zip(range(len(ops)), results, expls): try: done = not res except Exception: @@ -558,14 +550,14 @@ def traverse_node(node: ast.AST) -> Iterator[ast.AST]: @functools.lru_cache(maxsize=1) -def _get_assertion_exprs(src: bytes) -> dict[int, str]: +def _get_assertion_exprs(src: bytes) -> Dict[int, str]: """Return a mapping from {lineno: "assertion test expression"}.""" - ret: dict[int, str] = {} + ret: Dict[int, str] = {} depth = 0 - lines: list[str] = [] - assert_lineno: int | None = None - seen_lines: set[int] = set() + lines: List[str] = [] + assert_lineno: Optional[int] = None + seen_lines: Set[int] = set() def _write_and_reset() -> None: nonlocal depth, lines, assert_lineno, seen_lines @@ -599,7 +591,7 @@ def _get_assertion_exprs(src: bytes) -> dict[int, str]: # multi-line assert with message elif lineno in seen_lines: lines[-1] = lines[-1][:offset] - # multi line assert with escaped newline before message + # multi line assert with escapd newline before message else: lines.append(line[:offset]) _write_and_reset() @@ -672,7 +664,7 @@ class AssertionRewriter(ast.NodeVisitor): """ def __init__( - self, module_path: str | None, config: Config | None, source: bytes + self, module_path: Optional[str], config: Optional[Config], source: bytes ) -> None: super().__init__() self.module_path = module_path @@ -685,9 +677,9 @@ class AssertionRewriter(ast.NodeVisitor): self.enable_assertion_pass_hook = False self.source = source self.scope: tuple[ast.AST, ...] = () - self.variables_overwrite: defaultdict[tuple[ast.AST, ...], dict[str, str]] = ( - defaultdict(dict) - ) + self.variables_overwrite: defaultdict[ + tuple[ast.AST, ...], Dict[str, str] + ] = defaultdict(dict) def run(self, mod: ast.Module) -> None: """Find all assert statements in *mod* and rewrite them.""" @@ -702,18 +694,28 @@ class AssertionRewriter(ast.NodeVisitor): if doc is not None and self.is_rewrite_disabled(doc): return pos = 0 + item = None for item in mod.body: - match item: - case ast.Expr(value=ast.Constant(value=str() as doc)) if ( - expect_docstring - ): - if self.is_rewrite_disabled(doc): - return - expect_docstring = False - case ast.ImportFrom(level=0, module="__future__"): - pass - case _: - break + if ( + expect_docstring + and isinstance(item, ast.Expr) + and isinstance(item.value, astStr) + ): + if sys.version_info >= (3, 8): + doc = item.value.value + else: + doc = item.value.s + if self.is_rewrite_disabled(doc): + return + expect_docstring = False + elif ( + isinstance(item, ast.ImportFrom) + and item.level == 0 + and item.module == "__future__" + ): + pass + else: + break pos += 1 # Special case: for a decorated function, set the lineno to that of the # first decorator, not the `def`. Issue #4984. @@ -722,15 +724,21 @@ class AssertionRewriter(ast.NodeVisitor): else: lineno = item.lineno # Now actually insert the special imports. - aliases = [ - ast.alias("builtins", "@py_builtins", lineno=lineno, col_offset=0), - ast.alias( - "_pytest.assertion.rewrite", - "@pytest_ar", - lineno=lineno, - col_offset=0, - ), - ] + if sys.version_info >= (3, 10): + aliases = [ + ast.alias("builtins", "@py_builtins", lineno=lineno, col_offset=0), + ast.alias( + "_pytest.assertion.rewrite", + "@pytest_ar", + lineno=lineno, + col_offset=0, + ), + ] + else: + aliases = [ + ast.alias("builtins", "@py_builtins"), + ast.alias("_pytest.assertion.rewrite", "@pytest_ar"), + ] imports = [ ast.Import([alias], lineno=lineno, col_offset=0) for alias in aliases ] @@ -738,10 +746,10 @@ class AssertionRewriter(ast.NodeVisitor): # Collect asserts. self.scope = (mod,) - nodes: list[ast.AST | Sentinel] = [mod] + nodes: List[Union[ast.AST, Sentinel]] = [mod] while nodes: node = nodes.pop() - if isinstance(node, ast.FunctionDef | ast.AsyncFunctionDef | ast.ClassDef): + if isinstance(node, (ast.FunctionDef, ast.AsyncFunctionDef, ast.ClassDef)): self.scope = tuple((*self.scope, node)) nodes.append(_SCOPE_END_MARKER) if node == _SCOPE_END_MARKER: @@ -750,7 +758,7 @@ class AssertionRewriter(ast.NodeVisitor): assert isinstance(node, ast.AST) for name, field in ast.iter_fields(node): if isinstance(field, list): - new: list[ast.AST] = [] + new: List[ast.AST] = [] for i, child in enumerate(field): if isinstance(child, ast.Assert): # Transform assert. @@ -783,7 +791,7 @@ class AssertionRewriter(ast.NodeVisitor): """Give *expr* a name.""" name = self.variable() self.statements.append(ast.Assign([ast.Name(name, ast.Store())], expr)) - return ast.copy_location(ast.Name(name, ast.Load()), expr) + return ast.Name(name, ast.Load()) def display(self, expr: ast.expr) -> ast.expr: """Call saferepr on the expression.""" @@ -822,7 +830,7 @@ class AssertionRewriter(ast.NodeVisitor): to format a string of %-formatted values as added by .explanation_param(). """ - self.explanation_specifiers: dict[str, ast.expr] = {} + self.explanation_specifiers: Dict[str, ast.expr] = {} self.stack.append(self.explanation_specifiers) def pop_format_context(self, expl_expr: ast.expr) -> ast.Name: @@ -836,7 +844,7 @@ class AssertionRewriter(ast.NodeVisitor): current = self.stack.pop() if self.stack: self.explanation_specifiers = self.stack[-1] - keys: list[ast.expr | None] = [ast.Constant(key) for key in current.keys()] + keys = [astStr(key) for key in current.keys()] format_dict = ast.Dict(keys, list(current.values())) form = ast.BinOp(expl_expr, ast.Mod(), format_dict) name = "@py_format" + str(next(self.variable_counter)) @@ -845,13 +853,13 @@ class AssertionRewriter(ast.NodeVisitor): self.expl_stmts.append(ast.Assign([ast.Name(name, ast.Store())], form)) return ast.Name(name, ast.Load()) - def generic_visit(self, node: ast.AST) -> tuple[ast.Name, str]: + def generic_visit(self, node: ast.AST) -> Tuple[ast.Name, str]: """Handle expressions we don't have custom code for.""" assert isinstance(node, ast.expr) res = self.assign(node) return res, self.explanation_param(self.display(res)) - def visit_Assert(self, assert_: ast.Assert) -> list[ast.stmt]: + def visit_Assert(self, assert_: ast.Assert) -> List[ast.stmt]: """Return the AST statements to replace the ast.Assert instance. This rewrites the test of an assertion to provide @@ -860,9 +868,8 @@ class AssertionRewriter(ast.NodeVisitor): the expression is false. """ if isinstance(assert_.test, ast.Tuple) and len(assert_.test.elts) >= 1: - import warnings - from _pytest.warning_types import PytestAssertRewriteWarning + import warnings # TODO: This assert should not be needed. assert self.module_path is not None @@ -875,15 +882,15 @@ class AssertionRewriter(ast.NodeVisitor): lineno=assert_.lineno, ) - self.statements: list[ast.stmt] = [] - self.variables: list[str] = [] + self.statements: List[ast.stmt] = [] + self.variables: List[str] = [] self.variable_counter = itertools.count() if self.enable_assertion_pass_hook: - self.format_variables: list[str] = [] + self.format_variables: List[str] = [] - self.stack: list[dict[str, ast.expr]] = [] - self.expl_stmts: list[ast.stmt] = [] + self.stack: List[Dict[str, ast.expr]] = [] + self.expl_stmts: List[ast.stmt] = [] self.push_format_context() # Rewrite assert into a bunch of statements. top_condition, explanation = self.visit(assert_.test) @@ -891,16 +898,16 @@ class AssertionRewriter(ast.NodeVisitor): negation = ast.UnaryOp(ast.Not(), top_condition) if self.enable_assertion_pass_hook: # Experimental pytest_assertion_pass hook - msg = self.pop_format_context(ast.Constant(explanation)) + msg = self.pop_format_context(astStr(explanation)) # Failed if assert_.msg: assertmsg = self.helper("_format_assertmsg", assert_.msg) gluestr = "\n>assert " else: - assertmsg = ast.Constant("") + assertmsg = astStr("") gluestr = "assert " - err_explanation = ast.BinOp(ast.Constant(gluestr), ast.Add(), msg) + err_explanation = ast.BinOp(astStr(gluestr), ast.Add(), msg) err_msg = ast.BinOp(assertmsg, ast.Add(), err_explanation) err_name = ast.Name("AssertionError", ast.Load()) fmt = self.helper("_format_explanation", err_msg) @@ -916,27 +923,27 @@ class AssertionRewriter(ast.NodeVisitor): hook_call_pass = ast.Expr( self.helper( "_call_assertion_pass", - ast.Constant(assert_.lineno), - ast.Constant(orig), + astNum(assert_.lineno), + astStr(orig), fmt_pass, ) ) # If any hooks implement assert_pass hook hook_impl_test = ast.If( self.helper("_check_if_assertion_pass_impl"), - [*self.expl_stmts, hook_call_pass], + self.expl_stmts + [hook_call_pass], [], ) - statements_pass: list[ast.stmt] = [hook_impl_test] + statements_pass = [hook_impl_test] # Test for assertion condition main_test = ast.If(negation, statements_fail, statements_pass) self.statements.append(main_test) if self.format_variables: - variables: list[ast.expr] = [ + variables = [ ast.Name(name, ast.Store()) for name in self.format_variables ] - clear_format = ast.Assign(variables, ast.Constant(None)) + clear_format = ast.Assign(variables, astNameConstant(None)) self.statements.append(clear_format) else: # Original assertion rewriting @@ -947,9 +954,9 @@ class AssertionRewriter(ast.NodeVisitor): assertmsg = self.helper("_format_assertmsg", assert_.msg) explanation = "\n>assert " + explanation else: - assertmsg = ast.Constant("") + assertmsg = astStr("") explanation = "assert " + explanation - template = ast.BinOp(assertmsg, ast.Add(), ast.Constant(explanation)) + template = ast.BinOp(assertmsg, ast.Add(), astStr(explanation)) msg = self.pop_format_context(template) fmt = self.helper("_format_explanation", msg) err_name = ast.Name("AssertionError", ast.Load()) @@ -961,40 +968,37 @@ class AssertionRewriter(ast.NodeVisitor): # Clear temporary variables by setting them to None. if self.variables: variables = [ast.Name(name, ast.Store()) for name in self.variables] - clear = ast.Assign(variables, ast.Constant(None)) + clear = ast.Assign(variables, astNameConstant(None)) self.statements.append(clear) # Fix locations (line numbers/column offsets). for stmt in self.statements: for node in traverse_node(stmt): - if getattr(node, "lineno", None) is None: - # apply the assertion location to all generated ast nodes without source location - # and preserve the location of existing nodes or generated nodes with an correct location. - ast.copy_location(node, assert_) + ast.copy_location(node, assert_) return self.statements - def visit_NamedExpr(self, name: ast.NamedExpr) -> tuple[ast.NamedExpr, str]: + def visit_NamedExpr(self, name: namedExpr) -> Tuple[namedExpr, str]: # This method handles the 'walrus operator' repr of the target # name if it's a local variable or _should_repr_global_name() # thinks it's acceptable. locs = ast.Call(self.builtin("locals"), [], []) - target_id = name.target.id - inlocs = ast.Compare(ast.Constant(target_id), [ast.In()], [locs]) + target_id = name.target.id # type: ignore[attr-defined] + inlocs = ast.Compare(astStr(target_id), [ast.In()], [locs]) dorepr = self.helper("_should_repr_global_name", name) test = ast.BoolOp(ast.Or(), [inlocs, dorepr]) - expr = ast.IfExp(test, self.display(name), ast.Constant(target_id)) + expr = ast.IfExp(test, self.display(name), astStr(target_id)) return name, self.explanation_param(expr) - def visit_Name(self, name: ast.Name) -> tuple[ast.Name, str]: + def visit_Name(self, name: ast.Name) -> Tuple[ast.Name, str]: # Display the repr of the name if it's a local variable or # _should_repr_global_name() thinks it's acceptable. locs = ast.Call(self.builtin("locals"), [], []) - inlocs = ast.Compare(ast.Constant(name.id), [ast.In()], [locs]) + inlocs = ast.Compare(astStr(name.id), [ast.In()], [locs]) dorepr = self.helper("_should_repr_global_name", name) test = ast.BoolOp(ast.Or(), [inlocs, dorepr]) - expr = ast.IfExp(test, self.display(name), ast.Constant(name.id)) + expr = ast.IfExp(test, self.display(name), astStr(name.id)) return name, self.explanation_param(expr) - def visit_BoolOp(self, boolop: ast.BoolOp) -> tuple[ast.Name, str]: + def visit_BoolOp(self, boolop: ast.BoolOp) -> Tuple[ast.Name, str]: res_var = self.variable() expl_list = self.assign(ast.List([], ast.Load())) app = ast.Attribute(expl_list, "append", ast.Load()) @@ -1006,57 +1010,60 @@ class AssertionRewriter(ast.NodeVisitor): # Process each operand, short-circuiting if needed. for i, v in enumerate(boolop.values): if i: - fail_inner: list[ast.stmt] = [] + fail_inner: List[ast.stmt] = [] # cond is set in a prior loop iteration below - self.expl_stmts.append(ast.If(cond, fail_inner, [])) # noqa: F821 + self.expl_stmts.append(ast.If(cond, fail_inner, [])) # noqa self.expl_stmts = fail_inner - match v: - # Check if the left operand is an ast.NamedExpr and the value has already been visited - case ast.Compare( - left=ast.NamedExpr(target=ast.Name(id=target_id)) - ) if target_id in [ - e.id for e in boolop.values[:i] if hasattr(e, "id") - ]: - pytest_temp = self.variable() - self.variables_overwrite[self.scope][target_id] = v.left # type:ignore[assignment] - # mypy's false positive, we're checking that the 'target' attribute exists. - v.left.target.id = pytest_temp # type:ignore[attr-defined] + # Check if the left operand is a namedExpr and the value has already been visited + if ( + isinstance(v, ast.Compare) + and isinstance(v.left, namedExpr) + and v.left.target.id + in [ + ast_expr.id + for ast_expr in boolop.values[:i] + if hasattr(ast_expr, "id") + ] + ): + pytest_temp = self.variable() + self.variables_overwrite[self.scope][ + v.left.target.id + ] = v.left # type:ignore[assignment] + v.left.target.id = pytest_temp self.push_format_context() res, expl = self.visit(v) body.append(ast.Assign([ast.Name(res_var, ast.Store())], res)) - expl_format = self.pop_format_context(ast.Constant(expl)) + expl_format = self.pop_format_context(astStr(expl)) call = ast.Call(app, [expl_format], []) self.expl_stmts.append(ast.Expr(call)) if i < levels: cond: ast.expr = res if is_or: cond = ast.UnaryOp(ast.Not(), cond) - inner: list[ast.stmt] = [] + inner: List[ast.stmt] = [] self.statements.append(ast.If(cond, inner, [])) self.statements = body = inner self.statements = save self.expl_stmts = fail_save - expl_template = self.helper("_format_boolop", expl_list, ast.Constant(is_or)) + expl_template = self.helper("_format_boolop", expl_list, astNum(is_or)) expl = self.pop_format_context(expl_template) return ast.Name(res_var, ast.Load()), self.explanation_param(expl) - def visit_UnaryOp(self, unary: ast.UnaryOp) -> tuple[ast.Name, str]: + def visit_UnaryOp(self, unary: ast.UnaryOp) -> Tuple[ast.Name, str]: pattern = UNARY_MAP[unary.op.__class__] operand_res, operand_expl = self.visit(unary.operand) - res = self.assign(ast.copy_location(ast.UnaryOp(unary.op, operand_res), unary)) + res = self.assign(ast.UnaryOp(unary.op, operand_res)) return res, pattern % (operand_expl,) - def visit_BinOp(self, binop: ast.BinOp) -> tuple[ast.Name, str]: + def visit_BinOp(self, binop: ast.BinOp) -> Tuple[ast.Name, str]: symbol = BINOP_MAP[binop.op.__class__] left_expr, left_expl = self.visit(binop.left) right_expr, right_expl = self.visit(binop.right) explanation = f"({left_expl} {symbol} {right_expl})" - res = self.assign( - ast.copy_location(ast.BinOp(left_expr, binop.op, right_expr), binop) - ) + res = self.assign(ast.BinOp(left_expr, binop.op, right_expr)) return res, explanation - def visit_Call(self, call: ast.Call) -> tuple[ast.Name, str]: + def visit_Call(self, call: ast.Call) -> Tuple[ast.Name, str]: new_func, func_expl = self.visit(call.func) arg_expls = [] new_args = [] @@ -1065,16 +1072,19 @@ class AssertionRewriter(ast.NodeVisitor): if isinstance(arg, ast.Name) and arg.id in self.variables_overwrite.get( self.scope, {} ): - arg = self.variables_overwrite[self.scope][arg.id] # type:ignore[assignment] + arg = self.variables_overwrite[self.scope][ + arg.id + ] # type:ignore[assignment] res, expl = self.visit(arg) arg_expls.append(expl) new_args.append(res) for keyword in call.keywords: - match keyword.value: - case ast.Name(id=id) if id in self.variables_overwrite.get( - self.scope, {} - ): - keyword.value = self.variables_overwrite[self.scope][id] # type:ignore[assignment] + if isinstance( + keyword.value, ast.Name + ) and keyword.value.id in self.variables_overwrite.get(self.scope, {}): + keyword.value = self.variables_overwrite[self.scope][ + keyword.value.id + ] # type:ignore[assignment] res, expl = self.visit(keyword.value) new_kwargs.append(ast.keyword(keyword.arg, res)) if keyword.arg: @@ -1083,68 +1093,70 @@ class AssertionRewriter(ast.NodeVisitor): arg_expls.append("**" + expl) expl = "{}({})".format(func_expl, ", ".join(arg_expls)) - new_call = ast.copy_location(ast.Call(new_func, new_args, new_kwargs), call) + new_call = ast.Call(new_func, new_args, new_kwargs) res = self.assign(new_call) res_expl = self.explanation_param(self.display(res)) outer_expl = f"{res_expl}\n{{{res_expl} = {expl}\n}}" return res, outer_expl - def visit_Starred(self, starred: ast.Starred) -> tuple[ast.Starred, str]: + def visit_Starred(self, starred: ast.Starred) -> Tuple[ast.Starred, str]: # A Starred node can appear in a function call. res, expl = self.visit(starred.value) new_starred = ast.Starred(res, starred.ctx) return new_starred, "*" + expl - def visit_Attribute(self, attr: ast.Attribute) -> tuple[ast.Name, str]: + def visit_Attribute(self, attr: ast.Attribute) -> Tuple[ast.Name, str]: if not isinstance(attr.ctx, ast.Load): return self.generic_visit(attr) value, value_expl = self.visit(attr.value) - res = self.assign( - ast.copy_location(ast.Attribute(value, attr.attr, ast.Load()), attr) - ) + res = self.assign(ast.Attribute(value, attr.attr, ast.Load())) res_expl = self.explanation_param(self.display(res)) pat = "%s\n{%s = %s.%s\n}" expl = pat % (res_expl, res_expl, value_expl, attr.attr) return res, expl - def visit_Compare(self, comp: ast.Compare) -> tuple[ast.expr, str]: + def visit_Compare(self, comp: ast.Compare) -> Tuple[ast.expr, str]: self.push_format_context() # We first check if we have overwritten a variable in the previous assert - match comp.left: - case ast.Name(id=name_id) if name_id in self.variables_overwrite.get( - self.scope, {} - ): - comp.left = self.variables_overwrite[self.scope][name_id] # type: ignore[assignment] - case ast.NamedExpr(target=ast.Name(id=target_id)): - self.variables_overwrite[self.scope][target_id] = comp.left # type: ignore[assignment] + if isinstance( + comp.left, ast.Name + ) and comp.left.id in self.variables_overwrite.get(self.scope, {}): + comp.left = self.variables_overwrite[self.scope][ + comp.left.id + ] # type:ignore[assignment] + if isinstance(comp.left, namedExpr): + self.variables_overwrite[self.scope][ + comp.left.target.id + ] = comp.left # type:ignore[assignment] left_res, left_expl = self.visit(comp.left) - if isinstance(comp.left, ast.Compare | ast.BoolOp): + if isinstance(comp.left, (ast.Compare, ast.BoolOp)): left_expl = f"({left_expl})" res_variables = [self.variable() for i in range(len(comp.ops))] - load_names: list[ast.expr] = [ast.Name(v, ast.Load()) for v in res_variables] + load_names = [ast.Name(v, ast.Load()) for v in res_variables] store_names = [ast.Name(v, ast.Store()) for v in res_variables] - it = zip(range(len(comp.ops)), comp.ops, comp.comparators, strict=True) - expls: list[ast.expr] = [] - syms: list[ast.expr] = [] + it = zip(range(len(comp.ops)), comp.ops, comp.comparators) + expls = [] + syms = [] results = [left_res] for i, op, next_operand in it: - match (next_operand, left_res): - case ( - ast.NamedExpr(target=ast.Name(id=target_id)), - ast.Name(id=name_id), - ) if target_id == name_id: - next_operand.target.id = self.variable() - self.variables_overwrite[self.scope][name_id] = next_operand # type: ignore[assignment] - + if ( + isinstance(next_operand, namedExpr) + and isinstance(left_res, ast.Name) + and next_operand.target.id == left_res.id + ): + next_operand.target.id = self.variable() + self.variables_overwrite[self.scope][ + left_res.id + ] = next_operand # type:ignore[assignment] next_res, next_expl = self.visit(next_operand) - if isinstance(next_operand, ast.Compare | ast.BoolOp): + if isinstance(next_operand, (ast.Compare, ast.BoolOp)): next_expl = f"({next_expl})" results.append(next_res) sym = BINOP_MAP[op.__class__] - syms.append(ast.Constant(sym)) + syms.append(astStr(sym)) expl = f"{left_expl} {sym} {next_expl}" - expls.append(ast.Constant(expl)) - res_expr = ast.copy_location(ast.Compare(left_res, [op], [next_res]), comp) + expls.append(astStr(expl)) + res_expr = ast.Compare(left_res, [op], [next_res]) self.statements.append(ast.Assign([store_names[i]], res_expr)) left_res, left_expl = next_res, next_expl # Use pytest.assertion.util._reprcompare if that's available. @@ -1179,10 +1191,7 @@ def try_makedirs(cache_dir: Path) -> bool: return False except OSError as e: # as of now, EROFS doesn't have an equivalent OSError-subclass - # - # squashfuse_ll returns ENOSYS "OSError: [Errno 38] Function not - # implemented" for a read-only error - if e.errno in {errno.EROFS, errno.ENOSYS}: + if e.errno == errno.EROFS: return False raise return True @@ -1190,7 +1199,7 @@ def try_makedirs(cache_dir: Path) -> bool: def get_cache_dir(file_path: Path) -> Path: """Return the cache directory to write .pyc files for the given .py file path.""" - if sys.pycache_prefix: + if sys.version_info >= (3, 8) and sys.pycache_prefix: # given: # prefix = '/tmp/pycs' # path = '/home/user/proj/test_app.py' diff --git a/Backend/venv/lib/python3.12/site-packages/_pytest/assertion/truncate.py b/Backend/venv/lib/python3.12/site-packages/_pytest/assertion/truncate.py index 5820e6e8..dfd6f65d 100644 --- a/Backend/venv/lib/python3.12/site-packages/_pytest/assertion/truncate.py +++ b/Backend/venv/lib/python3.12/site-packages/_pytest/assertion/truncate.py @@ -1,65 +1,51 @@ """Utilities for truncating assertion output. Current default behaviour is to truncate assertion explanations at -terminal lines, unless running with an assertions verbosity level of at least 2 or running on CI. +~8 terminal lines, unless running in "-vv" mode or running on CI. """ +from typing import List +from typing import Optional -from __future__ import annotations - -from _pytest.compat import running_on_ci -from _pytest.config import Config +from _pytest.assertion import util from _pytest.nodes import Item DEFAULT_MAX_LINES = 8 -DEFAULT_MAX_CHARS = DEFAULT_MAX_LINES * 80 +DEFAULT_MAX_CHARS = 8 * 80 USAGE_MSG = "use '-vv' to show" -def truncate_if_required(explanation: list[str], item: Item) -> list[str]: +def truncate_if_required( + explanation: List[str], item: Item, max_length: Optional[int] = None +) -> List[str]: """Truncate this assertion explanation if the given test item is eligible.""" - should_truncate, max_lines, max_chars = _get_truncation_parameters(item) - if should_truncate: - return _truncate_explanation( - explanation, - max_lines=max_lines, - max_chars=max_chars, - ) + if _should_truncate_item(item): + return _truncate_explanation(explanation) return explanation -def _get_truncation_parameters(item: Item) -> tuple[bool, int, int]: - """Return the truncation parameters related to the given item, as (should truncate, max lines, max chars).""" - # We do not need to truncate if one of conditions is met: - # 1. Verbosity level is 2 or more; - # 2. Test is being run in CI environment; - # 3. Both truncation_limit_lines and truncation_limit_chars - # .ini parameters are set to 0 explicitly. - max_lines = item.config.getini("truncation_limit_lines") - max_lines = int(max_lines if max_lines is not None else DEFAULT_MAX_LINES) - - max_chars = item.config.getini("truncation_limit_chars") - max_chars = int(max_chars if max_chars is not None else DEFAULT_MAX_CHARS) - - verbose = item.config.get_verbosity(Config.VERBOSITY_ASSERTIONS) - - should_truncate = verbose < 2 and not running_on_ci() - should_truncate = should_truncate and (max_lines > 0 or max_chars > 0) - - return should_truncate, max_lines, max_chars +def _should_truncate_item(item: Item) -> bool: + """Whether or not this test item is eligible for truncation.""" + verbose = item.config.option.verbose + return verbose < 2 and not util.running_on_ci() def _truncate_explanation( - input_lines: list[str], - max_lines: int, - max_chars: int, -) -> list[str]: + input_lines: List[str], + max_lines: Optional[int] = None, + max_chars: Optional[int] = None, +) -> List[str]: """Truncate given list of strings that makes up the assertion explanation. - Truncates to either max_lines, or max_chars - whichever the input reaches + Truncates to either 8 lines, or 640 characters - whichever the input reaches first, taking the truncation explanation into account. The remaining lines will be replaced by a usage message. """ + if max_lines is None: + max_lines = DEFAULT_MAX_LINES + if max_chars is None: + max_chars = DEFAULT_MAX_CHARS + # Check if truncation required input_char_count = len("".join(input_lines)) # The length of the truncation explanation depends on the number of lines @@ -84,23 +70,16 @@ def _truncate_explanation( ): return input_lines # Truncate first to max_lines, and then truncate to max_chars if necessary - if max_lines > 0: - truncated_explanation = input_lines[:max_lines] - else: - truncated_explanation = input_lines + truncated_explanation = input_lines[:max_lines] truncated_char = True # We reevaluate the need to truncate chars following removal of some lines - if len("".join(truncated_explanation)) > tolerable_max_chars and max_chars > 0: + if len("".join(truncated_explanation)) > tolerable_max_chars: truncated_explanation = _truncate_by_char_count( truncated_explanation, max_chars ) else: truncated_char = False - if truncated_explanation == input_lines: - # No truncation happened, so we do not need to add any explanations - return truncated_explanation - truncated_line_count = len(input_lines) - len(truncated_explanation) if truncated_explanation[-1]: # Add ellipsis and take into account part-truncated final line @@ -111,15 +90,14 @@ def _truncate_explanation( else: # Add proper ellipsis when we were able to fit a full line exactly truncated_explanation[-1] = "..." - return [ - *truncated_explanation, + return truncated_explanation + [ "", f"...Full output truncated ({truncated_line_count} line" f"{'' if truncated_line_count == 1 else 's'} hidden), {USAGE_MSG}", ] -def _truncate_by_char_count(input_lines: list[str], max_chars: int) -> list[str]: +def _truncate_by_char_count(input_lines: List[str], max_chars: int) -> List[str]: # Find point at which input length exceeds total allowed length iterated_char_count = 0 for iterated_index, input_line in enumerate(input_lines): diff --git a/Backend/venv/lib/python3.12/site-packages/_pytest/assertion/util.py b/Backend/venv/lib/python3.12/site-packages/_pytest/assertion/util.py index f35d83a6..fc5dfdbd 100644 --- a/Backend/venv/lib/python3.12/site-packages/_pytest/assertion/util.py +++ b/Backend/venv/lib/python3.12/site-packages/_pytest/assertion/util.py @@ -1,54 +1,36 @@ -# mypy: allow-untyped-defs """Utilities for assertion debugging.""" - -from __future__ import annotations - import collections.abc -from collections.abc import Callable -from collections.abc import Iterable -from collections.abc import Mapping -from collections.abc import Sequence -from collections.abc import Set as AbstractSet +import os import pprint +from typing import AbstractSet from typing import Any -from typing import Literal -from typing import Protocol +from typing import Callable +from typing import Iterable +from typing import List +from typing import Mapping +from typing import Optional +from typing import Sequence from unicodedata import normalize -from _pytest import outcomes import _pytest._code -from _pytest._io.pprint import PrettyPrinter +from _pytest import outcomes +from _pytest._io.saferepr import _pformat_dispatch from _pytest._io.saferepr import saferepr from _pytest._io.saferepr import saferepr_unlimited -from _pytest.compat import running_on_ci from _pytest.config import Config - # The _reprcompare attribute on the util module is used by the new assertion # interpretation code and assertion rewriter to detect this plugin was # loaded and in turn call the hooks defined here as part of the # DebugInterpreter. -_reprcompare: Callable[[str, object, object], str | None] | None = None +_reprcompare: Optional[Callable[[str, object, object], Optional[str]]] = None # Works similarly as _reprcompare attribute. Is populated with the hook call # when pytest_runtest_setup is called. -_assertion_pass: Callable[[int, str, str], None] | None = None +_assertion_pass: Optional[Callable[[int, str, str], None]] = None # Config object which is assigned during pytest_runtest_protocol. -_config: Config | None = None - - -class _HighlightFunc(Protocol): - def __call__(self, source: str, lexer: Literal["diff", "python"] = "python") -> str: - """Apply highlighting to the given source.""" - - -def dummy_highlighter(source: str, lexer: Literal["diff", "python"] = "python") -> str: - """Dummy highlighter that returns the text unprocessed. - - Needed for _notin_text, as the diff gets post-processed to only show the "+" part. - """ - return source +_config: Optional[Config] = None def format_explanation(explanation: str) -> str: @@ -66,7 +48,7 @@ def format_explanation(explanation: str) -> str: return "\n".join(result) -def _split_explanation(explanation: str) -> list[str]: +def _split_explanation(explanation: str) -> List[str]: r"""Return a list of individual lines in the explanation. This will return a list of lines split on '\n{', '\n}' and '\n~'. @@ -83,7 +65,7 @@ def _split_explanation(explanation: str) -> list[str]: return lines -def _format_lines(lines: Sequence[str]) -> list[str]: +def _format_lines(lines: Sequence[str]) -> List[str]: """Format the individual lines. This will replace the '{', '}' and '~' characters of our mini formatting @@ -131,7 +113,7 @@ def isdict(x: Any) -> bool: def isset(x: Any) -> bool: - return isinstance(x, set | frozenset) + return isinstance(x, (set, frozenset)) def isnamedtuple(obj: Any) -> bool: @@ -150,7 +132,7 @@ def isiterable(obj: Any) -> bool: try: iter(obj) return not istext(obj) - except Exception: + except TypeError: return False @@ -169,7 +151,7 @@ def has_default_eq( code_filename = obj.__eq__.__code__.co_filename if isattrs(obj): - return "attrs generated " in code_filename + return "attrs generated eq" in code_filename return code_filename == "" # data class return True @@ -177,9 +159,9 @@ def has_default_eq( def assertrepr_compare( config, op: str, left: Any, right: Any, use_ascii: bool = False -) -> list[str] | None: +) -> Optional[List[str]]: """Return specialised explanations for some operators/operands.""" - verbose = config.get_verbosity(Config.VERBOSITY_ASSERTIONS) + verbose = config.getoption("verbose") # Strings which normalize equal are often hard to distinguish when printed; use ascii() to make this easier. # See issue #3246. @@ -203,54 +185,34 @@ def assertrepr_compare( right_repr = saferepr(right, maxsize=maxsize, use_ascii=use_ascii) summary = f"{left_repr} {op} {right_repr}" - highlighter = config.get_terminal_writer()._highlight explanation = None try: if op == "==": - explanation = _compare_eq_any(left, right, highlighter, verbose) + explanation = _compare_eq_any(left, right, verbose) elif op == "not in": if istext(left) and istext(right): explanation = _notin_text(left, right, verbose) - elif op == "!=": - if isset(left) and isset(right): - explanation = ["Both sets are equal"] - elif op == ">=": - if isset(left) and isset(right): - explanation = _compare_gte_set(left, right, highlighter, verbose) - elif op == "<=": - if isset(left) and isset(right): - explanation = _compare_lte_set(left, right, highlighter, verbose) - elif op == ">": - if isset(left) and isset(right): - explanation = _compare_gt_set(left, right, highlighter, verbose) - elif op == "<": - if isset(left) and isset(right): - explanation = _compare_lt_set(left, right, highlighter, verbose) - except outcomes.Exit: raise except Exception: - repr_crash = _pytest._code.ExceptionInfo.from_current()._getreprcrash() explanation = [ - f"(pytest_assertion plugin: representation of details failed: {repr_crash}.", + "(pytest_assertion plugin: representation of details failed: {}.".format( + _pytest._code.ExceptionInfo.from_current()._getreprcrash() + ), " Probably an object has a faulty __repr__.)", ] if not explanation: return None - if explanation[0] != "": - explanation = ["", *explanation] - return [summary, *explanation] + return [summary] + explanation -def _compare_eq_any( - left: Any, right: Any, highlighter: _HighlightFunc, verbose: int = 0 -) -> list[str]: +def _compare_eq_any(left: Any, right: Any, verbose: int = 0) -> List[str]: explanation = [] if istext(left) and istext(right): - explanation = _diff_text(left, right, highlighter, verbose) + explanation = _diff_text(left, right, verbose) else: from _pytest.python_api import ApproxBase @@ -260,31 +222,29 @@ def _compare_eq_any( other_side = right if isinstance(left, ApproxBase) else left explanation = approx_side._repr_compare(other_side) - elif type(left) is type(right) and ( + elif type(left) == type(right) and ( isdatacls(left) or isattrs(left) or isnamedtuple(left) ): # Note: unlike dataclasses/attrs, namedtuples compare only the # field values, not the type or field names. But this branch # intentionally only handles the same-type case, which was often # used in older code bases before dataclasses/attrs were available. - explanation = _compare_eq_cls(left, right, highlighter, verbose) + explanation = _compare_eq_cls(left, right, verbose) elif issequence(left) and issequence(right): - explanation = _compare_eq_sequence(left, right, highlighter, verbose) + explanation = _compare_eq_sequence(left, right, verbose) elif isset(left) and isset(right): - explanation = _compare_eq_set(left, right, highlighter, verbose) + explanation = _compare_eq_set(left, right, verbose) elif isdict(left) and isdict(right): - explanation = _compare_eq_dict(left, right, highlighter, verbose) + explanation = _compare_eq_dict(left, right, verbose) if isiterable(left) and isiterable(right): - expl = _compare_eq_iterable(left, right, highlighter, verbose) + expl = _compare_eq_iterable(left, right, verbose) explanation.extend(expl) return explanation -def _diff_text( - left: str, right: str, highlighter: _HighlightFunc, verbose: int = 0 -) -> list[str]: +def _diff_text(left: str, right: str, verbose: int = 0) -> List[str]: """Return the explanation for the diff between text. Unless --verbose is used this will skip leading and trailing @@ -292,7 +252,7 @@ def _diff_text( """ from difflib import ndiff - explanation: list[str] = [] + explanation: List[str] = [] if verbose < 1: i = 0 # just in case left or right has zero length @@ -302,7 +262,7 @@ def _diff_text( if i > 42: i -= 10 # Provide some context explanation = [ - f"Skipping {i} identical leading characters in diff, use -v to show" + "Skipping %s identical leading characters in diff, use -v to show" % i ] left = left[i:] right = right[i:] @@ -313,8 +273,8 @@ def _diff_text( if i > 42: i -= 10 # Provide some context explanation += [ - f"Skipping {i} identical trailing " - "characters in diff, use -v to show" + "Skipping {} identical trailing " + "characters in diff, use -v to show".format(i) ] left = left[:-i] right = right[:-i] @@ -325,55 +285,61 @@ def _diff_text( explanation += ["Strings contain only whitespace, escaping them using repr()"] # "right" is the expected base against which we compare "left", # see https://github.com/pytest-dev/pytest/issues/3333 - explanation.extend( - highlighter( - "\n".join( - line.strip("\n") - for line in ndiff(right.splitlines(keepends), left.splitlines(keepends)) - ), - lexer="diff", - ).splitlines() - ) + explanation += [ + line.strip("\n") + for line in ndiff(right.splitlines(keepends), left.splitlines(keepends)) + ] return explanation +def _surrounding_parens_on_own_lines(lines: List[str]) -> None: + """Move opening/closing parenthesis/bracket to own lines.""" + opening = lines[0][:1] + if opening in ["(", "[", "{"]: + lines[0] = " " + lines[0][1:] + lines[:] = [opening] + lines + closing = lines[-1][-1:] + if closing in [")", "]", "}"]: + lines[-1] = lines[-1][:-1] + "," + lines[:] = lines + [closing] + + def _compare_eq_iterable( - left: Iterable[Any], - right: Iterable[Any], - highlighter: _HighlightFunc, - verbose: int = 0, -) -> list[str]: + left: Iterable[Any], right: Iterable[Any], verbose: int = 0 +) -> List[str]: if verbose <= 0 and not running_on_ci(): return ["Use -v to get more diff"] # dynamic import to speedup pytest import difflib - left_formatting = PrettyPrinter().pformat(left).splitlines() - right_formatting = PrettyPrinter().pformat(right).splitlines() + left_formatting = pprint.pformat(left).splitlines() + right_formatting = pprint.pformat(right).splitlines() - explanation = ["", "Full diff:"] + # Re-format for different output lengths. + lines_left = len(left_formatting) + lines_right = len(right_formatting) + if lines_left != lines_right: + left_formatting = _pformat_dispatch(left).splitlines() + right_formatting = _pformat_dispatch(right).splitlines() + + if lines_left > 1 or lines_right > 1: + _surrounding_parens_on_own_lines(left_formatting) + _surrounding_parens_on_own_lines(right_formatting) + + explanation = ["Full diff:"] # "right" is the expected base against which we compare "left", # see https://github.com/pytest-dev/pytest/issues/3333 explanation.extend( - highlighter( - "\n".join( - line.rstrip() - for line in difflib.ndiff(right_formatting, left_formatting) - ), - lexer="diff", - ).splitlines() + line.rstrip() for line in difflib.ndiff(right_formatting, left_formatting) ) return explanation def _compare_eq_sequence( - left: Sequence[Any], - right: Sequence[Any], - highlighter: _HighlightFunc, - verbose: int = 0, -) -> list[str]: + left: Sequence[Any], right: Sequence[Any], verbose: int = 0 +) -> List[str]: comparing_bytes = isinstance(left, bytes) and isinstance(right, bytes) - explanation: list[str] = [] + explanation: List[str] = [] len_left = len(left) len_right = len(right) for i in range(min(len_left, len_right)): @@ -393,10 +359,7 @@ def _compare_eq_sequence( left_value = left[i] right_value = right[i] - explanation.append( - f"At index {i} diff:" - f" {highlighter(repr(left_value))} != {highlighter(repr(right_value))}" - ) + explanation += [f"At index {i} diff: {left_value!r} != {right_value!r}"] break if comparing_bytes: @@ -416,134 +379,74 @@ def _compare_eq_sequence( extra = saferepr(right[len_left]) if len_diff == 1: - explanation += [ - f"{dir_with_more} contains one more item: {highlighter(extra)}" - ] + explanation += [f"{dir_with_more} contains one more item: {extra}"] else: explanation += [ - f"{dir_with_more} contains {len_diff} more items, first extra item: {highlighter(extra)}" + "%s contains %d more items, first extra item: %s" + % (dir_with_more, len_diff, extra) ] return explanation def _compare_eq_set( - left: AbstractSet[Any], - right: AbstractSet[Any], - highlighter: _HighlightFunc, - verbose: int = 0, -) -> list[str]: + left: AbstractSet[Any], right: AbstractSet[Any], verbose: int = 0 +) -> List[str]: explanation = [] - explanation.extend(_set_one_sided_diff("left", left, right, highlighter)) - explanation.extend(_set_one_sided_diff("right", right, left, highlighter)) - return explanation - - -def _compare_gt_set( - left: AbstractSet[Any], - right: AbstractSet[Any], - highlighter: _HighlightFunc, - verbose: int = 0, -) -> list[str]: - explanation = _compare_gte_set(left, right, highlighter) - if not explanation: - return ["Both sets are equal"] - return explanation - - -def _compare_lt_set( - left: AbstractSet[Any], - right: AbstractSet[Any], - highlighter: _HighlightFunc, - verbose: int = 0, -) -> list[str]: - explanation = _compare_lte_set(left, right, highlighter) - if not explanation: - return ["Both sets are equal"] - return explanation - - -def _compare_gte_set( - left: AbstractSet[Any], - right: AbstractSet[Any], - highlighter: _HighlightFunc, - verbose: int = 0, -) -> list[str]: - return _set_one_sided_diff("right", right, left, highlighter) - - -def _compare_lte_set( - left: AbstractSet[Any], - right: AbstractSet[Any], - highlighter: _HighlightFunc, - verbose: int = 0, -) -> list[str]: - return _set_one_sided_diff("left", left, right, highlighter) - - -def _set_one_sided_diff( - posn: str, - set1: AbstractSet[Any], - set2: AbstractSet[Any], - highlighter: _HighlightFunc, -) -> list[str]: - explanation = [] - diff = set1 - set2 - if diff: - explanation.append(f"Extra items in the {posn} set:") - for item in diff: - explanation.append(highlighter(saferepr(item))) + diff_left = left - right + diff_right = right - left + if diff_left: + explanation.append("Extra items in the left set:") + for item in diff_left: + explanation.append(saferepr(item)) + if diff_right: + explanation.append("Extra items in the right set:") + for item in diff_right: + explanation.append(saferepr(item)) return explanation def _compare_eq_dict( - left: Mapping[Any, Any], - right: Mapping[Any, Any], - highlighter: _HighlightFunc, - verbose: int = 0, -) -> list[str]: - explanation: list[str] = [] + left: Mapping[Any, Any], right: Mapping[Any, Any], verbose: int = 0 +) -> List[str]: + explanation: List[str] = [] set_left = set(left) set_right = set(right) common = set_left.intersection(set_right) same = {k: left[k] for k in common if left[k] == right[k]} if same and verbose < 2: - explanation += [f"Omitting {len(same)} identical items, use -vv to show"] + explanation += ["Omitting %s identical items, use -vv to show" % len(same)] elif same: explanation += ["Common items:"] - explanation += highlighter(pprint.pformat(same)).splitlines() + explanation += pprint.pformat(same).splitlines() diff = {k for k in common if left[k] != right[k]} if diff: explanation += ["Differing items:"] for k in diff: - explanation += [ - highlighter(saferepr({k: left[k]})) - + " != " - + highlighter(saferepr({k: right[k]})) - ] + explanation += [saferepr({k: left[k]}) + " != " + saferepr({k: right[k]})] extra_left = set_left - set_right len_extra_left = len(extra_left) if len_extra_left: explanation.append( - f"Left contains {len_extra_left} more item{'' if len_extra_left == 1 else 's'}:" + "Left contains %d more item%s:" + % (len_extra_left, "" if len_extra_left == 1 else "s") ) explanation.extend( - highlighter(pprint.pformat({k: left[k] for k in extra_left})).splitlines() + pprint.pformat({k: left[k] for k in extra_left}).splitlines() ) extra_right = set_right - set_left len_extra_right = len(extra_right) if len_extra_right: explanation.append( - f"Right contains {len_extra_right} more item{'' if len_extra_right == 1 else 's'}:" + "Right contains %d more item%s:" + % (len_extra_right, "" if len_extra_right == 1 else "s") ) explanation.extend( - highlighter(pprint.pformat({k: right[k] for k in extra_right})).splitlines() + pprint.pformat({k: right[k] for k in extra_right}).splitlines() ) return explanation -def _compare_eq_cls( - left: Any, right: Any, highlighter: _HighlightFunc, verbose: int -) -> list[str]: +def _compare_eq_cls(left: Any, right: Any, verbose: int) -> List[str]: if not has_default_eq(left): return [] if isdatacls(left): @@ -572,37 +475,35 @@ def _compare_eq_cls( if same or diff: explanation += [""] if same and verbose < 2: - explanation.append(f"Omitting {len(same)} identical items, use -vv to show") + explanation.append("Omitting %s identical items, use -vv to show" % len(same)) elif same: explanation += ["Matching attributes:"] - explanation += highlighter(pprint.pformat(same)).splitlines() + explanation += pprint.pformat(same).splitlines() if diff: explanation += ["Differing attributes:"] - explanation += highlighter(pprint.pformat(diff)).splitlines() + explanation += pprint.pformat(diff).splitlines() for field in diff: field_left = getattr(left, field) field_right = getattr(right, field) explanation += [ "", - f"Drill down into differing attribute {field}:", - f"{indent}{field}: {highlighter(repr(field_left))} != {highlighter(repr(field_right))}", + "Drill down into differing attribute %s:" % field, + ("%s%s: %r != %r") % (indent, field, field_left, field_right), ] explanation += [ indent + line - for line in _compare_eq_any( - field_left, field_right, highlighter, verbose - ) + for line in _compare_eq_any(field_left, field_right, verbose) ] return explanation -def _notin_text(term: str, text: str, verbose: int = 0) -> list[str]: +def _notin_text(term: str, text: str, verbose: int = 0) -> List[str]: index = text.find(term) head = text[:index] tail = text[index + len(term) :] correct_text = head + tail - diff = _diff_text(text, correct_text, dummy_highlighter, verbose) - newdiff = [f"{saferepr(term, maxsize=42)} is contained here:"] + diff = _diff_text(text, correct_text, verbose) + newdiff = ["%s is contained here:" % saferepr(term, maxsize=42)] for line in diff: if line.startswith("Skipping"): continue @@ -613,3 +514,9 @@ def _notin_text(term: str, text: str, verbose: int = 0) -> list[str]: else: newdiff.append(line) return newdiff + + +def running_on_ci() -> bool: + """Check if we're currently running on a CI system.""" + env_vars = ["CI", "BUILD_NUMBER"] + return any(var in os.environ for var in env_vars) diff --git a/Backend/venv/lib/python3.12/site-packages/_pytest/cacheprovider.py b/Backend/venv/lib/python3.12/site-packages/_pytest/cacheprovider.py index 4383f105..1ecb8650 100644 --- a/Backend/venv/lib/python3.12/site-packages/_pytest/cacheprovider.py +++ b/Backend/venv/lib/python3.12/site-packages/_pytest/cacheprovider.py @@ -1,25 +1,24 @@ -# mypy: allow-untyped-defs """Implementation of the cache provider.""" - # This plugin was not named "cache" to avoid conflicts with the external # pytest-cache version. -from __future__ import annotations - -from collections.abc import Generator -from collections.abc import Iterable import dataclasses -import errno import json import os from pathlib import Path -import tempfile -from typing import final +from typing import Dict +from typing import Generator +from typing import Iterable +from typing import List +from typing import Optional +from typing import Set +from typing import Union from .pathlib import resolve_from_str from .pathlib import rm_rf from .reports import CollectReport from _pytest import nodes from _pytest._io import TerminalWriter +from _pytest.compat import final from _pytest.config import Config from _pytest.config import ExitCode from _pytest.config import hookimpl @@ -28,11 +27,10 @@ from _pytest.deprecated import check_ispytest from _pytest.fixtures import fixture from _pytest.fixtures import FixtureRequest from _pytest.main import Session -from _pytest.nodes import Directory from _pytest.nodes import File +from _pytest.python import Package from _pytest.reports import TestReport - README_CONTENT = """\ # pytest cache directory # @@ -74,7 +72,7 @@ class Cache: self._config = config @classmethod - def for_config(cls, config: Config, *, _ispytest: bool = False) -> Cache: + def for_config(cls, config: Config, *, _ispytest: bool = False) -> "Cache": """Create the Cache instance for a Config. :meta private: @@ -113,7 +111,6 @@ class Cache: """ check_ispytest(_ispytest) import warnings - from _pytest.warning_types import PytestCacheWarning warnings.warn( @@ -122,10 +119,6 @@ class Cache: stacklevel=3, ) - def _mkdir(self, path: Path) -> None: - self._ensure_cache_dir_and_supporting_files() - path.mkdir(exist_ok=True, parents=True) - def mkdir(self, name: str) -> Path: """Return a directory path object with the given name. @@ -144,7 +137,7 @@ class Cache: if len(path.parts) > 1: raise ValueError("name is not allowed to contain path separators") res = self._cachedir.joinpath(self._CACHE_PREFIX_DIRS, path) - self._mkdir(res) + res.mkdir(exist_ok=True, parents=True) return res def _getvaluepath(self, key: str) -> Path: @@ -181,13 +174,19 @@ class Cache: """ path = self._getvaluepath(key) try: - self._mkdir(path.parent) + if path.parent.is_dir(): + cache_dir_exists_already = True + else: + cache_dir_exists_already = self._cachedir.exists() + path.parent.mkdir(exist_ok=True, parents=True) except OSError as exc: self.warn( f"could not create cache path {path}: {exc}", _ispytest=True, ) return + if not cache_dir_exists_already: + self._ensure_supporting_files() data = json.dumps(value, ensure_ascii=False, indent=2) try: f = path.open("w", encoding="UTF-8") @@ -200,85 +199,60 @@ class Cache: with f: f.write(data) - def _ensure_cache_dir_and_supporting_files(self) -> None: - """Create the cache dir and its supporting files.""" - if self._cachedir.is_dir(): - return + def _ensure_supporting_files(self) -> None: + """Create supporting files in the cache dir that are not really part of the cache.""" + readme_path = self._cachedir / "README.md" + readme_path.write_text(README_CONTENT, encoding="UTF-8") - self._cachedir.parent.mkdir(parents=True, exist_ok=True) - with tempfile.TemporaryDirectory( - prefix="pytest-cache-files-", - dir=self._cachedir.parent, - ) as newpath: - path = Path(newpath) + gitignore_path = self._cachedir.joinpath(".gitignore") + msg = "# Created by pytest automatically.\n*\n" + gitignore_path.write_text(msg, encoding="UTF-8") - # Reset permissions to the default, see #12308. - # Note: there's no way to get the current umask atomically, eek. - umask = os.umask(0o022) - os.umask(umask) - path.chmod(0o777 - umask) - - with open(path.joinpath("README.md"), "x", encoding="UTF-8") as f: - f.write(README_CONTENT) - with open(path.joinpath(".gitignore"), "x", encoding="UTF-8") as f: - f.write("# Created by pytest automatically.\n*\n") - with open(path.joinpath("CACHEDIR.TAG"), "xb") as f: - f.write(CACHEDIR_TAG_CONTENT) - - try: - path.rename(self._cachedir) - except OSError as e: - # If 2 concurrent pytests both race to the rename, the loser - # gets "Directory not empty" from the rename. In this case, - # everything is handled so just continue (while letting the - # temporary directory be cleaned up). - # On Windows, the error is a FileExistsError which translates to EEXIST. - if e.errno not in (errno.ENOTEMPTY, errno.EEXIST): - raise - else: - # Create a directory in place of the one we just moved so that - # `TemporaryDirectory`'s cleanup doesn't complain. - # - # TODO: pass ignore_cleanup_errors=True when we no longer support python < 3.10. - # See https://github.com/python/cpython/issues/74168. Note that passing - # delete=False would do the wrong thing in case of errors and isn't supported - # until python 3.12. - path.mkdir() + cachedir_tag_path = self._cachedir.joinpath("CACHEDIR.TAG") + cachedir_tag_path.write_bytes(CACHEDIR_TAG_CONTENT) class LFPluginCollWrapper: - def __init__(self, lfplugin: LFPlugin) -> None: + def __init__(self, lfplugin: "LFPlugin") -> None: self.lfplugin = lfplugin self._collected_at_least_one_failure = False - @hookimpl(wrapper=True) - def pytest_make_collect_report( - self, collector: nodes.Collector - ) -> Generator[None, CollectReport, CollectReport]: - res = yield - if isinstance(collector, Session | Directory): + @hookimpl(hookwrapper=True) + def pytest_make_collect_report(self, collector: nodes.Collector): + if isinstance(collector, (Session, Package)): + out = yield + res: CollectReport = out.get_result() + # Sort any lf-paths to the beginning. lf_paths = self.lfplugin._last_failed_paths - # Use stable sort to prioritize last failed. - def sort_key(node: nodes.Item | nodes.Collector) -> bool: - return node.path in lf_paths + # Use stable sort to priorize last failed. + def sort_key(node: Union[nodes.Item, nodes.Collector]) -> bool: + # Package.path is the __init__.py file, we need the directory. + if isinstance(node, Package): + path = node.path.parent + else: + path = node.path + return path in lf_paths res.result = sorted( res.result, key=sort_key, reverse=True, ) + return elif isinstance(collector, File): if collector.path in self.lfplugin._last_failed_paths: + out = yield + res = out.get_result() result = res.result lastfailed = self.lfplugin.lastfailed # Only filter with known failures. if not self._collected_at_least_one_failure: if not any(x.nodeid in lastfailed for x in result): - return res + return self.lfplugin.config.pluginmanager.register( LFPluginCollSkipfiles(self.lfplugin), "lfplugin-collskip" ) @@ -294,19 +268,21 @@ class LFPluginCollWrapper: # Keep all sub-collectors. or isinstance(x, nodes.Collector) ] - - return res + return + yield class LFPluginCollSkipfiles: - def __init__(self, lfplugin: LFPlugin) -> None: + def __init__(self, lfplugin: "LFPlugin") -> None: self.lfplugin = lfplugin @hookimpl def pytest_make_collect_report( self, collector: nodes.Collector - ) -> CollectReport | None: - if isinstance(collector, File): + ) -> Optional[CollectReport]: + # Packages are Files, but we only want to skip test-bearing Files, + # so don't filter Packages. + if isinstance(collector, File) and not isinstance(collector, Package): if collector.path not in self.lfplugin._last_failed_paths: self.lfplugin._skipped_files += 1 @@ -324,9 +300,9 @@ class LFPlugin: active_keys = "lf", "failedfirst" self.active = any(config.getoption(key) for key in active_keys) assert config.cache - self.lastfailed: dict[str, bool] = config.cache.get("cache/lastfailed", {}) - self._previously_failed_count: int | None = None - self._report_status: str | None = None + self.lastfailed: Dict[str, bool] = config.cache.get("cache/lastfailed", {}) + self._previously_failed_count: Optional[int] = None + self._report_status: Optional[str] = None self._skipped_files = 0 # count skipped files during collection due to --lf if config.getoption("lf"): @@ -335,7 +311,7 @@ class LFPlugin: LFPluginCollWrapper(self), "lfplugin-collwrapper" ) - def get_last_failed_paths(self) -> set[Path]: + def get_last_failed_paths(self) -> Set[Path]: """Return a set with all Paths of the previously failed nodeids and their parents.""" rootpath = self.config.rootpath @@ -346,9 +322,9 @@ class LFPlugin: result.update(path.parents) return {x for x in result if x.exists()} - def pytest_report_collectionfinish(self) -> str | None: - if self.active and self.config.get_verbosity() >= 0: - return f"run-last-failure: {self._report_status}" + def pytest_report_collectionfinish(self) -> Optional[str]: + if self.active and self.config.getoption("verbose") >= 0: + return "run-last-failure: %s" % self._report_status return None def pytest_runtest_logreport(self, report: TestReport) -> None: @@ -366,14 +342,14 @@ class LFPlugin: else: self.lastfailed[report.nodeid] = True - @hookimpl(wrapper=True, tryfirst=True) + @hookimpl(hookwrapper=True, tryfirst=True) def pytest_collection_modifyitems( - self, config: Config, items: list[nodes.Item] - ) -> Generator[None]: - res = yield + self, config: Config, items: List[nodes.Item] + ) -> Generator[None, None, None]: + yield if not self.active: - return res + return if self.lastfailed: previously_failed = [] @@ -388,8 +364,8 @@ class LFPlugin: if not previously_failed: # Running a subset of all tests with recorded failures # only outside of it. - self._report_status = ( - f"{len(self.lastfailed)} known failures not in selected tests" + self._report_status = "%d known failures not in selected tests" % ( + len(self.lastfailed), ) else: if self.config.getoption("lf"): @@ -400,13 +376,15 @@ class LFPlugin: noun = "failure" if self._previously_failed_count == 1 else "failures" suffix = " first" if self.config.getoption("failedfirst") else "" - self._report_status = ( - f"rerun previous {self._previously_failed_count} {noun}{suffix}" + self._report_status = "rerun previous {count} {noun}{suffix}".format( + count=self._previously_failed_count, suffix=suffix, noun=noun ) if self._skipped_files > 0: files_noun = "file" if self._skipped_files == 1 else "files" - self._report_status += f" (skipped {self._skipped_files} {files_noun})" + self._report_status += " (skipped {files} {files_noun})".format( + files=self._skipped_files, files_noun=files_noun + ) else: self._report_status = "no previously failed tests, " if self.config.getoption("last_failed_no_failures") == "none": @@ -416,8 +394,6 @@ class LFPlugin: else: self._report_status += "not deselecting items." - return res - def pytest_sessionfinish(self, session: Session) -> None: config = self.config if config.getoption("cacheshow") or hasattr(config, "workerinput"): @@ -438,13 +414,15 @@ class NFPlugin: assert config.cache is not None self.cached_nodeids = set(config.cache.get("cache/nodeids", [])) - @hookimpl(wrapper=True, tryfirst=True) - def pytest_collection_modifyitems(self, items: list[nodes.Item]) -> Generator[None]: - res = yield + @hookimpl(hookwrapper=True, tryfirst=True) + def pytest_collection_modifyitems( + self, items: List[nodes.Item] + ) -> Generator[None, None, None]: + yield if self.active: - new_items: dict[str, nodes.Item] = {} - other_items: dict[str, nodes.Item] = {} + new_items: Dict[str, nodes.Item] = {} + other_items: Dict[str, nodes.Item] = {} for item in items: if item.nodeid not in self.cached_nodeids: new_items[item.nodeid] = item @@ -458,10 +436,8 @@ class NFPlugin: else: self.cached_nodeids.update(item.nodeid for item in items) - return res - - def _get_increasing_order(self, items: Iterable[nodes.Item]) -> list[nodes.Item]: - return sorted(items, key=lambda item: item.path.stat().st_mtime, reverse=True) + def _get_increasing_order(self, items: Iterable[nodes.Item]) -> List[nodes.Item]: + return sorted(items, key=lambda item: item.path.stat().st_mtime, reverse=True) # type: ignore[no-any-return] def pytest_sessionfinish(self) -> None: config = self.config @@ -476,17 +452,14 @@ class NFPlugin: def pytest_addoption(parser: Parser) -> None: - """Add command-line options for cache functionality. - - :param parser: Parser object to add command-line options to. - """ group = parser.getgroup("general") group.addoption( "--lf", "--last-failed", action="store_true", dest="lf", - help="Rerun only the tests that failed at the last run (or all if none failed)", + help="Rerun only the tests that failed " + "at the last run (or all if none failed)", ) group.addoption( "--ff", @@ -540,7 +513,7 @@ def pytest_addoption(parser: Parser) -> None: ) -def pytest_cmdline_main(config: Config) -> int | ExitCode | None: +def pytest_cmdline_main(config: Config) -> Optional[Union[int, ExitCode]]: if config.option.cacheshow and not config.option.help: from _pytest.main import wrap_session @@ -550,13 +523,6 @@ def pytest_cmdline_main(config: Config) -> int | ExitCode | None: @hookimpl(tryfirst=True) def pytest_configure(config: Config) -> None: - """Configure cache system and register related plugins. - - Creates the Cache instance and registers the last-failed (LFPlugin) - and new-first (NFPlugin) plugins with the plugin manager. - - :param config: pytest configuration object. - """ config.cache = Cache.for_config(config, _ispytest=True) config.pluginmanager.register(LFPlugin(config), "lfplugin") config.pluginmanager.register(NFPlugin(config), "nfplugin") @@ -578,7 +544,7 @@ def cache(request: FixtureRequest) -> Cache: return request.config.cache -def pytest_report_header(config: Config) -> str | None: +def pytest_report_header(config: Config) -> Optional[str]: """Display cachedir with --cache-show and if non-default.""" if config.option.verbose > 0 or config.getini("cache_dir") != ".pytest_cache": assert config.cache is not None @@ -595,16 +561,6 @@ def pytest_report_header(config: Config) -> str | None: def cacheshow(config: Config, session: Session) -> int: - """Display cache contents when --cache-show is used. - - Shows cached values and directories matching the specified glob pattern - (default: '*'). Displays cache location, cached test results, and - any cached directories created by plugins. - - :param config: pytest configuration object. - :param session: pytest session object. - :returns: Exit code (0 for success). - """ from pprint import pformat assert config.cache is not None @@ -622,25 +578,25 @@ def cacheshow(config: Config, session: Session) -> int: dummy = object() basedir = config.cache._cachedir vdir = basedir / Cache._CACHE_PREFIX_VALUES - tw.sep("-", f"cache values for {glob!r}") + tw.sep("-", "cache values for %r" % glob) for valpath in sorted(x for x in vdir.rglob(glob) if x.is_file()): key = str(valpath.relative_to(vdir)) val = config.cache.get(key, dummy) if val is dummy: - tw.line(f"{key} contains unreadable content, will be ignored") + tw.line("%s contains unreadable content, will be ignored" % key) else: - tw.line(f"{key} contains:") + tw.line("%s contains:" % key) for line in pformat(val).splitlines(): tw.line(" " + line) ddir = basedir / Cache._CACHE_PREFIX_DIRS if ddir.is_dir(): contents = sorted(ddir.rglob(glob)) - tw.sep("-", f"cache directories for {glob!r}") + tw.sep("-", "cache directories for %r" % glob) for p in contents: # if p.is_dir(): # print("%s/" % p.relative_to(basedir)) if p.is_file(): key = str(p.relative_to(basedir)) - tw.line(f"{key} is a file of length {p.stat().st_size}") + tw.line(f"{key} is a file of length {p.stat().st_size:d}") return 0 diff --git a/Backend/venv/lib/python3.12/site-packages/_pytest/capture.py b/Backend/venv/lib/python3.12/site-packages/_pytest/capture.py index 6d98676b..a8ca0869 100644 --- a/Backend/venv/lib/python3.12/site-packages/_pytest/capture.py +++ b/Backend/venv/lib/python3.12/site-packages/_pytest/capture.py @@ -1,36 +1,30 @@ -# mypy: allow-untyped-defs """Per-test stdout/stderr capturing mechanism.""" - -from __future__ import annotations - import abc import collections -from collections.abc import Generator -from collections.abc import Iterable -from collections.abc import Iterator import contextlib import io -from io import UnsupportedOperation import os import sys +from io import UnsupportedOperation from tempfile import TemporaryFile from types import TracebackType from typing import Any from typing import AnyStr from typing import BinaryIO -from typing import cast -from typing import Final -from typing import final +from typing import Generator from typing import Generic -from typing import Literal +from typing import Iterable +from typing import Iterator +from typing import List from typing import NamedTuple +from typing import Optional from typing import TextIO +from typing import Tuple +from typing import Type from typing import TYPE_CHECKING +from typing import Union - -if TYPE_CHECKING: - from typing_extensions import Self - +from _pytest.compat import final from _pytest.config import Config from _pytest.config import hookimpl from _pytest.config.argparsing import Parser @@ -40,15 +34,17 @@ from _pytest.fixtures import SubRequest from _pytest.nodes import Collector from _pytest.nodes import File from _pytest.nodes import Item -from _pytest.reports import CollectReport +if TYPE_CHECKING: + from typing_extensions import Final + from typing_extensions import Literal -_CaptureMethod = Literal["fd", "sys", "no", "tee-sys"] + _CaptureMethod = Literal["fd", "sys", "no", "tee-sys"] def pytest_addoption(parser: Parser) -> None: group = parser.getgroup("general") - group.addoption( + group._addoption( "--capture", action="store", default="fd", @@ -56,7 +52,7 @@ def pytest_addoption(parser: Parser) -> None: choices=["fd", "sys", "no", "tee-sys"], help="Per-test capturing method: one of fd|sys|no|tee-sys", ) - group._addoption( # private to use reserved lower-case short option + group._addoption( "-s", action="store_const", const="no", @@ -80,23 +76,6 @@ def _colorama_workaround() -> None: pass -def _readline_workaround() -> None: - """Ensure readline is imported early so it attaches to the correct stdio handles. - - This isn't a problem with the default GNU readline implementation, but in - some configurations, Python uses libedit instead (on macOS, and for prebuilt - binaries such as used by uv). - - In theory this is only needed if readline.backend == "libedit", but the - workaround consists of importing readline here, so we already worked around - the issue by the time we could check if we need to. - """ - try: - import readline # noqa: F401 - except ImportError: - pass - - def _windowsconsoleio_workaround(stream: TextIO) -> None: """Workaround for Windows Unicode console handling. @@ -125,16 +104,17 @@ def _windowsconsoleio_workaround(stream: TextIO) -> None: return # Bail out if ``stream`` doesn't seem like a proper ``io`` stream (#2666). - if not hasattr(stream, "buffer"): # type: ignore[unreachable,unused-ignore] + if not hasattr(stream, "buffer"): # type: ignore[unreachable] return - raw_stdout = stream.buffer.raw if hasattr(stream.buffer, "raw") else stream.buffer + buffered = hasattr(stream.buffer, "raw") + raw_stdout = stream.buffer.raw if buffered else stream.buffer # type: ignore[attr-defined] - if not isinstance(raw_stdout, io._WindowsConsoleIO): # type: ignore[attr-defined,unused-ignore] + if not isinstance(raw_stdout, io._WindowsConsoleIO): # type: ignore[attr-defined] return def _reopen_stdio(f, mode): - if not hasattr(stream.buffer, "raw") and mode[0] == "w": + if not buffered and mode[0] == "w": buffering = 0 else: buffering = -1 @@ -152,13 +132,12 @@ def _windowsconsoleio_workaround(stream: TextIO) -> None: sys.stderr = _reopen_stdio(sys.stderr, "wb") -@hookimpl(wrapper=True) -def pytest_load_initial_conftests(early_config: Config) -> Generator[None]: +@hookimpl(hookwrapper=True) +def pytest_load_initial_conftests(early_config: Config): ns = early_config.known_args_namespace if ns.capture == "fd": _windowsconsoleio_workaround(sys.stdout) _colorama_workaround() - _readline_workaround() pluginmanager = early_config.pluginmanager capman = CaptureManager(ns.capture) pluginmanager.register(capman, "capturemanager") @@ -168,16 +147,12 @@ def pytest_load_initial_conftests(early_config: Config) -> Generator[None]: # Finally trigger conftest loading but while capturing (issue #93). capman.start_global_capturing() - try: - try: - yield - finally: - capman.suspend_global_capture() - except BaseException: + outcome = yield + capman.suspend_global_capture() + if outcome.excinfo is not None: out, err = capman.read_global_capture() sys.stdout.write(out) sys.stderr.write(err) - raise # IO Helpers. @@ -196,8 +171,7 @@ class EncodedFile(io.TextIOWrapper): def mode(self) -> str: # TextIOWrapper doesn't expose a mode, but at least some of our # tests check it. - assert hasattr(self.buffer, "mode") - return cast(str, self.buffer.mode.replace("b", "")) + return self.buffer.mode.replace("b", "") class CaptureIO(io.TextIOWrapper): @@ -222,7 +196,6 @@ class TeeCaptureIO(CaptureIO): class DontReadFromInput(TextIO): @property def encoding(self) -> str: - assert sys.__stdin__ is not None return sys.__stdin__.encoding def read(self, size: int = -1) -> str: @@ -235,7 +208,7 @@ class DontReadFromInput(TextIO): def __next__(self) -> str: return self.readline() - def readlines(self, hint: int | None = -1) -> list[str]: + def readlines(self, hint: Optional[int] = -1) -> List[str]: raise OSError( "pytest: reading from stdin while output is captured! Consider using `-s`." ) @@ -267,7 +240,7 @@ class DontReadFromInput(TextIO): def tell(self) -> int: raise UnsupportedOperation("redirected stdin is pseudofile, has no tell()") - def truncate(self, size: int | None = None) -> int: + def truncate(self, size: Optional[int] = None) -> int: raise UnsupportedOperation("cannot truncate stdin") def write(self, data: str) -> int: @@ -279,14 +252,14 @@ class DontReadFromInput(TextIO): def writable(self) -> bool: return False - def __enter__(self) -> Self: + def __enter__(self) -> "DontReadFromInput": return self def __exit__( self, - type: type[BaseException] | None, - value: BaseException | None, - traceback: TracebackType | None, + type: Optional[Type[BaseException]], + value: Optional[BaseException], + traceback: Optional[TracebackType], ) -> None: pass @@ -361,7 +334,7 @@ class NoCapture(CaptureBase[str]): class SysCaptureBase(CaptureBase[AnyStr]): def __init__( - self, fd: int, tmpfile: TextIO | None = None, *, tee: bool = False + self, fd: int, tmpfile: Optional[TextIO] = None, *, tee: bool = False ) -> None: name = patchsysdict[fd] self._old: TextIO = getattr(sys, name) @@ -378,7 +351,7 @@ class SysCaptureBase(CaptureBase[AnyStr]): return "<{} {} _old={} _state={!r} tmpfile={!r}>".format( class_name, self.name, - (hasattr(self, "_old") and repr(self._old)) or "", + hasattr(self, "_old") and repr(self._old) or "", self._state, self.tmpfile, ) @@ -387,16 +360,16 @@ class SysCaptureBase(CaptureBase[AnyStr]): return "<{} {} _old={} _state={!r} tmpfile={!r}>".format( self.__class__.__name__, self.name, - (hasattr(self, "_old") and repr(self._old)) or "", + hasattr(self, "_old") and repr(self._old) or "", self._state, self.tmpfile, ) - def _assert_state(self, op: str, states: tuple[str, ...]) -> None: - assert self._state in states, ( - "cannot {} in state {!r}: expected one of {}".format( - op, self._state, ", ".join(states) - ) + def _assert_state(self, op: str, states: Tuple[str, ...]) -> None: + assert ( + self._state in states + ), "cannot {} in state {!r}: expected one of {}".format( + op, self._state, ", ".join(states) ) def start(self) -> None: @@ -479,7 +452,7 @@ class FDCaptureBase(CaptureBase[AnyStr]): # Further complications are the need to support suspend() and the # possibility of FD reuse (e.g. the tmpfile getting the very same # target FD). The following approach is robust, I believe. - self.targetfd_invalid: int | None = os.open(os.devnull, os.O_RDWR) + self.targetfd_invalid: Optional[int] = os.open(os.devnull, os.O_RDWR) os.dup2(self.targetfd_invalid, targetfd) else: self.targetfd_invalid = None @@ -504,16 +477,19 @@ class FDCaptureBase(CaptureBase[AnyStr]): self._state = "initialized" def __repr__(self) -> str: - return ( - f"<{self.__class__.__name__} {self.targetfd} oldfd={self.targetfd_save} " - f"_state={self._state!r} tmpfile={self.tmpfile!r}>" + return "<{} {} oldfd={} _state={!r} tmpfile={!r}>".format( + self.__class__.__name__, + self.targetfd, + self.targetfd_save, + self._state, + self.tmpfile, ) - def _assert_state(self, op: str, states: tuple[str, ...]) -> None: - assert self._state in states, ( - "cannot {} in state {!r}: expected one of {}".format( - op, self._state, ", ".join(states) - ) + def _assert_state(self, op: str, states: Tuple[str, ...]) -> None: + assert ( + self._state in states + ), "cannot {} in state {!r}: expected one of {}".format( + op, self._state, ", ".join(states) ) def start(self) -> None: @@ -570,7 +546,7 @@ class FDCaptureBinary(FDCaptureBase[bytes]): res = self.tmpfile.buffer.read() self.tmpfile.seek(0) self.tmpfile.truncate() - return res # type: ignore[return-value] + return res def writeorg(self, data: bytes) -> None: """Write to original file descriptor.""" @@ -609,7 +585,7 @@ if sys.version_info >= (3, 11) or TYPE_CHECKING: @final class CaptureResult(NamedTuple, Generic[AnyStr]): - """The result of :method:`caplog.readouterr() `.""" + """The result of :method:`CaptureFixture.readouterr`.""" out: AnyStr err: AnyStr @@ -617,10 +593,9 @@ if sys.version_info >= (3, 11) or TYPE_CHECKING: else: class CaptureResult( - collections.namedtuple("CaptureResult", ["out", "err"]), # noqa: PYI024 - Generic[AnyStr], + collections.namedtuple("CaptureResult", ["out", "err"]), Generic[AnyStr] ): - """The result of :method:`caplog.readouterr() `.""" + """The result of :method:`CaptureFixture.readouterr`.""" __slots__ = () @@ -631,18 +606,21 @@ class MultiCapture(Generic[AnyStr]): def __init__( self, - in_: CaptureBase[AnyStr] | None, - out: CaptureBase[AnyStr] | None, - err: CaptureBase[AnyStr] | None, + in_: Optional[CaptureBase[AnyStr]], + out: Optional[CaptureBase[AnyStr]], + err: Optional[CaptureBase[AnyStr]], ) -> None: - self.in_: CaptureBase[AnyStr] | None = in_ - self.out: CaptureBase[AnyStr] | None = out - self.err: CaptureBase[AnyStr] | None = err + self.in_: Optional[CaptureBase[AnyStr]] = in_ + self.out: Optional[CaptureBase[AnyStr]] = out + self.err: Optional[CaptureBase[AnyStr]] = err def __repr__(self) -> str: - return ( - f"" + return "".format( + self.out, + self.err, + self.in_, + self._state, + self._in_suspended, ) def start_capturing(self) -> None: @@ -654,7 +632,7 @@ class MultiCapture(Generic[AnyStr]): if self.err: self.err.start() - def pop_outerr_to_orig(self) -> tuple[AnyStr, AnyStr]: + def pop_outerr_to_orig(self) -> Tuple[AnyStr, AnyStr]: """Pop current snapshot out/err capture and flush to orig streams.""" out, err = self.readouterr() if out: @@ -709,7 +687,7 @@ class MultiCapture(Generic[AnyStr]): return CaptureResult(out, err) # type: ignore[arg-type] -def _get_multicapture(method: _CaptureMethod) -> MultiCapture[str]: +def _get_multicapture(method: "_CaptureMethod") -> MultiCapture[str]: if method == "fd": return MultiCapture(in_=FDCapture(0), out=FDCapture(1), err=FDCapture(2)) elif method == "sys": @@ -745,22 +723,21 @@ class CaptureManager: needed to ensure the fixtures take precedence over the global capture. """ - def __init__(self, method: _CaptureMethod) -> None: + def __init__(self, method: "_CaptureMethod") -> None: self._method: Final = method - self._global_capturing: MultiCapture[str] | None = None - self._capture_fixture: CaptureFixture[Any] | None = None + self._global_capturing: Optional[MultiCapture[str]] = None + self._capture_fixture: Optional[CaptureFixture[Any]] = None def __repr__(self) -> str: - return ( - f"" + return "".format( + self._method, self._global_capturing, self._capture_fixture ) - def is_capturing(self) -> str | bool: + def is_capturing(self) -> Union[str, bool]: if self.is_globally_capturing(): return "global" if self._capture_fixture: - return f"fixture {self._capture_fixture.request.fixturename}" + return "fixture %s" % self._capture_fixture.request.fixturename return False # Global capturing control @@ -804,12 +781,14 @@ class CaptureManager: # Fixture Control - def set_fixture(self, capture_fixture: CaptureFixture[Any]) -> None: + def set_fixture(self, capture_fixture: "CaptureFixture[Any]") -> None: if self._capture_fixture: current_fixture = self._capture_fixture.request.fixturename requested_fixture = capture_fixture.request.fixturename capture_fixture.request.raiseerror( - f"cannot use {requested_fixture} and {current_fixture} at the same time" + "cannot use {} and {} at the same time".format( + requested_fixture, current_fixture + ) ) self._capture_fixture = capture_fixture @@ -838,7 +817,7 @@ class CaptureManager: # Helper context managers @contextlib.contextmanager - def global_and_fixture_disabled(self) -> Generator[None]: + def global_and_fixture_disabled(self) -> Generator[None, None, None]: """Context manager to temporarily disable global and current fixture capturing.""" do_fixture = self._capture_fixture and self._capture_fixture._is_started() if do_fixture: @@ -855,7 +834,7 @@ class CaptureManager: self.resume_fixture() @contextlib.contextmanager - def item_capture(self, when: str, item: Item) -> Generator[None]: + def item_capture(self, when: str, item: Item) -> Generator[None, None, None]: self.resume_global_capture() self.activate_fixture() try: @@ -864,45 +843,41 @@ class CaptureManager: self.deactivate_fixture() self.suspend_global_capture(in_=False) - out, err = self.read_global_capture() - item.add_report_section(when, "stdout", out) - item.add_report_section(when, "stderr", err) + out, err = self.read_global_capture() + item.add_report_section(when, "stdout", out) + item.add_report_section(when, "stderr", err) # Hooks - @hookimpl(wrapper=True) - def pytest_make_collect_report( - self, collector: Collector - ) -> Generator[None, CollectReport, CollectReport]: + @hookimpl(hookwrapper=True) + def pytest_make_collect_report(self, collector: Collector): if isinstance(collector, File): self.resume_global_capture() - try: - rep = yield - finally: - self.suspend_global_capture() + outcome = yield + self.suspend_global_capture() out, err = self.read_global_capture() + rep = outcome.get_result() if out: rep.sections.append(("Captured stdout", out)) if err: rep.sections.append(("Captured stderr", err)) else: - rep = yield - return rep + yield - @hookimpl(wrapper=True) - def pytest_runtest_setup(self, item: Item) -> Generator[None]: + @hookimpl(hookwrapper=True) + def pytest_runtest_setup(self, item: Item) -> Generator[None, None, None]: with self.item_capture("setup", item): - return (yield) + yield - @hookimpl(wrapper=True) - def pytest_runtest_call(self, item: Item) -> Generator[None]: + @hookimpl(hookwrapper=True) + def pytest_runtest_call(self, item: Item) -> Generator[None, None, None]: with self.item_capture("call", item): - return (yield) + yield - @hookimpl(wrapper=True) - def pytest_runtest_teardown(self, item: Item) -> Generator[None]: + @hookimpl(hookwrapper=True) + def pytest_runtest_teardown(self, item: Item) -> Generator[None, None, None]: with self.item_capture("teardown", item): - return (yield) + yield @hookimpl(tryfirst=True) def pytest_keyboard_interrupt(self) -> None: @@ -919,17 +894,15 @@ class CaptureFixture(Generic[AnyStr]): def __init__( self, - captureclass: type[CaptureBase[AnyStr]], + captureclass: Type[CaptureBase[AnyStr]], request: SubRequest, *, - config: dict[str, Any] | None = None, _ispytest: bool = False, ) -> None: check_ispytest(_ispytest) - self.captureclass: type[CaptureBase[AnyStr]] = captureclass + self.captureclass: Type[CaptureBase[AnyStr]] = captureclass self.request = request - self._config = config if config else {} - self._capture: MultiCapture[AnyStr] | None = None + self._capture: Optional[MultiCapture[AnyStr]] = None self._captured_out: AnyStr = self.captureclass.EMPTY_BUFFER self._captured_err: AnyStr = self.captureclass.EMPTY_BUFFER @@ -937,8 +910,8 @@ class CaptureFixture(Generic[AnyStr]): if self._capture is None: self._capture = MultiCapture( in_=None, - out=self.captureclass(1, **self._config), - err=self.captureclass(2, **self._config), + out=self.captureclass(1), + err=self.captureclass(2), ) self._capture.start_capturing() @@ -984,7 +957,7 @@ class CaptureFixture(Generic[AnyStr]): return False @contextlib.contextmanager - def disabled(self) -> Generator[None]: + def disabled(self) -> Generator[None, None, None]: """Temporarily disable capturing while inside the ``with`` block.""" capmanager: CaptureManager = self.request.config.pluginmanager.getplugin( "capturemanager" @@ -997,7 +970,7 @@ class CaptureFixture(Generic[AnyStr]): @fixture -def capsys(request: SubRequest) -> Generator[CaptureFixture[str]]: +def capsys(request: SubRequest) -> Generator[CaptureFixture[str], None, None]: r"""Enable text capturing of writes to ``sys.stdout`` and ``sys.stderr``. The captured output is made available via ``capsys.readouterr()`` method @@ -1025,42 +998,7 @@ def capsys(request: SubRequest) -> Generator[CaptureFixture[str]]: @fixture -def capteesys(request: SubRequest) -> Generator[CaptureFixture[str]]: - r"""Enable simultaneous text capturing and pass-through of writes - to ``sys.stdout`` and ``sys.stderr`` as defined by ``--capture=``. - - - The captured output is made available via ``capteesys.readouterr()`` method - calls, which return a ``(out, err)`` namedtuple. - ``out`` and ``err`` will be ``text`` objects. - - The output is also passed-through, allowing it to be "live-printed", - reported, or both as defined by ``--capture=``. - - Returns an instance of :class:`CaptureFixture[str] `. - - Example: - - .. code-block:: python - - def test_output(capteesys): - print("hello") - captured = capteesys.readouterr() - assert captured.out == "hello\n" - """ - capman: CaptureManager = request.config.pluginmanager.getplugin("capturemanager") - capture_fixture = CaptureFixture( - SysCapture, request, config=dict(tee=True), _ispytest=True - ) - capman.set_fixture(capture_fixture) - capture_fixture._start() - yield capture_fixture - capture_fixture.close() - capman.unset_fixture() - - -@fixture -def capsysbinary(request: SubRequest) -> Generator[CaptureFixture[bytes]]: +def capsysbinary(request: SubRequest) -> Generator[CaptureFixture[bytes], None, None]: r"""Enable bytes capturing of writes to ``sys.stdout`` and ``sys.stderr``. The captured output is made available via ``capsysbinary.readouterr()`` @@ -1088,7 +1026,7 @@ def capsysbinary(request: SubRequest) -> Generator[CaptureFixture[bytes]]: @fixture -def capfd(request: SubRequest) -> Generator[CaptureFixture[str]]: +def capfd(request: SubRequest) -> Generator[CaptureFixture[str], None, None]: r"""Enable text capturing of writes to file descriptors ``1`` and ``2``. The captured output is made available via ``capfd.readouterr()`` method @@ -1116,7 +1054,7 @@ def capfd(request: SubRequest) -> Generator[CaptureFixture[str]]: @fixture -def capfdbinary(request: SubRequest) -> Generator[CaptureFixture[bytes]]: +def capfdbinary(request: SubRequest) -> Generator[CaptureFixture[bytes], None, None]: r"""Enable bytes capturing of writes to file descriptors ``1`` and ``2``. The captured output is made available via ``capfd.readouterr()`` method diff --git a/Backend/venv/lib/python3.12/site-packages/_pytest/compat.py b/Backend/venv/lib/python3.12/site-packages/_pytest/compat.py index 72c3d091..1d0add73 100644 --- a/Backend/venv/lib/python3.12/site-packages/_pytest/compat.py +++ b/Backend/venv/lib/python3.12/site-packages/_pytest/compat.py @@ -1,28 +1,41 @@ -# mypy: allow-untyped-defs -"""Python version compatibility code and random general utilities.""" - +"""Python version compatibility code.""" from __future__ import annotations -from collections.abc import Callable +import dataclasses import enum import functools import inspect -from inspect import Parameter -from inspect import Signature import os -from pathlib import Path import sys +from inspect import Parameter +from inspect import signature +from pathlib import Path from typing import Any -from typing import Final +from typing import Callable +from typing import Generic from typing import NoReturn +from typing import TYPE_CHECKING +from typing import TypeVar import py +# fmt: off +# Workaround for https://github.com/sphinx-doc/sphinx/issues/10351. +# If `overload` is imported from `compat` instead of from `typing`, +# Sphinx doesn't recognize it as `overload` and the API docs for +# overloaded functions look good again. But type checkers handle +# it fine. +# fmt: on +if True: + from typing import overload as overload -if sys.version_info >= (3, 14): - from annotationlib import Format +if TYPE_CHECKING: + from typing_extensions import Final +_T = TypeVar("_T") +_S = TypeVar("_S") + #: constant to prepare valuing pylib path replacements/lazy proxies later on # intended for removal in pytest 8.0 or 9.0 @@ -42,16 +55,32 @@ def legacy_path(path: str | os.PathLike[str]) -> LEGACY_PATH: # https://www.python.org/dev/peps/pep-0484/#support-for-singleton-types-in-unions class NotSetType(enum.Enum): token = 0 -NOTSET: Final = NotSetType.token +NOTSET: Final = NotSetType.token # noqa: E305 # fmt: on +if sys.version_info >= (3, 8): + import importlib.metadata + + importlib_metadata = importlib.metadata +else: + import importlib_metadata as importlib_metadata # noqa: F401 + + +def _format_args(func: Callable[..., Any]) -> str: + return str(signature(func)) + + +def is_generator(func: object) -> bool: + genfunc = inspect.isgeneratorfunction(func) + return genfunc and not iscoroutinefunction(func) + def iscoroutinefunction(func: object) -> bool: """Return True if func is a coroutine function (a function defined with async def syntax, and doesn't contain yield), or a function decorated with @asyncio.coroutine. - Note: copied and modified from Python 3.5's builtin coroutines.py to avoid + Note: copied and modified from Python 3.5's builtin couroutines.py to avoid importing asyncio directly, which in turns also initializes the "logging" module as a side-effect (see issue #8). """ @@ -64,14 +93,7 @@ def is_async_function(func: object) -> bool: return iscoroutinefunction(func) or inspect.isasyncgenfunction(func) -def signature(obj: Callable[..., Any]) -> Signature: - """Return signature without evaluating annotations.""" - if sys.version_info >= (3, 14): - return inspect.signature(obj, annotation_format=Format.STRING) - return inspect.signature(obj) - - -def getlocation(function, curdir: str | os.PathLike[str] | None = None) -> str: +def getlocation(function, curdir: str | None = None) -> str: function = get_real_func(function) fn = Path(inspect.getfile(function)) lineno = function.__code__.co_firstlineno @@ -81,8 +103,8 @@ def getlocation(function, curdir: str | os.PathLike[str] | None = None) -> str: except ValueError: pass else: - return f"{relfn}:{lineno + 1}" - return f"{fn}:{lineno + 1}" + return "%s:%d" % (relfn, lineno + 1) + return "%s:%d" % (fn, lineno + 1) def num_mock_patch_args(function) -> int: @@ -105,9 +127,10 @@ def num_mock_patch_args(function) -> int: def getfuncargnames( - function: Callable[..., object], + function: Callable[..., Any], *, name: str = "", + is_method: bool = False, cls: type | None = None, ) -> tuple[str, ...]: """Return the names of a function's mandatory arguments. @@ -118,8 +141,9 @@ def getfuncargnames( * Aren't bound with functools.partial. * Aren't replaced with mocks. - The cls arguments indicate that the function should be treated as a bound - method even though it's not unless the function is a static method. + The is_method and cls arguments indicate that the function should + be treated as a bound method even though it's not unless, only in + the case of cls, the function is a static method. The name parameter should be the original name in which the function was collected. """ @@ -133,7 +157,7 @@ def getfuncargnames( # creates a tuple of the names of the parameters that don't have # defaults. try: - parameters = signature(function).parameters.values() + parameters = signature(function).parameters except (ValueError, TypeError) as e: from _pytest.outcomes import fail @@ -144,7 +168,7 @@ def getfuncargnames( arg_names = tuple( p.name - for p in parameters + for p in parameters.values() if ( p.kind is Parameter.POSITIONAL_OR_KEYWORD or p.kind is Parameter.KEYWORD_ONLY @@ -155,9 +179,9 @@ def getfuncargnames( name = function.__name__ # If this function should be treated as a bound method even though - # it's passed as an unbound method or function, and its first parameter - # wasn't defined as positional only, remove the first parameter name. - if not any(p.kind is Parameter.POSITIONAL_ONLY for p in parameters) and ( + # it's passed as an unbound method or function, remove the first + # parameter name. + if is_method or ( # Not using `getattr` because we don't want to resolve the staticmethod. # Not using `cls.__dict__` because we want to check the entire MRO. cls @@ -192,13 +216,25 @@ _non_printable_ascii_translate_table.update( ) +def _translate_non_printable(s: str) -> str: + return s.translate(_non_printable_ascii_translate_table) + + +STRING_TYPES = bytes, str + + +def _bytes_to_ascii(val: bytes) -> str: + return val.decode("ascii", "backslashreplace") + + def ascii_escaped(val: bytes | str) -> str: r"""If val is pure ASCII, return it as an str, otherwise, escape bytes objects into a sequence of escaped bytes: b'\xc3\xb4\xc5\xd6' -> r'\xc3\xb4\xc5\xd6' - and escapes strings into a sequence of escaped unicode ids, e.g.: + and escapes unicode objects into a sequence of escaped unicode + ids, e.g.: r'4\nV\U00043efa\x0eMXWB\x1e\u3028\u15fd\xcd\U0007d944' @@ -209,22 +245,67 @@ def ascii_escaped(val: bytes | str) -> str: a UTF-8 string. """ if isinstance(val, bytes): - ret = val.decode("ascii", "backslashreplace") + ret = _bytes_to_ascii(val) else: ret = val.encode("unicode_escape").decode("ascii") - return ret.translate(_non_printable_ascii_translate_table) + return _translate_non_printable(ret) + + +@dataclasses.dataclass +class _PytestWrapper: + """Dummy wrapper around a function object for internal use only. + + Used to correctly unwrap the underlying function object when we are + creating fixtures, because we wrap the function object ourselves with a + decorator to issue warnings when the fixture function is called directly. + """ + + obj: Any def get_real_func(obj): """Get the real function object of the (possibly) wrapped object by - :func:`functools.wraps`, or :func:`functools.partial`.""" - obj = inspect.unwrap(obj) + functools.wraps or functools.partial.""" + start_obj = obj + for i in range(100): + # __pytest_wrapped__ is set by @pytest.fixture when wrapping the fixture function + # to trigger a warning if it gets called directly instead of by pytest: we don't + # want to unwrap further than this otherwise we lose useful wrappings like @mock.patch (#3774) + new_obj = getattr(obj, "__pytest_wrapped__", None) + if isinstance(new_obj, _PytestWrapper): + obj = new_obj.obj + break + new_obj = getattr(obj, "__wrapped__", None) + if new_obj is None: + break + obj = new_obj + else: + from _pytest._io.saferepr import saferepr + raise ValueError( + ("could not find real function of {start}\nstopped at {current}").format( + start=saferepr(start_obj), current=saferepr(obj) + ) + ) if isinstance(obj, functools.partial): obj = obj.func return obj +def get_real_method(obj, holder): + """Attempt to obtain the real function object that might be wrapping + ``obj``, while at the same time returning a bound method to ``holder`` if + the original object was a bound method.""" + try: + is_method = hasattr(obj, "__func__") + obj = get_real_func(obj) + except Exception: # pragma: no cover + return obj + if is_method and hasattr(obj, "__get__") and callable(obj.__get__): + obj = obj.__get__(holder) + return obj + + def getimfunc(func): try: return func.__func__ @@ -257,6 +338,47 @@ def safe_isclass(obj: object) -> bool: return False +if TYPE_CHECKING: + if sys.version_info >= (3, 8): + from typing import final as final + else: + from typing_extensions import final as final +elif sys.version_info >= (3, 8): + from typing import final as final +else: + + def final(f): + return f + + +if sys.version_info >= (3, 8): + from functools import cached_property as cached_property +else: + + class cached_property(Generic[_S, _T]): + __slots__ = ("func", "__doc__") + + def __init__(self, func: Callable[[_S], _T]) -> None: + self.func = func + self.__doc__ = func.__doc__ + + @overload + def __get__( + self, instance: None, owner: type[_S] | None = ... + ) -> cached_property[_S, _T]: + ... + + @overload + def __get__(self, instance: _S, owner: type[_S] | None = ...) -> _T: + ... + + def __get__(self, instance, owner=None): + if instance is None: + return self + value = instance.__dict__[self.func.__name__] = self.func(instance) + return value + + def get_user_id() -> int | None: """Return the current process's real user id or None if it could not be determined. @@ -278,37 +400,36 @@ def get_user_id() -> int | None: return uid if uid != ERROR else None -if sys.version_info >= (3, 11): - from typing import assert_never -else: - - def assert_never(value: NoReturn) -> NoReturn: - assert False, f"Unhandled value: {value} ({type(value).__name__})" - - -class CallableBool: - """ - A bool-like object that can also be called, returning its true/false value. - - Used for backwards compatibility in cases where something was supposed to be a method - but was implemented as a simple attribute by mistake (see `TerminalReporter.isatty`). - - Do not use in new code. - """ - - def __init__(self, value: bool) -> None: - self._value = value - - def __bool__(self) -> bool: - return self._value - - def __call__(self) -> bool: - return self._value - - -def running_on_ci() -> bool: - """Check if we're currently running on a CI system.""" - # Only enable CI mode if one of these env variables is defined and non-empty. - # Note: review `regendoc` tox env in case this list is changed. - env_vars = ["CI", "BUILD_NUMBER"] - return any(os.environ.get(var) for var in env_vars) +# Perform exhaustiveness checking. +# +# Consider this example: +# +# MyUnion = Union[int, str] +# +# def handle(x: MyUnion) -> int { +# if isinstance(x, int): +# return 1 +# elif isinstance(x, str): +# return 2 +# else: +# raise Exception('unreachable') +# +# Now suppose we add a new variant: +# +# MyUnion = Union[int, str, bytes] +# +# After doing this, we must remember ourselves to go and update the handle +# function to handle the new variant. +# +# With `assert_never` we can do better: +# +# // raise Exception('unreachable') +# return assert_never(x) +# +# Now, if we forget to handle the new variant, the type-checker will emit a +# compile-time error, instead of the runtime error we would have gotten +# previously. +# +# This also work for Enums (if you use `is` to compare) and Literals. +def assert_never(value: NoReturn) -> NoReturn: + assert False, f"Unhandled value: {value} ({type(value).__name__})" diff --git a/Backend/venv/lib/python3.12/site-packages/_pytest/config/__init__.py b/Backend/venv/lib/python3.12/site-packages/_pytest/config/__init__.py index 9b2afe3e..e3990d17 100644 --- a/Backend/venv/lib/python3.12/site-packages/_pytest/config/__init__.py +++ b/Backend/venv/lib/python3.12/site-packages/_pytest/config/__init__.py @@ -1,65 +1,55 @@ -# mypy: allow-untyped-defs -"""Command line options, config-file and conftest.py processing.""" - -from __future__ import annotations - +"""Command line options, ini-file and conftest.py processing.""" import argparse -import builtins import collections.abc -from collections.abc import Callable -from collections.abc import Generator -from collections.abc import Iterable -from collections.abc import Iterator -from collections.abc import Mapping -from collections.abc import Sequence -import contextlib import copy import dataclasses import enum -from functools import lru_cache import glob -import importlib.metadata import inspect import os -import pathlib import re import shlex import sys -from textwrap import dedent import types -from types import FunctionType -from typing import Any -from typing import cast -from typing import Final -from typing import final -from typing import IO -from typing import TextIO -from typing import TYPE_CHECKING import warnings +from functools import lru_cache +from pathlib import Path +from textwrap import dedent +from types import FunctionType +from types import TracebackType +from typing import Any +from typing import Callable +from typing import cast +from typing import Dict +from typing import Generator +from typing import IO +from typing import Iterable +from typing import Iterator +from typing import List +from typing import Optional +from typing import Sequence +from typing import Set +from typing import TextIO +from typing import Tuple +from typing import Type +from typing import TYPE_CHECKING +from typing import Union -import pluggy from pluggy import HookimplMarker -from pluggy import HookimplOpts from pluggy import HookspecMarker -from pluggy import HookspecOpts from pluggy import PluginManager -from .compat import PathAwareHookProxy +import _pytest._code +import _pytest.deprecated +import _pytest.hookspec from .exceptions import PrintHelp as PrintHelp from .exceptions import UsageError as UsageError from .findpaths import determine_setup -from _pytest import __version__ -import _pytest._code from _pytest._code import ExceptionInfo from _pytest._code import filter_traceback -from _pytest._code.code import TracebackStyle from _pytest._io import TerminalWriter -from _pytest.compat import assert_never -from _pytest.config.argparsing import Argument -from _pytest.config.argparsing import FILE_OR_DIR -from _pytest.config.argparsing import Parser -import _pytest.deprecated -import _pytest.hookspec +from _pytest.compat import final +from _pytest.compat import importlib_metadata # type: ignore[attr-defined] from _pytest.outcomes import fail from _pytest.outcomes import Skipped from _pytest.pathlib import absolutepath @@ -72,11 +62,11 @@ from _pytest.stash import Stash from _pytest.warning_types import PytestConfigWarning from _pytest.warning_types import warn_explicit_for - if TYPE_CHECKING: - from _pytest.assertion.rewrite import AssertionRewritingHook - from _pytest.cacheprovider import Cache + from _pytest._code.code import _TracebackStyle from _pytest.terminal import TerminalReporter + from .argparsing import Argument + _PluggyPlugin = object """A type to represent plugin objects. @@ -114,21 +104,21 @@ class ExitCode(enum.IntEnum): #: pytest couldn't find tests. NO_TESTS_COLLECTED = 5 - __module__ = "pytest" - class ConftestImportFailure(Exception): def __init__( self, - path: pathlib.Path, - *, - cause: Exception, + path: Path, + excinfo: Tuple[Type[Exception], Exception, TracebackType], ) -> None: + super().__init__(path, excinfo) self.path = path - self.cause = cause + self.excinfo = excinfo def __str__(self) -> str: - return f"{type(self.cause).__name__}: {self.cause} (from {self.path})" + return "{}: {} (from {})".format( + self.excinfo[0].__name__, self.excinfo[1], self.path + ) def filter_traceback_for_conftest_import_failure( @@ -142,33 +132,10 @@ def filter_traceback_for_conftest_import_failure( return filter_traceback(entry) and "importlib" not in str(entry.path).split(os.sep) -def print_conftest_import_error(e: ConftestImportFailure, file: TextIO) -> None: - exc_info = ExceptionInfo.from_exception(e.cause) - tw = TerminalWriter(file) - tw.line(f"ImportError while loading conftest '{e.path}'.", red=True) - exc_info.traceback = exc_info.traceback.filter( - filter_traceback_for_conftest_import_failure - ) - exc_repr = ( - exc_info.getrepr(style="short", chain=False) - if exc_info.traceback - else exc_info.exconly() - ) - formatted_tb = str(exc_repr) - for line in formatted_tb.splitlines(): - tw.line(line.rstrip(), red=True) - - -def print_usage_error(e: UsageError, file: TextIO) -> None: - tw = TerminalWriter(file) - for msg in e.args: - tw.line(f"ERROR: {msg}\n", red=True) - - def main( - args: list[str] | os.PathLike[str] | None = None, - plugins: Sequence[str | _PluggyPlugin] | None = None, -) -> int | ExitCode: + args: Optional[Union[List[str], "os.PathLike[str]"]] = None, + plugins: Optional[Sequence[Union[str, _PluggyPlugin]]] = None, +) -> Union[int, ExitCode]: """Perform an in-process test run. :param args: @@ -178,37 +145,41 @@ def main( :returns: An exit code. """ - # Handle a single `--version` argument early to avoid starting up the entire pytest infrastructure. - new_args = sys.argv[1:] if args is None else args - if isinstance(new_args, Sequence) and new_args.count("--version") == 1: - sys.stdout.write(f"pytest {__version__}\n") - return ExitCode.OK - - old_pytest_version = os.environ.get("PYTEST_VERSION") try: - os.environ["PYTEST_VERSION"] = __version__ try: - config = _prepareconfig(new_args, plugins) + config = _prepareconfig(args, plugins) except ConftestImportFailure as e: - print_conftest_import_error(e, file=sys.stderr) + exc_info = ExceptionInfo.from_exc_info(e.excinfo) + tw = TerminalWriter(sys.stderr) + tw.line(f"ImportError while loading conftest '{e.path}'.", red=True) + exc_info.traceback = exc_info.traceback.filter( + filter_traceback_for_conftest_import_failure + ) + exc_repr = ( + exc_info.getrepr(style="short", chain=False) + if exc_info.traceback + else exc_info.exconly() + ) + formatted_tb = str(exc_repr) + for line in formatted_tb.splitlines(): + tw.line(line.rstrip(), red=True) return ExitCode.USAGE_ERROR - - try: - ret: ExitCode | int = config.hook.pytest_cmdline_main(config=config) - try: - return ExitCode(ret) - except ValueError: - return ret - finally: - config._ensure_unconfigure() - except UsageError as e: - print_usage_error(e, file=sys.stderr) - return ExitCode.USAGE_ERROR - finally: - if old_pytest_version is None: - os.environ.pop("PYTEST_VERSION", None) else: - os.environ["PYTEST_VERSION"] = old_pytest_version + try: + ret: Union[ExitCode, int] = config.hook.pytest_cmdline_main( + config=config + ) + try: + return ExitCode(ret) + except ValueError: + return ret + finally: + config._ensure_unconfigure() + except UsageError as e: + tw = TerminalWriter(sys.stderr) + for msg in e.args: + tw.line(f"ERROR: {msg}\n", red=True) + return ExitCode.USAGE_ERROR def console_main() -> int: @@ -264,8 +235,7 @@ essential_plugins = ( "helpconfig", # Provides -p. ) -default_plugins = ( - *essential_plugins, +default_plugins = essential_plugins + ( "python", "terminal", "debugging", @@ -277,45 +247,46 @@ default_plugins = ( "monkeypatch", "recwarn", "pastebin", + "nose", "assertion", "junitxml", "doctest", "cacheprovider", + "freeze_support", "setuponly", "setupplan", "stepwise", - "unraisableexception", - "threadexception", "warnings", "logging", "reports", + "python_path", + *(["unraisableexception", "threadexception"] if sys.version_info >= (3, 8) else []), "faulthandler", - "subtests", ) -builtin_plugins = { - *default_plugins, - "pytester", - "pytester_assertions", -} +builtin_plugins = set(default_plugins) +builtin_plugins.add("pytester") +builtin_plugins.add("pytester_assertions") def get_config( - args: Iterable[str] | None = None, - plugins: Sequence[str | _PluggyPlugin] | None = None, -) -> Config: - # Subsequent calls to main will create a fresh instance. + args: Optional[List[str]] = None, + plugins: Optional[Sequence[Union[str, _PluggyPlugin]]] = None, +) -> "Config": + # subsequent calls to main will create a fresh instance pluginmanager = PytestPluginManager() - invocation_params = Config.InvocationParams( - args=args or (), - plugins=plugins, - dir=pathlib.Path.cwd(), + config = Config( + pluginmanager, + invocation_params=Config.InvocationParams( + args=args or (), + plugins=plugins, + dir=Path.cwd(), + ), ) - config = Config(pluginmanager, invocation_params=invocation_params) - if invocation_params.args: + if args is not None: # Handle any "-p no:plugin" args. - pluginmanager.consider_preparse(invocation_params.args, exclude_only=True) + pluginmanager.consider_preparse(args, exclude_only=True) for spec in default_plugins: pluginmanager.import_plugin(spec) @@ -323,7 +294,7 @@ def get_config( return config -def get_plugin_manager() -> PytestPluginManager: +def get_plugin_manager() -> "PytestPluginManager": """Obtain a new instance of the :py:class:`pytest.PytestPluginManager`, with default plugins already loaded. @@ -335,10 +306,12 @@ def get_plugin_manager() -> PytestPluginManager: def _prepareconfig( - args: list[str] | os.PathLike[str], - plugins: Sequence[str | _PluggyPlugin] | None = None, -) -> Config: - if isinstance(args, os.PathLike): + args: Optional[Union[List[str], "os.PathLike[str]"]] = None, + plugins: Optional[Sequence[Union[str, _PluggyPlugin]]] = None, +) -> "Config": + if args is None: + args = sys.argv[1:] + elif isinstance(args, os.PathLike): args = [os.fspath(args)] elif not isinstance(args, list): msg = ( # type:ignore[unreachable] @@ -346,8 +319,8 @@ def _prepareconfig( ) raise TypeError(msg.format(args, type(args))) - initial_config = get_config(args, plugins) - pluginmanager = initial_config.pluginmanager + config = get_config(args, plugins) + pluginmanager = config.pluginmanager try: if plugins: for plugin in plugins: @@ -355,16 +328,16 @@ def _prepareconfig( pluginmanager.consider_pluginarg(plugin) else: pluginmanager.register(plugin) - config: Config = pluginmanager.hook.pytest_cmdline_parse( + config = pluginmanager.hook.pytest_cmdline_parse( pluginmanager=pluginmanager, args=args ) return config except BaseException: - initial_config._ensure_unconfigure() + config._ensure_unconfigure() raise -def _get_directory(path: pathlib.Path) -> pathlib.Path: +def _get_directory(path: Path) -> Path: """Get the directory of a path - itself if already a directory.""" if path.is_file(): return path.parent @@ -375,10 +348,10 @@ def _get_directory(path: pathlib.Path) -> pathlib.Path: def _get_legacy_hook_marks( method: Any, hook_type: str, - opt_names: tuple[str, ...], -) -> dict[str, bool]: + opt_names: Tuple[str, ...], +) -> Dict[str, bool]: if TYPE_CHECKING: - # abuse typeguard from importlib to avoid massive method type union that's lacking an alias + # abuse typeguard from importlib to avoid massive method type union thats lacking a alias assert inspect.isroutine(method) known_marks: set[str] = {m.name for m in getattr(method, "pytestmark", [])} must_warn: list[str] = [] @@ -415,20 +388,19 @@ class PytestPluginManager(PluginManager): """ def __init__(self) -> None: - from _pytest.assertion import DummyRewriteHook - from _pytest.assertion import RewriteHook + import _pytest.assertion super().__init__("pytest") # -- State related to local conftest plugins. # All loaded conftest modules. - self._conftest_plugins: set[types.ModuleType] = set() + self._conftest_plugins: Set[types.ModuleType] = set() # All conftest modules applicable for a directory. # This includes the directory's own conftest modules as well # as those of its parent directories. - self._dirpath2confmods: dict[pathlib.Path, list[types.ModuleType]] = {} + self._dirpath2confmods: Dict[Path, List[types.ModuleType]] = {} # Cutoff directory above which conftests are no longer discovered. - self._confcutdir: pathlib.Path | None = None + self._confcutdir: Optional[Path] = None # If set, conftest loading is skipped. self._noconftest = False @@ -437,12 +409,14 @@ class PytestPluginManager(PluginManager): # session (#9478), often with the same path, so cache it. self._get_directory = lru_cache(256)(_get_directory) + self._duplicatepaths: Set[Path] = set() + # plugins that were explicitly skipped with pytest.skip # list of (module name, skip reason) # previously we would issue a warning when a plugin was skipped, but # since we refactored warnings as first citizens of Config, they are # just stored here to be used later. - self.skipped_plugins: list[tuple[str, str]] = [] + self.skipped_plugins: List[Tuple[str, str]] = [] self.add_hookspecs(_pytest.hookspec) self.register(self) @@ -462,20 +436,17 @@ class PytestPluginManager(PluginManager): self.enable_tracing() # Config._consider_importhook will set a real object if required. - self.rewrite_hook: RewriteHook = DummyRewriteHook() + self.rewrite_hook = _pytest.assertion.DummyRewriteHook() # Used to know when we are importing conftests after the pytest_configure stage. self._configured = False - def parse_hookimpl_opts( - self, plugin: _PluggyPlugin, name: str - ) -> HookimplOpts | None: - """:meta private:""" + def parse_hookimpl_opts(self, plugin: _PluggyPlugin, name: str): # pytest hooks are always prefixed with "pytest_", # so we avoid accessing possibly non-readable attributes # (see issue #1073). if not name.startswith("pytest_"): return None - # Ignore names which cannot be hooks. + # Ignore names which can not be hooks. if name == "pytest_plugins": return None @@ -488,24 +459,25 @@ class PytestPluginManager(PluginManager): if not inspect.isroutine(method): return None # Collect unmarked hooks as long as they have the `pytest_' prefix. - legacy = _get_legacy_hook_marks( + return _get_legacy_hook_marks( # type: ignore[return-value] method, "impl", ("tryfirst", "trylast", "optionalhook", "hookwrapper") ) - return cast(HookimplOpts, legacy) - def parse_hookspec_opts(self, module_or_class, name: str) -> HookspecOpts | None: - """:meta private:""" + def parse_hookspec_opts(self, module_or_class, name: str): opts = super().parse_hookspec_opts(module_or_class, name) if opts is None: method = getattr(module_or_class, name) if name.startswith("pytest_"): - legacy = _get_legacy_hook_marks( - method, "spec", ("firstresult", "historic") + opts = _get_legacy_hook_marks( # type: ignore[assignment] + method, + "spec", + ("firstresult", "historic"), ) - opts = cast(HookspecOpts, legacy) return opts - def register(self, plugin: _PluggyPlugin, name: str | None = None) -> str | None: + def register( + self, plugin: _PluggyPlugin, name: Optional[str] = None + ) -> Optional[str]: if name in _pytest.deprecated.DEPRECATED_EXTERNAL_PLUGINS: warnings.warn( PytestConfigWarning( @@ -516,30 +488,26 @@ class PytestPluginManager(PluginManager): ) ) return None - plugin_name = super().register(plugin, name) - if plugin_name is not None: + ret: Optional[str] = super().register(plugin, name) + if ret: self.hook.pytest_plugin_registered.call_historic( - kwargs=dict( - plugin=plugin, - plugin_name=plugin_name, - manager=self, - ) + kwargs=dict(plugin=plugin, manager=self) ) if isinstance(plugin, types.ModuleType): self.consider_module(plugin) - return plugin_name + return ret def getplugin(self, name: str): # Support deprecated naming because plugins (xdist e.g.) use it. - plugin: _PluggyPlugin | None = self.get_plugin(name) + plugin: Optional[_PluggyPlugin] = self.get_plugin(name) return plugin def hasplugin(self, name: str) -> bool: """Return whether a plugin with the given name is registered.""" return bool(self.get_plugin(name)) - def pytest_configure(self, config: Config) -> None: + def pytest_configure(self, config: "Config") -> None: """:meta private:""" # XXX now that the pluginmanager exposes hookimpl(tryfirst...) # we should remove tryfirst/trylast as markers. @@ -562,15 +530,12 @@ class PytestPluginManager(PluginManager): # def _set_initial_conftests( self, - args: Sequence[str | pathlib.Path], + args: Sequence[Union[str, Path]], pyargs: bool, noconftest: bool, - rootpath: pathlib.Path, - confcutdir: pathlib.Path | None, - invocation_dir: pathlib.Path, - importmode: ImportMode | str, - *, - consider_namespace_packages: bool, + rootpath: Path, + confcutdir: Optional[Path], + importmode: Union[ImportMode, str], ) -> None: """Load initial conftest files given a preparsed "namespace". @@ -579,120 +544,81 @@ class PytestPluginManager(PluginManager): All builtin and 3rd party plugins will have been loaded, however, so common options will not confuse our logic here. """ - self._confcutdir = ( - absolutepath(invocation_dir / confcutdir) if confcutdir else None - ) + current = Path.cwd() + self._confcutdir = absolutepath(current / confcutdir) if confcutdir else None self._noconftest = noconftest self._using_pyargs = pyargs foundanchor = False - for initial_path in args: - path = str(initial_path) + for intitial_path in args: + path = str(intitial_path) # remove node-id syntax i = path.find("::") if i != -1: path = path[:i] - anchor = absolutepath(invocation_dir / path) + anchor = absolutepath(current / path) # Ensure we do not break if what appears to be an anchor # is in fact a very long option (#10169, #11394). if safe_exists(anchor): - self._try_load_conftest( - anchor, - importmode, - rootpath, - consider_namespace_packages=consider_namespace_packages, - ) + self._try_load_conftest(anchor, importmode, rootpath) foundanchor = True if not foundanchor: - self._try_load_conftest( - invocation_dir, - importmode, - rootpath, - consider_namespace_packages=consider_namespace_packages, - ) + self._try_load_conftest(current, importmode, rootpath) - def _is_in_confcutdir(self, path: pathlib.Path) -> bool: - """Whether to consider the given path to load conftests from.""" + def _is_in_confcutdir(self, path: Path) -> bool: + """Whether a path is within the confcutdir. + + When false, should not load conftest. + """ if self._confcutdir is None: return True - # The semantics here are literally: - # Do not load a conftest if it is found upwards from confcut dir. - # But this is *not* the same as: - # Load only conftests from confcutdir or below. - # At first glance they might seem the same thing, however we do support use cases where - # we want to load conftests that are not found in confcutdir or below, but are found - # in completely different directory hierarchies like packages installed - # in out-of-source trees. - # (see #9767 for a regression where the logic was inverted). return path not in self._confcutdir.parents def _try_load_conftest( - self, - anchor: pathlib.Path, - importmode: str | ImportMode, - rootpath: pathlib.Path, - *, - consider_namespace_packages: bool, + self, anchor: Path, importmode: Union[str, ImportMode], rootpath: Path ) -> None: - self._loadconftestmodules( - anchor, - importmode, - rootpath, - consider_namespace_packages=consider_namespace_packages, - ) + self._getconftestmodules(anchor, importmode, rootpath) # let's also consider test* subdirs if anchor.is_dir(): for x in anchor.glob("test*"): if x.is_dir(): - self._loadconftestmodules( - x, - importmode, - rootpath, - consider_namespace_packages=consider_namespace_packages, - ) + self._getconftestmodules(x, importmode, rootpath) - def _loadconftestmodules( - self, - path: pathlib.Path, - importmode: str | ImportMode, - rootpath: pathlib.Path, - *, - consider_namespace_packages: bool, - ) -> None: + def _getconftestmodules( + self, path: Path, importmode: Union[str, ImportMode], rootpath: Path + ) -> Sequence[types.ModuleType]: if self._noconftest: - return + return [] directory = self._get_directory(path) # Optimization: avoid repeated searches in the same directory. # Assumes always called with same importmode and rootpath. - if directory in self._dirpath2confmods: - return + existing_clist = self._dirpath2confmods.get(directory) + if existing_clist is not None: + return existing_clist + # XXX these days we may rather want to use config.rootpath + # and allow users to opt into looking into the rootdir parent + # directories instead of requiring to specify confcutdir. clist = [] for parent in reversed((directory, *directory.parents)): if self._is_in_confcutdir(parent): conftestpath = parent / "conftest.py" if conftestpath.is_file(): - mod = self._importconftest( - conftestpath, - importmode, - rootpath, - consider_namespace_packages=consider_namespace_packages, - ) + mod = self._importconftest(conftestpath, importmode, rootpath) clist.append(mod) self._dirpath2confmods[directory] = clist - - def _getconftestmodules(self, path: pathlib.Path) -> Sequence[types.ModuleType]: - directory = self._get_directory(path) - return self._dirpath2confmods.get(directory, ()) + return clist def _rget_with_confmod( self, name: str, - path: pathlib.Path, - ) -> tuple[types.ModuleType, Any]: - modules = self._getconftestmodules(path) + path: Path, + importmode: Union[str, ImportMode], + rootpath: Path, + ) -> Tuple[types.ModuleType, Any]: + modules = self._getconftestmodules(path, importmode, rootpath=rootpath) for mod in reversed(modules): try: return mod, getattr(mod, name) @@ -701,39 +627,22 @@ class PytestPluginManager(PluginManager): raise KeyError(name) def _importconftest( - self, - conftestpath: pathlib.Path, - importmode: str | ImportMode, - rootpath: pathlib.Path, - *, - consider_namespace_packages: bool, + self, conftestpath: Path, importmode: Union[str, ImportMode], rootpath: Path ) -> types.ModuleType: - conftestpath_plugin_name = str(conftestpath) - existing = self.get_plugin(conftestpath_plugin_name) + existing = self.get_plugin(str(conftestpath)) if existing is not None: return cast(types.ModuleType, existing) - # conftest.py files there are not in a Python package all have module - # name "conftest", and thus conflict with each other. Clear the existing - # before loading the new one, otherwise the existing one will be - # returned from the module cache. pkgpath = resolve_package_path(conftestpath) if pkgpath is None: - try: - del sys.modules[conftestpath.stem] - except KeyError: - pass + _ensure_removed_sysmodule(conftestpath.stem) try: - mod = import_path( - conftestpath, - mode=importmode, - root=rootpath, - consider_namespace_packages=consider_namespace_packages, - ) + mod = import_path(conftestpath, mode=importmode, root=rootpath) except Exception as e: assert e.__traceback__ is not None - raise ConftestImportFailure(conftestpath, cause=e) from e + exc_info = (type(e), e, e.__traceback__) + raise ConftestImportFailure(conftestpath, exc_info) from e self._check_non_top_pytest_plugins(mod, conftestpath) @@ -742,21 +651,16 @@ class PytestPluginManager(PluginManager): if dirpath in self._dirpath2confmods: for path, mods in self._dirpath2confmods.items(): if dirpath in path.parents or path == dirpath: - if mod in mods: - raise AssertionError( - f"While trying to load conftest path {conftestpath!s}, " - f"found that the module {mod} is already loaded with path {mod.__file__}. " - "This is not supposed to happen. Please report this issue to pytest." - ) + assert mod not in mods mods.append(mod) self.trace(f"loading conftestmodule {mod!r}") - self.consider_conftest(mod, registration_name=conftestpath_plugin_name) + self.consider_conftest(mod) return mod def _check_non_top_pytest_plugins( self, mod: types.ModuleType, - conftestpath: pathlib.Path, + conftestpath: Path, ) -> None: if ( hasattr(mod, "pytest_plugins") @@ -809,7 +713,7 @@ class PytestPluginManager(PluginManager): if arg.startswith("no:"): name = arg[3:] if name in essential_plugins: - raise UsageError(f"plugin {name} cannot be disabled") + raise UsageError("plugin %s cannot be disabled" % name) # PR #4304: remove stepwise if cacheprovider is blocked. if name == "cacheprovider": @@ -821,17 +725,18 @@ class PytestPluginManager(PluginManager): self.set_blocked("pytest_" + name) else: name = arg - # Unblock the plugin. - self.unblock(name) + # Unblock the plugin. None indicates that it has been blocked. + # There is no interface with pluggy for this. + if self._name2plugin.get(name, -1) is None: + del self._name2plugin[name] if not name.startswith("pytest_"): - self.unblock("pytest_" + name) + if self._name2plugin.get("pytest_" + name, -1) is None: + del self._name2plugin["pytest_" + name] self.import_plugin(arg, consider_entry_points=True) - def consider_conftest( - self, conftestmodule: types.ModuleType, registration_name: str - ) -> None: + def consider_conftest(self, conftestmodule: types.ModuleType) -> None: """:meta private:""" - self.register(conftestmodule, name=registration_name) + self.register(conftestmodule, name=conftestmodule.__file__) def consider_env(self) -> None: """:meta private:""" @@ -842,7 +747,7 @@ class PytestPluginManager(PluginManager): self._import_plugin_specs(getattr(mod, "pytest_plugins", [])) def _import_plugin_specs( - self, spec: None | types.ModuleType | str | Sequence[str] + self, spec: Union[None, types.ModuleType, str, Sequence[str]] ) -> None: plugins = _get_plugin_specs_as_list(spec) for import_spec in plugins: @@ -859,7 +764,7 @@ class PytestPluginManager(PluginManager): # basename for historic purposes but must be imported with the # _pytest prefix. assert isinstance(modname, str), ( - f"module name as text required, got {modname!r}" + "module name as text required, got %r" % modname ) if self.is_blocked(modname) or self.get_plugin(modname) is not None: return @@ -887,8 +792,8 @@ class PytestPluginManager(PluginManager): def _get_plugin_specs_as_list( - specs: None | types.ModuleType | str | Sequence[str], -) -> list[str]: + specs: Union[None, types.ModuleType, str, Sequence[str]] +) -> List[str]: """Parse a plugins specification into a list of plugin names.""" # None means empty. if specs is None: @@ -903,10 +808,18 @@ def _get_plugin_specs_as_list( if isinstance(specs, collections.abc.Sequence): return list(specs) raise UsageError( - f"Plugins may be specified as a sequence or a ','-separated string of plugin names. Got: {specs!r}" + "Plugins may be specified as a sequence or a ','-separated string of plugin names. Got: %r" + % specs ) +def _ensure_removed_sysmodule(modname: str) -> None: + try: + del sys.modules[modname] + except KeyError: + pass + + class Notset: def __repr__(self): return "" @@ -1004,24 +917,24 @@ class Config: .. note:: Note that the environment variable ``PYTEST_ADDOPTS`` and the ``addopts`` - configuration option are handled by pytest, not being included in the ``args`` attribute. + ini option are handled by pytest, not being included in the ``args`` attribute. Plugins accessing ``InvocationParams`` must be aware of that. """ - args: tuple[str, ...] + args: Tuple[str, ...] """The command-line arguments as passed to :func:`pytest.main`.""" - plugins: Sequence[str | _PluggyPlugin] | None + plugins: Optional[Sequence[Union[str, _PluggyPlugin]]] """Extra plugins, might be `None`.""" - dir: pathlib.Path + dir: Path """The directory from which :func:`pytest.main` was invoked.""" def __init__( self, *, args: Iterable[str], - plugins: Sequence[str | _PluggyPlugin] | None, - dir: pathlib.Path, + plugins: Optional[Sequence[Union[str, _PluggyPlugin]]], + dir: Path, ) -> None: object.__setattr__(self, "args", tuple(args)) object.__setattr__(self, "plugins", plugins) @@ -1036,23 +949,21 @@ class Config: #: Command line arguments. ARGS = enum.auto() #: Invocation directory. - INVOCATION_DIR = enum.auto() - INCOVATION_DIR = INVOCATION_DIR # backwards compatibility alias + INCOVATION_DIR = enum.auto() #: 'testpaths' configuration value. TESTPATHS = enum.auto() - # Set by cacheprovider plugin. - cache: Cache - def __init__( self, pluginmanager: PytestPluginManager, *, - invocation_params: InvocationParams | None = None, + invocation_params: Optional[InvocationParams] = None, ) -> None: + from .argparsing import Parser, FILE_OR_DIR + if invocation_params is None: invocation_params = self.InvocationParams( - args=(), plugins=None, dir=pathlib.Path.cwd() + args=(), plugins=None, dir=Path.cwd() ) self.option = argparse.Namespace() @@ -1067,8 +978,9 @@ class Config: :type: InvocationParams """ + _a = FILE_OR_DIR self._parser = Parser( - usage=f"%(prog)s [options] [{FILE_OR_DIR}] [{FILE_OR_DIR}] [...]", + usage=f"%(prog)s [options] [{_a}] [{_a}] [...]", processopt=self._processopt, _ispytest=True, ) @@ -1087,86 +999,92 @@ class Config: # Deprecated alias. Was never public. Can be removed in a few releases. self._store = self.stash + from .compat import PathAwareHookProxy + self.trace = self.pluginmanager.trace.root.get("config") - self.hook: pluggy.HookRelay = PathAwareHookProxy(self.pluginmanager.hook) # type: ignore[assignment] - self._inicache: dict[str, Any] = {} - self._opt2dest: dict[str, str] = {} - self._cleanup_stack = contextlib.ExitStack() + self.hook = PathAwareHookProxy(self.pluginmanager.hook) + self._inicache: Dict[str, Any] = {} + self._override_ini: Sequence[str] = () + self._opt2dest: Dict[str, str] = {} + self._cleanup: List[Callable[[], None]] = [] self.pluginmanager.register(self, "pytestconfig") self._configured = False self.hook.pytest_addoption.call_historic( kwargs=dict(parser=self._parser, pluginmanager=self.pluginmanager) ) self.args_source = Config.ArgsSource.ARGS - self.args: list[str] = [] + self.args: List[str] = [] + + if TYPE_CHECKING: + from _pytest.cacheprovider import Cache + + self.cache: Optional[Cache] = None @property - def rootpath(self) -> pathlib.Path: + def rootpath(self) -> Path: """The path to the :ref:`rootdir `. + :type: pathlib.Path + .. versionadded:: 6.1 """ return self._rootpath @property - def inipath(self) -> pathlib.Path | None: + def inipath(self) -> Optional[Path]: """The path to the :ref:`configfile `. + :type: Optional[pathlib.Path] + .. versionadded:: 6.1 """ return self._inipath def add_cleanup(self, func: Callable[[], None]) -> None: """Add a function to be called when the config object gets out of - use (usually coinciding with pytest_unconfigure). - """ - self._cleanup_stack.callback(func) + use (usually coinciding with pytest_unconfigure).""" + self._cleanup.append(func) def _do_configure(self) -> None: assert not self._configured self._configured = True - self.hook.pytest_configure.call_historic(kwargs=dict(config=self)) + with warnings.catch_warnings(): + warnings.simplefilter("default") + self.hook.pytest_configure.call_historic(kwargs=dict(config=self)) def _ensure_unconfigure(self) -> None: - try: - if self._configured: - self._configured = False - try: - self.hook.pytest_unconfigure(config=self) - finally: - self.hook.pytest_configure._call_history = [] - finally: - try: - self._cleanup_stack.close() - finally: - self._cleanup_stack = contextlib.ExitStack() + if self._configured: + self._configured = False + self.hook.pytest_unconfigure(config=self) + self.hook.pytest_configure._call_history = [] + while self._cleanup: + fin = self._cleanup.pop() + fin() def get_terminal_writer(self) -> TerminalWriter: - terminalreporter: TerminalReporter | None = self.pluginmanager.get_plugin( + terminalreporter: Optional[TerminalReporter] = self.pluginmanager.get_plugin( "terminalreporter" ) assert terminalreporter is not None return terminalreporter._tw def pytest_cmdline_parse( - self, pluginmanager: PytestPluginManager, args: list[str] - ) -> Config: + self, pluginmanager: PytestPluginManager, args: List[str] + ) -> "Config": try: self.parse(args) except UsageError: - # Handle `--version --version` and `--help` here in a minimal fashion. + # Handle --version and --help here in a minimal fashion. # This gets done via helpconfig normally, but its # pytest_cmdline_main is not called in case of errors. if getattr(self.option, "version", False) or "--version" in args: - from _pytest.helpconfig import show_version_verbose + from _pytest.helpconfig import showversion - # Note that `--version` (single argument) is handled early by `Config.main()`, so the only - # way we are reaching this point is via `--version --version`. - show_version_verbose(self) + showversion(self) elif ( getattr(self.option, "help", False) or "--help" in args or "-h" in args ): - self._parser.optparser.print_help() + self._parser._getparser().print_help() sys.stdout.write( "\nNOTE: displaying only minimal help due to UsageError.\n\n" ) @@ -1178,10 +1096,10 @@ class Config: def notify_exception( self, excinfo: ExceptionInfo[BaseException], - option: argparse.Namespace | None = None, + option: Optional[argparse.Namespace] = None, ) -> None: if option and getattr(option, "fulltrace", False): - style: TracebackStyle = "long" + style: _TracebackStyle = "long" else: style = "native" excrepr = excinfo.getrepr( @@ -1190,22 +1108,18 @@ class Config: res = self.hook.pytest_internalerror(excrepr=excrepr, excinfo=excinfo) if not any(res): for line in str(excrepr).split("\n"): - sys.stderr.write(f"INTERNALERROR> {line}\n") + sys.stderr.write("INTERNALERROR> %s\n" % line) sys.stderr.flush() def cwd_relative_nodeid(self, nodeid: str) -> str: # nodeid's are relative to the rootpath, compute relative to cwd. if self.invocation_params.dir != self.rootpath: - base_path_part, *nodeid_part = nodeid.split("::") - # Only process path part - fullpath = self.rootpath / base_path_part - relative_path = bestrelpath(self.invocation_params.dir, fullpath) - - nodeid = "::".join([relative_path, *nodeid_part]) + fullpath = self.rootpath / nodeid + nodeid = bestrelpath(self.invocation_params.dir, fullpath) return nodeid @classmethod - def fromdictargs(cls, option_dict: Mapping[str, Any], args: list[str]) -> Config: + def fromdictargs(cls, option_dict, args) -> "Config": """Constructor usable for subprocesses.""" config = get_config(args) config.option.__dict__.update(option_dict) @@ -1214,7 +1128,7 @@ class Config: config.pluginmanager.consider_pluginarg(x) return config - def _processopt(self, opt: Argument) -> None: + def _processopt(self, opt: "Argument") -> None: for name in opt._short_opts + opt._long_opts: self._opt2dest[name] = opt.dest @@ -1223,12 +1137,12 @@ class Config: setattr(self.option, opt.dest, opt.default) @hookimpl(trylast=True) - def pytest_load_initial_conftests(self, early_config: Config) -> None: + def pytest_load_initial_conftests(self, early_config: "Config") -> None: # We haven't fully parsed the command line arguments yet, so # early_config.args it not set yet. But we need it for # discovering the initial conftests. So "pre-run" the logic here. # It will be done for real in `parse()`. - args, _args_source = early_config._decide_args( + args, args_source = early_config._decide_args( args=early_config.known_args_namespace.file_or_dir, pyargs=early_config.known_args_namespace.pyargs, testpaths=early_config.getini("testpaths"), @@ -1242,25 +1156,43 @@ class Config: noconftest=early_config.known_args_namespace.noconftest, rootpath=early_config.rootpath, confcutdir=early_config.known_args_namespace.confcutdir, - invocation_dir=early_config.invocation_params.dir, importmode=early_config.known_args_namespace.importmode, - consider_namespace_packages=early_config.getini( - "consider_namespace_packages" - ), ) - def _consider_importhook(self) -> None: + def _initini(self, args: Sequence[str]) -> None: + ns, unknown_args = self._parser.parse_known_and_unknown_args( + args, namespace=copy.copy(self.option) + ) + rootpath, inipath, inicfg = determine_setup( + ns.inifilename, + ns.file_or_dir + unknown_args, + rootdir_cmd_arg=ns.rootdir or None, + config=self, + ) + self._rootpath = rootpath + self._inipath = inipath + self.inicfg = inicfg + self._parser.extra_info["rootdir"] = str(self.rootpath) + self._parser.extra_info["inifile"] = str(self.inipath) + self._parser.addini("addopts", "Extra command line options", "args") + self._parser.addini("minversion", "Minimally required pytest version") + self._parser.addini( + "required_plugins", + "Plugins that must be present for pytest to run", + type="args", + default=[], + ) + self._override_ini = ns.override_ini or () + + def _consider_importhook(self, args: Sequence[str]) -> None: """Install the PEP 302 import hook if using assertion rewriting. Needs to parse the --assert= option from the commandline and find all the installed plugins to mark them for rewriting by the importhook. """ - mode = getattr(self.known_args_namespace, "assertmode", "plain") - - disable_autoload = getattr( - self.known_args_namespace, "disable_plugin_autoload", False - ) or bool(os.environ.get("PYTEST_DISABLE_PLUGIN_AUTOLOAD")) + ns, unknown_args = self._parser.parse_known_and_unknown_args(args) + mode = getattr(ns, "assertmode", "plain") if mode == "rewrite": import _pytest.assertion @@ -1269,25 +1201,22 @@ class Config: except SystemError: mode = "plain" else: - self._mark_plugins_for_rewrite(hook, disable_autoload) + self._mark_plugins_for_rewrite(hook) self._warn_about_missing_assertion(mode) - def _mark_plugins_for_rewrite( - self, hook: AssertionRewritingHook, disable_autoload: bool - ) -> None: + def _mark_plugins_for_rewrite(self, hook) -> None: """Given an importhook, mark for rewrite any top-level modules or packages in the distribution package for all pytest plugins.""" self.pluginmanager.rewrite_hook = hook - if disable_autoload: - # We don't autoload from distribution package entry points, - # no need to continue. + if os.environ.get("PYTEST_DISABLE_PLUGIN_AUTOLOAD"): + # We don't autoload from setuptools entry points, no need to continue. return package_files = ( str(file) - for dist in importlib.metadata.distributions() + for dist in importlib_metadata.distributions() if any(ep.group == "pytest11" for ep in dist.entry_points) for file in dist.files or [] ) @@ -1295,45 +1224,31 @@ class Config: for name in _iter_rewritable_modules(package_files): hook.mark_rewrite(name) - def _configure_python_path(self) -> None: - # `pythonpath = a b` will set `sys.path` to `[a, b, x, y, z, ...]` - for path in reversed(self.getini("pythonpath")): - sys.path.insert(0, str(path)) - self.add_cleanup(self._unconfigure_python_path) - - def _unconfigure_python_path(self) -> None: - for path in self.getini("pythonpath"): - path_str = str(path) - if path_str in sys.path: - sys.path.remove(path_str) - - def _validate_args(self, args: list[str], via: str) -> list[str]: + def _validate_args(self, args: List[str], via: str) -> List[str]: """Validate known args.""" - self._parser.extra_info["config source"] = via + self._parser._config_source_hint = via # type: ignore try: self._parser.parse_known_and_unknown_args( args, namespace=copy.copy(self.option) ) finally: - self._parser.extra_info.pop("config source", None) + del self._parser._config_source_hint # type: ignore return args def _decide_args( self, *, - args: list[str], - pyargs: bool, - testpaths: list[str], - invocation_dir: pathlib.Path, - rootpath: pathlib.Path, + args: List[str], + pyargs: List[str], + testpaths: List[str], + invocation_dir: Path, + rootpath: Path, warn: bool, - ) -> tuple[list[str], ArgsSource]: + ) -> Tuple[List[str], ArgsSource]: """Decide the args (initial paths/nodeids) to use given the relevant inputs. :param warn: Whether can issue warnings. - - :returns: The args and the args source. Guaranteed to be non-empty. """ if args: source = Config.ArgsSource.ARGS @@ -1360,36 +1275,97 @@ class Config: else: result = [] if not result: - source = Config.ArgsSource.INVOCATION_DIR + source = Config.ArgsSource.INCOVATION_DIR result = [str(invocation_dir)] return result, source - @hookimpl(wrapper=True) - def pytest_collection(self) -> Generator[None, object, object]: - # Validate invalid configuration keys after collection is done so we - # take in account options added by late-loading conftest files. + def _preparse(self, args: List[str], addopts: bool = True) -> None: + if addopts: + env_addopts = os.environ.get("PYTEST_ADDOPTS", "") + if len(env_addopts): + args[:] = ( + self._validate_args(shlex.split(env_addopts), "via PYTEST_ADDOPTS") + + args + ) + self._initini(args) + if addopts: + args[:] = ( + self._validate_args(self.getini("addopts"), "via addopts config") + args + ) + + self.known_args_namespace = self._parser.parse_known_args( + args, namespace=copy.copy(self.option) + ) + self._checkversion() + self._consider_importhook(args) + self.pluginmanager.consider_preparse(args, exclude_only=False) + if not os.environ.get("PYTEST_DISABLE_PLUGIN_AUTOLOAD"): + # Don't autoload from setuptools entry point. Only explicitly specified + # plugins are going to be loaded. + self.pluginmanager.load_setuptools_entrypoints("pytest11") + self.pluginmanager.consider_env() + + self.known_args_namespace = self._parser.parse_known_args( + args, namespace=copy.copy(self.known_args_namespace) + ) + + self._validate_plugins() + self._warn_about_skipped_plugins() + + if self.known_args_namespace.strict: + self.issue_config_time_warning( + _pytest.deprecated.STRICT_OPTION, stacklevel=2 + ) + + if self.known_args_namespace.confcutdir is None: + if self.inipath is not None: + confcutdir = str(self.inipath.parent) + else: + confcutdir = str(self.rootpath) + self.known_args_namespace.confcutdir = confcutdir try: - return (yield) - finally: - self._validate_config_options() + self.hook.pytest_load_initial_conftests( + early_config=self, args=args, parser=self._parser + ) + except ConftestImportFailure as e: + if self.known_args_namespace.help or self.known_args_namespace.version: + # we don't want to prevent --help/--version to work + # so just let is pass and print a warning at the end + self.issue_config_time_warning( + PytestConfigWarning(f"could not load initial conftests: {e.path}"), + stacklevel=2, + ) + else: + raise + + @hookimpl(hookwrapper=True) + def pytest_collection(self) -> Generator[None, None, None]: + # Validate invalid ini keys after collection is done so we take in account + # options added by late-loading conftest files. + yield + self._validate_config_options() def _checkversion(self) -> None: import pytest - minver_ini_value = self.inicfg.get("minversion", None) - minver = minver_ini_value.value if minver_ini_value is not None else None + minver = self.inicfg.get("minversion", None) if minver: # Imported lazily to improve start-up time. from packaging.version import Version if not isinstance(minver, str): raise pytest.UsageError( - f"{self.inipath}: 'minversion' must be a single value" + "%s: 'minversion' must be a single value" % self.inipath ) if Version(minver) > Version(pytest.__version__): raise pytest.UsageError( - f"{self.inipath}: 'minversion' requires pytest-{minver}, actual pytest-{pytest.__version__}'" + "%s: 'minversion' requires pytest-%s, actual pytest-%s'" + % ( + self.inipath, + minver, + pytest.__version__, + ) ) def _validate_config_options(self) -> None: @@ -1402,9 +1378,8 @@ class Config: return # Imported lazily to improve start-up time. - from packaging.requirements import InvalidRequirement - from packaging.requirements import Requirement from packaging.version import Version + from packaging.requirements import InvalidRequirement, Requirement plugin_info = self.pluginmanager.list_plugin_distinfo() plugin_dist_info = {dist.project_name: dist.version for _, dist in plugin_info} @@ -1430,131 +1405,47 @@ class Config: ) def _warn_or_fail_if_strict(self, message: str) -> None: - strict_config = self.getini("strict_config") - if strict_config is None: - strict_config = self.getini("strict") - if strict_config: + if self.known_args_namespace.strict_config: raise UsageError(message) self.issue_config_time_warning(PytestConfigWarning(message), stacklevel=3) - def _get_unknown_ini_keys(self) -> set[str]: - known_keys = self._parser._inidict.keys() | self._parser._ini_aliases.keys() - return self.inicfg.keys() - known_keys + def _get_unknown_ini_keys(self) -> List[str]: + parser_inicfg = self._parser._inidict + return [name for name in self.inicfg if name not in parser_inicfg] - def parse(self, args: list[str], addopts: bool = True) -> None: + def parse(self, args: List[str], addopts: bool = True) -> None: # Parse given cmdline arguments into this config object. - assert self.args == [], ( - "can only parse cmdline args at most once per Config object" - ) - + assert ( + self.args == [] + ), "can only parse cmdline args at most once per Config object" self.hook.pytest_addhooks.call_historic( kwargs=dict(pluginmanager=self.pluginmanager) ) - - if addopts: - env_addopts = os.environ.get("PYTEST_ADDOPTS", "") - if len(env_addopts): - args[:] = ( - self._validate_args(shlex.split(env_addopts), "via PYTEST_ADDOPTS") - + args - ) - - ns = self._parser.parse_known_args(args, namespace=copy.copy(self.option)) - rootpath, inipath, inicfg, ignored_config_files = determine_setup( - inifile=ns.inifilename, - override_ini=ns.override_ini, - args=ns.file_or_dir, - rootdir_cmd_arg=ns.rootdir or None, - invocation_dir=self.invocation_params.dir, - ) - self._rootpath = rootpath - self._inipath = inipath - self._ignored_config_files = ignored_config_files - self.inicfg = inicfg - self._parser.extra_info["rootdir"] = str(self.rootpath) - self._parser.extra_info["inifile"] = str(self.inipath) - - self._parser.addini("addopts", "Extra command line options", "args") - self._parser.addini("minversion", "Minimally required pytest version") - self._parser.addini( - "pythonpath", type="paths", help="Add paths to sys.path", default=[] - ) - self._parser.addini( - "required_plugins", - "Plugins that must be present for pytest to run", - type="args", - default=[], - ) - - if addopts: - args[:] = ( - self._validate_args(self.getini("addopts"), "via addopts config") + args - ) - - self.known_args_namespace = self._parser.parse_known_args( - args, namespace=copy.copy(self.option) - ) - self._checkversion() - self._consider_importhook() - self._configure_python_path() - self.pluginmanager.consider_preparse(args, exclude_only=False) - if ( - not os.environ.get("PYTEST_DISABLE_PLUGIN_AUTOLOAD") - and not self.known_args_namespace.disable_plugin_autoload - ): - # Autoloading from distribution package entry point has - # not been disabled. - self.pluginmanager.load_setuptools_entrypoints("pytest11") - # Otherwise only plugins explicitly specified in PYTEST_PLUGINS - # are going to be loaded. - self.pluginmanager.consider_env() - - self._parser.parse_known_args(args, namespace=self.known_args_namespace) - - self._validate_plugins() - self._warn_about_skipped_plugins() - - if self.known_args_namespace.confcutdir is None: - if self.inipath is not None: - confcutdir = str(self.inipath.parent) - else: - confcutdir = str(self.rootpath) - self.known_args_namespace.confcutdir = confcutdir + self._preparse(args, addopts=addopts) + # XXX deprecated hook: + self.hook.pytest_cmdline_preparse(config=self, args=args) + self._parser.after_preparse = True # type: ignore try: - self.hook.pytest_load_initial_conftests( - early_config=self, args=args, parser=self._parser + args = self._parser.parse_setoption( + args, self.option, namespace=self.option + ) + self.args, self.args_source = self._decide_args( + args=args, + pyargs=self.known_args_namespace.pyargs, + testpaths=self.getini("testpaths"), + invocation_dir=self.invocation_params.dir, + rootpath=self.rootpath, + warn=True, ) - except ConftestImportFailure as e: - if self.known_args_namespace.help or self.known_args_namespace.version: - # we don't want to prevent --help/--version to work - # so just let it pass and print a warning at the end - self.issue_config_time_warning( - PytestConfigWarning(f"could not load initial conftests: {e.path}"), - stacklevel=2, - ) - else: - raise - - try: - self._parser.parse(args, namespace=self.option) except PrintHelp: - return - - self.args, self.args_source = self._decide_args( - args=getattr(self.option, FILE_OR_DIR), - pyargs=self.option.pyargs, - testpaths=self.getini("testpaths"), - invocation_dir=self.invocation_params.dir, - rootpath=self.rootpath, - warn=True, - ) + pass def issue_config_time_warning(self, warning: Warning, stacklevel: int) -> None: """Issue and handle a warning during the "configure" stage. During ``pytest_configure`` we can't capture warnings using the ``catch_warnings_for_item`` - function because it is not possible to have hook wrappers around ``pytest_configure``. + function because it is not possible to have hookwrappers around ``pytest_configure``. This function is mainly intended for plugins that need to issue warnings during ``pytest_configure`` (or similar stages). @@ -1586,129 +1477,68 @@ class Config: ) def addinivalue_line(self, name: str, line: str) -> None: - """Add a line to a configuration option. The option must have been + """Add a line to an ini-file option. The option must have been declared but might not yet be set in which case the line becomes the first line in its value.""" x = self.getini(name) assert isinstance(x, list) x.append(line) # modifies the cached list inline - def getini(self, name: str) -> Any: - """Return configuration value the an :ref:`configuration file `. - - If a configuration value is not defined in a - :ref:`configuration file `, then the ``default`` value - provided while registering the configuration through - :func:`parser.addini ` will be returned. - Please note that you can even provide ``None`` as a valid - default value. - - If ``default`` is not provided while registering using - :func:`parser.addini `, then a default value - based on the ``type`` parameter passed to - :func:`parser.addini ` will be returned. - The default values based on ``type`` are: - ``paths``, ``pathlist``, ``args`` and ``linelist`` : empty list ``[]`` - ``bool`` : ``False`` - ``string`` : empty string ``""`` - ``int`` : ``0`` - ``float`` : ``0.0`` - - If neither the ``default`` nor the ``type`` parameter is passed - while registering the configuration through - :func:`parser.addini `, then the configuration - is treated as a string and a default empty string '' is returned. + def getini(self, name: str): + """Return configuration value from an :ref:`ini file `. If the specified name hasn't been registered through a prior :func:`parser.addini ` call (usually from a plugin), a ValueError is raised. """ - canonical_name = self._parser._ini_aliases.get(name, name) try: - return self._inicache[canonical_name] + return self._inicache[name] except KeyError: - pass - self._inicache[canonical_name] = val = self._getini(canonical_name) - return val + self._inicache[name] = val = self._getini(name) + return val # Meant for easy monkeypatching by legacypath plugin. # Can be inlined back (with no cover removed) once legacypath is gone. - def _getini_unknown_type(self, name: str, type: str, value: object): - msg = ( - f"Option {name} has unknown configuration type {type} with value {value!r}" - ) - raise ValueError(msg) # pragma: no cover + def _getini_unknown_type(self, name: str, type: str, value: Union[str, List[str]]): + msg = f"unknown configuration type: {type}" + raise ValueError(msg, value) # pragma: no cover def _getini(self, name: str): - # If this is an alias, resolve to canonical name. - canonical_name = self._parser._ini_aliases.get(name, name) - try: - _description, type, default = self._parser._inidict[canonical_name] + description, type, default = self._parser._inidict[name] except KeyError as e: raise ValueError(f"unknown configuration value: {name!r}") from e - - # Collect all possible values (canonical name + aliases) from inicfg. - # Each candidate is (ConfigValue, is_canonical). - candidates = [] - if canonical_name in self.inicfg: - candidates.append((self.inicfg[canonical_name], True)) - for alias, target in self._parser._ini_aliases.items(): - if target == canonical_name and alias in self.inicfg: - candidates.append((self.inicfg[alias], False)) - - if not candidates: - return default - - # Pick the best candidate based on precedence: - # 1. CLI override takes precedence over file, then - # 2. Canonical name takes precedence over alias. - selected = max(candidates, key=lambda x: (x[0].origin == "override", x[1]))[0] - value = selected.value - mode = selected.mode - - if mode == "ini": - # In ini mode, values are always str | list[str]. - assert isinstance(value, (str, list)) - return self._getini_ini(name, canonical_name, type, value, default) - elif mode == "toml": - return self._getini_toml(name, canonical_name, type, value, default) + override_value = self._get_override_ini_value(name) + if override_value is None: + try: + value = self.inicfg[name] + except KeyError: + if default is not None: + return default + if type is None: + return "" + return [] else: - assert_never(mode) - - def _getini_ini( - self, - name: str, - canonical_name: str, - type: str, - value: str | list[str], - default: Any, - ): - """Handle config values read in INI mode. - - In INI mode, values are stored as str or list[str] only, and coerced - from string based on the registered type. - """ - # Note: some coercions are only required if we are reading from .ini - # files, because the file format doesn't contain type information, but - # when reading from toml (in ini mode) we will get either str or list of - # str values (see load_config_dict_from_file). For example: + value = override_value + # Coerce the values based on types. + # + # Note: some coercions are only required if we are reading from .ini files, because + # the file format doesn't contain type information, but when reading from toml we will + # get either str or list of str values (see _parse_ini_config_from_pyproject_toml). + # For example: # # ini: # a_line_list = "tests acceptance" + # in this case, we need to split the string to obtain a list of strings. # - # in this case, we need to split the string to obtain a list of strings. - # - # toml (ini mode): + # toml: # a_line_list = ["tests", "acceptance"] + # in this case, we already have a list ready to use. # - # in this case, we already have a list ready to use. if type == "paths": - dp = ( - self.inipath.parent - if self.inipath is not None - else self.invocation_params.dir - ) + # TODO: This assert is probably not valid in all cases. + assert self.inipath is not None + dp = self.inipath.parent input_values = shlex.split(value) if isinstance(value, str) else value return [dp / x for x in input_values] elif type == "args": @@ -1722,133 +1552,59 @@ class Config: return _strtobool(str(value).strip()) elif type == "string": return value - elif type == "int": - if not isinstance(value, str): - raise TypeError( - f"Expected an int string for option {name} of type integer, but got: {value!r}" - ) from None - return int(value) - elif type == "float": - if not isinstance(value, str): - raise TypeError( - f"Expected a float string for option {name} of type float, but got: {value!r}" - ) from None - return float(value) - else: - return self._getini_unknown_type(name, type, value) - - def _getini_toml( - self, - name: str, - canonical_name: str, - type: str, - value: object, - default: Any, - ): - """Handle TOML config values with strict type validation and no coercion. - - In TOML mode, values already have native types from TOML parsing. - We validate types match expectations exactly, including list items. - """ - value_type = builtins.type(value).__name__ - if type == "paths": - # Expect a list of strings. - if not isinstance(value, list): - raise TypeError( - f"{self.inipath}: config option '{name}' expects a list for type 'paths', " - f"got {value_type}: {value!r}" - ) - for i, item in enumerate(value): - if not isinstance(item, str): - item_type = builtins.type(item).__name__ - raise TypeError( - f"{self.inipath}: config option '{name}' expects a list of strings, " - f"but item at index {i} is {item_type}: {item!r}" - ) - dp = ( - self.inipath.parent - if self.inipath is not None - else self.invocation_params.dir - ) - return [dp / x for x in value] - elif type in {"args", "linelist"}: - # Expect a list of strings. - if not isinstance(value, list): - raise TypeError( - f"{self.inipath}: config option '{name}' expects a list for type '{type}', " - f"got {value_type}: {value!r}" - ) - for i, item in enumerate(value): - if not isinstance(item, str): - item_type = builtins.type(item).__name__ - raise TypeError( - f"{self.inipath}: config option '{name}' expects a list of strings, " - f"but item at index {i} is {item_type}: {item!r}" - ) - return list(value) - elif type == "bool": - # Expect a boolean. - if not isinstance(value, bool): - raise TypeError( - f"{self.inipath}: config option '{name}' expects a bool, " - f"got {value_type}: {value!r}" - ) - return value - elif type == "int": - # Expect an integer (but not bool, which is a subclass of int). - if not isinstance(value, int) or isinstance(value, bool): - raise TypeError( - f"{self.inipath}: config option '{name}' expects an int, " - f"got {value_type}: {value!r}" - ) - return value - elif type == "float": - # Expect a float or integer only. - if not isinstance(value, (float, int)) or isinstance(value, bool): - raise TypeError( - f"{self.inipath}: config option '{name}' expects a float, " - f"got {value_type}: {value!r}" - ) - return value - elif type == "string": - # Expect a string. - if not isinstance(value, str): - raise TypeError( - f"{self.inipath}: config option '{name}' expects a string, " - f"got {value_type}: {value!r}" - ) + elif type is None: return value else: return self._getini_unknown_type(name, type, value) def _getconftest_pathlist( - self, name: str, path: pathlib.Path - ) -> list[pathlib.Path] | None: + self, name: str, path: Path, rootpath: Path + ) -> Optional[List[Path]]: try: - mod, relroots = self.pluginmanager._rget_with_confmod(name, path) + mod, relroots = self.pluginmanager._rget_with_confmod( + name, path, self.getoption("importmode"), rootpath + ) except KeyError: return None assert mod.__file__ is not None - modpath = pathlib.Path(mod.__file__).parent - values: list[pathlib.Path] = [] + modpath = Path(mod.__file__).parent + values: List[Path] = [] for relroot in relroots: if isinstance(relroot, os.PathLike): - relroot = pathlib.Path(relroot) + relroot = Path(relroot) else: relroot = relroot.replace("/", os.sep) relroot = absolutepath(modpath / relroot) values.append(relroot) return values - def getoption(self, name: str, default: Any = notset, skip: bool = False): + def _get_override_ini_value(self, name: str) -> Optional[str]: + value = None + # override_ini is a list of "ini=value" options. + # Always use the last item if multiple values are set for same ini-name, + # e.g. -o foo=bar1 -o foo=bar2 will set foo to bar2. + for ini_config in self._override_ini: + try: + key, user_ini_value = ini_config.split("=", 1) + except ValueError as e: + raise UsageError( + "-o/--override-ini expects option=value style (got: {!r}).".format( + ini_config + ) + ) from e + else: + if key == name: + value = user_ini_value + return value + + def getoption(self, name: str, default=notset, skip: bool = False): """Return command line option value. - :param name: Name of the option. You may also specify + :param name: Name of the option. You may also specify the literal ``--OPT`` option instead of the "dest" option name. - :param default: Fallback value if no option of that name is **declared** via :hook:`pytest_addoption`. - Note this parameter will be ignored when the option is **declared** even if the option's value is ``None``. - :param skip: If ``True``, raise :func:`pytest.skip` if option is undeclared or has a ``None`` value. - Note that even if ``True``, if a default was specified it will be returned instead of a skip. + :param default: Default value if no option of that name exists. + :param skip: If True, raise pytest.skip if option does not exists + or has a None value. """ name = self._opt2dest.get(name, name) try: @@ -1873,91 +1629,6 @@ class Config: """Deprecated, use getoption(skip=True) instead.""" return self.getoption(name, skip=True) - #: Verbosity type for failed assertions (see :confval:`verbosity_assertions`). - VERBOSITY_ASSERTIONS: Final = "assertions" - #: Verbosity type for test case execution (see :confval:`verbosity_test_cases`). - VERBOSITY_TEST_CASES: Final = "test_cases" - #: Verbosity type for failed subtests (see :confval:`verbosity_subtests`). - VERBOSITY_SUBTESTS: Final = "subtests" - - _VERBOSITY_INI_DEFAULT: Final = "auto" - - def get_verbosity(self, verbosity_type: str | None = None) -> int: - r"""Retrieve the verbosity level for a fine-grained verbosity type. - - :param verbosity_type: Verbosity type to get level for. If a level is - configured for the given type, that value will be returned. If the - given type is not a known verbosity type, the global verbosity - level will be returned. If the given type is None (default), the - global verbosity level will be returned. - - To configure a level for a fine-grained verbosity type, the - configuration file should have a setting for the configuration name - and a numeric value for the verbosity level. A special value of "auto" - can be used to explicitly use the global verbosity level. - - Example: - - .. tab:: toml - - .. code-block:: toml - - [tool.pytest] - verbosity_assertions = 2 - - .. tab:: ini - - .. code-block:: ini - - [pytest] - verbosity_assertions = 2 - - .. code-block:: console - - pytest -v - - .. code-block:: python - - print(config.get_verbosity()) # 1 - print(config.get_verbosity(Config.VERBOSITY_ASSERTIONS)) # 2 - """ - global_level = self.getoption("verbose", default=0) - assert isinstance(global_level, int) - if verbosity_type is None: - return global_level - - ini_name = Config._verbosity_ini_name(verbosity_type) - if ini_name not in self._parser._inidict: - return global_level - - level = self.getini(ini_name) - if level == Config._VERBOSITY_INI_DEFAULT: - return global_level - - return int(level) - - @staticmethod - def _verbosity_ini_name(verbosity_type: str) -> str: - return f"verbosity_{verbosity_type}" - - @staticmethod - def _add_verbosity_ini(parser: Parser, verbosity_type: str, help: str) -> None: - """Add a output verbosity configuration option for the given output type. - - :param parser: Parser for command line arguments and config-file values. - :param verbosity_type: Fine-grained verbosity category. - :param help: Description of the output this type controls. - - The value should be retrieved via a call to - :py:func:`config.get_verbosity(type) `. - """ - parser.addini( - Config._verbosity_ini_name(verbosity_type), - help=help, - type="string", - default=Config._VERBOSITY_INI_DEFAULT, - ) - def _warn_about_missing_assertion(self, mode: str) -> None: if not _assertion_supported(): if mode == "plain": @@ -1997,7 +1668,7 @@ def _assertion_supported() -> bool: def create_terminal_writer( - config: Config, file: TextIO | None = None + config: Config, file: Optional[TextIO] = None ) -> TerminalWriter: """Create a TerminalWriter instance configured according to the options in the config object. @@ -2041,7 +1712,7 @@ def _strtobool(val: str) -> bool: @lru_cache(maxsize=50) def parse_warning_filter( arg: str, *, escape: bool -) -> tuple[warnings._ActionKind, str, type[Warning], str, int]: +) -> Tuple["warnings._ActionKind", str, Type[Warning], str, int]: """Parse a warnings filter string. This is copied from warnings._setoption with the following changes: @@ -2083,17 +1754,15 @@ def parse_warning_filter( parts.append("") action_, message, category_, module, lineno_ = (s.strip() for s in parts) try: - action: warnings._ActionKind = warnings._getaction(action_) # type: ignore[attr-defined] + action: "warnings._ActionKind" = warnings._getaction(action_) # type: ignore[attr-defined] except warnings._OptionError as e: - raise UsageError(error_template.format(error=str(e))) from None + raise UsageError(error_template.format(error=str(e))) try: - category: type[Warning] = _resolve_warning_category(category_) - except ImportError: - raise + category: Type[Warning] = _resolve_warning_category(category_) except Exception: exc_info = ExceptionInfo.from_current() exception_text = exc_info.getrepr(style="native") - raise UsageError(error_template.format(error=exception_text)) from None + raise UsageError(error_template.format(error=exception_text)) if message and escape: message = re.escape(message) if module and escape: @@ -2106,20 +1775,13 @@ def parse_warning_filter( except ValueError as e: raise UsageError( error_template.format(error=f"invalid lineno {lineno_!r}: {e}") - ) from None + ) else: lineno = 0 - try: - re.compile(message) - re.compile(module) - except re.error as e: - raise UsageError( - error_template.format(error=f"Invalid regex {e.pattern!r}: {e}") - ) from None return action, message, category, module, lineno -def _resolve_warning_category(category: str) -> type[Warning]: +def _resolve_warning_category(category: str) -> Type[Warning]: """ Copied from warnings._getcategory, but changed so it lets exceptions (specially ImportErrors) propagate so we can get access to their tracebacks (#9218). @@ -2138,7 +1800,7 @@ def _resolve_warning_category(category: str) -> type[Warning]: cat = getattr(m, klass) if not issubclass(cat, Warning): raise UsageError(f"{cat} is not a Warning subclass") - return cast(type[Warning], cat) + return cast(Type[Warning], cat) def apply_warning_filters( @@ -2148,19 +1810,7 @@ def apply_warning_filters( # Filters should have this precedence: cmdline options, config. # Filters should be applied in the inverse order of precedence. for arg in config_filters: - try: - warnings.filterwarnings(*parse_warning_filter(arg, escape=False)) - except ImportError as e: - warnings.warn( - f"Failed to import filter module '{e.name}': {arg}", PytestConfigWarning - ) - continue + warnings.filterwarnings(*parse_warning_filter(arg, escape=False)) for arg in cmdline_filters: - try: - warnings.filterwarnings(*parse_warning_filter(arg, escape=True)) - except ImportError as e: - warnings.warn( - f"Failed to import filter module '{e.name}': {arg}", PytestConfigWarning - ) - continue + warnings.filterwarnings(*parse_warning_filter(arg, escape=True)) diff --git a/Backend/venv/lib/python3.12/site-packages/_pytest/config/__pycache__/__init__.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/_pytest/config/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..862e8aa784fb0e88330aea991dc42fdab21aa7f7 GIT binary patch literal 76105 zcmcG%3s_uNekXYA{icd~@J19bK_MO%pci@~0TPykWC>d~?slofy&zCg$hQhfVCYsm zo;2!K$0(hQ(Art!eE!yW?B1sLktmOuxZRyjCzIWw3`&)2$c(b%?8Mp0EN-d4c-`M_ z_V+*cQ3blPyJx<+68D}u_ndRj^MC&D^RHblJBMq>k+zW^e9m$Ifqp1gu^f0{v~b*Q zj^_qAUdQXBx&a+~>IV$$X&f-Jr)j{%p5_5Fds+r8>}egavZrmp#-8>8J9|0?9PH^F zaI&Xsz{Q?<19^BFqV6%zfJaB)G)D8syaQeqHbs47{sBJ=o1?C=z(9b7EeID36tJ*0 zS~ylTP{hJEgo_7?S=f$n$v_DUI}k1%C}m+M!es+xEbKzKe4w0#^AO%Lu!V))2v-bL zu&@W=;6RXt^AWBbsAOR;!c_xREbK$LdZ3zx{Rr0#)Ua>>;o5;(7A`<|>%dkPE=0I) zppJ!$5UwAnXW`;#XsltNfrU#D-Zrp}g-a1`9B5==eY9zyne|GQK>zeXMn$ z6=}-&EeN*_w6SnSw0&&Hzz&u-7;PHcIk1z3D-qr`u#1JOqPxfT4D4ay>S)K<-hsU= zT!Zkwfqg7o8{I#4VBi1?Z$dV~)T9A@DV!bb*LVM7U?5hlQJ>N5_s09An|;Xz$pQ15dJW3&O_-j_Wv~PV}PPPef0Qog6sH z-ffTejhz}eg>V_)8a+Ms)WB0ncV^(Mjni{N1K;+pPMX&P{rJ5t=l9dXUOjh|ey>m|)C)o31zLjqz9Bt5S$IF*RN>tV!r5#rd$R|zVd0zf0}=aKf|Bp`}wE&XZUmcv;1@X0RKGy75=OI3&TZ%bM!B> zEmcB%_|jK6PBil8`N*(7rW@vdSI1wtrTdCc ze6>^X*%UcFEBEV{^(QZ&M~2Xgm-w6fMf5^6r;J~DbXaL4C~XY=>qUQiG3KKvHO5~O ziufqTU`(jRJtmDHQj}tpzao#Pl^;jiae0Pb#wZR8jmmseXX9o5MWLS83$D@sBim0( z2&Gj?Git~v<HUP!kcQi+r4B0JV zb)=p`4Ltny_r9TwE&np!|C;a>lvvBZf>v%7UZOG(3J;kmgp&T*D@OI()BLZq66JI# z_nRnphM!g2azhPKZNqk!HWrET!RSa#2##M)jEu+Pjlq%FNYl_r zR0z_m!SUEoLWn1tFHZ(9i{pbrJU$W|ZvKP@qA#S&*rMV@crY?}QNR!5=}6)to@QR) zg;)Y1XU{}zkjm|!yi6%v{bFQLxDXki= z6=H%INsNp5q3=CK$$Jxsk&;Vc>8X#>j9reNjEI*6stb#WUls<{ z7}x3O#PCS$WF!_D7Q{~oI3u0yv^Ww=9226K@x%Uf9PheCku}H73uwt0`ac{O5)+ib z)qQPHVAb!94UHqhgTX+ea6;)i#O3v~T#@KGaRl!WV;UNXvG#gV$8j+c9k~!56A}?V zl8E57aVRoEy&Yo|CoF@|ZDF<)kd57L}eE_q+%9@Hb| zHYaev^SA*$uLGW^2aaa|erE)3X98Yl22N)guuWP+wv4s=+6b!23sc|ejt$}&4<;@O z!7GvI2p>ed5?B!wc>&9TeYM$c58^s9A&RI=bTT**7sNPQJD1sHhzG|alfn4J<;!?E zj>5#;aw75IRUsOcOKENnUO{e5xCoCm)X@>#(fkA}U!-kLEW_;+3VlL*_a{cWnQ-e1 z*)!H~I2IWb!r_cP93C6zC!!Q~hQlvTM56K=OE}Dr4UhT4-+i|KY`CYh_e6JB z#?jl?-+kuH)2I9KBai*)>pT%g)TuKW$J1v!k9NyHynUy_Qr07nHAeeb%o(Fd~?He5inf@qhJ!u3=EqE z%aDNqbpvl4GS6~DI^Oh(6BEcF*sukd0bK2~+%?^R<181lWCAqfY356-rw5C0LKHGa zT2vW}aBXk|Ydm8XvG&DS-=K_2|{~&3y;sKCPS9E4z`7 zesN)%9PFCbZ`#s@ zTV{>lak5bvR8}mqa5Se`+h0Kd)S7NI_bsKsHO-Bxt(9Wv&NKXSlq$UGdQ5sYoOoy6 zlpH@5oCHH@?3?nuG}94$X(m`dB#w_E5X!Debe%0usAi!)mJXQX<4rH&dP_~`8UFXv7%9Oi4>8?*ZJ+Gd)abiCI#;KIECh4qM;NOnE z8C}}`=J-BS-3K6`~**IP^#_w&5#COp^8oVRc; zG2eUZ>x;If{mX@ilKGwM7J6gl?0G-8QOIjB+2?)#$l)QaP%1KG0z4Hb#p4KXm>krG zoXL?;r^Ym=pi$R!VmlE~33UNrfHkIsl73Wy04Q3y5>_QN%Ge6ZFX^e|yrRS8&`+)O zusu4c?$Ple)qVs!#np==gBOFB$AJO_6XWu(0VE5%7&h#9a9j+kJGQ(HoQzxo_7x=5 zVk8m`0v{5Bm|od*!3)A*1RD+Z4%%;m*p^VVR7{Y-O;FkZqAQ2!j&<4ba0<*pf?{7lzZ3?UH)h>#;+OA%FnC1oO$wuk`itx6f$Ct3)k zYR0bJLf$@Y$A~*NkNC~f|C-i>oRJgQI!+5B?c6}v0h60#5?6wu;zUda$Q_p>VgzXb zT{`T9?$brIW^jB61VIiJjUH0`al&L~wWnXm4W>+>^*eGy%e5 zJSYkg9(b`@rkXv-kBGt`(Gv{YAR0ue+lKGecMyTsaXvm7Z${=T=R*?kmTN4-y$-dq zQbch4!YE2-Rk(nyW+E}(Bnrc5kRS?tke>j-I!ug!1ooeisR&W@m@YP=)Z8Ostf z(nsF`X-xorWO%BkmywH%&ZR97?1bnzYpcpq2-Z#M>zeyP1{&~D>?jvO+VzC=2oc$r zF%4dfjKun;EQ|)}2!5`!he|Se;maZ@R&);gP{w!>q(#OjQ48V0F`k$i;W6Z7Btpg) z7GiPiFkvtvSPsI!?axG_6A}^5&=)a?xtMWLSA!ZI1agcyL0GX!paMJGWISVzCwM^= zGe-J=v7-zt|U?GI}l>CRJuv1 zr;&BbH}LA4_>2DurvG(ry`;)iv#u|*HLV4z7rGYfRsyZFJ?k|#S5vyN_4~))Ii6}f zo@_jxF0EWQa7`z44>*03ch0bGHsn{Vl~yktd2K&%x%|SEry=QSxaVp7?4gA#s`?qH z%dbe6Zn^d3eNTbr=5AP9=&mNxuE0j_CMMA2RrZ9zhAZN@BV4~?9o-{>2zf% zRoRxTY)e&kBr7}CJo|tWSLMwfTXk+(w{!lol&|(fUo9GvU!3v;lb+zh)g@us6I}J| zyB{b|1!|Ll+Lb`vx`lHEK(>@s%wKzL|Llo$QBA6-C0W$6QnVcnb8Vk9raj)wd9bfp-1k;ZDw3@H5V6s#$ZDzJBD5 zC+|GD;;Ng~r+xn0J8$honYQh-N94xM4bKnGKfQo<)h?o4_ncI$ZTrXW!j!u@>8`$K zt^UQj4P|{EC!FcmoSg@_xw6g>_dR>3mHT~9kC*$Q)zP`t@I#*tu|M>)m|7jhY&B3! z$lJNs@WZ_ZN_oKE<2HO?J+iOIZup5&haW#N8S&yLb`yo&l;|g3+tHndpOkibj&3*n z*)|=1{MmLB?t}QgdeP3pFe*q<7)F)Fr(0W#qznf&=xT^MLSx_z_-$-i*5h2t@Efd=WPW^2R3;;4MZc;ukaS!{Ru&H>XD~ z%b@cGN@N_rEW|PvUbqsQh(8DG-$D zVJE;cc!@I1zKJ(~fWP=CZU9bBn<;u}3@v8lXJ!LHdBVpBAl6L!M9iOc^ zN`A(fO!*JZoG);@?pEFFRc|!hX?W|x+n3(FwBl`@wX9j~uUc+c<}9!K-YB_Kk}7UU z7B{REH?CTnK5~239mxE7oRHj?Lyg>folS?!3?G#0aNjVuXGrSj7pDpR3ipwt zaNfA$DE~&6l#r!ibeIKfdt&Zwplnq336I>ljH6$ghEXYL(UU{J=zxWR$@CicJ1Qmf zGJZ1(IMFE%V_OC>ngFX`Vwe)oo=rm{JgJt1LCNTm#5M(*lDOCrBx;RNDJ7kZ!^myx z2=-B4yeBkBl2b@2rpkh26TrdM8yfIm4pnR>wvBO?0UE zThz6=z3);}vhKf)_Zdo~c0YFhT{m{Uy8p)hdHC9ikc+MDhE zkSPO=z;IkkLqzA%GE`u>u2zI3^O!*m&W>#4w~e z!x`%YFk#}LU}Z-xQ|62{PI44_X^#rSk-@r%Bag2?}E(sJj2sSTpRg!aL ztd}9!5-yCyGRD|=T*%nKTNOmYtuxk9`oy)dC;;jBAp4YyN!0+ruZ#d}X7YwaL70M= z2!aIQ$r&4y7ZGwP2QNn>C2xI2rwN5#qrp^{2ESAtWQ=5LKxS1EPC`Vci>+ z0&y@Hp75U$0DJ|ftGt#`6-Q9Y&hEJH=@rKA zdj@6qodHYz8$NJXR9qsPZ<^akMQ6Dspj&;QTaC!4@(*(Isr!PCyBRQog9Auu?h^^% zzhlT^`WXY}3}~nPk=T{-K}Kw0Xs~U^`w{Cz$44i4AxvW(vMQpq)47sH@efgC#?!0j zKh3f;c5lWoc$LrO(=JOBNhY5#L)R0@s>nGP-zO*&4RuW8=Y)_VK zPv-}Ivt-_z_Lr`C{I{*QtlzZ*|1NEPz!^*J4^5Ul^Yxx}FK2ZwTMF-611W1=(ptA@ zyxYEPty{Go`q)ze^x4!fYebKHa|c;Hf-tye%M58 zKtO9EYHgSpMBUUsoVt(z5`}FiCR}BBR0JYsd5>b`e8=U<4kkY7I4@&tr0&p}Ixe?zR1lIz49}qj9B$C8b2D(QOMJiSjHzvl% zqmb)I!43@)wG61h%0hCLA5FZ7i5TO1#HpNdVuB8VZm4Ltw4KP&Fi8U!dx zaV6Xg7aLBfFkw2Ex23iIX}EETg*kA-F2&{EvvP!C9lo%0!xvNvLxCLet-K!aN?ree z1^Kz9Nnz9tkU|N+D?>b`4CVLBx-3U+8Uj7#J)o0eROO^9>@i%5hc75xwB2YVcX7O-c;_scMm?Jo^nLv?0wdKr`bn%Ws`FPIDU|E#M&d+f_=* zpyHqoi5Au>G1;fGBj~u7IfV}iVH~4XrjDKmo)$kJWWbUXDZr2dOae26cxwzPjLJ+p z;$c7h#qIKSt7N>OO%Xm5RP&2e?kBhmKA{Y z`t+LH`|7nD*XDKe`q}9l#xag9i&DVU_z3dL+tqbJH>-?&# z`o8mN@KS6}P+#t%dBYp_JNAY4_xy|eyCo|{?JIdZmaRKJrquJpE3U2Ad(!@rl)pad zufKkBUGFmGedO?_ODe$^akb5v*L>ykLvIbP`Wn*y%9Ou7>2F_p=AM7wefrgq^fxT- zyytHPq0(x`3^2at@Ql9m`+nW3Un zTflslaV@ZA>^mwzOa}@^#dB%9h+y_&189N_kHqi65k$#=Kax$^OjPAaJWK=%h8OHl zQmo=FHFE#Enoa=)VrU?x`d7OeT(Cp)8CkWXktsEnR13|wbHH9#wYadv63ce0>0u78pPxKj}}AX(6z zR1mW+?p27pE^>qVujT=)5%|*p=)bAI=`jKb&KQOP`bM}J^Rym-5Rym;T5?LBwj@+A zuY7@oF4@=#omd9Z4NZql*R%yhuYTH^OY{QSG)$YPE&Gu6=I&|BwDAfjmV7~eJpC~7;vtVn701Mn5vmCwI}#Vcj{*aovDm@(20NZ*%IidU z6iTiPT!fda& zU>m~n@ph<%IVg-&PUz@5@Y}_=@J>AQc$eT7Jc3!s&uYQ*d4iL7?tO0Dk-V0{o`bX6R;1si`E&VdV>vBEWKJq(EH?v;@QS zMdU3)-Xhi#`l43;V(t7wiLCu?=ZjHBDPQuK{F-0KmrIeWj4#tJos~wdGxOz0SI%$Y zD_+;Jo@I)A(A{*h)|>gtSIh%j_$nF;q&M=_NMFI%Jf>VJO)b&{`6hlVo|TWSgOs)o zX{z{o=ye;k%fy(tr8y((u1ons$XCrj!8f30+tk`NLTkK+DHPU%?%XbZfMJNhc!lc> z<`S5|_l75%PcyVn);C}Q z?2t&$hTsWVf-9q!S6r!_n~zsF0Ev!j16>=%ItuR=#>c04A?e#ng}n6hwSH;+sK16s0J#W?7OA z3|>q$OK4&Y>A{h!62&GG- zl4AszUs$D1dHO})VHc19F07&`dM=^TjJ(Pc2-m|?ckLL^& zYDe2QCBe_pof>g_9*x5{Iv$NxYQTDXzs7qx3h#BJM22j-Mmsk};HT0$%z#SeEt_vu z%CAYHzgv}GpuY_yeZ2XiN@3gkB<0pNr0MyD1H8#NaUwCa zTaq0bz;B0)FJrqfF*GC)!7cv3C?Hgw$yc-uRnD;3hc}ACDRdn2v#NpeLPr!R8KRC_ zX>p@uaIRUZ!HERk;74p+S@t549gN<|xWf=U!k_?H9%YVa+>BQb4GE=S7a$+Qtr!P0 zVAol+R^74cj2lL%??8HzJ8g^-L< z93PiB^jDdAM#jXRnLG%=z*=XP9Mn0Bl*iLGF*Y`NMqo*fp(YupDE(knl$$&<45GhFC!)r01k6ZRpWa-BZ zP4CuHsBArt+qH*NIznruTi)on(=mHwtqd9_izQ3Xtd#AWJ+`j5x&mtjC2RhI+da2>=G!RIYx{sl zri;toD7sUW-cpe+uYG7U6_SdIhjZn>`s9r#Up++{)3r%w?ZV*OBX5one(Ln3oE1rD z#j3Lsyn^zYR9RE9tSMD?AX#=`rR)&Zx|lWdp0((+hxr_#%Q{!!BafeSJOZCH-sX?I z9o?ZU{AO{jG6G%RJXAyLh70Ru7h zL7A3Ks&FQ6+_SV?oirSc;De(_EmrAs7Cl>xBte~ zq#Nw1rS=u~Zpb0<(ou>xv&TQqFPbk{@UP@=oi%SH*I35dw9`A+vs`v&ljgqm+_{d* zY_bHQxq!K~VXQG1t~cZ`f^)1yn5arcJ5Zc_W#^sf%FYywK5$cI^l6S^27vhrV{}gZ zb7Tcq%E3k&;#8RWG@!>(Eez+5dI@>T>go3e^K9A2yD?NcI>CzHqXz|IwPdboY$y&UxtU?m3W7PGk zdDJ#IFDy@@K!NgtWvITF7UXvqYSz_lyev z2rAv^H@bjcsyru%cE1qSRC0^?s8zL;Klct%idw2HhMjr}wmcF>5WEO8ybFR5gXWYt z4Cw(AfDx;9a9k7`kxC#F3{e;xzru_ym`?8G_=JeK7bl>pOLmCy=8P`eg zQy}?$6y~#RX-T*WlNl6kfWu)$pa32hbO>O%qby2jWWl0V{5Mp#iTJxvfjG$w1xa|3 zajVh^X(cMiMi#nGQB@dV-Gpoq-ZZ6&Y$%oaceM7XRRl~SllA=8E~sKAeYGiHXA=J% zooi12t0!-qT=P_~>ve&H|Ndb2A6!WnmA&D-<6JnqSiMrz3>bMxSMUJ(THc2Siz^S? zyT53yyz0)mWO>u#&=S8=zIWE}kt2`nq_K@Vr{M8$trt z{)e32l?NopQ!>Bxt=d#oYqF|!)!ml%_*0&mq^D-#nN?3?+U=c{43aizFVNy<3miN1 zW2FMw2?x4Cf0h$ZA~95*nS5NDbzpt6-HUJqHe=#cDmE*Iz-4SeJf(zF^B*Q2sl6%`@EC0FQ;r9(B?bY)wjEFmTU?>NJ3 z7NOe>RW?Z8Aje?b2TAZuYlo@32Z=pPdWp(JfFzrA0WUx%EfVsH)uQ&o26Z4C7UdVU zUw!>KwZ8zhzRrE@hS=)%savNOx}a#V;%->BHayw^M9{GT96$h=n5K0h7yuh=E48sT z?2a-tg-pN*f(vz#u1QnK{CQpnnP5W;bL0xBkq!b0WIG<8`d<|ksRP!*;wAJRp+scC z6=kqQlHsd*o$-mmix3?}B>9ot(POZ>Csp)Gba^xi)3ZsEdeVv~doZ>ww*amQ5fN4d z2wWbA?LNql=3o}`G%|hALlOXKraDj+>Xq6tK79z_P*M|}`hkqk{Wq&MA&XS$D7x!c zuQTP|ROS9Y%r*~kx?&guDE)_-`abNb)R`w>z&6Z0j|@+Vwq$hIRE^dG+??wFqj^Xq zIztz2?v%A6X{`Wrd|j`19o0QFnQZoTC%5TEkNTnvBo$~4HeZ=+mkir!+sN3nbS~t@ zpe>26&Dg1aGAV4wutBv8fLj>MMehg!W>ftIR4#X|Yat>E-(bc9K~!E20*T*K4)7J^ z$sL2sBusTGmtE7u%c4ak{UXC-f-&rZZiJO-CqMuW(Upp*Oxu*wVD)3y5_w^1$={oC zOgnhvrCk7%rfIlansz|*!@i+@_T2i-IJ4ZeX{S<3TzB&bAe^d&q0|tljT1sRmB_(D zHqBUXJ_m7}HST{*4$HphZR0XTBzQm;ETptkMc@&7 z1cO4Atl&e`N@sj?PI4iDNlfD75itm<6B6WD9ZA%cVrzOaaz(IHIdowHNgB7o`nsm3 zvB@T+4aQ-mPjjd)L>8oDBf}SAodoGL#RrFAl?rR4aoFR-U@0!~OsS|&K$Z&=uyY~3 zC-7w3M4nVH63|U&pda5SKt!LHuqoog3Vb7A+f@O64H{9tS}&?U)RfekQ%=%dr%6pF zt%O`baS^;|>@GsK5`8^W`i_oI{s~uq$SxT){}^K_*3r#`5fII|!FG9qJe7d&L`z6A zz%jx{1}_qqFyjRiW-?3_RQXOJm$VZ_sGvhsP$%8s?THhQ&<*~bfYl93o*qE>5Mvse zAuwBl>Rc?rhMehCN*c$y5r`q#Yo=yEJ*ZyN7GFS4KbR#x%&gRU#HSjxz>RiVAGV+P zze0_nWfkOng}3W()ql5P*78y3@z?h)T9z7;_4`&!_b)&7G%+-a(xr?sQ@db4>Yuzj|N5UJAno%h^T41uakdg>O%}Pk(-Nd&Y?tb! zvwGp^;=tXad(Oka$2_GH(CbAzHlSLxw=(c`0s*Fgf#>GyIu;+%5Tl!4;I|f-lTEhI zpUYw{SPF!r5C;NtTSEL5*qXC0ks~H84@~8Y;}cPyO<9^n>VnPA)PA5gG#|k*Vfq?z z1=XQuZrE`0!%*!QiRJJ%r)o8)z~*GTY4jUV9JU-gkm{79H0dZ^W?Tu-uk-B^uPs&D zmMm>scDF5C+oYcEL%jx7kc|S=jpBX$c$}&WaT#F5ECYVVl2$hXWRovt8xi*cvr;z# zQzjAyHG~W>00d+s zs6r7EWdp5b^dzy6jU;YT2p#Gaw#eC<&*-jgQf?J{kzi`8=Eyt(O*(04oBw ztihxef_ktrpM}8sz9XL$*>4_%l>7Gcx1L`pTnU7rsO0L=&FRP}Z1=6*zuf^rdCK3I z^fxX(Ma$`)zxz`YCBd3;N^3@Y5U-)4k6SLHei)2Abf`v`XK{TDil)Z|E&Hr2^KiyA zZ2}w8be4lcjyac+G_1oQ6KiDC^}BGCrtHv|4qzGq``|Pg8mhfCCPZKw?igv$XSUPs zO@-p8G6|7(8_H9qYuS|3*4)X%tgE$f0~Jq!X5?w$1ZM4inKtf2(WLr9lh2{dH%KF~ zNzsPHWD}y1LQdRB?~h#l2)y_d#hszszeN!cUr4x|QiS-Q5Q{<>l|-N;XNuZXRWHaE z$mtU8c!NwK(Zn9&8Wl+JT2LhDsD*@x1@^OlErOHy(`5BX7kdH;$=r|+E=*@ z7QCIy_syEt3briRmMab{_NE&5C-J}Hz)HbE7E3T7hTDU z9dpjKuR=Dr^o7#+Qb}{NqmahD`mjqC*=-*R-zlL{Rj97SP`>PUv9kxWZOoB+iblNc*+MIr4OK!FTsB>EGH=y-teoddN zxrua5UtAh(09dE0;s(~~Zfs~4El&A$NduNt9NCq12m*~#%^X998Ec|gO|P3)9gj>~ zUe@#2I=^Pgy6XrT!26Jd({4=rsY1e2u|cS)s1ED6BjF-rA`5DqidPVpF(Q67ei$iYjH*vGSU4C3nX%lR2SmR-Zr~0%Dh-{02!yMH4(p!oAm_dYMj(G*{%pR z$Ah;HzSXucy;9x2;@iQLE0-M=YrewQO{t>#WKsQM{fe(`+1d87cPmnP+h;9lhj;ei znzMExn%cT6xpmj7bN9N@WIL)`^Ony?0WRxTy~hC@!ASyA*^sn0EVeBC_`0)OY=vcF;eAZc$Nzjb`UaL-?}Zb2sO?=}~iW-kXC z7tbypUG}xFT6aLYFK@8%RckflrGNIYlJgYfLud`*xagc^U-PoF8TYlKviYZ8vn=E< zbiRG+%~Q*T?eP5Ity^?1U0m@VeE+FsXU{M2HRSv}PIfInEXnJt=6+ml>#i~UxUsFf z!tkdRCWP4_ZxG0-oA_JEmdgX11|LfS$6^;2w+xz*OufWih&QS~)j+%foGn9EL8wRM*zvAfJ`sUwv*Sf7o@ zny{XlqQEBMDNM%mBu4CD=@xEP>PF*#N~KLOAAb6j~|zjfVg&c8~;pv&{n3ssjn-|doHCG#g1Yf=pz$%c-V{Jrl# z{a4Q8>xCR#n!x7?d2n%UV=RCk@qK(k{2^{C%LVlX_9-JogcOn5(Kp&!5u_~83Th0dLM`^k4 z=GP{TlSVDXeA1{Q<`xkS=DDo1$SHl(^ zDv*^NB9X74d&r_7?-7LA;EC`Q4{HP{s)3bCjzz)k+>E!2e~Q%FEF~<1jb_3BBh9|w zLwf9BR?d|-t6Our=ZxR(ozg!o+0He0@qG2`@l`jp zVG8DJeseD{_drFuqI#k8&eeJ2x|s_U%;(?gxz(8t6y1K|)(Z<=tAP;ql=&Cu#ra*g zy6*eSz+AjNb!+Oo({sj;d=-nv@4Me|-!-k)A4uaJiDemA(YWeqTCe87kF5NT@Y%yW zu52st{y@b?MO%RP2P!1I|9>_e_HiHhY=o$H)K` zj8~k(W&vFoOg4yfv$|NoYjXr8kO1nZu-z!RfPdOg+F1A?d!74x5o-(lD)KO0QN{_=cO-QbSv9$^yUc z!gn5TH#P8#laZ9@o9KA~37$l9U9u!3G&I0P9BOjrYVdmK< zj+M<8dp@j#XkUgzK;FEV(~^vXWCa(Z<8YwN!>uz3j#{MzjG-j{89uD26ud-L{(D4h zP$^&lM4Mh$Yb2G3)$(Tq2Z&PztpZ0L)61+~bp)}%=U$u>=XT9@fx*05NN#D@3WCd( z2j8zrR`#qE99{Mt#e(&xFYZv%s|F#Wfg6H6?N&0G1zWSuEezAC|KN;F{w{^vLVAB9We zV=!s{!R;=MB++tzg(vxLCPXS6R>TP}BT=q6LA->BFM;+-3;u>inb2vBvaF38TRf23 zb~w51@T}{e^$2V622%-@V{#tZ9@oMwgw#TwH6h_6oRyqD$mDIbC?QwYe#M2XG-bm~ zms@i9<3I;Ui=rQO%r%f@&Zd|f4Cr@H1+{Q9btxdl-%|H%QMxB(txQ@g->Q1M;mwA( zo8N3+-rl)Vby)2rdFYUu;|P#5wi0oLAKOV;90`<2*7!9C2rH9-(E~IEW~phPpipJ> z2?O0Q`t3COnzX9gGHKqDBYDLzm}oWDxVpva<(7l*dsnL9LZe#}7X3Lsr#;D^WUbT0 z53x;xeFKg<)JC;s4XS)!@{Teo>qzOrZy+XP?y$n44D>dD1u-BeGKcNCB*Xp>J5Kljf-6?-t8crONqN^Yn(lvg$Xa+b8h<- zUilg&m_UqE0?Fdn@WBn_C+&i4D#TFuM)EVeN|bdUw?7G#ds@e^2xO#-Tx@B{(Xz;R zoU|S_aEEM)Z|ElV(4ka!WZ*48!0{cFAH(<9AZZY)ny7HjzyYZ)z_&F7Fu;X$S@*oe zC509{94Y7UD|5=pa?G?iWh!~WX<9Oya`~B)dZ6P3(bxt4+kOb5RGt|R-Y4w2p}wJI z`ovo)AuPRBZFo%sD6^L13uVzxo56|G&zQevzN$+ErCM+t>ahbPh$e4Tivx-s!mP#X zlwBR+r~&1BWVj=JZ&LlPN_yC*?({Onpx{RJyz}Sf>3aTrj(EEl4r|Y=Kq416IS*HX z@gNy(H*WAo$h23WVgj;0xh9zn^eN-dx#S61q&hXm~!P(GlYpHyM%-fCNQ*Rk^h($3bUbI_ZG&aKV9j7ZYi zef8jtgY&yq9n}kox4-`8*O#uY)E!)|15otdZ)*Qzce3f|+`vNJhk?*f&&}Ey|F1Y{ zElydtCaqf+rdF-3e**+EP@D?vNCtK+jlO?%Ik00TaB8;aBX=O}DOfi;-~rZIFgFEs z5DX1p!R>9gw#|nUR6JP=!4b>aT0fcEt-ZPX%`T;wxt(;|H==p z+>QKTa_Q2t=P)Yo%lnUcWjA6lf)C#bujDl?ZHMO%*N$J1%1R*t^+P%a(}PK8Fy*XE zI_nk-mnwh1_6N29)3&><%k>9R&Vxzk!C!#7MAFaWHR#$8bdJNV+y||;u6Dx*dv_mc zGyJH{iSUmOZtH3>{J6!0@H=|R%2d+(HA>D|{t%g^=#Z`_v~`njNRiC{B#Ss#_%yTK zr8^uMLwAl7gESjz=tdGBN&OqA+i@a}wd2GNx*en&$sR-kfRb)h1BGycoGfA{6^0!C zen0&TP!if2L_+i!vs)zI6=NGPqJg25;th%;^g_ZyXqJh@rxKsTjbT}bq)qn&ilo~# z635e+W;hn&Q={2r{kf;jRJlH?3z+PSP3s&UcjG^&$9l8f}TQow*0y38|6PY;r)8E!Bj9m_y9*o6s+6zrfu_sn7*cM3q0Jw zn6^EzdQ8FfhHBFh-Tl0RxrzC+3pMl4B@644dG+fiipIRo53E~Q(8>jh*KI6lhlFz7 z!GcaMP(I&(t8d-Ke&%t3lKF;(!TA#0X^2e zR#T5IT~M-aV1fFk#lfYH#qnhQ0XgQ$J}GeD=6YbFH0%CiQvjsQx`Ccsw=Eu7Dp@?0 z+`3PSICg?PsUvDr-l`=2+o~U!kam5i%T#_pFMr*HC)(!rty?IBrj=mnOi8u2QIym~ z3OPBudv+q_u1LBo7JSQ~sBEHablt*&bnM3i8w>8__I2uhW+*f@gUK_0 z_SVUD7H)@*KH^w!;JMyfWICi)3fOSfc7J#i@c#335=F5Ub6H0oWt z2UfbTIxz%yLOr z(%-#qzkH+VD48Dmw_@*GzyUk$riv!yf7$%*bgZ^(S}gF_#J|C)Uh(v zaT8&YZY7ul@kzV@Hx(XRT-RsP?)+KX#}=&I*8{2IP!gc>#Wrfw+j&95H6aeUr_%@~fmeAu5&u8*uvY`!Mf=S(*Ha=xGYEnCp= zhAwCrl&iuXD2`nZX#dOlXXbUUa03Qnrew^0<8ZN+*w77>1(o0)P`hr!|2AoFS@-pw z>Ob4ve?aU)thkwn00s>7x9J2Yw^Sl5s-=kC)E?rG(3wretmnb0*u2gE57c~CayJ#v z$kewej&8fC2qNWP;U4I9rV?rR=nZ^u%4h8{W%3QpAc#U-LhPR>zO#fVWTL-qoE7L~g z`{tL_LxZ}_)?>!PO0>u&eh=Cty7+TYf3&iG-b?+Ao>R4Sq?*t@+jBEEUax7GVB?Lv ztt2~sFqJ@kx8b-L!r3-m@WCaw6D`|M<_n@fk<~6yWdPkAZ+i)2{m=Ec^}lX1VYW=# z=-)2xrsaEvtGbXqauUnoD4kY9UO?%9N#?f&z>|q^C902!pW{%|A7m_W$^90S+e#;d zFrl$z-%y1xtkI4bT_WQTFRYr49BmZ=2C2tj}6bA3xgE+t+jImv0Qto6+pgoOZ;;K{`?rY6>_4 zbK~St>-tC>^&4F$dXIGXo$bzkpALGZ?qMsF2bX;G$|#&@5;2f&Q-{z=rOI3nhheto6bZv3M>9Ng4T1B3s8=Koe=mE* z&eH+cND`cpIv2HBB&<#R2f7hUB~uh82qyD$nEw@t@f3$szqe^)g)4O-7AD)LjD9GV z@qkMd2cv|Jq+r(3I0!PO{C+oue z{trtJE}r@R^Y1)=H?Y!la2Yl}fx_F*-gg!{X6+w2 zO4rIO-Z*#XT&lc@ET=E5lyAS$H+y_OA9NZFd4^ZqwTqWh&0V1M-hbgY}baTTtWmcOy<&aO8O-Z==VTWK?$j#D<<3stif9I{i2x_!EZgVm#xD+lgcoc6*! zw-Kk?98SY&%duO>=FfijlknsZV<97Ypb#9UC%! z3d@%AwZfL=CpuRO52u`mlgwzyS-xIOpDE#7N5GgNuKmlM9bH>=Kir>>`v-0t-HSU5 z@%Yj9YTSS9*L9T{e;lwPJc#7#<&i@VeuB==#T^H5wg*o5FlmuTydFM{F-~-`!^Mp_ z99%t*j%2}fDbE25OJhbFi(u7q+^MLK!)c(Ex4jN=wBXW>%Q<``3RyenF!Fioa z$m5-Y8>h|Ye4W z!|fiq^9u@<{3*UHr>0f>Y39JM8ogeF9^Rt#F#i-^k&~{L4+vY;dRb9k5arc95?hJb zdbF(y&k)`!ZK-DUkbj|7HF)2U^S)M1xm69-32wOcbMql#8`{vQ#0z%Wv0)zHfKr@odGjjc=oxqeLU$ zj^FL5iP8!^zXLHl9`pU3`2J3Qm#~Z9E$o)-vl^6EmYonv*QOl|OKpTCH_J{L zs|ucGTwK{LiA*Vm2VCGRs;Xv3VrG|e@r(mM@yzy~4;bRqkQ+W&ge_AoHu1QPC z_IcqEHjK@iJ1_FzVX%*lM|t=<$o32lU17+%bf%$3&&VS}ebbM=la5A&o~rCn7??cp zY&wdeiB90iNv(BS`*vxzP+@ot4I!Z;2R)@|@C=BWk@a9@H*@4aM)i3KDV(hC(Am{> z>U96v^XJ*Dq>(*;9)t}v{o?1dBTA)WLddq%th&b50|vaA^XgBiKTsnRovD=FUfU^(ZFzt&xwyh$ONCzh>stKswv-Ut-iZ zx#7gtn^l`wzz^^+aF;GkV@1rwtldpk)~#%$@E@dP*H%CvzuxLmFuz1<_`k}Q4J%W4 z!iwMv*%lF#Nt!f~&6k-a==|t|p)Z z>GGwVOiwAX@XUKpFSWn>{Hk-$n$xSsKDT6n6+v#y(~C!Nsvu)7h4MBtsF)mz35AFW z3WLNj({*D&6NkY|@~5nr>2<6+N!FA{y+JM5%-;GD#r;d9yGa#)1;73o_o>-wbFP#$>^NZ)}7j`WA7RQ!Ddz01sk|q0-`3F|ub87Z)ZL&n`7BHyupY9ZGKLOa>0G+vqJ03@BK4P{_&U zc^|qEl6Y%Ww?X`=m(1ek9$Z0G7Vr_+!~U&l#j0X?<}XbFJn&1(uoAcO^L%*@bYf|q zWn7l2v(O7>ZY{Bw0Tjr*7jR|hm!z7nID5!hz>h+yUCpiPZqOI9X$^nID8welaGo|! zhRql|&m29Q$?NSqa_X7R{@zo4;jZ2@IPn55eouGyA3M8gv@`Z>oy8wx(7#WE4nr>R zG(XiFFz8NLfy^deoxCym?U!ba_lv9M{cjZCDSoYVHt)W_93Fh&9Q?b-Z`h;(`U@1% zC;lts7k^5(KcU-k+*F+;B*=me@&wBK_v)kE7!+H^^fN|cZ(iT3tt0~nhdBn9n${X9 zo-WvGplrI}n^x5k*A$aT$sqO#E88fxN3sUV`tQYW`dF@w#Cuwq?7~+$trNA8MrCut^^ra58Oxu6 z>Wg4XnxK*ghhLw<(x{8+Z9q&-EUwo6G2)ob^q#mR7Es|hwx^hZT8KEQ8+XYHO z=I>TzezJFJ*~~XG;T`OH%vX0P@3T)FQQ=fXZtxNV73Z+p*C<7!o};_7xs}i;Si+mH z1c6+3p&YdhN*v_qnmzMgo>H6l+)9sN8zaqAc8wmA138b;!#O|XAlgx-#InArR(>Up zDIqbB_wf1A+Oe%O7POuEx=wk=TrPN}GkM@`$;^a&aL?P*d!jph>I^{(2}Jxca!mPa z>*-X|P(1j&?EK}c!RMz8bhF^r+}!-ter%+s2|6PIM@NX`guRn-gAHynBy0vKtM@c4 z`Z@{II0h{Jv^aikk||k$9mDv4K$C&$({a*tTnf(FlYj@QyD-%t6k$374_ZQ~K4XWz zGbI9MBmN~N_}}REBh*&f*M5vp#wsU*d*eP}-OOnZwtME+l))tI`8k!vnG-pmZK4uj z#u33Ws%EH#gTqEgWskuuQB2au^5{lpnv&jXl+vTUF~ED&5#DUzc~BIgxk_<(gYUNT zU~@tpco5cCG58`T?O>4%mNJS1D+yHuH(GpxO5RR4rh`HtRs1tb>OiZ&?qVB^gw4>R z$pjRos||+`imQ~x#Nt9$$pR`1lGUEe=y8A}YZaxB69gnIk}gTw#gH7gyum4~z&{3T zjeiFju59p`1! zzu-POa3EI)v4i|lcCcL0kqgbV$Tv__GOwOVcRD(PJDazws0>!LEv$G)+bp$Z?hU4t zIj5xhCz^A#H$njIArHS_yYaPUYdOO^{tFxZb?rt=;D||S_GQCyt+t<%T_rzHU8i)y zSAT_Guo8@*%$qxbPSRm7rt;*)C;zq?H}%8JjTtyrVEvFW5;H-?wP>W#Ytj_xK;Usx zK$B!sl~Evcgsgq)S|^;EMbzUaXrhp$0%9&mDd1W%>x^k+SfR|J93F>zumqGj)UhXV zS^Y$O0vRX4ApwOu!k8gUPA6>$VYEVK{|KRG(xv|!Ol8TtitK~(KM}Yh^j`*4fR1n! zFT>XZ$i0*zu{y^_<8Y127+Z zNGe@fdrD1ZAvx6!2y=5%($_X!S)nt-?Fcq+y0kE0Ej93jiZ8O${Rk}J0*)+)2uq-U z3XXyihmOK_2uPX3M|mGu(_Nc3kaD>Os znFAZ=3ou57jzwdXOG|+RqnD#hPWYc@PK~*gRn*LOtvbupc~GBp)-M^Co%O5E z9cdhg(3PDYtIqaxp7+(UZ;ipI_IA^)rj)lj>8)OYzlI|pIo&tA*G*92e0A(QV~>Io zby_@&?>}x@XaV7@|21gB=p-*But!5vHebw{RmLNUmg!VN(zJ)meuIQdll$I`A)L4> z_n*i-@#ex$9~tr}*~3h=Lsa`y;~o6B;YbQp1O2&cZ)#U>a#wF^SATL>f7-bP+T6SC zkZ+QZGPvyCwrt&od)i%*a#ttav`SegF)VhFdPlibpgY7C5F>#R+I(eodT81)KQ8JL zg0|al0<@BD7rQXAH5LT(87zM}j*}ChT?M2bIy|PRam+Mh&_Pg0&Qh}=^5rit6X#SZ zWPjWW%N3M~vSIg%vX7!3D(SD(4GT;K&Dl6*Noi>!Deuril_1w*L1(R2Q?{liIjoRg4yYwumE$r-I){DA+|+T@E2Y5W6B#txj z-r=b|I^(q8S_RM$jpYTG= z&|5oMoJsT=QJm024O2QvmGRf8q+Hc}DJ;I(-PPT+`=xddRw`c`(Rz-JF@VUF=L&SUd}xbeWx)$NyVy|mD~II-&9 zakuoR#^jz8f9>h`8_4RrRy~zC8{6f5=;m9mm2mi%-M67W&NX$z4Z(+P-}D z+@J3whn~(`PRWjb#S=<-+LNC4RnN{fkMFkqmR&N;P5YmEXwc_-$@Jg5UWp2P&RoU4 zoFCwR`*7*uCk*0~)Ntz44Qq@L37Yv2rtk*PNH2PFG>!GSD?>E!h8aUl&*R)qz@6Nc ziUR23O&jv&tNWed)(+nZgo=SxRl#zseJGApB=jFDWx zK=TB=`zt~}PFlgTg9$mTwZLM*nVYdeqW?u30G)Ud1%q8;!Fltf&MFP`C?co4y?xU8 z1l?!OoH}zLSR1!Pcjgnk60gvW?Yhdz#aKK7^l+j;%HSB+5Q$An_A5*)=S4~`(v23B z_zFUbwUaupSVcq!s+2L{ToEyjM32}wWjv6rjSNkOQCoo#OjC+jaPx~}wBWvnLauY9 zO5**k;rXG3OG`Ue3-+XIx83N5^9iV|S%GiW-td@NKtJ z^aQ!|tcJhb+(ourx$~|+S-F4Jb6`XKJx>+6_k_g@=aJliW8~n`dxYOWeW5whQu`MO zJa*$(w=N`-FKiZ+chklEY7?fW@eT%}4#w>!jbwHqof6D>YGI7nPUSifnxUM4V3gSR zO#XM6ra(Q4QQQ`IXw2D3utdFX@LiDc4PND;!v)9in8|P>M%|*K5*qIY(406aSi`cN zP_xRUqf$D6e$oH^@^{KVbnGOTBQv*V7Oo@p>QGI^A6lA zfo=xZG7h5dFVJOd3n6C)bS4R8q~?jsJS;Ut;Qz8jm2I>4kThh<7zU#_{7quEvK$P{ zldS5_VH$1n)SGeA2`yAIfww82ydCF8MreKz$YZA7-m>|wmHbManPJV7hv7H|?(}Q!w6`6^x+h71#py0j4C}8BCzE507UxlpTwPPz2 z6YM}Kpl`IzNns;##l`ysT12`r?9U?0;-%d3xhs?O`tR|z4S+`c2+=C9Cx@edi6+ct zBnNHcFJy;|489$EGlo;@CFcNL>FTX-?|ySP2)w=-fI$<~m2La%?I(>6(^R`t- z6&I)rdlwDgx4vUt^=)7C6v|lJ*|(p4^V!At_g{MFrF)*e*aUFaJ^VaNR1M5% z%22Tl8-W#-Ve^ODh>bwghY@0P=bYTRS|I2#DYa&iPScH+%G^Uq8Y8a-XpmB4+?i^n z{9R_}0atsNO}`{&1u?63o3&e_)jNK8DJ&Ofxa7dwhjCLK+0)mii#hwj0Rxpf}Ex{Iye2k#VXHNGxa}hf-xb zl4U#6`2g3g$^6z-{sAbIFt5?=Nnd-)w>RnAn=YtI6@-!np~Y=01v}HFb*a)l$UB7u}*(*-XeDi=c&3TW;d z3XPxjP^7HOoc%(twd!H}q`{$>HqZ`+cN(i-_Hh9o3{V@4Bwb%YOJ<-h0ede{eOaZ7 zX(&r%RVqk@Agn^39NQ;N@ww8b$Dp(%-r96YdX5{)E!&g?KmQBLHPWv9n0jbd*{xbJOBOf|M-5&@b^d%r~)PcCr-*sXj(9(a>(Ij7%Dz+ z**{}hz*r*}VyxonR1*R5uW(6SS`X8$Oz>WIWj02hDX0o@D{gxG5}WA}iPCF&Q&KF_ ziD!wxmZ2ngp|Z-CdoK1Q%lf3UKFG3O>U(+L#eMUk*B*W4(L{ham_R>|1#|%9vN&Rj z8~{61+qvv=6O*LuVh>BM#^pf8%lj|xzZz&=sDbJQA$)65q$*;M*2lJjjF)a;I`U#@ zVW1Q*3}EM6Y1y>sf2;h>a(KQ(EX1J8LAT}|fJK%s2Hp%LT6W!bk@V&)dzoY}i|vco z@4a$($$lXF^nrNO!6o}()=3DWmt8$z|KZJ&c5sfsEd(c^xLy@Of*844-o9v}I9{^n zZWh0$@%x{q{49(yJ)zxS?P!}muokHmeXGsB8-OS|9=2-#qZovqP@idn9>o;9C z&CrSr6g62usK$XcG}#&W7Xd!w8jXh(9pJe@E3zQic%_C?WS#!!eX?&Ovt+!#|Ndad zrgjC`M+uB~0&7bW1K-(e4b~;W!O>9|f8z^fA0ex)rA02Xvj>h_qq|fiX<7=h>k3IB z`D_kVK^q0Pl2MD`mPy8yit8nG(z0g&y9W#0hpT58b&x$*(L}A5lp)TNBDqm@i0zE`k12c_* z7Aeg;3fiDJyp5)uht3g7I}?!uhn<3o9vwao1^Ur5@X|wzfv!f40bR@_7-ARQx|@=J z!(HXbr6lRQoly9Rsgq%3^{3T@;6@jJn+V9)Q5iTifVc*A5^`lIQMO+p6)T>?s2J;6 zC`x!>rUDIHbjMX^;JT{@fatkfmWwKqz@IE?NEUTVMcs(wThxoVymkP(B)zSYw{>A^ z$=ivKS3ybdeBZw5qgxKn4}Ua1w-Uv_X~6<5R{@RvA7#Cr+}oYbJtp%zJdZT%+eLe2 ze(NuBKx-}I+4?A6lDz3i2}bMiPhUR~Qd-FTwTuW6Mm&@%{q577%wU$PX?}EV7UTpn z3?FZ#`+-fn(q;vQ&(vs{{)X=St&QG|a->R08M1V^zJmQKMEC_8aO{tqkSXRE6RU(YNnV?;cnb$}w_}_C7dt-+}vj`v$X=mq@j{iV|-=<~`s?9_kp^_XZ!XT|j3m5y6o&8d0|5E7mJQhIQOooD00>l)gIJz7Y5xlrSpFFpY}k1aYPRt86M6m; z?j$qmPOG}!*eSSzK0%MbqBfQn|h0$@;C~D zn%cSMHVSP-%TWY?_`sR_eAk68!tafjb}c!(S6%rxEqI0xikp(f+oj^|iQ+DVCN0T{ z^kta7WWCdZ=NQvZRNr9%c8u2;71Ol;@bLH; z$*F^ksfVxC$#AQ<5pM}mml*%=Qv@7}O)Y|NW6-l%yc4+?>#wRihS6y85YA=|_LTc5 z92411m{?}IKppp4r~jPZ`4>?G^c&5v8zpXb$=;AQ369OAQa*6uK+?5Eg2{>3|ElFR z$19G7nm3v+H7A0QNprbdSp;l0#z`$4_ikGC_#)1aU~rOGKxZWHrjMDc`U_pXW!&3k z?p`!olRAkt^e{|;L!u^)q|rDa)hd0xYp>!8O_e|>z)yMmWrdLln!{6Uw;9_BM9;>e zUxrbi`HY$r!I^qD+M_0u2u;kaec~vCWif+fZ^n5CU{t8B>o#2ptc$XZ#1u1*Ox=q* zU8s9ZrX8ds5o-}ewtB`YRzc~VgORE&iuK#-pjkSEOUR;wr}Eqcz{99F!gZhV{C>Sw z^=Q_XA+XR`^OLN1pJu(=Xr2CAACm(zhLy&2uz{`gU~0j{j%~8OE!;@FHQ8FqvAt(~uo{Mr zZ#p(O$zV+omy?iASh!W(g?T!$R&|pvEMq&-3Irda^#PcU;SfbGp&#cch^!_%rQEvr zZ)@-nSpsfrH9^#A~*z=D(%7UB#t>O>S z;o_fR$TP!w@kcmHS+Q0JenrX}Cc~+ac$iKKV-$2URl>SKr500TXGT@qMzNKudXK6i z2Rx|S@23;Pl-%hHq+1XaPs$33#aXET_aS%6rF1fEu%4VU2A-(JhpZ{cGR473A~1iA zTA(%$0Q_^Mpe$KXCl%Bs3!0^ZW++ArN+JX4cFtQEeLO;D)9E(OTQOgJ)zi3A0*JCE zsiY}c(kYd6My=O;CClY?a|5g8mC=FaAR=Az1^4qY%W`qW%efbGUp?{q&>LU4^o7e7 z7)rJrOwh$#X2c(gk^qtRWi^e1-e#(9g7DN!QS_V z=}Py%aHjGK5Vg_(yJbc*c1R^VqSlqt^4LV8v?X5B8nr^Pt2A7;8zVte)}%%p9V28` zkQJKL#KWKQ`Dv?ilvFmhI!Dd4Wd{sWNrgxODnFGF8FBwQ-wuo}rG6RD8TveMiDfjM zX{!PG{*>yn1d`y1^~U!$CR8DfeCR+Ix7|~-Ak*(@h*rhxWa*c8c~blAb*uKw+)+(R zfmTDQy?#^INo@Kzkfvt!2xlbIJYBuMPU^>yO}8k5^^TUsaEdb;8Jgu>xC|{1Y87Y) zM##{i43w`sl&aS%&#^9?m>jnWRXTGyKfYb=ERbkX2rD_tWpB=Ot~45z@KtxX2js-FjK|==5IoNZ-$3)T2Iw@$-7FDuE=O zC1iemYAMM4h7lObuob5V)Li;LOnCA}J$#RzM?Dgokk{xP->c>bxgq;Jp#IYLzDljhf`10i35caAJSCh{_8Bo1J%d^-3I&`&oWn#tosSh!FdMZ&)?Ba)is_5Ofw1+0 z5`XJ%3@o;EX91za&*LZf>_$4v=KBOyz5&QrnX$%I-i#O;rWWlAHrB6Se4a%~@h~ca z-{Gn8(I;hCtRAYlffBY_@n&f&!1#&UDn+cLvM`yaxQ&Y5MC_-MY`yz^bf)-ix(C5R zr}Fegiz2v5m1T+=!;g+V_Sk4hRkwg$0ldZt(7dR^f1_6{8d>IMAF zWgYU*=qAJn$+02XqJu4(o2V=e3lVnJocRAJA7h<}_ks3X=bC70PdS0Laa4H|a?M{s zKDLx6c2)KHalqz-U}M9h(_VGurJgZ?jEA2>W#_qT&is|qz{^b+n_h0c*cxY%WJ-5M z?j=jW?j=v976kcq;SJ{{=iN=chQlk>5BKX@wEf597xvm zN;NP*GEl$N?jiL{Eqof6>{ZN5NfizRm~527e$3ZUtVoiS%3AD=l6~XC&=nzW-?(HS zSn=dNKYd}EImcD(TJqe5T5|Jbbcv*^OLBEx?pksUWR$O$?Da5`TCHg?Y+SPLE~)OW zL|``_B)fUk6LQqZC3}!n*dW;(mh4T;hOb6))+C+HSDnpFGSMWtnqWSY^lp&68!YLPOlbmgF=QhMFdVc1@3;^v{%3<#JTHuvHvZ_<6>P(bxnalZr zohyH(JW<{j%~|f)8R<*9Y9&|gl511ilP;?P?UzxgoTv=hu{ zuKOdXx4g9tn_>vxqkCgPZT=ldp`jeaYOPlv6H$QN7^8@HYRZP9&ua7q!c<*yR zKK!G@@7)t`crf8Vyj&Tim3Z5~aAp`|BQ|#7EhmmXAuNl+kD1`@M=cHe3%NflbR6K! ze^%LBbZ@u$&$|WufT<9n9wGeeV76=&<5otArAbbfHHH*PBIqcJtl#u`_Z&yEOBvyp z2cn)Pijdb-WO_xQm$x|_<|%d>I)w6cvGP&fc4a4hT;zSsM2c$|3T`$6$Oi9yd%Yr1 zEG*_VX#=&FBtMKvCsPxK`@oHp@YL9g$%qXz={{-%)ha#(mfbvVJ_GY~uyszl32g}b z=8}&fTcWPS7OsGh)_}=I@DoFGrA&kGXUNkDE+Xn=&3^GlldGEJQB100tMMI;@An-Z z*b*kB2zz2wGp^WvQwu@&49|@0?1OTw!p(R{ta5FKWu5tSeQmfaSg-5Z>oqO;aFEnU z0BOarI6FFBxh|WcYX>S5Q^L1Qdp80~XbR4n>Y0!EdLVF<9Gt15ne;T3Co2e0bE`W2 zP{U-PZZ;n<9}k)y2yREogSc2qd?2bWWtH12Qb{I})(E{w5y_`DC&0{Uu8&4y48_lL z*X;$X5Qvq{mAzOwS2-V8m`dbzMy%JId4KEL{DH4LcH-5MC0`Tt(aFMksjz<8zw?Ua zhpx9>lK%i4mWuL$JD-<-lX-DG{*9+!DOxB@0@bFmJ5kkh)zhPu13f4yf7$gNSE{%I zi(*)iCyJZW4xylM&1|DuY@h?M3*VXc!GxVHShGF@5`3}GfW)p@=E#QFN9vcY4lRhp z@a3`3#^@7)fE3Uqrr*re6_t?30f@|W(Sx#ugTmb?8dgMLp{9VDA)Pe<1<2h?H9r6Y zbM(>CbKz8x%p*Wsd182M{OH&TU?UJ;pn2p`E|lj~fj9+Gnyysm!A?I3r1;k<3tiffO*lk9*$w zyluoh2J_HIV35R&1gtFVxB;tf99sMZ({mLT$QWl)4zfna438mk216ppK~8HHT{4M4 z>`o(`mKpowJR+<*jGV;u(vXX8M0q0y-(cyEJDVT_HoPAxpVYn$3A#W4zM+r&60Mko zbk-p@PH6&xknMC8s$92)?1qbfZRxJIK;07!9l@I&G0)m&txsUSoiSqx1ntmgw+TiO zf2ipi9D`yzMw(2DzlNdk>aIWvBc0M!Xzm1MF&qz+F94$2yS zNH|#u&3>T^QJ2LJ@T@RfqTwPh38v_X?wBgnX|Gb0ZWb12D90=%v}_lPX2 zz2+^7BhtL@jp9qiQgM62+kq%1X0C7}IMzZpaiYPDqUjRcjU>KhEBT1L+nV%lk-S?L zLvM|}Id;X9*h0Tdo`RxXOO9R?P(-;y;2FlpoFzrreT@)+~9qUGo-G)TI(7 za=Wvt&trXio4v2V^lm|6U#swL3y)O%Io^Gi(FILKY*Kp)2N1v->J*K{Z3s`IO=G%v zj|I}x)byxQ*)mL6H52ws-3~LuHV-nfzq~>hl*O?;St&Anc@(n+Ev-UTr)YYrtSRgq z4Xz4x3S;Itx6OY~(-2b}p~-tmUc|Itb++TB#E!s0JnpJR#7;T3)>3`f@ew=Mxd6$lmpo{G0rpmlu;_K9NB;$i=B2@aWi}1#4k&0U)xyx0xua&)0_7l(kn19i7`QX(}`@U(p>e(N+ z@BamM45#RK99u1KShiZS^Z?otgXrU(`tBsN%Lv;jexo`$vjK-P>o+5N5+et&jDczB zOQQof=up&5La9l_^*cjyXM$&e(i)b_sAUF=8It;CDkHI&FkIZ|cGyg&=+*D79vSNa zP@9pzgyGo??_XNtX&`Ru9Y`*Z^G582fu%NbYSX`7Lr9C1f$Ks2yn1wcgLfb1jA92?EDu!)v`AjL7PeB_NuOdHf+U>C6P{5-g8jTy)pobDpcDRY9CZ5tJz za%O=5;MU-oNeY@YF#^OTganYk5Ct&@0s)$>8KjC>fOdd1jnau>BtuLZ$y`aqYPwb+ z3m!?rrp2*_)Qn*vXW)pj8plx}Riv)uRWEl%d?tVB?qP^1MNOuLD(Mp^a8y}lAR9xI z7Lw6aS;5H!lz&1^)E!0th9-OB5fx$~HmbAA?_BNnt&4-e8+oihgOTHbL?i`yK zjuvWy(9V6q9i5s#5^*otTeQNBlD%=!f4MJiZ(OqXF4qB*Ot#LbCLvND1*Ptp>q+|B zBp;@2e>C*sqjQfg3=xJu>i2JgxX$lpQLdZYl1<%GQ#Vwt45Mt5RJ18sv`s47wp?2A za`VOJ`9~9_?aP(b$;vHK<(6dS4ykg-G8U5M7t2uw4kXPza8+q`Bd%ej@40=^srQQz zI}uPq{fDbHtZpFuNF;`KT6m%oof+Uz!oC$fApFjC7~WxB}yWwk?qKXXJLvXEW1~ zH6zxU#vtgFG{bxY?z9=_ooX#cSQ?BT+w|O63gVys`)NV^l?)B3fu9&GzwOgG`XUGx z+lEnX4dFfwW7yuId{BK3eSZSW8@#y<`Wf}ehz_1M&`3^cdO$>Qau6X8!N+9ArhAw` zr=+|iFkmK%>zfT8_1rfV@F@2%$^Z8;s}eHZmcg%s!>Wl1kU{|IagrIgK$RjJfgqp` z%r{PsW+3JE$=Qw_Qwf@y_1H0(pa7L@qJ9eLV^cr@QtJ*YcIjjabL?0)L>05bM(mL@ z8Ccx}xj>>)z?_W?lO@dFC|kJUv8M*Jg_ESd~C3IQSk(aUnL7Ky)sq6V0r zwC>R?Rqtrp^eRoo6cQ7bs>LuWN;=CWXL-`uAUPWrN|&5)49Z_Etw@%3NTnUg(mhh? zo~xzzTse+)FlM!~i)HcJEs2t?5%&iw3fn^8QtoC%I&^d`9?^l=8eZ>PEc))jC0Ex9 zVA)z1+m>8=aFs<6u3tF)zH7(NZ74!`AifoNb03^LIN!AJ=abDGIzeGdGhg zYLklE77O00c(dY4!4Cs(2a>%HO1%%piyn;Jqp5;gBv(t))h)TYSBlD(Ynm5&U)jH0 zQng%GzFb}lFQ#IW+vfJbj}xn9Kx+Da?!=v0i$4w%qyBb9ueq$yUPjp4nuJK3u=)D_s~GQEs-)m~~eKb$SUigh60G7_5eMjReRpVKiRqWf+Y# z;^^}u1HOr|7BbRSM7^!-+m_imStr2A*KtHu(g+Crj6o*w0V6ybV4O~#0_8z~?{lM5 z1o#MU5S0S(5wWX4VL=v&p0YcFP9iW^z!0X-Gg8c@k1O2q{6$PhnO&c?wfC zK({j7K-4H5Od8NCzl~szJS_tgmShCV*Jy?W`Eb*uK60tS06{*@)b`J1Y|hh*z!i;QeZKZXzY%=x>d{w1U{YbSoRe@ zyB`8GN0Acq)Sbu8HQ#0aWBx9)Jc9^qXpYbbRyR7P#;w&LAw4McelT*Gwdigykm76X z=`$?SX+TlPtb6k^1}~P4lc)=Z?e}9R6DFF!M4}?%c^s`rUGXd3rs;X8BHa&6?xC!U ze@Wd16ccpUvKJ-?3j=X?2jG<4#W7!OG~up^+hv!7EV-bj?CQf4-}y5#k_^h97IP;D zs07?44NWig4~m%T^Lgw;%|SEQZE|h1wh7Y=>01D7M$S3nmr$!~T~_>5pcW0U8R>my z?HLOXn-0yVQgN|hN&^Km6rpH=Pbc^p8+1Aj2<>tdp&ckc?9uHrIfU>8fgK=#A+XDV zt-U$K0=bIy|5gs!bt0k zQ+qb2)($&+OB?h^2^mW`t7_lANcEcwhc8hjli@7fnk zIwCAYwfPv|FaI5rZlpFNJOeugGD_2p(O_nmSsv)|GnTKy0azySGv@Ok_2-y~Hk0Hl z0@<7=RMD*S39bxkKO;(KupXh=j${dI8<5HPLj;Au)a3EW$#M2X;(y0=Rhz};5GT-yM#M2WXaFOogl8m@ zAzI3<`R~hjrGcF?g%BB&xmL(+fx{d<2tRcP&DA9o($Kw?&iZR2vcHRBn3I5vKgcVS zPqJ~B)VS;Nl+@ShAlb{Oe|C4*ackg?aM9;xQ z_25s6hGN54A2{?I{MDkNxOZr^C=hk2)%(g{8kw*C&go=Dt5ngNsMwUy?*7o#-122# zF`Ac~7kQW+;Q^Drjgk-Z)M6*1ZTjwtyYBkv7RJA~n8ay=Jd`u>%AU(Zm+y&}_b2iP z-s_FK4t_!+wn6@rThNXL;DU&L^p(bab<1TNzBvf~Alh>cYlWhcZ#vRWT>RG$w*&d< z7a!(u#Sij~m3XGSznuF$PybHtof6kTvE^NxZJ^xpuE&D(`{j=QF7x;6JpEhD-`^t8 z@y^_V0`m`CCQ7|5_47Dp9wAvQ0}&g>GW-$7#-~i9lxN*W(ko1I2E3>)-2=0skSCIT z6MD;x#mG@lo)&c(oN+Fd#QUtJ>c# z#~J7cpqwQ0H}Mh@#PedZc_Pax2Pm2%XJ>To>y(S$N(LokPOEV`M`340Qc;NYl>7q{ zxVP%uAKBH)PJiUcnX<#qfZ$rfDI0vgX=+GW8R^0a^%BWx!7s}jTWQIrKqO>f2u@Ut zW|1td-fdTliMs!9)CCe|6&%HgNSh3_N`cm7pjQg?GAVkj@8!XZg9|;0!1l`x&`_7V zFC2{QjTXy_a@p!LZm%cX&-}t@m{$0S{F-Ebvy|T)u`QQZ0{yQD*Z@{Xb>wa$D)q0n zzt;TCa@)nWh3ePEHy*$AI82J7ww2Pl`6m{Or26fN(j8G7 zBp9-o;eFSJbS^3bz=5|glKauE5`|6_U-K0aO(_02Ox}RcY})JL{?y~xTW0>#QXXj* zud98eSCAEaJuTu4mv|WbK@5H~cvZ8p*j*Pd>mTF{PuvSQrOFv$*7V#43^yok*Krm> z0NheL*cLKIqSQ>o)Zsm2WgLt3DXY%0P{_Q$K`n9==p8MSZ7nV8tk*(oOSq=Pa0KBU z*bKRojV1^J&q3DEaB^}AW-C?VY-20dB!q7xo3zs+MYkYPAuMRRWh)g#Z-%v*EYuRG zX-;)R?#gt`%Jk06!0GuihpG4nG?Qv-dSlL@g@)zVP?DA}{)hm3?6S&a=|-t^plPl@U4#M8#^Fs{iY&;pY{J6BwS0LghJm|&3cdqLn*5NU9k|ra$4T4IMKIsu!6k#?AX1jue zND-=pNk!yg-5Lyje)23t^XGz)C`>A{l5;uA@MAk!{sk!sjAV};YiWT)#Ia*4cn#sd zz!6ogbpt_OZcs1MU3IaB(iA1MMpv*;j*3&_80Etj=7{O2>RAgVd-elSQ zc-oAXP3Nk$G4J1LfIh1ysFk50rl(aR1PpHB?=W&?b@I<}MA*qw5G=}O#XrQ?EQ>R2 z850^~zS*V!M%RfDupPu(|)V2SK!_j9D7{mx806CHuKv>JRO%e;rJb!fa5GtGf@Rb8ESBF zrxlzoAYqZ7YWe^e4uuwcoHxq;;VRqF(8!cM_TO+hi!C6k z%ihun_JF#OPhDGw>*1lwCU@ZN!~P0*`!G2MjiyrTwhS7sxg%r)5HQC8>!5fSeFhKo z9y-+j06AzK3idwGA4IH%VE;q?dmkL??_=0m1HJnW>>Ip0ND)F01&{1Ia3FX;%7E_m zLURhQd_`$0E6jo|_uV!9I~oR+Of(?ZC-x9#EuphOgJEDo%<>ax0ArB%LTNB|aspxW zpixjXsd5dZHiXKRtW{YgWYRK>J_!eZjLo0|$puB~s5s8TO5D$Mb{L}|wHU%kgALGA z7&a0v3fs_gij!W-uj6JN4WE6C#YPFq4sFc-PZ{U*>crvoV?*qto+R*WLNm?ulvC|i zwGKH(EQ&ty?9=dwFKD<4C$e%#nhQFhWuhbInI(HhRnH$tcsDPX z1=0e1qTosd1ym*Ht&{ZLd zXU`*V)(0t`qE6pn(CNypRQJTQ)a3_J9DE%GAZ(X{?aAOCDY)lD&f?S~x3^82`H%F>URzA{9`J5(#tQWmZ` zWrxK!tPG~k$!kOAV)-*_Ck+hopXg|fk_q~`fs%ivpR}}=Ju{PZ6r_XzfW)8B)g&bz z^tk9l0u45`4dLofO@_oWI!#F1DLYv?P$VyrxpR`kg4jb>nX4(`A2BCZCchJjN{Y-@ zj4aPYlCg`EbVR;9BKd}hWV$Vqi7m4gWpMH-+YuRSBxNQr9yVA=-6!h`$+CtC>O_*A ziGNB7@&4kED4`ik{9ly(m=gMG*(ehGs8~NG1C+4WM9F!4N8z6$L9kxZNbl5dw8c1j1Il{`MJ;E;&7PW!0p)i zAtrO7ZMCQ=Ezkit|3FQ=rc)~0l4e)1!p(87IoY)V6K8cpS|?P*YQRbe2%Dsy0E;4D zDvuS<*IdN*{D71Z zQND|lCCw84yc^S$1CNELaL`eWAQUcCr*VtI#cH}!Aqbl_??XHm7C$(m2P|C6w+cNs zy?7`%&I)B8n*2fzT@9q^D7~>r=!iWuKXUPrG>5|lJPCH`_IzRULh)ktrSdd~!^@p( zv|DS)$Ky2Q2>$ub1@kLA(i{#KJJ{}W=N0q!cC68vbaA6lf!2cpcU%}t+vpbo4n_~n zInoaLmBaaqW9GRXX(#=1!K*8sOGj=Fi+&Fsc~Lr@M@RWwjwdn|-Fx9&tSRoPksP&a zKAgXKnBO53#zONQ7st{Z4i{_K?n=!X{kr)$k4KJS996<4KxmlX5pUTkRqq0664+1* zveRp>0wI5`)g&C?*X$L7JH4B?2#5HEa2ojz@$_P8pLUsqd-?gPg}twwgW(~LZ`wve6caj;cy|uc9%nI^eer!N^mb0r8(@bjIiB%xPo8l0p2PU%^ym0*e#mb?y_Z# zexkVK*P! zyT;KzJRfEJe$piS9Bm#Rkbl$=$0$a54q;dg>w( z*`Z{XCMI%wBvHN~6fE2Qk+UDIILVw-@ME0-xsu>l)W#+Y_ce#t{5eQOc`dU*k?znX0}ZP!FT?$HOR_G8#%7( zHQb@RCM!_y1S>+h1rF8%dLe8hq1L~nj?6Y>)d8ri)LwCv0N{p$L!%{c-&KJcEwg(vE}QBH!B4)4Z&uP8O12hOSEQQ zciYM1WyEP=_tKWxRU`28Q*@&x^6r8m`MUH1T4(}c53Y~v_f9@GhR=l=?~o7Q*{QMda4V(C$h4;TbK+m&orr&gBxRYxQ>08la_2V>0qWyP zV&_)r3V#BIiqy=M8I4Twn+B%+fQBcx$sh`$=UDFq;Z7-xPXbv^mJ0DAz3?!RJjEdF zExH*czePi{3m2G>$LW5)@j~M_n$PcDw&ld#?UJn>>#=1AAQZPqjxEa`{|D~kcv;(` zdEtq8$+m=hd)&UA4XM8)<{q@(c4qj=@YwXI_!Zm@5OHCc6pv2(RlCvFqrJ>R_};OJ zkTw9RUD_h;Jq$y#@B!#7oo5>sRUBNj&AOPAnaR_DUAO5VUa$?)mTP)+r;zYyAD(=B z$O?M|y?&cfUfj_>BOrDBrl3t18M=ZyM6I&Eu7OyorJmu9>PK7XEd-$wbgp|0{0uqO z(!gmjeiACpKNk$SU`Jxn!F?Y_ZusZgXC1RSvrY)H$qtikMs_%`*--jn)`h&9&CQJF z1w8AXv5Q4Ox-8KBiBAWWDl>MvY7ff49I+H7ia(=-)>9$xG-`s)j#Dg0E2`CMXS80J z&6~*!<*^=fPSvW{L-}g!pWz_{%0n&}?0(!cIWu`DAVLR!qS-1Lh1dbl(m0!|FXD~g z>6GToG^3gA8@=UF?riQ;xw>#2ch}UXxD!^My28}RjY}i2o*9pkg-*!*x<`H9S?_1H zdd6$iM%6eHZL3jx5pApc>|O}@W}Hwq_-ArSz+qJP`sZ&fnEpp*&0O%7lyPE3x2z7fS8fkOn0^SfjPMN_a(mCQ3cbU8D- zqfBd?g8f92s3h(uOY?^nI^3jEdOhlDFbtD?AcDe#7hapt98lcHpkhCd@)MX_#>U|? zA=f@MJ-`$kNWj@ZuSYIgj6uq3v+`&fFU4j*alQFTU%&yBupWNV7}ivDV}WWXd53pE)I+5+O#e{HFajZ zTDIOfj^?%~7sw78?sQNRNVEp1jB?h z1#XgwCW*b8P+yZ?9iUR+bkL>rDEt7YMo$8cv`ZF^c99vD-V;=8fchVzQE;SioH!#h z4v#TN0P0VI2knAtMe7eLgLz3{-NX#Nw0VbyKg}T>_`gOb#2Q37l#PUF@oBI@3P^b& z3G_7hAn|uWlS%Z2U5XEfvEx)5YzFgPPXj{3LRH)lGVHxn0Q2iKEfejK5y(3ZUa4B_ zee3Qw?|y5a)NxQj3n~rpgQA`8$g{Ab)24^Nz`Q=D^C1g6PFy?W&7&vLM?jqQsEh*j zDO62jf=c>Cnp7VFRqH;czV4?lfyu`Zo&ikU(MDK~qI;ISc6!!5+in7UFn4Dh38#c}Z#szD@1HlmI)hx?R6Z3$v9%0nt;lb;_a z6N?I2m1WGI{;1cehxV`6toZQIhH=3efeztYlo=fhW(Fd07#kb6y(=A{4M(a;8 z2G1^a9F#1Z&fgt55*?c_T)^$k!mgFZ&B?|dsj=tskwjyE#0nc0VSr!R(0zGdV#7eh z4nGvTXKw3CzW>F>xyIPtuuF;9uGwQ?f6FP6-e#I`2#Hq1XL@QjoO#i0v3urEES!itJL8tlk8ZVb zE`QP)l$=458|)%;Yvrkb|Ip>U-#g5nyeHw_8Mp5w^EF}DC%3SAD)QF;Q0GBz0QF)^AFk`cUPHz&|P(R!2H92fMd~u@s>s5 zF!to7-T%b_wp<9cT@TJv3eCbWg!I^Q~D1s5*p_QK$& zHDib=%>+(=BC<+DC?BOJ=svB}udxXsb0wxteq>0he*GJn3y;iGglO`I2jloCv~3za zzfF1U{c5MiV++{o@gx`ts;TsVm^&Vd};iF<&oM3G#8eHjCAw>Ug9N|X)t zRqtruyuDH3AU@_>84VwtE@k8!8ouG+5n04fac7yLfdc3dv9ljPiy0ag6R8{#)MpCu ztKh-+>v%ydtPZS$;5RB4k&TGR+C-#z1(rlKQpA5nHR4U2NC}UU3Pa@SEMd38u!~svIK#emD#t@S`uzRu~$i=KYayg zB*4p9b-@Tnk3{@y984FhU`xjT2kJ53Ue7s8qcFX_7jBbdkTS@AKrOOl3ydWNYhp|o zNxg{mRmZKOJs!a1Pm}1-AOuv4ctG*n)Cn~0;Dpv8Y+lWhScxxDK1$r^pzx6VCS5=| zC$hPphog$!D@Pn#s@k$Ra;0{u>Yl511Ph_7n76zXYDn03d&Zijs=Ke+?*Z5tt}^LB zqiJwZ)d;>rZDcCKr$r)nOrHi%O>p!O^=&&b3n(>H!K84@YDes)t2%19$@24)Zuu0H*AO7f-IoGV4S1QKTV~vcjVW z+^>%4j*R75$prUqeHSn zj~iw&_!#dcR?(fDY7Ix>jJAQ!xYaXoLPQal`7i|^B`Ckd4JCv@}@CD&+RP%yfbZQsNc(++Q;9ET|(i-VNFYEQX`R9f6m zA$(+I>@mu9gc8P_ewB`%qvY2p`8FjlQt~w2z@@@7vNg#M=sZx;IPnEa$h=Mt3jP;# z;ZaI%Q1THa?@-b~S)QY0l#*8|VG7zsIwHj@(~mG&GLzad>d(G$MvCQ6xsUSoQ!;=A z?jaYO(gdBwJJE)1Udje-m{xu-r0LoXya>^bMm8G;88Mi zu_RuzHD0n+@@=e<#=GqEGBBX$eW-eH$6L=rR0SD@viD=1A@ zime5vIF|<{tgmL-;##)2mn|Na=CahwPUbCJ@?M?vJlUtW51S-lB? zFt%(@cJ@h~eeYSXb`HjEfp|rmWZe`WI-KsH44s_dySW8NH@PyO>AdG=7w0RCPA2l} z&U=Cp4mz`&XM^zzR=y$Dvc}O~8H#k6o_6_o ztYy4WfAnm!s9q|nU+^uQS`1%06VL0GoIOwk^HvPTNcC4g4;?UXO>eaDx$_tw*pc!d zyPvyFeCbV&5|~VQzfpW1OR-)2UVh=8#Y2}4ra3ykeCkU0duP_zaT*3FCfmf{L3jfSpHc`%QBJ`qc%Gf7+LBnBOXuHnAV8f^SX0$@C@65NWZ_MHM@yq@|?9kl7w3+?rgtf+- P$`5qgErHH5;`sjoVgmTo literal 0 HcmV?d00001 diff --git a/Backend/venv/lib/python3.12/site-packages/_pytest/config/__pycache__/argparsing.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/_pytest/config/__pycache__/argparsing.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..dbd31814f8f54c8b70f9e8a8e1b662f9821522d2 GIT binary patch literal 26880 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 literal 0 HcmV?d00001 diff --git a/Backend/venv/lib/python3.12/site-packages/_pytest/config/__pycache__/compat.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/_pytest/config/__pycache__/compat.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..fcd427844b8c719b4fd4179bcc566b57cd5c80bd GIT binary patch literal 2914 zcmai0-ESMm5#RfwPW%vMQ?eA%mQRsomart+mSe<*W5}@!3r;N?brB#$fWzr-NuG4P zyX+lhQ=kDQ5Ma^)QtF{l0^}h<3p9oU#C>Z1gaCb^ssv^)GT@@gL-M3p30nB6vv;IO z*Fn0{&Cbru?#}*pW|n`8#li^MOBZMKH+m8J7ag=)sKxBA0<(cMq%j7{20fEyV9Xk9 zk;`%nm2n1N6tV*Fye1f-Vo$cm=R?4YS<&ZvjNW268}{u*BT|fJqrmrSVJ)IX;V<@~ zkd3kEGSd3ikQTqs1|DSl%1pZdJ35$8Gai3kaSPCk*KAj}OvU()+JPYQn_pkPaPbZK z`i0-k(V>C!idvTKz&R_V&V$m9L_tk;{< z4eX0Zgzm?Bk)oxQ{zn#eT!py7Ows2xoumbC&@Q{!ab-PkS_I3jO}s=)+#1Vt4=>pg z+U2&ms4U@NGjE`!B-plKqXJemOuW%&rJXb6bW?WFS1L8>M`{EIB2cp30GO`YqkeQ#)reSj;l9 zbW=ABNwdQKMBSCt5+T@hjWP(aW2Rh*V7Ej}DOUo+uB{{+eA6+kYZ1CO4jgeNJI)rB zvQ$u(vE*9P0+!T*V&=ijP+T~IhHY$W;E`mR(n2X8xURO5r0`IlgKu{~kPTE}Do6${ zXk~Pdp`k0u&m$(w)KNLW1fq&}u#xj3T|$ShElE!oG6k!MGkNn?<`Q<6T+7bPSuQrF zUWEm~xy-AIx&(e^ma(~r))4#^4Q79LA+#C%gpI{=!y{K z({|YtWf>yImF1P>^R7;}m80O0Lo3HBY99JkmH$c{*`+5{8A@A?qTwSl3Csp^_jDDs z*o|Dv{C-P+1Ce160TLXf4tas{3>ksWp%xN32-NG5Wzd3~BR}h=uN$Lt5B)e);hO22ry3G z+pog?(q0wr2H-ibwkG=>bu0clQ2U6tA*O%UhU>CnE9~2o z?jEpl7u(Bpd{C`v`eCGh?t zLZKlPJt(j2(oHW+*O!+SqlCR^&gmM3_eR9yX|?dgmXvsDCCZ3I6B z93KXURys{rq0&*#REk)Z(>;Ej@wg>i_Cm7%aFLU6ZjzzoI3*{5IP{hPUukxBHUK!% zh2YBQFC%<}uHXWBO6$^ry8Cb_y*ZTrWM(U#sq)Q8-b&7au8*o(Uy>Koai+|D!_KU%%=W%O`! z?AS9a9BM=l`S8rAd&y~VzzfTA>o<(-MP>P|l41l%`1RFNWtkiTJ3=cd`~WJMs%u$> z;|T#YXQ(bk39Y6+6665oC>ey$ISgbC{lJC<@ku`;q@RQsAq63jI{s(tW9vusqA(iF zr8ClT@(Oe$4aDoA!3>GzCxaJq%QoZw%j# zEe$(CYMr9yzI)HQ{8T&_fN-8%0ux#Uomn6|9K$eQqyDc^{1F;{gp%JP=@I>(dW0r+ mL^OJ)nLOScKifQbx_NZ=he&9UZJ>Ss-hYA_eS(1a2m3EwqxUrc literal 0 HcmV?d00001 diff --git a/Backend/venv/lib/python3.12/site-packages/_pytest/config/__pycache__/exceptions.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/_pytest/config/__pycache__/exceptions.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..4c352454921979f3a13e552068573bce3a70b873 GIT binary patch literal 766 zcmb7CJ#*AB5S47-Cplo!(W#)w6*&!L=opGXLaGeI42>I&uykk5*^-fbM=tgKfOPo{ znfw&~foEu-qPxMNNyWG@e-Mx!Buc=7s3MHr#)ezA*g3+ht<*GM3N zGnC^PVW+IqJZFrn&QxihCGC!;!2M0s zkD**6iDE2J90(kTt6&^f!w-(n8?*YH~?u`hvcZZeE&#o|#f+hsVau zm7dXKp3J2dbSd?cX6hpa5vkEflV{JVQ>8pCfBv@SlJF- z)}#o4^Q$%b7ESEluK!>54BlC#%QKl3m-0PVP73llm46I!saa%#6rMy>=|~DpQX1ms z3Ti5e^*)-Z$3p_a?QD@tU>Dpv_-w+pAWNPp(b{YM3$YJ;Y9x<5dbCRe0ImmVjeZ8W zbFk(3@%gw@J#3wsBqlF-Y5fzb1}8gzw%#;n{d@j>|K;{CzOwtU#lIOxA#Fm8@mEAP gT@>{00*vX^lNv#(LuhP#!48yH5u%K!iX literal 0 HcmV?d00001 diff --git a/Backend/venv/lib/python3.12/site-packages/_pytest/config/__pycache__/findpaths.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/_pytest/config/__pycache__/findpaths.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..9ada06323c94aa66ed235c2f0def1d064159b553 GIT binary patch literal 9208 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 str: - return "" - - -NOT_SET = NotSet() - - @final class Parser: - """Parser for command line arguments and config-file values. + """Parser for command line arguments and ini-file values. :ivar extra_info: Dict of generic param -> value to display in case there's an error processing the command line arguments. """ + prog: Optional[str] = None + def __init__( self, - usage: str | None = None, - processopt: Callable[[Argument], None] | None = None, + usage: Optional[str] = None, + processopt: Optional[Callable[["Argument"], None]] = None, *, _ispytest: bool = False, ) -> None: check_ispytest(_ispytest) - - from _pytest._argcomplete import filescompleter - + self._anonymous = OptionGroup("Custom options", parser=self, _ispytest=True) + self._groups: List[OptionGroup] = [] self._processopt = processopt - self.extra_info: dict[str, Any] = {} - self.optparser = PytestArgumentParser(self, usage, self.extra_info) - anonymous_arggroup = self.optparser.add_argument_group("Custom options") - self._anonymous = OptionGroup( - anonymous_arggroup, "_anonymous", self, _ispytest=True - ) - self._groups = [self._anonymous] - file_or_dir_arg = self.optparser.add_argument(FILE_OR_DIR, nargs="*") - file_or_dir_arg.completer = filescompleter # type: ignore + self._usage = usage + self._inidict: Dict[str, Tuple[str, Optional[str], Any]] = {} + self._ininames: List[str] = [] + self.extra_info: Dict[str, Any] = {} - self._inidict: dict[str, tuple[str, str, Any]] = {} - # Maps alias -> canonical name. - self._ini_aliases: dict[str, str] = {} - - @property - def prog(self) -> str: - return self.optparser.prog - - @prog.setter - def prog(self, value: str) -> None: - self.optparser.prog = value - - def processoption(self, option: Argument) -> None: + def processoption(self, option: "Argument") -> None: if self._processopt: if option.dest: self._processopt(option) def getgroup( - self, name: str, description: str = "", after: str | None = None - ) -> OptionGroup: + self, name: str, description: str = "", after: Optional[str] = None + ) -> "OptionGroup": """Get (or create) a named option Group. :param name: Name of the option group. @@ -93,17 +79,12 @@ class Parser: for group in self._groups: if group.name == name: return group - - arggroup = self.optparser.add_argument_group(description or name) - group = OptionGroup(arggroup, name, self, _ispytest=True) + group = OptionGroup(name, description, parser=self, _ispytest=True) i = 0 for i, grp in enumerate(self._groups): if grp.name == after: break self._groups.insert(i + 1, group) - # argparse doesn't provide a way to control `--help` order, so must - # access its internals ☹. - self.optparser._action_groups.insert(i + 1, self.optparser._action_groups.pop()) return group def addoption(self, *opts: str, **attrs: Any) -> None: @@ -112,7 +93,7 @@ class Parser: :param opts: Option names, can be short or long options. :param attrs: - Same attributes as the argparse library's :meth:`add_argument() + Same attributes as the argparse library's :py:func:`add_argument() ` function accepts. After command line parsing, options are available on the pytest config @@ -124,32 +105,50 @@ class Parser: def parse( self, - args: Sequence[str | os.PathLike[str]], - namespace: argparse.Namespace | None = None, + args: Sequence[Union[str, "os.PathLike[str]"]], + namespace: Optional[argparse.Namespace] = None, ) -> argparse.Namespace: - """Parse the arguments. - - Unlike ``parse_known_args`` and ``parse_known_and_unknown_args``, - raises PrintHelp on `--help` and UsageError on unknown flags - - :meta private: - """ from _pytest._argcomplete import try_argcomplete + self.optparser = self._getparser() try_argcomplete(self.optparser) strargs = [os.fspath(x) for x in args] - if namespace is None: - namespace = argparse.Namespace() - try: - namespace._raise_print_help = True - return self.optparser.parse_intermixed_args(strargs, namespace=namespace) - finally: - del namespace._raise_print_help + return self.optparser.parse_args(strargs, namespace=namespace) + + def _getparser(self) -> "MyOptionParser": + from _pytest._argcomplete import filescompleter + + optparser = MyOptionParser(self, self.extra_info, prog=self.prog) + groups = self._groups + [self._anonymous] + for group in groups: + if group.options: + desc = group.description or group.name + arggroup = optparser.add_argument_group(desc) + for option in group.options: + n = option.names() + a = option.attrs() + arggroup.add_argument(*n, **a) + file_or_dir_arg = optparser.add_argument(FILE_OR_DIR, nargs="*") + # bash like autocompletion for dirs (appending '/') + # Type ignored because typeshed doesn't know about argcomplete. + file_or_dir_arg.completer = filescompleter # type: ignore + return optparser + + def parse_setoption( + self, + args: Sequence[Union[str, "os.PathLike[str]"]], + option: argparse.Namespace, + namespace: Optional[argparse.Namespace] = None, + ) -> List[str]: + parsedoption = self.parse(args, namespace=namespace) + for name, value in parsedoption.__dict__.items(): + setattr(option, name, value) + return cast(List[str], getattr(parsedoption, FILE_OR_DIR)) def parse_known_args( self, - args: Sequence[str | os.PathLike[str]], - namespace: argparse.Namespace | None = None, + args: Sequence[Union[str, "os.PathLike[str]"]], + namespace: Optional[argparse.Namespace] = None, ) -> argparse.Namespace: """Parse the known arguments at this point. @@ -159,47 +158,35 @@ class Parser: def parse_known_and_unknown_args( self, - args: Sequence[str | os.PathLike[str]], - namespace: argparse.Namespace | None = None, - ) -> tuple[argparse.Namespace, list[str]]: + args: Sequence[Union[str, "os.PathLike[str]"]], + namespace: Optional[argparse.Namespace] = None, + ) -> Tuple[argparse.Namespace, List[str]]: """Parse the known arguments at this point, and also return the - remaining unknown flag arguments. + remaining unknown arguments. :returns: A tuple containing an argparse namespace object for the known - arguments, and a list of unknown flag arguments. + arguments, and a list of the unknown arguments. """ + optparser = self._getparser() strargs = [os.fspath(x) for x in args] - if sys.version_info < (3, 12, 8) or (3, 13) <= sys.version_info < (3, 13, 1): - # Older argparse have a bugged parse_known_intermixed_args. - namespace, unknown = self.optparser.parse_known_args(strargs, namespace) - assert namespace is not None - file_or_dir = getattr(namespace, FILE_OR_DIR) - unknown_flags: list[str] = [] - for arg in unknown: - (unknown_flags if arg.startswith("-") else file_or_dir).append(arg) - return namespace, unknown_flags - else: - return self.optparser.parse_known_intermixed_args(strargs, namespace) + return optparser.parse_known_args(strargs, namespace=namespace) def addini( self, name: str, help: str, - type: Literal[ - "string", "paths", "pathlist", "args", "linelist", "bool", "int", "float" - ] - | None = None, - default: Any = NOT_SET, - *, - aliases: Sequence[str] = (), + type: Optional[ + "Literal['string', 'paths', 'pathlist', 'args', 'linelist', 'bool']" + ] = None, + default: Any = None, ) -> None: - """Register a configuration file option. + """Register an ini-file option. :param name: - Name of the configuration. + Name of the ini-variable. :param type: - Type of the configuration. Can be: + Type of the variable. Can be: * ``string``: a string * ``bool``: a boolean @@ -207,90 +194,27 @@ class Parser: * ``linelist``: a list of strings, separated by line breaks * ``paths``: a list of :class:`pathlib.Path`, separated as in a shell * ``pathlist``: a list of ``py.path``, separated as in a shell - * ``int``: an integer - * ``float``: a floating-point number - - .. versionadded:: 8.4 - - The ``float`` and ``int`` types. - - For ``paths`` and ``pathlist`` types, they are considered relative to the config-file. - In case the execution is happening without a config-file defined, - they will be considered relative to the current working directory (for example with ``--override-ini``). .. versionadded:: 7.0 The ``paths`` variable type. - .. versionadded:: 8.1 - Use the current working directory to resolve ``paths`` and ``pathlist`` in the absence of a config-file. - Defaults to ``string`` if ``None`` or not passed. :param default: - Default value if no config-file option exists but is queried. - :param aliases: - Additional names by which this option can be referenced. - Aliases resolve to the canonical name. + Default value if no ini-file option exists but is queried. - .. versionadded:: 9.0 - The ``aliases`` parameter. - - The value of configuration keys can be retrieved via a call to + The value of ini-variables can be retrieved via a call to :py:func:`config.getini(name) `. """ - assert type in ( - None, - "string", - "paths", - "pathlist", - "args", - "linelist", - "bool", - "int", - "float", - ) - if type is None: - type = "string" - if default is NOT_SET: - default = get_ini_default_for_type(type) - + assert type in (None, "string", "paths", "pathlist", "args", "linelist", "bool") self._inidict[name] = (help, type, default) - - for alias in aliases: - if alias in self._inidict: - raise ValueError( - f"alias {alias!r} conflicts with existing configuration option" - ) - if (already := self._ini_aliases.get(alias)) is not None: - raise ValueError(f"{alias!r} is already an alias of {already!r}") - self._ini_aliases[alias] = name - - -def get_ini_default_for_type( - type: Literal[ - "string", "paths", "pathlist", "args", "linelist", "bool", "int", "float" - ], -) -> Any: - """ - Used by addini to get the default value for a given config option type, when - default is not supplied. - """ - if type in ("paths", "pathlist", "args", "linelist"): - return [] - elif type == "bool": - return False - elif type == "int": - return 0 - elif type == "float": - return 0.0 - else: - return "" + self._ininames.append(name) class ArgumentError(Exception): """Raised if an Argument instance is created with invalid or inconsistent arguments.""" - def __init__(self, msg: str, option: Argument | str) -> None: + def __init__(self, msg: str, option: Union["Argument", str]) -> None: self.msg = msg self.option_id = str(option) @@ -310,22 +234,46 @@ class Argument: https://docs.python.org/3/library/optparse.html#optparse-standard-option-types """ + _typ_map = {"int": int, "string": str, "float": float, "complex": complex} + def __init__(self, *names: str, **attrs: Any) -> None: """Store params in private vars for use in add_argument.""" self._attrs = attrs - self._short_opts: list[str] = [] - self._long_opts: list[str] = [] + self._short_opts: List[str] = [] + self._long_opts: List[str] = [] + if "%default" in (attrs.get("help") or ""): + warnings.warn(ARGUMENT_PERCENT_DEFAULT, stacklevel=3) try: - self.type = attrs["type"] + typ = attrs["type"] except KeyError: pass + else: + # This might raise a keyerror as well, don't want to catch that. + if isinstance(typ, str): + if typ == "choice": + warnings.warn( + ARGUMENT_TYPE_STR_CHOICE.format(typ=typ, names=names), + stacklevel=4, + ) + # argparse expects a type here take it from + # the type of the first element + attrs["type"] = type(attrs["choices"][0]) + else: + warnings.warn( + ARGUMENT_TYPE_STR.format(typ=typ, names=names), stacklevel=4 + ) + attrs["type"] = Argument._typ_map[typ] + # Used in test_parseopt -> test_parse_defaultgetter. + self.type = attrs["type"] + else: + self.type = typ try: # Attribute existence is tested in Config._processopt. self.default = attrs["default"] except KeyError: pass self._set_opt_strings(names) - dest: str | None = attrs.get("dest") + dest: Optional[str] = attrs.get("dest") if dest: self.dest = dest elif self._long_opts: @@ -337,16 +285,23 @@ class Argument: self.dest = "???" # Needed for the error repr. raise ArgumentError("need a long or short option", self) from e - def names(self) -> list[str]: + def names(self) -> List[str]: return self._short_opts + self._long_opts def attrs(self) -> Mapping[str, Any]: # Update any attributes set by processopt. - for attr in ("default", "dest", "help", self.dest): + attrs = "default dest help".split() + attrs.append(self.dest) + for attr in attrs: try: self._attrs[attr] = getattr(self, attr) except AttributeError: pass + if self._attrs.get("help"): + a = self._attrs["help"] + a = a.replace("%default", "%(default)s") + # a = a.replace('%prog', '%(prog)s') + self._attrs["help"] = a return self._attrs def _set_opt_strings(self, opts: Sequence[str]) -> None: @@ -357,29 +312,29 @@ class Argument: for opt in opts: if len(opt) < 2: raise ArgumentError( - f"invalid option string {opt!r}: " - "must be at least two characters long", + "invalid option string %r: " + "must be at least two characters long" % opt, self, ) elif len(opt) == 2: if not (opt[0] == "-" and opt[1] != "-"): raise ArgumentError( - f"invalid short option string {opt!r}: " - "must be of the form -x, (x any non-dash char)", + "invalid short option string %r: " + "must be of the form -x, (x any non-dash char)" % opt, self, ) self._short_opts.append(opt) else: if not (opt[0:2] == "--" and opt[2] != "-"): raise ArgumentError( - f"invalid long option string {opt!r}: " - "must start with --, followed by non-dash", + "invalid long option string %r: " + "must start with --, followed by non-dash" % opt, self, ) self._long_opts.append(opt) def __repr__(self) -> str: - args: list[str] = [] + args: List[str] = [] if self._short_opts: args += ["_short_opts: " + repr(self._short_opts)] if self._long_opts: @@ -397,15 +352,16 @@ class OptionGroup: def __init__( self, - arggroup: argparse._ArgumentGroup, name: str, - parser: Parser | None, + description: str = "", + parser: Optional[Parser] = None, + *, _ispytest: bool = False, ) -> None: check_ispytest(_ispytest) - self._arggroup = arggroup self.name = name - self.options: list[Argument] = [] + self.description = description + self.options: List[Argument] = [] self.parser = parser def addoption(self, *opts: str, **attrs: Any) -> None: @@ -419,14 +375,14 @@ class OptionGroup: :param opts: Option names, can be short or long options. :param attrs: - Same attributes as the argparse library's :meth:`add_argument() + Same attributes as the argparse library's :py:func:`add_argument() ` function accepts. """ conflict = set(opts).intersection( name for opt in self.options for name in opt.names() ) if conflict: - raise ValueError(f"option names {conflict} already added") + raise ValueError("option names %s already added" % conflict) option = Argument(*opts, **attrs) self._addoption_instance(option, shortupper=False) @@ -434,47 +390,101 @@ class OptionGroup: option = Argument(*opts, **attrs) self._addoption_instance(option, shortupper=True) - def _addoption_instance(self, option: Argument, shortupper: bool = False) -> None: + def _addoption_instance(self, option: "Argument", shortupper: bool = False) -> None: if not shortupper: for opt in option._short_opts: if opt[0] == "-" and opt[1].islower(): raise ValueError("lowercase shortoptions reserved") - if self.parser: self.parser.processoption(option) - - self._arggroup.add_argument(*option.names(), **option.attrs()) self.options.append(option) -class PytestArgumentParser(argparse.ArgumentParser): +class MyOptionParser(argparse.ArgumentParser): def __init__( self, parser: Parser, - usage: str | None, - extra_info: dict[str, str], + extra_info: Optional[Dict[str, Any]] = None, + prog: Optional[str] = None, ) -> None: self._parser = parser super().__init__( - usage=usage, + prog=prog, + usage=parser._usage, add_help=False, formatter_class=DropShorterLongHelpFormatter, allow_abbrev=False, - fromfile_prefix_chars="@", ) # extra_info is a dict of (param -> value) to display if there's # an usage error to provide more contextual information to the user. - self.extra_info = extra_info + self.extra_info = extra_info if extra_info else {} def error(self, message: str) -> NoReturn: """Transform argparse error message into UsageError.""" msg = f"{self.prog}: error: {message}" - if self.extra_info: - msg += "\n" + "\n".join( - f" {k}: {v}" for k, v in sorted(self.extra_info.items()) - ) + + if hasattr(self._parser, "_config_source_hint"): + # Type ignored because the attribute is set dynamically. + msg = f"{msg} ({self._parser._config_source_hint})" # type: ignore + raise UsageError(self.format_usage() + msg) + # Type ignored because typeshed has a very complex type in the superclass. + def parse_args( # type: ignore + self, + args: Optional[Sequence[str]] = None, + namespace: Optional[argparse.Namespace] = None, + ) -> argparse.Namespace: + """Allow splitting of positional arguments.""" + parsed, unrecognized = self.parse_known_args(args, namespace) + if unrecognized: + for arg in unrecognized: + if arg and arg[0] == "-": + lines = ["unrecognized arguments: %s" % (" ".join(unrecognized))] + for k, v in sorted(self.extra_info.items()): + lines.append(f" {k}: {v}") + self.error("\n".join(lines)) + getattr(parsed, FILE_OR_DIR).extend(unrecognized) + return parsed + + if sys.version_info[:2] < (3, 9): # pragma: no cover + # Backport of https://github.com/python/cpython/pull/14316 so we can + # disable long --argument abbreviations without breaking short flags. + def _parse_optional( + self, arg_string: str + ) -> Optional[Tuple[Optional[argparse.Action], str, Optional[str]]]: + if not arg_string: + return None + if not arg_string[0] in self.prefix_chars: + return None + if arg_string in self._option_string_actions: + action = self._option_string_actions[arg_string] + return action, arg_string, None + if len(arg_string) == 1: + return None + if "=" in arg_string: + option_string, explicit_arg = arg_string.split("=", 1) + if option_string in self._option_string_actions: + action = self._option_string_actions[option_string] + return action, option_string, explicit_arg + if self.allow_abbrev or not arg_string.startswith("--"): + option_tuples = self._get_option_tuples(arg_string) + if len(option_tuples) > 1: + msg = gettext( + "ambiguous option: %(option)s could match %(matches)s" + ) + options = ", ".join(option for _, option, _ in option_tuples) + self.error(msg % {"option": arg_string, "matches": options}) + elif len(option_tuples) == 1: + (option_tuple,) = option_tuples + return option_tuple + if self._negative_number_matcher.match(arg_string): + if not self._has_negative_number_optionals: + return None + if " " in arg_string: + return None + return None, arg_string, None + class DropShorterLongHelpFormatter(argparse.HelpFormatter): """Shorten help for long options that differ only in extra hyphens. @@ -494,7 +504,7 @@ class DropShorterLongHelpFormatter(argparse.HelpFormatter): orgstr = super()._format_action_invocation(action) if orgstr and orgstr[0] != "-": # only optional arguments return orgstr - res: str | None = getattr(action, "_formatted_action_invocation", None) + res: Optional[str] = getattr(action, "_formatted_action_invocation", None) if res: return res options = orgstr.split(", ") @@ -503,13 +513,13 @@ class DropShorterLongHelpFormatter(argparse.HelpFormatter): action._formatted_action_invocation = orgstr # type: ignore return orgstr return_list = [] - short_long: dict[str, str] = {} + short_long: Dict[str, str] = {} for option in options: if len(option) == 2 or option[2] == " ": continue if not option.startswith("--"): raise ArgumentError( - f'long optional argument without "--": [{option}]', option + 'long optional argument without "--": [%s]' % (option), option ) xxoption = option[2:] shortened = xxoption.replace("-", "") @@ -539,40 +549,3 @@ class DropShorterLongHelpFormatter(argparse.HelpFormatter): for line in text.splitlines(): lines.extend(textwrap.wrap(line.strip(), width)) return lines - - -class OverrideIniAction(argparse.Action): - """Custom argparse action that makes a CLI flag equivalent to overriding an - option, in addition to behaving like `store_true`. - - This can simplify things since code only needs to inspect the config option - and not consider the CLI flag. - """ - - def __init__( - self, - option_strings: Sequence[str], - dest: str, - nargs: int | str | None = None, - *args, - ini_option: str, - ini_value: str, - **kwargs, - ) -> None: - super().__init__(option_strings, dest, 0, *args, **kwargs) - self.ini_option = ini_option - self.ini_value = ini_value - - def __call__( - self, - parser: argparse.ArgumentParser, - namespace: argparse.Namespace, - *args, - **kwargs, - ) -> None: - setattr(namespace, self.dest, True) - current_overrides = getattr(namespace, "override_ini", None) - if current_overrides is None: - current_overrides = [] - current_overrides.append(f"{self.ini_option}={self.ini_value}") - setattr(namespace, "override_ini", current_overrides) diff --git a/Backend/venv/lib/python3.12/site-packages/_pytest/config/compat.py b/Backend/venv/lib/python3.12/site-packages/_pytest/config/compat.py index 21eab4c7..5bd922a4 100644 --- a/Backend/venv/lib/python3.12/site-packages/_pytest/config/compat.py +++ b/Backend/venv/lib/python3.12/site-packages/_pytest/config/compat.py @@ -1,20 +1,15 @@ -from __future__ import annotations - -from collections.abc import Mapping import functools -from pathlib import Path -from typing import Any import warnings - -import pluggy +from pathlib import Path +from typing import Optional from ..compat import LEGACY_PATH from ..compat import legacy_path from ..deprecated import HOOK_LEGACY_PATH_ARG - +from _pytest.nodes import _check_path # hookname: (Path, LEGACY_PATH) -imply_paths_hooks: Mapping[str, tuple[str, str]] = { +imply_paths_hooks = { "pytest_ignore_collect": ("collection_path", "path"), "pytest_collect_file": ("file_path", "path"), "pytest_pycollect_makemodule": ("module_path", "path"), @@ -23,14 +18,6 @@ imply_paths_hooks: Mapping[str, tuple[str, str]] = { } -def _check_path(path: Path, fspath: LEGACY_PATH) -> None: - if Path(fspath) != path: - raise ValueError( - f"Path({fspath!r}) != {path!r}\n" - "if both path and fspath are given they need to be equal" - ) - - class PathAwareHookProxy: """ this helper wraps around hook callers @@ -40,24 +27,24 @@ class PathAwareHookProxy: this may have to be changed later depending on bugs """ - def __init__(self, hook_relay: pluggy.HookRelay) -> None: - self._hook_relay = hook_relay + def __init__(self, hook_caller): + self.__hook_caller = hook_caller - def __dir__(self) -> list[str]: - return dir(self._hook_relay) + def __dir__(self): + return dir(self.__hook_caller) - def __getattr__(self, key: str) -> pluggy.HookCaller: - hook: pluggy.HookCaller = getattr(self._hook_relay, key) + def __getattr__(self, key, _wraps=functools.wraps): + hook = getattr(self.__hook_caller, key) if key not in imply_paths_hooks: self.__dict__[key] = hook return hook else: path_var, fspath_var = imply_paths_hooks[key] - @functools.wraps(hook) - def fixed_hook(**kw: Any) -> Any: - path_value: Path | None = kw.pop(path_var, None) - fspath_value: LEGACY_PATH | None = kw.pop(fspath_var, None) + @_wraps(hook) + def fixed_hook(**kw): + path_value: Optional[Path] = kw.pop(path_var, None) + fspath_value: Optional[LEGACY_PATH] = kw.pop(fspath_var, None) if fspath_value is not None: warnings.warn( HOOK_LEGACY_PATH_ARG.format( @@ -78,8 +65,6 @@ class PathAwareHookProxy: kw[fspath_var] = fspath_value return hook(**kw) - fixed_hook.name = hook.name # type: ignore[attr-defined] - fixed_hook.spec = hook.spec # type: ignore[attr-defined] fixed_hook.__name__ = key self.__dict__[key] = fixed_hook - return fixed_hook # type: ignore[return-value] + return fixed_hook diff --git a/Backend/venv/lib/python3.12/site-packages/_pytest/config/exceptions.py b/Backend/venv/lib/python3.12/site-packages/_pytest/config/exceptions.py index d84a9ea6..4f1320e7 100644 --- a/Backend/venv/lib/python3.12/site-packages/_pytest/config/exceptions.py +++ b/Backend/venv/lib/python3.12/site-packages/_pytest/config/exceptions.py @@ -1,14 +1,10 @@ -from __future__ import annotations - -from typing import final +from _pytest.compat import final @final class UsageError(Exception): """Error in pytest usage or invocation.""" - __module__ = "pytest" - class PrintHelp(Exception): """Raised when pytest should print its help to skip the rest of the diff --git a/Backend/venv/lib/python3.12/site-packages/_pytest/config/findpaths.py b/Backend/venv/lib/python3.12/site-packages/_pytest/config/findpaths.py index 3c628a09..02674ffa 100644 --- a/Backend/venv/lib/python3.12/site-packages/_pytest/config/findpaths.py +++ b/Backend/venv/lib/python3.12/site-packages/_pytest/config/findpaths.py @@ -1,14 +1,14 @@ -from __future__ import annotations - -from collections.abc import Iterable -from collections.abc import Sequence -from dataclasses import dataclass -from dataclasses import KW_ONLY import os -from pathlib import Path import sys -from typing import Literal -from typing import TypeAlias +from pathlib import Path +from typing import Dict +from typing import Iterable +from typing import List +from typing import Optional +from typing import Sequence +from typing import Tuple +from typing import TYPE_CHECKING +from typing import Union import iniconfig @@ -18,29 +18,8 @@ from _pytest.pathlib import absolutepath from _pytest.pathlib import commonpath from _pytest.pathlib import safe_exists - -@dataclass(frozen=True) -class ConfigValue: - """Represents a configuration value with its origin and parsing mode. - - This allows tracking whether a value came from a configuration file - or from a CLI override (--override-ini), which is important for - determining precedence when dealing with ini option aliases. - - The mode tracks the parsing mode/data model used for the value: - - "ini": from INI files or [tool.pytest.ini_options], where the only - supported value types are `str` or `list[str]`. - - "toml": from TOML files (not in INI mode), where native TOML types - are preserved. - """ - - value: object - _: KW_ONLY - origin: Literal["file", "override"] - mode: Literal["ini", "toml"] - - -ConfigDict: TypeAlias = dict[str, ConfigValue] +if TYPE_CHECKING: + from . import Config def _parse_ini_config(path: Path) -> iniconfig.IniConfig: @@ -57,23 +36,21 @@ def _parse_ini_config(path: Path) -> iniconfig.IniConfig: def load_config_dict_from_file( filepath: Path, -) -> ConfigDict | None: +) -> Optional[Dict[str, Union[str, List[str]]]]: """Load pytest configuration from the given file path, if supported. Return None if the file does not contain valid pytest configuration. """ + # Configuration from ini files are obtained from the [pytest] section, if present. if filepath.suffix == ".ini": iniconfig = _parse_ini_config(filepath) if "pytest" in iniconfig: - return { - k: ConfigValue(v, origin="file", mode="ini") - for k, v in iniconfig["pytest"].items() - } + return dict(iniconfig["pytest"].items()) else: # "pytest.ini" files are always the source of configuration, even if empty. - if filepath.name in {"pytest.ini", ".pytest.ini"}: + if filepath.name == "pytest.ini": return {} # '.cfg' files are considered if they contain a "[tool:pytest]" section. @@ -81,18 +58,13 @@ def load_config_dict_from_file( iniconfig = _parse_ini_config(filepath) if "tool:pytest" in iniconfig.sections: - return { - k: ConfigValue(v, origin="file", mode="ini") - for k, v in iniconfig["tool:pytest"].items() - } + return dict(iniconfig["tool:pytest"].items()) elif "pytest" in iniconfig.sections: # If a setup.cfg contains a "[pytest]" section, we raise a failure to indicate users that # plain "[pytest]" sections in setup.cfg files is no longer supported (#3086). fail(CFG_PYTEST_SECTION.format(filename="setup.cfg"), pytrace=False) - # '.toml' files are considered if they contain a [tool.pytest] table (toml mode) - # or [tool.pytest.ini_options] table (ini mode) for pyproject.toml, - # or [pytest] table (toml mode) for pytest.toml/.pytest.toml. + # '.toml' files are considered if they contain a [tool.pytest.ini_options] table. elif filepath.suffix == ".toml": if sys.version_info >= (3, 11): import tomllib @@ -105,67 +77,25 @@ def load_config_dict_from_file( except tomllib.TOMLDecodeError as exc: raise UsageError(f"{filepath}: {exc}") from exc - # pytest.toml and .pytest.toml use [pytest] table directly. - if filepath.name in ("pytest.toml", ".pytest.toml"): - pytest_config = config.get("pytest", {}) - if pytest_config: - # TOML mode - preserve native TOML types. - return { - k: ConfigValue(v, origin="file", mode="toml") - for k, v in pytest_config.items() - } - # "pytest.toml" files are always the source of configuration, even if empty. - return {} + result = config.get("tool", {}).get("pytest", {}).get("ini_options", None) + if result is not None: + # TOML supports richer data types than ini files (strings, arrays, floats, ints, etc), + # however we need to convert all scalar values to str for compatibility with the rest + # of the configuration system, which expects strings only. + def make_scalar(v: object) -> Union[str, List[str]]: + return v if isinstance(v, list) else str(v) - # pyproject.toml uses [tool.pytest] or [tool.pytest.ini_options]. - else: - tool_pytest = config.get("tool", {}).get("pytest", {}) - - # Check for toml mode config: [tool.pytest] with content outside of ini_options. - toml_config = {k: v for k, v in tool_pytest.items() if k != "ini_options"} - # Check for ini mode config: [tool.pytest.ini_options]. - ini_config = tool_pytest.get("ini_options", None) - - if toml_config and ini_config: - raise UsageError( - f"{filepath}: Cannot use both [tool.pytest] (native TOML types) and " - "[tool.pytest.ini_options] (string-based INI format) simultaneously. " - "Please use [tool.pytest] with native TOML types (recommended) " - "or [tool.pytest.ini_options] for backwards compatibility." - ) - - if toml_config: - # TOML mode - preserve native TOML types. - return { - k: ConfigValue(v, origin="file", mode="toml") - for k, v in toml_config.items() - } - - elif ini_config is not None: - # INI mode - TOML supports richer data types than INI files, but we need to - # convert all scalar values to str for compatibility with the INI system. - def make_scalar(v: object) -> str | list[str]: - return v if isinstance(v, list) else str(v) - - return { - k: ConfigValue(make_scalar(v), origin="file", mode="ini") - for k, v in ini_config.items() - } + return {k: make_scalar(v) for k, v in result.items()} return None def locate_config( - invocation_dir: Path, args: Iterable[Path], -) -> tuple[Path | None, Path | None, ConfigDict, Sequence[str]]: +) -> Tuple[Optional[Path], Optional[Path], Dict[str, Union[str, List[str]]]]: """Search in the list of arguments for a valid ini-file for pytest, - and return a tuple of (rootdir, inifile, cfg-dict, ignored-config-files), where - ignored-config-files is a list of config basenames found that contain - pytest configuration but were ignored.""" + and return a tuple of (rootdir, inifile, cfg-dict).""" config_names = [ - "pytest.toml", - ".pytest.toml", "pytest.ini", ".pytest.ini", "pyproject.toml", @@ -174,39 +104,21 @@ def locate_config( ] args = [x for x in args if not str(x).startswith("-")] if not args: - args = [invocation_dir] - found_pyproject_toml: Path | None = None - ignored_config_files: list[str] = [] - + args = [Path.cwd()] for arg in args: argpath = absolutepath(arg) for base in (argpath, *argpath.parents): for config_name in config_names: p = base / config_name if p.is_file(): - if p.name == "pyproject.toml" and found_pyproject_toml is None: - found_pyproject_toml = p ini_config = load_config_dict_from_file(p) if ini_config is not None: - index = config_names.index(config_name) - for remainder in config_names[index + 1 :]: - p2 = base / remainder - if ( - p2.is_file() - and load_config_dict_from_file(p2) is not None - ): - ignored_config_files.append(remainder) - return base, p, ini_config, ignored_config_files - if found_pyproject_toml is not None: - return found_pyproject_toml.parent, found_pyproject_toml, {}, [] - return None, None, {}, [] + return base, p, ini_config + return None, None, {} -def get_common_ancestor( - invocation_dir: Path, - paths: Iterable[Path], -) -> Path: - common_ancestor: Path | None = None +def get_common_ancestor(paths: Iterable[Path]) -> Path: + common_ancestor: Optional[Path] = None for path in paths: if not path.exists(): continue @@ -222,13 +134,13 @@ def get_common_ancestor( if shared is not None: common_ancestor = shared if common_ancestor is None: - common_ancestor = invocation_dir + common_ancestor = Path.cwd() elif common_ancestor.is_file(): common_ancestor = common_ancestor.parent return common_ancestor -def get_dirs_from_args(args: Iterable[str]) -> list[Path]: +def get_dirs_from_args(args: Iterable[str]) -> List[Path]: def is_option(x: str) -> bool: return x.startswith("-") @@ -250,70 +162,26 @@ def get_dirs_from_args(args: Iterable[str]) -> list[Path]: return [get_dir_from_path(path) for path in possible_paths if safe_exists(path)] -def parse_override_ini(override_ini: Sequence[str] | None) -> ConfigDict: - """Parse the -o/--override-ini command line arguments and return the overrides. - - :raises UsageError: - If one of the values is malformed. - """ - overrides = {} - # override_ini is a list of "ini=value" options. - # Always use the last item if multiple values are set for same ini-name, - # e.g. -o foo=bar1 -o foo=bar2 will set foo to bar2. - for ini_config in override_ini or (): - try: - key, user_ini_value = ini_config.split("=", 1) - except ValueError as e: - raise UsageError( - f"-o/--override-ini expects option=value style (got: {ini_config!r})." - ) from e - else: - overrides[key] = ConfigValue(user_ini_value, origin="override", mode="ini") - return overrides - - CFG_PYTEST_SECTION = "[pytest] section in {filename} files is no longer supported, change to [tool:pytest] instead." def determine_setup( - *, - inifile: str | None, - override_ini: Sequence[str] | None, + inifile: Optional[str], args: Sequence[str], - rootdir_cmd_arg: str | None, - invocation_dir: Path, -) -> tuple[Path, Path | None, ConfigDict, Sequence[str]]: - """Determine the rootdir, inifile and ini configuration values from the - command line arguments. - - :param inifile: - The `--inifile` command line argument, if given. - :param override_ini: - The -o/--override-ini command line arguments, if given. - :param args: - The free command line arguments. - :param rootdir_cmd_arg: - The `--rootdir` command line argument, if given. - :param invocation_dir: - The working directory when pytest was invoked. - - :raises UsageError: - """ + rootdir_cmd_arg: Optional[str] = None, + config: Optional["Config"] = None, +) -> Tuple[Path, Optional[Path], Dict[str, Union[str, List[str]]]]: rootdir = None dirs = get_dirs_from_args(args) - ignored_config_files: Sequence[str] = [] - if inifile: inipath_ = absolutepath(inifile) - inipath: Path | None = inipath_ + inipath: Optional[Path] = inipath_ inicfg = load_config_dict_from_file(inipath_) or {} if rootdir_cmd_arg is None: rootdir = inipath_.parent else: - ancestor = get_common_ancestor(invocation_dir, dirs) - rootdir, inipath, inicfg, ignored_config_files = locate_config( - invocation_dir, [ancestor] - ) + ancestor = get_common_ancestor(dirs) + rootdir, inipath, inicfg = locate_config([ancestor]) if rootdir is None and rootdir_cmd_arg is None: for possible_rootdir in (ancestor, *ancestor.parents): if (possible_rootdir / "setup.py").is_file(): @@ -321,25 +189,25 @@ def determine_setup( break else: if dirs != [ancestor]: - rootdir, inipath, inicfg, _ = locate_config(invocation_dir, dirs) + rootdir, inipath, inicfg = locate_config(dirs) if rootdir is None: - rootdir = get_common_ancestor( - invocation_dir, [invocation_dir, ancestor] - ) + if config is not None: + cwd = config.invocation_params.dir + else: + cwd = Path.cwd() + rootdir = get_common_ancestor([cwd, ancestor]) if is_fs_root(rootdir): rootdir = ancestor if rootdir_cmd_arg: rootdir = absolutepath(os.path.expandvars(rootdir_cmd_arg)) if not rootdir.is_dir(): raise UsageError( - f"Directory '{rootdir}' not found. Check your '--rootdir' option." + "Directory '{}' not found. Check your '--rootdir' option.".format( + rootdir + ) ) - - ini_overrides = parse_override_ini(override_ini) - inicfg.update(ini_overrides) - assert rootdir is not None - return rootdir, inipath, inicfg, ignored_config_files + return rootdir, inipath, inicfg or {} def is_fs_root(p: Path) -> bool: diff --git a/Backend/venv/lib/python3.12/site-packages/_pytest/debugging.py b/Backend/venv/lib/python3.12/site-packages/_pytest/debugging.py index de1b2688..a3f80802 100644 --- a/Backend/venv/lib/python3.12/site-packages/_pytest/debugging.py +++ b/Backend/venv/lib/python3.12/site-packages/_pytest/debugging.py @@ -1,21 +1,21 @@ -# mypy: allow-untyped-defs -# ruff: noqa: T100 """Interactive debugging with PDB, the Python Debugger.""" - -from __future__ import annotations - import argparse -from collections.abc import Callable -from collections.abc import Generator import functools import sys import types -from typing import Any import unittest +from typing import Any +from typing import Callable +from typing import Generator +from typing import List +from typing import Optional +from typing import Tuple +from typing import Type +from typing import TYPE_CHECKING +from typing import Union from _pytest import outcomes from _pytest._code import ExceptionInfo -from _pytest.capture import CaptureManager from _pytest.config import Config from _pytest.config import ConftestImportFailure from _pytest.config import hookimpl @@ -24,10 +24,13 @@ from _pytest.config.argparsing import Parser from _pytest.config.exceptions import UsageError from _pytest.nodes import Node from _pytest.reports import BaseReport -from _pytest.runner import CallInfo + +if TYPE_CHECKING: + from _pytest.capture import CaptureManager + from _pytest.runner import CallInfo -def _validate_usepdb_cls(value: str) -> tuple[str, str]: +def _validate_usepdb_cls(value: str) -> Tuple[str, str]: """Validate syntax of --pdbcls option.""" try: modname, classname = value.split(":") @@ -40,13 +43,13 @@ def _validate_usepdb_cls(value: str) -> tuple[str, str]: def pytest_addoption(parser: Parser) -> None: group = parser.getgroup("general") - group.addoption( + group._addoption( "--pdb", dest="usepdb", action="store_true", help="Start the interactive Python debugger on errors or KeyboardInterrupt", ) - group.addoption( + group._addoption( "--pdbcls", dest="usepdb_cls", metavar="modulename:classname", @@ -54,7 +57,7 @@ def pytest_addoption(parser: Parser) -> None: help="Specify a custom interactive Python debugger for use with --pdb." "For example: --pdbcls=IPython.terminal.debugger:TerminalPdb", ) - group.addoption( + group._addoption( "--trace", dest="trace", action="store_true", @@ -92,22 +95,22 @@ def pytest_configure(config: Config) -> None: class pytestPDB: """Pseudo PDB that defers to the real pdb.""" - _pluginmanager: PytestPluginManager | None = None - _config: Config | None = None - _saved: list[ - tuple[Callable[..., None], PytestPluginManager | None, Config | None] + _pluginmanager: Optional[PytestPluginManager] = None + _config: Optional[Config] = None + _saved: List[ + Tuple[Callable[..., None], Optional[PytestPluginManager], Optional[Config]] ] = [] _recursive_debug = 0 - _wrapped_pdb_cls: tuple[type[Any], type[Any]] | None = None + _wrapped_pdb_cls: Optional[Tuple[Type[Any], Type[Any]]] = None @classmethod - def _is_capturing(cls, capman: CaptureManager | None) -> str | bool: + def _is_capturing(cls, capman: Optional["CaptureManager"]) -> Union[str, bool]: if capman: return capman.is_capturing() return False @classmethod - def _import_pdb_cls(cls, capman: CaptureManager | None): + def _import_pdb_cls(cls, capman: Optional["CaptureManager"]): if not cls._config: import pdb @@ -146,10 +149,12 @@ class pytestPDB: return wrapped_cls @classmethod - def _get_pdb_wrapper_class(cls, pdb_cls, capman: CaptureManager | None): + def _get_pdb_wrapper_class(cls, pdb_cls, capman: Optional["CaptureManager"]): import _pytest.config - class PytestPdbWrapper(pdb_cls): + # Type ignored because mypy doesn't support "dynamic" + # inheritance like this. + class PytestPdbWrapper(pdb_cls): # type: ignore[valid-type,misc] _pytest_capman = capman _continued = False @@ -159,9 +164,6 @@ class pytestPDB: cls._recursive_debug -= 1 return ret - if hasattr(pdb_cls, "do_debug"): - do_debug.__doc__ = pdb_cls.do_debug.__doc__ - def do_continue(self, arg): ret = super().do_continue(arg) if cls._recursive_debug == 0: @@ -177,7 +179,8 @@ class pytestPDB: else: tw.sep( ">", - f"PDB continue (IO-capturing resumed for {capturing})", + "PDB continue (IO-capturing resumed for %s)" + % capturing, ) assert capman is not None capman.resume() @@ -188,17 +191,15 @@ class pytestPDB: self._continued = True return ret - if hasattr(pdb_cls, "do_continue"): - do_continue.__doc__ = pdb_cls.do_continue.__doc__ - do_c = do_cont = do_continue def do_quit(self, arg): - # Raise Exit outcome when quit command is used in pdb. - # - # This is a bit of a hack - it would be better if BdbQuit - # could be handled, but this would require to wrap the - # whole pytest run, and adjust the report etc. + """Raise Exit outcome when quit command is used in pdb. + + This is a bit of a hack - it would be better if BdbQuit + could be handled, but this would require to wrap the + whole pytest run, and adjust the report etc. + """ ret = super().do_quit(arg) if cls._recursive_debug == 0: @@ -206,9 +207,6 @@ class pytestPDB: return ret - if hasattr(pdb_cls, "do_quit"): - do_quit.__doc__ = pdb_cls.do_quit.__doc__ - do_q = do_quit do_exit = do_quit @@ -243,7 +241,7 @@ class pytestPDB: import _pytest.config if cls._pluginmanager is None: - capman: CaptureManager | None = None + capman: Optional[CaptureManager] = None else: capman = cls._pluginmanager.getplugin("capturemanager") if capman: @@ -265,7 +263,8 @@ class pytestPDB: elif capturing: tw.sep( ">", - f"PDB {method} (IO-capturing turned off for {capturing})", + "PDB %s (IO-capturing turned off for %s)" + % (method, capturing), ) else: tw.sep(">", f"PDB {method}") @@ -286,7 +285,7 @@ class pytestPDB: class PdbInvoke: def pytest_exception_interact( - self, node: Node, call: CallInfo[Any], report: BaseReport + self, node: Node, call: "CallInfo[Any]", report: BaseReport ) -> None: capman = node.config.pluginmanager.getplugin("capturemanager") if capman: @@ -300,18 +299,18 @@ class PdbInvoke: _enter_pdb(node, call.excinfo, report) def pytest_internalerror(self, excinfo: ExceptionInfo[BaseException]) -> None: - exc_or_tb = _postmortem_exc_or_tb(excinfo) - post_mortem(exc_or_tb) + tb = _postmortem_traceback(excinfo) + post_mortem(tb) class PdbTrace: - @hookimpl(wrapper=True) - def pytest_pyfunc_call(self, pyfuncitem) -> Generator[None, object, object]: + @hookimpl(hookwrapper=True) + def pytest_pyfunc_call(self, pyfuncitem) -> Generator[None, None, None]: wrap_pytest_function_for_tracing(pyfuncitem) - return (yield) + yield -def wrap_pytest_function_for_tracing(pyfuncitem) -> None: +def wrap_pytest_function_for_tracing(pyfuncitem): """Change the Python function object of the given Function item by a wrapper which actually enters pdb before calling the python function itself, effectively leaving the user in the pdb prompt in the first @@ -323,14 +322,14 @@ def wrap_pytest_function_for_tracing(pyfuncitem) -> None: # python < 3.7.4) runcall's first param is `func`, which means we'd get # an exception if one of the kwargs to testfunction was called `func`. @functools.wraps(testfunction) - def wrapper(*args, **kwargs) -> None: + def wrapper(*args, **kwargs): func = functools.partial(testfunction, *args, **kwargs) _pdb.runcall(func) pyfuncitem.obj = wrapper -def maybe_wrap_pytest_function_for_tracing(pyfuncitem) -> None: +def maybe_wrap_pytest_function_for_tracing(pyfuncitem): """Wrap the given pytestfunct item for tracing support if --trace was given in the command line.""" if pyfuncitem.config.getvalue("trace"): @@ -340,7 +339,7 @@ def maybe_wrap_pytest_function_for_tracing(pyfuncitem) -> None: def _enter_pdb( node: Node, excinfo: ExceptionInfo[BaseException], rep: BaseReport ) -> BaseReport: - # XXX we reuse the TerminalReporter's terminalwriter + # XXX we re-use the TerminalReporter's terminalwriter # because this seems to avoid some encoding related troubles # for not completely clear reasons. tw = node.config.pluginmanager.getplugin("terminalreporter")._tw @@ -362,46 +361,31 @@ def _enter_pdb( tw.sep(">", "traceback") rep.toterminal(tw) tw.sep(">", "entering PDB") - tb_or_exc = _postmortem_exc_or_tb(excinfo) + tb = _postmortem_traceback(excinfo) rep._pdbshown = True # type: ignore[attr-defined] - post_mortem(tb_or_exc) + post_mortem(tb) return rep -def _postmortem_exc_or_tb( - excinfo: ExceptionInfo[BaseException], -) -> types.TracebackType | BaseException: +def _postmortem_traceback(excinfo: ExceptionInfo[BaseException]) -> types.TracebackType: from doctest import UnexpectedException - get_exc = sys.version_info >= (3, 13) if isinstance(excinfo.value, UnexpectedException): # A doctest.UnexpectedException is not useful for post_mortem. # Use the underlying exception instead: - underlying_exc = excinfo.value - if get_exc: - return underlying_exc.exc_info[1] - - return underlying_exc.exc_info[2] + return excinfo.value.exc_info[2] elif isinstance(excinfo.value, ConftestImportFailure): # A config.ConftestImportFailure is not useful for post_mortem. # Use the underlying exception instead: - cause = excinfo.value.cause - if get_exc: - return cause - - assert cause.__traceback__ is not None - return cause.__traceback__ + return excinfo.value.excinfo[2] else: assert excinfo._excinfo is not None - if get_exc: - return excinfo._excinfo[1] - return excinfo._excinfo[2] -def post_mortem(tb_or_exc: types.TracebackType | BaseException) -> None: +def post_mortem(t: types.TracebackType) -> None: p = pytestPDB._init_pdb("post_mortem") p.reset() - p.interaction(None, tb_or_exc) + p.interaction(None, t) if p.quitting: outcomes.exit("Quitting debugger") diff --git a/Backend/venv/lib/python3.12/site-packages/_pytest/deprecated.py b/Backend/venv/lib/python3.12/site-packages/_pytest/deprecated.py index cb5d2e93..b9c10df7 100644 --- a/Backend/venv/lib/python3.12/site-packages/_pytest/deprecated.py +++ b/Backend/venv/lib/python3.12/site-packages/_pytest/deprecated.py @@ -8,52 +8,111 @@ All constants defined in this module should be either instances of :class:`PytestWarning`, or :class:`UnformattedWarning` in case of warnings which need to format their messages. """ - -from __future__ import annotations - from warnings import warn from _pytest.warning_types import PytestDeprecationWarning -from _pytest.warning_types import PytestRemovedIn9Warning -from _pytest.warning_types import PytestRemovedIn10Warning +from _pytest.warning_types import PytestRemovedIn8Warning from _pytest.warning_types import UnformattedWarning - # set of plugins which have been integrated into the core; we use this list to ignore # them during registration to avoid conflicts DEPRECATED_EXTERNAL_PLUGINS = { "pytest_catchlog", "pytest_capturelog", "pytest_faulthandler", - "pytest_subtests", } +NOSE_SUPPORT = UnformattedWarning( + PytestRemovedIn8Warning, + "Support for nose tests is deprecated and will be removed in a future release.\n" + "{nodeid} is using nose method: `{method}` ({stage})\n" + "See docs: https://docs.pytest.org/en/stable/deprecations.html#support-for-tests-written-for-nose", +) -# This could have been removed pytest 8, but it's harmless and common, so no rush to remove. +NOSE_SUPPORT_METHOD = UnformattedWarning( + PytestRemovedIn8Warning, + "Support for nose tests is deprecated and will be removed in a future release.\n" + "{nodeid} is using nose-specific method: `{method}(self)`\n" + "To remove this warning, rename it to `{method}_method(self)`\n" + "See docs: https://docs.pytest.org/en/stable/deprecations.html#support-for-tests-written-for-nose", +) + + +# This can be* removed pytest 8, but it's harmless and common, so no rush to remove. +# * If you're in the future: "could have been". YIELD_FIXTURE = PytestDeprecationWarning( "@pytest.yield_fixture is deprecated.\n" "Use @pytest.fixture instead; they are the same." ) +WARNING_CMDLINE_PREPARSE_HOOK = PytestRemovedIn8Warning( + "The pytest_cmdline_preparse hook is deprecated and will be removed in a future release. \n" + "Please use pytest_load_initial_conftests hook instead." +) + +FSCOLLECTOR_GETHOOKPROXY_ISINITPATH = PytestRemovedIn8Warning( + "The gethookproxy() and isinitpath() methods of FSCollector and Package are deprecated; " + "use self.session.gethookproxy() and self.session.isinitpath() instead. " +) + +STRICT_OPTION = PytestRemovedIn8Warning( + "The --strict option is deprecated, use --strict-markers instead." +) + # This deprecation is never really meant to be removed. PRIVATE = PytestDeprecationWarning("A private pytest class or function was used.") +ARGUMENT_PERCENT_DEFAULT = PytestRemovedIn8Warning( + 'pytest now uses argparse. "%default" should be changed to "%(default)s"', +) + +ARGUMENT_TYPE_STR_CHOICE = UnformattedWarning( + PytestRemovedIn8Warning, + "`type` argument to addoption() is the string {typ!r}." + " For choices this is optional and can be omitted, " + " but when supplied should be a type (for example `str` or `int`)." + " (options: {names})", +) + +ARGUMENT_TYPE_STR = UnformattedWarning( + PytestRemovedIn8Warning, + "`type` argument to addoption() is the string {typ!r}, " + " but when supplied should be a type (for example `str` or `int`)." + " (options: {names})", +) + HOOK_LEGACY_PATH_ARG = UnformattedWarning( - PytestRemovedIn9Warning, + PytestRemovedIn8Warning, "The ({pylib_path_arg}: py.path.local) argument is deprecated, please use ({pathlib_path_arg}: pathlib.Path)\n" "see https://docs.pytest.org/en/latest/deprecations.html" "#py-path-local-arguments-for-hooks-replaced-with-pathlib-path", ) NODE_CTOR_FSPATH_ARG = UnformattedWarning( - PytestRemovedIn9Warning, + PytestRemovedIn8Warning, "The (fspath: py.path.local) argument to {node_type_name} is deprecated. " "Please use the (path: pathlib.Path) argument instead.\n" "See https://docs.pytest.org/en/latest/deprecations.html" "#fspath-argument-for-node-constructors-replaced-with-pathlib-path", ) +WARNS_NONE_ARG = PytestRemovedIn8Warning( + "Passing None has been deprecated.\n" + "See https://docs.pytest.org/en/latest/how-to/capture-warnings.html" + "#additional-use-cases-of-warnings-in-tests" + " for alternatives in common use cases." +) + +KEYWORD_MSG_ARG = UnformattedWarning( + PytestRemovedIn8Warning, + "pytest.{func}(msg=...) is now deprecated, use pytest.{func}(reason=...) instead", +) + +INSTANCE_COLLECTOR = PytestRemovedIn8Warning( + "The pytest.Instance collector type is deprecated and is no longer used. " + "See https://docs.pytest.org/en/latest/deprecations.html#the-pytest-instance-collector", +) HOOK_LEGACY_MARKING = UnformattedWarning( PytestDeprecationWarning, "The hook{type} {fullname} uses old-style configuration options (marks or attributes).\n" @@ -63,18 +122,6 @@ HOOK_LEGACY_MARKING = UnformattedWarning( "#configuring-hook-specs-impls-using-markers", ) -MARKED_FIXTURE = PytestRemovedIn9Warning( - "Marks applied to fixtures have no effect\n" - "See docs: https://docs.pytest.org/en/stable/deprecations.html#applying-a-mark-to-a-fixture-function" -) - -MONKEYPATCH_LEGACY_NAMESPACE_PACKAGES = PytestRemovedIn10Warning( - "monkeypatch.syspath_prepend() called with pkg_resources legacy namespace packages detected.\n" - "Legacy namespace packages (using pkg_resources.declare_namespace) are deprecated.\n" - "Please use native namespace packages (PEP 420) instead.\n" - "See https://docs.pytest.org/en/stable/deprecations.html#monkeypatch-fixup-namespace-packages" -) - # You want to make some `__init__` or function "private". # # def my_private_function(some, args): diff --git a/Backend/venv/lib/python3.12/site-packages/_pytest/doctest.py b/Backend/venv/lib/python3.12/site-packages/_pytest/doctest.py index cd255f5e..ca41a98e 100644 --- a/Backend/venv/lib/python3.12/site-packages/_pytest/doctest.py +++ b/Backend/venv/lib/python3.12/site-packages/_pytest/doctest.py @@ -1,26 +1,28 @@ -# mypy: allow-untyped-defs """Discover and run doctests in modules and test files.""" - -from __future__ import annotations - import bdb -from collections.abc import Callable -from collections.abc import Generator -from collections.abc import Iterable -from collections.abc import Sequence -from contextlib import contextmanager import functools import inspect import os -from pathlib import Path import platform -import re import sys import traceback import types -from typing import Any -from typing import TYPE_CHECKING import warnings +from contextlib import contextmanager +from pathlib import Path +from typing import Any +from typing import Callable +from typing import Dict +from typing import Generator +from typing import Iterable +from typing import List +from typing import Optional +from typing import Pattern +from typing import Sequence +from typing import Tuple +from typing import Type +from typing import TYPE_CHECKING +from typing import Union from _pytest import outcomes from _pytest._code.code import ExceptionInfo @@ -31,22 +33,20 @@ from _pytest.compat import safe_getattr from _pytest.config import Config from _pytest.config.argparsing import Parser from _pytest.fixtures import fixture -from _pytest.fixtures import TopRequest +from _pytest.fixtures import FixtureRequest from _pytest.nodes import Collector from _pytest.nodes import Item from _pytest.outcomes import OutcomeException from _pytest.outcomes import skip from _pytest.pathlib import fnmatch_ex +from _pytest.pathlib import import_path from _pytest.python import Module from _pytest.python_api import approx from _pytest.warning_types import PytestWarning - if TYPE_CHECKING: import doctest - from typing_extensions import Self - DOCTEST_REPORT_CHOICE_NONE = "none" DOCTEST_REPORT_CHOICE_CDIFF = "cdiff" DOCTEST_REPORT_CHOICE_NDIFF = "ndiff" @@ -64,7 +64,7 @@ DOCTEST_REPORT_CHOICES = ( # Lazy definition of runner class RUNNER_CLASS = None # Lazy definition of output checker class -CHECKER_CLASS: type[doctest.OutputChecker] | None = None +CHECKER_CLASS: Optional[Type["doctest.OutputChecker"]] = None def pytest_addoption(parser: Parser) -> None: @@ -105,7 +105,7 @@ def pytest_addoption(parser: Parser) -> None: "--doctest-ignore-import-errors", action="store_true", default=False, - help="Ignore doctest collection errors", + help="Ignore doctest ImportErrors", dest="doctest_ignore_import_errors", ) group.addoption( @@ -126,15 +126,17 @@ def pytest_unconfigure() -> None: def pytest_collect_file( file_path: Path, parent: Collector, -) -> DoctestModule | DoctestTextfile | None: +) -> Optional[Union["DoctestModule", "DoctestTextfile"]]: config = parent.config if file_path.suffix == ".py": if config.option.doctestmodules and not any( (_is_setup_py(file_path), _is_main_py(file_path)) ): - return DoctestModule.from_parent(parent, path=file_path) + mod: DoctestModule = DoctestModule.from_parent(parent, path=file_path) + return mod elif _is_doctest(config, file_path, parent): - return DoctestTextfile.from_parent(parent, path=file_path) + txt: DoctestTextfile = DoctestTextfile.from_parent(parent, path=file_path) + return txt return None @@ -158,7 +160,7 @@ def _is_main_py(path: Path) -> bool: class ReprFailDoctest(TerminalRepr): def __init__( - self, reprlocation_lines: Sequence[tuple[ReprFileLocation, Sequence[str]]] + self, reprlocation_lines: Sequence[Tuple[ReprFileLocation, Sequence[str]]] ) -> None: self.reprlocation_lines = reprlocation_lines @@ -170,12 +172,12 @@ class ReprFailDoctest(TerminalRepr): class MultipleDoctestFailures(Exception): - def __init__(self, failures: Sequence[doctest.DocTestFailure]) -> None: + def __init__(self, failures: Sequence["doctest.DocTestFailure"]) -> None: super().__init__() self.failures = failures -def _init_runner_class() -> type[doctest.DocTestRunner]: +def _init_runner_class() -> Type["doctest.DocTestRunner"]: import doctest class PytestDoctestRunner(doctest.DebugRunner): @@ -187,8 +189,8 @@ def _init_runner_class() -> type[doctest.DocTestRunner]: def __init__( self, - checker: doctest.OutputChecker | None = None, - verbose: bool | None = None, + checker: Optional["doctest.OutputChecker"] = None, + verbose: Optional[bool] = None, optionflags: int = 0, continue_on_failure: bool = True, ) -> None: @@ -198,8 +200,8 @@ def _init_runner_class() -> type[doctest.DocTestRunner]: def report_failure( self, out, - test: doctest.DocTest, - example: doctest.Example, + test: "doctest.DocTest", + example: "doctest.Example", got: str, ) -> None: failure = doctest.DocTestFailure(test, example, got) @@ -211,9 +213,9 @@ def _init_runner_class() -> type[doctest.DocTestRunner]: def report_unexpected_exception( self, out, - test: doctest.DocTest, - example: doctest.Example, - exc_info: tuple[type[BaseException], BaseException, types.TracebackType], + test: "doctest.DocTest", + example: "doctest.Example", + exc_info: Tuple[Type[BaseException], BaseException, types.TracebackType], ) -> None: if isinstance(exc_info[1], OutcomeException): raise exc_info[1] @@ -229,11 +231,11 @@ def _init_runner_class() -> type[doctest.DocTestRunner]: def _get_runner( - checker: doctest.OutputChecker | None = None, - verbose: bool | None = None, + checker: Optional["doctest.OutputChecker"] = None, + verbose: Optional[bool] = None, optionflags: int = 0, continue_on_failure: bool = True, -) -> doctest.DocTestRunner: +) -> "doctest.DocTestRunner": # We need this in order to do a lazy import on doctest global RUNNER_CLASS if RUNNER_CLASS is None: @@ -252,50 +254,45 @@ class DoctestItem(Item): def __init__( self, name: str, - parent: DoctestTextfile | DoctestModule, - runner: doctest.DocTestRunner, - dtest: doctest.DocTest, + parent: "Union[DoctestTextfile, DoctestModule]", + runner: Optional["doctest.DocTestRunner"] = None, + dtest: Optional["doctest.DocTest"] = None, ) -> None: super().__init__(name, parent) self.runner = runner self.dtest = dtest - - # Stuff needed for fixture support. self.obj = None - fm = self.session._fixturemanager - fixtureinfo = fm.getfixtureinfo(node=self, func=None, cls=None) - self._fixtureinfo = fixtureinfo - self.fixturenames = fixtureinfo.names_closure - self._initrequest() + self.fixture_request: Optional[FixtureRequest] = None @classmethod - def from_parent( # type: ignore[override] + def from_parent( # type: ignore cls, - parent: DoctestTextfile | DoctestModule, + parent: "Union[DoctestTextfile, DoctestModule]", *, name: str, - runner: doctest.DocTestRunner, - dtest: doctest.DocTest, - ) -> Self: + runner: "doctest.DocTestRunner", + dtest: "doctest.DocTest", + ): # incompatible signature due to imposed limits on subclass """The public named constructor.""" return super().from_parent(name=name, parent=parent, runner=runner, dtest=dtest) - def _initrequest(self) -> None: - self.funcargs: dict[str, object] = {} - self._request = TopRequest(self, _ispytest=True) # type: ignore[arg-type] - def setup(self) -> None: - self._request._fillfixtures() - globs = dict(getfixture=self._request.getfixturevalue) - for name, value in self._request.getfixturevalue("doctest_namespace").items(): - globs[name] = value - self.dtest.globs.update(globs) + if self.dtest is not None: + self.fixture_request = _setup_fixtures(self) + globs = dict(getfixture=self.fixture_request.getfixturevalue) + for name, value in self.fixture_request.getfixturevalue( + "doctest_namespace" + ).items(): + globs[name] = value + self.dtest.globs.update(globs) def runtest(self) -> None: + assert self.dtest is not None + assert self.runner is not None _check_all_skipped(self.dtest) self._disable_output_capturing_for_darwin() - failures: list[doctest.DocTestFailure] = [] + failures: List["doctest.DocTestFailure"] = [] # Type ignored because we change the type of `out` from what # doctest expects. self.runner.run(self.dtest, out=failures) # type: ignore[arg-type] @@ -317,14 +314,14 @@ class DoctestItem(Item): def repr_failure( # type: ignore[override] self, excinfo: ExceptionInfo[BaseException], - ) -> str | TerminalRepr: + ) -> Union[str, TerminalRepr]: import doctest - failures: ( - Sequence[doctest.DocTestFailure | doctest.UnexpectedException] | None - ) = None + failures: Optional[ + Sequence[Union[doctest.DocTestFailure, doctest.UnexpectedException]] + ] = None if isinstance( - excinfo.value, doctest.DocTestFailure | doctest.UnexpectedException + excinfo.value, (doctest.DocTestFailure, doctest.UnexpectedException) ): failures = [excinfo.value] elif isinstance(excinfo.value, MultipleDoctestFailures): @@ -353,7 +350,7 @@ class DoctestItem(Item): # add line numbers to the left of the error message assert test.lineno is not None lines = [ - f"{i + test.lineno + 1:03d} {x}" for (i, x) in enumerate(lines) + "%03d %s" % (i + test.lineno + 1, x) for (i, x) in enumerate(lines) ] # trim docstring error lines to 10 lines = lines[max(example.lineno - 9, 0) : example.lineno + 1] @@ -371,18 +368,19 @@ class DoctestItem(Item): ).split("\n") else: inner_excinfo = ExceptionInfo.from_exc_info(failure.exc_info) - lines += [f"UNEXPECTED EXCEPTION: {inner_excinfo.value!r}"] + lines += ["UNEXPECTED EXCEPTION: %s" % repr(inner_excinfo.value)] lines += [ x.strip("\n") for x in traceback.format_exception(*failure.exc_info) ] reprlocation_lines.append((reprlocation, lines)) return ReprFailDoctest(reprlocation_lines) - def reportinfo(self) -> tuple[os.PathLike[str] | str, int | None, str]: - return self.path, self.dtest.lineno, f"[doctest] {self.name}" + def reportinfo(self) -> Tuple[Union["os.PathLike[str]", str], Optional[int], str]: + assert self.dtest is not None + return self.path, self.dtest.lineno, "[doctest] %s" % self.name -def _get_flag_lookup() -> dict[str, int]: +def _get_flag_lookup() -> Dict[str, int]: import doctest return dict( @@ -398,8 +396,8 @@ def _get_flag_lookup() -> dict[str, int]: ) -def get_optionflags(config: Config) -> int: - optionflags_str = config.getini("doctest_optionflags") +def get_optionflags(parent): + optionflags_str = parent.config.getini("doctest_optionflags") flag_lookup_table = _get_flag_lookup() flag_acc = 0 for flag in optionflags_str: @@ -407,8 +405,8 @@ def get_optionflags(config: Config) -> int: return flag_acc -def _get_continue_on_failure(config: Config) -> bool: - continue_on_failure: bool = config.getvalue("doctest_continue_on_failure") +def _get_continue_on_failure(config): + continue_on_failure = config.getvalue("doctest_continue_on_failure") if continue_on_failure: # We need to turn off this if we use pdb since we should stop at # the first failure. @@ -431,7 +429,7 @@ class DoctestTextfile(Module): name = self.path.name globs = {"__name__": "__main__"} - optionflags = get_optionflags(self.config) + optionflags = get_optionflags(self) runner = _get_runner( verbose=False, @@ -448,7 +446,7 @@ class DoctestTextfile(Module): ) -def _check_all_skipped(test: doctest.DocTest) -> None: +def _check_all_skipped(test: "doctest.DocTest") -> None: """Raise pytest.skip() if all examples in the given DocTest have the SKIP option set.""" import doctest @@ -468,13 +466,13 @@ def _is_mocked(obj: object) -> bool: @contextmanager -def _patch_unwrap_mock_aware() -> Generator[None]: +def _patch_unwrap_mock_aware() -> Generator[None, None, None]: """Context manager which replaces ``inspect.unwrap`` with a version that's aware of mock objects and doesn't recurse into them.""" real_unwrap = inspect.unwrap def _mock_aware_unwrap( - func: Callable[..., Any], *, stop: Callable[[Any], Any] | None = None + func: Callable[..., Any], *, stop: Optional[Callable[[Any], Any]] = None ) -> Any: try: if stop is None or stop is _is_mocked: @@ -483,9 +481,9 @@ def _patch_unwrap_mock_aware() -> Generator[None]: return real_unwrap(func, stop=lambda obj: _is_mocked(obj) or _stop(func)) except Exception as e: warnings.warn( - f"Got {e!r} when unwrapping {func!r}. This is usually caused " + "Got %r when unwrapping %r. This is usually caused " "by a violation of Python's object protocol; see e.g. " - "https://github.com/pytest-dev/pytest/issues/5080", + "https://github.com/pytest-dev/pytest/issues/5080" % (e, func), PytestWarning, ) raise @@ -502,32 +500,41 @@ class DoctestModule(Module): import doctest class MockAwareDocTestFinder(doctest.DocTestFinder): - py_ver_info_minor = sys.version_info[:2] - is_find_lineno_broken = ( - py_ver_info_minor < (3, 11) - or (py_ver_info_minor == (3, 11) and sys.version_info.micro < 9) - or (py_ver_info_minor == (3, 12) and sys.version_info.micro < 3) - ) - if is_find_lineno_broken: + """A hackish doctest finder that overrides stdlib internals to fix a stdlib bug. - def _find_lineno(self, obj, source_lines): - """On older Pythons, doctest code does not take into account - `@property`. https://github.com/python/cpython/issues/61648 + https://github.com/pytest-dev/pytest/issues/3456 + https://bugs.python.org/issue25532 + """ - Moreover, wrapped Doctests need to be unwrapped so the correct - line number is returned. #8796 - """ - if isinstance(obj, property): - obj = getattr(obj, "fget", obj) + def _find_lineno(self, obj, source_lines): + """Doctest code does not take into account `@property`, this + is a hackish way to fix it. https://bugs.python.org/issue17446 - if hasattr(obj, "__wrapped__"): - # Get the main obj in case of it being wrapped - obj = inspect.unwrap(obj) + Wrapped Doctests will need to be unwrapped so the correct + line number is returned. This will be reported upstream. #8796 + """ + if isinstance(obj, property): + obj = getattr(obj, "fget", obj) + if hasattr(obj, "__wrapped__"): + # Get the main obj in case of it being wrapped + obj = inspect.unwrap(obj) + + # Type ignored because this is a private function. + return super()._find_lineno( # type:ignore[misc] + obj, + source_lines, + ) + + def _find( + self, tests, obj, name, module, source_lines, globs, seen + ) -> None: + if _is_mocked(obj): + return + with _patch_unwrap_mock_aware(): # Type ignored because this is a private function. - return super()._find_lineno( # type:ignore[misc] - obj, - source_lines, + super()._find( # type:ignore[misc] + tests, obj, name, module, source_lines, globs, seen ) if sys.version_info < (3, 13): @@ -538,27 +545,38 @@ class DoctestModule(Module): Here we override `_from_module` to check the underlying function instead. https://github.com/python/cpython/issues/107995 """ - if isinstance(object, functools.cached_property): + if hasattr(functools, "cached_property") and isinstance( + object, functools.cached_property + ): object = object.func # Type ignored because this is a private function. return super()._from_module(module, object) # type: ignore[misc] - try: - module = self.obj - except Collector.CollectError: - if self.config.getvalue("doctest_ignore_import_errors"): - skip(f"unable to import module {self.path!r}") - else: - raise - - # While doctests currently don't support fixtures directly, we still - # need to pick up autouse fixtures. - self.session._fixturemanager.parsefactories(self) + else: # pragma: no cover + pass + if self.path.name == "conftest.py": + module = self.config.pluginmanager._importconftest( + self.path, + self.config.getoption("importmode"), + rootpath=self.config.rootpath, + ) + else: + try: + module = import_path( + self.path, + root=self.config.rootpath, + mode=self.config.getoption("importmode"), + ) + except ImportError: + if self.config.getvalue("doctest_ignore_import_errors"): + skip("unable to import module %r" % self.path) + else: + raise # Uses internal doctest module parsing mechanism. finder = MockAwareDocTestFinder() - optionflags = get_optionflags(self.config) + optionflags = get_optionflags(self) runner = _get_runner( verbose=False, optionflags=optionflags, @@ -573,8 +591,25 @@ class DoctestModule(Module): ) -def _init_checker_class() -> type[doctest.OutputChecker]: +def _setup_fixtures(doctest_item: DoctestItem) -> FixtureRequest: + """Used by DoctestTextfile and DoctestItem to setup fixture information.""" + + def func() -> None: + pass + + doctest_item.funcargs = {} # type: ignore[attr-defined] + fm = doctest_item.session._fixturemanager + doctest_item._fixtureinfo = fm.getfixtureinfo( # type: ignore[attr-defined] + node=doctest_item, func=func, cls=None, funcargs=False + ) + fixture_request = FixtureRequest(doctest_item, _ispytest=True) + fixture_request._fillfixtures() + return fixture_request + + +def _init_checker_class() -> Type["doctest.OutputChecker"]: import doctest + import re class LiteralsOutputChecker(doctest.OutputChecker): # Based on doctest_nose_plugin.py from the nltk project @@ -617,7 +652,7 @@ def _init_checker_class() -> type[doctest.OutputChecker]: if not allow_unicode and not allow_bytes and not allow_number: return False - def remove_prefixes(regex: re.Pattern[str], txt: str) -> str: + def remove_prefixes(regex: Pattern[str], txt: str) -> str: return re.sub(regex, r"\1\2", txt) if allow_unicode: @@ -639,9 +674,9 @@ def _init_checker_class() -> type[doctest.OutputChecker]: if len(wants) != len(gots): return got offset = 0 - for w, g in zip(wants, gots, strict=True): - fraction: str | None = w.group("fraction") - exponent: str | None = w.group("exponent1") + for w, g in zip(wants, gots): + fraction: Optional[str] = w.group("fraction") + exponent: Optional[str] = w.group("exponent1") if exponent is None: exponent = w.group("exponent2") precision = 0 if fraction is None else len(fraction) @@ -660,7 +695,7 @@ def _init_checker_class() -> type[doctest.OutputChecker]: return LiteralsOutputChecker -def _get_checker() -> doctest.OutputChecker: +def _get_checker() -> "doctest.OutputChecker": """Return a doctest.OutputChecker subclass that supports some additional options: @@ -719,7 +754,7 @@ def _get_report_choice(key: str) -> int: @fixture(scope="session") -def doctest_namespace() -> dict[str, Any]: +def doctest_namespace() -> Dict[str, Any]: """Fixture that returns a :py:class:`dict` that will be injected into the namespace of doctests. diff --git a/Backend/venv/lib/python3.12/site-packages/_pytest/faulthandler.py b/Backend/venv/lib/python3.12/site-packages/_pytest/faulthandler.py index 080cf583..36040bff 100644 --- a/Backend/venv/lib/python3.12/site-packages/_pytest/faulthandler.py +++ b/Backend/venv/lib/python3.12/site-packages/_pytest/faulthandler.py @@ -1,47 +1,31 @@ -from __future__ import annotations - -from collections.abc import Generator import os import sys +from typing import Generator +import pytest from _pytest.config import Config from _pytest.config.argparsing import Parser from _pytest.nodes import Item from _pytest.stash import StashKey -import pytest -fault_handler_original_stderr_fd_key = StashKey[int]() fault_handler_stderr_fd_key = StashKey[int]() +fault_handler_originally_enabled_key = StashKey[bool]() def pytest_addoption(parser: Parser) -> None: - help_timeout = ( + help = ( "Dump the traceback of all threads if a test takes " "more than TIMEOUT seconds to finish" ) - help_exit_on_timeout = ( - "Exit the test process if a test takes more than " - "faulthandler_timeout seconds to finish" - ) - parser.addini("faulthandler_timeout", help_timeout, default=0.0) - parser.addini( - "faulthandler_exit_on_timeout", help_exit_on_timeout, type="bool", default=False - ) + parser.addini("faulthandler_timeout", help, default=0.0) def pytest_configure(config: Config) -> None: import faulthandler - # at teardown we want to restore the original faulthandler fileno - # but faulthandler has no api to return the original fileno - # so here we stash the stderr fileno to be used at teardown - # sys.stderr and sys.__stderr__ may be closed or patched during the session - # so we can't rely on their values being good at that point (#11572). - stderr_fileno = get_stderr_fileno() - if faulthandler.is_enabled(): - config.stash[fault_handler_original_stderr_fd_key] = stderr_fileno - config.stash[fault_handler_stderr_fd_key] = os.dup(stderr_fileno) + config.stash[fault_handler_stderr_fd_key] = os.dup(get_stderr_fileno()) + config.stash[fault_handler_originally_enabled_key] = faulthandler.is_enabled() faulthandler.enable(file=config.stash[fault_handler_stderr_fd_key]) @@ -53,10 +37,9 @@ def pytest_unconfigure(config: Config) -> None: if fault_handler_stderr_fd_key in config.stash: os.close(config.stash[fault_handler_stderr_fd_key]) del config.stash[fault_handler_stderr_fd_key] - # Re-enable the faulthandler if it was originally enabled. - if fault_handler_original_stderr_fd_key in config.stash: - faulthandler.enable(config.stash[fault_handler_original_stderr_fd_key]) - del config.stash[fault_handler_original_stderr_fd_key] + if config.stash.get(fault_handler_originally_enabled_key, False): + # Re-enable the faulthandler if it was originally enabled. + faulthandler.enable(file=get_stderr_fileno()) def get_stderr_fileno() -> int: @@ -71,7 +54,6 @@ def get_stderr_fileno() -> int: # pytest-xdist monkeypatches sys.stderr with an object that is not an actual file. # https://docs.python.org/3/library/faulthandler.html#issue-with-file-descriptors # This is potentially dangerous, but the best we can do. - assert sys.__stderr__ is not None return sys.__stderr__.fileno() @@ -79,27 +61,20 @@ def get_timeout_config_value(config: Config) -> float: return float(config.getini("faulthandler_timeout") or 0.0) -def get_exit_on_timeout_config_value(config: Config) -> bool: - exit_on_timeout = config.getini("faulthandler_exit_on_timeout") - assert isinstance(exit_on_timeout, bool) - return exit_on_timeout - - -@pytest.hookimpl(wrapper=True, trylast=True) -def pytest_runtest_protocol(item: Item) -> Generator[None, object, object]: +@pytest.hookimpl(hookwrapper=True, trylast=True) +def pytest_runtest_protocol(item: Item) -> Generator[None, None, None]: timeout = get_timeout_config_value(item.config) - exit_on_timeout = get_exit_on_timeout_config_value(item.config) if timeout > 0: import faulthandler stderr = item.config.stash[fault_handler_stderr_fd_key] - faulthandler.dump_traceback_later(timeout, file=stderr, exit=exit_on_timeout) + faulthandler.dump_traceback_later(timeout, file=stderr) try: - return (yield) + yield finally: faulthandler.cancel_dump_traceback_later() else: - return (yield) + yield @pytest.hookimpl(tryfirst=True) diff --git a/Backend/venv/lib/python3.12/site-packages/_pytest/fixtures.py b/Backend/venv/lib/python3.12/site-packages/_pytest/fixtures.py index 27846db1..0462504e 100644 --- a/Backend/venv/lib/python3.12/site-packages/_pytest/fixtures.py +++ b/Backend/venv/lib/python3.12/site-packages/_pytest/fixtures.py @@ -1,61 +1,59 @@ -# mypy: allow-untyped-defs -from __future__ import annotations - -import abc -from collections import defaultdict -from collections import deque -from collections import OrderedDict -from collections.abc import Callable -from collections.abc import Generator -from collections.abc import Iterable -from collections.abc import Iterator -from collections.abc import Mapping -from collections.abc import MutableMapping -from collections.abc import Sequence -from collections.abc import Set as AbstractSet import dataclasses import functools import inspect import os -from pathlib import Path import sys -import types +import warnings +from collections import defaultdict +from collections import deque +from contextlib import suppress +from pathlib import Path +from types import TracebackType from typing import Any +from typing import Callable from typing import cast -from typing import Final -from typing import final +from typing import Dict +from typing import Generator from typing import Generic +from typing import Iterable +from typing import Iterator +from typing import List +from typing import MutableMapping from typing import NoReturn -from typing import overload +from typing import Optional +from typing import Sequence +from typing import Set +from typing import Tuple +from typing import Type from typing import TYPE_CHECKING from typing import TypeVar -import warnings +from typing import Union import _pytest from _pytest import nodes from _pytest._code import getfslineno -from _pytest._code import Source from _pytest._code.code import FormattedExcinfo from _pytest._code.code import TerminalRepr from _pytest._io import TerminalWriter +from _pytest.compat import _format_args +from _pytest.compat import _PytestWrapper from _pytest.compat import assert_never +from _pytest.compat import final from _pytest.compat import get_real_func +from _pytest.compat import get_real_method from _pytest.compat import getfuncargnames from _pytest.compat import getimfunc from _pytest.compat import getlocation +from _pytest.compat import is_generator from _pytest.compat import NOTSET from _pytest.compat import NotSetType +from _pytest.compat import overload from _pytest.compat import safe_getattr -from _pytest.compat import safe_isclass -from _pytest.compat import signature from _pytest.config import _PluggyPlugin from _pytest.config import Config -from _pytest.config import ExitCode from _pytest.config.argparsing import Parser from _pytest.deprecated import check_ispytest -from _pytest.deprecated import MARKED_FIXTURE from _pytest.deprecated import YIELD_FIXTURE -from _pytest.main import Session from _pytest.mark import Mark from _pytest.mark import ParameterSet from _pytest.mark.structures import MarkDecorator @@ -64,77 +62,81 @@ from _pytest.outcomes import skip from _pytest.outcomes import TEST_OUTCOME from _pytest.pathlib import absolutepath from _pytest.pathlib import bestrelpath -from _pytest.scope import _ScopeName from _pytest.scope import HIGH_SCOPES from _pytest.scope import Scope -from _pytest.warning_types import PytestRemovedIn9Warning -from _pytest.warning_types import PytestWarning - - -if sys.version_info < (3, 11): - from exceptiongroup import BaseExceptionGroup +from _pytest.stash import StashKey if TYPE_CHECKING: + from typing import Deque + + from _pytest.scope import _ScopeName + from _pytest.main import Session from _pytest.python import CallSpec2 - from _pytest.python import Function from _pytest.python import Metafunc # The value of the fixture -- return/yield of the fixture function (type variable). -FixtureValue = TypeVar("FixtureValue", covariant=True) +FixtureValue = TypeVar("FixtureValue") # The type of the fixture function (type variable). FixtureFunction = TypeVar("FixtureFunction", bound=Callable[..., object]) # The type of a fixture function (type alias generic in fixture value). -_FixtureFunc = Callable[..., FixtureValue] | Callable[..., Generator[FixtureValue]] +_FixtureFunc = Union[ + Callable[..., FixtureValue], Callable[..., Generator[FixtureValue, None, None]] +] # The type of FixtureDef.cached_result (type alias generic in fixture value). -_FixtureCachedResult = ( - tuple[ +_FixtureCachedResult = Union[ + Tuple[ # The result. FixtureValue, # Cache key. object, None, - ] - | tuple[ + ], + Tuple[ None, # Cache key. object, - # The exception and the original traceback. - tuple[BaseException, types.TracebackType | None], - ] -) + # Exc info if raised. + Tuple[Type[BaseException], BaseException, TracebackType], + ], +] -def pytest_sessionstart(session: Session) -> None: +@dataclasses.dataclass(frozen=True) +class PseudoFixtureDef(Generic[FixtureValue]): + cached_result: "_FixtureCachedResult[FixtureValue]" + _scope: Scope + + +def pytest_sessionstart(session: "Session") -> None: session._fixturemanager = FixtureManager(session) def get_scope_package( node: nodes.Item, - fixturedef: FixtureDef[object], -) -> nodes.Node | None: + fixturedef: "FixtureDef[object]", +) -> Optional[Union[nodes.Item, nodes.Collector]]: from _pytest.python import Package - for parent in node.iter_parents(): - if isinstance(parent, Package) and parent.nodeid == fixturedef.baseid: - return parent - return node.session + current: Optional[Union[nodes.Item, nodes.Collector]] = node + fixture_package_name = "{}/{}".format(fixturedef.baseid, "__init__.py") + while current and ( + not isinstance(current, Package) or fixture_package_name != current.nodeid + ): + current = current.parent # type: ignore[assignment] + if current is None: + return node.session + return current -def get_scope_node(node: nodes.Node, scope: Scope) -> nodes.Node | None: - """Get the closest parent node (including self) which matches the given - scope. - - If there is no parent node for the scope (e.g. asking for class scope on a - Module, or on a Function when not defined in a class), returns None. - """ +def get_scope_node( + node: nodes.Node, scope: Scope +) -> Optional[Union[nodes.Item, nodes.Collector]]: import _pytest.python if scope is Scope.Function: - # Type ignored because this is actually safe, see: - # https://github.com/python/mypy/issues/4717 - return node.getparent(nodes.Item) # type: ignore[type-abstract] + return node.getparent(nodes.Item) elif scope is Scope.Class: return node.getparent(_pytest.python.Class) elif scope is Scope.Module: @@ -147,12 +149,121 @@ def get_scope_node(node: nodes.Node, scope: Scope) -> nodes.Node | None: assert_never(scope) -# TODO: Try to use FixtureFunctionDefinition instead of the marker -def getfixturemarker(obj: object) -> FixtureFunctionMarker | None: - """Return fixturemarker or None if it doesn't exist""" - if isinstance(obj, FixtureFunctionDefinition): - return obj._fixture_function_marker - return None +# Used for storing artificial fixturedefs for direct parametrization. +name2pseudofixturedef_key = StashKey[Dict[str, "FixtureDef[Any]"]]() + + +def add_funcarg_pseudo_fixture_def( + collector: nodes.Collector, metafunc: "Metafunc", fixturemanager: "FixtureManager" +) -> None: + # This function will transform all collected calls to functions + # if they use direct funcargs (i.e. direct parametrization) + # because we want later test execution to be able to rely on + # an existing FixtureDef structure for all arguments. + # XXX we can probably avoid this algorithm if we modify CallSpec2 + # to directly care for creating the fixturedefs within its methods. + if not metafunc._calls[0].funcargs: + # This function call does not have direct parametrization. + return + # Collect funcargs of all callspecs into a list of values. + arg2params: Dict[str, List[object]] = {} + arg2scope: Dict[str, Scope] = {} + for callspec in metafunc._calls: + for argname, argvalue in callspec.funcargs.items(): + assert argname not in callspec.params + callspec.params[argname] = argvalue + arg2params_list = arg2params.setdefault(argname, []) + callspec.indices[argname] = len(arg2params_list) + arg2params_list.append(argvalue) + if argname not in arg2scope: + scope = callspec._arg2scope.get(argname, Scope.Function) + arg2scope[argname] = scope + callspec.funcargs.clear() + + # Register artificial FixtureDef's so that later at test execution + # time we can rely on a proper FixtureDef to exist for fixture setup. + arg2fixturedefs = metafunc._arg2fixturedefs + for argname, valuelist in arg2params.items(): + # If we have a scope that is higher than function, we need + # to make sure we only ever create an according fixturedef on + # a per-scope basis. We thus store and cache the fixturedef on the + # node related to the scope. + scope = arg2scope[argname] + node = None + if scope is not Scope.Function: + node = get_scope_node(collector, scope) + if node is None: + assert scope is Scope.Class and isinstance( + collector, _pytest.python.Module + ) + # Use module-level collector for class-scope (for now). + node = collector + if node is None: + name2pseudofixturedef = None + else: + default: Dict[str, FixtureDef[Any]] = {} + name2pseudofixturedef = node.stash.setdefault( + name2pseudofixturedef_key, default + ) + if name2pseudofixturedef is not None and argname in name2pseudofixturedef: + arg2fixturedefs[argname] = [name2pseudofixturedef[argname]] + else: + fixturedef = FixtureDef( + fixturemanager=fixturemanager, + baseid="", + argname=argname, + func=get_direct_param_fixture_func, + scope=arg2scope[argname], + params=valuelist, + unittest=False, + ids=None, + ) + arg2fixturedefs[argname] = [fixturedef] + if name2pseudofixturedef is not None: + name2pseudofixturedef[argname] = fixturedef + + +def getfixturemarker(obj: object) -> Optional["FixtureFunctionMarker"]: + """Return fixturemarker or None if it doesn't exist or raised + exceptions.""" + return cast( + Optional[FixtureFunctionMarker], + safe_getattr(obj, "_pytestfixturefunction", None), + ) + + +# Parametrized fixture key, helper alias for code below. +_Key = Tuple[object, ...] + + +def get_parametrized_fixture_keys(item: nodes.Item, scope: Scope) -> Iterator[_Key]: + """Return list of keys for all parametrized arguments which match + the specified scope.""" + assert scope is not Scope.Function + try: + callspec = item.callspec # type: ignore[attr-defined] + except AttributeError: + pass + else: + cs: CallSpec2 = callspec + # cs.indices.items() is random order of argnames. Need to + # sort this so that different calls to + # get_parametrized_fixture_keys will be deterministic. + for argname, param_index in sorted(cs.indices.items()): + if cs._arg2scope[argname] != scope: + continue + if scope is Scope.Session: + key: _Key = (argname, param_index) + elif scope is Scope.Package: + key = (argname, param_index, item.path.parent) + elif scope is Scope.Module: + key = (argname, param_index, item.path) + elif scope is Scope.Class: + item_cls = item.cls # type: ignore[attr-defined] + key = (argname, param_index, item.path, item_cls) + else: + assert_never(scope) + yield key # Algorithm for sorting on a per-parametrized resource setup basis. @@ -161,109 +272,61 @@ def getfixturemarker(obj: object) -> FixtureFunctionMarker | None: # setups and teardowns. -@dataclasses.dataclass(frozen=True) -class ParamArgKey: - """A key for a high-scoped parameter used by an item. - - For use as a hashable key in `reorder_items`. The combination of fields - is meant to uniquely identify a particular "instance" of a param, - potentially shared by multiple items in a scope. - """ - - #: The param name. - argname: str - param_index: int - #: For scopes Package, Module, Class, the path to the file (directory in - #: Package's case) of the package/module/class where the item is defined. - scoped_item_path: Path | None - #: For Class scope, the class where the item is defined. - item_cls: type | None - - -_V = TypeVar("_V") -OrderedSet = dict[_V, None] - - -def get_param_argkeys(item: nodes.Item, scope: Scope) -> Iterator[ParamArgKey]: - """Return all ParamArgKeys for item matching the specified high scope.""" - assert scope is not Scope.Function - - try: - callspec: CallSpec2 = item.callspec # type: ignore[attr-defined] - except AttributeError: - return - - item_cls = None - if scope is Scope.Session: - scoped_item_path = None - elif scope is Scope.Package: - # Package key = module's directory. - scoped_item_path = item.path.parent - elif scope is Scope.Module: - scoped_item_path = item.path - elif scope is Scope.Class: - scoped_item_path = item.path - item_cls = item.cls # type: ignore[attr-defined] - else: - assert_never(scope) - - for argname in callspec.indices: - if callspec._arg2scope[argname] != scope: - continue - param_index = callspec.indices[argname] - yield ParamArgKey(argname, param_index, scoped_item_path, item_cls) - - -def reorder_items(items: Sequence[nodes.Item]) -> list[nodes.Item]: - argkeys_by_item: dict[Scope, dict[nodes.Item, OrderedSet[ParamArgKey]]] = {} - items_by_argkey: dict[Scope, dict[ParamArgKey, OrderedDict[nodes.Item, None]]] = {} +def reorder_items(items: Sequence[nodes.Item]) -> List[nodes.Item]: + argkeys_cache: Dict[Scope, Dict[nodes.Item, Dict[_Key, None]]] = {} + items_by_argkey: Dict[Scope, Dict[_Key, Deque[nodes.Item]]] = {} for scope in HIGH_SCOPES: - scoped_argkeys_by_item = argkeys_by_item[scope] = {} - scoped_items_by_argkey = items_by_argkey[scope] = defaultdict(OrderedDict) + d: Dict[nodes.Item, Dict[_Key, None]] = {} + argkeys_cache[scope] = d + item_d: Dict[_Key, Deque[nodes.Item]] = defaultdict(deque) + items_by_argkey[scope] = item_d for item in items: - argkeys = dict.fromkeys(get_param_argkeys(item, scope)) - if argkeys: - scoped_argkeys_by_item[item] = argkeys - for argkey in argkeys: - scoped_items_by_argkey[argkey][item] = None - - items_set = dict.fromkeys(items) + keys = dict.fromkeys(get_parametrized_fixture_keys(item, scope), None) + if keys: + d[item] = keys + for key in keys: + item_d[key].append(item) + items_dict = dict.fromkeys(items, None) return list( - reorder_items_atscope( - items_set, argkeys_by_item, items_by_argkey, Scope.Session - ) + reorder_items_atscope(items_dict, argkeys_cache, items_by_argkey, Scope.Session) ) +def fix_cache_order( + item: nodes.Item, + argkeys_cache: Dict[Scope, Dict[nodes.Item, Dict[_Key, None]]], + items_by_argkey: Dict[Scope, Dict[_Key, "Deque[nodes.Item]"]], +) -> None: + for scope in HIGH_SCOPES: + for key in argkeys_cache[scope].get(item, []): + items_by_argkey[scope][key].appendleft(item) + + def reorder_items_atscope( - items: OrderedSet[nodes.Item], - argkeys_by_item: Mapping[Scope, Mapping[nodes.Item, OrderedSet[ParamArgKey]]], - items_by_argkey: Mapping[ - Scope, Mapping[ParamArgKey, OrderedDict[nodes.Item, None]] - ], + items: Dict[nodes.Item, None], + argkeys_cache: Dict[Scope, Dict[nodes.Item, Dict[_Key, None]]], + items_by_argkey: Dict[Scope, Dict[_Key, "Deque[nodes.Item]"]], scope: Scope, -) -> OrderedSet[nodes.Item]: +) -> Dict[nodes.Item, None]: if scope is Scope.Function or len(items) < 3: return items - - scoped_items_by_argkey = items_by_argkey[scope] - scoped_argkeys_by_item = argkeys_by_item[scope] - - ignore: set[ParamArgKey] = set() + ignore: Set[Optional[_Key]] = set() items_deque = deque(items) - items_done: OrderedSet[nodes.Item] = {} + items_done: Dict[nodes.Item, None] = {} + scoped_items_by_argkey = items_by_argkey[scope] + scoped_argkeys_cache = argkeys_cache[scope] while items_deque: - no_argkey_items: OrderedSet[nodes.Item] = {} + no_argkey_group: Dict[nodes.Item, None] = {} slicing_argkey = None while items_deque: item = items_deque.popleft() - if item in items_done or item in no_argkey_items: + if item in items_done or item in no_argkey_group: continue argkeys = dict.fromkeys( - k for k in scoped_argkeys_by_item.get(item, ()) if k not in ignore + (k for k in scoped_argkeys_cache.get(item, []) if k not in ignore), None ) if not argkeys: - no_argkey_items[item] = None + no_argkey_group[item] = None else: slicing_argkey, _ = argkeys.popitem() # We don't have to remove relevant items from later in the @@ -272,64 +335,35 @@ def reorder_items_atscope( i for i in scoped_items_by_argkey[slicing_argkey] if i in items ] for i in reversed(matching_items): + fix_cache_order(i, argkeys_cache, items_by_argkey) items_deque.appendleft(i) - # Fix items_by_argkey order. - for other_scope in HIGH_SCOPES: - other_scoped_items_by_argkey = items_by_argkey[other_scope] - for argkey in argkeys_by_item[other_scope].get(i, ()): - argkey_dict = other_scoped_items_by_argkey[argkey] - if not hasattr(sys, "pypy_version_info"): - argkey_dict[i] = None - argkey_dict.move_to_end(i, last=False) - else: - # Work around a bug in PyPy: - # https://github.com/pypy/pypy/issues/5257 - # https://github.com/pytest-dev/pytest/issues/13312 - bkp = argkey_dict.copy() - argkey_dict.clear() - argkey_dict[i] = None - argkey_dict.update(bkp) break - if no_argkey_items: - reordered_no_argkey_items = reorder_items_atscope( - no_argkey_items, argkeys_by_item, items_by_argkey, scope.next_lower() + if no_argkey_group: + no_argkey_group = reorder_items_atscope( + no_argkey_group, argkeys_cache, items_by_argkey, scope.next_lower() ) - items_done.update(reordered_no_argkey_items) - if slicing_argkey is not None: - ignore.add(slicing_argkey) + for item in no_argkey_group: + items_done[item] = None + ignore.add(slicing_argkey) return items_done -@dataclasses.dataclass(frozen=True) +def get_direct_param_fixture_func(request: "FixtureRequest") -> Any: + return request.param + + +@dataclasses.dataclass class FuncFixtureInfo: - """Fixture-related information for a fixture-requesting item (e.g. test - function). + __slots__ = ("argnames", "initialnames", "names_closure", "name2fixturedefs") - This is used to examine the fixtures which an item requests statically - (known during collection). This includes autouse fixtures, fixtures - requested by the `usefixtures` marker, fixtures requested in the function - parameters, and the transitive closure of these. - - An item may also request fixtures dynamically (using `request.getfixturevalue`); - these are not reflected here. - """ - - __slots__ = ("argnames", "initialnames", "name2fixturedefs", "names_closure") - - # Fixture names that the item requests directly by function parameters. - argnames: tuple[str, ...] - # Fixture names that the item immediately requires. These include - # argnames + fixture names specified via usefixtures and via autouse=True in - # fixture definitions. - initialnames: tuple[str, ...] - # The transitive closure of the fixture names that the item requires. - # Note: can't include dynamic dependencies (`request.getfixturevalue` calls). - names_closure: list[str] - # A map from a fixture name in the transitive closure to the FixtureDefs - # matching the name which are applicable to this function. - # There may be multiple overriding fixtures with the same name. The - # sequence is ordered from furthest to closes to the function. - name2fixturedefs: dict[str, Sequence[FixtureDef[Any]]] + # Original function argument names. + argnames: Tuple[str, ...] + # Argnames that function immediately requires. These include argnames + + # fixture names specified via usefixtures and via autouse=True in fixture + # definitions. + initialnames: Tuple[str, ...] + names_closure: List[str] + name2fixturedefs: Dict[str, Sequence["FixtureDef[Any]"]] def prune_dependency_tree(self) -> None: """Recompute names_closure from initialnames and name2fixturedefs. @@ -342,11 +376,11 @@ class FuncFixtureInfo: tree. In this way the dependency tree can get pruned, and the closure of argnames may get reduced. """ - closure: set[str] = set() + closure: Set[str] = set() working_set = set(self.initialnames) while working_set: argname = working_set.pop() - # Argname may be something not included in the original names_closure, + # Argname may be smth not included in the original names_closure, # in which case we ignore it. This currently happens with pseudo # FixtureDefs which wrap 'get_direct_param_fixture_func(request)'. # So they introduce the new dependency 'request' which might have @@ -359,34 +393,25 @@ class FuncFixtureInfo: self.names_closure[:] = sorted(closure, key=self.names_closure.index) -class FixtureRequest(abc.ABC): - """The type of the ``request`` fixture. +class FixtureRequest: + """A request for a fixture from a test or fixture function. - A request object gives access to the requesting test context and has a - ``param`` attribute in case the fixture is parametrized. + A request object gives access to the requesting test context and has + an optional ``param`` attribute in case the fixture is parametrized + indirectly. """ - def __init__( - self, - pyfuncitem: Function, - fixturename: str | None, - arg2fixturedefs: dict[str, Sequence[FixtureDef[Any]]], - fixture_defs: dict[str, FixtureDef[Any]], - *, - _ispytest: bool = False, - ) -> None: + def __init__(self, pyfuncitem, *, _ispytest: bool = False) -> None: check_ispytest(_ispytest) + self._pyfuncitem = pyfuncitem #: Fixture for which this request is being performed. - self.fixturename: Final = fixturename - self._pyfuncitem: Final = pyfuncitem - # The FixtureDefs for each fixture name requested by this item. - # Starts from the statically-known fixturedefs resolved during - # collection. Dynamically requested fixtures (using - # `request.getfixturevalue("foo")`) are added dynamically. - self._arg2fixturedefs: Final = arg2fixturedefs - # The evaluated argnames so far, mapping to the FixtureDef they resolved - # to. - self._fixture_defs: Final = fixture_defs + self.fixturename: Optional[str] = None + self._scope = Scope.Function + self._fixture_defs: Dict[str, FixtureDef[Any]] = {} + fixtureinfo: FuncFixtureInfo = pyfuncitem._fixtureinfo + self._arg2fixturedefs = fixtureinfo.name2fixturedefs.copy() + self._arg2index: Dict[str, int] = {} + self._fixturemanager: FixtureManager = pyfuncitem.session._fixturemanager # Notes on the type of `param`: # -`request.param` is only defined in parametrized fixtures, and will raise # AttributeError otherwise. Python typing has no notion of "undefined", so @@ -398,44 +423,61 @@ class FixtureRequest(abc.ABC): self.param: Any @property - def _fixturemanager(self) -> FixtureManager: - return self._pyfuncitem.session._fixturemanager - - @property - @abc.abstractmethod - def _scope(self) -> Scope: - raise NotImplementedError() - - @property - def scope(self) -> _ScopeName: + def scope(self) -> "_ScopeName": """Scope string, one of "function", "class", "module", "package", "session".""" return self._scope.value - @abc.abstractmethod - def _check_scope( - self, - requested_fixturedef: FixtureDef[object], - requested_scope: Scope, - ) -> None: - raise NotImplementedError() - @property - def fixturenames(self) -> list[str]: + def fixturenames(self) -> List[str]: """Names of all active fixtures in this request.""" - result = list(self._pyfuncitem.fixturenames) + result = list(self._pyfuncitem._fixtureinfo.names_closure) result.extend(set(self._fixture_defs).difference(result)) return result @property - @abc.abstractmethod def node(self): """Underlying collection node (depends on current request scope).""" - raise NotImplementedError() + scope = self._scope + if scope is Scope.Function: + # This might also be a non-function Item despite its attribute name. + node: Optional[Union[nodes.Item, nodes.Collector]] = self._pyfuncitem + elif scope is Scope.Package: + # FIXME: _fixturedef is not defined on FixtureRequest (this class), + # but on FixtureRequest (a subclass). + node = get_scope_package(self._pyfuncitem, self._fixturedef) # type: ignore[attr-defined] + else: + node = get_scope_node(self._pyfuncitem, scope) + if node is None and scope is Scope.Class: + # Fallback to function item itself. + node = self._pyfuncitem + assert node, 'Could not obtain a node for scope "{}" for function {!r}'.format( + scope, self._pyfuncitem + ) + return node + + def _getnextfixturedef(self, argname: str) -> "FixtureDef[Any]": + fixturedefs = self._arg2fixturedefs.get(argname, None) + if fixturedefs is None: + # We arrive here because of a dynamic call to + # getfixturevalue(argname) usage which was naturally + # not known at parsing/collection time. + assert self._pyfuncitem.parent is not None + parentid = self._pyfuncitem.parent.nodeid + fixturedefs = self._fixturemanager.getfixturedefs(argname, parentid) + # TODO: Fix this type ignore. Either add assert or adjust types. + # Can this be None here? + self._arg2fixturedefs[argname] = fixturedefs # type: ignore[assignment] + # fixturedefs list is immutable so we maintain a decreasing index. + index = self._arg2index.get(argname, 0) - 1 + if fixturedefs is None or (-index > len(fixturedefs)): + raise FixtureLookupError(argname, self) + self._arg2index[argname] = index + return fixturedefs[index] @property def config(self) -> Config: """The pytest config object associated with this request.""" - return self._pyfuncitem.config + return self._pyfuncitem.config # type: ignore[no-any-return] @property def function(self): @@ -458,25 +500,27 @@ class FixtureRequest(abc.ABC): @property def instance(self): """Instance (can be None) on which test function was collected.""" - if self.scope != "function": - return None - return getattr(self._pyfuncitem, "instance", None) + # unittest support hack, see _pytest.unittest.TestCaseFunction. + try: + return self._pyfuncitem._testcase + except AttributeError: + function = getattr(self, "function", None) + return getattr(function, "__self__", None) @property def module(self): """Python module object where the test function was collected.""" if self.scope not in ("function", "class", "module"): raise AttributeError(f"module not available in {self.scope}-scoped context") - mod = self._pyfuncitem.getparent(_pytest.python.Module) - assert mod is not None - return mod.obj + return self._pyfuncitem.getparent(_pytest.python.Module).obj @property def path(self) -> Path: """Path where the test function was collected.""" if self.scope not in ("function", "class", "module", "package"): raise AttributeError(f"path not available in {self.scope}-scoped context") - return self._pyfuncitem.path + # TODO: Remove ignore once _pyfuncitem is properly typed. + return self._pyfuncitem.path # type: ignore @property def keywords(self) -> MutableMapping[str, Any]: @@ -485,17 +529,17 @@ class FixtureRequest(abc.ABC): return node.keywords @property - def session(self) -> Session: + def session(self) -> "Session": """Pytest session object.""" - return self._pyfuncitem.session + return self._pyfuncitem.session # type: ignore[no-any-return] - @abc.abstractmethod def addfinalizer(self, finalizer: Callable[[], object]) -> None: """Add finalizer/teardown function to be called without arguments after the last test within the requesting test context finished execution.""" - raise NotImplementedError() + # XXX usually this method is shadowed by fixturedef specific ones. + self.node.addfinalizer(finalizer) - def applymarker(self, marker: str | MarkDecorator) -> None: + def applymarker(self, marker: Union[str, MarkDecorator]) -> None: """Apply a marker to a single test function invocation. This method is useful if you don't want to have a keyword/marker @@ -506,13 +550,20 @@ class FixtureRequest(abc.ABC): """ self.node.add_marker(marker) - def raiseerror(self, msg: str | None) -> NoReturn: + def raiseerror(self, msg: Optional[str]) -> NoReturn: """Raise a FixtureLookupError exception. :param msg: An optional custom error message. """ - raise FixtureLookupError(None, self, msg) + raise self._fixturemanager.FixtureLookupError(None, self, msg) + + def _fillfixtures(self) -> None: + item = self._pyfuncitem + fixturenames = getattr(item, "fixturenames", self.fixturenames) + for argname in fixturenames: + if argname not in item.funcargs: + item.funcargs[argname] = self.getfixturevalue(argname) def getfixturevalue(self, argname: str) -> Any: """Dynamically run a named fixture function. @@ -531,11 +582,6 @@ class FixtureRequest(abc.ABC): :raises pytest.FixtureLookupError: If the given fixture could not be found. """ - # Note that in addition to the use case described in the docstring, - # getfixturevalue() is also called by pytest itself during item and fixture - # setup to evaluate the fixtures that are requested statically - # (using function parameters, autouse, etc). - fixturedef = self._get_active_fixturedef(argname) assert fixturedef.cached_result is not None, ( f'The fixture value for "{argname}" is not available. ' @@ -543,287 +589,220 @@ class FixtureRequest(abc.ABC): ) return fixturedef.cached_result[0] - def _iter_chain(self) -> Iterator[SubRequest]: - """Yield all SubRequests in the chain, from self up. - - Note: does *not* yield the TopRequest. - """ - current = self - while isinstance(current, SubRequest): - yield current - current = current._parent_request - - def _get_active_fixturedef(self, argname: str) -> FixtureDef[object]: - if argname == "request": - return RequestFixtureDef(self) - - # If we already finished computing a fixture by this name in this item, - # return it. - fixturedef = self._fixture_defs.get(argname) - if fixturedef is not None: - self._check_scope(fixturedef, fixturedef._scope) - return fixturedef - - # Find the appropriate fixturedef. - fixturedefs = self._arg2fixturedefs.get(argname, None) - if fixturedefs is None: - # We arrive here because of a dynamic call to - # getfixturevalue(argname) which was naturally - # not known at parsing/collection time. - fixturedefs = self._fixturemanager.getfixturedefs(argname, self._pyfuncitem) - if fixturedefs is not None: - self._arg2fixturedefs[argname] = fixturedefs - # No fixtures defined with this name. - if fixturedefs is None: - raise FixtureLookupError(argname, self) - # The are no fixtures with this name applicable for the function. - if not fixturedefs: - raise FixtureLookupError(argname, self) - - # A fixture may override another fixture with the same name, e.g. a - # fixture in a module can override a fixture in a conftest, a fixture in - # a class can override a fixture in the module, and so on. - # An overriding fixture can request its own name (possibly indirectly); - # in this case it gets the value of the fixture it overrides, one level - # up. - # Check how many `argname`s deep we are, and take the next one. - # `fixturedefs` is sorted from furthest to closest, so use negative - # indexing to go in reverse. - index = -1 - for request in self._iter_chain(): - if request.fixturename == argname: - index -= 1 - # If already consumed all of the available levels, fail. - if -index > len(fixturedefs): - raise FixtureLookupError(argname, self) - fixturedef = fixturedefs[index] - - # Prepare a SubRequest object for calling the fixture. + def _get_active_fixturedef( + self, argname: str + ) -> Union["FixtureDef[object]", PseudoFixtureDef[object]]: try: - callspec = self._pyfuncitem.callspec + return self._fixture_defs[argname] + except KeyError: + try: + fixturedef = self._getnextfixturedef(argname) + except FixtureLookupError: + if argname == "request": + cached_result = (self, [0], None) + return PseudoFixtureDef(cached_result, Scope.Function) + raise + # Remove indent to prevent the python3 exception + # from leaking into the call. + self._compute_fixture_value(fixturedef) + self._fixture_defs[argname] = fixturedef + return fixturedef + + def _get_fixturestack(self) -> List["FixtureDef[Any]"]: + current = self + values: List[FixtureDef[Any]] = [] + while isinstance(current, SubRequest): + values.append(current._fixturedef) # type: ignore[has-type] + current = current._parent_request + values.reverse() + return values + + def _compute_fixture_value(self, fixturedef: "FixtureDef[object]") -> None: + """Create a SubRequest based on "self" and call the execute method + of the given FixtureDef object. + + This will force the FixtureDef object to throw away any previous + results and compute a new fixture value, which will be stored into + the FixtureDef object itself. + """ + # prepare a subrequest object before calling fixture function + # (latter managed by fixturedef) + argname = fixturedef.argname + funcitem = self._pyfuncitem + scope = fixturedef._scope + try: + callspec = funcitem.callspec except AttributeError: callspec = None if callspec is not None and argname in callspec.params: param = callspec.params[argname] param_index = callspec.indices[argname] - # The parametrize invocation scope overrides the fixture's scope. - scope = callspec._arg2scope[argname] + # If a parametrize invocation set a scope it will override + # the static scope defined with the fixture function. + with suppress(KeyError): + scope = callspec._arg2scope[argname] else: param = NOTSET param_index = 0 - scope = fixturedef._scope - self._check_fixturedef_without_param(fixturedef) - # The parametrize invocation scope only controls caching behavior while - # allowing wider-scoped fixtures to keep depending on the parametrized - # fixture. Scope control is enforced for parametrized fixtures - # by recreating the whole fixture tree on parameter change. - # Hence `fixturedef._scope`, not `scope`. - self._check_scope(fixturedef, fixturedef._scope) + has_params = fixturedef.params is not None + fixtures_not_supported = getattr(funcitem, "nofuncargs", False) + if has_params and fixtures_not_supported: + msg = ( + "{name} does not support fixtures, maybe unittest.TestCase subclass?\n" + "Node id: {nodeid}\n" + "Function type: {typename}" + ).format( + name=funcitem.name, + nodeid=funcitem.nodeid, + typename=type(funcitem).__name__, + ) + fail(msg, pytrace=False) + if has_params: + frame = inspect.stack()[3] + frameinfo = inspect.getframeinfo(frame[0]) + source_path = absolutepath(frameinfo.filename) + source_lineno = frameinfo.lineno + try: + source_path_str = str( + source_path.relative_to(funcitem.config.rootpath) + ) + except ValueError: + source_path_str = str(source_path) + msg = ( + "The requested fixture has no parameter defined for test:\n" + " {}\n\n" + "Requested fixture '{}' defined in:\n{}" + "\n\nRequested here:\n{}:{}".format( + funcitem.nodeid, + fixturedef.argname, + getlocation(fixturedef.func, funcitem.config.rootpath), + source_path_str, + source_lineno, + ) + ) + fail(msg, pytrace=False) + subrequest = SubRequest( self, scope, param, param_index, fixturedef, _ispytest=True ) - # Make sure the fixture value is cached, running it if it isn't - fixturedef.execute(request=subrequest) + # Check if a higher-level scoped fixture accesses a lower level one. + subrequest._check_scope(argname, self._scope, scope) + try: + # Call the fixture function. + fixturedef.execute(request=subrequest) + finally: + self._schedule_finalizers(fixturedef, subrequest) - self._fixture_defs[argname] = fixturedef - return fixturedef - - def _check_fixturedef_without_param(self, fixturedef: FixtureDef[object]) -> None: - """Check that this request is allowed to execute this fixturedef without - a param.""" - funcitem = self._pyfuncitem - has_params = fixturedef.params is not None - fixtures_not_supported = getattr(funcitem, "nofuncargs", False) - if has_params and fixtures_not_supported: - msg = ( - f"{funcitem.name} does not support fixtures, maybe unittest.TestCase subclass?\n" - f"Node id: {funcitem.nodeid}\n" - f"Function type: {type(funcitem).__name__}" - ) - fail(msg, pytrace=False) - if has_params: - frame = inspect.stack()[3] - frameinfo = inspect.getframeinfo(frame[0]) - source_path = absolutepath(frameinfo.filename) - source_lineno = frameinfo.lineno - try: - source_path_str = str(source_path.relative_to(funcitem.config.rootpath)) - except ValueError: - source_path_str = str(source_path) - location = getlocation(fixturedef.func, funcitem.config.rootpath) - msg = ( - "The requested fixture has no parameter defined for test:\n" - f" {funcitem.nodeid}\n\n" - f"Requested fixture '{fixturedef.argname}' defined in:\n" - f"{location}\n\n" - f"Requested here:\n" - f"{source_path_str}:{source_lineno}" - ) - fail(msg, pytrace=False) - - def _get_fixturestack(self) -> list[FixtureDef[Any]]: - values = [request._fixturedef for request in self._iter_chain()] - values.reverse() - return values - - -@final -class TopRequest(FixtureRequest): - """The type of the ``request`` fixture in a test function.""" - - def __init__(self, pyfuncitem: Function, *, _ispytest: bool = False) -> None: - super().__init__( - fixturename=None, - pyfuncitem=pyfuncitem, - arg2fixturedefs=pyfuncitem._fixtureinfo.name2fixturedefs.copy(), - fixture_defs={}, - _ispytest=_ispytest, - ) - - @property - def _scope(self) -> Scope: - return Scope.Function + def _schedule_finalizers( + self, fixturedef: "FixtureDef[object]", subrequest: "SubRequest" + ) -> None: + # If fixture function failed it might have registered finalizers. + subrequest.node.addfinalizer(lambda: fixturedef.finish(request=subrequest)) def _check_scope( self, - requested_fixturedef: FixtureDef[object], + argname: str, + invoking_scope: Scope, requested_scope: Scope, ) -> None: - # TopRequest always has function scope so always valid. - pass + if argname == "request": + return + if invoking_scope > requested_scope: + # Try to report something helpful. + text = "\n".join(self._factorytraceback()) + fail( + f"ScopeMismatch: You tried to access the {requested_scope.value} scoped " + f"fixture {argname} with a {invoking_scope.value} scoped request object, " + f"involved factories:\n{text}", + pytrace=False, + ) - @property - def node(self): - return self._pyfuncitem + def _factorytraceback(self) -> List[str]: + lines = [] + for fixturedef in self._get_fixturestack(): + factory = fixturedef.func + fs, lineno = getfslineno(factory) + if isinstance(fs, Path): + session: Session = self._pyfuncitem.session + p = bestrelpath(session.path, fs) + else: + p = fs + args = _format_args(factory) + lines.append("%s:%d: def %s%s" % (p, lineno + 1, factory.__name__, args)) + return lines def __repr__(self) -> str: - return f"" - - def _fillfixtures(self) -> None: - item = self._pyfuncitem - for argname in item.fixturenames: - if argname not in item.funcargs: - item.funcargs[argname] = self.getfixturevalue(argname) - - def addfinalizer(self, finalizer: Callable[[], object]) -> None: - self.node.addfinalizer(finalizer) + return "" % (self.node) @final class SubRequest(FixtureRequest): - """The type of the ``request`` fixture in a fixture function requested - (transitively) by a test function.""" + """A sub request for handling getting a fixture from a test function/fixture.""" def __init__( self, - request: FixtureRequest, + request: "FixtureRequest", scope: Scope, param: Any, param_index: int, - fixturedef: FixtureDef[object], + fixturedef: "FixtureDef[object]", *, _ispytest: bool = False, ) -> None: - super().__init__( - pyfuncitem=request._pyfuncitem, - fixturename=fixturedef.argname, - fixture_defs=request._fixture_defs, - arg2fixturedefs=request._arg2fixturedefs, - _ispytest=_ispytest, - ) - self._parent_request: Final[FixtureRequest] = request - self._scope_field: Final = scope - self._fixturedef: Final[FixtureDef[object]] = fixturedef + check_ispytest(_ispytest) + self._parent_request = request + self.fixturename = fixturedef.argname if param is not NOTSET: self.param = param - self.param_index: Final = param_index + self.param_index = param_index + self._scope = scope + self._fixturedef = fixturedef + self._pyfuncitem = request._pyfuncitem + self._fixture_defs = request._fixture_defs + self._arg2fixturedefs = request._arg2fixturedefs + self._arg2index = request._arg2index + self._fixturemanager = request._fixturemanager def __repr__(self) -> str: return f"" - @property - def _scope(self) -> Scope: - return self._scope_field - - @property - def node(self): - scope = self._scope - if scope is Scope.Function: - # This might also be a non-function Item despite its attribute name. - node: nodes.Node | None = self._pyfuncitem - elif scope is Scope.Package: - node = get_scope_package(self._pyfuncitem, self._fixturedef) - else: - node = get_scope_node(self._pyfuncitem, scope) - if node is None and scope is Scope.Class: - # Fallback to function item itself. - node = self._pyfuncitem - assert node, ( - f'Could not obtain a node for scope "{scope}" for function {self._pyfuncitem!r}' - ) - return node - - def _check_scope( - self, - requested_fixturedef: FixtureDef[object], - requested_scope: Scope, - ) -> None: - if self._scope > requested_scope: - # Try to report something helpful. - argname = requested_fixturedef.argname - fixture_stack = "\n".join( - self._format_fixturedef_line(fixturedef) - for fixturedef in self._get_fixturestack() - ) - requested_fixture = self._format_fixturedef_line(requested_fixturedef) - fail( - f"ScopeMismatch: You tried to access the {requested_scope.value} scoped " - f"fixture {argname} with a {self._scope.value} scoped request object. " - f"Requesting fixture stack:\n{fixture_stack}\n" - f"Requested fixture:\n{requested_fixture}", - pytrace=False, - ) - - def _format_fixturedef_line(self, fixturedef: FixtureDef[object]) -> str: - factory = fixturedef.func - path, lineno = getfslineno(factory) - if isinstance(path, Path): - path = bestrelpath(self._pyfuncitem.session.path, path) - sig = signature(factory) - return f"{path}:{lineno + 1}: def {factory.__name__}{sig}" - def addfinalizer(self, finalizer: Callable[[], object]) -> None: + """Add finalizer/teardown function to be called without arguments after + the last test within the requesting test context finished execution.""" self._fixturedef.addfinalizer(finalizer) + def _schedule_finalizers( + self, fixturedef: "FixtureDef[object]", subrequest: "SubRequest" + ) -> None: + # If the executing fixturedef was not explicitly requested in the argument list (via + # getfixturevalue inside the fixture call) then ensure this fixture def will be finished + # first. + if fixturedef.argname not in self.fixturenames: + fixturedef.addfinalizer( + functools.partial(self._fixturedef.finish, request=self) + ) + super()._schedule_finalizers(fixturedef, subrequest) + @final class FixtureLookupError(LookupError): """Could not return a requested fixture (missing or invalid).""" def __init__( - self, argname: str | None, request: FixtureRequest, msg: str | None = None + self, argname: Optional[str], request: FixtureRequest, msg: Optional[str] = None ) -> None: self.argname = argname self.request = request self.fixturestack = request._get_fixturestack() self.msg = msg - def formatrepr(self) -> FixtureLookupErrorRepr: - tblines: list[str] = [] + def formatrepr(self) -> "FixtureLookupErrorRepr": + tblines: List[str] = [] addline = tblines.append stack = [self.request._pyfuncitem.obj] stack.extend(map(lambda x: x.func, self.fixturestack)) msg = self.msg - # This function currently makes an assumption that a non-None msg means we - # have a non-empty `self.fixturestack`. This is currently true, but if - # somebody at some point want to extend the use of FixtureLookupError to - # new cases it might break. - # Add the assert to make it clearer to developer that this will fail, otherwise - # it crashes because `fspath` does not get set due to `stack` being empty. - assert self.msg is None or self.fixturestack, ( - "formatrepr assumptions broken, rewrite it to handle it" - ) if msg is not None: # The last fixture raise an error, let's present # it at the requesting side. @@ -846,15 +825,14 @@ class FixtureLookupError(LookupError): if msg is None: fm = self.request._fixturemanager available = set() - parent = self.request._pyfuncitem.parent - assert parent is not None + parentid = self.request._pyfuncitem.parent.nodeid for name, fixturedefs in fm._arg2fixturedefs.items(): - faclist = list(fm._matchfactories(fixturedefs, parent)) + faclist = list(fm._matchfactories(fixturedefs, parentid)) if faclist: available.add(name) if self.argname in available: - msg = ( - f" recursive dependency involving fixture '{self.argname}' detected" + msg = " recursive dependency involving fixture '{}' detected".format( + self.argname ) else: msg = f"fixture '{self.argname}' not found" @@ -867,11 +845,11 @@ class FixtureLookupError(LookupError): class FixtureLookupErrorRepr(TerminalRepr): def __init__( self, - filename: str | os.PathLike[str], + filename: Union[str, "os.PathLike[str]"], firstlineno: int, tblines: Sequence[str], errorstring: str, - argname: str | None, + argname: Optional[str], ) -> None: self.tblines = tblines self.errorstring = errorstring @@ -895,14 +873,23 @@ class FixtureLookupErrorRepr(TerminalRepr): red=True, ) tw.line() - tw.line(f"{os.fspath(self.filename)}:{self.firstlineno + 1}") + tw.line("%s:%d" % (os.fspath(self.filename), self.firstlineno + 1)) + + +def fail_fixturefunc(fixturefunc, msg: str) -> NoReturn: + fs, lineno = getfslineno(fixturefunc) + location = f"{fs}:{lineno + 1}" + source = _pytest._code.Source(fixturefunc) + fail(msg + ":\n\n" + str(source.indent()) + "\n" + location, pytrace=False) def call_fixture_func( - fixturefunc: _FixtureFunc[FixtureValue], request: FixtureRequest, kwargs + fixturefunc: "_FixtureFunc[FixtureValue]", request: FixtureRequest, kwargs ) -> FixtureValue: - if inspect.isgeneratorfunction(fixturefunc): - fixturefunc = cast(Callable[..., Generator[FixtureValue]], fixturefunc) + if is_generator(fixturefunc): + fixturefunc = cast( + Callable[..., Generator[FixtureValue, None, None]], fixturefunc + ) generator = fixturefunc(**kwargs) try: fixture_result = next(generator) @@ -925,65 +912,58 @@ def _teardown_yield_fixture(fixturefunc, it) -> None: except StopIteration: pass else: - fs, lineno = getfslineno(fixturefunc) - fail( - f"fixture function has more than one 'yield':\n\n" - f"{Source(fixturefunc).indent()}\n" - f"{fs}:{lineno + 1}", - pytrace=False, - ) + fail_fixturefunc(fixturefunc, "fixture function has more than one 'yield'") def _eval_scope_callable( - scope_callable: Callable[[str, Config], _ScopeName], + scope_callable: "Callable[[str, Config], _ScopeName]", fixture_name: str, config: Config, -) -> _ScopeName: +) -> "_ScopeName": try: # Type ignored because there is no typing mechanism to specify # keyword arguments, currently. result = scope_callable(fixture_name=fixture_name, config=config) # type: ignore[call-arg] except Exception as e: raise TypeError( - f"Error evaluating {scope_callable} while defining fixture '{fixture_name}'.\n" - "Expected a function with the signature (*, fixture_name, config)" + "Error evaluating {} while defining fixture '{}'.\n" + "Expected a function with the signature (*, fixture_name, config)".format( + scope_callable, fixture_name + ) ) from e if not isinstance(result, str): fail( - f"Expected {scope_callable} to return a 'str' while defining fixture '{fixture_name}', but it returned:\n" - f"{result!r}", + "Expected {} to return a 'str' while defining fixture '{}', but it returned:\n" + "{!r}".format(scope_callable, fixture_name, result), pytrace=False, ) return result +@final class FixtureDef(Generic[FixtureValue]): - """A container for a fixture definition. - - Note: At this time, only explicitly documented fields and methods are - considered public stable API. - """ + """A container for a fixture definition.""" def __init__( self, - config: Config, - baseid: str | None, + fixturemanager: "FixtureManager", + baseid: Optional[str], argname: str, - func: _FixtureFunc[FixtureValue], - scope: Scope | _ScopeName | Callable[[str, Config], _ScopeName] | None, - params: Sequence[object] | None, - ids: tuple[object | None, ...] | Callable[[Any], object | None] | None = None, - *, - _ispytest: bool = False, - # only used in a deprecationwarning msg, can be removed in pytest9 - _autouse: bool = False, + func: "_FixtureFunc[FixtureValue]", + scope: Union[Scope, "_ScopeName", Callable[[str, Config], "_ScopeName"], None], + params: Optional[Sequence[object]], + unittest: bool = False, + ids: Optional[ + Union[Tuple[Optional[object], ...], Callable[[Any], Optional[object]]] + ] = None, ) -> None: - check_ispytest(_ispytest) + self._fixturemanager = fixturemanager # The "base" node ID for the fixture. # # This is a node ID prefix. A fixture is only available to a node (e.g. - # a `Function` item) if the fixture's baseid is a nodeid of a parent of - # node. + # a `Function` item) if the fixture's baseid is a parent of the node's + # nodeid (see the `iterparentnodeids` function for what constitutes a + # "parent" and a "prefix" in this context). # # For a fixture found in a Collector's object (e.g. a `Module`s module, # a `Class`'s class), the baseid is the Collector's nodeid. @@ -992,42 +972,43 @@ class FixtureDef(Generic[FixtureValue]): # directory path relative to the rootdir. # # For other plugins, the baseid is the empty string (always matches). - self.baseid: Final = baseid or "" + self.baseid = baseid or "" # Whether the fixture was found from a node or a conftest in the # collection tree. Will be false for fixtures defined in non-conftest # plugins. - self.has_location: Final = baseid is not None + self.has_location = baseid is not None # The fixture factory function. - self.func: Final = func + self.func = func # The name by which the fixture may be requested. - self.argname: Final = argname + self.argname = argname if scope is None: scope = Scope.Function elif callable(scope): - scope = _eval_scope_callable(scope, argname, config) + scope = _eval_scope_callable(scope, argname, fixturemanager.config) if isinstance(scope, str): scope = Scope.from_user( scope, descr=f"Fixture '{func.__name__}'", where=baseid ) - self._scope: Final = scope + self._scope = scope # If the fixture is directly parametrized, the parameter values. - self.params: Final = params + self.params: Optional[Sequence[object]] = params # If the fixture is directly parametrized, a tuple of explicit IDs to # assign to the parameter values, or a callable to generate an ID given # a parameter value. - self.ids: Final = ids + self.ids = ids # The names requested by the fixtures. - self.argnames: Final = getfuncargnames(func, name=argname) + self.argnames = getfuncargnames(func, name=argname, is_method=unittest) + # Whether the fixture was collected from a unittest TestCase class. + # Note that it really only makes sense to define autouse fixtures in + # unittest TestCases. + self.unittest = unittest # If the fixture was executed, the current value of the fixture. # Can change if the fixture is executed with different parameters. - self.cached_result: _FixtureCachedResult[FixtureValue] | None = None - self._finalizers: Final[list[Callable[[], object]]] = [] - - # only used to emit a deprecationwarning, can be removed in pytest9 - self._autouse = _autouse + self.cached_result: Optional[_FixtureCachedResult[FixtureValue]] = None + self._finalizers: List[Callable[[], object]] = [] @property - def scope(self) -> _ScopeName: + def scope(self) -> "_ScopeName": """Scope string, one of "function", "class", "module", "package", "session".""" return self._scope.value @@ -1035,137 +1016,92 @@ class FixtureDef(Generic[FixtureValue]): self._finalizers.append(finalizer) def finish(self, request: SubRequest) -> None: - exceptions: list[BaseException] = [] - while self._finalizers: - fin = self._finalizers.pop() - try: - fin() - except BaseException as e: - exceptions.append(e) - node = request.node - node.ihook.pytest_fixture_post_finalizer(fixturedef=self, request=request) - # Even if finalization fails, we invalidate the cached fixture - # value and remove all finalizers because they may be bound methods - # which will keep instances alive. - self.cached_result = None - self._finalizers.clear() - if len(exceptions) == 1: - raise exceptions[0] - elif len(exceptions) > 1: - msg = f'errors while tearing down fixture "{self.argname}" of {node}' - raise BaseExceptionGroup(msg, exceptions[::-1]) + exc = None + try: + while self._finalizers: + try: + func = self._finalizers.pop() + func() + except BaseException as e: + # XXX Only first exception will be seen by user, + # ideally all should be reported. + if exc is None: + exc = e + if exc: + raise exc + finally: + ihook = request.node.ihook + ihook.pytest_fixture_post_finalizer(fixturedef=self, request=request) + # Even if finalization fails, we invalidate the cached fixture + # value and remove all finalizers because they may be bound methods + # which will keep instances alive. + self.cached_result = None + self._finalizers = [] def execute(self, request: SubRequest) -> FixtureValue: - """Return the value of this fixture, executing it if not cached.""" - # Ensure that the dependent fixtures requested by this fixture are loaded. - # This needs to be done before checking if we have a cached value, since - # if a dependent fixture has their cache invalidated, e.g. due to - # parametrization, they finalize themselves and fixtures depending on it - # (which will likely include this fixture) setting `self.cached_result = None`. - # See #4871 - requested_fixtures_that_should_finalize_us = [] + # Get required arguments and register our own finish() + # with their finalization. for argname in self.argnames: fixturedef = request._get_active_fixturedef(argname) - # Saves requested fixtures in a list so we later can add our finalizer - # to them, ensuring that if a requested fixture gets torn down we get torn - # down first. This is generally handled by SetupState, but still currently - # needed when this fixture is not parametrized but depends on a parametrized - # fixture. - requested_fixtures_that_should_finalize_us.append(fixturedef) + if argname != "request": + # PseudoFixtureDef is only for "request". + assert isinstance(fixturedef, FixtureDef) + fixturedef.addfinalizer(functools.partial(self.finish, request=request)) - # Check for (and return) cached value/exception. + my_cache_key = self.cache_key(request) if self.cached_result is not None: - request_cache_key = self.cache_key(request) + # note: comparison with `==` can fail (or be expensive) for e.g. + # numpy arrays (#6497). cache_key = self.cached_result[1] - try: - # Attempt to make a normal == check: this might fail for objects - # which do not implement the standard comparison (like numpy arrays -- #6497). - cache_hit = bool(request_cache_key == cache_key) - except (ValueError, RuntimeError): - # If the comparison raises, use 'is' as fallback. - cache_hit = request_cache_key is cache_key - - if cache_hit: + if my_cache_key is cache_key: if self.cached_result[2] is not None: - exc, exc_tb = self.cached_result[2] - raise exc.with_traceback(exc_tb) + _, val, tb = self.cached_result[2] + raise val.with_traceback(tb) else: - return self.cached_result[0] + result = self.cached_result[0] + return result # We have a previous but differently parametrized fixture instance # so we need to tear it down before creating a new one. self.finish(request) assert self.cached_result is None - # Add finalizer to requested fixtures we saved previously. - # We make sure to do this after checking for cached value to avoid - # adding our finalizer multiple times. (#12135) - finalizer = functools.partial(self.finish, request=request) - for parent_fixture in requested_fixtures_that_should_finalize_us: - parent_fixture.addfinalizer(finalizer) - ihook = request.node.ihook - try: - # Setup the fixture, run the code in it, and cache the value - # in self.cached_result. - result: FixtureValue = ihook.pytest_fixture_setup( - fixturedef=self, request=request - ) - finally: - # Schedule our finalizer, even if the setup failed. - request.node.addfinalizer(finalizer) - + result = ihook.pytest_fixture_setup(fixturedef=self, request=request) return result def cache_key(self, request: SubRequest) -> object: - return getattr(request, "param", None) + return request.param_index if not hasattr(request, "param") else request.param def __repr__(self) -> str: - return f"" - - -class RequestFixtureDef(FixtureDef[FixtureRequest]): - """A custom FixtureDef for the special "request" fixture. - - A new one is generated on-demand whenever "request" is requested. - """ - - def __init__(self, request: FixtureRequest) -> None: - super().__init__( - config=request.config, - baseid=None, - argname="request", - func=lambda: request, - scope=Scope.Function, - params=None, - _ispytest=True, + return "".format( + self.argname, self.scope, self.baseid ) - self.cached_result = (request, [0], None) - - def addfinalizer(self, finalizer: Callable[[], object]) -> None: - pass def resolve_fixture_function( fixturedef: FixtureDef[FixtureValue], request: FixtureRequest -) -> _FixtureFunc[FixtureValue]: +) -> "_FixtureFunc[FixtureValue]": """Get the actual callable that can be called to obtain the fixture - value.""" + value, dealing with unittest-specific instances and bound methods.""" fixturefunc = fixturedef.func - # The fixture function needs to be bound to the actual - # request.instance so that code working with "fixturedef" behaves - # as expected. - instance = request.instance - if instance is not None: - # Handle the case where fixture is defined not in a test class, but some other class - # (for example a plugin class with a fixture), see #2270. - if hasattr(fixturefunc, "__self__") and not isinstance( - instance, - fixturefunc.__self__.__class__, - ): - return fixturefunc - fixturefunc = getimfunc(fixturedef.func) - if fixturefunc != fixturedef.func: - fixturefunc = fixturefunc.__get__(instance) + if fixturedef.unittest: + if request.instance is not None: + # Bind the unbound method to the TestCase instance. + fixturefunc = fixturedef.func.__get__(request.instance) # type: ignore[union-attr] + else: + # The fixture function needs to be bound to the actual + # request.instance so that code working with "fixturedef" behaves + # as expected. + if request.instance is not None: + # Handle the case where fixture is defined not in a test class, but some other class + # (for example a plugin class with a fixture), see #2270. + if hasattr(fixturefunc, "__self__") and not isinstance( + request.instance, fixturefunc.__self__.__class__ # type: ignore[union-attr] + ): + return fixturefunc + fixturefunc = getimfunc(fixturedef.func) + if fixturefunc != fixturedef.func: + fixturefunc = fixturefunc.__get__(request.instance) # type: ignore[union-attr] return fixturefunc @@ -1175,166 +1111,152 @@ def pytest_fixture_setup( """Execution of fixture setup.""" kwargs = {} for argname in fixturedef.argnames: - kwargs[argname] = request.getfixturevalue(argname) + fixdef = request._get_active_fixturedef(argname) + assert fixdef.cached_result is not None + result, arg_cache_key, exc = fixdef.cached_result + request._check_scope(argname, request._scope, fixdef._scope) + kwargs[argname] = result fixturefunc = resolve_fixture_function(fixturedef, request) my_cache_key = fixturedef.cache_key(request) - - if inspect.isasyncgenfunction(fixturefunc) or inspect.iscoroutinefunction( - fixturefunc - ): - auto_str = " with autouse=True" if fixturedef._autouse else "" - - warnings.warn( - PytestRemovedIn9Warning( - f"{request.node.name!r} requested an async fixture " - f"{request.fixturename!r}{auto_str}, with no plugin or hook that " - "handled it. This is usually an error, as pytest does not natively " - "support it. " - "This will turn into an error in pytest 9.\n" - "See: https://docs.pytest.org/en/stable/deprecations.html#sync-test-depending-on-async-fixture" - ), - # no stacklevel will point at users code, so we just point here - stacklevel=1, - ) - try: result = call_fixture_func(fixturefunc, request, kwargs) - except TEST_OUTCOME as e: - if isinstance(e, skip.Exception): - # The test requested a fixture which caused a skip. - # Don't show the fixture as the skip location, as then the user - # wouldn't know which test skipped. - e._use_item_location = True - fixturedef.cached_result = (None, my_cache_key, (e, e.__traceback__)) + except TEST_OUTCOME: + exc_info = sys.exc_info() + assert exc_info[0] is not None + if isinstance( + exc_info[1], skip.Exception + ) and not fixturefunc.__name__.startswith("xunit_setup"): + exc_info[1]._use_item_location = True # type: ignore[attr-defined] + fixturedef.cached_result = (None, my_cache_key, exc_info) raise fixturedef.cached_result = (result, my_cache_key, None) return result +def _ensure_immutable_ids( + ids: Optional[Union[Sequence[Optional[object]], Callable[[Any], Optional[object]]]] +) -> Optional[Union[Tuple[Optional[object], ...], Callable[[Any], Optional[object]]]]: + if ids is None: + return None + if callable(ids): + return ids + return tuple(ids) + + +def _params_converter( + params: Optional[Iterable[object]], +) -> Optional[Tuple[object, ...]]: + return tuple(params) if params is not None else None + + +def wrap_function_to_error_out_if_called_directly( + function: FixtureFunction, + fixture_marker: "FixtureFunctionMarker", +) -> FixtureFunction: + """Wrap the given fixture function so we can raise an error about it being called directly, + instead of used as an argument in a test function.""" + message = ( + 'Fixture "{name}" called directly. Fixtures are not meant to be called directly,\n' + "but are created automatically when test functions request them as parameters.\n" + "See https://docs.pytest.org/en/stable/explanation/fixtures.html for more information about fixtures, and\n" + "https://docs.pytest.org/en/stable/deprecations.html#calling-fixtures-directly about how to update your code." + ).format(name=fixture_marker.name or function.__name__) + + @functools.wraps(function) + def result(*args, **kwargs): + fail(message, pytrace=False) + + # Keep reference to the original function in our own custom attribute so we don't unwrap + # further than this point and lose useful wrappings like @mock.patch (#3774). + result.__pytest_wrapped__ = _PytestWrapper(function) # type: ignore[attr-defined] + + return cast(FixtureFunction, result) + + @final @dataclasses.dataclass(frozen=True) class FixtureFunctionMarker: - scope: _ScopeName | Callable[[str, Config], _ScopeName] - params: tuple[object, ...] | None + scope: "Union[_ScopeName, Callable[[str, Config], _ScopeName]]" + params: Optional[Tuple[object, ...]] autouse: bool = False - ids: tuple[object | None, ...] | Callable[[Any], object | None] | None = None - name: str | None = None + ids: Optional[ + Union[Tuple[Optional[object], ...], Callable[[Any], Optional[object]]] + ] = None + name: Optional[str] = None _ispytest: dataclasses.InitVar[bool] = False def __post_init__(self, _ispytest: bool) -> None: check_ispytest(_ispytest) - def __call__(self, function: FixtureFunction) -> FixtureFunctionDefinition: + def __call__(self, function: FixtureFunction) -> FixtureFunction: if inspect.isclass(function): raise ValueError("class fixtures not supported (maybe in the future)") - if isinstance(function, FixtureFunctionDefinition): + if getattr(function, "_pytestfixturefunction", False): raise ValueError( - f"@pytest.fixture is being applied more than once to the same function {function.__name__!r}" + "fixture is being applied more than once to the same function" ) - if hasattr(function, "pytestmark"): - warnings.warn(MARKED_FIXTURE, stacklevel=2) - - fixture_definition = FixtureFunctionDefinition( - function=function, fixture_function_marker=self, _ispytest=True - ) + function = wrap_function_to_error_out_if_called_directly(function, self) name = self.name or function.__name__ if name == "request": location = getlocation(function) fail( - f"'request' is a reserved word for fixtures, use another name:\n {location}", + "'request' is a reserved word for fixtures, use another name:\n {}".format( + location + ), pytrace=False, ) - return fixture_definition - - -# TODO: paramspec/return type annotation tracking and storing -class FixtureFunctionDefinition: - def __init__( - self, - *, - function: Callable[..., Any], - fixture_function_marker: FixtureFunctionMarker, - instance: object | None = None, - _ispytest: bool = False, - ) -> None: - check_ispytest(_ispytest) - self.name = fixture_function_marker.name or function.__name__ - # In order to show the function that this fixture contains in messages. - # Set the __name__ to be same as the function __name__ or the given fixture name. - self.__name__ = self.name - self._fixture_function_marker = fixture_function_marker - if instance is not None: - self._fixture_function = cast( - Callable[..., Any], function.__get__(instance) - ) - else: - self._fixture_function = function - functools.update_wrapper(self, function) - - def __repr__(self) -> str: - return f"" - - def __get__(self, instance, owner=None): - """Behave like a method if the function it was applied to was a method.""" - return FixtureFunctionDefinition( - function=self._fixture_function, - fixture_function_marker=self._fixture_function_marker, - instance=instance, - _ispytest=True, - ) - - def __call__(self, *args: Any, **kwds: Any) -> Any: - message = ( - f'Fixture "{self.name}" called directly. Fixtures are not meant to be called directly,\n' - "but are created automatically when test functions request them as parameters.\n" - "See https://docs.pytest.org/en/stable/explanation/fixtures.html for more information about fixtures, and\n" - "https://docs.pytest.org/en/stable/deprecations.html#calling-fixtures-directly" - ) - fail(message, pytrace=False) - - def _get_wrapped_function(self) -> Callable[..., Any]: - return self._fixture_function + # Type ignored because https://github.com/python/mypy/issues/2087. + function._pytestfixturefunction = self # type: ignore[attr-defined] + return function @overload def fixture( - fixture_function: Callable[..., object], + fixture_function: FixtureFunction, *, - scope: _ScopeName | Callable[[str, Config], _ScopeName] = ..., - params: Iterable[object] | None = ..., + scope: "Union[_ScopeName, Callable[[str, Config], _ScopeName]]" = ..., + params: Optional[Iterable[object]] = ..., autouse: bool = ..., - ids: Sequence[object | None] | Callable[[Any], object | None] | None = ..., - name: str | None = ..., -) -> FixtureFunctionDefinition: ... + ids: Optional[ + Union[Sequence[Optional[object]], Callable[[Any], Optional[object]]] + ] = ..., + name: Optional[str] = ..., +) -> FixtureFunction: + ... @overload -def fixture( +def fixture( # noqa: F811 fixture_function: None = ..., *, - scope: _ScopeName | Callable[[str, Config], _ScopeName] = ..., - params: Iterable[object] | None = ..., + scope: "Union[_ScopeName, Callable[[str, Config], _ScopeName]]" = ..., + params: Optional[Iterable[object]] = ..., autouse: bool = ..., - ids: Sequence[object | None] | Callable[[Any], object | None] | None = ..., - name: str | None = None, -) -> FixtureFunctionMarker: ... + ids: Optional[ + Union[Sequence[Optional[object]], Callable[[Any], Optional[object]]] + ] = ..., + name: Optional[str] = None, +) -> FixtureFunctionMarker: + ... -def fixture( - fixture_function: FixtureFunction | None = None, +def fixture( # noqa: F811 + fixture_function: Optional[FixtureFunction] = None, *, - scope: _ScopeName | Callable[[str, Config], _ScopeName] = "function", - params: Iterable[object] | None = None, + scope: "Union[_ScopeName, Callable[[str, Config], _ScopeName]]" = "function", + params: Optional[Iterable[object]] = None, autouse: bool = False, - ids: Sequence[object | None] | Callable[[Any], object | None] | None = None, - name: str | None = None, -) -> FixtureFunctionMarker | FixtureFunctionDefinition: + ids: Optional[ + Union[Sequence[Optional[object]], Callable[[Any], Optional[object]]] + ] = None, + name: Optional[str] = None, +) -> Union[FixtureFunctionMarker, FixtureFunction]: """Decorator to mark a fixture factory function. This decorator can be used, with or without parameters, to define a @@ -1435,7 +1357,7 @@ def pytestconfig(request: FixtureRequest) -> Config: Example:: def test_foo(pytestconfig): - if pytestconfig.get_verbosity() > 0: + if pytestconfig.getoption("verbose") > 0: ... """ @@ -1449,58 +1371,6 @@ def pytest_addoption(parser: Parser) -> None: default=[], help="List of default fixtures to be used with this project", ) - group = parser.getgroup("general") - group.addoption( - "--fixtures", - "--funcargs", - action="store_true", - dest="showfixtures", - default=False, - help="Show available fixtures, sorted by plugin appearance " - "(fixtures with leading '_' are only shown with '-v')", - ) - group.addoption( - "--fixtures-per-test", - action="store_true", - dest="show_fixtures_per_test", - default=False, - help="Show fixtures per test", - ) - - -def pytest_cmdline_main(config: Config) -> int | ExitCode | None: - if config.option.showfixtures: - showfixtures(config) - return 0 - if config.option.show_fixtures_per_test: - show_fixtures_per_test(config) - return 0 - return None - - -def _get_direct_parametrize_args(node: nodes.Node) -> set[str]: - """Return all direct parametrization arguments of a node, so we don't - mistake them for fixtures. - - Check https://github.com/pytest-dev/pytest/issues/5036. - - These things are done later as well when dealing with parametrization - so this could be improved. - """ - parametrize_argnames: set[str] = set() - for marker in node.iter_markers(name="parametrize"): - if not marker.kwargs.get("indirect", False): - p_argnames, _ = ParameterSet._parse_parametrize_args( - *marker.args, **marker.kwargs - ) - parametrize_argnames.update(p_argnames) - return parametrize_argnames - - -def deduplicate_names(*seqs: Iterable[str]) -> tuple[str, ...]: - """De-duplicate the sequence of names while keeping the original order.""" - # Ideally we would use a set, but it does not preserve insertion order. - return tuple(dict.fromkeys(name for seq in seqs for name in seq)) class FixtureManager: @@ -1520,7 +1390,7 @@ class FixtureManager: relevant for a particular function. An initial list of fixtures is assembled like this: - - config-defined usefixtures + - ini-defined usefixtures - autouse-marked fixtures along the collection chain up from the function - usefixtures markers at module/class/function level - test function funcargs @@ -1534,105 +1404,92 @@ class FixtureManager: by a lookup of their FuncFixtureInfo. """ - def __init__(self, session: Session) -> None: + FixtureLookupError = FixtureLookupError + FixtureLookupErrorRepr = FixtureLookupErrorRepr + + def __init__(self, session: "Session") -> None: self.session = session self.config: Config = session.config - # Maps a fixture name (argname) to all of the FixtureDefs in the test - # suite/plugins defined with this name. Populated by parsefactories(). - # TODO: The order of the FixtureDefs list of each arg is significant, - # explain. - self._arg2fixturedefs: Final[dict[str, list[FixtureDef[Any]]]] = {} - self._holderobjseen: Final[set[object]] = set() + self._arg2fixturedefs: Dict[str, List[FixtureDef[Any]]] = {} + self._holderobjseen: Set[object] = set() # A mapping from a nodeid to a list of autouse fixtures it defines. - self._nodeid_autousenames: Final[dict[str, list[str]]] = { + self._nodeid_autousenames: Dict[str, List[str]] = { "": self.config.getini("usefixtures"), } session.config.pluginmanager.register(self, "funcmanage") - def getfixtureinfo( - self, - node: nodes.Item, - func: Callable[..., object] | None, - cls: type | None, - ) -> FuncFixtureInfo: - """Calculate the :class:`FuncFixtureInfo` for an item. + def _get_direct_parametrize_args(self, node: nodes.Node) -> List[str]: + """Return all direct parametrization arguments of a node, so we don't + mistake them for fixtures. - If ``func`` is None, or if the item sets an attribute - ``nofuncargs = True``, then ``func`` is not examined at all. + Check https://github.com/pytest-dev/pytest/issues/5036. - :param node: - The item requesting the fixtures. - :param func: - The item's function. - :param cls: - If the function is a method, the method's class. + These things are done later as well when dealing with parametrization + so this could be improved. """ - if func is not None and not getattr(node, "nofuncargs", False): + parametrize_argnames: List[str] = [] + for marker in node.iter_markers(name="parametrize"): + if not marker.kwargs.get("indirect", False): + p_argnames, _ = ParameterSet._parse_parametrize_args( + *marker.args, **marker.kwargs + ) + parametrize_argnames.extend(p_argnames) + + return parametrize_argnames + + def getfixtureinfo( + self, node: nodes.Node, func, cls, funcargs: bool = True + ) -> FuncFixtureInfo: + if funcargs and not getattr(node, "nofuncargs", False): argnames = getfuncargnames(func, name=node.name, cls=cls) else: argnames = () - usefixturesnames = self._getusefixturesnames(node) - autousenames = self._getautousenames(node) - initialnames = deduplicate_names(autousenames, usefixturesnames, argnames) - direct_parametrize_args = _get_direct_parametrize_args(node) - - names_closure, arg2fixturedefs = self.getfixtureclosure( - parentnode=node, - initialnames=initialnames, - ignore_args=direct_parametrize_args, + usefixtures = tuple( + arg for mark in node.iter_markers(name="usefixtures") for arg in mark.args + ) + initialnames = usefixtures + argnames + fm = node.session._fixturemanager + initialnames, names_closure, arg2fixturedefs = fm.getfixtureclosure( + initialnames, node, ignore_args=self._get_direct_parametrize_args(node) ) - return FuncFixtureInfo(argnames, initialnames, names_closure, arg2fixturedefs) - def pytest_plugin_registered(self, plugin: _PluggyPlugin, plugin_name: str) -> None: - # Fixtures defined in conftest plugins are only visible to within the - # conftest's directory. This is unlike fixtures in non-conftest plugins - # which have global visibility. So for conftests, construct the base - # nodeid from the plugin name (which is the conftest path). - if plugin_name and plugin_name.endswith("conftest.py"): - # Note: we explicitly do *not* use `plugin.__file__` here -- The - # difference is that plugin_name has the correct capitalization on - # case-insensitive systems (Windows) and other normalization issues - # (issue #11816). - conftestpath = absolutepath(plugin_name) - try: - nodeid = str(conftestpath.parent.relative_to(self.config.rootpath)) - except ValueError: - nodeid = "" - if nodeid == ".": - nodeid = "" - if os.sep != nodes.SEP: - nodeid = nodeid.replace(os.sep, nodes.SEP) + def pytest_plugin_registered(self, plugin: _PluggyPlugin) -> None: + nodeid = None + try: + p = absolutepath(plugin.__file__) # type: ignore[attr-defined] + except AttributeError: + pass else: - nodeid = None + # Construct the base nodeid which is later used to check + # what fixtures are visible for particular tests (as denoted + # by their test id). + if p.name.startswith("conftest.py"): + try: + nodeid = str(p.parent.relative_to(self.config.rootpath)) + except ValueError: + nodeid = "" + if nodeid == ".": + nodeid = "" + if os.sep != nodes.SEP: + nodeid = nodeid.replace(os.sep, nodes.SEP) self.parsefactories(plugin, nodeid) - def _getautousenames(self, node: nodes.Node) -> Iterator[str]: - """Return the names of autouse fixtures applicable to node.""" - for parentnode in node.listchain(): - basenames = self._nodeid_autousenames.get(parentnode.nodeid) + def _getautousenames(self, nodeid: str) -> Iterator[str]: + """Return the names of autouse fixtures applicable to nodeid.""" + for parentnodeid in nodes.iterparentnodeids(nodeid): + basenames = self._nodeid_autousenames.get(parentnodeid) if basenames: yield from basenames - def _getusefixturesnames(self, node: nodes.Item) -> Iterator[str]: - """Return the names of usefixtures fixtures applicable to node.""" - for marker_node, mark in node.iter_markers_with_node(name="usefixtures"): - if not mark.args: - marker_node.warn( - PytestWarning( - f"usefixtures() in {node.nodeid} without arguments has no effect" - ) - ) - yield from mark.args - def getfixtureclosure( self, + fixturenames: Tuple[str, ...], parentnode: nodes.Node, - initialnames: tuple[str, ...], - ignore_args: AbstractSet[str], - ) -> tuple[list[str], dict[str, Sequence[FixtureDef[Any]]]]: + ignore_args: Sequence[str] = (), + ) -> Tuple[Tuple[str, ...], List[str], Dict[str, Sequence[FixtureDef[Any]]]]: # Collect the closure of all fixtures, starting with the given # fixturenames as the initial set. As we have to visit all # factory definitions anyway, we also return an arg2fixturedefs @@ -1640,47 +1497,34 @@ class FixtureManager: # to re-discover fixturedefs again for each fixturename # (discovering matching fixtures for a given name/node is expensive). - fixturenames_closure = list(initialnames) + parentid = parentnode.nodeid + fixturenames_closure = list(self._getautousenames(parentid)) - arg2fixturedefs: dict[str, Sequence[FixtureDef[Any]]] = {} + def merge(otherlist: Iterable[str]) -> None: + for arg in otherlist: + if arg not in fixturenames_closure: + fixturenames_closure.append(arg) - # Track the index for each fixture name in the simulated stack. - # Needed for handling override chains correctly, similar to _get_active_fixturedef. - # Using negative indices: -1 is the most specific (last), -2 is second to last, etc. - current_indices: dict[str, int] = {} + merge(fixturenames) - def process_argname(argname: str) -> None: - # Optimization: already processed this argname. - if current_indices.get(argname) == -1: - return + # At this point, fixturenames_closure contains what we call "initialnames", + # which is a set of fixturenames the function immediately requests. We + # need to return it as well, so save this. + initialnames = tuple(fixturenames_closure) - if argname not in fixturenames_closure: - fixturenames_closure.append(argname) - - if argname in ignore_args: - return - - fixturedefs = arg2fixturedefs.get(argname) - if not fixturedefs: - fixturedefs = self.getfixturedefs(argname, parentnode) - if not fixturedefs: - # Fixture not defined or not visible (will error during runtest). - return - arg2fixturedefs[argname] = fixturedefs - - index = current_indices.get(argname, -1) - if -index > len(fixturedefs): - # Exhausted the override chain (will error during runtest). - return - fixturedef = fixturedefs[index] - - current_indices[argname] = index - 1 - for dep in fixturedef.argnames: - process_argname(dep) - current_indices[argname] = index - - for name in initialnames: - process_argname(name) + arg2fixturedefs: Dict[str, Sequence[FixtureDef[Any]]] = {} + lastlen = -1 + while lastlen != len(fixturenames_closure): + lastlen = len(fixturenames_closure) + for argname in fixturenames_closure: + if argname in ignore_args: + continue + if argname in arg2fixturedefs: + continue + fixturedefs = self.getfixturedefs(argname, parentid) + if fixturedefs: + arg2fixturedefs[argname] = fixturedefs + merge(fixturedefs[-1].argnames) def sort_by_scope(arg_name: str) -> Scope: try: @@ -1691,9 +1535,9 @@ class FixtureManager: return fixturedefs[-1]._scope fixturenames_closure.sort(key=sort_by_scope, reverse=True) - return fixturenames_closure, arg2fixturedefs + return initialnames, fixturenames_closure, arg2fixturedefs - def pytest_generate_tests(self, metafunc: Metafunc) -> None: + def pytest_generate_tests(self, metafunc: "Metafunc") -> None: """Generate new tests based on parametrized fixtures used by the given metafunc""" def get_parametrize_mark_argnames(mark: Mark) -> Sequence[str]: @@ -1738,85 +1582,35 @@ class FixtureManager: # Try next super fixture, if any. - def pytest_collection_modifyitems(self, items: list[nodes.Item]) -> None: + def pytest_collection_modifyitems(self, items: List[nodes.Item]) -> None: # Separate parametrized setups. items[:] = reorder_items(items) - def _register_fixture( - self, - *, - name: str, - func: _FixtureFunc[object], - nodeid: str | None, - scope: Scope | _ScopeName | Callable[[str, Config], _ScopeName] = "function", - params: Sequence[object] | None = None, - ids: tuple[object | None, ...] | Callable[[Any], object | None] | None = None, - autouse: bool = False, - ) -> None: - """Register a fixture - - :param name: - The fixture's name. - :param func: - The fixture's implementation function. - :param nodeid: - The visibility of the fixture. The fixture will be available to the - node with this nodeid and its children in the collection tree. - None means that the fixture is visible to the entire collection tree, - e.g. a fixture defined for general use in a plugin. - :param scope: - The fixture's scope. - :param params: - The fixture's parametrization params. - :param ids: - The fixture's IDs. - :param autouse: - Whether this is an autouse fixture. - """ - fixture_def = FixtureDef( - config=self.config, - baseid=nodeid, - argname=name, - func=func, - scope=scope, - params=params, - ids=ids, - _ispytest=True, - _autouse=autouse, - ) - - faclist = self._arg2fixturedefs.setdefault(name, []) - if fixture_def.has_location: - faclist.append(fixture_def) - else: - # fixturedefs with no location are at the front - # so this inserts the current fixturedef after the - # existing fixturedefs from external plugins but - # before the fixturedefs provided in conftests. - i = len([f for f in faclist if not f.has_location]) - faclist.insert(i, fixture_def) - if autouse: - self._nodeid_autousenames.setdefault(nodeid or "", []).append(name) - @overload def parsefactories( self, node_or_obj: nodes.Node, + *, + unittest: bool = ..., ) -> None: raise NotImplementedError() @overload - def parsefactories( + def parsefactories( # noqa: F811 self, node_or_obj: object, - nodeid: str | None, + nodeid: Optional[str], + *, + unittest: bool = ..., ) -> None: raise NotImplementedError() - def parsefactories( + def parsefactories( # noqa: F811 self, - node_or_obj: nodes.Node | object, - nodeid: str | NotSetType | None = NOTSET, + node_or_obj: Union[nodes.Node, object], + nodeid: Union[str, NotSetType, None] = NOTSET, + *, + unittest: bool = False, ) -> None: """Collect fixtures from a collection node or object. @@ -1824,7 +1618,7 @@ class FixtureManager: If `node_or_object` is a collection node (with an underlying Python object), the node's object is traversed and the node's nodeid is used to - determine the fixtures' visibility. `nodeid` must not be specified in + determine the fixtures' visibilty. `nodeid` must not be specified in this case. If `node_or_object` is an object (e.g. a plugin), the object is @@ -1842,206 +1636,78 @@ class FixtureManager: if holderobj in self._holderobjseen: return - # Avoid accessing `@property` (and other descriptors) when iterating fixtures. - if not safe_isclass(holderobj) and not isinstance(holderobj, types.ModuleType): - holderobj_tp: object = type(holderobj) - else: - holderobj_tp = holderobj - self._holderobjseen.add(holderobj) + autousenames = [] for name in dir(holderobj): + # ugly workaround for one of the fspath deprecated property of node + # todo: safely generalize + if isinstance(holderobj, nodes.Node) and name == "fspath": + continue + # The attribute can be an arbitrary descriptor, so the attribute - # access below can raise. safe_getattr() ignores such exceptions. - obj_ub = safe_getattr(holderobj_tp, name, None) - if type(obj_ub) is FixtureFunctionDefinition: - marker = obj_ub._fixture_function_marker - if marker.name: - fixture_name = marker.name - else: - fixture_name = name + # access below can raise. safe_getatt() ignores such exceptions. + obj = safe_getattr(holderobj, name, None) + marker = getfixturemarker(obj) + if not isinstance(marker, FixtureFunctionMarker): + # Magic globals with __getattr__ might have got us a wrong + # fixture attribute. + continue - # OK we know it is a fixture -- now safe to look up on the _instance_. - try: - obj = getattr(holderobj, name) - # if the fixture is named in the decorator we cannot find it in the module - except AttributeError: - obj = obj_ub + if marker.name: + name = marker.name - func = obj._get_wrapped_function() + # During fixture definition we wrap the original fixture function + # to issue a warning if called directly, so here we unwrap it in + # order to not emit the warning when pytest itself calls the + # fixture function. + obj = get_real_method(obj, holderobj) - self._register_fixture( - name=fixture_name, - nodeid=nodeid, - func=func, - scope=marker.scope, - params=marker.params, - ids=marker.ids, - autouse=marker.autouse, - ) + fixture_def = FixtureDef( + fixturemanager=self, + baseid=nodeid, + argname=name, + func=obj, + scope=marker.scope, + params=marker.params, + unittest=unittest, + ids=marker.ids, + ) + + faclist = self._arg2fixturedefs.setdefault(name, []) + if fixture_def.has_location: + faclist.append(fixture_def) + else: + # fixturedefs with no location are at the front + # so this inserts the current fixturedef after the + # existing fixturedefs from external plugins but + # before the fixturedefs provided in conftests. + i = len([f for f in faclist if not f.has_location]) + faclist.insert(i, fixture_def) + if marker.autouse: + autousenames.append(name) + + if autousenames: + self._nodeid_autousenames.setdefault(nodeid or "", []).extend(autousenames) def getfixturedefs( - self, argname: str, node: nodes.Node - ) -> Sequence[FixtureDef[Any]] | None: - """Get FixtureDefs for a fixture name which are applicable - to a given node. + self, argname: str, nodeid: str + ) -> Optional[Sequence[FixtureDef[Any]]]: + """Get a list of fixtures which are applicable to the given node id. - Returns None if there are no fixtures at all defined with the given - name. (This is different from the case in which there are fixtures - with the given name, but none applicable to the node. In this case, - an empty result is returned). - - :param argname: Name of the fixture to search for. - :param node: The requesting Node. + :param str argname: Name of the fixture to search for. + :param str nodeid: Full node id of the requesting test. + :rtype: Sequence[FixtureDef] """ try: fixturedefs = self._arg2fixturedefs[argname] except KeyError: return None - return tuple(self._matchfactories(fixturedefs, node)) + return tuple(self._matchfactories(fixturedefs, nodeid)) def _matchfactories( - self, fixturedefs: Iterable[FixtureDef[Any]], node: nodes.Node + self, fixturedefs: Iterable[FixtureDef[Any]], nodeid: str ) -> Iterator[FixtureDef[Any]]: - parentnodeids = {n.nodeid for n in node.iter_parents()} + parentnodeids = set(nodes.iterparentnodeids(nodeid)) for fixturedef in fixturedefs: if fixturedef.baseid in parentnodeids: yield fixturedef - - -def show_fixtures_per_test(config: Config) -> int | ExitCode: - from _pytest.main import wrap_session - - return wrap_session(config, _show_fixtures_per_test) - - -_PYTEST_DIR = Path(_pytest.__file__).parent - - -def _pretty_fixture_path(invocation_dir: Path, func) -> str: - loc = Path(getlocation(func, invocation_dir)) - prefix = Path("...", "_pytest") - try: - return str(prefix / loc.relative_to(_PYTEST_DIR)) - except ValueError: - return bestrelpath(invocation_dir, loc) - - -def _show_fixtures_per_test(config: Config, session: Session) -> None: - import _pytest.config - - session.perform_collect() - invocation_dir = config.invocation_params.dir - tw = _pytest.config.create_terminal_writer(config) - verbose = config.get_verbosity() - - def get_best_relpath(func) -> str: - loc = getlocation(func, invocation_dir) - return bestrelpath(invocation_dir, Path(loc)) - - def write_fixture(fixture_def: FixtureDef[object]) -> None: - argname = fixture_def.argname - if verbose <= 0 and argname.startswith("_"): - return - prettypath = _pretty_fixture_path(invocation_dir, fixture_def.func) - tw.write(f"{argname}", green=True) - tw.write(f" -- {prettypath}", yellow=True) - tw.write("\n") - fixture_doc = inspect.getdoc(fixture_def.func) - if fixture_doc: - write_docstring( - tw, - fixture_doc.split("\n\n", maxsplit=1)[0] - if verbose <= 0 - else fixture_doc, - ) - else: - tw.line(" no docstring available", red=True) - - def write_item(item: nodes.Item) -> None: - # Not all items have _fixtureinfo attribute. - info: FuncFixtureInfo | None = getattr(item, "_fixtureinfo", None) - if info is None or not info.name2fixturedefs: - # This test item does not use any fixtures. - return - tw.line() - tw.sep("-", f"fixtures used by {item.name}") - # TODO: Fix this type ignore. - tw.sep("-", f"({get_best_relpath(item.function)})") # type: ignore[attr-defined] - # dict key not used in loop but needed for sorting. - for _, fixturedefs in sorted(info.name2fixturedefs.items()): - assert fixturedefs is not None - if not fixturedefs: - continue - # Last item is expected to be the one used by the test item. - write_fixture(fixturedefs[-1]) - - for session_item in session.items: - write_item(session_item) - - -def showfixtures(config: Config) -> int | ExitCode: - from _pytest.main import wrap_session - - return wrap_session(config, _showfixtures_main) - - -def _showfixtures_main(config: Config, session: Session) -> None: - import _pytest.config - - session.perform_collect() - invocation_dir = config.invocation_params.dir - tw = _pytest.config.create_terminal_writer(config) - verbose = config.get_verbosity() - - fm = session._fixturemanager - - available = [] - seen: set[tuple[str, str]] = set() - - for argname, fixturedefs in fm._arg2fixturedefs.items(): - assert fixturedefs is not None - if not fixturedefs: - continue - for fixturedef in fixturedefs: - loc = getlocation(fixturedef.func, invocation_dir) - if (fixturedef.argname, loc) in seen: - continue - seen.add((fixturedef.argname, loc)) - available.append( - ( - len(fixturedef.baseid), - fixturedef.func.__module__, - _pretty_fixture_path(invocation_dir, fixturedef.func), - fixturedef.argname, - fixturedef, - ) - ) - - available.sort() - currentmodule = None - for baseid, module, prettypath, argname, fixturedef in available: - if currentmodule != module: - if not module.startswith("_pytest."): - tw.line() - tw.sep("-", f"fixtures defined from {module}") - currentmodule = module - if verbose <= 0 and argname.startswith("_"): - continue - tw.write(f"{argname}", green=True) - if fixturedef.scope != "function": - tw.write(f" [{fixturedef.scope} scope]", cyan=True) - tw.write(f" -- {prettypath}", yellow=True) - tw.write("\n") - doc = inspect.getdoc(fixturedef.func) - if doc: - write_docstring( - tw, doc.split("\n\n", maxsplit=1)[0] if verbose <= 0 else doc - ) - else: - tw.line(" no docstring available", red=True) - tw.line() - - -def write_docstring(tw: TerminalWriter, doc: str, indent: str = " ") -> None: - for line in doc.split("\n"): - tw.line(indent + line) diff --git a/Backend/venv/lib/python3.12/site-packages/_pytest/freeze_support.py b/Backend/venv/lib/python3.12/site-packages/_pytest/freeze_support.py index 959ff071..9f8ea231 100644 --- a/Backend/venv/lib/python3.12/site-packages/_pytest/freeze_support.py +++ b/Backend/venv/lib/python3.12/site-packages/_pytest/freeze_support.py @@ -1,13 +1,12 @@ """Provides a function to report all internal modules for using freezing tools.""" - -from __future__ import annotations - -from collections.abc import Iterator import types +from typing import Iterator +from typing import List +from typing import Union -def freeze_includes() -> list[str]: +def freeze_includes() -> List[str]: """Return a list of module names used by pytest that should be included by cx_freeze.""" import _pytest @@ -17,7 +16,7 @@ def freeze_includes() -> list[str]: def _iter_all_modules( - package: str | types.ModuleType, + package: Union[str, types.ModuleType], prefix: str = "", ) -> Iterator[str]: """Iterate over the names of all modules that can be found in the given @@ -35,7 +34,7 @@ def _iter_all_modules( else: # Type ignored because typeshed doesn't define ModuleType.__path__ # (only defined on packages). - package_path = package.__path__ + package_path = package.__path__ # type: ignore[attr-defined] path, prefix = package_path[0], package.__name__ + "." for _, name, is_package in pkgutil.iter_modules([path]): if is_package: diff --git a/Backend/venv/lib/python3.12/site-packages/_pytest/helpconfig.py b/Backend/venv/lib/python3.12/site-packages/_pytest/helpconfig.py index 6a22c9f5..ea16c438 100644 --- a/Backend/venv/lib/python3.12/site-packages/_pytest/helpconfig.py +++ b/Backend/venv/lib/python3.12/site-packages/_pytest/helpconfig.py @@ -1,58 +1,44 @@ -# mypy: allow-untyped-defs """Version info, help messages, tracing configuration.""" - -from __future__ import annotations - -import argparse -from collections.abc import Generator -from collections.abc import Sequence import os import sys -from typing import Any +from argparse import Action +from typing import List +from typing import Optional +from typing import Union +import pytest from _pytest.config import Config from _pytest.config import ExitCode from _pytest.config import PrintHelp from _pytest.config.argparsing import Parser from _pytest.terminal import TerminalReporter -import pytest -class HelpAction(argparse.Action): - """An argparse Action that will raise a PrintHelp exception in order to skip - the rest of the argument parsing when --help is passed. +class HelpAction(Action): + """An argparse Action that will raise an exception in order to skip the + rest of the argument parsing when --help is passed. - This prevents argparse from raising UsageError when `--help` is used along - with missing required arguments when any are defined, for example by - ``pytest_addoption``. This is similar to the way that the builtin argparse - --help option is implemented by raising SystemExit. - - To opt in to this behavior, the parse caller must set - `namespace._raise_print_help = True`. Otherwise it just sets the option. + This prevents argparse from quitting due to missing required arguments + when any are defined, for example by ``pytest_addoption``. + This is similar to the way that the builtin argparse --help option is + implemented by raising SystemExit. """ - def __init__( - self, option_strings: Sequence[str], dest: str, *, help: str | None = None - ) -> None: + def __init__(self, option_strings, dest=None, default=False, help=None): super().__init__( option_strings=option_strings, dest=dest, - nargs=0, const=True, - default=False, + default=default, + nargs=0, help=help, ) - def __call__( - self, - parser: argparse.ArgumentParser, - namespace: argparse.Namespace, - values: str | Sequence[Any] | None, - option_string: str | None = None, - ) -> None: + def __call__(self, parser, namespace, values, option_string=None): setattr(namespace, self.dest, self.const) - if getattr(namespace, "_raise_print_help", False): + # We should only skip the rest of the parsing after preparse is done. + if getattr(parser._parser, "after_preparse", False): raise PrintHelp @@ -67,14 +53,14 @@ def pytest_addoption(parser: Parser) -> None: help="Display pytest version and information about plugins. " "When given twice, also display information about plugins.", ) - group._addoption( # private to use reserved lower-case short option + group._addoption( "-h", "--help", action=HelpAction, dest="help", help="Show help message and configuration info", ) - group._addoption( # private to use reserved lower-case short option + group._addoption( "-p", action="append", dest="plugins", @@ -82,14 +68,7 @@ def pytest_addoption(parser: Parser) -> None: metavar="name", help="Early-load given plugin module name or entry point (multi-allowed). " "To avoid loading of plugins, use the `no:` prefix, e.g. " - "`no:doctest`. See also --disable-plugin-autoload.", - ) - group.addoption( - "--disable-plugin-autoload", - action="store_true", - default=False, - help="Disable plugin auto-loading through entry point packaging metadata. " - "Only plugins explicitly specified in -p or env var PYTEST_PLUGINS will be loaded.", + "`no:doctest`.", ) group.addoption( "--traceconfig", @@ -109,78 +88,79 @@ def pytest_addoption(parser: Parser) -> None: "This file is opened with 'w' and truncated as a result, care advised. " "Default: pytestdebug.log.", ) - group._addoption( # private to use reserved lower-case short option + group._addoption( "-o", "--override-ini", dest="override_ini", action="append", - help='Override configuration option with "option=value" style, ' - "e.g. `-o strict_xfail=True -o cache_dir=cache`.", + help='Override ini option with "option=value" style, ' + "e.g. `-o xfail_strict=True -o cache_dir=cache`.", ) -@pytest.hookimpl(wrapper=True) -def pytest_cmdline_parse() -> Generator[None, Config, Config]: - config = yield +@pytest.hookimpl(hookwrapper=True) +def pytest_cmdline_parse(): + outcome = yield + config: Config = outcome.get_result() if config.option.debug: # --debug | --debug was provided. path = config.option.debug debugfile = open(path, "w", encoding="utf-8") debugfile.write( - "versions pytest-{}, " - "python-{}\ninvocation_dir={}\ncwd={}\nargs={}\n\n".format( + "versions pytest-%s, " + "python-%s\ncwd=%s\nargs=%s\n\n" + % ( pytest.__version__, ".".join(map(str, sys.version_info)), - config.invocation_params.dir, os.getcwd(), config.invocation_params.args, ) ) config.trace.root.setwriter(debugfile.write) undo_tracing = config.pluginmanager.enable_tracing() - sys.stderr.write(f"writing pytest debug information to {path}\n") + sys.stderr.write("writing pytest debug information to %s\n" % path) def unset_tracing() -> None: debugfile.close() - sys.stderr.write(f"wrote pytest debug information to {debugfile.name}\n") + sys.stderr.write("wrote pytest debug information to %s\n" % debugfile.name) config.trace.root.setwriter(None) undo_tracing() config.add_cleanup(unset_tracing) - return config - -def show_version_verbose(config: Config) -> None: - """Show verbose pytest version installation, including plugins.""" - sys.stdout.write( - f"This is pytest version {pytest.__version__}, imported from {pytest.__file__}\n" - ) - plugininfo = getpluginversioninfo(config) - if plugininfo: - for line in plugininfo: - sys.stdout.write(line + "\n") - - -def pytest_cmdline_main(config: Config) -> int | ExitCode | None: - # Note: a single `--version` argument is handled directly by `Config.main()` to avoid starting up the entire - # pytest infrastructure just to display the version (#13574). +def showversion(config: Config) -> None: if config.option.version > 1: - show_version_verbose(config) - return ExitCode.OK + sys.stdout.write( + "This is pytest version {}, imported from {}\n".format( + pytest.__version__, pytest.__file__ + ) + ) + plugininfo = getpluginversioninfo(config) + if plugininfo: + for line in plugininfo: + sys.stdout.write(line + "\n") + else: + sys.stdout.write(f"pytest {pytest.__version__}\n") + + +def pytest_cmdline_main(config: Config) -> Optional[Union[int, ExitCode]]: + if config.option.version > 0: + showversion(config) + return 0 elif config.option.help: config._do_configure() showhelp(config) config._ensure_unconfigure() - return ExitCode.OK + return 0 return None def showhelp(config: Config) -> None: import textwrap - reporter: TerminalReporter | None = config.pluginmanager.get_plugin( + reporter: Optional[TerminalReporter] = config.pluginmanager.get_plugin( "terminalreporter" ) assert reporter is not None @@ -188,20 +168,22 @@ def showhelp(config: Config) -> None: tw.write(config._parser.optparser.format_help()) tw.line() tw.line( - "[pytest] configuration options in the first " - "pytest.toml|pytest.ini|tox.ini|setup.cfg|pyproject.toml file found:" + "[pytest] ini-options in the first " + "pytest.ini|tox.ini|setup.cfg|pyproject.toml file found:" ) tw.line() columns = tw.fullwidth # costly call indent_len = 24 # based on argparse's max_help_position=24 indent = " " * indent_len - for name in config._parser._inidict: - help, type, _default = config._parser._inidict[name] + for name in config._parser._ininames: + help, type, default = config._parser._inidict[name] + if type is None: + type = "string" if help is None: raise TypeError(f"help argument cannot be None for {name}") spec = f"{name} ({type}):" - tw.write(f" {spec}") + tw.write(" %s" % spec) spec_len = len(spec) if spec_len > (indent_len - 3): # Display help starting at a new line. @@ -229,19 +211,10 @@ def showhelp(config: Config) -> None: tw.line() tw.line("Environment variables:") vars = [ - ( - "CI", - "When set to a non-empty value, pytest knows it is running in a " - "CI process and does not truncate summary info", - ), - ("BUILD_NUMBER", "Equivalent to CI"), ("PYTEST_ADDOPTS", "Extra command line options"), ("PYTEST_PLUGINS", "Comma-separated plugins to load during startup"), ("PYTEST_DISABLE_PLUGIN_AUTOLOAD", "Set to disable plugin auto-loading"), ("PYTEST_DEBUG", "Set to enable debug tracing of pytest's internals"), - ("PYTEST_DEBUG_TEMPROOT", "Override the system temporary directory"), - ("PYTEST_THEME", "The Pygments style to use for code output"), - ("PYTEST_THEME_MODE", "Set the PYTEST_THEME to be either 'dark' or 'light'"), ] for name, help in vars: tw.line(f" {name:<24} {help}") @@ -258,13 +231,17 @@ def showhelp(config: Config) -> None: for warningreport in reporter.stats.get("warnings", []): tw.line("warning : " + warningreport.message, red=True) + return -def getpluginversioninfo(config: Config) -> list[str]: +conftest_options = [("pytest_plugins", "list of plugin names to load")] + + +def getpluginversioninfo(config: Config) -> List[str]: lines = [] plugininfo = config.pluginmanager.list_plugin_distinfo() if plugininfo: - lines.append("registered third-party plugins:") + lines.append("setuptools registered plugins:") for plugin, dist in plugininfo: loc = getattr(plugin, "__file__", repr(plugin)) content = f"{dist.project_name}-{dist.version} at {loc}" @@ -272,7 +249,7 @@ def getpluginversioninfo(config: Config) -> list[str]: return lines -def pytest_report_header(config: Config) -> list[str]: +def pytest_report_header(config: Config) -> List[str]: lines = [] if config.option.debug or config.option.traceconfig: lines.append(f"using: pytest-{pytest.__version__}") diff --git a/Backend/venv/lib/python3.12/site-packages/_pytest/hookspec.py b/Backend/venv/lib/python3.12/site-packages/_pytest/hookspec.py index c5bcc36a..1f7c368f 100644 --- a/Backend/venv/lib/python3.12/site-packages/_pytest/hookspec.py +++ b/Backend/venv/lib/python3.12/site-packages/_pytest/hookspec.py @@ -1,33 +1,31 @@ -# mypy: allow-untyped-defs -# ruff: noqa: T100 """Hook specifications for pytest plugins which are invoked by pytest itself and by builtin plugins.""" - -from __future__ import annotations - -from collections.abc import Mapping -from collections.abc import Sequence from pathlib import Path from typing import Any +from typing import Dict +from typing import List +from typing import Mapping +from typing import Optional +from typing import Sequence +from typing import Tuple from typing import TYPE_CHECKING +from typing import Union from pluggy import HookspecMarker -from .deprecated import HOOK_LEGACY_PATH_ARG - +from _pytest.deprecated import WARNING_CMDLINE_PREPARSE_HOOK if TYPE_CHECKING: import pdb - from typing import Literal import warnings + from typing_extensions import Literal - from _pytest._code.code import ExceptionInfo from _pytest._code.code import ExceptionRepr - from _pytest.compat import LEGACY_PATH - from _pytest.config import _PluggyPlugin + from _pytest._code.code import ExceptionInfo from _pytest.config import Config from _pytest.config import ExitCode from _pytest.config import PytestPluginManager + from _pytest.config import _PluggyPlugin from _pytest.config.argparsing import Parser from _pytest.fixtures import FixtureDef from _pytest.fixtures import SubRequest @@ -44,6 +42,7 @@ if TYPE_CHECKING: from _pytest.runner import CallInfo from _pytest.terminal import TerminalReporter from _pytest.terminal import TestShortLogReport + from _pytest.compat import LEGACY_PATH hookspec = HookspecMarker("pytest") @@ -54,62 +53,51 @@ hookspec = HookspecMarker("pytest") @hookspec(historic=True) -def pytest_addhooks(pluginmanager: PytestPluginManager) -> None: +def pytest_addhooks(pluginmanager: "PytestPluginManager") -> None: """Called at plugin registration time to allow adding new hooks via a call to - :func:`pluginmanager.add_hookspecs(module_or_class, prefix) `. + ``pluginmanager.add_hookspecs(module_or_class, prefix)``. - :param pluginmanager: The pytest plugin manager. + :param pytest.PytestPluginManager pluginmanager: The pytest plugin manager. .. note:: - This hook is incompatible with hook wrappers. - - Use in conftest plugins - ======================= - - If a conftest plugin implements this hook, it will be called immediately - when the conftest is registered. + This hook is incompatible with ``hookwrapper=True``. """ @hookspec(historic=True) def pytest_plugin_registered( - plugin: _PluggyPlugin, - plugin_name: str, - manager: PytestPluginManager, + plugin: "_PluggyPlugin", manager: "PytestPluginManager" ) -> None: """A new pytest plugin got registered. :param plugin: The plugin module or instance. - :param plugin_name: The name by which the plugin is registered. - :param manager: The pytest plugin manager. + :param pytest.PytestPluginManager manager: pytest plugin manager. .. note:: - This hook is incompatible with hook wrappers. - - Use in conftest plugins - ======================= - - If a conftest plugin implements this hook, it will be called immediately - when the conftest is registered, once for each plugin registered thus far - (including itself!), and for all plugins thereafter when they are - registered. + This hook is incompatible with ``hookwrapper=True``. """ @hookspec(historic=True) -def pytest_addoption(parser: Parser, pluginmanager: PytestPluginManager) -> None: - """Register argparse-style options and config-style config values, +def pytest_addoption(parser: "Parser", pluginmanager: "PytestPluginManager") -> None: + """Register argparse-style options and ini-style config values, called once at the beginning of a test run. - :param parser: + .. note:: + + This function should be implemented only in plugins or ``conftest.py`` + files situated at the tests root directory due to how pytest + :ref:`discovers plugins during startup `. + + :param pytest.Parser parser: To add command line options, call :py:func:`parser.addoption(...) `. - To add config-file values call :py:func:`parser.addini(...) + To add ini-file values call :py:func:`parser.addini(...) `. - :param pluginmanager: - The pytest plugin manager, which can be used to install :py:func:`~pytest.hookspec`'s - or :py:func:`~pytest.hookimpl`'s and allow one plugin to call another plugin's hooks + :param pytest.PytestPluginManager pluginmanager: + The pytest plugin manager, which can be used to install :py:func:`hookspec`'s + or :py:func:`hookimpl`'s and allow one plugin to call another plugin's hooks to change how command line options are added. Options can later be accessed through the @@ -119,39 +107,30 @@ def pytest_addoption(parser: Parser, pluginmanager: PytestPluginManager) -> None retrieve the value of a command line option. - :py:func:`config.getini(name) ` to retrieve - a value read from a configuration file. + a value read from an ini-style file. The config object is passed around on many internal objects via the ``.config`` attribute or can be retrieved as the ``pytestconfig`` fixture. .. note:: - This hook is incompatible with hook wrappers. - - Use in conftest plugins - ======================= - - If a conftest plugin implements this hook, it will be called immediately - when the conftest is registered. - - This hook is only called for :ref:`initial conftests `. + This hook is incompatible with ``hookwrapper=True``. """ @hookspec(historic=True) -def pytest_configure(config: Config) -> None: +def pytest_configure(config: "Config") -> None: """Allow plugins and conftest files to perform initial configuration. + This hook is called for every plugin and initial conftest file + after command line options have been parsed. + + After that, the hook is called for other conftest files as they are + imported. + .. note:: - This hook is incompatible with hook wrappers. + This hook is incompatible with ``hookwrapper=True``. - :param config: The pytest config object. - - Use in conftest plugins - ======================= - - This hook is called for every :ref:`initial conftest ` file - after command line options have been parsed. After that, the hook is called - for other conftest files as they are registered. + :param pytest.Config config: The pytest config object. """ @@ -163,61 +142,62 @@ def pytest_configure(config: Config) -> None: @hookspec(firstresult=True) def pytest_cmdline_parse( - pluginmanager: PytestPluginManager, args: list[str] -) -> Config | None: + pluginmanager: "PytestPluginManager", args: List[str] +) -> Optional["Config"]: """Return an initialized :class:`~pytest.Config`, parsing the specified args. Stops at first non-None result, see :ref:`firstresult`. .. note:: - This hook is only called for plugin classes passed to the + This hook will only be called for plugin classes passed to the ``plugins`` arg when using `pytest.main`_ to perform an in-process test run. :param pluginmanager: The pytest plugin manager. :param args: List of arguments passed on the command line. :returns: A pytest config object. - - Use in conftest plugins - ======================= - - This hook is not called for conftest files. """ -def pytest_load_initial_conftests( - early_config: Config, parser: Parser, args: list[str] -) -> None: - """Called to implement the loading of :ref:`initial conftest files - ` ahead of command line option parsing. +@hookspec(warn_on_impl=WARNING_CMDLINE_PREPARSE_HOOK) +def pytest_cmdline_preparse(config: "Config", args: List[str]) -> None: + """(**Deprecated**) modify command line arguments before option parsing. - :param early_config: The pytest config object. + This hook is considered deprecated and will be removed in a future pytest version. Consider + using :hook:`pytest_load_initial_conftests` instead. + + .. note:: + This hook will not be called for ``conftest.py`` files, only for setuptools plugins. + + :param config: The pytest config object. :param args: Arguments passed on the command line. - :param parser: To add command line options. - - Use in conftest plugins - ======================= - - This hook is not called for conftest files. """ @hookspec(firstresult=True) -def pytest_cmdline_main(config: Config) -> ExitCode | int | None: - """Called for performing the main command line action. - - The default implementation will invoke the configure hooks and - :hook:`pytest_runtestloop`. +def pytest_cmdline_main(config: "Config") -> Optional[Union["ExitCode", int]]: + """Called for performing the main command line action. The default + implementation will invoke the configure hooks and runtest_mainloop. Stops at first non-None result, see :ref:`firstresult`. :param config: The pytest config object. :returns: The exit code. + """ - Use in conftest plugins - ======================= - This hook is only called for :ref:`initial conftests `. +def pytest_load_initial_conftests( + early_config: "Config", parser: "Parser", args: List[str] +) -> None: + """Called to implement the loading of initial conftest files ahead + of command line option parsing. + + .. note:: + This hook will not be called for ``conftest.py`` files, only for setuptools plugins. + + :param early_config: The pytest config object. + :param args: Arguments passed on the command line. + :param parser: To add command line options. """ @@ -227,7 +207,7 @@ def pytest_cmdline_main(config: Config) -> ExitCode | int | None: @hookspec(firstresult=True) -def pytest_collection(session: Session) -> object | None: +def pytest_collection(session: "Session") -> Optional[object]: """Perform the collection phase for the given session. Stops at first non-None result, see :ref:`firstresult`. @@ -260,65 +240,33 @@ def pytest_collection(session: Session) -> object | None: counter (and returns `None`). :param session: The pytest session object. - - Use in conftest plugins - ======================= - - This hook is only called for :ref:`initial conftests `. """ def pytest_collection_modifyitems( - session: Session, config: Config, items: list[Item] + session: "Session", config: "Config", items: List["Item"] ) -> None: """Called after collection has been performed. May filter or re-order the items in-place. - When items are deselected (filtered out from ``items``), - the hook :hook:`pytest_deselected` must be called explicitly - with the deselected items to properly notify other plugins, - e.g. with ``config.hook.pytest_deselected(items=deselected_items)``. - :param session: The pytest session object. :param config: The pytest config object. :param items: List of item objects. - - Use in conftest plugins - ======================= - - Any conftest plugin can implement this hook. """ -def pytest_collection_finish(session: Session) -> None: +def pytest_collection_finish(session: "Session") -> None: """Called after collection has been performed and modified. :param session: The pytest session object. - - Use in conftest plugins - ======================= - - Any conftest plugin can implement this hook. """ -@hookspec( - firstresult=True, - warn_on_impl_args={ - "path": HOOK_LEGACY_PATH_ARG.format( - pylib_path_arg="path", pathlib_path_arg="collection_path" - ), - }, -) +@hookspec(firstresult=True) def pytest_ignore_collect( - collection_path: Path, path: LEGACY_PATH, config: Config -) -> bool | None: - """Return ``True`` to ignore this path for collection. - - Return ``None`` to let other plugins ignore the path for collection. - - Returning ``False`` will forcefully *not* ignore this path for collection, - without giving a chance for other plugins to ignore this path. + collection_path: Path, path: "LEGACY_PATH", config: "Config" +) -> Optional[bool]: + """Return True to prevent considering this path for collection. This hook is consulted for all files and directories prior to calling more specific hooks. @@ -326,7 +274,6 @@ def pytest_ignore_collect( Stops at first non-None result, see :ref:`firstresult`. :param collection_path: The path to analyze. - :type collection_path: pathlib.Path :param path: The path to analyze (deprecated). :param config: The pytest config object. @@ -334,151 +281,65 @@ def pytest_ignore_collect( The ``collection_path`` parameter was added as a :class:`pathlib.Path` equivalent of the ``path`` parameter. The ``path`` parameter has been deprecated. - - Use in conftest plugins - ======================= - - Any conftest file can implement this hook. For a given collection path, only - conftest files in parent directories of the collection path are consulted - (if the path is a directory, its own conftest file is *not* consulted - a - directory cannot ignore itself!). """ -@hookspec(firstresult=True) -def pytest_collect_directory(path: Path, parent: Collector) -> Collector | None: - """Create a :class:`~pytest.Collector` for the given directory, or None if - not relevant. - - .. versionadded:: 8.0 - - For best results, the returned collector should be a subclass of - :class:`~pytest.Directory`, but this is not required. - - The new node needs to have the specified ``parent`` as a parent. - - Stops at first non-None result, see :ref:`firstresult`. - - :param path: The path to analyze. - :type path: pathlib.Path - - See :ref:`custom directory collectors` for a simple example of use of this - hook. - - Use in conftest plugins - ======================= - - Any conftest file can implement this hook. For a given collection path, only - conftest files in parent directories of the collection path are consulted - (if the path is a directory, its own conftest file is *not* consulted - a - directory cannot collect itself!). - """ - - -@hookspec( - warn_on_impl_args={ - "path": HOOK_LEGACY_PATH_ARG.format( - pylib_path_arg="path", pathlib_path_arg="file_path" - ), - }, -) def pytest_collect_file( - file_path: Path, path: LEGACY_PATH, parent: Collector -) -> Collector | None: + file_path: Path, path: "LEGACY_PATH", parent: "Collector" +) -> "Optional[Collector]": """Create a :class:`~pytest.Collector` for the given path, or None if not relevant. - For best results, the returned collector should be a subclass of - :class:`~pytest.File`, but this is not required. - The new node needs to have the specified ``parent`` as a parent. :param file_path: The path to analyze. - :type file_path: pathlib.Path :param path: The path to collect (deprecated). .. versionchanged:: 7.0.0 The ``file_path`` parameter was added as a :class:`pathlib.Path` equivalent of the ``path`` parameter. The ``path`` parameter has been deprecated. - - Use in conftest plugins - ======================= - - Any conftest file can implement this hook. For a given file path, only - conftest files in parent directories of the file path are consulted. """ # logging hooks for collection -def pytest_collectstart(collector: Collector) -> None: +def pytest_collectstart(collector: "Collector") -> None: """Collector starts collecting. :param collector: The collector. - - Use in conftest plugins - ======================= - - Any conftest file can implement this hook. For a given collector, only - conftest files in the collector's directory and its parent directories are - consulted. """ -def pytest_itemcollected(item: Item) -> None: +def pytest_itemcollected(item: "Item") -> None: """We just collected a test item. :param item: The item. - - Use in conftest plugins - ======================= - - Any conftest file can implement this hook. For a given item, only conftest - files in the item's directory and its parent directories are consulted. """ -def pytest_collectreport(report: CollectReport) -> None: +def pytest_collectreport(report: "CollectReport") -> None: """Collector finished collecting. :param report: The collect report. - - Use in conftest plugins - ======================= - - Any conftest file can implement this hook. For a given collector, only - conftest files in the collector's directory and its parent directories are - consulted. """ -def pytest_deselected(items: Sequence[Item]) -> None: +def pytest_deselected(items: Sequence["Item"]) -> None: """Called for deselected test items, e.g. by keyword. - Note that this hook has two integration aspects for plugins: - - - it can be *implemented* to be notified of deselected items - - it must be *called* from :hook:`pytest_collection_modifyitems` - implementations when items are deselected (to properly notify other plugins). - May be called multiple times. :param items: The items. - - Use in conftest plugins - ======================= - - Any conftest file can implement this hook. """ @hookspec(firstresult=True) -def pytest_make_collect_report(collector: Collector) -> CollectReport | None: +def pytest_make_collect_report(collector: "Collector") -> "Optional[CollectReport]": """Perform :func:`collector.collect() ` and return a :class:`~pytest.CollectReport`. @@ -486,13 +347,6 @@ def pytest_make_collect_report(collector: Collector) -> CollectReport | None: :param collector: The collector. - - Use in conftest plugins - ======================= - - Any conftest file can implement this hook. For a given collector, only - conftest files in the collector's directory and its parent directories are - consulted. """ @@ -501,17 +355,10 @@ def pytest_make_collect_report(collector: Collector) -> CollectReport | None: # ------------------------------------------------------------------------- -@hookspec( - firstresult=True, - warn_on_impl_args={ - "path": HOOK_LEGACY_PATH_ARG.format( - pylib_path_arg="path", pathlib_path_arg="module_path" - ), - }, -) +@hookspec(firstresult=True) def pytest_pycollect_makemodule( - module_path: Path, path: LEGACY_PATH, parent -) -> Module | None: + module_path: Path, path: "LEGACY_PATH", parent +) -> Optional["Module"]: """Return a :class:`pytest.Module` collector or None for the given path. This hook will be called for each matching test module path. @@ -521,7 +368,6 @@ def pytest_pycollect_makemodule( Stops at first non-None result, see :ref:`firstresult`. :param module_path: The path of the module to collect. - :type module_path: pathlib.Path :param path: The path of the module to collect (deprecated). .. versionchanged:: 7.0.0 @@ -529,20 +375,13 @@ def pytest_pycollect_makemodule( equivalent of the ``path`` parameter. The ``path`` parameter has been deprecated in favor of ``fspath``. - - Use in conftest plugins - ======================= - - Any conftest file can implement this hook. For a given parent collector, - only conftest files in the collector's directory and its parent directories - are consulted. """ @hookspec(firstresult=True) def pytest_pycollect_makeitem( - collector: Module | Class, name: str, obj: object -) -> None | Item | Collector | list[Item | Collector]: + collector: Union["Module", "Class"], name: str, obj: object +) -> Union[None, "Item", "Collector", List[Union["Item", "Collector"]]]: """Return a custom item/collector for a Python object in a module, or None. Stops at first non-None result, see :ref:`firstresult`. @@ -555,51 +394,32 @@ def pytest_pycollect_makeitem( The object. :returns: The created items/collectors. - - Use in conftest plugins - ======================= - - Any conftest file can implement this hook. For a given collector, only - conftest files in the collector's directory and its parent directories - are consulted. """ @hookspec(firstresult=True) -def pytest_pyfunc_call(pyfuncitem: Function) -> object | None: +def pytest_pyfunc_call(pyfuncitem: "Function") -> Optional[object]: """Call underlying test function. Stops at first non-None result, see :ref:`firstresult`. :param pyfuncitem: The function item. - - Use in conftest plugins - ======================= - - Any conftest file can implement this hook. For a given item, only - conftest files in the item's directory and its parent directories - are consulted. """ -def pytest_generate_tests(metafunc: Metafunc) -> None: +def pytest_generate_tests(metafunc: "Metafunc") -> None: """Generate (multiple) parametrized calls to a test function. :param metafunc: The :class:`~pytest.Metafunc` helper for the test function. - - Use in conftest plugins - ======================= - - Any conftest file can implement this hook. For a given function definition, - only conftest files in the functions's directory and its parent directories - are consulted. """ @hookspec(firstresult=True) -def pytest_make_parametrize_id(config: Config, val: object, argname: str) -> str | None: +def pytest_make_parametrize_id( + config: "Config", val: object, argname: str +) -> Optional[str]: """Return a user-friendly string representation of the given ``val`` that will be used by @pytest.mark.parametrize calls, or None if the hook doesn't know about ``val``. @@ -610,12 +430,7 @@ def pytest_make_parametrize_id(config: Config, val: object, argname: str) -> str :param config: The pytest config object. :param val: The parametrized value. - :param argname: The automatic parameter name produced by pytest. - - Use in conftest plugins - ======================= - - Any conftest file can implement this hook. + :param str argname: The automatic parameter name produced by pytest. """ @@ -625,7 +440,7 @@ def pytest_make_parametrize_id(config: Config, val: object, argname: str) -> str @hookspec(firstresult=True) -def pytest_runtestloop(session: Session) -> object | None: +def pytest_runtestloop(session: "Session") -> Optional[object]: """Perform the main runtest loop (after collection finished). The default hook implementation performs the runtest protocol for all items @@ -642,16 +457,13 @@ def pytest_runtestloop(session: Session) -> object | None: Stops at first non-None result, see :ref:`firstresult`. The return value is not used, but only stops further processing. - - Use in conftest plugins - ======================= - - Any conftest file can implement this hook. """ @hookspec(firstresult=True) -def pytest_runtest_protocol(item: Item, nextitem: Item | None) -> object | None: +def pytest_runtest_protocol( + item: "Item", nextitem: "Optional[Item]" +) -> Optional[object]: """Perform the runtest protocol for a single test item. The default runtest protocol is this (see individual hooks for full details): @@ -664,7 +476,7 @@ def pytest_runtest_protocol(item: Item, nextitem: Item | None) -> object | None: - ``pytest_runtest_logreport(report)`` - ``pytest_exception_interact(call, report)`` if an interactive exception occurred - - Call phase, if the setup passed and the ``setuponly`` pytest option is not set: + - Call phase, if the the setup passed and the ``setuponly`` pytest option is not set: - ``call = pytest_runtest_call(item)`` (wrapped in ``CallInfo(when="call")``) - ``report = pytest_runtest_makereport(item, call)`` - ``pytest_runtest_logreport(report)`` @@ -683,15 +495,12 @@ def pytest_runtest_protocol(item: Item, nextitem: Item | None) -> object | None: Stops at first non-None result, see :ref:`firstresult`. The return value is not used, but only stops further processing. - - Use in conftest plugins - ======================= - - Any conftest file can implement this hook. """ -def pytest_runtest_logstart(nodeid: str, location: tuple[str, int | None, str]) -> None: +def pytest_runtest_logstart( + nodeid: str, location: Tuple[str, Optional[int], str] +) -> None: """Called at the start of running the runtest protocol for a single item. See :hook:`pytest_runtest_protocol` for a description of the runtest protocol. @@ -700,17 +509,11 @@ def pytest_runtest_logstart(nodeid: str, location: tuple[str, int | None, str]) :param location: A tuple of ``(filename, lineno, testname)`` where ``filename`` is a file path relative to ``config.rootpath`` and ``lineno`` is 0-based. - - Use in conftest plugins - ======================= - - Any conftest file can implement this hook. For a given item, only conftest - files in the item's directory and its parent directories are consulted. """ def pytest_runtest_logfinish( - nodeid: str, location: tuple[str, int | None, str] + nodeid: str, location: Tuple[str, Optional[int], str] ) -> None: """Called at the end of running the runtest protocol for a single item. @@ -720,16 +523,10 @@ def pytest_runtest_logfinish( :param location: A tuple of ``(filename, lineno, testname)`` where ``filename`` is a file path relative to ``config.rootpath`` and ``lineno`` is 0-based. - - Use in conftest plugins - ======================= - - Any conftest file can implement this hook. For a given item, only conftest - files in the item's directory and its parent directories are consulted. """ -def pytest_runtest_setup(item: Item) -> None: +def pytest_runtest_setup(item: "Item") -> None: """Called to perform the setup phase for a test item. The default implementation runs ``setup()`` on ``item`` and all of its @@ -739,32 +536,20 @@ def pytest_runtest_setup(item: Item) -> None: :param item: The item. - - Use in conftest plugins - ======================= - - Any conftest file can implement this hook. For a given item, only conftest - files in the item's directory and its parent directories are consulted. """ -def pytest_runtest_call(item: Item) -> None: +def pytest_runtest_call(item: "Item") -> None: """Called to run the test for test item (the call phase). The default implementation calls ``item.runtest()``. :param item: The item. - - Use in conftest plugins - ======================= - - Any conftest file can implement this hook. For a given item, only conftest - files in the item's directory and its parent directories are consulted. """ -def pytest_runtest_teardown(item: Item, nextitem: Item | None) -> None: +def pytest_runtest_teardown(item: "Item", nextitem: Optional["Item"]) -> None: """Called to perform the teardown phase for a test item. The default implementation runs the finalizers and calls ``teardown()`` @@ -779,17 +564,13 @@ def pytest_runtest_teardown(item: Item, nextitem: Item | None) -> None: scheduled). This argument is used to perform exact teardowns, i.e. calling just enough finalizers so that nextitem only needs to call setup functions. - - Use in conftest plugins - ======================= - - Any conftest file can implement this hook. For a given item, only conftest - files in the item's directory and its parent directories are consulted. """ @hookspec(firstresult=True) -def pytest_runtest_makereport(item: Item, call: CallInfo[None]) -> TestReport | None: +def pytest_runtest_makereport( + item: "Item", call: "CallInfo[None]" +) -> Optional["TestReport"]: """Called to create a :class:`~pytest.TestReport` for each of the setup, call and teardown runtest phases of a test item. @@ -799,63 +580,39 @@ def pytest_runtest_makereport(item: Item, call: CallInfo[None]) -> TestReport | :param call: The :class:`~pytest.CallInfo` for the phase. Stops at first non-None result, see :ref:`firstresult`. - - Use in conftest plugins - ======================= - - Any conftest file can implement this hook. For a given item, only conftest - files in the item's directory and its parent directories are consulted. """ -def pytest_runtest_logreport(report: TestReport) -> None: +def pytest_runtest_logreport(report: "TestReport") -> None: """Process the :class:`~pytest.TestReport` produced for each of the setup, call and teardown runtest phases of an item. See :hook:`pytest_runtest_protocol` for a description of the runtest protocol. - - Use in conftest plugins - ======================= - - Any conftest file can implement this hook. For a given item, only conftest - files in the item's directory and its parent directories are consulted. """ @hookspec(firstresult=True) def pytest_report_to_serializable( - config: Config, - report: CollectReport | TestReport, -) -> dict[str, Any] | None: + config: "Config", + report: Union["CollectReport", "TestReport"], +) -> Optional[Dict[str, Any]]: """Serialize the given report object into a data structure suitable for sending over the wire, e.g. converted to JSON. :param config: The pytest config object. :param report: The report. - - Use in conftest plugins - ======================= - - Any conftest file can implement this hook. The exact details may depend - on the plugin which calls the hook. """ @hookspec(firstresult=True) def pytest_report_from_serializable( - config: Config, - data: dict[str, Any], -) -> CollectReport | TestReport | None: + config: "Config", + data: Dict[str, Any], +) -> Optional[Union["CollectReport", "TestReport"]]: """Restore a report object previously serialized with :hook:`pytest_report_to_serializable`. :param config: The pytest config object. - - Use in conftest plugins - ======================= - - Any conftest file can implement this hook. The exact details may depend - on the plugin which calls the hook. """ @@ -866,11 +623,11 @@ def pytest_report_from_serializable( @hookspec(firstresult=True) def pytest_fixture_setup( - fixturedef: FixtureDef[Any], request: SubRequest -) -> object | None: + fixturedef: "FixtureDef[Any]", request: "SubRequest" +) -> Optional[object]: """Perform fixture setup execution. - :param fixturedef: + :param fixturdef: The fixture definition object. :param request: The fixture request object. @@ -883,34 +640,20 @@ def pytest_fixture_setup( If the fixture function returns None, other implementations of this hook function will continue to be called, according to the behavior of the :ref:`firstresult` option. - - Use in conftest plugins - ======================= - - Any conftest file can implement this hook. For a given fixture, only - conftest files in the fixture scope's directory and its parent directories - are consulted. """ def pytest_fixture_post_finalizer( - fixturedef: FixtureDef[Any], request: SubRequest + fixturedef: "FixtureDef[Any]", request: "SubRequest" ) -> None: """Called after fixture teardown, but before the cache is cleared, so the fixture result ``fixturedef.cached_result`` is still available (not ``None``). - :param fixturedef: + :param fixturdef: The fixture definition object. :param request: The fixture request object. - - Use in conftest plugins - ======================= - - Any conftest file can implement this hook. For a given fixture, only - conftest files in the fixture scope's directory and its parent directories - are consulted. """ @@ -919,44 +662,29 @@ def pytest_fixture_post_finalizer( # ------------------------------------------------------------------------- -def pytest_sessionstart(session: Session) -> None: +def pytest_sessionstart(session: "Session") -> None: """Called after the ``Session`` object has been created and before performing collection and entering the run test loop. :param session: The pytest session object. - - Use in conftest plugins - ======================= - - This hook is only called for :ref:`initial conftests `. """ def pytest_sessionfinish( - session: Session, - exitstatus: int | ExitCode, + session: "Session", + exitstatus: Union[int, "ExitCode"], ) -> None: """Called after whole test run finished, right before returning the exit status to the system. :param session: The pytest session object. :param exitstatus: The status which pytest will return to the system. - - Use in conftest plugins - ======================= - - Any conftest file can implement this hook. """ -def pytest_unconfigure(config: Config) -> None: +def pytest_unconfigure(config: "Config") -> None: """Called before test process is exited. :param config: The pytest config object. - - Use in conftest plugins - ======================= - - Any conftest file can implement this hook. """ @@ -966,8 +694,8 @@ def pytest_unconfigure(config: Config) -> None: def pytest_assertrepr_compare( - config: Config, op: str, left: object, right: object -) -> list[str] | None: + config: "Config", op: str, left: object, right: object +) -> Optional[List[str]]: """Return explanation for comparisons in failing assert expressions. Return None for no custom explanation, otherwise return a list @@ -979,16 +707,10 @@ def pytest_assertrepr_compare( :param op: The operator, e.g. `"=="`, `"!="`, `"not in"`. :param left: The left operand. :param right: The right operand. - - Use in conftest plugins - ======================= - - Any conftest file can implement this hook. For a given item, only conftest - files in the item's directory and its parent directories are consulted. """ -def pytest_assertion_pass(item: Item, lineno: int, orig: str, expl: str) -> None: +def pytest_assertion_pass(item: "Item", lineno: int, orig: str, expl: str) -> None: """Called whenever an assertion passes. .. versionadded:: 5.0 @@ -998,22 +720,13 @@ def pytest_assertion_pass(item: Item, lineno: int, orig: str, expl: str) -> None and the pytest introspected assertion information is available in the `expl` string. - This hook must be explicitly enabled by the :confval:`enable_assertion_pass_hook` - configuration option: + This hook must be explicitly enabled by the ``enable_assertion_pass_hook`` + ini-file option: - .. tab:: toml + .. code-block:: ini - .. code-block:: toml - - [pytest] - enable_assertion_pass_hook = true - - .. tab:: ini - - .. code-block:: ini - - [pytest] - enable_assertion_pass_hook = true + [pytest] + enable_assertion_pass_hook=true You need to **clean the .pyc** files in your project directory and interpreter libraries when enabling this option, as assertions will require to be re-written. @@ -1022,12 +735,6 @@ def pytest_assertion_pass(item: Item, lineno: int, orig: str, expl: str) -> None :param lineno: Line number of the assert statement. :param orig: String with the original assertion. :param expl: String with the assert explanation. - - Use in conftest plugins - ======================= - - Any conftest file can implement this hook. For a given item, only conftest - files in the item's directory and its parent directories are consulted. """ @@ -1036,21 +743,13 @@ def pytest_assertion_pass(item: Item, lineno: int, orig: str, expl: str) -> None # ------------------------------------------------------------------------- -@hookspec( - warn_on_impl_args={ - "startdir": HOOK_LEGACY_PATH_ARG.format( - pylib_path_arg="startdir", pathlib_path_arg="start_path" - ), - }, -) def pytest_report_header( # type:ignore[empty-body] - config: Config, start_path: Path, startdir: LEGACY_PATH -) -> str | list[str]: + config: "Config", start_path: Path, startdir: "LEGACY_PATH" +) -> Union[str, List[str]]: """Return a string or list of strings to be displayed as header info for terminal reporting. :param config: The pytest config object. :param start_path: The starting dir. - :type start_path: pathlib.Path :param startdir: The starting dir (deprecated). .. note:: @@ -1060,31 +759,25 @@ def pytest_report_header( # type:ignore[empty-body] If you want to have your line(s) displayed first, use :ref:`trylast=True `. + .. note:: + + This function should be implemented only in plugins or ``conftest.py`` + files situated at the tests root directory due to how pytest + :ref:`discovers plugins during startup `. + .. versionchanged:: 7.0.0 The ``start_path`` parameter was added as a :class:`pathlib.Path` equivalent of the ``startdir`` parameter. The ``startdir`` parameter has been deprecated. - - Use in conftest plugins - ======================= - - This hook is only called for :ref:`initial conftests `. """ -@hookspec( - warn_on_impl_args={ - "startdir": HOOK_LEGACY_PATH_ARG.format( - pylib_path_arg="startdir", pathlib_path_arg="start_path" - ), - }, -) def pytest_report_collectionfinish( # type:ignore[empty-body] - config: Config, + config: "Config", start_path: Path, - startdir: LEGACY_PATH, - items: Sequence[Item], -) -> str | list[str]: + startdir: "LEGACY_PATH", + items: Sequence["Item"], +) -> Union[str, List[str]]: """Return a string or list of strings to be displayed after collection has finished successfully. @@ -1094,7 +787,6 @@ def pytest_report_collectionfinish( # type:ignore[empty-body] :param config: The pytest config object. :param start_path: The starting dir. - :type start_path: pathlib.Path :param startdir: The starting dir (deprecated). :param items: List of pytest items that are going to be executed; this list should not be modified. @@ -1109,18 +801,13 @@ def pytest_report_collectionfinish( # type:ignore[empty-body] The ``start_path`` parameter was added as a :class:`pathlib.Path` equivalent of the ``startdir`` parameter. The ``startdir`` parameter has been deprecated. - - Use in conftest plugins - ======================= - - Any conftest plugin can implement this hook. """ @hookspec(firstresult=True) def pytest_report_teststatus( # type:ignore[empty-body] - report: CollectReport | TestReport, config: Config -) -> TestShortLogReport | tuple[str, str, str | tuple[str, Mapping[str, bool]]]: + report: Union["CollectReport", "TestReport"], config: "Config" +) -> "TestShortLogReport | Tuple[str, str, Union[str, Tuple[str, Mapping[str, bool]]]]": """Return result-category, shortletter and verbose word for status reporting. @@ -1142,18 +829,13 @@ def pytest_report_teststatus( # type:ignore[empty-body] :returns: The test status. Stops at first non-None result, see :ref:`firstresult`. - - Use in conftest plugins - ======================= - - Any conftest plugin can implement this hook. """ def pytest_terminal_summary( - terminalreporter: TerminalReporter, - exitstatus: ExitCode, - config: Config, + terminalreporter: "TerminalReporter", + exitstatus: "ExitCode", + config: "Config", ) -> None: """Add a section to terminal summary reporting. @@ -1163,26 +845,21 @@ def pytest_terminal_summary( .. versionadded:: 4.2 The ``config`` parameter. - - Use in conftest plugins - ======================= - - Any conftest plugin can implement this hook. """ @hookspec(historic=True) def pytest_warning_recorded( - warning_message: warnings.WarningMessage, - when: Literal["config", "collect", "runtest"], + warning_message: "warnings.WarningMessage", + when: "Literal['config', 'collect', 'runtest']", nodeid: str, - location: tuple[str, int, str] | None, + location: Optional[Tuple[str, int, str]], ) -> None: """Process a warning captured by the internal pytest warnings plugin. :param warning_message: - The captured warning. This is the same object produced by :class:`warnings.catch_warnings`, - and contains the same attributes as the parameters of :py:func:`warnings.showwarning`. + The captured warning. This is the same object produced by :py:func:`warnings.catch_warnings`, and contains + the same attributes as the parameters of :py:func:`warnings.showwarning`. :param when: Indicates when the warning was captured. Possible values: @@ -1192,8 +869,7 @@ def pytest_warning_recorded( * ``"runtest"``: during test execution. :param nodeid: - Full id of the item. Empty string for warnings that are not specific to - a particular node. + Full id of the item. :param location: When available, holds information about the execution context of the captured @@ -1201,13 +877,6 @@ def pytest_warning_recorded( when the execution context is at the module level. .. versionadded:: 6.0 - - Use in conftest plugins - ======================= - - Any conftest file can implement this hook. If the warning is specific to a - particular node, only conftest files in parent directories of the node are - consulted. """ @@ -1217,8 +886,8 @@ def pytest_warning_recorded( def pytest_markeval_namespace( # type:ignore[empty-body] - config: Config, -) -> dict[str, Any]: + config: "Config", +) -> Dict[str, Any]: """Called when constructing the globals dictionary used for evaluating string conditions in xfail/skipif markers. @@ -1231,12 +900,6 @@ def pytest_markeval_namespace( # type:ignore[empty-body] :param config: The pytest config object. :returns: A dictionary of additional globals to add. - - Use in conftest plugins - ======================= - - Any conftest file can implement this hook. For a given item, only conftest - files in parent directories of the item are consulted. """ @@ -1246,9 +909,9 @@ def pytest_markeval_namespace( # type:ignore[empty-body] def pytest_internalerror( - excrepr: ExceptionRepr, - excinfo: ExceptionInfo[BaseException], -) -> bool | None: + excrepr: "ExceptionRepr", + excinfo: "ExceptionInfo[BaseException]", +) -> Optional[bool]: """Called for internal errors. Return True to suppress the fallback handling of printing an @@ -1256,41 +919,31 @@ def pytest_internalerror( :param excrepr: The exception repr object. :param excinfo: The exception info. - - Use in conftest plugins - ======================= - - Any conftest plugin can implement this hook. """ def pytest_keyboard_interrupt( - excinfo: ExceptionInfo[KeyboardInterrupt | Exit], + excinfo: "ExceptionInfo[Union[KeyboardInterrupt, Exit]]", ) -> None: """Called for keyboard interrupt. :param excinfo: The exception info. - - Use in conftest plugins - ======================= - - Any conftest plugin can implement this hook. """ def pytest_exception_interact( - node: Item | Collector, - call: CallInfo[Any], - report: CollectReport | TestReport, + node: Union["Item", "Collector"], + call: "CallInfo[Any]", + report: Union["CollectReport", "TestReport"], ) -> None: """Called when an exception was raised which can potentially be interactively handled. May be called during collection (see :hook:`pytest_make_collect_report`), - in which case ``report`` is a :class:`~pytest.CollectReport`. + in which case ``report`` is a :class:`CollectReport`. May be called during runtest of an item (see :hook:`pytest_runtest_protocol`), - in which case ``report`` is a :class:`~pytest.TestReport`. + in which case ``report`` is a :class:`TestReport`. This hook is not called if the exception that was raised is an internal exception like ``skip.Exception``. @@ -1301,16 +954,10 @@ def pytest_exception_interact( The call information. Contains the exception. :param report: The collection or test report. - - Use in conftest plugins - ======================= - - Any conftest file can implement this hook. For a given node, only conftest - files in parent directories of the node are consulted. """ -def pytest_enter_pdb(config: Config, pdb: pdb.Pdb) -> None: +def pytest_enter_pdb(config: "Config", pdb: "pdb.Pdb") -> None: """Called upon pdb.set_trace(). Can be used by plugins to take special action just before the python @@ -1318,15 +965,10 @@ def pytest_enter_pdb(config: Config, pdb: pdb.Pdb) -> None: :param config: The pytest config object. :param pdb: The Pdb instance. - - Use in conftest plugins - ======================= - - Any conftest plugin can implement this hook. """ -def pytest_leave_pdb(config: Config, pdb: pdb.Pdb) -> None: +def pytest_leave_pdb(config: "Config", pdb: "pdb.Pdb") -> None: """Called when leaving pdb (e.g. with continue after pdb.set_trace()). Can be used by plugins to take special action just after the python @@ -1334,9 +976,4 @@ def pytest_leave_pdb(config: Config, pdb: pdb.Pdb) -> None: :param config: The pytest config object. :param pdb: The Pdb instance. - - Use in conftest plugins - ======================= - - Any conftest plugin can implement this hook. """ diff --git a/Backend/venv/lib/python3.12/site-packages/_pytest/junitxml.py b/Backend/venv/lib/python3.12/site-packages/_pytest/junitxml.py index ae8d2b94..ed259e4c 100644 --- a/Backend/venv/lib/python3.12/site-packages/_pytest/junitxml.py +++ b/Backend/venv/lib/python3.12/site-packages/_pytest/junitxml.py @@ -1,4 +1,3 @@ -# mypy: allow-untyped-defs """Report test results in JUnit-XML format, for use with Jenkins and build integration servers. @@ -7,16 +6,21 @@ Based on initial code from Ross Lawley. Output conforms to https://github.com/jenkinsci/xunit-plugin/blob/master/src/main/resources/org/jenkinsci/plugins/xunit/types/model/xsd/junit-10.xsd """ - -from __future__ import annotations - -from collections.abc import Callable import functools import os import platform import re import xml.etree.ElementTree as ET +from datetime import datetime +from typing import Callable +from typing import Dict +from typing import List +from typing import Match +from typing import Optional +from typing import Tuple +from typing import Union +import pytest from _pytest import nodes from _pytest import timing from _pytest._code.code import ExceptionRepr @@ -28,7 +32,6 @@ from _pytest.fixtures import FixtureRequest from _pytest.reports import TestReport from _pytest.stash import StashKey from _pytest.terminal import TerminalReporter -import pytest xml_key = StashKey["LogXML"]() @@ -45,18 +48,18 @@ def bin_xml_escape(arg: object) -> str: The idea is to escape visually for the user rather than for XML itself. """ - def repl(matchobj: re.Match[str]) -> str: + def repl(matchobj: Match[str]) -> str: i = ord(matchobj.group()) if i <= 0xFF: - return f"#x{i:02X}" + return "#x%02X" % i else: - return f"#x{i:04X}" + return "#x%04X" % i # The spec range of valid chars is: # Char ::= #x9 | #xA | #xD | [#x20-#xD7FF] | [#xE000-#xFFFD] | [#x10000-#x10FFFF] # For an unknown(?) reason, we disallow #x7F (DEL) as well. illegal_xml_re = ( - "[^\u0009\u000a\u000d\u0020-\u007e\u0080-\ud7ff\ue000-\ufffd\u10000-\u10ffff]" + "[^\u0009\u000A\u000D\u0020-\u007E\u0080-\uD7FF\uE000-\uFFFD\u10000-\u10FFFF]" ) return re.sub(illegal_xml_re, repl, str(arg)) @@ -71,10 +74,10 @@ def merge_family(left, right) -> None: left.update(result) -families = { # pylint: disable=dict-init-mutate - "_base": {"testcase": ["classname", "name"]}, - "_base_legacy": {"testcase": ["file", "line", "url"]}, -} +families = {} +families["_base"] = {"testcase": ["classname", "name"]} +families["_base_legacy"] = {"testcase": ["file", "line", "url"]} + # xUnit 1.x inherits legacy attributes. families["xunit1"] = families["_base"].copy() merge_family(families["xunit1"], families["_base_legacy"]) @@ -84,15 +87,15 @@ families["xunit2"] = families["_base"] class _NodeReporter: - def __init__(self, nodeid: str | TestReport, xml: LogXML) -> None: + def __init__(self, nodeid: Union[str, TestReport], xml: "LogXML") -> None: self.id = nodeid self.xml = xml self.add_stats = self.xml.add_stats self.family = self.xml.family self.duration = 0.0 - self.properties: list[tuple[str, str]] = [] - self.nodes: list[ET.Element] = [] - self.attrs: dict[str, str] = {} + self.properties: List[Tuple[str, str]] = [] + self.nodes: List[ET.Element] = [] + self.attrs: Dict[str, str] = {} def append(self, node: ET.Element) -> None: self.xml.add_stats(node.tag) @@ -104,7 +107,7 @@ class _NodeReporter: def add_attribute(self, name: str, value: object) -> None: self.attrs[str(name)] = bin_xml_escape(value) - def make_properties_node(self) -> ET.Element | None: + def make_properties_node(self) -> Optional[ET.Element]: """Return a Junit node containing custom properties, if any.""" if self.properties: properties = ET.Element("properties") @@ -119,7 +122,7 @@ class _NodeReporter: classnames = names[:-1] if self.xml.prefix: classnames.insert(0, self.xml.prefix) - attrs: dict[str, str] = { + attrs: Dict[str, str] = { "classname": ".".join(classnames), "name": bin_xml_escape(names[-1]), "file": testreport.location[0], @@ -138,20 +141,20 @@ class _NodeReporter: # Filter out attributes not permitted by this test family. # Including custom attributes because they are not valid here. temp_attrs = {} - for key in self.attrs: + for key in self.attrs.keys(): if key in families[self.family]["testcase"]: temp_attrs[key] = self.attrs[key] self.attrs = temp_attrs def to_xml(self) -> ET.Element: - testcase = ET.Element("testcase", self.attrs, time=f"{self.duration:.3f}") + testcase = ET.Element("testcase", self.attrs, time="%.3f" % self.duration) properties = self.make_properties_node() if properties is not None: testcase.append(properties) testcase.extend(self.nodes) return testcase - def _add_simple(self, tag: str, message: str, data: str | None = None) -> None: + def _add_simple(self, tag: str, message: str, data: Optional[str] = None) -> None: node = ET.Element(tag, message=message) node.text = bin_xml_escape(data) self.append(node) @@ -196,7 +199,7 @@ class _NodeReporter: self._add_simple("skipped", "xfail-marked test passes unexpectedly") else: assert report.longrepr is not None - reprcrash: ReprFileLocation | None = getattr( + reprcrash: Optional[ReprFileLocation] = getattr( report.longrepr, "reprcrash", None ) if reprcrash is not None: @@ -216,7 +219,9 @@ class _NodeReporter: def append_error(self, report: TestReport) -> None: assert report.longrepr is not None - reprcrash: ReprFileLocation | None = getattr(report.longrepr, "reprcrash", None) + reprcrash: Optional[ReprFileLocation] = getattr( + report.longrepr, "reprcrash", None + ) if reprcrash is not None: reason = reprcrash.message else: @@ -243,9 +248,7 @@ class _NodeReporter: skipreason = skipreason[9:] details = f"{filename}:{lineno}: {skipreason}" - skipped = ET.Element( - "skipped", type="pytest.skip", message=bin_xml_escape(skipreason) - ) + skipped = ET.Element("skipped", type="pytest.skip", message=skipreason) skipped.text = bin_xml_escape(details) self.append(skipped) self.write_captured_output(report) @@ -255,7 +258,7 @@ class _NodeReporter: self.__dict__.clear() # Type ignored because mypy doesn't like overriding a method. # Also the return value doesn't match... - self.to_xml = lambda: data # type: ignore[method-assign] + self.to_xml = lambda: data # type: ignore[assignment] def _warn_incompatibility_with_xunit2( @@ -268,7 +271,9 @@ def _warn_incompatibility_with_xunit2( if xml is not None and xml.family not in ("xunit1", "legacy"): request.node.warn( PytestWarning( - f"{fixture_name} is incompatible with junit_family '{xml.family}' (use 'legacy' or 'xunit1')" + "{fixture_name} is incompatible with junit_family '{family}' (use 'legacy' or 'xunit1')".format( + fixture_name=fixture_name, family=xml.family + ) ) ) @@ -360,16 +365,17 @@ def record_testsuite_property(request: FixtureRequest) -> Callable[[str, object] `pytest-xdist `__ plugin. See :issue:`7767` for details. """ + __tracebackhide__ = True def record_func(name: str, value: object) -> None: - """No-op function in case --junit-xml was not passed in the command-line.""" + """No-op function in case --junitxml was not passed in the command-line.""" __tracebackhide__ = True _check_record_param_type("name", name) xml = request.config.stash.get(xml_key, None) if xml is not None: - record_func = xml.add_global_property + record_func = xml.add_global_property # noqa return record_func @@ -444,7 +450,7 @@ def pytest_unconfigure(config: Config) -> None: config.pluginmanager.unregister(xml) -def mangle_test_address(address: str) -> list[str]: +def mangle_test_address(address: str) -> List[str]: path, possible_open_bracket, params = address.partition("[") names = path.split("::") # Convert file path to dotted path. @@ -459,7 +465,7 @@ class LogXML: def __init__( self, logfile, - prefix: str | None, + prefix: Optional[str], suite_name: str = "pytest", logging: str = "no", report_duration: str = "total", @@ -474,15 +480,17 @@ class LogXML: self.log_passing_tests = log_passing_tests self.report_duration = report_duration self.family = family - self.stats: dict[str, int] = dict.fromkeys( + self.stats: Dict[str, int] = dict.fromkeys( ["error", "passed", "failure", "skipped"], 0 ) - self.node_reporters: dict[tuple[str | TestReport, object], _NodeReporter] = {} - self.node_reporters_ordered: list[_NodeReporter] = [] - self.global_properties: list[tuple[str, str]] = [] + self.node_reporters: Dict[ + Tuple[Union[str, TestReport], object], _NodeReporter + ] = {} + self.node_reporters_ordered: List[_NodeReporter] = [] + self.global_properties: List[Tuple[str, str]] = [] # List of reports that failed on call but teardown is pending. - self.open_reports: list[TestReport] = [] + self.open_reports: List[TestReport] = [] self.cnt_double_fail_tests = 0 # Replaces convenience family with real family. @@ -501,8 +509,8 @@ class LogXML: if reporter is not None: reporter.finalize() - def node_reporter(self, report: TestReport | str) -> _NodeReporter: - nodeid: str | TestReport = getattr(report, "nodeid", report) + def node_reporter(self, report: Union[TestReport, str]) -> _NodeReporter: + nodeid: Union[str, TestReport] = getattr(report, "nodeid", report) # Local hack to handle xdist report order. workernode = getattr(report, "node", None) @@ -616,7 +624,7 @@ class LogXML: def update_testcase_duration(self, report: TestReport) -> None: """Accumulate total duration for nodeid from given report and update the Junit.testcase with the new total if already created.""" - if self.report_duration in {"total", report.when}: + if self.report_duration == "total" or report.when == self.report_duration: reporter = self.node_reporter(report) reporter.duration += getattr(report, "duration", 0.0) @@ -634,7 +642,7 @@ class LogXML: reporter._add_simple("error", "internal error", str(excrepr)) def pytest_sessionstart(self) -> None: - self.suite_start = timing.Instant() + self.suite_start_time = timing.time() def pytest_sessionfinish(self) -> None: dirname = os.path.dirname(os.path.abspath(self.logfile)) @@ -642,7 +650,8 @@ class LogXML: os.makedirs(dirname, exist_ok=True) with open(self.logfile, "w", encoding="utf-8") as logfile: - duration = self.suite_start.elapsed() + suite_stop_time = timing.time() + suite_time_delta = suite_stop_time - self.suite_start_time numtests = ( self.stats["passed"] @@ -660,8 +669,8 @@ class LogXML: failures=str(self.stats["failure"]), skipped=str(self.stats["skipped"]), tests=str(numtests), - time=f"{duration.seconds:.3f}", - timestamp=self.suite_start.as_utc().astimezone().isoformat(), + time="%.3f" % suite_time_delta, + timestamp=datetime.fromtimestamp(self.suite_start_time).isoformat(), hostname=platform.node(), ) global_properties = self._get_global_properties_node() @@ -670,22 +679,18 @@ class LogXML: for node_reporter in self.node_reporters_ordered: suite_node.append(node_reporter.to_xml()) testsuites = ET.Element("testsuites") - testsuites.set("name", "pytest tests") testsuites.append(suite_node) logfile.write(ET.tostring(testsuites, encoding="unicode")) - def pytest_terminal_summary( - self, terminalreporter: TerminalReporter, config: pytest.Config - ) -> None: - if config.get_verbosity() >= 0: - terminalreporter.write_sep("-", f"generated xml file: {self.logfile}") + def pytest_terminal_summary(self, terminalreporter: TerminalReporter) -> None: + terminalreporter.write_sep("-", f"generated xml file: {self.logfile}") def add_global_property(self, name: str, value: object) -> None: __tracebackhide__ = True _check_record_param_type("name", name) self.global_properties.append((name, bin_xml_escape(value))) - def _get_global_properties_node(self) -> ET.Element | None: + def _get_global_properties_node(self) -> Optional[ET.Element]: """Return a Junit node containing custom properties, if any.""" if self.global_properties: properties = ET.Element("properties") diff --git a/Backend/venv/lib/python3.12/site-packages/_pytest/legacypath.py b/Backend/venv/lib/python3.12/site-packages/_pytest/legacypath.py index 59e8ef6e..af1d0c07 100644 --- a/Backend/venv/lib/python3.12/site-packages/_pytest/legacypath.py +++ b/Backend/venv/lib/python3.12/site-packages/_pytest/legacypath.py @@ -1,19 +1,17 @@ -# mypy: allow-untyped-defs """Add backward compatibility support for the legacy py path type.""" - -from __future__ import annotations - import dataclasses -from pathlib import Path import shlex import subprocess -from typing import Final -from typing import final +from pathlib import Path +from typing import List +from typing import Optional from typing import TYPE_CHECKING +from typing import Union from iniconfig import SectionWrapper from _pytest.cacheprovider import Cache +from _pytest.compat import final from _pytest.compat import LEGACY_PATH from _pytest.compat import legacy_path from _pytest.config import Config @@ -33,8 +31,9 @@ from _pytest.pytester import RunResult from _pytest.terminal import TerminalReporter from _pytest.tmpdir import TempPathFactory - if TYPE_CHECKING: + from typing_extensions import Final + import pexpect @@ -49,8 +48,8 @@ class Testdir: __test__ = False - CLOSE_STDIN: Final = Pytester.CLOSE_STDIN - TimeoutExpired: Final = Pytester.TimeoutExpired + CLOSE_STDIN: "Final" = Pytester.CLOSE_STDIN + TimeoutExpired: "Final" = Pytester.TimeoutExpired def __init__(self, pytester: Pytester, *, _ispytest: bool = False) -> None: check_ispytest(_ispytest) @@ -90,6 +89,7 @@ class Testdir: return self._pytester.chdir() def finalize(self) -> None: + """See :meth:`Pytester._finalize`.""" return self._pytester._finalize() def makefile(self, ext, *args, **kwargs) -> LEGACY_PATH: @@ -144,7 +144,7 @@ class Testdir: """See :meth:`Pytester.copy_example`.""" return legacy_path(self._pytester.copy_example(name)) - def getnode(self, config: Config, arg) -> Item | Collector | None: + def getnode(self, config: Config, arg) -> Optional[Union[Item, Collector]]: """See :meth:`Pytester.getnode`.""" return self._pytester.getnode(config, arg) @@ -152,7 +152,7 @@ class Testdir: """See :meth:`Pytester.getpathnode`.""" return self._pytester.getpathnode(path) - def genitems(self, colitems: list[Item | Collector]) -> list[Item]: + def genitems(self, colitems: List[Union[Item, Collector]]) -> List[Item]: """See :meth:`Pytester.genitems`.""" return self._pytester.genitems(colitems) @@ -204,7 +204,9 @@ class Testdir: source, configargs=configargs, withinit=withinit ) - def collect_by_name(self, modcol: Collector, name: str) -> Item | Collector | None: + def collect_by_name( + self, modcol: Collector, name: str + ) -> Optional[Union[Item, Collector]]: """See :meth:`Pytester.collect_by_name`.""" return self._pytester.collect_by_name(modcol, name) @@ -235,11 +237,13 @@ class Testdir: """See :meth:`Pytester.runpytest_subprocess`.""" return self._pytester.runpytest_subprocess(*args, timeout=timeout) - def spawn_pytest(self, string: str, expect_timeout: float = 10.0) -> pexpect.spawn: + def spawn_pytest( + self, string: str, expect_timeout: float = 10.0 + ) -> "pexpect.spawn": """See :meth:`Pytester.spawn_pytest`.""" return self._pytester.spawn_pytest(string, expect_timeout=expect_timeout) - def spawn(self, cmd: str, expect_timeout: float = 10.0) -> pexpect.spawn: + def spawn(self, cmd: str, expect_timeout: float = 10.0) -> "pexpect.spawn": """See :meth:`Pytester.spawn`.""" return self._pytester.spawn(cmd, expect_timeout=expect_timeout) @@ -266,7 +270,7 @@ class LegacyTestdirPlugin: @final @dataclasses.dataclass class TempdirFactory: - """Backward compatibility wrapper that implements ``py.path.local`` + """Backward compatibility wrapper that implements :class:`py.path.local` for :class:`TempPathFactory`. .. note:: @@ -285,11 +289,11 @@ class TempdirFactory: self._tmppath_factory = tmppath_factory def mktemp(self, basename: str, numbered: bool = True) -> LEGACY_PATH: - """Same as :meth:`TempPathFactory.mktemp`, but returns a ``py.path.local`` object.""" + """Same as :meth:`TempPathFactory.mktemp`, but returns a :class:`py.path.local` object.""" return legacy_path(self._tmppath_factory.mktemp(basename, numbered).resolve()) def getbasetemp(self) -> LEGACY_PATH: - """Same as :meth:`TempPathFactory.getbasetemp`, but returns a ``py.path.local`` object.""" + """Same as :meth:`TempPathFactory.getbasetemp`, but returns a :class:`py.path.local` object.""" return legacy_path(self._tmppath_factory.getbasetemp().resolve()) @@ -304,11 +308,16 @@ class LegacyTmpdirPlugin: @staticmethod @fixture def tmpdir(tmp_path: Path) -> LEGACY_PATH: - """Return a temporary directory (as `legacy_path`_ object) - which is unique to each test function invocation. - The temporary directory is created as a subdirectory - of the base temporary directory, with configurable retention, - as discussed in :ref:`temporary directory location and retention`. + """Return a temporary directory path object which is unique to each test + function invocation, created as a sub directory of the base temporary + directory. + + By default, a new base temporary directory is created each test session, + and old bases are removed after 3 sessions, to aid in debugging. If + ``--basetemp`` is used then it is cleared each session. See :ref:`base + temporary directory`. + + The returned object is a `legacy_path`_ object. .. note:: These days, it is preferred to use ``tmp_path``. @@ -364,7 +373,7 @@ def Config_rootdir(self: Config) -> LEGACY_PATH: return legacy_path(str(self.rootpath)) -def Config_inifile(self: Config) -> LEGACY_PATH | None: +def Config_inifile(self: Config) -> Optional[LEGACY_PATH]: """The path to the :ref:`configfile `. Prefer to use :attr:`inipath`, which is a :class:`pathlib.Path`. @@ -374,7 +383,7 @@ def Config_inifile(self: Config) -> LEGACY_PATH | None: return legacy_path(str(self.inipath)) if self.inipath else None -def Session_startdir(self: Session) -> LEGACY_PATH: +def Session_stardir(self: Session) -> LEGACY_PATH: """The path from which pytest was invoked. Prefer to use ``startpath`` which is a :class:`pathlib.Path`. @@ -384,7 +393,9 @@ def Session_startdir(self: Session) -> LEGACY_PATH: return legacy_path(self.startpath) -def Config__getini_unknown_type(self, name: str, type: str, value: str | list[str]): +def Config__getini_unknown_type( + self, name: str, type: str, value: Union[str, List[str]] +): if type == "pathlist": # TODO: This assert is probably not valid in all cases. assert self.inipath is not None @@ -427,7 +438,7 @@ def pytest_load_initial_conftests(early_config: Config) -> None: mp.setattr(Config, "inifile", property(Config_inifile), raising=False) # Add Session.startdir property. - mp.setattr(Session, "startdir", property(Session_startdir), raising=False) + mp.setattr(Session, "startdir", property(Session_stardir), raising=False) # Add pathlist configuration type. mp.setattr(Config, "_getini_unknown_type", Config__getini_unknown_type) diff --git a/Backend/venv/lib/python3.12/site-packages/_pytest/logging.py b/Backend/venv/lib/python3.12/site-packages/_pytest/logging.py index e4fed579..9f2f1c79 100644 --- a/Backend/venv/lib/python3.12/site-packages/_pytest/logging.py +++ b/Backend/venv/lib/python3.12/site-packages/_pytest/logging.py @@ -1,33 +1,31 @@ -# mypy: allow-untyped-defs """Access and control log capturing.""" - -from __future__ import annotations - -from collections.abc import Generator -from collections.abc import Mapping -from collections.abc import Set as AbstractSet +import io +import logging +import os +import re from contextlib import contextmanager from contextlib import nullcontext from datetime import datetime from datetime import timedelta from datetime import timezone -import io from io import StringIO -import logging from logging import LogRecord -import os from pathlib import Path -import re -from types import TracebackType -from typing import final -from typing import Generic -from typing import Literal +from typing import AbstractSet +from typing import Dict +from typing import Generator +from typing import List +from typing import Mapping +from typing import Optional +from typing import Tuple from typing import TYPE_CHECKING from typing import TypeVar +from typing import Union from _pytest import nodes from _pytest._io import TerminalWriter from _pytest.capture import CaptureManager +from _pytest.compat import final from _pytest.config import _strtobool from _pytest.config import Config from _pytest.config import create_terminal_writer @@ -41,9 +39,10 @@ from _pytest.main import Session from _pytest.stash import StashKey from _pytest.terminal import TerminalReporter - if TYPE_CHECKING: logging_StreamHandler = logging.StreamHandler[StringIO] + + from typing_extensions import Literal else: logging_StreamHandler = logging.StreamHandler @@ -51,7 +50,7 @@ DEFAULT_LOG_FORMAT = "%(levelname)-8s %(name)s:%(filename)s:%(lineno)d %(message DEFAULT_LOG_DATE_FORMAT = "%H:%M:%S" _ANSI_ESCAPE_SEQ = re.compile(r"\x1b\[[\d;]+m") caplog_handler_key = StashKey["LogCaptureHandler"]() -caplog_records_key = StashKey[dict[str, list[logging.LogRecord]]]() +caplog_records_key = StashKey[Dict[str, List[logging.LogRecord]]]() def _remove_ansi_escape_sequences(text: str) -> str: @@ -64,14 +63,13 @@ class DatetimeFormatter(logging.Formatter): :func:`time.strftime` in case of microseconds in format string. """ - def formatTime(self, record: LogRecord, datefmt: str | None = None) -> str: + def formatTime(self, record: LogRecord, datefmt=None) -> str: if datefmt and "%f" in datefmt: ct = self.converter(record.created) tz = timezone(timedelta(seconds=ct.tm_gmtoff), ct.tm_zone) # Construct `datetime.datetime` object from `struct_time` # and msecs information from `record` - # Using int() instead of round() to avoid it exceeding 1_000_000 and causing a ValueError (#11861). - dt = datetime(*ct[0:6], microsecond=int(record.msecs * 1000), tzinfo=tz) + dt = datetime(*ct[0:6], microsecond=round(record.msecs * 1000), tzinfo=tz) return dt.strftime(datefmt) # Use `logging.Formatter` for non-microsecond formats return super().formatTime(record, datefmt) @@ -96,7 +94,7 @@ class ColoredLevelFormatter(DatetimeFormatter): super().__init__(*args, **kwargs) self._terminalwriter = terminalwriter self._original_fmt = self._style._fmt - self._level_to_fmt_mapping: dict[int, str] = {} + self._level_to_fmt_mapping: Dict[int, str] = {} for level, color_opts in self.LOGLEVEL_COLOROPTS.items(): self.add_color_level(level, *color_opts) @@ -114,6 +112,7 @@ class ColoredLevelFormatter(DatetimeFormatter): .. warning:: This is an experimental API. """ + assert self._fmt is not None levelname_fmt_match = self.LEVELNAME_FMT_REGEX.search(self._fmt) if not levelname_fmt_match: @@ -144,12 +143,12 @@ class PercentStyleMultiline(logging.PercentStyle): formats the message as if each line were logged separately. """ - def __init__(self, fmt: str, auto_indent: int | str | bool | None) -> None: + def __init__(self, fmt: str, auto_indent: Union[int, str, bool, None]) -> None: super().__init__(fmt) self._auto_indent = self._get_auto_indent(auto_indent) @staticmethod - def _get_auto_indent(auto_indent_option: int | str | bool | None) -> int: + def _get_auto_indent(auto_indent_option: Union[int, str, bool, None]) -> int: """Determine the current auto indentation setting. Specify auto indent behavior (on/off/fixed) by passing in @@ -180,6 +179,7 @@ class PercentStyleMultiline(logging.PercentStyle): 0 (auto-indent turned off) or >0 (explicitly set indentation position). """ + if auto_indent_option is None: return 0 elif isinstance(auto_indent_option, bool): @@ -206,7 +206,7 @@ class PercentStyleMultiline(logging.PercentStyle): if "\n" in record.message: if hasattr(record, "auto_indent"): # Passed in from the "extra={}" kwarg on the call to logging.log(). - auto_indent = self._get_auto_indent(record.auto_indent) + auto_indent = self._get_auto_indent(record.auto_indent) # type: ignore[attr-defined] else: auto_indent = self._auto_indent @@ -295,13 +295,6 @@ def pytest_addoption(parser: Parser) -> None: default=None, help="Path to a file when logging will be written to", ) - add_option_ini( - "--log-file-mode", - dest="log_file_mode", - default="w", - choices=["w", "a"], - help="Log file open mode", - ) add_option_ini( "--log-file-level", dest="log_file_level", @@ -311,13 +304,13 @@ def pytest_addoption(parser: Parser) -> None: add_option_ini( "--log-file-format", dest="log_file_format", - default=None, + default=DEFAULT_LOG_FORMAT, help="Log format used by the logging module", ) add_option_ini( "--log-file-date-format", dest="log_file_date_format", - default=None, + default=DEFAULT_LOG_DATE_FORMAT, help="Log date format used by the logging module", ) add_option_ini( @@ -339,16 +332,16 @@ _HandlerType = TypeVar("_HandlerType", bound=logging.Handler) # Not using @contextmanager for performance reasons. -class catching_logs(Generic[_HandlerType]): +class catching_logs: """Context manager that prepares the whole logging machinery properly.""" __slots__ = ("handler", "level", "orig_level") - def __init__(self, handler: _HandlerType, level: int | None = None) -> None: + def __init__(self, handler: _HandlerType, level: Optional[int] = None) -> None: self.handler = handler self.level = level - def __enter__(self) -> _HandlerType: + def __enter__(self): root_logger = logging.getLogger() if self.level is not None: self.handler.setLevel(self.level) @@ -358,12 +351,7 @@ class catching_logs(Generic[_HandlerType]): root_logger.setLevel(min(self.orig_level, self.level)) return self.handler - def __exit__( - self, - exc_type: type[BaseException] | None, - exc_val: BaseException | None, - exc_tb: TracebackType | None, - ) -> None: + def __exit__(self, type, value, traceback): root_logger = logging.getLogger() if self.level is not None: root_logger.setLevel(self.orig_level) @@ -376,7 +364,7 @@ class LogCaptureHandler(logging_StreamHandler): def __init__(self) -> None: """Create a new log handler.""" super().__init__(StringIO()) - self.records: list[logging.LogRecord] = [] + self.records: List[logging.LogRecord] = [] def emit(self, record: logging.LogRecord) -> None: """Keep the log records in a list in addition to the log text.""" @@ -397,7 +385,7 @@ class LogCaptureHandler(logging_StreamHandler): # The default behavior of logging is to print "Logging error" # to stderr with the call stack and some extra details. # pytest wants to make such mistakes visible during testing. - raise # noqa: PLE0704 + raise @final @@ -407,10 +395,10 @@ class LogCaptureFixture: def __init__(self, item: nodes.Node, *, _ispytest: bool = False) -> None: check_ispytest(_ispytest) self._item = item - self._initial_handler_level: int | None = None + self._initial_handler_level: Optional[int] = None # Dict of log name -> log level. - self._initial_logger_levels: dict[str | None, int] = {} - self._initial_disabled_logging_level: int | None = None + self._initial_logger_levels: Dict[Optional[str], int] = {} + self._initial_disabled_logging_level: Optional[int] = None def _finalize(self) -> None: """Finalize the fixture. @@ -434,8 +422,8 @@ class LogCaptureFixture: return self._item.stash[caplog_handler_key] def get_records( - self, when: Literal["setup", "call", "teardown"] - ) -> list[logging.LogRecord]: + self, when: "Literal['setup', 'call', 'teardown']" + ) -> List[logging.LogRecord]: """Get the logging records for one of the possible test phases. :param when: @@ -454,12 +442,12 @@ class LogCaptureFixture: return _remove_ansi_escape_sequences(self.handler.stream.getvalue()) @property - def records(self) -> list[logging.LogRecord]: + def records(self) -> List[logging.LogRecord]: """The list of log records.""" return self.handler.records @property - def record_tuples(self) -> list[tuple[str, int, str]]: + def record_tuples(self) -> List[Tuple[str, int, str]]: """A list of a stripped down version of log records intended for use in assertion comparison. @@ -470,7 +458,7 @@ class LogCaptureFixture: return [(r.name, r.levelno, r.getMessage()) for r in self.records] @property - def messages(self) -> list[str]: + def messages(self) -> List[str]: """A list of format-interpolated log messages. Unlike 'records', which contains the format string and parameters for @@ -493,7 +481,7 @@ class LogCaptureFixture: self.handler.clear() def _force_enable_logging( - self, level: int | str, logger_obj: logging.Logger + self, level: Union[int, str], logger_obj: logging.Logger ) -> int: """Enable the desired logging level if the global level was disabled via ``logging.disabled``. @@ -509,7 +497,7 @@ class LogCaptureFixture: :return: The original disabled logging level. """ - original_disable_level: int = logger_obj.manager.disable + original_disable_level: int = logger_obj.manager.disable # type: ignore[attr-defined] if isinstance(level, str): # Try to translate the level string to an int for `logging.disable()` @@ -526,7 +514,7 @@ class LogCaptureFixture: return original_disable_level - def set_level(self, level: int | str, logger: str | None = None) -> None: + def set_level(self, level: Union[int, str], logger: Optional[str] = None) -> None: """Set the threshold level of a logger for the duration of a test. Logging messages which are less severe than this level will not be captured. @@ -535,7 +523,7 @@ class LogCaptureFixture: The levels of the loggers changed by this function will be restored to their initial values at the end of the test. - Will enable the requested logging level if it was disabled via :func:`logging.disable`. + Will enable the requested logging level if it was disabled via :meth:`logging.disable`. :param level: The level. :param logger: The logger to update. If not given, the root logger. @@ -552,12 +540,14 @@ class LogCaptureFixture: self._initial_disabled_logging_level = initial_disabled_logging_level @contextmanager - def at_level(self, level: int | str, logger: str | None = None) -> Generator[None]: + def at_level( + self, level: Union[int, str], logger: Optional[str] = None + ) -> Generator[None, None, None]: """Context manager that sets the level for capturing of logs. After the end of the 'with' statement the level is restored to its original value. - Will enable the requested logging level if it was disabled via :func:`logging.disable`. + Will enable the requested logging level if it was disabled via :meth:`logging.disable`. :param level: The level. :param logger: The logger to update. If not given, the root logger. @@ -575,25 +565,9 @@ class LogCaptureFixture: self.handler.setLevel(handler_orig_level) logging.disable(original_disable_level) - @contextmanager - def filtering(self, filter_: logging.Filter) -> Generator[None]: - """Context manager that temporarily adds the given filter to the caplog's - :meth:`handler` for the 'with' statement block, and removes that filter at the - end of the block. - - :param filter_: A custom :class:`logging.Filter` object. - - .. versionadded:: 7.5 - """ - self.handler.addFilter(filter_) - try: - yield - finally: - self.handler.removeFilter(filter_) - @fixture -def caplog(request: FixtureRequest) -> Generator[LogCaptureFixture]: +def caplog(request: FixtureRequest) -> Generator[LogCaptureFixture, None, None]: """Access and control log capturing. Captured logs are available through the following properties/methods:: @@ -609,7 +583,7 @@ def caplog(request: FixtureRequest) -> Generator[LogCaptureFixture]: result._finalize() -def get_log_level_for_setting(config: Config, *setting_names: str) -> int | None: +def get_log_level_for_setting(config: Config, *setting_names: str) -> Optional[int]: for setting_name in setting_names: log_level = config.getoption(setting_name) if log_level is None: @@ -626,9 +600,9 @@ def get_log_level_for_setting(config: Config, *setting_names: str) -> int | None except ValueError as e: # Python logging does not recognise this as a logging level raise UsageError( - f"'{log_level}' is not recognized as a logging level name for " - f"'{setting_name}'. Please consider passing the " - "logging level num instead." + "'{}' is not recognized as a logging level name for " + "'{}'. Please consider passing the " + "logging level num instead.".format(log_level, setting_name) ) from e @@ -662,19 +636,14 @@ class LoggingPlugin: self.report_handler.setFormatter(self.formatter) # File logging. - self.log_file_level = get_log_level_for_setting( - config, "log_file_level", "log_level" - ) + self.log_file_level = get_log_level_for_setting(config, "log_file_level") log_file = get_option_ini(config, "log_file") or os.devnull if log_file != os.devnull: directory = os.path.dirname(os.path.abspath(log_file)) if not os.path.isdir(directory): os.makedirs(directory) - self.log_file_mode = get_option_ini(config, "log_file_mode") or "w" - self.log_file_handler = _FileHandler( - log_file, mode=self.log_file_mode, encoding="UTF-8" - ) + self.log_file_handler = _FileHandler(log_file, mode="w", encoding="UTF-8") log_file_format = get_option_ini(config, "log_file_format", "log_format") log_file_date_format = get_option_ini( config, "log_file_date_format", "log_date_format" @@ -695,9 +664,9 @@ class LoggingPlugin: assert terminal_reporter is not None capture_manager = config.pluginmanager.get_plugin("capturemanager") # if capturemanager plugin is disabled, live logging still works. - self.log_cli_handler: ( - _LiveLoggingStreamHandler | _LiveLoggingNullHandler - ) = _LiveLoggingStreamHandler(terminal_reporter, capture_manager) + self.log_cli_handler: Union[ + _LiveLoggingStreamHandler, _LiveLoggingNullHandler + ] = _LiveLoggingStreamHandler(terminal_reporter, capture_manager) else: self.log_cli_handler = _LiveLoggingNullHandler() log_cli_formatter = self._create_formatter( @@ -708,7 +677,7 @@ class LoggingPlugin: self.log_cli_handler.setFormatter(log_cli_formatter) self._disable_loggers(loggers_to_disable=config.option.logger_disable) - def _disable_loggers(self, loggers_to_disable: list[str]) -> None: + def _disable_loggers(self, loggers_to_disable: List[str]) -> None: if not loggers_to_disable: return @@ -751,12 +720,12 @@ class LoggingPlugin: fpath.parent.mkdir(exist_ok=True, parents=True) # https://github.com/python/mypy/issues/11193 - stream: io.TextIOWrapper = fpath.open(mode=self.log_file_mode, encoding="UTF-8") # type: ignore[assignment] + stream: io.TextIOWrapper = fpath.open(mode="w", encoding="UTF-8") # type: ignore[assignment] old_stream = self.log_file_handler.setStream(stream) if old_stream: old_stream.close() - def _log_cli_enabled(self) -> bool: + def _log_cli_enabled(self): """Return whether live logging is enabled.""" enabled = self._config.getoption( "--log-cli-level" @@ -771,34 +740,35 @@ class LoggingPlugin: return True - @hookimpl(wrapper=True, tryfirst=True) - def pytest_sessionstart(self) -> Generator[None]: + @hookimpl(hookwrapper=True, tryfirst=True) + def pytest_sessionstart(self) -> Generator[None, None, None]: self.log_cli_handler.set_when("sessionstart") with catching_logs(self.log_cli_handler, level=self.log_cli_level): with catching_logs(self.log_file_handler, level=self.log_file_level): - return (yield) + yield - @hookimpl(wrapper=True, tryfirst=True) - def pytest_collection(self) -> Generator[None]: + @hookimpl(hookwrapper=True, tryfirst=True) + def pytest_collection(self) -> Generator[None, None, None]: self.log_cli_handler.set_when("collection") with catching_logs(self.log_cli_handler, level=self.log_cli_level): with catching_logs(self.log_file_handler, level=self.log_file_level): - return (yield) + yield - @hookimpl(wrapper=True) - def pytest_runtestloop(self, session: Session) -> Generator[None, object, object]: + @hookimpl(hookwrapper=True) + def pytest_runtestloop(self, session: Session) -> Generator[None, None, None]: if session.config.option.collectonly: - return (yield) + yield + return - if self._log_cli_enabled() and self._config.get_verbosity() < 1: + if self._log_cli_enabled() and self._config.getoption("verbose") < 1: # The verbose flag is needed to avoid messy test progress output. self._config.option.verbose = 1 with catching_logs(self.log_cli_handler, level=self.log_cli_level): with catching_logs(self.log_file_handler, level=self.log_file_level): - return (yield) # Run all the tests. + yield # Run all the tests. @hookimpl def pytest_runtest_logstart(self) -> None: @@ -809,68 +779,58 @@ class LoggingPlugin: def pytest_runtest_logreport(self) -> None: self.log_cli_handler.set_when("logreport") - @contextmanager - def _runtest_for(self, item: nodes.Item, when: str) -> Generator[None]: + def _runtest_for(self, item: nodes.Item, when: str) -> Generator[None, None, None]: """Implement the internals of the pytest_runtest_xxx() hooks.""" - with ( - catching_logs( - self.caplog_handler, - level=self.log_level, - ) as caplog_handler, - catching_logs( - self.report_handler, - level=self.log_level, - ) as report_handler, - ): + with catching_logs( + self.caplog_handler, + level=self.log_level, + ) as caplog_handler, catching_logs( + self.report_handler, + level=self.log_level, + ) as report_handler: caplog_handler.reset() report_handler.reset() item.stash[caplog_records_key][when] = caplog_handler.records item.stash[caplog_handler_key] = caplog_handler - try: - yield - finally: - log = report_handler.stream.getvalue().strip() - item.add_report_section(when, "log", log) + yield - @hookimpl(wrapper=True) - def pytest_runtest_setup(self, item: nodes.Item) -> Generator[None]: + log = report_handler.stream.getvalue().strip() + item.add_report_section(when, "log", log) + + @hookimpl(hookwrapper=True) + def pytest_runtest_setup(self, item: nodes.Item) -> Generator[None, None, None]: self.log_cli_handler.set_when("setup") - empty: dict[str, list[logging.LogRecord]] = {} + empty: Dict[str, List[logging.LogRecord]] = {} item.stash[caplog_records_key] = empty - with self._runtest_for(item, "setup"): - yield + yield from self._runtest_for(item, "setup") - @hookimpl(wrapper=True) - def pytest_runtest_call(self, item: nodes.Item) -> Generator[None]: + @hookimpl(hookwrapper=True) + def pytest_runtest_call(self, item: nodes.Item) -> Generator[None, None, None]: self.log_cli_handler.set_when("call") - with self._runtest_for(item, "call"): - yield + yield from self._runtest_for(item, "call") - @hookimpl(wrapper=True) - def pytest_runtest_teardown(self, item: nodes.Item) -> Generator[None]: + @hookimpl(hookwrapper=True) + def pytest_runtest_teardown(self, item: nodes.Item) -> Generator[None, None, None]: self.log_cli_handler.set_when("teardown") - try: - with self._runtest_for(item, "teardown"): - yield - finally: - del item.stash[caplog_records_key] - del item.stash[caplog_handler_key] + yield from self._runtest_for(item, "teardown") + del item.stash[caplog_records_key] + del item.stash[caplog_handler_key] @hookimpl def pytest_runtest_logfinish(self) -> None: self.log_cli_handler.set_when("finish") - @hookimpl(wrapper=True, tryfirst=True) - def pytest_sessionfinish(self) -> Generator[None]: + @hookimpl(hookwrapper=True, tryfirst=True) + def pytest_sessionfinish(self) -> Generator[None, None, None]: self.log_cli_handler.set_when("sessionfinish") with catching_logs(self.log_cli_handler, level=self.log_cli_level): with catching_logs(self.log_file_handler, level=self.log_file_level): - return (yield) + yield @hookimpl def pytest_unconfigure(self) -> None: @@ -903,7 +863,7 @@ class _LiveLoggingStreamHandler(logging_StreamHandler): def __init__( self, terminal_reporter: TerminalReporter, - capture_manager: CaptureManager | None, + capture_manager: Optional[CaptureManager], ) -> None: super().__init__(stream=terminal_reporter) # type: ignore[arg-type] self.capture_manager = capture_manager @@ -915,7 +875,7 @@ class _LiveLoggingStreamHandler(logging_StreamHandler): """Reset the handler; should be called before the start of each test.""" self._first_record_emitted = False - def set_when(self, when: str | None) -> None: + def set_when(self, when: Optional[str]) -> None: """Prepare for the given test phase (setup/call/teardown).""" self._when = when self._section_name_shown = False diff --git a/Backend/venv/lib/python3.12/site-packages/_pytest/main.py b/Backend/venv/lib/python3.12/site-packages/_pytest/main.py index 9bc930df..ea89a63f 100644 --- a/Backend/venv/lib/python3.12/site-packages/_pytest/main.py +++ b/Backend/venv/lib/python3.12/site-packages/_pytest/main.py @@ -1,63 +1,79 @@ """Core implementation of the testing process: init, session, runtest loop.""" - -from __future__ import annotations - import argparse -from collections.abc import Callable -from collections.abc import Iterable -from collections.abc import Iterator -from collections.abc import Sequence -from collections.abc import Set as AbstractSet import dataclasses import fnmatch import functools import importlib -import importlib.util import os -from pathlib import Path import sys -from typing import final -from typing import Literal -from typing import overload +from pathlib import Path +from typing import Callable +from typing import Dict +from typing import FrozenSet +from typing import Iterator +from typing import List +from typing import Optional +from typing import Sequence +from typing import Set +from typing import Tuple +from typing import Type from typing import TYPE_CHECKING -import warnings +from typing import Union -import pluggy - -from _pytest import nodes import _pytest._code +from _pytest import nodes +from _pytest.compat import final +from _pytest.compat import overload from _pytest.config import Config from _pytest.config import directory_arg from _pytest.config import ExitCode from _pytest.config import hookimpl from _pytest.config import PytestPluginManager from _pytest.config import UsageError -from _pytest.config.argparsing import OverrideIniAction from _pytest.config.argparsing import Parser -from _pytest.config.compat import PathAwareHookProxy +from _pytest.fixtures import FixtureManager from _pytest.outcomes import exit from _pytest.pathlib import absolutepath from _pytest.pathlib import bestrelpath from _pytest.pathlib import fnmatch_ex from _pytest.pathlib import safe_exists -from _pytest.pathlib import samefile_nofollow -from _pytest.pathlib import scandir +from _pytest.pathlib import visit from _pytest.reports import CollectReport from _pytest.reports import TestReport from _pytest.runner import collect_one_node from _pytest.runner import SetupState -from _pytest.warning_types import PytestWarning if TYPE_CHECKING: - from typing_extensions import Self - - from _pytest.fixtures import FixtureManager + from typing_extensions import Literal def pytest_addoption(parser: Parser) -> None: - group = parser.getgroup("general") - group._addoption( # private to use reserved lower-case short option + parser.addini( + "norecursedirs", + "Directory patterns to avoid for recursion", + type="args", + default=[ + "*.egg", + ".*", + "_darcs", + "build", + "CVS", + "dist", + "node_modules", + "venv", + "{arch}", + ], + ) + parser.addini( + "testpaths", + "Directories to search for tests when no files or directories are given on the " + "command line", + type="args", + default=[], + ) + group = parser.getgroup("general", "Running and selection options") + group._addoption( "-x", "--exitfirst", action="store_const", @@ -65,60 +81,6 @@ def pytest_addoption(parser: Parser) -> None: const=1, help="Exit instantly on first error or failed test", ) - group.addoption( - "--maxfail", - metavar="num", - action="store", - type=int, - dest="maxfail", - default=0, - help="Exit after first num failures or errors", - ) - group.addoption( - "--strict-config", - action=OverrideIniAction, - ini_option="strict_config", - ini_value="true", - help="Enables the strict_config option", - ) - group.addoption( - "--strict-markers", - action=OverrideIniAction, - ini_option="strict_markers", - ini_value="true", - help="Enables the strict_markers option", - ) - group.addoption( - "--strict", - action=OverrideIniAction, - ini_option="strict", - ini_value="true", - help="Enables the strict option", - ) - parser.addini( - "strict_config", - "Any warnings encountered while parsing the `pytest` section of the " - "configuration file raise errors", - type="bool", - # None => fallback to `strict`. - default=None, - ) - parser.addini( - "strict_markers", - "Markers not registered in the `markers` section of the configuration " - "file raise errors", - type="bool", - # None => fallback to `strict`. - default=None, - ) - parser.addini( - "strict", - "Enables all strictness options, currently: " - "strict_config, strict_markers, strict_xfail, strict_parametrization_ids", - type="bool", - default=False, - ) - group = parser.getgroup("pytest-warnings") group.addoption( "-W", @@ -133,6 +95,56 @@ def pytest_addoption(parser: Parser) -> None: "warnings.filterwarnings. " "Processed after -W/--pythonwarnings.", ) + group._addoption( + "--maxfail", + metavar="num", + action="store", + type=int, + dest="maxfail", + default=0, + help="Exit after first num failures or errors", + ) + group._addoption( + "--strict-config", + action="store_true", + help="Any warnings encountered while parsing the `pytest` section of the " + "configuration file raise errors", + ) + group._addoption( + "--strict-markers", + action="store_true", + help="Markers not registered in the `markers` section of the configuration " + "file raise errors", + ) + group._addoption( + "--strict", + action="store_true", + help="(Deprecated) alias to --strict-markers", + ) + group._addoption( + "-c", + "--config-file", + metavar="FILE", + type=str, + dest="inifilename", + help="Load configuration from `FILE` instead of trying to locate one of the " + "implicit configuration files.", + ) + group._addoption( + "--continue-on-collection-errors", + action="store_true", + default=False, + dest="continue_on_collection_errors", + help="Force test execution even if collection errors occur", + ) + group._addoption( + "--rootdir", + action="store", + dest="rootdir", + help="Define root directory for tests. Can be relative path: 'root_dir', './root_dir', " + "'root_dir/another_dir/'; absolute path: '/home/user/root_dir'; path with variables: " + "'$HOME/root_dir'.", + ) group = parser.getgroup("collect", "collection") group.addoption( @@ -195,13 +207,6 @@ def pytest_addoption(parser: Parser) -> None: default=False, help="Don't ignore tests in a local virtualenv directory", ) - group.addoption( - "--continue-on-collection-errors", - action="store_true", - default=False, - dest="continue_on_collection_errors", - help="Force test execution even if collection errors occur", - ) group.addoption( "--import-mode", default="prepend", @@ -210,60 +215,8 @@ def pytest_addoption(parser: Parser) -> None: help="Prepend/append to sys.path when importing test modules and conftest " "files. Default: prepend.", ) - parser.addini( - "norecursedirs", - "Directory patterns to avoid for recursion", - type="args", - default=[ - "*.egg", - ".*", - "_darcs", - "build", - "CVS", - "dist", - "node_modules", - "venv", - "{arch}", - ], - ) - parser.addini( - "testpaths", - "Directories to search for tests when no files or directories are given on the " - "command line", - type="args", - default=[], - ) - parser.addini( - "collect_imported_tests", - "Whether to collect tests in imported modules outside `testpaths`", - type="bool", - default=True, - ) - parser.addini( - "consider_namespace_packages", - type="bool", - default=False, - help="Consider namespace packages when resolving module names during import", - ) group = parser.getgroup("debugconfig", "test session debugging and configuration") - group._addoption( # private to use reserved lower-case short option - "-c", - "--config-file", - metavar="FILE", - type=str, - dest="inifilename", - help="Load configuration from `FILE` instead of trying to locate one of the " - "implicit configuration files.", - ) - group.addoption( - "--rootdir", - action="store", - dest="rootdir", - help="Define root directory for tests. Can be relative path: 'root_dir', './root_dir', " - "'root_dir/another_dir/'; absolute path: '/home/user/root_dir'; path with variables: " - "'$HOME/root_dir'.", - ) group.addoption( "--basetemp", dest="basetemp", @@ -303,8 +256,8 @@ def validate_basetemp(path: str) -> str: def wrap_session( - config: Config, doit: Callable[[Config, Session], int | ExitCode | None] -) -> int | ExitCode: + config: Config, doit: Callable[[Config, "Session"], Optional[Union[int, ExitCode]]] +) -> Union[int, ExitCode]: """Skeleton command line program.""" session = Session.from_config(config) session.exitstatus = ExitCode.OK @@ -323,7 +276,7 @@ def wrap_session( session.exitstatus = ExitCode.TESTS_FAILED except (KeyboardInterrupt, exit.Exception): excinfo = _pytest._code.ExceptionInfo.from_current() - exitstatus: int | ExitCode = ExitCode.INTERRUPTED + exitstatus: Union[int, ExitCode] = ExitCode.INTERRUPTED if isinstance(excinfo.value, exit.Exception): if excinfo.value.returncode is not None: exitstatus = excinfo.value.returncode @@ -361,11 +314,11 @@ def wrap_session( return session.exitstatus -def pytest_cmdline_main(config: Config) -> int | ExitCode: +def pytest_cmdline_main(config: Config) -> Union[int, ExitCode]: return wrap_session(config, _main) -def _main(config: Config, session: Session) -> int | ExitCode | None: +def _main(config: Config, session: "Session") -> Optional[Union[int, ExitCode]]: """Default command line protocol for initialization, session, running tests and reporting.""" config.hook.pytest_collection(session=session) @@ -378,14 +331,15 @@ def _main(config: Config, session: Session) -> int | ExitCode | None: return None -def pytest_collection(session: Session) -> None: +def pytest_collection(session: "Session") -> None: session.perform_collect() -def pytest_runtestloop(session: Session) -> bool: +def pytest_runtestloop(session: "Session") -> bool: if session.testsfailed and not session.config.option.continue_on_collection_errors: raise session.Interrupted( - f"{session.testsfailed} error{'s' if session.testsfailed != 1 else ''} during collection" + "%d error%s during collection" + % (session.testsfailed, "s" if session.testsfailed != 1 else "") ) if session.config.option.collectonly: @@ -403,31 +357,27 @@ def pytest_runtestloop(session: Session) -> bool: def _in_venv(path: Path) -> bool: """Attempt to detect if ``path`` is the root of a Virtual Environment by - checking for the existence of the pyvenv.cfg file. - - [https://peps.python.org/pep-0405/] - - For regression protection we also check for conda environments that do not include pyenv.cfg yet -- - https://github.com/conda/conda/issues/13337 is the conda issue tracking adding pyenv.cfg. - - Checking for the `conda-meta/history` file per https://github.com/pytest-dev/pytest/issues/12652#issuecomment-2246336902. - - """ + checking for the existence of the appropriate activate script.""" + bindir = path.joinpath("Scripts" if sys.platform.startswith("win") else "bin") try: - return ( - path.joinpath("pyvenv.cfg").is_file() - or path.joinpath("conda-meta", "history").is_file() - ) + if not bindir.is_dir(): + return False except OSError: return False + activates = ( + "activate", + "activate.csh", + "activate.fish", + "Activate", + "Activate.bat", + "Activate.ps1", + ) + return any(fname.name in activates for fname in bindir.iterdir()) -def pytest_ignore_collect(collection_path: Path, config: Config) -> bool | None: - if collection_path.name == "__pycache__": - return True - +def pytest_ignore_collect(collection_path: Path, config: Config) -> Optional[bool]: ignore_paths = config._getconftest_pathlist( - "collect_ignore", path=collection_path.parent + "collect_ignore", path=collection_path.parent, rootpath=config.rootpath ) ignore_paths = ignore_paths or [] excludeopt = config.getoption("ignore") @@ -438,7 +388,7 @@ def pytest_ignore_collect(collection_path: Path, config: Config) -> bool | None: return True ignore_globs = config._getconftest_pathlist( - "collect_ignore_glob", path=collection_path.parent + "collect_ignore_glob", path=collection_path.parent, rootpath=config.rootpath ) ignore_globs = ignore_globs or [] excludeglobopt = config.getoption("ignore_glob") @@ -460,13 +410,7 @@ def pytest_ignore_collect(collection_path: Path, config: Config) -> bool | None: return None -def pytest_collect_directory( - path: Path, parent: nodes.Collector -) -> nodes.Collector | None: - return Dir.from_parent(parent, path=path) - - -def pytest_collection_modifyitems(items: list[nodes.Item], config: Config) -> None: +def pytest_collection_modifyitems(items: List[nodes.Item], config: Config) -> None: deselect_prefixes = tuple(config.getoption("deselect") or []) if not deselect_prefixes: return @@ -485,15 +429,11 @@ def pytest_collection_modifyitems(items: list[nodes.Item], config: Config) -> No class FSHookProxy: - def __init__( - self, - pm: PytestPluginManager, - remove_mods: AbstractSet[object], - ) -> None: + def __init__(self, pm: PytestPluginManager, remove_mods) -> None: self.pm = pm self.remove_mods = remove_mods - def __getattr__(self, name: str) -> pluggy.HookCaller: + def __getattr__(self, name: str): x = self.pm.subset_hook_caller(name, remove_plugins=self.remove_mods) self.__dict__[name] = x return x @@ -510,7 +450,7 @@ class Failed(Exception): @dataclasses.dataclass -class _bestrelpath_cache(dict[Path, str]): +class _bestrelpath_cache(Dict[Path, str]): __slots__ = ("path",) path: Path @@ -522,59 +462,7 @@ class _bestrelpath_cache(dict[Path, str]): @final -class Dir(nodes.Directory): - """Collector of files in a file system directory. - - .. versionadded:: 8.0 - - .. note:: - - Python directories with an `__init__.py` file are instead collected by - :class:`~pytest.Package` by default. Both are :class:`~pytest.Directory` - collectors. - """ - - @classmethod - def from_parent( # type: ignore[override] - cls, - parent: nodes.Collector, - *, - path: Path, - ) -> Self: - """The public constructor. - - :param parent: The parent collector of this Dir. - :param path: The directory's path. - :type path: pathlib.Path - """ - return super().from_parent(parent=parent, path=path) - - def collect(self) -> Iterable[nodes.Item | nodes.Collector]: - config = self.config - col: nodes.Collector | None - cols: Sequence[nodes.Collector] - ihook = self.ihook - for direntry in scandir(self.path): - if direntry.is_dir(): - path = Path(direntry.path) - if not self.session.isinitpath(path, with_parents=True): - if ihook.pytest_ignore_collect(collection_path=path, config=config): - continue - col = ihook.pytest_collect_directory(path=path, parent=self) - if col is not None: - yield col - - elif direntry.is_file(): - path = Path(direntry.path) - if not self.session.isinitpath(path): - if ihook.pytest_ignore_collect(collection_path=path, config=config): - continue - cols = ihook.pytest_collect_file(file_path=path, parent=self) - yield from cols - - -@final -class Session(nodes.Collector): +class Session(nodes.FSCollector): """The root of the collection tree. ``Session`` collects the initial paths given as arguments to pytest. @@ -586,11 +474,10 @@ class Session(nodes.Collector): _setupstate: SetupState # Set on the session by fixtures.pytest_sessionstart. _fixturemanager: FixtureManager - exitstatus: int | ExitCode + exitstatus: Union[int, ExitCode] def __init__(self, config: Config) -> None: super().__init__( - name="", path=config.rootpath, fspath=None, parent=None, @@ -600,68 +487,28 @@ class Session(nodes.Collector): ) self.testsfailed = 0 self.testscollected = 0 - self._shouldstop: bool | str = False - self._shouldfail: bool | str = False + self.shouldstop: Union[bool, str] = False + self.shouldfail: Union[bool, str] = False self.trace = config.trace.root.get("collection") - self._initialpaths: frozenset[Path] = frozenset() - self._initialpaths_with_parents: frozenset[Path] = frozenset() - self._notfound: list[tuple[str, Sequence[nodes.Collector]]] = [] - self._initial_parts: list[CollectionArgument] = [] - self._collection_cache: dict[nodes.Collector, CollectReport] = {} - self.items: list[nodes.Item] = [] + self._initialpaths: FrozenSet[Path] = frozenset() - self._bestrelpathcache: dict[Path, str] = _bestrelpath_cache(config.rootpath) + self._bestrelpathcache: Dict[Path, str] = _bestrelpath_cache(config.rootpath) self.config.pluginmanager.register(self, name="session") @classmethod - def from_config(cls, config: Config) -> Session: + def from_config(cls, config: Config) -> "Session": session: Session = cls._create(config=config) return session def __repr__(self) -> str: - return ( - f"<{self.__class__.__name__} {self.name} " - f"exitstatus=%r " - f"testsfailed={self.testsfailed} " - f"testscollected={self.testscollected}>" - ) % getattr(self, "exitstatus", "") - - @property - def shouldstop(self) -> bool | str: - return self._shouldstop - - @shouldstop.setter - def shouldstop(self, value: bool | str) -> None: - # The runner checks shouldfail and assumes that if it is set we are - # definitely stopping, so prevent unsetting it. - if value is False and self._shouldstop: - warnings.warn( - PytestWarning( - "session.shouldstop cannot be unset after it has been set; ignoring." - ), - stacklevel=2, - ) - return - self._shouldstop = value - - @property - def shouldfail(self) -> bool | str: - return self._shouldfail - - @shouldfail.setter - def shouldfail(self, value: bool | str) -> None: - # The runner checks shouldfail and assumes that if it is set we are - # definitely stopping, so prevent unsetting it. - if value is False and self._shouldfail: - warnings.warn( - PytestWarning( - "session.shouldfail cannot be unset after it has been set; ignoring." - ), - stacklevel=2, - ) - return - self._shouldfail = value + return "<%s %s exitstatus=%r testsfailed=%d testscollected=%d>" % ( + self.__class__.__name__, + self.name, + getattr(self, "exitstatus", ""), + self.testsfailed, + self.testscollected, + ) @property def startpath(self) -> Path: @@ -683,100 +530,92 @@ class Session(nodes.Collector): raise self.Interrupted(self.shouldstop) @hookimpl(tryfirst=True) - def pytest_runtest_logreport(self, report: TestReport | CollectReport) -> None: + def pytest_runtest_logreport( + self, report: Union[TestReport, CollectReport] + ) -> None: if report.failed and not hasattr(report, "wasxfail"): self.testsfailed += 1 maxfail = self.config.getvalue("maxfail") if maxfail and self.testsfailed >= maxfail: - self.shouldfail = f"stopping after {self.testsfailed} failures" + self.shouldfail = "stopping after %d failures" % (self.testsfailed) pytest_collectreport = pytest_runtest_logreport - def isinitpath( - self, - path: str | os.PathLike[str], - *, - with_parents: bool = False, - ) -> bool: - """Is path an initial path? - - An initial path is a path explicitly given to pytest on the command - line. - - :param with_parents: - If set, also return True if the path is a parent of an initial path. - - .. versionchanged:: 8.0 - Added the ``with_parents`` parameter. - """ + def isinitpath(self, path: Union[str, "os.PathLike[str]"]) -> bool: # Optimization: Path(Path(...)) is much slower than isinstance. path_ = path if isinstance(path, Path) else Path(path) - if with_parents: - return path_ in self._initialpaths_with_parents - else: - return path_ in self._initialpaths + return path_ in self._initialpaths - def gethookproxy(self, fspath: os.PathLike[str]) -> pluggy.HookRelay: + def gethookproxy(self, fspath: "os.PathLike[str]"): # Optimization: Path(Path(...)) is much slower than isinstance. path = fspath if isinstance(fspath, Path) else Path(fspath) pm = self.config.pluginmanager # Check if we have the common case of running # hooks with all conftest.py files. - my_conftestmodules = pm._getconftestmodules(path) + my_conftestmodules = pm._getconftestmodules( + path, + self.config.getoption("importmode"), + rootpath=self.config.rootpath, + ) remove_mods = pm._conftest_plugins.difference(my_conftestmodules) - proxy: pluggy.HookRelay if remove_mods: - # One or more conftests are not in use at this path. - proxy = PathAwareHookProxy(FSHookProxy(pm, remove_mods)) # type: ignore[arg-type,assignment] + # One or more conftests are not in use at this fspath. + from .config.compat import PathAwareHookProxy + + proxy = PathAwareHookProxy(FSHookProxy(pm, remove_mods)) else: # All plugins are active for this fspath. proxy = self.config.hook return proxy - def _collect_path( - self, - path: Path, - path_cache: dict[Path, Sequence[nodes.Collector]], + def _recurse(self, direntry: "os.DirEntry[str]") -> bool: + if direntry.name == "__pycache__": + return False + fspath = Path(direntry.path) + ihook = self.gethookproxy(fspath.parent) + if ihook.pytest_ignore_collect(collection_path=fspath, config=self.config): + return False + return True + + def _collectfile( + self, fspath: Path, handle_dupes: bool = True ) -> Sequence[nodes.Collector]: - """Create a Collector for the given path. + assert ( + fspath.is_file() + ), "{!r} is not a file (isdir={!r}, exists={!r}, islink={!r})".format( + fspath, fspath.is_dir(), fspath.exists(), fspath.is_symlink() + ) + ihook = self.gethookproxy(fspath) + if not self.isinitpath(fspath): + if ihook.pytest_ignore_collect(collection_path=fspath, config=self.config): + return () - `path_cache` makes it so the same Collectors are returned for the same - path. - """ - if path in path_cache: - return path_cache[path] + if handle_dupes: + keepduplicates = self.config.getoption("keepduplicates") + if not keepduplicates: + duplicate_paths = self.config.pluginmanager._duplicatepaths + if fspath in duplicate_paths: + return () + else: + duplicate_paths.add(fspath) - if path.is_dir(): - ihook = self.gethookproxy(path.parent) - col: nodes.Collector | None = ihook.pytest_collect_directory( - path=path, parent=self - ) - cols: Sequence[nodes.Collector] = (col,) if col is not None else () - - elif path.is_file(): - ihook = self.gethookproxy(path) - cols = ihook.pytest_collect_file(file_path=path, parent=self) - - else: - # Broken symlink or invalid/missing file. - cols = () - - path_cache[path] = cols - return cols + return ihook.pytest_collect_file(file_path=fspath, parent=self) # type: ignore[no-any-return] @overload def perform_collect( - self, args: Sequence[str] | None = ..., genitems: Literal[True] = ... - ) -> Sequence[nodes.Item]: ... + self, args: Optional[Sequence[str]] = ..., genitems: "Literal[True]" = ... + ) -> Sequence[nodes.Item]: + ... @overload - def perform_collect( - self, args: Sequence[str] | None = ..., genitems: bool = ... - ) -> Sequence[nodes.Item | nodes.Collector]: ... + def perform_collect( # noqa: F811 + self, args: Optional[Sequence[str]] = ..., genitems: bool = ... + ) -> Sequence[Union[nodes.Item, nodes.Collector]]: + ... - def perform_collect( - self, args: Sequence[str] | None = None, genitems: bool = True - ) -> Sequence[nodes.Item | nodes.Collector]: + def perform_collect( # noqa: F811 + self, args: Optional[Sequence[str]] = None, genitems: bool = True + ) -> Sequence[Union[nodes.Item, nodes.Collector]]: """Perform the collection phase for this session. This is called by the default :hook:`pytest_collection` hook @@ -796,44 +635,24 @@ class Session(nodes.Collector): self.trace("perform_collect", self, args) self.trace.root.indent += 1 + self._notfound: List[Tuple[str, Sequence[nodes.Collector]]] = [] + self._initial_parts: List[Tuple[Path, List[str]]] = [] + self.items: List[nodes.Item] = [] + hook = self.config.hook - self._notfound = [] - self._initial_parts = [] - self._collection_cache = {} - self.items = [] - items: Sequence[nodes.Item | nodes.Collector] = self.items - consider_namespace_packages: bool = self.config.getini( - "consider_namespace_packages" - ) + items: Sequence[Union[nodes.Item, nodes.Collector]] = self.items try: - initialpaths: list[Path] = [] - initialpaths_with_parents: list[Path] = [] - - collection_args = [ - resolve_collection_argument( + initialpaths: List[Path] = [] + for arg in args: + fspath, parts = resolve_collection_argument( self.config.invocation_params.dir, arg, - i, as_pypath=self.config.option.pyargs, - consider_namespace_packages=consider_namespace_packages, ) - for i, arg in enumerate(args) - ] - - if not self.config.getoption("keepduplicates"): - # Normalize the collection arguments -- remove duplicates and overlaps. - self._initial_parts = normalize_collection_arguments(collection_args) - else: - self._initial_parts = collection_args - - for collection_argument in self._initial_parts: - initialpaths.append(collection_argument.path) - initialpaths_with_parents.append(collection_argument.path) - initialpaths_with_parents.extend(collection_argument.path.parents) + self._initial_parts.append((fspath, parts)) + initialpaths.append(fspath) self._initialpaths = frozenset(initialpaths) - self._initialpaths_with_parents = frozenset(initialpaths_with_parents) - rep = collect_one_node(self) self.ihook.pytest_collectreport(report=rep) self.trace.root.indent -= 1 @@ -842,13 +661,12 @@ class Session(nodes.Collector): for arg, collectors in self._notfound: if collectors: errors.append( - f"not found: {arg}\n(no match in any of {collectors!r})" + f"not found: {arg}\n(no name {arg!r} in any of {collectors!r})" ) else: errors.append(f"found no collectors for {arg}") raise UsageError(*errors) - if not genitems: items = rep.result else: @@ -861,225 +679,193 @@ class Session(nodes.Collector): session=self, config=self.config, items=items ) finally: - self._notfound = [] - self._initial_parts = [] - self._collection_cache = {} hook.pytest_collection_finish(session=self) - if genitems: - self.testscollected = len(items) - + self.testscollected = len(items) return items - def _collect_one_node( - self, - node: nodes.Collector, - handle_dupes: bool = True, - ) -> tuple[CollectReport, bool]: - if node in self._collection_cache and handle_dupes: - rep = self._collection_cache[node] - return rep, True - else: - rep = collect_one_node(node) - self._collection_cache[node] = rep - return rep, False + def collect(self) -> Iterator[Union[nodes.Item, nodes.Collector]]: + from _pytest.python import Package - def collect(self) -> Iterator[nodes.Item | nodes.Collector]: - # This is a cache for the root directories of the initial paths. - # We can't use collection_cache for Session because of its special - # role as the bootstrapping collector. - path_cache: dict[Path, Sequence[nodes.Collector]] = {} + # Keep track of any collected nodes in here, so we don't duplicate fixtures. + node_cache1: Dict[Path, Sequence[nodes.Collector]] = {} + node_cache2: Dict[Tuple[Type[nodes.Collector], Path], nodes.Collector] = {} - pm = self.config.pluginmanager + # Keep track of any collected collectors in matchnodes paths, so they + # are not collected more than once. + matchnodes_cache: Dict[Tuple[Type[nodes.Collector], str], CollectReport] = {} - for collection_argument in self._initial_parts: - self.trace("processing argument", collection_argument) + # Directories of pkgs with dunder-init files. + pkg_roots: Dict[Path, Package] = {} + + for argpath, names in self._initial_parts: + self.trace("processing argument", (argpath, names)) self.trace.root.indent += 1 - argpath = collection_argument.path - names = collection_argument.parts - parametrization = collection_argument.parametrization - module_name = collection_argument.module_name + # Start with a Session root, and delve to argpath item (dir or file) + # and stack all Packages found on the way. + # No point in finding packages when collecting doctests. + if not self.config.getoption("doctestmodules", False): + pm = self.config.pluginmanager + for parent in (argpath, *argpath.parents): + if not pm._is_in_confcutdir(argpath): + break - # resolve_collection_argument() ensures this. + if parent.is_dir(): + pkginit = parent / "__init__.py" + if pkginit.is_file() and pkginit not in node_cache1: + col = self._collectfile(pkginit, handle_dupes=False) + if col: + if isinstance(col[0], Package): + pkg_roots[parent] = col[0] + node_cache1[col[0].path] = [col[0]] + + # If it's a directory argument, recurse and look for any Subpackages. + # Let the Package collector deal with subnodes, don't collect here. if argpath.is_dir(): assert not names, f"invalid arg {(argpath, names)!r}" - paths = [argpath] - # Add relevant parents of the path, from the root, e.g. - # /a/b/c.py -> [/, /a, /a/b, /a/b/c.py] - if module_name is None: - # Paths outside of the confcutdir should not be considered. - for path in argpath.parents: - if not pm._is_in_confcutdir(path): - break - paths.insert(0, path) - else: - # For --pyargs arguments, only consider paths matching the module - # name. Paths beyond the package hierarchy are not included. - module_name_parts = module_name.split(".") - for i, path in enumerate(argpath.parents, 2): - if i > len(module_name_parts) or path.stem != module_name_parts[-i]: - break - paths.insert(0, path) - - # Start going over the parts from the root, collecting each level - # and discarding all nodes which don't match the level's part. - any_matched_in_initial_part = False - notfound_collectors = [] - work: list[tuple[nodes.Collector | nodes.Item, list[Path | str]]] = [ - (self, [*paths, *names]) - ] - while work: - matchnode, matchparts = work.pop() - - # Pop'd all of the parts, this is a match. - if not matchparts: - yield matchnode - any_matched_in_initial_part = True - continue - - # Should have been matched by now, discard. - if not isinstance(matchnode, nodes.Collector): - continue - - # Collect this level of matching. - # Collecting Session (self) is done directly to avoid endless - # recursion to this function. - subnodes: Sequence[nodes.Collector | nodes.Item] - if isinstance(matchnode, Session): - assert isinstance(matchparts[0], Path) - subnodes = matchnode._collect_path(matchparts[0], path_cache) - else: - # For backward compat, files given directly multiple - # times on the command line should not be deduplicated. - handle_dupes = not ( - len(matchparts) == 1 - and isinstance(matchparts[0], Path) - and matchparts[0].is_file() - ) - rep, duplicate = self._collect_one_node(matchnode, handle_dupes) - if not duplicate and not rep.passed: - # Report collection failures here to avoid failing to - # run some test specified in the command line because - # the module could not be imported (#134). - matchnode.ihook.pytest_collectreport(report=rep) - if not rep.passed: + seen_dirs: Set[Path] = set() + for direntry in visit(argpath, self._recurse): + if not direntry.is_file(): continue - subnodes = rep.result - # Prune this level. - any_matched_in_collector = False - for node in reversed(subnodes): - # Path part e.g. `/a/b/` in `/a/b/test_file.py::TestIt::test_it`. - if isinstance(matchparts[0], Path): - is_match = node.path == matchparts[0] - if sys.platform == "win32" and not is_match: - # In case the file paths do not match, fallback to samefile() to - # account for short-paths on Windows (#11895). But use a version - # which doesn't resolve symlinks, otherwise we might match the - # same file more than once (#12039). - is_match = samefile_nofollow(node.path, matchparts[0]) + path = Path(direntry.path) + dirpath = path.parent - # Name part e.g. `TestIt` in `/a/b/test_file.py::TestIt::test_it`. - else: - if len(matchparts) == 1: - # This the last part, one parametrization goes. - if parametrization is not None: - # A parametrized arg must match exactly. - is_match = node.name == matchparts[0] + parametrization - else: - # A non-parameterized arg matches all parametrizations (if any). - # TODO: Remove the hacky split once the collection structure - # contains parametrization. - is_match = node.name.split("[")[0] == matchparts[0] + if dirpath not in seen_dirs: + # Collect packages first. + seen_dirs.add(dirpath) + pkginit = dirpath / "__init__.py" + if pkginit.exists(): + for x in self._collectfile(pkginit): + yield x + if isinstance(x, Package): + pkg_roots[dirpath] = x + if dirpath in pkg_roots: + # Do not collect packages here. + continue + + for x in self._collectfile(path): + key2 = (type(x), x.path) + if key2 in node_cache2: + yield node_cache2[key2] else: - is_match = node.name == matchparts[0] - if is_match: - work.append((node, matchparts[1:])) - any_matched_in_collector = True + node_cache2[key2] = x + yield x + else: + assert argpath.is_file() - if not any_matched_in_collector: - notfound_collectors.append(matchnode) + if argpath in node_cache1: + col = node_cache1[argpath] + else: + collect_root = pkg_roots.get(argpath.parent, self) + col = collect_root._collectfile(argpath, handle_dupes=False) + if col: + node_cache1[argpath] = col - if not any_matched_in_initial_part: - report_arg = "::".join((str(argpath), *names)) - self._notfound.append((report_arg, notfound_collectors)) + matching = [] + work: List[ + Tuple[Sequence[Union[nodes.Item, nodes.Collector]], Sequence[str]] + ] = [(col, names)] + while work: + self.trace("matchnodes", col, names) + self.trace.root.indent += 1 + + matchnodes, matchnames = work.pop() + for node in matchnodes: + if not matchnames: + matching.append(node) + continue + if not isinstance(node, nodes.Collector): + continue + key = (type(node), node.nodeid) + if key in matchnodes_cache: + rep = matchnodes_cache[key] + else: + rep = collect_one_node(node) + matchnodes_cache[key] = rep + if rep.passed: + submatchnodes = [] + for r in rep.result: + # TODO: Remove parametrized workaround once collection structure contains + # parametrization. + if ( + r.name == matchnames[0] + or r.name.split("[")[0] == matchnames[0] + ): + submatchnodes.append(r) + if submatchnodes: + work.append((submatchnodes, matchnames[1:])) + else: + # Report collection failures here to avoid failing to run some test + # specified in the command line because the module could not be + # imported (#134). + node.ihook.pytest_collectreport(report=rep) + + self.trace("matchnodes finished -> ", len(matching), "nodes") + self.trace.root.indent -= 1 + + if not matching: + report_arg = "::".join((str(argpath), *names)) + self._notfound.append((report_arg, col)) + continue + + # If __init__.py was the only file requested, then the matched + # node will be the corresponding Package (by default), and the + # first yielded item will be the __init__ Module itself, so + # just use that. If this special case isn't taken, then all the + # files in the package will be yielded. + if argpath.name == "__init__.py" and isinstance(matching[0], Package): + try: + yield next(iter(matching[0].collect())) + except StopIteration: + # The package collects nothing with only an __init__.py + # file in it, which gets ignored by the default + # "python_files" option. + pass + continue + + yield from matching self.trace.root.indent -= 1 - def genitems(self, node: nodes.Item | nodes.Collector) -> Iterator[nodes.Item]: + def genitems( + self, node: Union[nodes.Item, nodes.Collector] + ) -> Iterator[nodes.Item]: self.trace("genitems", node) if isinstance(node, nodes.Item): node.ihook.pytest_itemcollected(item=node) yield node else: assert isinstance(node, nodes.Collector) - # For backward compat, dedup only applies to files. - handle_dupes = not isinstance(node, nodes.File) - rep, duplicate = self._collect_one_node(node, handle_dupes) + rep = collect_one_node(node) if rep.passed: for subnode in rep.result: yield from self.genitems(subnode) - if not duplicate: - node.ihook.pytest_collectreport(report=rep) + node.ihook.pytest_collectreport(report=rep) -def search_pypath( - module_name: str, *, consider_namespace_packages: bool = False -) -> str | None: - """Search sys.path for the given a dotted module name, and return its file - system path if found.""" +def search_pypath(module_name: str) -> str: + """Search sys.path for the given a dotted module name, and return its file system path.""" try: spec = importlib.util.find_spec(module_name) # AttributeError: looks like package module, but actually filename # ImportError: module does not exist # ValueError: not a module name except (AttributeError, ImportError, ValueError): - return None - - if spec is None: - return None - - if ( - spec.submodule_search_locations is None - or len(spec.submodule_search_locations) == 0 - ): - # Must be a simple module. + return module_name + if spec is None or spec.origin is None or spec.origin == "namespace": + return module_name + elif spec.submodule_search_locations: + return os.path.dirname(spec.origin) + else: return spec.origin - if consider_namespace_packages: - # If submodule_search_locations is set, it's a package (regular or namespace). - # Typically there is a single entry, but documentation claims it can be empty too - # (e.g. if the package has no physical location). - return spec.submodule_search_locations[0] - - if spec.origin is None: - # This is only the case for namespace packages - return None - - return os.path.dirname(spec.origin) - - -@dataclasses.dataclass(frozen=True) -class CollectionArgument: - """A resolved collection argument.""" - - path: Path - parts: Sequence[str] - parametrization: str | None - module_name: str | None - original_index: int - def resolve_collection_argument( - invocation_path: Path, - arg: str, - arg_index: int, - *, - as_pypath: bool = False, - consider_namespace_packages: bool = False, -) -> CollectionArgument: + invocation_path: Path, arg: str, *, as_pypath: bool = False +) -> Tuple[Path, List[str]]: """Parse path arguments optionally containing selection parts and return (fspath, names). Command-line arguments can point to files and/or directories, and optionally contain @@ -1087,45 +873,27 @@ def resolve_collection_argument( "pkg/tests/test_foo.py::TestClass::test_foo" - This function ensures the path exists, and returns a resolved `CollectionArgument`: + This function ensures the path exists, and returns a tuple: - CollectionArgument( - path=Path("/full/path/to/pkg/tests/test_foo.py"), - parts=["TestClass", "test_foo"], - module_name=None, - ) + (Path("/full/path/to/pkg/tests/test_foo.py"), ["TestClass", "test_foo"]) When as_pypath is True, expects that the command-line argument actually contains module paths instead of file-system paths: - "pkg.tests.test_foo::TestClass::test_foo[a,b]" + "pkg.tests.test_foo::TestClass::test_foo" In which case we search sys.path for a matching module, and then return the *path* to the - found module, which may look like this: - - CollectionArgument( - path=Path("/home/u/myvenv/lib/site-packages/pkg/tests/test_foo.py"), - parts=["TestClass", "test_foo"], - parametrization="[a,b]", - module_name="pkg.tests.test_foo", - ) + found module. If the path doesn't exist, raise UsageError. If the path is a directory and selection parts are present, raise UsageError. """ - base, squacket, rest = arg.partition("[") + base, squacket, rest = str(arg).partition("[") strpath, *parts = base.split("::") - if squacket and not parts: - raise UsageError(f"path cannot contain [] parametrization: {arg}") - parametrization = f"{squacket}{rest}" if squacket else None - module_name = None + if parts: + parts[-1] = f"{parts[-1]}{squacket}{rest}" if as_pypath: - pyarg_strpath = search_pypath( - strpath, consider_namespace_packages=consider_namespace_packages - ) - if pyarg_strpath is not None: - module_name = strpath - strpath = pyarg_strpath + strpath = search_pypath(strpath) fspath = invocation_path / strpath fspath = absolutepath(fspath) if not safe_exists(fspath): @@ -1142,62 +910,4 @@ def resolve_collection_argument( else "directory argument cannot contain :: selection parts: {arg}" ) raise UsageError(msg.format(arg=arg)) - return CollectionArgument( - path=fspath, - parts=parts, - parametrization=parametrization, - module_name=module_name, - original_index=arg_index, - ) - - -def is_collection_argument_subsumed_by( - arg: CollectionArgument, by: CollectionArgument -) -> bool: - """Check if `arg` is subsumed (contained) by `by`.""" - # First check path subsumption. - if by.path != arg.path: - # `by` subsumes `arg` if `by` is a parent directory of `arg` and has no - # parts (collects everything in that directory). - if not by.parts: - return arg.path.is_relative_to(by.path) - return False - # Paths are equal, check parts. - # For example: ("TestClass",) is a prefix of ("TestClass", "test_method"). - if len(by.parts) > len(arg.parts) or arg.parts[: len(by.parts)] != by.parts: - return False - # Paths and parts are equal, check parametrization. - # A `by` without parametrization (None) matches everything, e.g. - # `pytest x.py::test_it` matches `x.py::test_it[0]`. Otherwise must be - # exactly equal. - if by.parametrization is not None and by.parametrization != arg.parametrization: - return False - return True - - -def normalize_collection_arguments( - collection_args: Sequence[CollectionArgument], -) -> list[CollectionArgument]: - """Normalize collection arguments to eliminate overlapping paths and parts. - - Detects when collection arguments overlap in either paths or parts and only - keeps the shorter prefix, or the earliest argument if duplicate, preserving - order. The result is prefix-free. - """ - # A quadratic algorithm is not acceptable since large inputs are possible. - # So this uses an O(n*log(n)) algorithm which takes advantage of the - # property that after sorting, a collection argument will immediately - # precede collection arguments it subsumes. An O(n) algorithm is not worth - # it. - collection_args_sorted = sorted( - collection_args, - key=lambda arg: (arg.path, arg.parts, arg.parametrization or ""), - ) - normalized: list[CollectionArgument] = [] - last_kept = None - for arg in collection_args_sorted: - if last_kept is None or not is_collection_argument_subsumed_by(arg, last_kept): - normalized.append(arg) - last_kept = arg - normalized.sort(key=lambda arg: arg.original_index) - return normalized + return fspath, parts diff --git a/Backend/venv/lib/python3.12/site-packages/_pytest/mark/__init__.py b/Backend/venv/lib/python3.12/site-packages/_pytest/mark/__init__.py index 841d7811..de46b4c8 100644 --- a/Backend/venv/lib/python3.12/site-packages/_pytest/mark/__init__.py +++ b/Backend/venv/lib/python3.12/site-packages/_pytest/mark/__init__.py @@ -1,19 +1,16 @@ """Generic mechanism for marking and selecting python functions.""" - -from __future__ import annotations - -import collections -from collections.abc import Collection -from collections.abc import Iterable -from collections.abc import Set as AbstractSet import dataclasses +from typing import AbstractSet +from typing import Collection +from typing import List +from typing import Optional from typing import TYPE_CHECKING +from typing import Union from .expression import Expression -from .structures import _HiddenParam +from .expression import ParseError from .structures import EMPTY_PARAMETERSET_OPTION from .structures import get_empty_parameterset_mark -from .structures import HIDDEN_PARAM from .structures import Mark from .structures import MARK_GEN from .structures import MarkDecorator @@ -23,17 +20,14 @@ from _pytest.config import Config from _pytest.config import ExitCode from _pytest.config import hookimpl from _pytest.config import UsageError -from _pytest.config.argparsing import NOT_SET from _pytest.config.argparsing import Parser from _pytest.stash import StashKey - if TYPE_CHECKING: from _pytest.nodes import Item __all__ = [ - "HIDDEN_PARAM", "MARK_GEN", "Mark", "MarkDecorator", @@ -43,13 +37,13 @@ __all__ = [ ] -old_mark_config_key = StashKey[Config | None]() +old_mark_config_key = StashKey[Optional[Config]]() def param( *values: object, - marks: MarkDecorator | Collection[MarkDecorator | Mark] = (), - id: str | _HiddenParam | None = None, + marks: Union[MarkDecorator, Collection[Union[MarkDecorator, Mark]]] = (), + id: Optional[str] = None, ) -> ParameterSet: """Specify a parameter in `pytest.mark.parametrize`_ calls or :ref:`parametrized fixtures `. @@ -67,34 +61,22 @@ def param( assert eval(test_input) == expected :param values: Variable args of the values of the parameter set, in order. - - :param marks: - A single mark or a list of marks to be applied to this parameter set. - - :ref:`pytest.mark.usefixtures ` cannot be added via this parameter. - - :type id: str | Literal[pytest.HIDDEN_PARAM] | None - :param id: - The id to attribute to this parameter set. - - .. versionadded:: 8.4 - :ref:`hidden-param` means to hide the parameter set - from the test name. Can only be used at most 1 time, as - test names need to be unique. + :param marks: A single mark or a list of marks to be applied to this parameter set. + :param id: The id to attribute to this parameter set. """ return ParameterSet.param(*values, marks=marks, id=id) def pytest_addoption(parser: Parser) -> None: group = parser.getgroup("general") - group._addoption( # private to use reserved lower-case short option + group._addoption( "-k", action="store", dest="keyword", default="", metavar="EXPRESSION", help="Only run tests which match the given substring expression. " - "An expression is a Python evaluable expression " + "An expression is a Python evaluatable expression " "where all names are substring-matched against test names " "and their parent classes. Example: -k 'test_method or test_" "other' matches all test functions and classes whose name " @@ -107,7 +89,7 @@ def pytest_addoption(parser: Parser) -> None: "The matching is case-insensitive.", ) - group._addoption( # private to use reserved lower-case short option + group._addoption( "-m", action="store", dest="markexpr", @@ -123,12 +105,12 @@ def pytest_addoption(parser: Parser) -> None: help="show markers (builtin, plugin and per-project ones).", ) - parser.addini("markers", "Register new markers for test functions", "linelist") + parser.addini("markers", "Markers for test functions", "linelist") parser.addini(EMPTY_PARAMETERSET_OPTION, "Default marker for empty parametersets") @hookimpl(tryfirst=True) -def pytest_cmdline_main(config: Config) -> int | ExitCode | None: +def pytest_cmdline_main(config: Config) -> Optional[Union[int, ExitCode]]: import _pytest.config if config.option.markers: @@ -138,7 +120,7 @@ def pytest_cmdline_main(config: Config) -> int | ExitCode | None: parts = line.split(":", 1) name = parts[0] rest = parts[1] if len(parts) == 2 else "" - tw.write(f"@pytest.mark.{name}:", bold=True) + tw.write("@pytest.mark.%s:" % name, bold=True) tw.line(rest) tw.line() config._ensure_unconfigure() @@ -167,22 +149,15 @@ class KeywordMatcher: _names: AbstractSet[str] @classmethod - def from_item(cls, item: Item) -> KeywordMatcher: + def from_item(cls, item: "Item") -> "KeywordMatcher": mapped_names = set() - # Add the names of the current item and any parent items, - # except the Session and root Directory's which are not - # interesting for matching. + # Add the names of the current item and any parent items. import pytest for node in item.listchain(): - if isinstance(node, pytest.Session): - continue - if isinstance(node, pytest.Directory) and isinstance( - node.parent, pytest.Session - ): - continue - mapped_names.add(node.name) + if not isinstance(node, pytest.Session): + mapped_names.add(node.name) # Add the names added as extra keywords to current or parent items. mapped_names.update(item.listextrakeywords()) @@ -197,14 +172,17 @@ class KeywordMatcher: return cls(mapped_names) - def __call__(self, subname: str, /, **kwargs: str | int | bool | None) -> bool: - if kwargs: - raise UsageError("Keyword expressions do not support call parameters.") + def __call__(self, subname: str) -> bool: subname = subname.lower() - return any(subname in name.lower() for name in self._names) + names = (name.lower() for name in self._names) + + for name in names: + if subname in name: + return True + return False -def deselect_by_keyword(items: list[Item], config: Config) -> None: +def deselect_by_keyword(items: "List[Item]", config: Config) -> None: keywordexpr = config.option.keyword.lstrip() if not keywordexpr: return @@ -231,37 +209,29 @@ class MarkMatcher: Tries to match on any marker names, attached to the given colitem. """ - __slots__ = ("own_mark_name_mapping",) + __slots__ = ("own_mark_names",) - own_mark_name_mapping: dict[str, list[Mark]] + own_mark_names: AbstractSet[str] @classmethod - def from_markers(cls, markers: Iterable[Mark]) -> MarkMatcher: - mark_name_mapping = collections.defaultdict(list) - for mark in markers: - mark_name_mapping[mark.name].append(mark) - return cls(mark_name_mapping) + def from_item(cls, item: "Item") -> "MarkMatcher": + mark_names = {mark.name for mark in item.iter_markers()} + return cls(mark_names) - def __call__(self, name: str, /, **kwargs: str | int | bool | None) -> bool: - if not (matches := self.own_mark_name_mapping.get(name, [])): - return False - - for mark in matches: # pylint: disable=consider-using-any-or-all - if all(mark.kwargs.get(k, NOT_SET) == v for k, v in kwargs.items()): - return True - return False + def __call__(self, name: str) -> bool: + return name in self.own_mark_names -def deselect_by_mark(items: list[Item], config: Config) -> None: +def deselect_by_mark(items: "List[Item]", config: Config) -> None: matchexpr = config.option.markexpr if not matchexpr: return expr = _parse_expression(matchexpr, "Wrong expression passed to '-m'") - remaining: list[Item] = [] - deselected: list[Item] = [] + remaining: List[Item] = [] + deselected: List[Item] = [] for item in items: - if expr.evaluate(MarkMatcher.from_markers(item.iter_markers())): + if expr.evaluate(MarkMatcher.from_item(item)): remaining.append(item) else: deselected.append(item) @@ -273,13 +243,11 @@ def deselect_by_mark(items: list[Item], config: Config) -> None: def _parse_expression(expr: str, exc_message: str) -> Expression: try: return Expression.compile(expr) - except SyntaxError as e: - raise UsageError( - f"{exc_message}: {e.text}: at column {e.offset}: {e.msg}" - ) from None + except ParseError as e: + raise UsageError(f"{exc_message}: {expr}: {e}") from None -def pytest_collection_modifyitems(items: list[Item], config: Config) -> None: +def pytest_collection_modifyitems(items: "List[Item]", config: Config) -> None: deselect_by_keyword(items, config) deselect_by_mark(items, config) @@ -292,8 +260,8 @@ def pytest_configure(config: Config) -> None: if empty_parameterset not in ("skip", "xfail", "fail_at_collect", None, ""): raise UsageError( - f"{EMPTY_PARAMETERSET_OPTION!s} must be one of skip, xfail or fail_at_collect" - f" but it is {empty_parameterset!r}" + "{!s} must be one of skip, xfail or fail_at_collect" + " but it is {!r}".format(EMPTY_PARAMETERSET_OPTION, empty_parameterset) ) diff --git a/Backend/venv/lib/python3.12/site-packages/_pytest/mark/__pycache__/__init__.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/_pytest/mark/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..98ad9cd469fe2df7ccc78e8e3af11ffec16f31a7 GIT binary patch literal 11604 zcmb_iYiu0Xb-pt@`{3@9T)yAZh@wQTL@p&+Qf$U@EQ!>^vL3Z)JKoe@uXcvyQp;WT z&QKB=vZfscmKr6JVl-r82cc6Gp<%aSfwWNmJ;TcG{U zo!MQIqHP52#qOOmGv}Ur=HBz3`G?X{KSMis?6G9^HpYHUC;2As;AHg&GGo(BV^O9_ znw*lN5{|BvJnV|PB)X;mR-%f4-GJRuw}3r>JyDNzz(NY1I0xpY|3AhY!d9+-><$y!ckbpygE20$wt^iyatrT!2;Hqd9 zU`eY=RS(xhYXn>kxHeiV;2OYn(K-Rw0 z9@~brt)S3K*EChH>i22eu6d%{wN|}RQ#H9?(Y9YxqHUO|PHX#M$NQ2!g|<_#0lo(` zcj&ciXewI!HKoAEPF)&0>oB$EAhQ!p+jWg;;rFr6)CwbZX}h&OHg(MI(K;}D_;aXq zf=c8OD!VsO=>nBK+Frd?+lRlZ`$2g>u61m{dkoh)3$rWQ0h~wHoFBw_*O(kWG=BJm zp4NFXp$_Yb!FW1p46FSat`5ifrDS?Qji)u$&{KNCq_dGRb1;)u`$y9_&!mmWZ|RxO zh9xU-h6!%cR7hOd4m(vq^)l`p%8euy_h^Y2Qoddt=8=_8vQZ>g)+z za6g~Mz2DNl;LP89b%g7NflG9DKF$rjm-7tASwruc^L;PH&L4U1$eG^0-sdj#_QlSf z?>lvl7-<^N&6qwsVvfZ|;ygaAn>vP?F?t}}R?gT*- zhWexfb*{PHDW34DS0jEgJQ7h8Sk%sosZ8Qhcef*W_B|s1^k=ZKON=HAYOTa-ESVk| zH9PdHcpy{PT07REd~Mws4cgWE*q(!}9qQxZ^_X=1WPa!{E6w+ z|3){>CfLy0ySPS8liqi(PD&Hf5aDlVaGNeo(cGFx^M2rap9}(;1V!Hzy9C&NUvKtvc@jB{s&wHD@jF0C}f) zYFzHTWVsEPXWjB%(#NhqFf9fz@zwLs^^ve|D!55<(grPM zMkD;NsO!`+fH=td2GTRv|`X{nm(Pe znU2{k6ek5kplS}rO;yXJ+rhp~djn}05Bnj->O?l9DVQzH<2>7yBpymnC5MygIH^Cj z&0b5a&k;>a+5rT%*^vT!;q%K4JClEUid>58;xK9NIsz4EFA7|?>sN6#<`6}+K-*`u z+lDX>QPRN{jzx;La1F*U+e-{S5UmWPvFBQn!_|OAVfFOkh%jt|B+U=mO2iGl6WgJu zVOb!Qk+9qHAb3KwV<{R$#qz>0#79#Au>SGOac(JtdTIoEFl_nA@Q@^0B8nj$7=M0) z=oeH^LEEYO;&G3mqPdo`DTTm&2J;Ad4Wc=uzNM3@oD$@!tT?jE-3TSX|RGBI2}4il7G| zOg0aK4Y1Tk+_=REgJL69<*jrnWE=S+4c?8*$MH9Qgl>wh1S@ZyyK!#j)M9YwRPTyX zvaD2RmFg8=aHYIRJjsr&dGtYj$A2o*L=b%-JaYo=Ju~gtP_ZhIaw;(=OFrk zSPjHC&%J(b#aFdb-n3GBEazqJ>Q9)0dqL(7ym{vJGq=MFEl=F-UQ&*)D1N%IRJmuN z^Z9$q3w%3x?4x+oGTtgH+Z)oKC@}6W; znNT!|eDS2)q|jQl2_;WSb6?s8p>zXFA*{5dc_uv*@=%q7y5^vHC*0%kq?+%8l01Dp zp*&Qx2FU>@JoyUFrVWb+C?Mbl8= zW*U}4e!^1Vk4=L@3B+vFY-Ox+lrb@^(F`!p$uvI?tP%W;ze6|0eyub-@Rq(g`TFFt zxA~Xe<`rMrvadPoYhLngSt+f)^~#M`mP_|%OZU$oS}g6pF0WKKPM^7RW;VQ7-SLol zN@}n7tW?)eKXd1q8DsXyV)f4Jy(?AqGZl9pzuxoF*4EjBZ;#LY(GOm`eQ>7YyN}Nw z1$MCP*2xqrlkP(y$i1di zQKETtkEWnBplDvC`GGNC*l(2~<)onLjBso`o`u36aXc#*<}~k5oeb=Rh?R;_y>R1{ z=?KRN6F*jrb|~tHjd#)rC+2{^?is=}b$OA305KKl ziWq>VC;EvDWKJKZ+nGsO_y7r(RT|nP z^3UVJ{vLouRm?)vKcT=DZ(`~5c9Kgs8(}E}c~*+Y31x_U@rG8ko;MG{I?9{bdGJ`U z=*8iA9*Y#rf-OgxL)KV6BbjthxOvlO&~^`17is39BF)W5X|8LOVSSDz?@yP9vwIEb(R3jzlh)XLZf-d(yNdv740&vZ}vw zU6J0CQ1;?f&kW0!9NB9r6pgJ7e?BdFk}@yEm`{!GS#LTb{X8=qBTrraZKmf(r+#=U+jRW*1{t?EYU?F^caWO7LdoJv*8j5d4xCuiS1d#~y- z#EQ!yH5*cAtAEn)Zo|FMo}3$KIX^3@S@tz$eN8hx%gy_<&HERd4=ni(e&S*ETW8GK z=zR5J-J$Ej4+C{8C^Q7OW`kR2gUjl{ta@-McqoUdo$=U$`L^Z#$Flp6E$;7KYC68; zJN~Qk%G*yama7XsRrn&yixieD$U3t@A)*KqH2@GcX|s|1 zVMJgs$ka@@E;B>AiMJYKGKACx1z0EXG`Wy?@^}S_hnxwCcPb&cRcLu;9LcZEOFn-Q zC@_=mROX7#5&nM_=R&mBNiF&r8yt&Kg%g#YN5%ecfN#{Iv&BAiXtwQk^>pK% z#_8s4=#V4$jm=WuaZH(^Dak&E6-z;Fy`QIWV!3U@OTz&biUPf-TPta&|KS3_q?}fDRk(%`$2UB30^Y-m-5<~wm*CA!@4FCv1W)! zs7CDm*|5R~K!sC)A-o5F4$yl+(kWsOI^~bWhBMk|ir`=@_9vt9lyk=my~`wUxg-`d zQW?{T#W-yobRAk*9*f1(NcQ96#R0Ga!qeK-1%8R}5UFNToYUNm)NQA(l{(@=bk_hF zPoeuJ`&bFMeYr+f(L8nPL9lMdl?^s8D$Nhvp@(vfd)umuc`9-Qhrr zo^sMP0MClQdxAkl5F{fXaSc(dzoD7=*NmHHOT`Q%?`e$63HPRcbWN^u^9lIlO>(Lt zHF%QK@W^i7iq)Vu78}}TnbU;(gMxoUKBP?Gm8iy=;E#~ixXzAmeUWF@737fDqb4S5 z!R?)w+TWA-B&G@b`B5A=GBy-XQxsQ@SQYf5$IxTN@`mMeYIeFUIYPQTWbo4(>L@7q zS`|)4fntkzyQOQ$P-qG}O$j(|MO0Z7(U)+Y(hfwNmcKa4@;VXeCP_;kD|T@#Us&Sb z!W2Kp-*^`tX=^=c>vCm#wz7S>GLo%~ELQHFI{jgw7WvC>0?jjDTiAViG4SkE&x26q z)Txz)SE+%z|&nlJ83^Rn6DkH{v&Z zIX6&*o+Q9&p(zgZ|DB%%s0`#JC*z~*GZUv&M8!!Iaw%M=vMoYwCp$Kl0}ul#e()3ZIdwdv$r z$%UGyulvz`h-jhvTdytnw*3B~i`5>H#3XN3?Nx*eU1vBcNEM4jZ((SW5D@^{*eb6CtP52qvz18tEfO0;`y=Ue^j^Qxd z_X!e}Ed(`TO)>?g1NB-x)`xW8Npo5f#YNt!@lrD#MWLD=dAehAe&Cb!8<`e(Ug!!|yaLH$<`xkvVg*;lNVh z;7Y-^_uUJ&J}B6I?Ot#@S^Bn*{eOU^7f)yf^s5QH^)cuJhIL{~*}YKds{p21$rpWA zP^jl#VB49gV325Sh%YDQHL;KMHmX|_O!V^G?1%2W*lFwyWb2dipUPLHE9|Q4C3Zy$ z%V)>sZWXqVf**3f!y|ZS#RE9w6oTUwu-K^Y(QQdLh~s?zW^X=8z$*R*)gPx=PIkGE zN*|RsESGP~mT#MFTP$y1@U{Q$qW~6PqFZJ4GpA<`&&hKK=624@^ZVwvFEkulEc?>k zz6IZr|H`=t=~IJ3p*O1Q*mTJguG#7XuAjM|aIITES^=?sl((<_D1$z~$VYz?GYLnu z_1DJ=9)N-fAy%-Lg_vb+0%Nu03#Nt7a42fW_Z%YHGO?P+(b=W ze8+T_hr!+Wk*{wvCe`6ll-}@hgH!UPaUH4{NACfluC1u-gD3fysIkR@^4$(zTdyJd41QCNXi6r@-|%<}r-=I;W-a-kl?e+)=0IG+WCq8F{4 zL9*t&S*UarWzDM!K8M>u;26ySV6f|2rYG)9EZ4PX>)Mxgefe(RV%^beC+{iM;vvI( z`4!+<0Tia<&dX=ZV~&j=QxN$tCk{DzY)<0O$scpFrIx>#vIuJ?j2OLW<)aDlsg%9> zB;NM-VU(9`{7CEwU84YqQ{9czt0-Gs8rHw?iQu~*N|cDLIw0YlkNxZsA%VPp-8HI( z8KMpVQH_bZhgeL!Ho8dfbom&~vyHlL8t6);*R?azqb2q+kLiO{BYU1^=VL2c3RIZi~bf{f=QJQ%n$LKhxtcv5ueG-%Xw+}2yP^yp= zn)T!u4s(ys_uk!p_v+ow?17WnJ*OVh#Z?!R8w6HvCzDH;rP{1i`=9bYsV2wJ(e1jN zI31KKq?Vb99K&HAGve?IOo#*CKNm-aq&+m-9%m$-?kvZ^XLAgP`JLi$w{Mlsa&3xq zRGK-KV|1KL*vI*yRdJpxlclz~<{ZP}?qzZK`?gg&%lZA1pPm{AdT1PSjgoXsngJRe N=h_e{<0y3Le*si=7B&C? literal 0 HcmV?d00001 diff --git a/Backend/venv/lib/python3.12/site-packages/_pytest/mark/__pycache__/expression.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/_pytest/mark/__pycache__/expression.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..91ebc632783e34bdf76d14c3364c3ec29b100560 GIT binary patch literal 11489 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 literal 0 HcmV?d00001 diff --git a/Backend/venv/lib/python3.12/site-packages/_pytest/mark/__pycache__/structures.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/_pytest/mark/__pycache__/structures.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..381a4a6f0bd73358cfd3a2a56579f644e2a1b803 GIT binary patch literal 26337 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 (3, 8): + astNameConstant = ast.Constant +else: + astNameConstant = ast.NameConstant __all__ = [ "Expression", - "ExpressionMatcher", + "ParseError", ] -FILE_NAME: Final = "" - - class TokenType(enum.Enum): LPAREN = "left parenthesis" RPAREN = "right parenthesis" @@ -56,24 +47,35 @@ class TokenType(enum.Enum): NOT = "not" IDENT = "identifier" EOF = "end of input" - EQUAL = "=" - STRING = "string literal" - COMMA = "," @dataclasses.dataclass(frozen=True) class Token: - __slots__ = ("pos", "type", "value") + __slots__ = ("type", "value", "pos") type: TokenType value: str pos: int +class ParseError(Exception): + """The expression contains invalid syntax. + + :param column: The column in the line where the error occurred (1-based). + :param message: A description of the error. + """ + + def __init__(self, column: int, message: str) -> None: + self.column = column + self.message = message + + def __str__(self) -> str: + return f"at column {self.column}: {self.message}" + + class Scanner: - __slots__ = ("current", "input", "tokens") + __slots__ = ("tokens", "current") def __init__(self, input: str) -> None: - self.input = input self.tokens = self.lex(input) self.current = next(self.tokens) @@ -88,27 +90,6 @@ class Scanner: elif input[pos] == ")": yield Token(TokenType.RPAREN, ")", pos) pos += 1 - elif input[pos] == "=": - yield Token(TokenType.EQUAL, "=", pos) - pos += 1 - elif input[pos] == ",": - yield Token(TokenType.COMMA, ",", pos) - pos += 1 - elif (quote_char := input[pos]) in ("'", '"'): - end_quote_pos = input.find(quote_char, pos + 1) - if end_quote_pos == -1: - raise SyntaxError( - f'closing quote "{quote_char}" is missing', - (FILE_NAME, 1, pos + 1, input), - ) - value = input[pos : end_quote_pos + 1] - if (backslash_pos := input.find("\\")) != -1: - raise SyntaxError( - r'escaping with "\" not supported in marker expression', - (FILE_NAME, 1, backslash_pos + 1, input), - ) - yield Token(TokenType.STRING, value, pos) - pos += len(value) else: match = re.match(r"(:?\w|:|\+|-|\.|\[|\]|\\|/)+", input[pos:]) if match: @@ -123,21 +104,13 @@ class Scanner: yield Token(TokenType.IDENT, value, pos) pos += len(value) else: - raise SyntaxError( + raise ParseError( + pos + 1, f'unexpected character "{input[pos]}"', - (FILE_NAME, 1, pos + 1, input), ) yield Token(TokenType.EOF, "", pos) - @overload - def accept(self, type: TokenType, *, reject: Literal[True]) -> Token: ... - - @overload - def accept( - self, type: TokenType, *, reject: Literal[False] = False - ) -> Token | None: ... - - def accept(self, type: TokenType, *, reject: bool = False) -> Token | None: + def accept(self, type: TokenType, *, reject: bool = False) -> Optional[Token]: if self.current.type is type: token = self.current if token.type is not TokenType.EOF: @@ -148,12 +121,12 @@ class Scanner: return None def reject(self, expected: Sequence[TokenType]) -> NoReturn: - raise SyntaxError( + raise ParseError( + self.current.pos + 1, "expected {}; got {}".format( " OR ".join(type.value for type in expected), self.current.type.value, ), - (FILE_NAME, 1, self.current.pos + 1, self.input), ) @@ -165,7 +138,7 @@ IDENT_PREFIX = "$" def expression(s: Scanner) -> ast.Expression: if s.accept(TokenType.EOF): - ret: ast.expr = ast.Constant(False) + ret: ast.expr = astNameConstant(False) else: ret = expr(s) s.accept(TokenType.EOF, reject=True) @@ -197,108 +170,18 @@ def not_expr(s: Scanner) -> ast.expr: return ret ident = s.accept(TokenType.IDENT) if ident: - name = ast.Name(IDENT_PREFIX + ident.value, ast.Load()) - if s.accept(TokenType.LPAREN): - ret = ast.Call(func=name, args=[], keywords=all_kwargs(s)) - s.accept(TokenType.RPAREN, reject=True) - else: - ret = name - return ret - + return ast.Name(IDENT_PREFIX + ident.value, ast.Load()) s.reject((TokenType.NOT, TokenType.LPAREN, TokenType.IDENT)) -BUILTIN_MATCHERS = {"True": True, "False": False, "None": None} - - -def single_kwarg(s: Scanner) -> ast.keyword: - keyword_name = s.accept(TokenType.IDENT, reject=True) - if not keyword_name.value.isidentifier(): - raise SyntaxError( - f"not a valid python identifier {keyword_name.value}", - (FILE_NAME, 1, keyword_name.pos + 1, s.input), - ) - if keyword.iskeyword(keyword_name.value): - raise SyntaxError( - f"unexpected reserved python keyword `{keyword_name.value}`", - (FILE_NAME, 1, keyword_name.pos + 1, s.input), - ) - s.accept(TokenType.EQUAL, reject=True) - - if value_token := s.accept(TokenType.STRING): - value: str | int | bool | None = value_token.value[1:-1] # strip quotes - else: - value_token = s.accept(TokenType.IDENT, reject=True) - if (number := value_token.value).isdigit() or ( - number.startswith("-") and number[1:].isdigit() - ): - value = int(number) - elif value_token.value in BUILTIN_MATCHERS: - value = BUILTIN_MATCHERS[value_token.value] - else: - raise SyntaxError( - f'unexpected character/s "{value_token.value}"', - (FILE_NAME, 1, value_token.pos + 1, s.input), - ) - - ret = ast.keyword(keyword_name.value, ast.Constant(value)) - return ret - - -def all_kwargs(s: Scanner) -> list[ast.keyword]: - ret = [single_kwarg(s)] - while s.accept(TokenType.COMMA): - ret.append(single_kwarg(s)) - return ret - - -class ExpressionMatcher(Protocol): - """A callable which, given an identifier and optional kwargs, should return - whether it matches in an :class:`Expression` evaluation. - - Should be prepared to handle arbitrary strings as input. - - If no kwargs are provided, the expression of the form `foo`. - If kwargs are provided, the expression is of the form `foo(1, b=True, "s")`. - - If the expression is not supported (e.g. don't want to accept the kwargs - syntax variant), should raise :class:`~pytest.UsageError`. - - Example:: - - def matcher(name: str, /, **kwargs: str | int | bool | None) -> bool: - # Match `cat`. - if name == "cat" and not kwargs: - return True - # Match `dog(barks=True)`. - if name == "dog" and kwargs == {"barks": False}: - return True - return False - """ - - def __call__(self, name: str, /, **kwargs: str | int | bool | None) -> bool: ... - - -@dataclasses.dataclass -class MatcherNameAdapter: - matcher: ExpressionMatcher - name: str - - def __bool__(self) -> bool: - return self.matcher(self.name) - - def __call__(self, **kwargs: str | int | bool | None) -> bool: - return self.matcher(self.name, **kwargs) - - -class MatcherAdapter(Mapping[str, MatcherNameAdapter]): +class MatcherAdapter(Mapping[str, bool]): """Adapts a matcher function to a locals mapping as required by eval().""" - def __init__(self, matcher: ExpressionMatcher) -> None: + def __init__(self, matcher: Callable[[str], bool]) -> None: self.matcher = matcher - def __getitem__(self, key: str) -> MatcherNameAdapter: - return MatcherNameAdapter(matcher=self.matcher, name=key[len(IDENT_PREFIX) :]) + def __getitem__(self, key: str) -> bool: + return self.matcher(key[len(IDENT_PREFIX) :]) def __iter__(self) -> Iterator[str]: raise NotImplementedError() @@ -307,47 +190,39 @@ class MatcherAdapter(Mapping[str, MatcherNameAdapter]): raise NotImplementedError() -@final class Expression: """A compiled match expression as used by -k and -m. The expression can be evaluated against different matchers. """ - __slots__ = ("_code", "input") + __slots__ = ("code",) - def __init__(self, input: str, code: types.CodeType) -> None: - #: The original input line, as a string. - self.input: Final = input - self._code: Final = code + def __init__(self, code: types.CodeType) -> None: + self.code = code @classmethod - def compile(cls, input: str) -> Expression: + def compile(self, input: str) -> "Expression": """Compile a match expression. :param input: The input expression - one line. - - :raises SyntaxError: If the expression is malformed. """ astexpr = expression(Scanner(input)) - code = compile( + code: types.CodeType = compile( astexpr, filename="", mode="eval", ) - return Expression(input, code) + return Expression(code) - def evaluate(self, matcher: ExpressionMatcher) -> bool: + def evaluate(self, matcher: Callable[[str], bool]) -> bool: """Evaluate the match expression. :param matcher: - A callback which determines whether an identifier matches or not. - See the :class:`ExpressionMatcher` protocol for details and example. + Given an identifier, should return whether it matches or not. + Should be prepared to handle arbitrary strings as input. :returns: Whether the expression matches or not. - - :raises UsageError: - If the matcher doesn't support the expression. Cannot happen if the - matcher supports all expressions. """ - return bool(eval(self._code, {"__builtins__": {}}, MatcherAdapter(matcher))) + ret: bool = eval(self.code, {"__builtins__": {}}, MatcherAdapter(matcher)) + return ret diff --git a/Backend/venv/lib/python3.12/site-packages/_pytest/mark/structures.py b/Backend/venv/lib/python3.12/site-packages/_pytest/mark/structures.py index 16bb6d81..55620f04 100644 --- a/Backend/venv/lib/python3.12/site-packages/_pytest/mark/structures.py +++ b/Backend/venv/lib/python3.12/site-packages/_pytest/mark/structures.py @@ -1,37 +1,36 @@ -# mypy: allow-untyped-defs -from __future__ import annotations - import collections.abc -from collections.abc import Callable -from collections.abc import Collection -from collections.abc import Iterable -from collections.abc import Iterator -from collections.abc import Mapping -from collections.abc import MutableMapping -from collections.abc import Sequence import dataclasses -import enum import inspect +import warnings from typing import Any -from typing import final +from typing import Callable +from typing import Collection +from typing import Iterable +from typing import Iterator +from typing import List +from typing import Mapping +from typing import MutableMapping from typing import NamedTuple +from typing import Optional from typing import overload +from typing import Sequence +from typing import Set +from typing import Tuple +from typing import Type from typing import TYPE_CHECKING from typing import TypeVar -import warnings +from typing import Union from .._code import getfslineno +from ..compat import ascii_escaped +from ..compat import final from ..compat import NOTSET from ..compat import NotSetType from _pytest.config import Config from _pytest.deprecated import check_ispytest -from _pytest.deprecated import MARKED_FIXTURE from _pytest.outcomes import fail -from _pytest.raises import AbstractRaises -from _pytest.scope import _ScopeName from _pytest.warning_types import PytestUnknownMarkWarning - if TYPE_CHECKING: from ..nodes import Node @@ -39,37 +38,33 @@ if TYPE_CHECKING: EMPTY_PARAMETERSET_OPTION = "empty_parameter_set_mark" -# Singleton type for HIDDEN_PARAM, as described in: -# https://www.python.org/dev/peps/pep-0484/#support-for-singleton-types-in-unions -class _HiddenParam(enum.Enum): - token = 0 - - -#: Can be used as a parameter set id to hide it from the test name. -HIDDEN_PARAM = _HiddenParam.token - - def istestfunc(func) -> bool: return callable(func) and getattr(func, "__name__", "") != "" def get_empty_parameterset_mark( config: Config, argnames: Sequence[str], func -) -> MarkDecorator: +) -> "MarkDecorator": from ..nodes import Collector - argslisting = ", ".join(argnames) + fs, lineno = getfslineno(func) + reason = "got empty parameter set %r, function %s at %s:%d" % ( + argnames, + func.__name__, + fs, + lineno, + ) - _fs, lineno = getfslineno(func) - reason = f"got empty parameter set for ({argslisting})" requested_mark = config.getini(EMPTY_PARAMETERSET_OPTION) if requested_mark in ("", None, "skip"): mark = MARK_GEN.skip(reason=reason) elif requested_mark == "xfail": mark = MARK_GEN.xfail(reason=reason, run=False) elif requested_mark == "fail_at_collect": + f_name = func.__name__ + _, lineno = getfslineno(func) raise Collector.CollectError( - f"Empty parameter set in '{func.__name__}' at line {lineno + 1}" + "Empty parameter set in '%s' at line %d" % (f_name, lineno + 1) ) else: raise LookupError(requested_mark) @@ -77,68 +72,34 @@ def get_empty_parameterset_mark( class ParameterSet(NamedTuple): - """A set of values for a set of parameters along with associated marks and - an optional ID for the set. - - Examples:: - - pytest.param(1, 2, 3) - # ParameterSet(values=(1, 2, 3), marks=(), id=None) - - pytest.param("hello", id="greeting") - # ParameterSet(values=("hello",), marks=(), id="greeting") - - # Parameter set with marks - pytest.param(42, marks=pytest.mark.xfail) - # ParameterSet(values=(42,), marks=(MarkDecorator(...),), id=None) - - # From parametrize mark (parameter names + list of parameter sets) - pytest.mark.parametrize( - ("a", "b", "expected"), - [ - (1, 2, 3), - pytest.param(40, 2, 42, id="everything"), - ], - ) - # ParameterSet(values=(1, 2, 3), marks=(), id=None) - # ParameterSet(values=(40, 2, 42), marks=(), id="everything") - """ - - values: Sequence[object | NotSetType] - marks: Collection[MarkDecorator | Mark] - id: str | _HiddenParam | None + values: Sequence[Union[object, NotSetType]] + marks: Collection[Union["MarkDecorator", "Mark"]] + id: Optional[str] @classmethod def param( cls, *values: object, - marks: MarkDecorator | Collection[MarkDecorator | Mark] = (), - id: str | _HiddenParam | None = None, - ) -> ParameterSet: + marks: Union["MarkDecorator", Collection[Union["MarkDecorator", "Mark"]]] = (), + id: Optional[str] = None, + ) -> "ParameterSet": if isinstance(marks, MarkDecorator): marks = (marks,) else: assert isinstance(marks, collections.abc.Collection) - if any(i.name == "usefixtures" for i in marks): - raise ValueError( - "pytest.param cannot add pytest.mark.usefixtures; see " - "https://docs.pytest.org/en/stable/reference/reference.html#pytest-param" - ) if id is not None: - if not isinstance(id, str) and id is not HIDDEN_PARAM: - raise TypeError( - "Expected id to be a string or a `pytest.HIDDEN_PARAM` sentinel, " - f"got {type(id)}: {id!r}", - ) + if not isinstance(id, str): + raise TypeError(f"Expected id to be a string, got {type(id)}: {id!r}") + id = ascii_escaped(id) return cls(values, marks, id) @classmethod def extract_from( cls, - parameterset: ParameterSet | Sequence[object] | object, + parameterset: Union["ParameterSet", Sequence[object], object], force_tuple: bool = False, - ) -> ParameterSet: + ) -> "ParameterSet": """Extract from an object or objects. :param parameterset: @@ -149,6 +110,7 @@ class ParameterSet(NamedTuple): Enforce tuple wrapping so single argument tuple values don't get decomposed and break tests. """ + if isinstance(parameterset, cls): return parameterset if force_tuple: @@ -163,11 +125,11 @@ class ParameterSet(NamedTuple): @staticmethod def _parse_parametrize_args( - argnames: str | Sequence[str], - argvalues: Iterable[ParameterSet | Sequence[object] | object], + argnames: Union[str, Sequence[str]], + argvalues: Iterable[Union["ParameterSet", Sequence[object], object]], *args, **kwargs, - ) -> tuple[Sequence[str], bool]: + ) -> Tuple[Sequence[str], bool]: if isinstance(argnames, str): argnames = [x.strip() for x in argnames.split(",") if x.strip()] force_tuple = len(argnames) == 1 @@ -177,9 +139,9 @@ class ParameterSet(NamedTuple): @staticmethod def _parse_parametrize_parameters( - argvalues: Iterable[ParameterSet | Sequence[object] | object], + argvalues: Iterable[Union["ParameterSet", Sequence[object], object]], force_tuple: bool, - ) -> list[ParameterSet]: + ) -> List["ParameterSet"]: return [ ParameterSet.extract_from(x, force_tuple=force_tuple) for x in argvalues ] @@ -187,12 +149,12 @@ class ParameterSet(NamedTuple): @classmethod def _for_parametrize( cls, - argnames: str | Sequence[str], - argvalues: Iterable[ParameterSet | Sequence[object] | object], + argnames: Union[str, Sequence[str]], + argvalues: Iterable[Union["ParameterSet", Sequence[object], object]], func, config: Config, nodeid: str, - ) -> tuple[Sequence[str], list[ParameterSet]]: + ) -> Tuple[Sequence[str], List["ParameterSet"]]: argnames, force_tuple = cls._parse_parametrize_args(argnames, argvalues) parameters = cls._parse_parametrize_parameters(argvalues, force_tuple) del argvalues @@ -222,9 +184,7 @@ class ParameterSet(NamedTuple): # parameter set with NOTSET values, with the "empty parameter set" mark applied to it. mark = get_empty_parameterset_mark(config, argnames, func) parameters.append( - ParameterSet( - values=(NOTSET,) * len(argnames), marks=[mark], id="NOTSET" - ) + ParameterSet(values=(NOTSET,) * len(argnames), marks=[mark], id=None) ) return argnames, parameters @@ -237,24 +197,24 @@ class Mark: #: Name of the mark. name: str #: Positional arguments of the mark decorator. - args: tuple[Any, ...] + args: Tuple[Any, ...] #: Keyword arguments of the mark decorator. kwargs: Mapping[str, Any] #: Source Mark for ids with parametrize Marks. - _param_ids_from: Mark | None = dataclasses.field(default=None, repr=False) + _param_ids_from: Optional["Mark"] = dataclasses.field(default=None, repr=False) #: Resolved/generated ids with parametrize Marks. - _param_ids_generated: Sequence[str] | None = dataclasses.field( + _param_ids_generated: Optional[Sequence[str]] = dataclasses.field( default=None, repr=False ) def __init__( self, name: str, - args: tuple[Any, ...], + args: Tuple[Any, ...], kwargs: Mapping[str, Any], - param_ids_from: Mark | None = None, - param_ids_generated: Sequence[str] | None = None, + param_ids_from: Optional["Mark"] = None, + param_ids_generated: Optional[Sequence[str]] = None, *, _ispytest: bool = False, ) -> None: @@ -270,7 +230,7 @@ class Mark: def _has_param_ids(self) -> bool: return "ids" in self.kwargs or len(self.args) >= 4 - def combined_with(self, other: Mark) -> Mark: + def combined_with(self, other: "Mark") -> "Mark": """Return a new Mark which is a combination of this Mark and another Mark. @@ -282,7 +242,7 @@ class Mark: assert self.name == other.name # Remember source of ids with parametrize Marks. - param_ids_from: Mark | None = None + param_ids_from: Optional[Mark] = None if self.name == "parametrize": if other._has_param_ids(): param_ids_from = other @@ -301,7 +261,7 @@ class Mark: # A generic parameter designating an object to which a Mark may # be applied -- a test function (callable) or class. # Note: a lambda is not allowed, but this can't be represented. -Markable = TypeVar("Markable", bound=Callable[..., object] | type) +Markable = TypeVar("Markable", bound=Union[Callable[..., object], type]) @dataclasses.dataclass @@ -310,8 +270,8 @@ class MarkDecorator: ``MarkDecorators`` are created with ``pytest.mark``:: - mark1 = pytest.mark.NAME # Simple MarkDecorator - mark2 = pytest.mark.NAME(name1=value) # Parametrized MarkDecorator + mark1 = pytest.mark.NAME # Simple MarkDecorator + mark2 = pytest.mark.NAME(name1=value) # Parametrized MarkDecorator and can then be applied as decorators to test functions:: @@ -353,7 +313,7 @@ class MarkDecorator: return self.mark.name @property - def args(self) -> tuple[Any, ...]: + def args(self) -> Tuple[Any, ...]: """Alias for mark.args.""" return self.mark.args @@ -367,7 +327,7 @@ class MarkDecorator: """:meta private:""" return self.name # for backward-compat (2.4.1 had this attr) - def with_args(self, *args: object, **kwargs: object) -> MarkDecorator: + def with_args(self, *args: object, **kwargs: object) -> "MarkDecorator": """Return a MarkDecorator with extra arguments added. Unlike calling the MarkDecorator, with_args() can be used even @@ -380,11 +340,11 @@ class MarkDecorator: # return type. Not much we can do about that. Thankfully mypy picks # the first match so it works out even if we break the rules. @overload - def __call__(self, arg: Markable) -> Markable: # type: ignore[overload-overlap] + def __call__(self, arg: Markable) -> Markable: # type: ignore[misc] pass @overload - def __call__(self, *args: object, **kwargs: object) -> MarkDecorator: + def __call__(self, *args: object, **kwargs: object) -> "MarkDecorator": pass def __call__(self, *args: object, **kwargs: object): @@ -392,22 +352,17 @@ class MarkDecorator: if args and not kwargs: func = args[0] is_class = inspect.isclass(func) - # For staticmethods/classmethods, the marks are eventually fetched from the - # function object, not the descriptor, so unwrap. - unwrapped_func = func - if isinstance(func, staticmethod | classmethod): - unwrapped_func = func.__func__ - if len(args) == 1 and (istestfunc(unwrapped_func) or is_class): - store_mark(unwrapped_func, self.mark, stacklevel=3) + if len(args) == 1 and (istestfunc(func) or is_class): + store_mark(func, self.mark) return func return self.with_args(*args, **kwargs) def get_unpacked_marks( - obj: object | type, + obj: Union[object, type], *, consider_mro: bool = True, -) -> list[Mark]: +) -> List[Mark]: """Obtain the unpacked marks that are stored on an object. If obj is a class and consider_mro is true, return marks applied to @@ -437,7 +392,7 @@ def get_unpacked_marks( def normalize_mark_list( - mark_list: Iterable[Mark | MarkDecorator], + mark_list: Iterable[Union[Mark, MarkDecorator]] ) -> Iterable[Mark]: """ Normalize an iterable of Mark or MarkDecorator objects into a list of marks @@ -449,22 +404,16 @@ def normalize_mark_list( for mark in mark_list: mark_obj = getattr(mark, "mark", mark) if not isinstance(mark_obj, Mark): - raise TypeError(f"got {mark_obj!r} instead of Mark") + raise TypeError(f"got {repr(mark_obj)} instead of Mark") yield mark_obj -def store_mark(obj, mark: Mark, *, stacklevel: int = 2) -> None: +def store_mark(obj, mark: Mark) -> None: """Store a Mark on an object. This is used to implement the Mark declarations/decorators correctly. """ assert isinstance(mark, Mark), mark - - from ..fixtures import getfixturemarker - - if getfixturemarker(obj) is not None: - warnings.warn(MARKED_FIXTURE, stacklevel=stacklevel) - # Always reassign name to avoid updating pytestmark in a reference that # was only borrowed. obj.pytestmark = [*get_unpacked_marks(obj, consider_mro=False), mark] @@ -473,52 +422,59 @@ def store_mark(obj, mark: Mark, *, stacklevel: int = 2) -> None: # Typing for builtin pytest marks. This is cheating; it gives builtin marks # special privilege, and breaks modularity. But practicality beats purity... if TYPE_CHECKING: + from _pytest.scope import _ScopeName class _SkipMarkDecorator(MarkDecorator): - @overload # type: ignore[override,no-overload-impl] - def __call__(self, arg: Markable) -> Markable: ... + @overload # type: ignore[override,misc,no-overload-impl] + def __call__(self, arg: Markable) -> Markable: + ... @overload - def __call__(self, reason: str = ...) -> MarkDecorator: ... + def __call__(self, reason: str = ...) -> "MarkDecorator": + ... class _SkipifMarkDecorator(MarkDecorator): def __call__( # type: ignore[override] self, - condition: str | bool = ..., - *conditions: str | bool, + condition: Union[str, bool] = ..., + *conditions: Union[str, bool], reason: str = ..., - ) -> MarkDecorator: ... + ) -> MarkDecorator: + ... class _XfailMarkDecorator(MarkDecorator): - @overload # type: ignore[override,no-overload-impl] - def __call__(self, arg: Markable) -> Markable: ... + @overload # type: ignore[override,misc,no-overload-impl] + def __call__(self, arg: Markable) -> Markable: + ... @overload def __call__( self, - condition: str | bool = False, - *conditions: str | bool, + condition: Union[str, bool] = ..., + *conditions: Union[str, bool], reason: str = ..., run: bool = ..., - raises: None - | type[BaseException] - | tuple[type[BaseException], ...] - | AbstractRaises[BaseException] = ..., + raises: Union[Type[BaseException], Tuple[Type[BaseException], ...]] = ..., strict: bool = ..., - ) -> MarkDecorator: ... + ) -> MarkDecorator: + ... class _ParametrizeMarkDecorator(MarkDecorator): def __call__( # type: ignore[override] self, - argnames: str | Sequence[str], - argvalues: Iterable[ParameterSet | Sequence[object] | object], + argnames: Union[str, Sequence[str]], + argvalues: Iterable[Union[ParameterSet, Sequence[object], object]], *, - indirect: bool | Sequence[str] = ..., - ids: Iterable[None | str | float | int | bool] - | Callable[[Any], object | None] - | None = ..., - scope: _ScopeName | None = ..., - ) -> MarkDecorator: ... + indirect: Union[bool, Sequence[str]] = ..., + ids: Optional[ + Union[ + Iterable[Union[None, str, float, int, bool]], + Callable[[Any], Optional[object]], + ] + ] = ..., + scope: Optional[_ScopeName] = ..., + ) -> MarkDecorator: + ... class _UsefixturesMarkDecorator(MarkDecorator): def __call__(self, *fixtures: str) -> MarkDecorator: # type: ignore[override] @@ -538,10 +494,9 @@ class MarkGenerator: import pytest - @pytest.mark.slowtest def test_function(): - pass + pass applies a 'slowtest' :class:`Mark` on ``test_function``. """ @@ -557,8 +512,8 @@ class MarkGenerator: def __init__(self, *, _ispytest: bool = False) -> None: check_ispytest(_ispytest) - self._config: Config | None = None - self._markers: set[str] = set() + self._config: Optional[Config] = None + self._markers: Set[str] = set() def __getattr__(self, name: str) -> MarkDecorator: """Generate a new :class:`MarkDecorator` with the given name.""" @@ -580,24 +535,21 @@ class MarkGenerator: # If the name is not in the set of known marks after updating, # then it really is time to issue a warning or an error. if name not in self._markers: - # Raise a specific error for common misspellings of "parametrize". - if name in ["parameterize", "parametrise", "parameterise"]: - __tracebackhide__ = True - fail(f"Unknown '{name}' mark, did you mean 'parametrize'?") - - strict_markers = self._config.getini("strict_markers") - if strict_markers is None: - strict_markers = self._config.getini("strict") - if strict_markers: + if self._config.option.strict_markers or self._config.option.strict: fail( f"{name!r} not found in `markers` configuration option", pytrace=False, ) + # Raise a specific error for common misspellings of "parametrize". + if name in ["parameterize", "parametrise", "parameterise"]: + __tracebackhide__ = True + fail(f"Unknown '{name}' mark, did you mean 'parametrize'?") + warnings.warn( - f"Unknown pytest.mark.{name} - is this a typo? You can register " + "Unknown pytest.mark.%s - is this a typo? You can register " "custom marks to avoid this warning - for details, see " - "https://docs.pytest.org/en/stable/how-to/mark.html", + "https://docs.pytest.org/en/stable/how-to/mark.html" % name, PytestUnknownMarkWarning, 2, ) @@ -610,9 +562,9 @@ MARK_GEN = MarkGenerator(_ispytest=True) @final class NodeKeywords(MutableMapping[str, Any]): - __slots__ = ("_markers", "node", "parent") + __slots__ = ("node", "parent", "_markers") - def __init__(self, node: Node) -> None: + def __init__(self, node: "Node") -> None: self.node = node self.parent = node.parent self._markers = {node.name: True} @@ -632,13 +584,15 @@ class NodeKeywords(MutableMapping[str, Any]): # below and use the collections.abc fallback, but that would be slow. def __contains__(self, key: object) -> bool: - return key in self._markers or ( - self.parent is not None and key in self.parent.keywords + return ( + key in self._markers + or self.parent is not None + and key in self.parent.keywords ) def update( # type: ignore[override] self, - other: Mapping[str, Any] | Iterable[tuple[str, Any]] = (), + other: Union[Mapping[str, Any], Iterable[Tuple[str, Any]]] = (), **kwds: Any, ) -> None: self._markers.update(other) diff --git a/Backend/venv/lib/python3.12/site-packages/_pytest/monkeypatch.py b/Backend/venv/lib/python3.12/site-packages/_pytest/monkeypatch.py index 07cc3fc4..9e51ff33 100644 --- a/Backend/venv/lib/python3.12/site-packages/_pytest/monkeypatch.py +++ b/Backend/venv/lib/python3.12/site-packages/_pytest/monkeypatch.py @@ -1,27 +1,24 @@ -# mypy: allow-untyped-defs """Monkeypatching and mocking functionality.""" - -from __future__ import annotations - -from collections.abc import Generator -from collections.abc import Mapping -from collections.abc import MutableMapping -from contextlib import contextmanager import os -from pathlib import Path import re import sys -from typing import Any -from typing import final -from typing import overload -from typing import TypeVar import warnings +from contextlib import contextmanager +from typing import Any +from typing import Generator +from typing import List +from typing import Mapping +from typing import MutableMapping +from typing import Optional +from typing import overload +from typing import Tuple +from typing import TypeVar +from typing import Union -from _pytest.deprecated import MONKEYPATCH_LEGACY_NAMESPACE_PACKAGES +from _pytest.compat import final from _pytest.fixtures import fixture from _pytest.warning_types import PytestWarning - RE_IMPORT_ERROR_NAME = re.compile(r"^No module named (.*)$") @@ -30,7 +27,7 @@ V = TypeVar("V") @fixture -def monkeypatch() -> Generator[MonkeyPatch]: +def monkeypatch() -> Generator["MonkeyPatch", None, None]: """A convenient fixture for monkey-patching. The fixture provides these methods to modify objects, dictionaries, or @@ -92,12 +89,14 @@ def annotated_getattr(obj: object, name: str, ann: str) -> object: obj = getattr(obj, name) except AttributeError as e: raise AttributeError( - f"{type(obj).__name__!r} object at {ann} has no attribute {name!r}" + "{!r} object at {} has no attribute {!r}".format( + type(obj).__name__, ann, name + ) ) from e return obj -def derive_importpath(import_path: str, raising: bool) -> tuple[str, object]: +def derive_importpath(import_path: str, raising: bool) -> Tuple[str, object]: if not isinstance(import_path, str) or "." not in import_path: raise TypeError(f"must be absolute import path string, not {import_path!r}") module, attr = import_path.rsplit(".", 1) @@ -130,14 +129,14 @@ class MonkeyPatch: """ def __init__(self) -> None: - self._setattr: list[tuple[object, str, object]] = [] - self._setitem: list[tuple[Mapping[Any, Any], object, object]] = [] - self._cwd: str | None = None - self._savesyspath: list[str] | None = None + self._setattr: List[Tuple[object, str, object]] = [] + self._setitem: List[Tuple[Mapping[Any, Any], object, object]] = [] + self._cwd: Optional[str] = None + self._savesyspath: Optional[List[str]] = None @classmethod @contextmanager - def context(cls) -> Generator[MonkeyPatch]: + def context(cls) -> Generator["MonkeyPatch", None, None]: """Context manager that returns a new :class:`MonkeyPatch` object which undoes any patching done inside the ``with`` block upon exit. @@ -169,7 +168,8 @@ class MonkeyPatch: name: object, value: Notset = ..., raising: bool = ..., - ) -> None: ... + ) -> None: + ... @overload def setattr( @@ -178,12 +178,13 @@ class MonkeyPatch: name: str, value: object, raising: bool = ..., - ) -> None: ... + ) -> None: + ... def setattr( self, - target: str | object, - name: object | str, + target: Union[str, object], + name: Union[object, str], value: object = notset, raising: bool = True, ) -> None: @@ -254,8 +255,8 @@ class MonkeyPatch: def delattr( self, - target: object | str, - name: str | Notset = notset, + target: Union[object, str], + name: Union[str, Notset] = notset, raising: bool = True, ) -> None: """Delete attribute ``name`` from ``target``. @@ -310,7 +311,7 @@ class MonkeyPatch: # Not all Mapping types support indexing, but MutableMapping doesn't support TypedDict del dic[name] # type: ignore[attr-defined] - def setenv(self, name: str, value: str, prepend: str | None = None) -> None: + def setenv(self, name: str, value: str, prepend: Optional[str] = None) -> None: """Set environment variable ``name`` to ``value``. If ``prepend`` is a character, read the current environment variable @@ -320,8 +321,10 @@ class MonkeyPatch: if not isinstance(value, str): warnings.warn( # type: ignore[unreachable] PytestWarning( - f"Value of environment variable {name} type should be str, but got " - f"{value!r} (type: {type(value).__name__}); converted to str implicitly" + "Value of environment variable {name} type should be str, but got " + "{value!r} (type: {type}); converted to str implicitly".format( + name=name, value=value, type=type(value).__name__ + ) ), stacklevel=2, ) @@ -341,6 +344,7 @@ class MonkeyPatch: def syspath_prepend(self, path) -> None: """Prepend ``path`` to ``sys.path`` list of import locations.""" + if self._savesyspath is None: self._savesyspath = sys.path[:] sys.path.insert(0, str(path)) @@ -348,26 +352,8 @@ class MonkeyPatch: # https://github.com/pypa/setuptools/blob/d8b901bc/docs/pkg_resources.txt#L162-L171 # this is only needed when pkg_resources was already loaded by the namespace package if "pkg_resources" in sys.modules: - import pkg_resources from pkg_resources import fixup_namespace_packages - # Only issue deprecation warning if this call would actually have an - # effect for this specific path. - if ( - hasattr(pkg_resources, "_namespace_packages") - and pkg_resources._namespace_packages - ): - path_obj = Path(str(path)) - for ns_pkg in pkg_resources._namespace_packages: - if ns_pkg is None: - continue - ns_pkg_path = path_obj / ns_pkg.replace(".", os.sep) - if ns_pkg_path.is_dir(): - warnings.warn( - MONKEYPATCH_LEGACY_NAMESPACE_PACKAGES, stacklevel=2 - ) - break - fixup_namespace_packages(str(path)) # A call to syspathinsert() usually means that the caller wants to @@ -381,7 +367,7 @@ class MonkeyPatch: invalidate_caches() - def chdir(self, path: str | os.PathLike[str]) -> None: + def chdir(self, path: Union[str, "os.PathLike[str]"]) -> None: """Change the current working directory to the specified path. :param path: diff --git a/Backend/venv/lib/python3.12/site-packages/_pytest/nodes.py b/Backend/venv/lib/python3.12/site-packages/_pytest/nodes.py index 6690f6ab..667a02b7 100644 --- a/Backend/venv/lib/python3.12/site-packages/_pytest/nodes.py +++ b/Backend/venv/lib/python3.12/site-packages/_pytest/nodes.py @@ -1,52 +1,47 @@ -# mypy: allow-untyped-defs -from __future__ import annotations - -import abc -from collections.abc import Callable -from collections.abc import Iterable -from collections.abc import Iterator -from collections.abc import MutableMapping -from functools import cached_property -from functools import lru_cache import os -import pathlib +import warnings +from inspect import signature from pathlib import Path from typing import Any +from typing import Callable from typing import cast -from typing import NoReturn +from typing import Iterable +from typing import Iterator +from typing import List +from typing import MutableMapping +from typing import Optional from typing import overload +from typing import Set +from typing import Tuple +from typing import Type from typing import TYPE_CHECKING from typing import TypeVar -import warnings - -import pluggy +from typing import Union import _pytest._code from _pytest._code import getfslineno from _pytest._code.code import ExceptionInfo from _pytest._code.code import TerminalRepr from _pytest._code.code import Traceback -from _pytest._code.code import TracebackStyle +from _pytest.compat import cached_property from _pytest.compat import LEGACY_PATH -from _pytest.compat import signature from _pytest.config import Config from _pytest.config import ConftestImportFailure -from _pytest.config.compat import _check_path +from _pytest.deprecated import FSCOLLECTOR_GETHOOKPROXY_ISINITPATH from _pytest.deprecated import NODE_CTOR_FSPATH_ARG from _pytest.mark.structures import Mark from _pytest.mark.structures import MarkDecorator from _pytest.mark.structures import NodeKeywords from _pytest.outcomes import fail from _pytest.pathlib import absolutepath +from _pytest.pathlib import commonpath from _pytest.stash import Stash from _pytest.warning_types import PytestWarning - if TYPE_CHECKING: - from typing_extensions import Self - # Imported here due to circular import. from _pytest.main import Session + from _pytest._code.code import _TracebackStyle SEP = "/" @@ -54,13 +49,63 @@ SEP = "/" tracebackcutdir = Path(_pytest.__file__).parent -_T = TypeVar("_T") +def iterparentnodeids(nodeid: str) -> Iterator[str]: + """Return the parent node IDs of a given node ID, inclusive. + + For the node ID + + "testing/code/test_excinfo.py::TestFormattedExcinfo::test_repr_source" + + the result would be + + "" + "testing" + "testing/code" + "testing/code/test_excinfo.py" + "testing/code/test_excinfo.py::TestFormattedExcinfo" + "testing/code/test_excinfo.py::TestFormattedExcinfo::test_repr_source" + + Note that / components are only considered until the first ::. + """ + pos = 0 + first_colons: Optional[int] = nodeid.find("::") + if first_colons == -1: + first_colons = None + # The root Session node - always present. + yield "" + # Eagerly consume SEP parts until first colons. + while True: + at = nodeid.find(SEP, pos, first_colons) + if at == -1: + break + if at > 0: + yield nodeid[:at] + pos = at + len(SEP) + # Eagerly consume :: parts. + while True: + at = nodeid.find("::", pos) + if at == -1: + break + if at > 0: + yield nodeid[:at] + pos = at + len("::") + # The node ID itself. + if nodeid: + yield nodeid + + +def _check_path(path: Path, fspath: LEGACY_PATH) -> None: + if Path(fspath) != path: + raise ValueError( + f"Path({fspath!r}) != {path!r}\n" + "if both path and fspath are given they need to be equal" + ) def _imply_path( - node_type: type[Node], - path: Path | None, - fspath: LEGACY_PATH | None, + node_type: Type["Node"], + path: Optional[Path], + fspath: Optional[LEGACY_PATH], ) -> Path: if fspath is not None: warnings.warn( @@ -81,51 +126,37 @@ def _imply_path( _NodeType = TypeVar("_NodeType", bound="Node") -class NodeMeta(abc.ABCMeta): - """Metaclass used by :class:`Node` to enforce that direct construction raises - :class:`Failed`. - - This behaviour supports the indirection introduced with :meth:`Node.from_parent`, - the named constructor to be used instead of direct construction. The design - decision to enforce indirection with :class:`NodeMeta` was made as a - temporary aid for refactoring the collection tree, which was diagnosed to - have :class:`Node` objects whose creational patterns were overly entangled. - Once the refactoring is complete, this metaclass can be removed. - - See https://github.com/pytest-dev/pytest/projects/3 for an overview of the - progress on detangling the :class:`Node` classes. - """ - - def __call__(cls, *k, **kw) -> NoReturn: +class NodeMeta(type): + def __call__(self, *k, **kw): msg = ( "Direct construction of {name} has been deprecated, please use {name}.from_parent.\n" "See " "https://docs.pytest.org/en/stable/deprecations.html#node-construction-changed-to-node-from-parent" " for more details." - ).format(name=f"{cls.__module__}.{cls.__name__}") + ).format(name=f"{self.__module__}.{self.__name__}") fail(msg, pytrace=False) - def _create(cls: type[_T], *k, **kw) -> _T: + def _create(self, *k, **kw): try: - return super().__call__(*k, **kw) # type: ignore[no-any-return,misc] + return super().__call__(*k, **kw) except TypeError: - sig = signature(getattr(cls, "__init__")) + sig = signature(getattr(self, "__init__")) known_kw = {k: v for k, v in kw.items() if k in sig.parameters} from .warning_types import PytestDeprecationWarning warnings.warn( PytestDeprecationWarning( - f"{cls} is not using a cooperative constructor and only takes {set(known_kw)}.\n" + f"{self} is not using a cooperative constructor and only takes {set(known_kw)}.\n" "See https://docs.pytest.org/en/stable/deprecations.html" "#constructors-of-custom-pytest-node-subclasses-should-take-kwargs " "for more details." ) ) - return super().__call__(*k, **known_kw) # type: ignore[no-any-return,misc] + return super().__call__(*k, **known_kw) -class Node(abc.ABC, metaclass=NodeMeta): +class Node(metaclass=NodeMeta): r"""Base class of :class:`Collector` and :class:`Item`, the components of the test collection tree. @@ -136,32 +167,32 @@ class Node(abc.ABC, metaclass=NodeMeta): # Implemented in the legacypath plugin. #: A ``LEGACY_PATH`` copy of the :attr:`path` attribute. Intended for usage #: for methods not migrated to ``pathlib.Path`` yet, such as - #: :meth:`Item.reportinfo `. Will be deprecated in - #: a future release, prefer using :attr:`path` instead. + #: :meth:`Item.reportinfo`. Will be deprecated in a future release, prefer + #: using :attr:`path` instead. fspath: LEGACY_PATH # Use __slots__ to make attribute access faster. # Note that __dict__ is still available. __slots__ = ( - "__dict__", - "_nodeid", - "_store", - "config", "name", "parent", - "path", + "config", "session", + "path", + "_nodeid", + "_store", + "__dict__", ) def __init__( self, name: str, - parent: Node | None = None, - config: Config | None = None, - session: Session | None = None, - fspath: LEGACY_PATH | None = None, - path: Path | None = None, - nodeid: str | None = None, + parent: "Optional[Node]" = None, + config: Optional[Config] = None, + session: "Optional[Session]" = None, + fspath: Optional[LEGACY_PATH] = None, + path: Optional[Path] = None, + nodeid: Optional[str] = None, ) -> None: #: A unique name within the scope of the parent node. self.name: str = name @@ -188,17 +219,17 @@ class Node(abc.ABC, metaclass=NodeMeta): if path is None and fspath is None: path = getattr(parent, "path", None) #: Filesystem path where this node was collected from (can be None). - self.path: pathlib.Path = _imply_path(type(self), path, fspath=fspath) + self.path: Path = _imply_path(type(self), path, fspath=fspath) # The explicit annotation is to avoid publicly exposing NodeKeywords. #: Keywords/markers collected from all scopes. self.keywords: MutableMapping[str, Any] = NodeKeywords(self) #: The marker objects belonging to this node. - self.own_markers: list[Mark] = [] + self.own_markers: List[Mark] = [] #: Allow adding of extra keywords to use for matching. - self.extra_keyword_matches: set[str] = set() + self.extra_keyword_matches: Set[str] = set() if nodeid is not None: assert "::()" not in nodeid @@ -215,7 +246,7 @@ class Node(abc.ABC, metaclass=NodeMeta): self._store = self.stash @classmethod - def from_parent(cls, parent: Node, **kw) -> Self: + def from_parent(cls, parent: "Node", **kw): """Public constructor for Nodes. This indirection got introduced in order to enable removing @@ -233,7 +264,7 @@ class Node(abc.ABC, metaclass=NodeMeta): return cls._create(parent=parent, **kw) @property - def ihook(self) -> pluggy.HookRelay: + def ihook(self): """fspath-sensitive hook proxy used to call pytest hooks.""" return self.session.gethookproxy(self.path) @@ -264,7 +295,9 @@ class Node(abc.ABC, metaclass=NodeMeta): # enforce type checks here to avoid getting a generic type error later otherwise. if not isinstance(warning, Warning): raise ValueError( - f"warning must be an instance of Warning or subclass, got {warning!r}" + "warning must be an instance of Warning or subclass, got {!r}".format( + warning + ) ) path, lineno = get_fslocation_from_item(self) assert lineno is not None @@ -291,29 +324,23 @@ class Node(abc.ABC, metaclass=NodeMeta): def teardown(self) -> None: pass - def iter_parents(self) -> Iterator[Node]: - """Iterate over all parent collectors starting from and including self - up to the root of the collection tree. + def listchain(self) -> List["Node"]: + """Return list of all parent collectors up to self, starting from + the root of collection tree. - .. versionadded:: 8.1 + :returns: The nodes. """ - parent: Node | None = self - while parent is not None: - yield parent - parent = parent.parent - - def listchain(self) -> list[Node]: - """Return a list of all parent collectors starting from the root of the - collection tree down to and including self.""" chain = [] - item: Node | None = self + item: Optional[Node] = self while item is not None: chain.append(item) item = item.parent chain.reverse() return chain - def add_marker(self, marker: str | MarkDecorator, append: bool = True) -> None: + def add_marker( + self, marker: Union[str, MarkDecorator], append: bool = True + ) -> None: """Dynamically add a marker object to the node. :param marker: @@ -335,7 +362,7 @@ class Node(abc.ABC, metaclass=NodeMeta): else: self.own_markers.insert(0, marker_.mark) - def iter_markers(self, name: str | None = None) -> Iterator[Mark]: + def iter_markers(self, name: Optional[str] = None) -> Iterator[Mark]: """Iterate over all markers of the node. :param name: If given, filter the results by the name attribute. @@ -344,25 +371,29 @@ class Node(abc.ABC, metaclass=NodeMeta): return (x[1] for x in self.iter_markers_with_node(name=name)) def iter_markers_with_node( - self, name: str | None = None - ) -> Iterator[tuple[Node, Mark]]: + self, name: Optional[str] = None + ) -> Iterator[Tuple["Node", Mark]]: """Iterate over all markers of the node. :param name: If given, filter the results by the name attribute. :returns: An iterator of (node, mark) tuples. """ - for node in self.iter_parents(): + for node in reversed(self.listchain()): for mark in node.own_markers: if name is None or getattr(mark, "name", None) == name: yield node, mark @overload - def get_closest_marker(self, name: str) -> Mark | None: ... + def get_closest_marker(self, name: str) -> Optional[Mark]: + ... @overload - def get_closest_marker(self, name: str, default: Mark) -> Mark: ... + def get_closest_marker(self, name: str, default: Mark) -> Mark: + ... - def get_closest_marker(self, name: str, default: Mark | None = None) -> Mark | None: + def get_closest_marker( + self, name: str, default: Optional[Mark] = None + ) -> Optional[Mark]: """Return the first marker matching the name, from closest (for example function) to farther level (for example module level). @@ -371,14 +402,14 @@ class Node(abc.ABC, metaclass=NodeMeta): """ return next(self.iter_markers(name=name), default) - def listextrakeywords(self) -> set[str]: + def listextrakeywords(self) -> Set[str]: """Return a set of all extra keywords in self and any parents.""" - extra_keywords: set[str] = set() + extra_keywords: Set[str] = set() for item in self.listchain(): extra_keywords.update(item.extra_keyword_matches) return extra_keywords - def listnames(self) -> list[str]: + def listnames(self) -> List[str]: return [x.name for x in self.listchain()] def addfinalizer(self, fin: Callable[[], object]) -> None: @@ -390,17 +421,18 @@ class Node(abc.ABC, metaclass=NodeMeta): """ self.session._setupstate.addfinalizer(fin, self) - def getparent(self, cls: type[_NodeType]) -> _NodeType | None: - """Get the closest parent node (including self) which is an instance of + def getparent(self, cls: Type[_NodeType]) -> Optional[_NodeType]: + """Get the next parent node (including self) which is an instance of the given class. :param cls: The node class to search for. :returns: The node, if found. """ - for node in self.iter_parents(): - if isinstance(node, cls): - return node - return None + current: Optional[Node] = self + while current and not isinstance(current, cls): + current = current.parent + assert current is None or isinstance(current, cls) + return current def _traceback_filter(self, excinfo: ExceptionInfo[BaseException]) -> Traceback: return excinfo.traceback @@ -408,19 +440,19 @@ class Node(abc.ABC, metaclass=NodeMeta): def _repr_failure_py( self, excinfo: ExceptionInfo[BaseException], - style: TracebackStyle | None = None, + style: "Optional[_TracebackStyle]" = None, ) -> TerminalRepr: from _pytest.fixtures import FixtureLookupError if isinstance(excinfo.value, ConftestImportFailure): - excinfo = ExceptionInfo.from_exception(excinfo.value.cause) + excinfo = ExceptionInfo.from_exc_info(excinfo.value.excinfo) if isinstance(excinfo.value, fail.Exception): if not excinfo.value.pytrace: style = "value" if isinstance(excinfo.value, FixtureLookupError): return excinfo.value.formatrepr() - tbfilter: bool | Callable[[ExceptionInfo[BaseException]], Traceback] + tbfilter: Union[bool, Callable[[ExceptionInfo[BaseException]], Traceback]] if self.config.getoption("fulltrace", False): style = "long" tbfilter = False @@ -435,13 +467,11 @@ class Node(abc.ABC, metaclass=NodeMeta): else: style = "long" - if self.config.get_verbosity() > 1: + if self.config.getoption("verbose", 0) > 1: truncate_locals = False else: truncate_locals = True - truncate_args = False if self.config.get_verbosity() > 2 else True - # excinfo.getrepr() formats paths relative to the CWD if `abspath` is False. # It is possible for a fixture/test to change the CWD while this code runs, which # would then result in the user seeing confusing paths in the failure message. @@ -460,14 +490,13 @@ class Node(abc.ABC, metaclass=NodeMeta): style=style, tbfilter=tbfilter, truncate_locals=truncate_locals, - truncate_args=truncate_args, ) def repr_failure( self, excinfo: ExceptionInfo[BaseException], - style: TracebackStyle | None = None, - ) -> str | TerminalRepr: + style: "Optional[_TracebackStyle]" = None, + ) -> Union[str, TerminalRepr]: """Return a representation of a collection or test failure. .. seealso:: :ref:`non-python tests` @@ -477,26 +506,26 @@ class Node(abc.ABC, metaclass=NodeMeta): return self._repr_failure_py(excinfo, style) -def get_fslocation_from_item(node: Node) -> tuple[str | Path, int | None]: +def get_fslocation_from_item(node: "Node") -> Tuple[Union[str, Path], Optional[int]]: """Try to extract the actual location from a node, depending on available attributes: * "location": a pair (path, lineno) * "obj": a Python object that the node wraps. - * "path": just a path + * "fspath": just a path :rtype: A tuple of (str|Path, int) with filename and 0-based line number. """ # See Item.location. - location: tuple[str, int | None, str] | None = getattr(node, "location", None) + location: Optional[Tuple[str, Optional[int], str]] = getattr(node, "location", None) if location is not None: return location[:2] obj = getattr(node, "obj", None) if obj is not None: return getfslineno(obj) - return getattr(node, "path", "unknown location"), -1 + return getattr(node, "fspath", "unknown location"), -1 -class Collector(Node, abc.ABC): +class Collector(Node): """Base class of all collectors. Collector create children through `collect()` and thus iteratively build @@ -506,15 +535,14 @@ class Collector(Node, abc.ABC): class CollectError(Exception): """An error during collection, contains a custom message.""" - @abc.abstractmethod - def collect(self) -> Iterable[Item | Collector]: + def collect(self) -> Iterable[Union["Item", "Collector"]]: """Collect children (items and collectors) for this collector.""" raise NotImplementedError("abstract") # TODO: This omits the style= parameter which breaks Liskov Substitution. def repr_failure( # type: ignore[override] self, excinfo: ExceptionInfo[BaseException] - ) -> str | TerminalRepr: + ) -> Union[str, TerminalRepr]: """Return a representation of a collection failure. :param excinfo: Exception information for the failure. @@ -539,37 +567,31 @@ class Collector(Node, abc.ABC): ntraceback = traceback.cut(path=self.path) if ntraceback == traceback: ntraceback = ntraceback.cut(excludepath=tracebackcutdir) - return ntraceback.filter(excinfo) + return excinfo.traceback.filter(excinfo) return excinfo.traceback -@lru_cache(maxsize=1000) -def _check_initialpaths_for_relpath( - initial_paths: frozenset[Path], path: Path -) -> str | None: - if path in initial_paths: - return "" - - for parent in path.parents: - if parent in initial_paths: - return str(path.relative_to(parent)) - +def _check_initialpaths_for_relpath(session: "Session", path: Path) -> Optional[str]: + for initial_path in session._initialpaths: + if commonpath(path, initial_path) == initial_path: + rel = str(path.relative_to(initial_path)) + return "" if rel == "." else rel return None -class FSCollector(Collector, abc.ABC): +class FSCollector(Collector): """Base class for filesystem collectors.""" def __init__( self, - fspath: LEGACY_PATH | None = None, - path_or_parent: Path | Node | None = None, - path: Path | None = None, - name: str | None = None, - parent: Node | None = None, - config: Config | None = None, - session: Session | None = None, - nodeid: str | None = None, + fspath: Optional[LEGACY_PATH] = None, + path_or_parent: Optional[Union[Path, Node]] = None, + path: Optional[Path] = None, + name: Optional[str] = None, + parent: Optional[Node] = None, + config: Optional[Config] = None, + session: Optional["Session"] = None, + nodeid: Optional[str] = None, ) -> None: if path_or_parent: if isinstance(path_or_parent, Node): @@ -600,7 +622,7 @@ class FSCollector(Collector, abc.ABC): try: nodeid = str(self.path.relative_to(session.config.rootpath)) except ValueError: - nodeid = _check_initialpaths_for_relpath(session._initialpaths, path) + nodeid = _check_initialpaths_for_relpath(session, path) if nodeid and os.sep != SEP: nodeid = nodeid.replace(os.sep, SEP) @@ -619,40 +641,30 @@ class FSCollector(Collector, abc.ABC): cls, parent, *, - fspath: LEGACY_PATH | None = None, - path: Path | None = None, + fspath: Optional[LEGACY_PATH] = None, + path: Optional[Path] = None, **kw, - ) -> Self: + ): """The public constructor.""" return super().from_parent(parent=parent, fspath=fspath, path=path, **kw) + def gethookproxy(self, fspath: "os.PathLike[str]"): + warnings.warn(FSCOLLECTOR_GETHOOKPROXY_ISINITPATH, stacklevel=2) + return self.session.gethookproxy(fspath) -class File(FSCollector, abc.ABC): + def isinitpath(self, path: Union[str, "os.PathLike[str]"]) -> bool: + warnings.warn(FSCOLLECTOR_GETHOOKPROXY_ISINITPATH, stacklevel=2) + return self.session.isinitpath(path) + + +class File(FSCollector): """Base class for collecting tests from a file. :ref:`non-python tests`. """ -class Directory(FSCollector, abc.ABC): - """Base class for collecting files from a directory. - - A basic directory collector does the following: goes over the files and - sub-directories in the directory and creates collectors for them by calling - the hooks :hook:`pytest_collect_directory` and :hook:`pytest_collect_file`, - after checking that they are not ignored using - :hook:`pytest_ignore_collect`. - - The default directory collectors are :class:`~pytest.Dir` and - :class:`~pytest.Package`. - - .. versionadded:: 8.0 - - :ref:`custom directory collectors`. - """ - - -class Item(Node, abc.ABC): +class Item(Node): """Base class of all test invocation items. Note that for a single function there might be multiple test invocation items. @@ -664,9 +676,9 @@ class Item(Node, abc.ABC): self, name, parent=None, - config: Config | None = None, - session: Session | None = None, - nodeid: str | None = None, + config: Optional[Config] = None, + session: Optional["Session"] = None, + nodeid: Optional[str] = None, **kw, ) -> None: # The first two arguments are intentionally passed positionally, @@ -681,11 +693,11 @@ class Item(Node, abc.ABC): nodeid=nodeid, **kw, ) - self._report_sections: list[tuple[str, str, str]] = [] + self._report_sections: List[Tuple[str, str, str]] = [] #: A list of tuples (name, value) that holds user defined properties #: for this test. - self.user_properties: list[tuple[str, object]] = [] + self.user_properties: List[Tuple[str, object]] = [] self._check_item_and_collector_diamond_inheritance() @@ -718,7 +730,6 @@ class Item(Node, abc.ABC): PytestWarning, ) - @abc.abstractmethod def runtest(self) -> None: """Run the test case for this item. @@ -745,7 +756,7 @@ class Item(Node, abc.ABC): if content: self._report_sections.append((when, key, content)) - def reportinfo(self) -> tuple[os.PathLike[str] | str, int | None, str]: + def reportinfo(self) -> Tuple[Union["os.PathLike[str]", str], Optional[int], str]: """Get location information for this item for test reports. Returns a tuple with three elements: @@ -759,14 +770,14 @@ class Item(Node, abc.ABC): return self.path, None, "" @cached_property - def location(self) -> tuple[str, int | None, str]: + def location(self) -> Tuple[str, Optional[int], str]: """ Returns a tuple of ``(relfspath, lineno, testname)`` for this item where ``relfspath`` is file path relative to ``config.rootpath`` and lineno is a 0-based line number. """ location = self.reportinfo() - path = absolutepath(location[0]) + path = absolutepath(os.fspath(location[0])) relfspath = self.session._node_location_to_relpath(path) assert type(location[2]) is str return (relfspath, location[1], location[2]) diff --git a/Backend/venv/lib/python3.12/site-packages/_pytest/nose.py b/Backend/venv/lib/python3.12/site-packages/_pytest/nose.py new file mode 100644 index 00000000..273bd045 --- /dev/null +++ b/Backend/venv/lib/python3.12/site-packages/_pytest/nose.py @@ -0,0 +1,50 @@ +"""Run testsuites written for nose.""" +import warnings + +from _pytest.config import hookimpl +from _pytest.deprecated import NOSE_SUPPORT +from _pytest.fixtures import getfixturemarker +from _pytest.nodes import Item +from _pytest.python import Function +from _pytest.unittest import TestCaseFunction + + +@hookimpl(trylast=True) +def pytest_runtest_setup(item: Item) -> None: + if not isinstance(item, Function): + return + # Don't do nose style setup/teardown on direct unittest style classes. + if isinstance(item, TestCaseFunction): + return + + # Capture the narrowed type of item for the teardown closure, + # see https://github.com/python/mypy/issues/2608 + func = item + + call_optional(func.obj, "setup", func.nodeid) + func.addfinalizer(lambda: call_optional(func.obj, "teardown", func.nodeid)) + + # NOTE: Module- and class-level fixtures are handled in python.py + # with `pluginmanager.has_plugin("nose")` checks. + # It would have been nicer to implement them outside of core, but + # it's not straightforward. + + +def call_optional(obj: object, name: str, nodeid: str) -> bool: + method = getattr(obj, name, None) + if method is None: + return False + is_fixture = getfixturemarker(method) is not None + if is_fixture: + return False + if not callable(method): + return False + # Warn about deprecation of this plugin. + method_name = getattr(method, "__name__", str(method)) + warnings.warn( + NOSE_SUPPORT.format(nodeid=nodeid, method=method_name, stage=name), stacklevel=2 + ) + # If there are any problems allow the exception to raise rather than + # silently ignoring it. + method() + return True diff --git a/Backend/venv/lib/python3.12/site-packages/_pytest/outcomes.py b/Backend/venv/lib/python3.12/site-packages/_pytest/outcomes.py index 766be95c..1be97dda 100644 --- a/Backend/venv/lib/python3.12/site-packages/_pytest/outcomes.py +++ b/Backend/venv/lib/python3.12/site-packages/_pytest/outcomes.py @@ -1,21 +1,35 @@ """Exception classes and constants handling test outcomes as well as functions creating them.""" - -from __future__ import annotations - import sys +import warnings from typing import Any -from typing import ClassVar +from typing import Callable +from typing import cast from typing import NoReturn +from typing import Optional +from typing import Type +from typing import TypeVar -from .warning_types import PytestDeprecationWarning +from _pytest.deprecated import KEYWORD_MSG_ARG + +TYPE_CHECKING = False # Avoid circular import through compat. + +if TYPE_CHECKING: + from typing_extensions import Protocol +else: + # typing.Protocol is only available starting from Python 3.8. It is also + # available from typing_extensions, but we don't want a runtime dependency + # on that. So use a dummy runtime implementation. + from typing import Generic + + Protocol = Generic class OutcomeException(BaseException): """OutcomeException and its subclass instances indicate and contain info about test and collection outcomes.""" - def __init__(self, msg: str | None = None, pytrace: bool = True) -> None: + def __init__(self, msg: Optional[str] = None, pytrace: bool = True) -> None: if msg is not None and not isinstance(msg, str): error_msg = ( # type: ignore[unreachable] "{} expected string as 'msg' parameter, got '{}' instead.\n" @@ -44,7 +58,7 @@ class Skipped(OutcomeException): def __init__( self, - msg: str | None = None, + msg: Optional[str] = None, pytrace: bool = True, allow_module_level: bool = False, *, @@ -67,18 +81,41 @@ class Exit(Exception): """Raised for immediate program exits (no tracebacks/summaries).""" def __init__( - self, msg: str = "unknown reason", returncode: int | None = None + self, msg: str = "unknown reason", returncode: Optional[int] = None ) -> None: self.msg = msg self.returncode = returncode super().__init__(msg) -class XFailed(Failed): - """Raised from an explicit call to pytest.xfail().""" +# Elaborate hack to work around https://github.com/python/mypy/issues/2087. +# Ideally would just be `exit.Exception = Exit` etc. + +_F = TypeVar("_F", bound=Callable[..., object]) +_ET = TypeVar("_ET", bound=Type[BaseException]) -class _Exit: +class _WithException(Protocol[_F, _ET]): + Exception: _ET + __call__: _F + + +def _with_exception(exception_type: _ET) -> Callable[[_F], _WithException[_F, _ET]]: + def decorate(func: _F) -> _WithException[_F, _ET]: + func_with_exception = cast(_WithException[_F, _ET], func) + func_with_exception.Exception = exception_type + return func_with_exception + + return decorate + + +# Exposed helper methods. + + +@_with_exception(Exit) +def exit( + reason: str = "", returncode: Optional[int] = None, *, msg: Optional[str] = None +) -> NoReturn: """Exit testing process. :param reason: @@ -86,24 +123,30 @@ class _Exit: only because `msg` is deprecated. :param returncode: - Return code to be used when exiting pytest. None means the same as ``0`` (no error), - same as :func:`sys.exit`. + Return code to be used when exiting pytest. - :raises pytest.exit.Exception: - The exception that is raised. + :param msg: + Same as ``reason``, but deprecated. Will be removed in a future version, use ``reason`` instead. """ + __tracebackhide__ = True + from _pytest.config import UsageError - Exception: ClassVar[type[Exit]] = Exit - - def __call__(self, reason: str = "", returncode: int | None = None) -> NoReturn: - __tracebackhide__ = True - raise Exit(msg=reason, returncode=returncode) + if reason and msg: + raise UsageError( + "cannot pass reason and msg to exit(), `msg` is deprecated, use `reason`." + ) + if not reason: + if msg is None: + raise UsageError("exit() requires a reason argument") + warnings.warn(KEYWORD_MSG_ARG.format(func="exit"), stacklevel=2) + reason = msg + raise Exit(reason, returncode) -exit: _Exit = _Exit() - - -class _Skip: +@_with_exception(Skipped) +def skip( + reason: str = "", *, allow_module_level: bool = False, msg: Optional[str] = None +) -> NoReturn: """Skip an executing test with the given message. This function should be called only during testing (setup, call or teardown) or @@ -121,8 +164,8 @@ class _Skip: Defaults to False. - :raises pytest.skip.Exception: - The exception that is raised. + :param msg: + Same as ``reason``, but deprecated. Will be removed in a future version, use ``reason`` instead. .. note:: It is better to use the :ref:`pytest.mark.skipif ref` marker when @@ -131,18 +174,13 @@ class _Skip: Similarly, use the ``# doctest: +SKIP`` directive (see :py:data:`doctest.SKIP`) to skip a doctest statically. """ - - Exception: ClassVar[type[Skipped]] = Skipped - - def __call__(self, reason: str = "", allow_module_level: bool = False) -> NoReturn: - __tracebackhide__ = True - raise Skipped(msg=reason, allow_module_level=allow_module_level) + __tracebackhide__ = True + reason = _resolve_msg_to_reason("skip", reason, msg) + raise Skipped(msg=reason, allow_module_level=allow_module_level) -skip: _Skip = _Skip() - - -class _Fail: +@_with_exception(Failed) +def fail(reason: str = "", pytrace: bool = True, msg: Optional[str] = None) -> NoReturn: """Explicitly fail an executing test with the given message. :param reason: @@ -152,28 +190,60 @@ class _Fail: If False, msg represents the full failure information and no python traceback will be reported. - :raises pytest.fail.Exception: - The exception that is raised. + :param msg: + Same as ``reason``, but deprecated. Will be removed in a future version, use ``reason`` instead. """ - - Exception: ClassVar[type[Failed]] = Failed - - def __call__(self, reason: str = "", pytrace: bool = True) -> NoReturn: - __tracebackhide__ = True - raise Failed(msg=reason, pytrace=pytrace) + __tracebackhide__ = True + reason = _resolve_msg_to_reason("fail", reason, msg) + raise Failed(msg=reason, pytrace=pytrace) -fail: _Fail = _Fail() +def _resolve_msg_to_reason( + func_name: str, reason: str, msg: Optional[str] = None +) -> str: + """ + Handles converting the deprecated msg parameter if provided into + reason, raising a deprecation warning. This function will be removed + when the optional msg argument is removed from here in future. + + :param str func_name: + The name of the offending function, this is formatted into the deprecation message. + + :param str reason: + The reason= passed into either pytest.fail() or pytest.skip() + + :param str msg: + The msg= passed into either pytest.fail() or pytest.skip(). This will + be converted into reason if it is provided to allow pytest.skip(msg=) or + pytest.fail(msg=) to continue working in the interim period. + + :returns: + The value to use as reason. + + """ + __tracebackhide__ = True + if msg is not None: + if reason: + from pytest import UsageError + + raise UsageError( + f"Passing both ``reason`` and ``msg`` to pytest.{func_name}(...) is not permitted." + ) + warnings.warn(KEYWORD_MSG_ARG.format(func=func_name), stacklevel=3) + reason = msg + return reason -class _XFail: +class XFailed(Failed): + """Raised from an explicit call to pytest.xfail().""" + + +@_with_exception(XFailed) +def xfail(reason: str = "") -> NoReturn: """Imperatively xfail an executing test or setup function with the given reason. This function should be called only during testing (setup, call or teardown). - No other code is executed after using ``xfail()`` (it is implemented - internally by raising an exception). - :param reason: The message to show the user as reason for the xfail. @@ -181,27 +251,13 @@ class _XFail: It is better to use the :ref:`pytest.mark.xfail ref` marker when possible to declare a test to be xfailed under certain conditions like known bugs or missing features. - - :raises pytest.xfail.Exception: - The exception that is raised. """ - - Exception: ClassVar[type[XFailed]] = XFailed - - def __call__(self, reason: str = "") -> NoReturn: - __tracebackhide__ = True - raise XFailed(msg=reason) - - -xfail: _XFail = _XFail() + __tracebackhide__ = True + raise XFailed(reason) def importorskip( - modname: str, - minversion: str | None = None, - reason: str | None = None, - *, - exc_type: type[ImportError] | None = None, + modname: str, minversion: Optional[str] = None, reason: Optional[str] = None ) -> Any: """Import and return the requested module ``modname``, or skip the current test if the module cannot be imported. @@ -214,84 +270,30 @@ def importorskip( :param reason: If given, this reason is shown as the message when the module cannot be imported. - :param exc_type: - The exception that should be captured in order to skip modules. - Must be :py:class:`ImportError` or a subclass. - - If the module can be imported but raises :class:`ImportError`, pytest will - issue a warning to the user, as often users expect the module not to be - found (which would raise :class:`ModuleNotFoundError` instead). - - This warning can be suppressed by passing ``exc_type=ImportError`` explicitly. - - See :ref:`import-or-skip-import-error` for details. - :returns: The imported module. This should be assigned to its canonical name. - :raises pytest.skip.Exception: - If the module cannot be imported. - Example:: docutils = pytest.importorskip("docutils") - - .. versionadded:: 8.2 - - The ``exc_type`` parameter. """ import warnings __tracebackhide__ = True compile(modname, "", "eval") # to catch syntaxerrors - # Until pytest 9.1, we will warn the user if we catch ImportError (instead of ModuleNotFoundError), - # as this might be hiding an installation/environment problem, which is not usually what is intended - # when using importorskip() (#11523). - # In 9.1, to keep the function signature compatible, we just change the code below to: - # 1. Use `exc_type = ModuleNotFoundError` if `exc_type` is not given. - # 2. Remove `warn_on_import` and the warning handling. - if exc_type is None: - exc_type = ImportError - warn_on_import_error = True - else: - warn_on_import_error = False - - skipped: Skipped | None = None - warning: Warning | None = None - with warnings.catch_warnings(): # Make sure to ignore ImportWarnings that might happen because # of existing directories with the same name we're trying to # import but without a __init__.py file. warnings.simplefilter("ignore") - try: __import__(modname) - except exc_type as exc: - # Do not raise or issue warnings inside the catch_warnings() block. + except ImportError as exc: if reason is None: reason = f"could not import {modname!r}: {exc}" - skipped = Skipped(reason, allow_module_level=True) - - if warn_on_import_error and not isinstance(exc, ModuleNotFoundError): - lines = [ - "", - f"Module '{modname}' was found, but when imported by pytest it raised:", - f" {exc!r}", - "In pytest 9.1 this warning will become an error by default.", - "You can fix the underlying problem, or alternatively overwrite this behavior and silence this " - "warning by passing exc_type=ImportError explicitly.", - "See https://docs.pytest.org/en/stable/deprecations.html#pytest-importorskip-default-behavior-regarding-importerror", - ] - warning = PytestDeprecationWarning("\n".join(lines)) - - if warning: - warnings.warn(warning, stacklevel=2) - if skipped: - raise skipped - + raise Skipped(reason, allow_module_level=True) from None mod = sys.modules[modname] if minversion is None: return mod @@ -302,7 +304,8 @@ def importorskip( if verattr is None or Version(verattr) < Version(minversion): raise Skipped( - f"module {modname!r} has __version__ {verattr!r}, required is: {minversion!r}", + "module %r has __version__ %r, required is: %r" + % (modname, verattr, minversion), allow_module_level=True, ) return mod diff --git a/Backend/venv/lib/python3.12/site-packages/_pytest/pastebin.py b/Backend/venv/lib/python3.12/site-packages/_pytest/pastebin.py index c7b39d96..22c7a622 100644 --- a/Backend/venv/lib/python3.12/site-packages/_pytest/pastebin.py +++ b/Backend/venv/lib/python3.12/site-packages/_pytest/pastebin.py @@ -1,18 +1,15 @@ -# mypy: allow-untyped-defs """Submit failure or test session information to a pastebin service.""" - -from __future__ import annotations - -from io import StringIO import tempfile +from io import StringIO from typing import IO +from typing import Union +import pytest from _pytest.config import Config from _pytest.config import create_terminal_writer from _pytest.config.argparsing import Parser from _pytest.stash import StashKey from _pytest.terminal import TerminalReporter -import pytest pastebinfile_key = StashKey[IO[bytes]]() @@ -20,7 +17,7 @@ pastebinfile_key = StashKey[IO[bytes]]() def pytest_addoption(parser: Parser) -> None: group = parser.getgroup("terminal reporting") - group.addoption( + group._addoption( "--pastebin", metavar="mode", action="store", @@ -66,19 +63,18 @@ def pytest_unconfigure(config: Config) -> None: # Write summary. tr.write_sep("=", "Sending information to Paste Service") pastebinurl = create_new_paste(sessionlog) - tr.write_line(f"pastebin session-log: {pastebinurl}\n") + tr.write_line("pastebin session-log: %s\n" % pastebinurl) -def create_new_paste(contents: str | bytes) -> str: +def create_new_paste(contents: Union[str, bytes]) -> str: """Create a new paste using the bpaste.net service. :contents: Paste contents string. :returns: URL to the pasted contents, or an error message. """ import re - from urllib.error import HTTPError - from urllib.parse import urlencode from urllib.request import urlopen + from urllib.parse import urlencode params = {"code": contents, "lexer": "text", "expiry": "1week"} url = "https://bpa.st" @@ -86,11 +82,8 @@ def create_new_paste(contents: str | bytes) -> str: response: str = ( urlopen(url, data=urlencode(params).encode("ascii")).read().decode("utf-8") ) - except HTTPError as e: - with e: # HTTPErrors are also http responses that must be closed! - return f"bad response: {e}" - except OSError as e: # eg urllib.error.URLError - return f"bad response: {e}" + except OSError as exc_info: # urllib errors + return "bad response: %s" % exc_info m = re.search(r'href="/raw/(\w+)"', response) if m: return f"{url}/show/{m.group(1)}" diff --git a/Backend/venv/lib/python3.12/site-packages/_pytest/pathlib.py b/Backend/venv/lib/python3.12/site-packages/_pytest/pathlib.py index cd154346..c2f8535f 100644 --- a/Backend/venv/lib/python3.12/site-packages/_pytest/pathlib.py +++ b/Backend/venv/lib/python3.12/site-packages/_pytest/pathlib.py @@ -1,22 +1,20 @@ -from __future__ import annotations - import atexit -from collections.abc import Callable -from collections.abc import Iterable -from collections.abc import Iterator import contextlib +import fnmatch +import importlib.util +import itertools +import os +import shutil +import sys +import types +import uuid +import warnings from enum import Enum from errno import EBADF from errno import ELOOP from errno import ENOENT from errno import ENOTDIR -import fnmatch from functools import partial -from importlib.machinery import ModuleSpec -from importlib.machinery import PathFinder -import importlib.util -import itertools -import os from os.path import expanduser from os.path import expandvars from os.path import isabs @@ -24,27 +22,26 @@ from os.path import sep from pathlib import Path from pathlib import PurePath from posixpath import sep as posix_sep -import shutil -import sys -import types from types import ModuleType -from typing import Any +from typing import Callable +from typing import Dict +from typing import Iterable +from typing import Iterator +from typing import List +from typing import Optional +from typing import Set +from typing import Tuple +from typing import Type from typing import TypeVar -import uuid -import warnings +from typing import Union from _pytest.compat import assert_never from _pytest.outcomes import skip from _pytest.warning_types import PytestWarning - -if sys.version_info < (3, 11): - from importlib._bootstrap_external import _NamespaceLoader as NamespaceLoader -else: - from importlib.machinery import NamespaceLoader - LOCK_TIMEOUT = 60 * 60 * 24 * 3 + _AnyPurePath = TypeVar("_AnyPurePath", bound=PurePath) # The following function, variables and comments were @@ -59,7 +56,7 @@ _IGNORED_WINERRORS = ( ) -def _ignore_error(exception: Exception) -> bool: +def _ignore_error(exception): return ( getattr(exception, "errno", None) in _IGNORED_ERRORS or getattr(exception, "winerror", None) in _IGNORED_WINERRORS @@ -71,10 +68,12 @@ def get_lock_path(path: _AnyPurePath) -> _AnyPurePath: def on_rm_rf_error( - func: Callable[..., Any] | None, + func, path: str, - excinfo: BaseException - | tuple[type[BaseException], BaseException, types.TracebackType | None], + excinfo: Union[ + BaseException, + Tuple[Type[BaseException], BaseException, Optional[types.TracebackType]], + ], *, start_path: Path, ) -> bool: @@ -102,7 +101,9 @@ def on_rm_rf_error( if func not in (os.open,): warnings.warn( PytestWarning( - f"(rm_rf) unknown function {func} when removing {path}:\n{type(exc)}: {exc}" + "(rm_rf) unknown function {} when removing {}:\n{}: {}".format( + func, path, type(exc), exc + ) ) ) return False @@ -170,23 +171,23 @@ def rm_rf(path: Path) -> None: shutil.rmtree(str(path), onerror=onerror) -def find_prefixed(root: Path, prefix: str) -> Iterator[os.DirEntry[str]]: - """Find all elements in root that begin with the prefix, case-insensitive.""" +def find_prefixed(root: Path, prefix: str) -> Iterator[Path]: + """Find all elements in root that begin with the prefix, case insensitive.""" l_prefix = prefix.lower() - for x in os.scandir(root): + for x in root.iterdir(): if x.name.lower().startswith(l_prefix): yield x -def extract_suffixes(iter: Iterable[os.DirEntry[str]], prefix: str) -> Iterator[str]: +def extract_suffixes(iter: Iterable[PurePath], prefix: str) -> Iterator[str]: """Return the parts of the paths following the prefix. :param iter: Iterator over path names. :param prefix: Expected prefix of the path names. """ p_len = len(prefix) - for entry in iter: - yield entry.name[p_len:] + for p in iter: + yield p.name[p_len:] def find_suffixes(root: Path, prefix: str) -> Iterator[str]: @@ -194,7 +195,7 @@ def find_suffixes(root: Path, prefix: str) -> Iterator[str]: return extract_suffixes(find_prefixed(root, prefix), prefix) -def parse_num(maybe_num: str) -> int: +def parse_num(maybe_num) -> int: """Parse number path suffixes, returns -1 on error.""" try: return int(maybe_num) @@ -202,7 +203,9 @@ def parse_num(maybe_num: str) -> int: return -1 -def _force_symlink(root: Path, target: str | PurePath, link_to: str | Path) -> None: +def _force_symlink( + root: Path, target: Union[str, PurePath], link_to: Union[str, Path] +) -> None: """Helper to create the current symlink. It's full of race conditions that are reasonably OK to ignore @@ -239,7 +242,7 @@ def make_numbered_dir(root: Path, prefix: str, mode: int = 0o700) -> Path: else: raise OSError( "could not create numbered dir with prefix " - f"{prefix} in {root} after 10 tries" + "{prefix} in {root} after 10 tries".format(prefix=prefix, root=root) ) @@ -260,9 +263,7 @@ def create_cleanup_lock(p: Path) -> Path: return lock_path -def register_cleanup_lock_removal( - lock_path: Path, register: Any = atexit.register -) -> Any: +def register_cleanup_lock_removal(lock_path: Path, register=atexit.register): """Register a cleanup function for removing a lock, by default on atexit.""" pid = os.getpid() @@ -345,15 +346,15 @@ def cleanup_candidates(root: Path, prefix: str, keep: int) -> Iterator[Path]: """List candidates for numbered directories to be removed - follows py.path.""" max_existing = max(map(parse_num, find_suffixes(root, prefix)), default=-1) max_delete = max_existing - keep - entries = find_prefixed(root, prefix) - entries, entries2 = itertools.tee(entries) - numbers = map(parse_num, extract_suffixes(entries2, prefix)) - for entry, number in zip(entries, numbers, strict=True): + paths = find_prefixed(root, prefix) + paths, paths2 = itertools.tee(paths) + numbers = map(parse_num, extract_suffixes(paths2, prefix)) + for path, number in zip(paths, numbers): if number <= max_delete: - yield Path(entry) + yield path -def cleanup_dead_symlinks(root: Path) -> None: +def cleanup_dead_symlinks(root: Path): for left_dir in root.iterdir(): if left_dir.is_symlink(): if not left_dir.resolve().exists(): @@ -416,7 +417,7 @@ def resolve_from_str(input: str, rootpath: Path) -> Path: return rootpath.joinpath(input) -def fnmatch_ex(pattern: str, path: str | os.PathLike[str]) -> bool: +def fnmatch_ex(pattern: str, path: Union[str, "os.PathLike[str]"]) -> bool: """A port of FNMatcher from py.path.common which works with PurePath() instances. The difference between this algorithm and PurePath.match() is that the @@ -452,19 +453,15 @@ def fnmatch_ex(pattern: str, path: str | os.PathLike[str]) -> bool: return fnmatch.fnmatch(name, pattern) -def parts(s: str) -> set[str]: +def parts(s: str) -> Set[str]: parts = s.split(sep) return {sep.join(parts[: i + 1]) or sep for i in range(len(parts))} -def symlink_or_skip( - src: os.PathLike[str] | str, - dst: os.PathLike[str] | str, - **kwargs: Any, -) -> None: +def symlink_or_skip(src, dst, **kwargs): """Make a symlink, or skip the test in case symlinks are not supported.""" try: - os.symlink(src, dst, **kwargs) + os.symlink(str(src), str(dst), **kwargs) except OSError as e: skip(f"symlinks not supported: {e}") @@ -487,90 +484,73 @@ class ImportPathMismatchError(ImportError): def import_path( - path: str | os.PathLike[str], + p: Union[str, "os.PathLike[str]"], *, - mode: str | ImportMode = ImportMode.prepend, + mode: Union[str, ImportMode] = ImportMode.prepend, root: Path, - consider_namespace_packages: bool, ) -> ModuleType: - """ - Import and return a module from the given path, which can be a file (a module) or + """Import and return a module from the given path, which can be a file (a module) or a directory (a package). - :param path: - Path to the file to import. + The import mechanism used is controlled by the `mode` parameter: - :param mode: - Controls the underlying import mechanism that will be used: + * `mode == ImportMode.prepend`: the directory containing the module (or package, taking + `__init__.py` files into account) will be put at the *start* of `sys.path` before + being imported with `importlib.import_module`. - * ImportMode.prepend: the directory containing the module (or package, taking - `__init__.py` files into account) will be put at the *start* of `sys.path` before - being imported with `importlib.import_module`. + * `mode == ImportMode.append`: same as `prepend`, but the directory will be appended + to the end of `sys.path`, if not already in `sys.path`. - * ImportMode.append: same as `prepend`, but the directory will be appended - to the end of `sys.path`, if not already in `sys.path`. - - * ImportMode.importlib: uses more fine control mechanisms provided by `importlib` - to import the module, which avoids having to muck with `sys.path` at all. It effectively - allows having same-named test modules in different places. + * `mode == ImportMode.importlib`: uses more fine control mechanisms provided by `importlib` + to import the module, which avoids having to muck with `sys.path` at all. It effectively + allows having same-named test modules in different places. :param root: Used as an anchor when mode == ImportMode.importlib to obtain a unique name for the module being imported so it can safely be stored into ``sys.modules``. - :param consider_namespace_packages: - If True, consider namespace packages when resolving module names. - :raises ImportPathMismatchError: If after importing the given `path` and the module `__file__` are different. Only raised in `prepend` and `append` modes. """ - path = Path(path) mode = ImportMode(mode) + path = Path(p) + if not path.exists(): raise ImportError(path) if mode is ImportMode.importlib: - # Try to import this module using the standard import mechanisms, but - # without touching sys.path. - try: - pkg_root, module_name = resolve_pkg_root_and_module_name( - path, consider_namespace_packages=consider_namespace_packages - ) - except CouldNotResolvePathError: - pass - else: - # If the given module name is already in sys.modules, do not import it again. - with contextlib.suppress(KeyError): - return sys.modules[module_name] - - mod = _import_module_using_spec( - module_name, path, pkg_root, insert_modules=False - ) - if mod is not None: - return mod - - # Could not import the module with the current sys.path, so we fall back - # to importing the file as a single module, not being a part of a package. module_name = module_name_from_path(path, root) with contextlib.suppress(KeyError): return sys.modules[module_name] - mod = _import_module_using_spec( - module_name, path, path.parent, insert_modules=True - ) - if mod is None: + for meta_importer in sys.meta_path: + spec = meta_importer.find_spec(module_name, [str(path.parent)]) + if spec is not None: + break + else: + spec = importlib.util.spec_from_file_location(module_name, str(path)) + + if spec is None: raise ImportError(f"Can't find module {module_name} at location {path}") + mod = importlib.util.module_from_spec(spec) + sys.modules[module_name] = mod + spec.loader.exec_module(mod) # type: ignore[union-attr] + insert_missing_modules(sys.modules, module_name) return mod - try: - pkg_root, module_name = resolve_pkg_root_and_module_name( - path, consider_namespace_packages=consider_namespace_packages - ) - except CouldNotResolvePathError: - pkg_root, module_name = path.parent, path.stem + pkg_path = resolve_package_path(path) + if pkg_path is not None: + pkg_root = pkg_path.parent + names = list(path.with_suffix("").relative_to(pkg_root).parts) + if names[-1] == "__init__": + names.pop() + module_name = ".".join(names) + else: + pkg_root = path.parent + module_name = path.stem # Change sys.path permanently: restoring it at the end of this function would cause surprising # problems because of delayed imports: for example, a conftest.py file imported by this function @@ -612,148 +592,6 @@ def import_path( return mod -def _import_module_using_spec( - module_name: str, module_path: Path, module_location: Path, *, insert_modules: bool -) -> ModuleType | None: - """ - Tries to import a module by its canonical name, path, and its parent location. - - :param module_name: - The expected module name, will become the key of `sys.modules`. - - :param module_path: - The file path of the module, for example `/foo/bar/test_demo.py`. - If module is a package, pass the path to the `__init__.py` of the package. - If module is a namespace package, pass directory path. - - :param module_location: - The parent location of the module. - If module is a package, pass the directory containing the `__init__.py` file. - - :param insert_modules: - If True, will call `insert_missing_modules` to create empty intermediate modules - with made-up module names (when importing test files not reachable from `sys.path`). - - Example 1 of parent_module_*: - - module_name: "a.b.c.demo" - module_path: Path("a/b/c/demo.py") - module_location: Path("a/b/c/") - if "a.b.c" is package ("a/b/c/__init__.py" exists), then - parent_module_name: "a.b.c" - parent_module_path: Path("a/b/c/__init__.py") - parent_module_location: Path("a/b/c/") - else: - parent_module_name: "a.b.c" - parent_module_path: Path("a/b/c") - parent_module_location: Path("a/b/") - - Example 2 of parent_module_*: - - module_name: "a.b.c" - module_path: Path("a/b/c/__init__.py") - module_location: Path("a/b/c/") - if "a.b" is package ("a/b/__init__.py" exists), then - parent_module_name: "a.b" - parent_module_path: Path("a/b/__init__.py") - parent_module_location: Path("a/b/") - else: - parent_module_name: "a.b" - parent_module_path: Path("a/b/") - parent_module_location: Path("a/") - """ - # Attempt to import the parent module, seems is our responsibility: - # https://github.com/python/cpython/blob/73906d5c908c1e0b73c5436faeff7d93698fc074/Lib/importlib/_bootstrap.py#L1308-L1311 - parent_module_name, _, name = module_name.rpartition(".") - parent_module: ModuleType | None = None - if parent_module_name: - parent_module = sys.modules.get(parent_module_name) - # If the parent_module lacks the `__path__` attribute, AttributeError when finding a submodule's spec, - # requiring re-import according to the path. - need_reimport = not hasattr(parent_module, "__path__") - if parent_module is None or need_reimport: - # Get parent_location based on location, get parent_path based on path. - if module_path.name == "__init__.py": - # If the current module is in a package, - # need to leave the package first and then enter the parent module. - parent_module_path = module_path.parent.parent - else: - parent_module_path = module_path.parent - - if (parent_module_path / "__init__.py").is_file(): - # If the parent module is a package, loading by __init__.py file. - parent_module_path = parent_module_path / "__init__.py" - - parent_module = _import_module_using_spec( - parent_module_name, - parent_module_path, - parent_module_path.parent, - insert_modules=insert_modules, - ) - - # Checking with sys.meta_path first in case one of its hooks can import this module, - # such as our own assertion-rewrite hook. - for meta_importer in sys.meta_path: - module_name_of_meta = getattr(meta_importer.__class__, "__module__", "") - if module_name_of_meta == "_pytest.assertion.rewrite" and module_path.is_file(): - # Import modules in subdirectories by module_path - # to ensure assertion rewrites are not missed (#12659). - find_spec_path = [str(module_location), str(module_path)] - else: - find_spec_path = [str(module_location)] - - spec = meta_importer.find_spec(module_name, find_spec_path) - - if spec_matches_module_path(spec, module_path): - break - else: - loader = None - if module_path.is_dir(): - # The `spec_from_file_location` matches a loader based on the file extension by default. - # For a namespace package, need to manually specify a loader. - loader = NamespaceLoader(name, module_path, PathFinder()) # type: ignore[arg-type] - - spec = importlib.util.spec_from_file_location( - module_name, str(module_path), loader=loader - ) - - if spec_matches_module_path(spec, module_path): - assert spec is not None - # Find spec and import this module. - mod = importlib.util.module_from_spec(spec) - sys.modules[module_name] = mod - spec.loader.exec_module(mod) # type: ignore[union-attr] - - # Set this module as an attribute of the parent module (#12194). - if parent_module is not None: - setattr(parent_module, name, mod) - - if insert_modules: - insert_missing_modules(sys.modules, module_name) - return mod - - return None - - -def spec_matches_module_path(module_spec: ModuleSpec | None, module_path: Path) -> bool: - """Return true if the given ModuleSpec can be used to import the given module path.""" - if module_spec is None: - return False - - if module_spec.origin: - return Path(module_spec.origin) == module_path - - # Compare the path with the `module_spec.submodule_Search_Locations` in case - # the module is part of a namespace package. - # https://docs.python.org/3/library/importlib.html#importlib.machinery.ModuleSpec.submodule_search_locations - if module_spec.submodule_search_locations: # can be None. - for path in module_spec.submodule_search_locations: - if Path(path) == module_path: - return True - - return False - - # Implement a special _is_same function on Windows which returns True if the two filenames # compare equal, to circumvent os.path.samefile returning False for mounts in UNC (#7678). if sys.platform.startswith("win"): @@ -790,15 +628,10 @@ def module_name_from_path(path: Path, root: Path) -> str: if len(path_parts) >= 2 and path_parts[-1] == "__init__": path_parts = path_parts[:-1] - # Module names cannot contain ".", normalize them to "_". This prevents - # a directory having a "." in the name (".env.310" for example) causing extra intermediate modules. - # Also, important to replace "." at the start of paths, as those are considered relative imports. - path_parts = tuple(x.replace(".", "_") for x in path_parts) - return ".".join(path_parts) -def insert_missing_modules(modules: dict[str, ModuleType], module_name: str) -> None: +def insert_missing_modules(modules: Dict[str, ModuleType], module_name: str) -> None: """ Used by ``import_path`` to create intermediate modules when using mode=importlib. @@ -807,45 +640,48 @@ def insert_missing_modules(modules: dict[str, ModuleType], module_name: str) -> otherwise "src.tests.test_foo" is not importable by ``__import__``. """ module_parts = module_name.split(".") + child_module: Union[ModuleType, None] = None + module: Union[ModuleType, None] = None + child_name: str = "" while module_name: - parent_module_name, _, child_name = module_name.rpartition(".") - if parent_module_name: - parent_module = modules.get(parent_module_name) - if parent_module is None: - try: - # If sys.meta_path is empty, calling import_module will issue - # a warning and raise ModuleNotFoundError. To avoid the - # warning, we check sys.meta_path explicitly and raise the error - # ourselves to fall back to creating a dummy module. - if not sys.meta_path: - raise ModuleNotFoundError - parent_module = importlib.import_module(parent_module_name) - except ModuleNotFoundError: - parent_module = ModuleType( - module_name, - doc="Empty module created by pytest's importmode=importlib.", - ) - modules[parent_module_name] = parent_module - + if module_name not in modules: + try: + # If sys.meta_path is empty, calling import_module will issue + # a warning and raise ModuleNotFoundError. To avoid the + # warning, we check sys.meta_path explicitly and raise the error + # ourselves to fall back to creating a dummy module. + if not sys.meta_path: + raise ModuleNotFoundError + module = importlib.import_module(module_name) + except ModuleNotFoundError: + module = ModuleType( + module_name, + doc="Empty module created by pytest's importmode=importlib.", + ) + else: + module = modules[module_name] + if child_module: # Add child attribute to the parent that can reference the child # modules. - if not hasattr(parent_module, child_name): - setattr(parent_module, child_name, modules[module_name]) - + if not hasattr(module, child_name): + setattr(module, child_name, child_module) + modules[module_name] = module + # Keep track of the child module while moving up the tree. + child_module, child_name = module, module_name.rpartition(".")[-1] module_parts.pop(-1) module_name = ".".join(module_parts) -def resolve_package_path(path: Path) -> Path | None: +def resolve_package_path(path: Path) -> Optional[Path]: """Return the Python package path by looking for the last directory upwards which still contains an __init__.py. - Returns None if it cannot be determined. + Returns None if it can not be determined. """ result = None for parent in itertools.chain((path,), path.parents): if parent.is_dir(): - if not (parent / "__init__.py").is_file(): + if not parent.joinpath("__init__.py").is_file(): break if not parent.name.isidentifier(): break @@ -853,135 +689,30 @@ def resolve_package_path(path: Path) -> Path | None: return result -def resolve_pkg_root_and_module_name( - path: Path, *, consider_namespace_packages: bool = False -) -> tuple[Path, str]: - """ - Return the path to the directory of the root package that contains the - given Python file, and its module name: - - src/ - app/ - __init__.py - core/ - __init__.py - models.py - - Passing the full path to `models.py` will yield Path("src") and "app.core.models". - - If consider_namespace_packages is True, then we additionally check upwards in the hierarchy - for namespace packages: - - https://packaging.python.org/en/latest/guides/packaging-namespace-packages - - Raises CouldNotResolvePathError if the given path does not belong to a package (missing any __init__.py files). - """ - pkg_root: Path | None = None - pkg_path = resolve_package_path(path) - if pkg_path is not None: - pkg_root = pkg_path.parent - if consider_namespace_packages: - start = pkg_root if pkg_root is not None else path.parent - for candidate in (start, *start.parents): - module_name = compute_module_name(candidate, path) - if module_name and is_importable(module_name, path): - # Point the pkg_root to the root of the namespace package. - pkg_root = candidate - break - - if pkg_root is not None: - module_name = compute_module_name(pkg_root, path) - if module_name: - return pkg_root, module_name - - raise CouldNotResolvePathError(f"Could not resolve for {path}") - - -def is_importable(module_name: str, module_path: Path) -> bool: - """ - Return if the given module path could be imported normally by Python, akin to the user - entering the REPL and importing the corresponding module name directly, and corresponds - to the module_path specified. - - :param module_name: - Full module name that we want to check if is importable. - For example, "app.models". - - :param module_path: - Full path to the python module/package we want to check if is importable. - For example, "/projects/src/app/models.py". - """ - try: - # Note this is different from what we do in ``_import_module_using_spec``, where we explicitly search through - # sys.meta_path to be able to pass the path of the module that we want to import (``meta_importer.find_spec``). - # Using importlib.util.find_spec() is different, it gives the same results as trying to import - # the module normally in the REPL. - spec = importlib.util.find_spec(module_name) - except (ImportError, ValueError, ImportWarning): - return False - else: - return spec_matches_module_path(spec, module_path) - - -def compute_module_name(root: Path, module_path: Path) -> str | None: - """Compute a module name based on a path and a root anchor.""" - try: - path_without_suffix = module_path.with_suffix("") - except ValueError: - # Empty paths (such as Path.cwd()) might break meta_path hooks (like our own assertion rewriter). - return None - - try: - relative = path_without_suffix.relative_to(root) - except ValueError: # pragma: no cover - return None - names = list(relative.parts) - if not names: - return None - if names[-1] == "__init__": - names.pop() - return ".".join(names) - - -class CouldNotResolvePathError(Exception): - """Custom exception raised by resolve_pkg_root_and_module_name.""" - - -def scandir( - path: str | os.PathLike[str], - sort_key: Callable[[os.DirEntry[str]], object] = lambda entry: entry.name, -) -> list[os.DirEntry[str]]: +def scandir(path: Union[str, "os.PathLike[str]"]) -> List["os.DirEntry[str]"]: """Scan a directory recursively, in breadth-first order. - The returned entries are sorted according to the given key. - The default is to sort by name. - If the directory does not exist, return an empty list. + The returned entries are sorted. """ entries = [] - # Attempt to create a scandir iterator for the given path. - try: - scandir_iter = os.scandir(path) - except FileNotFoundError: - # If the directory does not exist, return an empty list. - return [] - # Use the scandir iterator in a context manager to ensure it is properly closed. - with scandir_iter as s: + with os.scandir(path) as s: + # Skip entries with symlink loops and other brokenness, so the caller + # doesn't have to deal with it. for entry in s: try: entry.is_file() except OSError as err: if _ignore_error(err): continue - # Reraise non-ignorable errors to avoid hiding issues. raise entries.append(entry) - entries.sort(key=sort_key) # type: ignore[arg-type] + entries.sort(key=lambda entry: entry.name) return entries def visit( - path: str | os.PathLike[str], recurse: Callable[[os.DirEntry[str]], bool] -) -> Iterator[os.DirEntry[str]]: + path: Union[str, "os.PathLike[str]"], recurse: Callable[["os.DirEntry[str]"], bool] +) -> Iterator["os.DirEntry[str]"]: """Walk a directory recursively, in breadth-first order. The `recurse` predicate determines whether a directory is recursed. @@ -995,16 +726,16 @@ def visit( yield from visit(entry.path, recurse) -def absolutepath(path: str | os.PathLike[str]) -> Path: +def absolutepath(path: Union[Path, str]) -> Path: """Convert a path to an absolute path using os.path.abspath. Prefer this over Path.resolve() (see #6523). Prefer this over Path.absolute() (not public, doesn't normalize). """ - return Path(os.path.abspath(path)) + return Path(os.path.abspath(str(path))) -def commonpath(path1: Path, path2: Path) -> Path | None: +def commonpath(path1: Path, path2: Path) -> Optional[Path]: """Return the common part shared with the other path, or None if there is no common part. @@ -1045,6 +776,24 @@ def bestrelpath(directory: Path, dest: Path) -> str: ) +# Originates from py. path.local.copy(), with siginficant trims and adjustments. +# TODO(py38): Replace with shutil.copytree(..., symlinks=True, dirs_exist_ok=True) +def copytree(source: Path, target: Path) -> None: + """Recursively copy a source directory to target.""" + assert source.is_dir() + for entry in visit(source, recurse=lambda entry: not entry.is_symlink()): + x = Path(entry) + relpath = x.relative_to(source) + newx = target / relpath + newx.parent.mkdir(exist_ok=True) + if x.is_symlink(): + newx.symlink_to(os.readlink(x)) + elif x.is_file(): + shutil.copyfile(x, newx) + elif x.is_dir(): + newx.mkdir(exist_ok=True) + + def safe_exists(p: Path) -> bool: """Like Path.exists(), but account for input arguments that might be too long (#11394).""" try: @@ -1053,11 +802,3 @@ def safe_exists(p: Path) -> bool: # ValueError: stat: path too long for Windows # OSError: [WinError 123] The filename, directory name, or volume label syntax is incorrect return False - - -def samefile_nofollow(p1: Path, p2: Path) -> bool: - """Test whether two paths reference the same actual file or directory. - - Unlike Path.samefile(), does not resolve symlinks. - """ - return os.path.samestat(p1.lstat(), p2.lstat()) diff --git a/Backend/venv/lib/python3.12/site-packages/_pytest/pytester.py b/Backend/venv/lib/python3.12/site-packages/_pytest/pytester.py index 1cd5f05d..cdfc2c04 100644 --- a/Backend/venv/lib/python3.12/site-packages/_pytest/pytester.py +++ b/Backend/venv/lib/python3.12/site-packages/_pytest/pytester.py @@ -1,38 +1,37 @@ -# mypy: allow-untyped-defs """(Disabled by default) support for testing pytest and pytest plugins. PYTEST_DONT_REWRITE """ - -from __future__ import annotations - import collections.abc -from collections.abc import Callable -from collections.abc import Generator -from collections.abc import Iterable -from collections.abc import Sequence import contextlib -from fnmatch import fnmatch import gc import importlib -from io import StringIO import locale import os -from pathlib import Path import platform import re import shutil import subprocess import sys import traceback +from fnmatch import fnmatch +from io import StringIO +from pathlib import Path from typing import Any -from typing import Final -from typing import final +from typing import Callable +from typing import Dict +from typing import Generator from typing import IO -from typing import Literal +from typing import Iterable +from typing import List +from typing import Optional from typing import overload +from typing import Sequence from typing import TextIO +from typing import Tuple +from typing import Type from typing import TYPE_CHECKING +from typing import Union from weakref import WeakKeyDictionary from iniconfig import IniConfig @@ -41,6 +40,7 @@ from iniconfig import SectionWrapper from _pytest import timing from _pytest._code import Source from _pytest.capture import _get_multicapture +from _pytest.compat import final from _pytest.compat import NOTSET from _pytest.compat import NotSetType from _pytest.config import _PluggyPlugin @@ -61,14 +61,18 @@ from _pytest.outcomes import fail from _pytest.outcomes import importorskip from _pytest.outcomes import skip from _pytest.pathlib import bestrelpath +from _pytest.pathlib import copytree from _pytest.pathlib import make_numbered_dir from _pytest.reports import CollectReport from _pytest.reports import TestReport from _pytest.tmpdir import TempPathFactory -from _pytest.warning_types import PytestFDWarning +from _pytest.warning_types import PytestWarning if TYPE_CHECKING: + from typing_extensions import Final + from typing_extensions import Literal + import pexpect @@ -119,19 +123,14 @@ def pytest_configure(config: Config) -> None: class LsofFdLeakChecker: - def get_open_files(self) -> list[tuple[str, str]]: - if sys.version_info >= (3, 11): - # New in Python 3.11, ignores utf-8 mode - encoding = locale.getencoding() - else: - encoding = locale.getpreferredencoding(False) + def get_open_files(self) -> List[Tuple[str, str]]: out = subprocess.run( ("lsof", "-Ffn0", "-p", str(os.getpid())), stdout=subprocess.PIPE, stderr=subprocess.DEVNULL, check=True, text=True, - encoding=encoding, + encoding=locale.getpreferredencoding(False), ).stdout def isopen(line: str) -> bool: @@ -164,38 +163,36 @@ class LsofFdLeakChecker: else: return True - @hookimpl(wrapper=True, tryfirst=True) - def pytest_runtest_protocol(self, item: Item) -> Generator[None, object, object]: + @hookimpl(hookwrapper=True, tryfirst=True) + def pytest_runtest_protocol(self, item: Item) -> Generator[None, None, None]: lines1 = self.get_open_files() - try: - return (yield) - finally: - if hasattr(sys, "pypy_version_info"): - gc.collect() - lines2 = self.get_open_files() + yield + if hasattr(sys, "pypy_version_info"): + gc.collect() + lines2 = self.get_open_files() - new_fds = {t[0] for t in lines2} - {t[0] for t in lines1} - leaked_files = [t for t in lines2 if t[0] in new_fds] - if leaked_files: - error = [ - f"***** {len(leaked_files)} FD leakage detected", - *(str(f) for f in leaked_files), - "*** Before:", - *(str(f) for f in lines1), - "*** After:", - *(str(f) for f in lines2), - f"***** {len(leaked_files)} FD leakage detected", - "*** function {}:{}: {} ".format(*item.location), - "See issue #2366", - ] - item.warn(PytestFDWarning("\n".join(error))) + new_fds = {t[0] for t in lines2} - {t[0] for t in lines1} + leaked_files = [t for t in lines2 if t[0] in new_fds] + if leaked_files: + error = [ + "***** %s FD leakage detected" % len(leaked_files), + *(str(f) for f in leaked_files), + "*** Before:", + *(str(f) for f in lines1), + "*** After:", + *(str(f) for f in lines2), + "***** %s FD leakage detected" % len(leaked_files), + "*** function %s:%s: %s " % item.location, + "See issue #2366", + ] + item.warn(PytestWarning("\n".join(error))) # used at least by pytest-xdist plugin @fixture -def _pytest(request: FixtureRequest) -> PytestArg: +def _pytest(request: FixtureRequest) -> "PytestArg": """Return a helper which offers a gethookrecorder(hook) method which returns a HookRecorder instance which helps to make assertions about called hooks.""" @@ -206,13 +203,13 @@ class PytestArg: def __init__(self, request: FixtureRequest) -> None: self._request = request - def gethookrecorder(self, hook) -> HookRecorder: + def gethookrecorder(self, hook) -> "HookRecorder": hookrecorder = HookRecorder(hook._pm) self._request.addfinalizer(hookrecorder.finish_recording) return hookrecorder -def get_public_names(values: Iterable[str]) -> list[str]: +def get_public_names(values: Iterable[str]) -> List[str]: """Only return names from iterator values without a leading underscore.""" return [x for x in values if x[0] != "_"] @@ -242,7 +239,8 @@ class RecordedHookCall: if TYPE_CHECKING: # The class has undetermined attributes, this tells mypy about it. - def __getattr__(self, key: str): ... + def __getattr__(self, key: str): + ... @final @@ -261,8 +259,8 @@ class HookRecorder: check_ispytest(_ispytest) self._pluginmanager = pluginmanager - self.calls: list[RecordedHookCall] = [] - self.ret: int | ExitCode | None = None + self.calls: List[RecordedHookCall] = [] + self.ret: Optional[Union[int, ExitCode]] = None def before(hook_name: str, hook_impls, kwargs) -> None: self.calls.append(RecordedHookCall(hook_name, kwargs)) @@ -275,18 +273,17 @@ class HookRecorder: def finish_recording(self) -> None: self._undo_wrapping() - def getcalls(self, names: str | Iterable[str]) -> list[RecordedHookCall]: + def getcalls(self, names: Union[str, Iterable[str]]) -> List[RecordedHookCall]: """Get all recorded calls to hooks with the given names (or name).""" if isinstance(names, str): names = names.split() return [call for call in self.calls if call._name in names] - def assert_contains(self, entries: Sequence[tuple[str, str]]) -> None: + def assert_contains(self, entries: Sequence[Tuple[str, str]]) -> None: __tracebackhide__ = True i = 0 entries = list(entries) - # Since Python 3.13, f_locals is not a dict, but eval requires a dict. - backlocals = dict(sys._getframe(1).f_locals) + backlocals = sys._getframe(1).f_locals while entries: name, check = entries.pop(0) for ind, call in enumerate(self.calls[i:]): @@ -310,7 +307,7 @@ class HookRecorder: del self.calls[i] return call lines = [f"could not find call {name!r}, in:"] - lines.extend([f" {x}" for x in self.calls]) + lines.extend([" %s" % x for x in self.calls]) fail("\n".join(lines)) def getcall(self, name: str) -> RecordedHookCall: @@ -323,42 +320,45 @@ class HookRecorder: @overload def getreports( self, - names: Literal["pytest_collectreport"], - ) -> Sequence[CollectReport]: ... + names: "Literal['pytest_collectreport']", + ) -> Sequence[CollectReport]: + ... @overload def getreports( self, - names: Literal["pytest_runtest_logreport"], - ) -> Sequence[TestReport]: ... + names: "Literal['pytest_runtest_logreport']", + ) -> Sequence[TestReport]: + ... @overload def getreports( self, - names: str | Iterable[str] = ( + names: Union[str, Iterable[str]] = ( "pytest_collectreport", "pytest_runtest_logreport", ), - ) -> Sequence[CollectReport | TestReport]: ... + ) -> Sequence[Union[CollectReport, TestReport]]: + ... def getreports( self, - names: str | Iterable[str] = ( + names: Union[str, Iterable[str]] = ( "pytest_collectreport", "pytest_runtest_logreport", ), - ) -> Sequence[CollectReport | TestReport]: + ) -> Sequence[Union[CollectReport, TestReport]]: return [x.report for x in self.getcalls(names)] def matchreport( self, inamepart: str = "", - names: str | Iterable[str] = ( + names: Union[str, Iterable[str]] = ( "pytest_runtest_logreport", "pytest_collectreport", ), - when: str | None = None, - ) -> CollectReport | TestReport: + when: Optional[str] = None, + ) -> Union[CollectReport, TestReport]: """Return a testreport whose dotted import path matches.""" values = [] for rep in self.getreports(names=names): @@ -371,43 +371,48 @@ class HookRecorder: values.append(rep) if not values: raise ValueError( - f"could not find test report matching {inamepart!r}: " - "no test reports at all!" + "could not find test report matching %r: " + "no test reports at all!" % (inamepart,) ) if len(values) > 1: raise ValueError( - f"found 2 or more testreports matching {inamepart!r}: {values}" + "found 2 or more testreports matching {!r}: {}".format( + inamepart, values + ) ) return values[0] @overload def getfailures( self, - names: Literal["pytest_collectreport"], - ) -> Sequence[CollectReport]: ... + names: "Literal['pytest_collectreport']", + ) -> Sequence[CollectReport]: + ... @overload def getfailures( self, - names: Literal["pytest_runtest_logreport"], - ) -> Sequence[TestReport]: ... + names: "Literal['pytest_runtest_logreport']", + ) -> Sequence[TestReport]: + ... @overload def getfailures( self, - names: str | Iterable[str] = ( + names: Union[str, Iterable[str]] = ( "pytest_collectreport", "pytest_runtest_logreport", ), - ) -> Sequence[CollectReport | TestReport]: ... + ) -> Sequence[Union[CollectReport, TestReport]]: + ... def getfailures( self, - names: str | Iterable[str] = ( + names: Union[str, Iterable[str]] = ( "pytest_collectreport", "pytest_runtest_logreport", ), - ) -> Sequence[CollectReport | TestReport]: + ) -> Sequence[Union[CollectReport, TestReport]]: return [rep for rep in self.getreports(names) if rep.failed] def getfailedcollections(self) -> Sequence[CollectReport]: @@ -415,10 +420,10 @@ class HookRecorder: def listoutcomes( self, - ) -> tuple[ + ) -> Tuple[ Sequence[TestReport], - Sequence[CollectReport | TestReport], - Sequence[CollectReport | TestReport], + Sequence[Union[CollectReport, TestReport]], + Sequence[Union[CollectReport, TestReport]], ]: passed = [] skipped = [] @@ -437,7 +442,7 @@ class HookRecorder: failed.append(rep) return passed, skipped, failed - def countoutcomes(self) -> list[int]: + def countoutcomes(self) -> List[int]: return [len(x) for x in self.listoutcomes()] def assertoutcome(self, passed: int = 0, skipped: int = 0, failed: int = 0) -> None: @@ -457,14 +462,14 @@ class HookRecorder: @fixture -def linecomp() -> LineComp: +def linecomp() -> "LineComp": """A :class: `LineComp` instance for checking that an input linearly contains a sequence of strings.""" return LineComp() @fixture(name="LineMatcher") -def LineMatcher_fixture(request: FixtureRequest) -> type[LineMatcher]: +def LineMatcher_fixture(request: FixtureRequest) -> Type["LineMatcher"]: """A reference to the :class: `LineMatcher`. This is instantiable with a list of lines (without their trailing newlines). @@ -476,7 +481,7 @@ def LineMatcher_fixture(request: FixtureRequest) -> type[LineMatcher]: @fixture def pytester( request: FixtureRequest, tmp_path_factory: TempPathFactory, monkeypatch: MonkeyPatch -) -> Pytester: +) -> "Pytester": """ Facilities to write tests/configuration files, execute pytest in isolation, and match against expected output, perfect for black-box testing of pytest plugins. @@ -491,7 +496,7 @@ def pytester( @fixture -def _sys_snapshot() -> Generator[None]: +def _sys_snapshot() -> Generator[None, None, None]: snappaths = SysPathsSnapshot() snapmods = SysModulesSnapshot() yield @@ -500,7 +505,7 @@ def _sys_snapshot() -> Generator[None]: @fixture -def _config_for_test() -> Generator[Config]: +def _config_for_test() -> Generator[Config, None, None]: from _pytest.config import get_config config = get_config() @@ -520,13 +525,13 @@ class RunResult: def __init__( self, - ret: int | ExitCode, - outlines: list[str], - errlines: list[str], + ret: Union[int, ExitCode], + outlines: List[str], + errlines: List[str], duration: float, ) -> None: try: - self.ret: int | ExitCode = ExitCode(ret) + self.ret: Union[int, ExitCode] = ExitCode(ret) """The return value.""" except ValueError: self.ret = ret @@ -547,13 +552,11 @@ class RunResult: def __repr__(self) -> str: return ( - f"" + "" + % (self.ret, len(self.stdout.lines), len(self.stderr.lines), self.duration) ) - def parseoutcomes(self) -> dict[str, int]: + def parseoutcomes(self) -> Dict[str, int]: """Return a dictionary of outcome noun -> count from parsing the terminal output that the test process produced. @@ -566,7 +569,7 @@ class RunResult: return self.parse_summary_nouns(self.outlines) @classmethod - def parse_summary_nouns(cls, lines) -> dict[str, int]: + def parse_summary_nouns(cls, lines) -> Dict[str, int]: """Extract the nouns from a pytest terminal summary line. It always returns the plural noun for consistency:: @@ -597,8 +600,8 @@ class RunResult: errors: int = 0, xpassed: int = 0, xfailed: int = 0, - warnings: int | None = None, - deselected: int | None = None, + warnings: Optional[int] = None, + deselected: Optional[int] = None, ) -> None: """ Assert that the specified outcomes appear with the respective @@ -623,8 +626,16 @@ class RunResult: ) +class CwdSnapshot: + def __init__(self) -> None: + self.__saved = os.getcwd() + + def restore(self) -> None: + os.chdir(self.__saved) + + class SysModulesSnapshot: - def __init__(self, preserve: Callable[[str], bool] | None = None) -> None: + def __init__(self, preserve: Optional[Callable[[str], bool]] = None) -> None: self.__preserve = preserve self.__saved = dict(sys.modules) @@ -657,7 +668,7 @@ class Pytester: __test__ = False - CLOSE_STDIN: Final = NOTSET + CLOSE_STDIN: "Final" = NOTSET class TimeoutExpired(Exception): pass @@ -672,9 +683,9 @@ class Pytester: ) -> None: check_ispytest(_ispytest) self._request = request - self._mod_collections: WeakKeyDictionary[Collector, list[Item | Collector]] = ( - WeakKeyDictionary() - ) + self._mod_collections: WeakKeyDictionary[ + Collector, List[Union[Item, Collector]] + ] = WeakKeyDictionary() if request.function: name: str = request.function.__name__ else: @@ -682,20 +693,19 @@ class Pytester: self._name = name self._path: Path = tmp_path_factory.mktemp(name, numbered=True) #: A list of plugins to use with :py:meth:`parseconfig` and - #: :py:meth:`runpytest`. Initially this is an empty list but plugins can - #: be added to the list. - #: - #: When running in subprocess mode, specify plugins by name (str) - adding - #: plugin objects directly is not supported. - self.plugins: list[str | _PluggyPlugin] = [] + #: :py:meth:`runpytest`. Initially this is an empty list but plugins can + #: be added to the list. The type of items to add to the list depends on + #: the method using them so refer to them for details. + self.plugins: List[Union[str, _PluggyPlugin]] = [] + self._cwd_snapshot = CwdSnapshot() self._sys_path_snapshot = SysPathsSnapshot() self._sys_modules_snapshot = self.__take_sys_modules_snapshot() + self.chdir() self._request.addfinalizer(self._finalize) self._method = self._request.config.getoption("--runpytest") self._test_tmproot = tmp_path_factory.mktemp(f"tmp-{name}", numbered=True) self._monkeypatch = mp = monkeypatch - self.chdir() mp.setenv("PYTEST_DEBUG_TEMPROOT", str(self._test_tmproot)) # Ensure no unexpected caching via tox. mp.delenv("TOX_ENV_DIR", raising=False) @@ -726,6 +736,7 @@ class Pytester: """ self._sys_modules_snapshot.restore() self._sys_path_snapshot.restore() + self._cwd_snapshot.restore() def __take_sys_modules_snapshot(self) -> SysModulesSnapshot: # Some zope modules used by twisted-related tests keep internal state @@ -750,26 +761,23 @@ class Pytester: This is done automatically upon instantiation. """ - self._monkeypatch.chdir(self.path) + os.chdir(self.path) def _makefile( self, ext: str, - lines: Sequence[Any | bytes], - files: dict[str, str], + lines: Sequence[Union[Any, bytes]], + files: Dict[str, str], encoding: str = "utf-8", ) -> Path: items = list(files.items()) - if ext is None: - raise TypeError("ext must not be None") - if ext and not ext.startswith("."): raise ValueError( f"pytester.makefile expects a file extension, try .{ext} instead of {ext}" ) - def to_text(s: Any | bytes) -> str: + def to_text(s: Union[Any, bytes]) -> str: return s.decode(encoding) if isinstance(s, bytes) else str(s) if lines: @@ -822,7 +830,7 @@ class Pytester: return self._makefile(ext, args, kwargs) def makeconftest(self, source: str) -> Path: - """Write a conftest.py file. + """Write a contest.py file. :param source: The contents. :returns: The conftest.py file. @@ -837,16 +845,6 @@ class Pytester: """ return self.makefile(".ini", tox=source) - def maketoml(self, source: str) -> Path: - """Write a pytest.toml file. - - :param source: The contents. - :returns: The pytest.toml file. - - .. versionadded:: 9.0 - """ - return self.makefile(".toml", pytest=source) - def getinicfg(self, source: str) -> SectionWrapper: """Return the pytest section from the tox.ini config file.""" p = self.makeini(source) @@ -902,7 +900,9 @@ class Pytester: """ return self._makefile(".txt", args, kwargs) - def syspathinsert(self, path: str | os.PathLike[str] | None = None) -> None: + def syspathinsert( + self, path: Optional[Union[str, "os.PathLike[str]"]] = None + ) -> None: """Prepend a directory to sys.path, defaults to :attr:`path`. This is undone automatically when this object dies at the end of each @@ -916,20 +916,19 @@ class Pytester: self._monkeypatch.syspath_prepend(str(path)) - def mkdir(self, name: str | os.PathLike[str]) -> Path: + def mkdir(self, name: Union[str, "os.PathLike[str]"]) -> Path: """Create a new (sub)directory. :param name: The name of the directory, relative to the pytester path. :returns: The created directory. - :rtype: pathlib.Path """ p = self.path / name p.mkdir() return p - def mkpydir(self, name: str | os.PathLike[str]) -> Path: + def mkpydir(self, name: Union[str, "os.PathLike[str]"]) -> Path: """Create a new python package. This creates a (sub)directory with an empty ``__init__.py`` file so it @@ -940,14 +939,13 @@ class Pytester: p.joinpath("__init__.py").touch() return p - def copy_example(self, name: str | None = None) -> Path: + def copy_example(self, name: Optional[str] = None) -> Path: """Copy file from project's directory into the testdir. :param name: The name of the file to copy. :return: Path to the copied directory (inside ``self.path``). - :rtype: pathlib.Path """ example_dir_ = self._request.config.getini("pytester_example_dir") if example_dir_ is None: @@ -975,7 +973,7 @@ class Pytester: example_path = example_dir.joinpath(name) if example_path.is_dir() and not example_path.joinpath("__init__.py").is_file(): - shutil.copytree(example_path, self.path, symlinks=True, dirs_exist_ok=True) + copytree(example_path, self.path) return self.path elif example_path.is_file(): result = self.path.joinpath(example_path.name) @@ -986,7 +984,9 @@ class Pytester: f'example "{example_path}" is not found as a file or directory' ) - def getnode(self, config: Config, arg: str | os.PathLike[str]) -> Collector | Item: + def getnode( + self, config: Config, arg: Union[str, "os.PathLike[str]"] + ) -> Union[Collector, Item]: """Get the collection node of a file. :param config: @@ -1005,7 +1005,9 @@ class Pytester: config.hook.pytest_sessionfinish(session=session, exitstatus=ExitCode.OK) return res - def getpathnode(self, path: str | os.PathLike[str]) -> Collector | Item: + def getpathnode( + self, path: Union[str, "os.PathLike[str]"] + ) -> Union[Collector, Item]: """Return the collection node of a file. This is like :py:meth:`getnode` but uses :py:meth:`parseconfigure` to @@ -1025,7 +1027,7 @@ class Pytester: config.hook.pytest_sessionfinish(session=session, exitstatus=ExitCode.OK) return res - def genitems(self, colitems: Sequence[Item | Collector]) -> list[Item]: + def genitems(self, colitems: Sequence[Union[Item, Collector]]) -> List[Item]: """Generate all test items from a collection node. This recurses into the collection node and returns a list of all the @@ -1037,7 +1039,7 @@ class Pytester: The collected items. """ session = colitems[0].session - result: list[Item] = [] + result: List[Item] = [] for colitem in colitems: result.extend(session.genitems(colitem)) return result @@ -1048,7 +1050,7 @@ class Pytester: The calling test instance (class containing the test method) must provide a ``.getrunner()`` method which should return a runner which can run the test protocol for a single item, e.g. - ``_pytest.runner.runtestprotocol``. + :py:func:`_pytest.runner.runtestprotocol`. """ # used from runner functional tests item = self.getitem(source) @@ -1068,11 +1070,11 @@ class Pytester: :param cmdlineargs: Any extra command line arguments to use. """ p = self.makepyfile(source) - values = [*list(cmdlineargs), p] + values = list(cmdlineargs) + [p] return self.inline_run(*values) - def inline_genitems(self, *args) -> tuple[list[Item], HookRecorder]: - """Run ``pytest.main(['--collect-only'])`` in-process. + def inline_genitems(self, *args) -> Tuple[List[Item], HookRecorder]: + """Run ``pytest.main(['--collectonly'])`` in-process. Runs the :py:func:`pytest.main` function to run all of pytest inside the test process itself like :py:meth:`inline_run`, but returns a @@ -1084,7 +1086,7 @@ class Pytester: def inline_run( self, - *args: str | os.PathLike[str], + *args: Union[str, "os.PathLike[str]"], plugins=(), no_reraise_ctrlc: bool = False, ) -> HookRecorder: @@ -1104,8 +1106,6 @@ class Pytester: Typically we reraise keyboard interrupts from the child run. If True, the KeyboardInterrupt exception is captured. """ - from _pytest.unraisableexception import gc_collect_iterations_key - # (maybe a cpython bug?) the importlib cache sometimes isn't updated # properly between file creation and inline_run (especially if imports # are interspersed with file creation) @@ -1129,16 +1129,11 @@ class Pytester: rec = [] - class PytesterHelperPlugin: - @staticmethod - def pytest_configure(config: Config) -> None: + class Collect: + def pytest_configure(x, config: Config) -> None: rec.append(self.make_hook_recorder(config.pluginmanager)) - # The unraisable plugin GC collect slows down inline - # pytester runs too much. - config.stash[gc_collect_iterations_key] = 0 - - plugins.append(PytesterHelperPlugin()) + plugins.append(Collect()) ret = main([str(x) for x in args], plugins=plugins) if len(rec) == 1: reprec = rec.pop() @@ -1161,7 +1156,7 @@ class Pytester: finalizer() def runpytest_inprocess( - self, *args: str | os.PathLike[str], **kwargs: Any + self, *args: Union[str, "os.PathLike[str]"], **kwargs: Any ) -> RunResult: """Return result of running pytest in-process, providing a similar interface to what self.runpytest() provides.""" @@ -1169,7 +1164,7 @@ class Pytester: if syspathinsert: self.syspathinsert() - instant = timing.Instant() + now = timing.time() capture = _get_multicapture("sys") capture.start_capturing() try: @@ -1199,12 +1194,14 @@ class Pytester: assert reprec.ret is not None res = RunResult( - reprec.ret, out.splitlines(), err.splitlines(), instant.elapsed().seconds + reprec.ret, out.splitlines(), err.splitlines(), timing.time() - now ) res.reprec = reprec # type: ignore return res - def runpytest(self, *args: str | os.PathLike[str], **kwargs: Any) -> RunResult: + def runpytest( + self, *args: Union[str, "os.PathLike[str]"], **kwargs: Any + ) -> RunResult: """Run pytest inline or in a subprocess, depending on the command line option "--runpytest" and return a :py:class:`~pytest.RunResult`.""" new_args = self._ensure_basetemp(args) @@ -1215,19 +1212,17 @@ class Pytester: raise RuntimeError(f"Unrecognized runpytest option: {self._method}") def _ensure_basetemp( - self, args: Sequence[str | os.PathLike[str]] - ) -> list[str | os.PathLike[str]]: + self, args: Sequence[Union[str, "os.PathLike[str]"]] + ) -> List[Union[str, "os.PathLike[str]"]]: new_args = list(args) for x in new_args: if str(x).startswith("--basetemp"): break else: - new_args.append( - "--basetemp={}".format(self.path.parent.joinpath("basetemp")) - ) + new_args.append("--basetemp=%s" % self.path.parent.joinpath("basetemp")) return new_args - def parseconfig(self, *args: str | os.PathLike[str]) -> Config: + def parseconfig(self, *args: Union[str, "os.PathLike[str]"]) -> Config: """Return a new pytest :class:`pytest.Config` instance from given commandline args. @@ -1241,16 +1236,17 @@ class Pytester: """ import _pytest.config - new_args = [str(x) for x in self._ensure_basetemp(args)] + new_args = self._ensure_basetemp(args) + new_args = [str(x) for x in new_args] - config = _pytest.config._prepareconfig(new_args, self.plugins) + config = _pytest.config._prepareconfig(new_args, self.plugins) # type: ignore[arg-type] # we don't know what the test will do with this half-setup config # object and thus we make sure it gets unconfigured properly in any # case (otherwise capturing could still be active, for example) self._request.addfinalizer(config._ensure_unconfigure) return config - def parseconfigure(self, *args: str | os.PathLike[str]) -> Config: + def parseconfigure(self, *args: Union[str, "os.PathLike[str]"]) -> Config: """Return a new pytest configured Config instance. Returns a new :py:class:`pytest.Config` instance like @@ -1262,7 +1258,7 @@ class Pytester: return config def getitem( - self, source: str | os.PathLike[str], funcname: str = "test_func" + self, source: Union[str, "os.PathLike[str]"], funcname: str = "test_func" ) -> Item: """Return the test item for a test function. @@ -1281,9 +1277,11 @@ class Pytester: for item in items: if item.name == funcname: return item - assert 0, f"{funcname!r} item not found in module:\n{source}\nitems: {items}" + assert 0, "{!r} item not found in module:\n{}\nitems: {}".format( + funcname, source, items + ) - def getitems(self, source: str | os.PathLike[str]) -> list[Item]: + def getitems(self, source: Union[str, "os.PathLike[str]"]) -> List[Item]: """Return all test items collected from the module. Writes the source to a Python file and runs pytest's collection on @@ -1294,7 +1292,7 @@ class Pytester: def getmodulecol( self, - source: str | os.PathLike[str], + source: Union[str, "os.PathLike[str]"], configargs=(), *, withinit: bool = False, @@ -1326,7 +1324,9 @@ class Pytester: self.config = config = self.parseconfigure(path, *configargs) return self.getnode(config, path) - def collect_by_name(self, modcol: Collector, name: str) -> Item | Collector | None: + def collect_by_name( + self, modcol: Collector, name: str + ) -> Optional[Union[Item, Collector]]: """Return the collection node for name from the module collection. Searches a module collection node for a collection node matching the @@ -1344,10 +1344,10 @@ class Pytester: def popen( self, - cmdargs: Sequence[str | os.PathLike[str]], - stdout: int | TextIO = subprocess.PIPE, - stderr: int | TextIO = subprocess.PIPE, - stdin: NotSetType | bytes | IO[Any] | int = CLOSE_STDIN, + cmdargs: Sequence[Union[str, "os.PathLike[str]"]], + stdout: Union[int, TextIO] = subprocess.PIPE, + stderr: Union[int, TextIO] = subprocess.PIPE, + stdin: Union[NotSetType, bytes, IO[Any], int] = CLOSE_STDIN, **kw, ): """Invoke :py:class:`subprocess.Popen`. @@ -1382,9 +1382,9 @@ class Pytester: def run( self, - *cmdargs: str | os.PathLike[str], - timeout: float | None = None, - stdin: NotSetType | bytes | IO[Any] | int = CLOSE_STDIN, + *cmdargs: Union[str, "os.PathLike[str]"], + timeout: Optional[float] = None, + stdin: Union[NotSetType, bytes, IO[Any], int] = CLOSE_STDIN, ) -> RunResult: """Run a command with arguments. @@ -1401,7 +1401,7 @@ class Pytester: :param stdin: Optional standard input. - - If it is ``CLOSE_STDIN`` (Default), then this method calls + - If it is :py:attr:`CLOSE_STDIN` (Default), then this method calls :py:class:`subprocess.Popen` with ``stdin=subprocess.PIPE``, and the standard input is closed immediately after the new command is started. @@ -1412,10 +1412,8 @@ class Pytester: - Otherwise, it is passed through to :py:class:`subprocess.Popen`. For further information in this case, consult the document of the ``stdin`` parameter in :py:class:`subprocess.Popen`. - :type stdin: _pytest.compat.NotSetType | bytes | IO[Any] | int :returns: The result. - """ __tracebackhide__ = True @@ -1426,12 +1424,13 @@ class Pytester: print(" in:", Path.cwd()) with p1.open("w", encoding="utf8") as f1, p2.open("w", encoding="utf8") as f2: - instant = timing.Instant() + now = timing.time() popen = self.popen( cmdargs, stdin=stdin, stdout=f1, stderr=f2, + close_fds=(sys.platform != "win32"), ) if popen.stdin is not None: popen.stdin.close() @@ -1439,7 +1438,10 @@ class Pytester: def handle_timeout() -> None: __tracebackhide__ = True - timeout_message = f"{timeout} second timeout expired running: {cmdargs}" + timeout_message = ( + "{seconds} second timeout expired running:" + " {command}".format(seconds=timeout, command=cmdargs) + ) popen.kill() popen.wait() @@ -1452,8 +1454,6 @@ class Pytester: ret = popen.wait(timeout) except subprocess.TimeoutExpired: handle_timeout() - f1.flush() - f2.flush() with p1.open(encoding="utf8") as f1, p2.open(encoding="utf8") as f2: out = f1.read().splitlines() @@ -1464,7 +1464,7 @@ class Pytester: with contextlib.suppress(ValueError): ret = ExitCode(ret) - return RunResult(ret, out, err, instant.elapsed().seconds) + return RunResult(ret, out, err, timing.time() - now) def _dump_lines(self, lines, fp): try: @@ -1473,10 +1473,10 @@ class Pytester: except UnicodeEncodeError: print(f"couldn't print to {fp} because of encoding") - def _getpytestargs(self) -> tuple[str, ...]: + def _getpytestargs(self) -> Tuple[str, ...]: return sys.executable, "-mpytest" - def runpython(self, script: os.PathLike[str]) -> RunResult: + def runpython(self, script: "os.PathLike[str]") -> RunResult: """Run a python script using sys.executable as interpreter.""" return self.run(sys.executable, script) @@ -1485,7 +1485,7 @@ class Pytester: return self.run(sys.executable, "-c", command) def runpytest_subprocess( - self, *args: str | os.PathLike[str], timeout: float | None = None + self, *args: Union[str, "os.PathLike[str]"], timeout: Optional[float] = None ) -> RunResult: """Run pytest as a subprocess with given arguments. @@ -1505,18 +1505,16 @@ class Pytester: """ __tracebackhide__ = True p = make_numbered_dir(root=self.path, prefix="runpytest-", mode=0o700) - args = (f"--basetemp={p}", *args) - for plugin in self.plugins: - if not isinstance(plugin, str): - raise ValueError( - f"Specifying plugins as objects is not supported in pytester subprocess mode; " - f"specify by name instead: {plugin}" - ) - args = ("-p", plugin, *args) + args = ("--basetemp=%s" % p,) + args + plugins = [x for x in self.plugins if isinstance(x, str)] + if plugins: + args = ("-p", plugins[0]) + args args = self._getpytestargs() + args return self.run(*args, timeout=timeout) - def spawn_pytest(self, string: str, expect_timeout: float = 10.0) -> pexpect.spawn: + def spawn_pytest( + self, string: str, expect_timeout: float = 10.0 + ) -> "pexpect.spawn": """Run pytest using pexpect. This makes sure to use the right pytest and sets up the temporary @@ -1530,7 +1528,7 @@ class Pytester: cmd = f"{invoke} --basetemp={basetemp} {string}" return self.spawn(cmd, expect_timeout=expect_timeout) - def spawn(self, cmd: str, expect_timeout: float = 10.0) -> pexpect.spawn: + def spawn(self, cmd: str, expect_timeout: float = 10.0) -> "pexpect.spawn": """Run a command using pexpect. The pexpect child is returned. @@ -1575,9 +1573,9 @@ class LineMatcher: ``text.splitlines()``. """ - def __init__(self, lines: list[str]) -> None: + def __init__(self, lines: List[str]) -> None: self.lines = lines - self._log_output: list[str] = [] + self._log_output: List[str] = [] def __str__(self) -> str: """Return the entire original text. @@ -1587,7 +1585,7 @@ class LineMatcher: """ return "\n".join(self.lines) - def _getlines(self, lines2: str | Sequence[str] | Source) -> Sequence[str]: + def _getlines(self, lines2: Union[str, Sequence[str], Source]) -> Sequence[str]: if isinstance(lines2, str): lines2 = Source(lines2) if isinstance(lines2, Source): @@ -1615,7 +1613,7 @@ class LineMatcher: self._log("matched: ", repr(line)) break else: - msg = f"line {line!r} not found in output" + msg = "line %r not found in output" % line self._log(msg) self._fail(msg) @@ -1627,7 +1625,7 @@ class LineMatcher: for i, line in enumerate(self.lines): if fnline == line or fnmatch(line, fnline): return self.lines[i + 1 :] - raise ValueError(f"line {fnline!r} not found in output") + raise ValueError("line %r not found in output" % fnline) def _log(self, *args) -> None: self._log_output.append(" ".join(str(x) for x in args)) @@ -1712,7 +1710,7 @@ class LineMatcher: started = True break elif match_func(nextline, line): - self._log(f"{match_nickname}:", repr(line)) + self._log("%s:" % match_nickname, repr(line)) self._log( "{:>{width}}".format("with:", width=wnick), repr(nextline) ) diff --git a/Backend/venv/lib/python3.12/site-packages/_pytest/pytester_assertions.py b/Backend/venv/lib/python3.12/site-packages/_pytest/pytester_assertions.py index 915cc8a1..657e4db5 100644 --- a/Backend/venv/lib/python3.12/site-packages/_pytest/pytester_assertions.py +++ b/Backend/venv/lib/python3.12/site-packages/_pytest/pytester_assertions.py @@ -1,22 +1,23 @@ """Helper plugin for pytester; should not be loaded on its own.""" - # This plugin contains assertions used by pytester. pytester cannot # contain them itself, since it is imported by the `pytest` module, # hence cannot be subject to assertion rewriting, which requires a # module to not be already imported. -from __future__ import annotations - -from collections.abc import Sequence +from typing import Dict +from typing import Optional +from typing import Sequence +from typing import Tuple +from typing import Union from _pytest.reports import CollectReport from _pytest.reports import TestReport def assertoutcome( - outcomes: tuple[ + outcomes: Tuple[ Sequence[TestReport], - Sequence[CollectReport | TestReport], - Sequence[CollectReport | TestReport], + Sequence[Union[CollectReport, TestReport]], + Sequence[Union[CollectReport, TestReport]], ], passed: int = 0, skipped: int = 0, @@ -35,15 +36,15 @@ def assertoutcome( def assert_outcomes( - outcomes: dict[str, int], + outcomes: Dict[str, int], passed: int = 0, skipped: int = 0, failed: int = 0, errors: int = 0, xpassed: int = 0, xfailed: int = 0, - warnings: int | None = None, - deselected: int | None = None, + warnings: Optional[int] = None, + deselected: Optional[int] = None, ) -> None: """Assert that the specified outcomes appear with the respective numbers (0 means it didn't occur) in the text output from a test run.""" diff --git a/Backend/venv/lib/python3.12/site-packages/_pytest/python.py b/Backend/venv/lib/python3.12/site-packages/_pytest/python.py index e6375187..5f8be5d9 100644 --- a/Backend/venv/lib/python3.12/site-packages/_pytest/python.py +++ b/Backend/venv/lib/python3.12/site-packages/_pytest/python.py @@ -1,35 +1,32 @@ -# mypy: allow-untyped-defs """Python test discovery, setup and run of test functions.""" - -from __future__ import annotations - -import abc -from collections import Counter -from collections import defaultdict -from collections.abc import Callable -from collections.abc import Generator -from collections.abc import Iterable -from collections.abc import Iterator -from collections.abc import Mapping -from collections.abc import Sequence import dataclasses import enum import fnmatch -from functools import partial import inspect import itertools import os -from pathlib import Path -import re -import textwrap +import sys import types -from typing import Any -from typing import cast -from typing import final -from typing import Literal -from typing import NoReturn -from typing import TYPE_CHECKING import warnings +from collections import Counter +from collections import defaultdict +from functools import partial +from pathlib import Path +from typing import Any +from typing import Callable +from typing import Dict +from typing import Generator +from typing import Iterable +from typing import Iterator +from typing import List +from typing import Mapping +from typing import Optional +from typing import Pattern +from typing import Sequence +from typing import Set +from typing import Tuple +from typing import TYPE_CHECKING +from typing import Union import _pytest from _pytest import fixtures @@ -39,50 +36,77 @@ from _pytest._code import getfslineno from _pytest._code.code import ExceptionInfo from _pytest._code.code import TerminalRepr from _pytest._code.code import Traceback +from _pytest._io import TerminalWriter from _pytest._io.saferepr import saferepr from _pytest.compat import ascii_escaped +from _pytest.compat import assert_never +from _pytest.compat import final from _pytest.compat import get_default_arg_names from _pytest.compat import get_real_func from _pytest.compat import getimfunc +from _pytest.compat import getlocation from _pytest.compat import is_async_function +from _pytest.compat import is_generator from _pytest.compat import LEGACY_PATH from _pytest.compat import NOTSET from _pytest.compat import safe_getattr from _pytest.compat import safe_isclass +from _pytest.compat import STRING_TYPES from _pytest.config import Config +from _pytest.config import ExitCode from _pytest.config import hookimpl from _pytest.config.argparsing import Parser from _pytest.deprecated import check_ispytest -from _pytest.fixtures import FixtureDef -from _pytest.fixtures import FixtureRequest +from _pytest.deprecated import INSTANCE_COLLECTOR +from _pytest.deprecated import NOSE_SUPPORT_METHOD from _pytest.fixtures import FuncFixtureInfo -from _pytest.fixtures import get_scope_node from _pytest.main import Session +from _pytest.mark import MARK_GEN from _pytest.mark import ParameterSet -from _pytest.mark.structures import _HiddenParam from _pytest.mark.structures import get_unpacked_marks -from _pytest.mark.structures import HIDDEN_PARAM from _pytest.mark.structures import Mark from _pytest.mark.structures import MarkDecorator from _pytest.mark.structures import normalize_mark_list from _pytest.outcomes import fail from _pytest.outcomes import skip +from _pytest.pathlib import bestrelpath from _pytest.pathlib import fnmatch_ex from _pytest.pathlib import import_path from _pytest.pathlib import ImportPathMismatchError -from _pytest.pathlib import scandir -from _pytest.scope import _ScopeName +from _pytest.pathlib import parts +from _pytest.pathlib import visit from _pytest.scope import Scope -from _pytest.stash import StashKey from _pytest.warning_types import PytestCollectionWarning from _pytest.warning_types import PytestReturnNotNoneWarning - +from _pytest.warning_types import PytestUnhandledCoroutineWarning if TYPE_CHECKING: - from typing_extensions import Self + from typing_extensions import Literal + + from _pytest.scope import _ScopeName + + +_PYTEST_DIR = Path(_pytest.__file__).parent def pytest_addoption(parser: Parser) -> None: + group = parser.getgroup("general") + group.addoption( + "--fixtures", + "--funcargs", + action="store_true", + dest="showfixtures", + default=False, + help="Show available fixtures, sorted by plugin appearance " + "(fixtures with leading '_' are only shown with '-v')", + ) + group.addoption( + "--fixtures-per-test", + action="store_true", + dest="show_fixtures_per_test", + default=False, + help="Show fixtures per test", + ) parser.addini( "python_files", type="args", @@ -109,16 +133,19 @@ def pytest_addoption(parser: Parser) -> None: help="Disable string escape non-ASCII characters, might cause unwanted " "side effects(use at your own risk)", ) - parser.addini( - "strict_parametrization_ids", - type="bool", - # None => fallback to `strict`. - default=None, - help="Emit an error if non-unique parameter set IDs are detected", - ) -def pytest_generate_tests(metafunc: Metafunc) -> None: +def pytest_cmdline_main(config: Config) -> Optional[Union[int, ExitCode]]: + if config.option.showfixtures: + showfixtures(config) + return 0 + if config.option.show_fixtures_per_test: + show_fixtures_per_test(config) + return 0 + return None + + +def pytest_generate_tests(metafunc: "Metafunc") -> None: for marker in metafunc.definition.iter_markers(name="parametrize"): metafunc.parametrize(*marker.args, **marker.kwargs, _param_mark=marker) @@ -143,59 +170,45 @@ def pytest_configure(config: Config) -> None: ) -def async_fail(nodeid: str) -> None: - msg = ( - "async def functions are not natively supported.\n" +def async_warn_and_skip(nodeid: str) -> None: + msg = "async def functions are not natively supported and have been skipped.\n" + msg += ( "You need to install a suitable plugin for your async framework, for example:\n" - " - anyio\n" - " - pytest-asyncio\n" - " - pytest-tornasync\n" - " - pytest-trio\n" - " - pytest-twisted" ) - fail(msg, pytrace=False) + msg += " - anyio\n" + msg += " - pytest-asyncio\n" + msg += " - pytest-tornasync\n" + msg += " - pytest-trio\n" + msg += " - pytest-twisted" + warnings.warn(PytestUnhandledCoroutineWarning(msg.format(nodeid))) + skip(reason="async def function and no async plugin installed (see warnings)") @hookimpl(trylast=True) -def pytest_pyfunc_call(pyfuncitem: Function) -> object | None: +def pytest_pyfunc_call(pyfuncitem: "Function") -> Optional[object]: testfunction = pyfuncitem.obj if is_async_function(testfunction): - async_fail(pyfuncitem.nodeid) + async_warn_and_skip(pyfuncitem.nodeid) funcargs = pyfuncitem.funcargs testargs = {arg: funcargs[arg] for arg in pyfuncitem._fixtureinfo.argnames} result = testfunction(**testargs) if hasattr(result, "__await__") or hasattr(result, "__aiter__"): - async_fail(pyfuncitem.nodeid) + async_warn_and_skip(pyfuncitem.nodeid) elif result is not None: warnings.warn( PytestReturnNotNoneWarning( - f"Test functions should return None, but {pyfuncitem.nodeid} returned {type(result)!r}.\n" - "Did you mean to use `assert` instead of `return`?\n" - "See https://docs.pytest.org/en/stable/how-to/assert.html#return-not-none for more information." + f"Expected None, but {pyfuncitem.nodeid} returned {result!r}, which will be an error in a " + "future version of pytest. Did you mean to use `assert` instead of `return`?" ) ) return True -def pytest_collect_directory( - path: Path, parent: nodes.Collector -) -> nodes.Collector | None: - pkginit = path / "__init__.py" - try: - has_pkginit = pkginit.is_file() - except PermissionError: - # See https://github.com/pytest-dev/pytest/issues/12120#issuecomment-2106349096. - return None - if has_pkginit: - return Package.from_parent(parent, path=path) - return None - - -def pytest_collect_file(file_path: Path, parent: nodes.Collector) -> Module | None: +def pytest_collect_file(file_path: Path, parent: nodes.Collector) -> Optional["Module"]: if file_path.suffix == ".py": if not parent.session.isinitpath(file_path): if not path_matches_patterns( - file_path, parent.config.getini("python_files") + file_path, parent.config.getini("python_files") + ["__init__.py"] ): return None ihook = parent.session.gethookproxy(file_path) @@ -211,19 +224,24 @@ def path_matches_patterns(path: Path, patterns: Iterable[str]) -> bool: return any(fnmatch_ex(pattern, path) for pattern in patterns) -def pytest_pycollect_makemodule(module_path: Path, parent) -> Module: - return Module.from_parent(parent, path=module_path) +def pytest_pycollect_makemodule(module_path: Path, parent) -> "Module": + if module_path.name == "__init__.py": + pkg: Package = Package.from_parent(parent, path=module_path) + return pkg + mod: Module = Module.from_parent(parent, path=module_path) + return mod @hookimpl(trylast=True) def pytest_pycollect_makeitem( - collector: Module | Class, name: str, obj: object -) -> None | nodes.Item | nodes.Collector | list[nodes.Item | nodes.Collector]: - assert isinstance(collector, Class | Module), type(collector) + collector: Union["Module", "Class"], name: str, obj: object +) -> Union[None, nodes.Item, nodes.Collector, List[Union[nodes.Item, nodes.Collector]]]: + assert isinstance(collector, (Class, Module)), type(collector) # Nothing was collected elsewhere, let's do it here. if safe_isclass(obj): if collector.istestclass(obj, name): - return Class.from_parent(collector, name=name, obj=obj) + klass: Class = Class.from_parent(collector, name=name, obj=obj) + return klass elif collector.istestfunction(obj, name): # mock seems to store unbound methods (issue473), normalize it. obj = getattr(obj, "__func__", obj) @@ -234,20 +252,23 @@ def pytest_pycollect_makeitem( filename, lineno = getfslineno(obj) warnings.warn_explicit( message=PytestCollectionWarning( - f"cannot collect {name!r} because it is not a function." + "cannot collect %r because it is not a function." % name ), category=None, filename=str(filename), lineno=lineno + 1, ) elif getattr(obj, "__test__", True): - if inspect.isgeneratorfunction(obj): - fail( - f"'yield' keyword is allowed in fixtures, but not in tests ({name})", - pytrace=False, + if is_generator(obj): + res: Function = Function.from_parent(collector, name=name) + reason = "yield tests were removed in pytest 4.0 - {name} will be ignored".format( + name=name ) - return list(collector._genfunctions(name, obj)) - return None + res.add_marker(MARK_GEN.xfail(run=False, reason=reason)) + res.warn(PytestCollectionWarning(reason)) + return res + else: + return list(collector._genfunctions(name, obj)) return None @@ -276,10 +297,10 @@ class PyobjMixin(nodes.Node): """Python instance object the function is bound to. Returns None if not a test method, e.g. for a standalone test function, - a class or a module. + a staticmethod, a class or a module. """ - # Overridden by Function. - return None + node = self.getparent(Function) + return getattr(node.obj, "__self__", None) if node is not None else None @property def obj(self): @@ -309,8 +330,10 @@ class PyobjMixin(nodes.Node): def getmodpath(self, stopatmodule: bool = True, includemodule: bool = False) -> str: """Return Python path relative to the containing module.""" + chain = self.listchain() + chain.reverse() parts = [] - for node in self.iter_parents(): + for node in chain: name = node.name if isinstance(node, Module): name = os.path.splitext(name)[0] @@ -322,10 +345,22 @@ class PyobjMixin(nodes.Node): parts.reverse() return ".".join(parts) - def reportinfo(self) -> tuple[os.PathLike[str] | str, int | None, str]: + def reportinfo(self) -> Tuple[Union["os.PathLike[str]", str], Optional[int], str]: # XXX caching? - path, lineno = getfslineno(self.obj) + obj = self.obj + compat_co_firstlineno = getattr(obj, "compat_co_firstlineno", None) + if isinstance(compat_co_firstlineno, int): + # nose compatibility + file_path = sys.modules[obj.__module__].__file__ + assert file_path is not None + if file_path.endswith(".pyc"): + file_path = file_path[:-1] + path: Union["os.PathLike[str]", str] = file_path + lineno = compat_co_firstlineno + else: + path, lineno = getfslineno(obj) modpath = self.getmodpath() + assert isinstance(lineno, int) return path, lineno, modpath @@ -334,7 +369,7 @@ class PyobjMixin(nodes.Node): # hook is not called for them. # fmt: off class _EmptyClass: pass # noqa: E701 -IGNORED_ATTRIBUTES = frozenset.union( +IGNORED_ATTRIBUTES = frozenset.union( # noqa: E305 frozenset(), # Module. dir(types.ModuleType("empty_module")), @@ -349,7 +384,7 @@ del _EmptyClass # fmt: on -class PyCollector(PyobjMixin, nodes.Collector, abc.ABC): +class PyCollector(PyobjMixin, nodes.Collector): def funcnamefilter(self, name: str) -> bool: return self._matches_prefix_or_glob_option("python_functions", name) @@ -367,7 +402,7 @@ class PyCollector(PyobjMixin, nodes.Collector, abc.ABC): def istestfunction(self, obj: object, name: str) -> bool: if self.funcnamefilter(name) or self.isnosetest(obj): - if isinstance(obj, staticmethod | classmethod): + if isinstance(obj, (staticmethod, classmethod)): # staticmethods and classmethods need to be unwrapped. obj = safe_getattr(obj, "__func__", False) return callable(obj) and fixtures.getfixturemarker(obj) is None @@ -375,15 +410,11 @@ class PyCollector(PyobjMixin, nodes.Collector, abc.ABC): return False def istestclass(self, obj: object, name: str) -> bool: - if not (self.classnamefilter(name) or self.isnosetest(obj)): - return False - if inspect.isabstract(obj): - return False - return True + return self.classnamefilter(name) or self.isnosetest(obj) def _matches_prefix_or_glob_option(self, option_name: str, name: str) -> bool: """Check if the given name matches the prefix or glob-pattern defined - in configuration.""" + in ini configuration.""" for option in self.config.getini(option_name): if name.startswith(option): return True @@ -396,7 +427,7 @@ class PyCollector(PyobjMixin, nodes.Collector, abc.ABC): return True return False - def collect(self) -> Iterable[nodes.Item | nodes.Collector]: + def collect(self) -> Iterable[Union[nodes.Item, nodes.Collector]]: if not getattr(self.obj, "__test__", True): return [] @@ -408,12 +439,11 @@ class PyCollector(PyobjMixin, nodes.Collector, abc.ABC): # In each class, nodes should be definition ordered. # __dict__ is definition ordered. - seen: set[str] = set() - dict_values: list[list[nodes.Item | nodes.Collector]] = [] - collect_imported_tests = self.session.config.getini("collect_imported_tests") + seen: Set[str] = set() + dict_values: List[List[Union[nodes.Item, nodes.Collector]]] = [] ihook = self.ihook for dic in dicts: - values: list[nodes.Item | nodes.Collector] = [] + values: List[Union[nodes.Item, nodes.Collector]] = [] # Note: seems like the dict can change during iteration - # be careful not to remove the list() without consideration. for name, obj in list(dic.items()): @@ -422,13 +452,6 @@ class PyCollector(PyobjMixin, nodes.Collector, abc.ABC): if name in seen: continue seen.add(name) - - if not collect_imported_tests and isinstance(self, Module): - # Do not collect functions and classes from other modules. - if inspect.isfunction(obj) or inspect.isclass(obj): - if obj.__module__ != self._getobj().__name__: - continue - res = ihook.pytest_pycollect_makeitem( collector=self, name=name, obj=obj ) @@ -447,12 +470,12 @@ class PyCollector(PyobjMixin, nodes.Collector, abc.ABC): result.extend(values) return result - def _genfunctions(self, name: str, funcobj) -> Iterator[Function]: + def _genfunctions(self, name: str, funcobj) -> Iterator["Function"]: modulecol = self.getparent(Module) assert modulecol is not None module = modulecol.obj clscol = self.getparent(Class) - cls = (clscol and clscol.obj) or None + cls = clscol and clscol.obj or None definition = FunctionDefinition.from_parent(self, name=name, callobj=funcobj) fixtureinfo = definition._fixtureinfo @@ -477,16 +500,17 @@ class PyCollector(PyobjMixin, nodes.Collector, abc.ABC): if not metafunc._calls: yield Function.from_parent(self, name=name, fixtureinfo=fixtureinfo) else: - metafunc._recompute_direct_params_indices() - # Direct parametrizations taking place in module/class-specific - # `metafunc.parametrize` calls may have shadowed some fixtures, so make sure - # we update what the function really needs a.k.a its fixture closure. Note that - # direct parametrizations using `@pytest.mark.parametrize` have already been considered - # into making the closure using `ignore_args` arg to `getfixtureclosure`. + # Add funcargs() as fixturedefs to fixtureinfo.arg2fixturedefs. + fm = self.session._fixturemanager + fixtures.add_funcarg_pseudo_fixture_def(self, metafunc, fm) + + # Add_funcarg_pseudo_fixture_def may have shadowed some fixtures + # with direct parametrization, so make sure we update what the + # function really needs. fixtureinfo.prune_dependency_tree() for callspec in metafunc._calls: - subname = f"{name}[{callspec.id}]" if callspec._idlist else name + subname = f"{name}[{callspec.id}]" yield Function.from_parent( self, name=subname, @@ -497,110 +521,63 @@ class PyCollector(PyobjMixin, nodes.Collector, abc.ABC): ) -def importtestmodule( - path: Path, - config: Config, -): - # We assume we are only called once per module. - importmode = config.getoption("--import-mode") - try: - mod = import_path( - path, - mode=importmode, - root=config.rootpath, - consider_namespace_packages=config.getini("consider_namespace_packages"), - ) - except SyntaxError as e: - raise nodes.Collector.CollectError( - ExceptionInfo.from_current().getrepr(style="short") - ) from e - except ImportPathMismatchError as e: - raise nodes.Collector.CollectError( - "import file mismatch:\n" - "imported module {!r} has this __file__ attribute:\n" - " {}\n" - "which is not the same as the test file we want to collect:\n" - " {}\n" - "HINT: remove __pycache__ / .pyc files and/or use a " - "unique basename for your test file modules".format(*e.args) - ) from e - except ImportError as e: - exc_info = ExceptionInfo.from_current() - if config.get_verbosity() < 2: - exc_info.traceback = exc_info.traceback.filter(filter_traceback) - exc_repr = ( - exc_info.getrepr(style="short") - if exc_info.traceback - else exc_info.exconly() - ) - formatted_tb = str(exc_repr) - raise nodes.Collector.CollectError( - f"ImportError while importing test module '{path}'.\n" - "Hint: make sure your test modules/packages have valid Python names.\n" - "Traceback:\n" - f"{formatted_tb}" - ) from e - except skip.Exception as e: - if e.allow_module_level: - raise - raise nodes.Collector.CollectError( - "Using pytest.skip outside of a test will skip the entire module. " - "If that's your intention, pass `allow_module_level=True`. " - "If you want to skip a specific test or an entire class, " - "use the @pytest.mark.skip or @pytest.mark.skipif decorators." - ) from e - config.pluginmanager.consider_module(mod) - return mod - - class Module(nodes.File, PyCollector): """Collector for test classes and functions in a Python module.""" def _getobj(self): - return importtestmodule(self.path, self.config) + return self._importtestmodule() - def collect(self) -> Iterable[nodes.Item | nodes.Collector]: - self._register_setup_module_fixture() - self._register_setup_function_fixture() + def collect(self) -> Iterable[Union[nodes.Item, nodes.Collector]]: + self._inject_setup_module_fixture() + self._inject_setup_function_fixture() self.session._fixturemanager.parsefactories(self) return super().collect() - def _register_setup_module_fixture(self) -> None: - """Register an autouse, module-scoped fixture for the collected module object + def _inject_setup_module_fixture(self) -> None: + """Inject a hidden autouse, module scoped fixture into the collected module object that invokes setUpModule/tearDownModule if either or both are available. Using a fixture to invoke this methods ensures we play nicely and unsurprisingly with other fixtures (#517). """ + has_nose = self.config.pluginmanager.has_plugin("nose") setup_module = _get_first_non_fixture_func( self.obj, ("setUpModule", "setup_module") ) + if setup_module is None and has_nose: + # The name "setup" is too common - only treat as fixture if callable. + setup_module = _get_first_non_fixture_func(self.obj, ("setup",)) + if not callable(setup_module): + setup_module = None teardown_module = _get_first_non_fixture_func( self.obj, ("tearDownModule", "teardown_module") ) + if teardown_module is None and has_nose: + teardown_module = _get_first_non_fixture_func(self.obj, ("teardown",)) + # Same as "setup" above - only treat as fixture if callable. + if not callable(teardown_module): + teardown_module = None if setup_module is None and teardown_module is None: return - def xunit_setup_module_fixture(request) -> Generator[None]: - module = request.module - if setup_module is not None: - _call_with_optional_argument(setup_module, module) - yield - if teardown_module is not None: - _call_with_optional_argument(teardown_module, module) - - self.session._fixturemanager._register_fixture( + @fixtures.fixture( + autouse=True, + scope="module", # Use a unique name to speed up lookup. name=f"_xunit_setup_module_fixture_{self.obj.__name__}", - func=xunit_setup_module_fixture, - nodeid=self.nodeid, - scope="module", - autouse=True, ) + def xunit_setup_module_fixture(request) -> Generator[None, None, None]: + if setup_module is not None: + _call_with_optional_argument(setup_module, request.module) + yield + if teardown_module is not None: + _call_with_optional_argument(teardown_module, request.module) - def _register_setup_function_fixture(self) -> None: - """Register an autouse, function-scoped fixture for the collected module object + self.obj.__pytest_setup_module = xunit_setup_module_fixture + + def _inject_setup_function_fixture(self) -> None: + """Inject a hidden autouse, function scoped fixture into the collected module object that invokes setup_function/teardown_function if either or both are available. Using a fixture to invoke this methods ensures we play nicely and unsurprisingly with @@ -613,58 +590,93 @@ class Module(nodes.File, PyCollector): if setup_function is None and teardown_function is None: return - def xunit_setup_function_fixture(request) -> Generator[None]: + @fixtures.fixture( + autouse=True, + scope="function", + # Use a unique name to speed up lookup. + name=f"_xunit_setup_function_fixture_{self.obj.__name__}", + ) + def xunit_setup_function_fixture(request) -> Generator[None, None, None]: if request.instance is not None: # in this case we are bound to an instance, so we need to let # setup_method handle this yield return - function = request.function if setup_function is not None: - _call_with_optional_argument(setup_function, function) + _call_with_optional_argument(setup_function, request.function) yield if teardown_function is not None: - _call_with_optional_argument(teardown_function, function) + _call_with_optional_argument(teardown_function, request.function) - self.session._fixturemanager._register_fixture( - # Use a unique name to speed up lookup. - name=f"_xunit_setup_function_fixture_{self.obj.__name__}", - func=xunit_setup_function_fixture, - nodeid=self.nodeid, - scope="function", - autouse=True, - ) + self.obj.__pytest_setup_function = xunit_setup_function_fixture + + def _importtestmodule(self): + # We assume we are only called once per module. + importmode = self.config.getoption("--import-mode") + try: + mod = import_path(self.path, mode=importmode, root=self.config.rootpath) + except SyntaxError as e: + raise self.CollectError( + ExceptionInfo.from_current().getrepr(style="short") + ) from e + except ImportPathMismatchError as e: + raise self.CollectError( + "import file mismatch:\n" + "imported module %r has this __file__ attribute:\n" + " %s\n" + "which is not the same as the test file we want to collect:\n" + " %s\n" + "HINT: remove __pycache__ / .pyc files and/or use a " + "unique basename for your test file modules" % e.args + ) from e + except ImportError as e: + exc_info = ExceptionInfo.from_current() + if self.config.getoption("verbose") < 2: + exc_info.traceback = exc_info.traceback.filter(filter_traceback) + exc_repr = ( + exc_info.getrepr(style="short") + if exc_info.traceback + else exc_info.exconly() + ) + formatted_tb = str(exc_repr) + raise self.CollectError( + "ImportError while importing test module '{path}'.\n" + "Hint: make sure your test modules/packages have valid Python names.\n" + "Traceback:\n" + "{traceback}".format(path=self.path, traceback=formatted_tb) + ) from e + except skip.Exception as e: + if e.allow_module_level: + raise + raise self.CollectError( + "Using pytest.skip outside of a test will skip the entire module. " + "If that's your intention, pass `allow_module_level=True`. " + "If you want to skip a specific test or an entire class, " + "use the @pytest.mark.skip or @pytest.mark.skipif decorators." + ) from e + self.config.pluginmanager.consider_module(mod) + return mod -class Package(nodes.Directory): +class Package(Module): """Collector for files and directories in a Python packages -- directories - with an `__init__.py` file. - - .. note:: - - Directories without an `__init__.py` file are instead collected by - :class:`~pytest.Dir` by default. Both are :class:`~pytest.Directory` - collectors. - - .. versionchanged:: 8.0 - - Now inherits from :class:`~pytest.Directory`. - """ + with an `__init__.py` file.""" def __init__( self, - fspath: LEGACY_PATH | None, + fspath: Optional[LEGACY_PATH], parent: nodes.Collector, # NOTE: following args are unused: config=None, session=None, nodeid=None, - path: Path | None = None, + path: Optional[Path] = None, ) -> None: # NOTE: Could be just the following, but kept as-is for compat. - # super().__init__(self, fspath, parent=parent) + # nodes.FSCollector.__init__(self, fspath, parent=parent) session = parent.session - super().__init__( + nodes.FSCollector.__init__( + self, fspath=fspath, path=path, parent=parent, @@ -672,51 +684,87 @@ class Package(nodes.Directory): session=session, nodeid=nodeid, ) + self.name = self.path.parent.name def setup(self) -> None: - init_mod = importtestmodule(self.path / "__init__.py", self.config) - # Not using fixtures to call setup_module here because autouse fixtures # from packages are not called automatically (#4085). setup_module = _get_first_non_fixture_func( - init_mod, ("setUpModule", "setup_module") + self.obj, ("setUpModule", "setup_module") ) if setup_module is not None: - _call_with_optional_argument(setup_module, init_mod) + _call_with_optional_argument(setup_module, self.obj) teardown_module = _get_first_non_fixture_func( - init_mod, ("tearDownModule", "teardown_module") + self.obj, ("tearDownModule", "teardown_module") ) if teardown_module is not None: - func = partial(_call_with_optional_argument, teardown_module, init_mod) + func = partial(_call_with_optional_argument, teardown_module, self.obj) self.addfinalizer(func) - def collect(self) -> Iterable[nodes.Item | nodes.Collector]: - # Always collect __init__.py first. - def sort_key(entry: os.DirEntry[str]) -> object: - return (entry.name != "__init__.py", entry.name) + def _recurse(self, direntry: "os.DirEntry[str]") -> bool: + if direntry.name == "__pycache__": + return False + fspath = Path(direntry.path) + ihook = self.session.gethookproxy(fspath.parent) + if ihook.pytest_ignore_collect(collection_path=fspath, config=self.config): + return False + return True - config = self.config - col: nodes.Collector | None - cols: Sequence[nodes.Collector] - ihook = self.ihook - for direntry in scandir(self.path, sort_key): - if direntry.is_dir(): - path = Path(direntry.path) - if not self.session.isinitpath(path, with_parents=True): - if ihook.pytest_ignore_collect(collection_path=path, config=config): - continue - col = ihook.pytest_collect_directory(path=path, parent=self) - if col is not None: - yield col + def _collectfile( + self, fspath: Path, handle_dupes: bool = True + ) -> Sequence[nodes.Collector]: + assert ( + fspath.is_file() + ), "{!r} is not a file (isdir={!r}, exists={!r}, islink={!r})".format( + fspath, fspath.is_dir(), fspath.exists(), fspath.is_symlink() + ) + ihook = self.session.gethookproxy(fspath) + if not self.session.isinitpath(fspath): + if ihook.pytest_ignore_collect(collection_path=fspath, config=self.config): + return () - elif direntry.is_file(): - path = Path(direntry.path) - if not self.session.isinitpath(path): - if ihook.pytest_ignore_collect(collection_path=path, config=config): - continue - cols = ihook.pytest_collect_file(file_path=path, parent=self) - yield from cols + if handle_dupes: + keepduplicates = self.config.getoption("keepduplicates") + if not keepduplicates: + duplicate_paths = self.config.pluginmanager._duplicatepaths + if fspath in duplicate_paths: + return () + else: + duplicate_paths.add(fspath) + + return ihook.pytest_collect_file(file_path=fspath, parent=self) # type: ignore[no-any-return] + + def collect(self) -> Iterable[Union[nodes.Item, nodes.Collector]]: + this_path = self.path.parent + + # Always collect the __init__ first. + if path_matches_patterns(self.path, self.config.getini("python_files")): + yield Module.from_parent(self, path=self.path) + + pkg_prefixes: Set[Path] = set() + for direntry in visit(str(this_path), recurse=self._recurse): + path = Path(direntry.path) + + # We will visit our own __init__.py file, in which case we skip it. + if direntry.is_file(): + if direntry.name == "__init__.py" and path.parent == this_path: + continue + + parts_ = parts(direntry.path) + if any( + str(pkg_prefix) in parts_ and pkg_prefix / "__init__.py" != path + for pkg_prefix in pkg_prefixes + ): + continue + + if direntry.is_file(): + yield from self._collectfile(path) + elif not direntry.is_dir(): + # Broken symlink or invalid/missing file. + continue + elif path.joinpath("__init__.py").is_file(): + pkg_prefixes.add(path) def _call_with_optional_argument(func, arg) -> None: @@ -731,12 +779,12 @@ def _call_with_optional_argument(func, arg) -> None: func() -def _get_first_non_fixture_func(obj: object, names: Iterable[str]) -> object | None: +def _get_first_non_fixture_func(obj: object, names: Iterable[str]) -> Optional[object]: """Return the attribute from the given object to be used as a setup/teardown xunit-style function, but only if not marked as a fixture to avoid calling it twice. """ for name in names: - meth: object | None = getattr(obj, name, None) + meth: Optional[object] = getattr(obj, name, None) if meth is not None and fixtures.getfixturemarker(meth) is None: return meth return None @@ -746,22 +794,23 @@ class Class(PyCollector): """Collector for test methods (and nested classes) in a Python class.""" @classmethod - def from_parent(cls, parent, *, name, obj=None, **kw) -> Self: # type: ignore[override] + def from_parent(cls, parent, *, name, obj=None, **kw): """The public constructor.""" return super().from_parent(name=name, parent=parent, **kw) def newinstance(self): return self.obj() - def collect(self) -> Iterable[nodes.Item | nodes.Collector]: + def collect(self) -> Iterable[Union[nodes.Item, nodes.Collector]]: if not safe_getattr(self.obj, "__test__", True): return [] if hasinit(self.obj): assert self.parent is not None self.warn( PytestCollectionWarning( - f"cannot collect test class {self.obj.__name__!r} because it has a " - f"__init__ constructor (from: {self.parent.nodeid})" + "cannot collect test class %r because it has a " + "__init__ constructor (from: %s)" + % (self.obj.__name__, self.parent.nodeid) ) ) return [] @@ -769,21 +818,22 @@ class Class(PyCollector): assert self.parent is not None self.warn( PytestCollectionWarning( - f"cannot collect test class {self.obj.__name__!r} because it has a " - f"__new__ constructor (from: {self.parent.nodeid})" + "cannot collect test class %r because it has a " + "__new__ constructor (from: %s)" + % (self.obj.__name__, self.parent.nodeid) ) ) return [] - self._register_setup_class_fixture() - self._register_setup_method_fixture() + self._inject_setup_class_fixture() + self._inject_setup_method_fixture() self.session._fixturemanager.parsefactories(self.newinstance(), self.nodeid) return super().collect() - def _register_setup_class_fixture(self) -> None: - """Register an autouse, class scoped fixture into the collected class object + def _inject_setup_class_fixture(self) -> None: + """Inject a hidden autouse, class scoped fixture into the collected class object that invokes setup_class/teardown_class if either or both are available. Using a fixture to invoke this methods ensures we play nicely and unsurprisingly with @@ -794,58 +844,93 @@ class Class(PyCollector): if setup_class is None and teardown_class is None: return - def xunit_setup_class_fixture(request) -> Generator[None]: - cls = request.cls + @fixtures.fixture( + autouse=True, + scope="class", + # Use a unique name to speed up lookup. + name=f"_xunit_setup_class_fixture_{self.obj.__qualname__}", + ) + def xunit_setup_class_fixture(cls) -> Generator[None, None, None]: if setup_class is not None: func = getimfunc(setup_class) - _call_with_optional_argument(func, cls) + _call_with_optional_argument(func, self.obj) yield if teardown_class is not None: func = getimfunc(teardown_class) - _call_with_optional_argument(func, cls) + _call_with_optional_argument(func, self.obj) - self.session._fixturemanager._register_fixture( - # Use a unique name to speed up lookup. - name=f"_xunit_setup_class_fixture_{self.obj.__qualname__}", - func=xunit_setup_class_fixture, - nodeid=self.nodeid, - scope="class", - autouse=True, - ) + self.obj.__pytest_setup_class = xunit_setup_class_fixture - def _register_setup_method_fixture(self) -> None: - """Register an autouse, function scoped fixture into the collected class object + def _inject_setup_method_fixture(self) -> None: + """Inject a hidden autouse, function scoped fixture into the collected class object that invokes setup_method/teardown_method if either or both are available. Using a fixture to invoke these methods ensures we play nicely and unsurprisingly with other fixtures (#517). """ + has_nose = self.config.pluginmanager.has_plugin("nose") setup_name = "setup_method" setup_method = _get_first_non_fixture_func(self.obj, (setup_name,)) + emit_nose_setup_warning = False + if setup_method is None and has_nose: + setup_name = "setup" + emit_nose_setup_warning = True + setup_method = _get_first_non_fixture_func(self.obj, (setup_name,)) teardown_name = "teardown_method" teardown_method = _get_first_non_fixture_func(self.obj, (teardown_name,)) + emit_nose_teardown_warning = False + if teardown_method is None and has_nose: + teardown_name = "teardown" + emit_nose_teardown_warning = True + teardown_method = _get_first_non_fixture_func(self.obj, (teardown_name,)) if setup_method is None and teardown_method is None: return - def xunit_setup_method_fixture(request) -> Generator[None]: - instance = request.instance - method = request.function - if setup_method is not None: - func = getattr(instance, setup_name) - _call_with_optional_argument(func, method) - yield - if teardown_method is not None: - func = getattr(instance, teardown_name) - _call_with_optional_argument(func, method) - - self.session._fixturemanager._register_fixture( + @fixtures.fixture( + autouse=True, + scope="function", # Use a unique name to speed up lookup. name=f"_xunit_setup_method_fixture_{self.obj.__qualname__}", - func=xunit_setup_method_fixture, - nodeid=self.nodeid, - scope="function", - autouse=True, ) + def xunit_setup_method_fixture(self, request) -> Generator[None, None, None]: + method = request.function + if setup_method is not None: + func = getattr(self, setup_name) + _call_with_optional_argument(func, method) + if emit_nose_setup_warning: + warnings.warn( + NOSE_SUPPORT_METHOD.format( + nodeid=request.node.nodeid, method="setup" + ), + stacklevel=2, + ) + yield + if teardown_method is not None: + func = getattr(self, teardown_name) + _call_with_optional_argument(func, method) + if emit_nose_teardown_warning: + warnings.warn( + NOSE_SUPPORT_METHOD.format( + nodeid=request.node.nodeid, method="teardown" + ), + stacklevel=2, + ) + + self.obj.__pytest_setup_method = xunit_setup_method_fixture + + +class InstanceDummy: + """Instance used to be a node type between Class and Function. It has been + removed in pytest 7.0. Some plugins exist which reference `pytest.Instance` + only to ignore it; this dummy class keeps them working. This will be removed + in pytest 8.""" + + +def __getattr__(name: str) -> object: + if name == "Instance": + warnings.warn(INSTANCE_COLLECTOR, 2) + return InstanceDummy + raise AttributeError(f"module {__name__} has no attribute {name}") def hasinit(obj: object) -> bool: @@ -869,12 +954,12 @@ class IdMaker: __slots__ = ( "argnames", - "config", - "func_name", + "parametersets", "idfn", "ids", + "config", "nodeid", - "parametersets", + "func_name", ) # The argnames of the parametrization. @@ -883,27 +968,24 @@ class IdMaker: parametersets: Sequence[ParameterSet] # Optionally, a user-provided callable to make IDs for parameters in a # ParameterSet. - idfn: Callable[[Any], object | None] | None + idfn: Optional[Callable[[Any], Optional[object]]] # Optionally, explicit IDs for ParameterSets by index. - ids: Sequence[object | None] | None + ids: Optional[Sequence[Optional[object]]] # Optionally, the pytest config. - # Used for controlling ASCII escaping, determining parametrization ID - # strictness, and for calling the :hook:`pytest_make_parametrize_id` hook. - config: Config | None + # Used for controlling ASCII escaping, and for calling the + # :hook:`pytest_make_parametrize_id` hook. + config: Optional[Config] # Optionally, the ID of the node being parametrized. # Used only for clearer error messages. - nodeid: str | None + nodeid: Optional[str] # Optionally, the ID of the function being parametrized. # Used only for clearer error messages. - func_name: str | None + func_name: Optional[str] - def make_unique_parameterset_ids(self) -> list[str | _HiddenParam]: + def make_unique_parameterset_ids(self) -> List[str]: """Make a unique identifier for each ParameterSet, that may be used to identify the parametrization in a node ID. - If strict_parametrization_ids is enabled, and duplicates are detected, - raises CollectError. Otherwise makes the IDs unique as follows: - Format is -...-[counter], where prm_x_token is - user-provided id, if given - else an id derived from the value, applicable for certain types @@ -916,84 +998,29 @@ class IdMaker: if len(resolved_ids) != len(set(resolved_ids)): # Record the number of occurrences of each ID. id_counts = Counter(resolved_ids) - - if self._strict_parametrization_ids_enabled(): - parameters = ", ".join(self.argnames) - parametersets = ", ".join( - [saferepr(list(param.values)) for param in self.parametersets] - ) - ids = ", ".join( - id if id is not HIDDEN_PARAM else "" for id in resolved_ids - ) - duplicates = ", ".join( - id if id is not HIDDEN_PARAM else "" - for id, count in id_counts.items() - if count > 1 - ) - msg = textwrap.dedent(f""" - Duplicate parametrization IDs detected, but strict_parametrization_ids is set. - - Test name: {self.nodeid} - Parameters: {parameters} - Parameter sets: {parametersets} - IDs: {ids} - Duplicates: {duplicates} - - You can fix this problem using `@pytest.mark.parametrize(..., ids=...)` or `pytest.param(..., id=...)`. - """).strip() # noqa: E501 - raise nodes.Collector.CollectError(msg) - # Map the ID to its next suffix. - id_suffixes: dict[str, int] = defaultdict(int) + id_suffixes: Dict[str, int] = defaultdict(int) # Suffix non-unique IDs to make them unique. for index, id in enumerate(resolved_ids): if id_counts[id] > 1: - if id is HIDDEN_PARAM: - self._complain_multiple_hidden_parameter_sets() - suffix = "" - if id and id[-1].isdigit(): - suffix = "_" - new_id = f"{id}{suffix}{id_suffixes[id]}" - while new_id in set(resolved_ids): - id_suffixes[id] += 1 - new_id = f"{id}{suffix}{id_suffixes[id]}" - resolved_ids[index] = new_id + resolved_ids[index] = f"{id}{id_suffixes[id]}" id_suffixes[id] += 1 - assert len(resolved_ids) == len(set(resolved_ids)), ( - f"Internal error: {resolved_ids=}" - ) return resolved_ids - def _strict_parametrization_ids_enabled(self) -> bool: - if self.config is None: - return False - strict_parametrization_ids = self.config.getini("strict_parametrization_ids") - if strict_parametrization_ids is None: - strict_parametrization_ids = self.config.getini("strict") - return cast(bool, strict_parametrization_ids) - - def _resolve_ids(self) -> Iterable[str | _HiddenParam]: + def _resolve_ids(self) -> Iterable[str]: """Resolve IDs for all ParameterSets (may contain duplicates).""" for idx, parameterset in enumerate(self.parametersets): if parameterset.id is not None: # ID provided directly - pytest.param(..., id="...") - if parameterset.id is HIDDEN_PARAM: - yield HIDDEN_PARAM - else: - yield _ascii_escaped_by_config(parameterset.id, self.config) + yield parameterset.id elif self.ids and idx < len(self.ids) and self.ids[idx] is not None: # ID provided in the IDs list - parametrize(..., ids=[...]). - if self.ids[idx] is HIDDEN_PARAM: - yield HIDDEN_PARAM - else: - yield self._idval_from_value_required(self.ids[idx], idx) + yield self._idval_from_value_required(self.ids[idx], idx) else: # ID not provided - generate it. yield "-".join( self._idval(val, argname, idx) - for val, argname in zip( - parameterset.values, self.argnames, strict=True - ) + for val, argname in zip(parameterset.values, self.argnames) ) def _idval(self, val: object, argname: str, idx: int) -> str: @@ -1009,7 +1036,9 @@ class IdMaker: return idval return self._idval_from_argname(argname, idx) - def _idval_from_function(self, val: object, argname: str, idx: int) -> str | None: + def _idval_from_function( + self, val: object, argname: str, idx: int + ) -> Optional[str]: """Try to make an ID for a parameter in a ParameterSet using the user-provided id callable, if given.""" if self.idfn is None: @@ -1025,24 +1054,24 @@ class IdMaker: return None return self._idval_from_value(id) - def _idval_from_hook(self, val: object, argname: str) -> str | None: + def _idval_from_hook(self, val: object, argname: str) -> Optional[str]: """Try to make an ID for a parameter in a ParameterSet by calling the :hook:`pytest_make_parametrize_id` hook.""" if self.config: - id: str | None = self.config.hook.pytest_make_parametrize_id( + id: Optional[str] = self.config.hook.pytest_make_parametrize_id( config=self.config, val=val, argname=argname ) return id return None - def _idval_from_value(self, val: object) -> str | None: + def _idval_from_value(self, val: object) -> Optional[str]: """Try to make an ID for a parameter in a ParameterSet from its value, if the value type is supported.""" - if isinstance(val, str | bytes): + if isinstance(val, STRING_TYPES): return _ascii_escaped_by_config(val, self.config) - elif val is None or isinstance(val, float | int | bool | complex): + elif val is None or isinstance(val, (float, int, bool, complex)): return str(val) - elif isinstance(val, re.Pattern): + elif isinstance(val, Pattern): return ascii_escaped(val.pattern) elif val is NOTSET: # Fallback to default. Note that NOTSET is an enum.Enum. @@ -1062,7 +1091,12 @@ class IdMaker: return id # Fail. - prefix = self._make_error_prefix() + if self.func_name is not None: + prefix = f"In {self.func_name}: " + elif self.nodeid is not None: + prefix = f"In {self.nodeid}: " + else: + prefix = "" msg = ( f"{prefix}ids contains unsupported value {saferepr(val)} (type: {type(val)!r}) at index {idx}. " "Supported types are: str, bytes, int, float, complex, bool, enum, regex or anything with a __name__." @@ -1075,21 +1109,6 @@ class IdMaker: and the index of the ParameterSet.""" return str(argname) + str(idx) - def _complain_multiple_hidden_parameter_sets(self) -> NoReturn: - fail( - f"{self._make_error_prefix()}multiple instances of HIDDEN_PARAM " - "cannot be used in the same parametrize call, " - "because the tests names need to be unique." - ) - - def _make_error_prefix(self) -> str: - if self.func_name is not None: - return f"In {self.func_name}: " - elif self.nodeid is not None: - return f"In {self.nodeid}: " - else: - return "" - @final @dataclasses.dataclass(frozen=True) @@ -1101,46 +1120,54 @@ class CallSpec2: and stored in item.callspec. """ - # arg name -> arg value which will be passed to a fixture or pseudo-fixture - # of the same name. (indirect or direct parametrization respectively) - params: dict[str, object] = dataclasses.field(default_factory=dict) + # arg name -> arg value which will be passed to the parametrized test + # function (direct parameterization). + funcargs: Dict[str, object] = dataclasses.field(default_factory=dict) + # arg name -> arg value which will be passed to a fixture of the same name + # (indirect parametrization). + params: Dict[str, object] = dataclasses.field(default_factory=dict) # arg name -> arg index. - indices: dict[str, int] = dataclasses.field(default_factory=dict) - # arg name -> parameter scope. + indices: Dict[str, int] = dataclasses.field(default_factory=dict) # Used for sorting parametrized resources. - _arg2scope: Mapping[str, Scope] = dataclasses.field(default_factory=dict) + _arg2scope: Dict[str, Scope] = dataclasses.field(default_factory=dict) # Parts which will be added to the item's name in `[..]` separated by "-". - _idlist: Sequence[str] = dataclasses.field(default_factory=tuple) + _idlist: List[str] = dataclasses.field(default_factory=list) # Marks which will be applied to the item. - marks: list[Mark] = dataclasses.field(default_factory=list) + marks: List[Mark] = dataclasses.field(default_factory=list) def setmulti( self, *, + valtypes: Mapping[str, "Literal['params', 'funcargs']"], argnames: Iterable[str], valset: Iterable[object], - id: str | _HiddenParam, - marks: Iterable[Mark | MarkDecorator], + id: str, + marks: Iterable[Union[Mark, MarkDecorator]], scope: Scope, param_index: int, - nodeid: str, - ) -> CallSpec2: + ) -> "CallSpec2": + funcargs = self.funcargs.copy() params = self.params.copy() indices = self.indices.copy() - arg2scope = dict(self._arg2scope) - for arg, val in zip(argnames, valset, strict=True): - if arg in params: - raise nodes.Collector.CollectError( - f"{nodeid}: duplicate parametrization of {arg!r}" - ) - params[arg] = val + arg2scope = self._arg2scope.copy() + for arg, val in zip(argnames, valset): + if arg in params or arg in funcargs: + raise ValueError(f"duplicate parametrization of {arg!r}") + valtype_for_arg = valtypes[arg] + if valtype_for_arg == "params": + params[arg] = val + elif valtype_for_arg == "funcargs": + funcargs[arg] = val + else: + assert_never(valtype_for_arg) indices[arg] = param_index arg2scope[arg] = scope return CallSpec2( + funcargs=funcargs, params=params, indices=indices, _arg2scope=arg2scope, - _idlist=self._idlist if id is HIDDEN_PARAM else [*self._idlist, id], + _idlist=[*self._idlist, id], marks=[*self.marks, *normalize_mark_list(marks)], ) @@ -1155,14 +1182,6 @@ class CallSpec2: return "-".join(self._idlist) -def get_direct_param_fixture_func(request: FixtureRequest) -> Any: - return request.param - - -# Used for storing pseudo fixturedefs for direct parametrization. -name2pseudofixturedef_key = StashKey[dict[str, FixtureDef[Any]]]() - - @final class Metafunc: """Objects passed to the :hook:`pytest_generate_tests` hook. @@ -1174,7 +1193,7 @@ class Metafunc: def __init__( self, - definition: FunctionDefinition, + definition: "FunctionDefinition", fixtureinfo: fixtures.FuncFixtureInfo, config: Config, cls=None, @@ -1205,24 +1224,24 @@ class Metafunc: self._arg2fixturedefs = fixtureinfo.name2fixturedefs # Result of parametrize(). - self._calls: list[CallSpec2] = [] - - self._params_directness: dict[str, Literal["indirect", "direct"]] = {} + self._calls: List[CallSpec2] = [] def parametrize( self, - argnames: str | Sequence[str], - argvalues: Iterable[ParameterSet | Sequence[object] | object], - indirect: bool | Sequence[str] = False, - ids: Iterable[object | None] | Callable[[Any], object | None] | None = None, - scope: _ScopeName | None = None, + argnames: Union[str, Sequence[str]], + argvalues: Iterable[Union[ParameterSet, Sequence[object], object]], + indirect: Union[bool, Sequence[str]] = False, + ids: Optional[ + Union[Iterable[Optional[object]], Callable[[Any], Optional[object]]] + ] = None, + scope: "Optional[_ScopeName]" = None, *, - _param_mark: Mark | None = None, + _param_mark: Optional[Mark] = None, ) -> None: """Add new invocations to the underlying test function using the list of argvalues for the given argnames. Parametrization is performed during the collection phase. If you need to setup expensive resources - see about setting ``indirect`` to do it at test setup time instead. + see about setting indirect to do it rather than at test setup time. Can be called multiple times per test function (but only on different argument names), in which case each call parametrizes all previous @@ -1265,11 +1284,6 @@ class Metafunc: They are mapped to the corresponding index in ``argvalues``. ``None`` means to use the auto-generated id. - .. versionadded:: 8.4 - :ref:`hidden-param` means to hide the parameter set - from the test name. Can only be used at most 1 time, as - test names need to be unique. - If it is a callable it will be called for each entry in ``argvalues``, and the return value is used as part of the auto-generated id for the whole set (where parts are joined with @@ -1286,8 +1300,6 @@ class Metafunc: It will also override any fixture-function defined scope, allowing to set a dynamic scope using test context or configuration. """ - nodeid = self.definition.nodeid - argnames, parametersets = ParameterSet._for_parametrize( argnames, argvalues, @@ -1299,7 +1311,7 @@ class Metafunc: if "request" in argnames: fail( - f"{nodeid}: 'request' is a reserved name and cannot be used in @pytest.mark.parametrize", + "'request' is a reserved name and cannot be used in @pytest.mark.parametrize", pytrace=False, ) @@ -1312,6 +1324,8 @@ class Metafunc: self._validate_if_using_arg_names(argnames, indirect) + arg_values_types = self._resolve_arg_value_types(argnames, indirect) + # Use any already (possibly) generated ids with parametrize Marks. if _param_mark and _param_mark._param_ids_from: generated_ids = _param_mark._param_ids_from._param_ids_generated @@ -1326,75 +1340,22 @@ class Metafunc: if _param_mark and _param_mark._param_ids_from and generated_ids is None: object.__setattr__(_param_mark._param_ids_from, "_param_ids_generated", ids) - # Calculate directness. - arg_directness = self._resolve_args_directness(argnames, indirect) - self._params_directness.update(arg_directness) - - # Add direct parametrizations as fixturedefs to arg2fixturedefs by - # registering artificial "pseudo" FixtureDef's such that later at test - # setup time we can rely on FixtureDefs to exist for all argnames. - node = None - # For scopes higher than function, a "pseudo" FixtureDef might have - # already been created for the scope. We thus store and cache the - # FixtureDef on the node related to the scope. - if scope_ is Scope.Function: - name2pseudofixturedef = None - else: - collector = self.definition.parent - assert collector is not None - node = get_scope_node(collector, scope_) - if node is None: - # If used class scope and there is no class, use module-level - # collector (for now). - if scope_ is Scope.Class: - assert isinstance(collector, Module) - node = collector - # If used package scope and there is no package, use session - # (for now). - elif scope_ is Scope.Package: - node = collector.session - else: - assert False, f"Unhandled missing scope: {scope}" - default: dict[str, FixtureDef[Any]] = {} - name2pseudofixturedef = node.stash.setdefault( - name2pseudofixturedef_key, default - ) - for argname in argnames: - if arg_directness[argname] == "indirect": - continue - if name2pseudofixturedef is not None and argname in name2pseudofixturedef: - fixturedef = name2pseudofixturedef[argname] - else: - fixturedef = FixtureDef( - config=self.config, - baseid="", - argname=argname, - func=get_direct_param_fixture_func, - scope=scope_, - params=None, - ids=None, - _ispytest=True, - ) - if name2pseudofixturedef is not None: - name2pseudofixturedef[argname] = fixturedef - self._arg2fixturedefs[argname] = [fixturedef] - # Create the new calls: if we are parametrize() multiple times (by applying the decorator # more than once) then we accumulate those calls generating the cartesian product # of all calls. newcalls = [] for callspec in self._calls or [CallSpec2()]: for param_index, (param_id, param_set) in enumerate( - zip(ids, parametersets, strict=True) + zip(ids, parametersets) ): newcallspec = callspec.setmulti( + valtypes=arg_values_types, argnames=argnames, valset=param_set.values, id=param_id, marks=param_set.marks, scope=scope_, param_index=param_index, - nodeid=nodeid, ) newcalls.append(newcallspec) self._calls = newcalls @@ -1402,10 +1363,12 @@ class Metafunc: def _resolve_parameter_set_ids( self, argnames: Sequence[str], - ids: Iterable[object | None] | Callable[[Any], object | None] | None, + ids: Optional[ + Union[Iterable[Optional[object]], Callable[[Any], Optional[object]]] + ], parametersets: Sequence[ParameterSet], nodeid: str, - ) -> list[str | _HiddenParam]: + ) -> List[str]: """Resolve the actual ids for the given parameter sets. :param argnames: @@ -1443,10 +1406,10 @@ class Metafunc: def _validate_ids( self, - ids: Iterable[object | None], + ids: Iterable[Optional[object]], parametersets: Sequence[ParameterSet], func_name: str, - ) -> list[object | None]: + ) -> List[Optional[object]]: try: num_ids = len(ids) # type: ignore[arg-type] except TypeError: @@ -1463,49 +1426,50 @@ class Metafunc: return list(itertools.islice(ids, num_ids)) - def _resolve_args_directness( + def _resolve_arg_value_types( self, argnames: Sequence[str], - indirect: bool | Sequence[str], - ) -> dict[str, Literal["indirect", "direct"]]: - """Resolve if each parametrized argument must be considered an indirect - parameter to a fixture of the same name, or a direct parameter to the - parametrized function, based on the ``indirect`` parameter of the - parametrized() call. + indirect: Union[bool, Sequence[str]], + ) -> Dict[str, "Literal['params', 'funcargs']"]: + """Resolve if each parametrized argument must be considered a + parameter to a fixture or a "funcarg" to the function, based on the + ``indirect`` parameter of the parametrized() call. - :param argnames: - List of argument names passed to ``parametrize()``. - :param indirect: - Same as the ``indirect`` parameter of ``parametrize()``. - :returns - A dict mapping each arg name to either "indirect" or "direct". + :param List[str] argnames: List of argument names passed to ``parametrize()``. + :param indirect: Same as the ``indirect`` parameter of ``parametrize()``. + :rtype: Dict[str, str] + A dict mapping each arg name to either: + * "params" if the argname should be the parameter of a fixture of the same name. + * "funcargs" if the argname should be a parameter to the parametrized test function. """ - arg_directness: dict[str, Literal["indirect", "direct"]] if isinstance(indirect, bool): - arg_directness = dict.fromkeys( - argnames, "indirect" if indirect else "direct" + valtypes: Dict[str, Literal["params", "funcargs"]] = dict.fromkeys( + argnames, "params" if indirect else "funcargs" ) elif isinstance(indirect, Sequence): - arg_directness = dict.fromkeys(argnames, "direct") + valtypes = dict.fromkeys(argnames, "funcargs") for arg in indirect: if arg not in argnames: fail( - f"In {self.function.__name__}: indirect fixture '{arg}' doesn't exist", + "In {}: indirect fixture '{}' doesn't exist".format( + self.function.__name__, arg + ), pytrace=False, ) - arg_directness[arg] = "indirect" + valtypes[arg] = "params" else: fail( - f"In {self.function.__name__}: expected Sequence or boolean" - f" for indirect, got {type(indirect).__name__}", + "In {func}: expected Sequence or boolean for indirect, got {type}".format( + type=type(indirect).__name__, func=self.function.__name__ + ), pytrace=False, ) - return arg_directness + return valtypes def _validate_if_using_arg_names( self, argnames: Sequence[str], - indirect: bool | Sequence[str], + indirect: Union[bool, Sequence[str]], ) -> None: """Check if all argnames are being used, by default values, or directly/indirectly. @@ -1519,7 +1483,9 @@ class Metafunc: if arg not in self.fixturenames: if arg in default_arg_names: fail( - f"In {func_name}: function already takes an argument '{arg}' with a default value", + "In {}: function already takes an argument '{}' with a default value".format( + func_name, arg + ), pytrace=False, ) else: @@ -1532,17 +1498,11 @@ class Metafunc: pytrace=False, ) - def _recompute_direct_params_indices(self) -> None: - for argname, param_type in self._params_directness.items(): - if param_type == "direct": - for i, callspec in enumerate(self._calls): - callspec.indices[argname] = i - def _find_parametrized_scope( argnames: Sequence[str], arg2fixturedefs: Mapping[str, Sequence[fixtures.FixtureDef[object]]], - indirect: bool | Sequence[str], + indirect: Union[bool, Sequence[str]], ) -> Scope: """Find the most appropriate scope for a parametrized call based on its arguments. @@ -1561,7 +1521,7 @@ def _find_parametrized_scope( if all_arguments_are_fixtures: fixturedefs = arg2fixturedefs or {} used_scopes = [ - fixturedef[-1]._scope + fixturedef[0]._scope for name, fixturedef in fixturedefs.items() if name in argnames ] @@ -1571,7 +1531,7 @@ def _find_parametrized_scope( return Scope.Function -def _ascii_escaped_by_config(val: str | bytes, config: Config | None) -> str: +def _ascii_escaped_by_config(val: Union[str, bytes], config: Optional[Config]) -> str: if config is None: escape_option = False else: @@ -1584,6 +1544,138 @@ def _ascii_escaped_by_config(val: str | bytes, config: Config | None) -> str: return val if escape_option else ascii_escaped(val) # type: ignore +def _pretty_fixture_path(func) -> str: + cwd = Path.cwd() + loc = Path(getlocation(func, str(cwd))) + prefix = Path("...", "_pytest") + try: + return str(prefix / loc.relative_to(_PYTEST_DIR)) + except ValueError: + return bestrelpath(cwd, loc) + + +def show_fixtures_per_test(config): + from _pytest.main import wrap_session + + return wrap_session(config, _show_fixtures_per_test) + + +def _show_fixtures_per_test(config: Config, session: Session) -> None: + import _pytest.config + + session.perform_collect() + curdir = Path.cwd() + tw = _pytest.config.create_terminal_writer(config) + verbose = config.getvalue("verbose") + + def get_best_relpath(func) -> str: + loc = getlocation(func, str(curdir)) + return bestrelpath(curdir, Path(loc)) + + def write_fixture(fixture_def: fixtures.FixtureDef[object]) -> None: + argname = fixture_def.argname + if verbose <= 0 and argname.startswith("_"): + return + prettypath = _pretty_fixture_path(fixture_def.func) + tw.write(f"{argname}", green=True) + tw.write(f" -- {prettypath}", yellow=True) + tw.write("\n") + fixture_doc = inspect.getdoc(fixture_def.func) + if fixture_doc: + write_docstring( + tw, fixture_doc.split("\n\n")[0] if verbose <= 0 else fixture_doc + ) + else: + tw.line(" no docstring available", red=True) + + def write_item(item: nodes.Item) -> None: + # Not all items have _fixtureinfo attribute. + info: Optional[FuncFixtureInfo] = getattr(item, "_fixtureinfo", None) + if info is None or not info.name2fixturedefs: + # This test item does not use any fixtures. + return + tw.line() + tw.sep("-", f"fixtures used by {item.name}") + # TODO: Fix this type ignore. + tw.sep("-", f"({get_best_relpath(item.function)})") # type: ignore[attr-defined] + # dict key not used in loop but needed for sorting. + for _, fixturedefs in sorted(info.name2fixturedefs.items()): + assert fixturedefs is not None + if not fixturedefs: + continue + # Last item is expected to be the one used by the test item. + write_fixture(fixturedefs[-1]) + + for session_item in session.items: + write_item(session_item) + + +def showfixtures(config: Config) -> Union[int, ExitCode]: + from _pytest.main import wrap_session + + return wrap_session(config, _showfixtures_main) + + +def _showfixtures_main(config: Config, session: Session) -> None: + import _pytest.config + + session.perform_collect() + curdir = Path.cwd() + tw = _pytest.config.create_terminal_writer(config) + verbose = config.getvalue("verbose") + + fm = session._fixturemanager + + available = [] + seen: Set[Tuple[str, str]] = set() + + for argname, fixturedefs in fm._arg2fixturedefs.items(): + assert fixturedefs is not None + if not fixturedefs: + continue + for fixturedef in fixturedefs: + loc = getlocation(fixturedef.func, str(curdir)) + if (fixturedef.argname, loc) in seen: + continue + seen.add((fixturedef.argname, loc)) + available.append( + ( + len(fixturedef.baseid), + fixturedef.func.__module__, + _pretty_fixture_path(fixturedef.func), + fixturedef.argname, + fixturedef, + ) + ) + + available.sort() + currentmodule = None + for baseid, module, prettypath, argname, fixturedef in available: + if currentmodule != module: + if not module.startswith("_pytest."): + tw.line() + tw.sep("-", f"fixtures defined from {module}") + currentmodule = module + if verbose <= 0 and argname.startswith("_"): + continue + tw.write(f"{argname}", green=True) + if fixturedef.scope != "function": + tw.write(" [%s scope]" % fixturedef.scope, cyan=True) + tw.write(f" -- {prettypath}", yellow=True) + tw.write("\n") + doc = inspect.getdoc(fixturedef.func) + if doc: + write_docstring(tw, doc.split("\n\n")[0] if verbose <= 0 else doc) + else: + tw.line(" no docstring available", red=True) + tw.line() + + +def write_docstring(tw: TerminalWriter, doc: str, indent: str = " ") -> None: + for line in doc.split("\n"): + tw.line(indent + line) + + class Function(PyobjMixin, nodes.Item): """Item responsible for setting up and executing a Python test function. @@ -1595,7 +1687,7 @@ class Function(PyobjMixin, nodes.Item): :param config: The pytest Config object. :param callspec: - If given, this function has been parametrized and the callspec contains + If given, this is function has been parametrized and the callspec contains meta information about the parametrization. :param callobj: If given, the object which will be called when the Function is invoked, @@ -1620,19 +1712,18 @@ class Function(PyobjMixin, nodes.Item): self, name: str, parent, - config: Config | None = None, - callspec: CallSpec2 | None = None, + config: Optional[Config] = None, + callspec: Optional[CallSpec2] = None, callobj=NOTSET, - keywords: Mapping[str, Any] | None = None, - session: Session | None = None, - fixtureinfo: FuncFixtureInfo | None = None, - originalname: str | None = None, + keywords: Optional[Mapping[str, Any]] = None, + session: Optional[Session] = None, + fixtureinfo: Optional[FuncFixtureInfo] = None, + originalname: Optional[str] = None, ) -> None: super().__init__(name, parent, config=config, session=session) if callobj is not NOTSET: - self._obj = callobj - self._instance = getattr(callobj, "__self__", None) + self.obj = callobj #: Original function name, without any decorations (for example #: parametrization adds a ``"[...]"`` suffix to function names), used to access @@ -1661,52 +1752,33 @@ class Function(PyobjMixin, nodes.Item): self.keywords.update(keywords) if fixtureinfo is None: - fm = self.session._fixturemanager - fixtureinfo = fm.getfixtureinfo(self, self.obj, self.cls) + fixtureinfo = self.session._fixturemanager.getfixtureinfo( + self, self.obj, self.cls, funcargs=True + ) self._fixtureinfo: FuncFixtureInfo = fixtureinfo self.fixturenames = fixtureinfo.names_closure self._initrequest() - # todo: determine sound type limitations @classmethod - def from_parent(cls, parent, **kw) -> Self: + def from_parent(cls, parent, **kw): # todo: determine sound type limitations """The public constructor.""" return super().from_parent(parent=parent, **kw) def _initrequest(self) -> None: - self.funcargs: dict[str, object] = {} - self._request = fixtures.TopRequest(self, _ispytest=True) + self.funcargs: Dict[str, object] = {} + self._request = fixtures.FixtureRequest(self, _ispytest=True) @property def function(self): """Underlying python 'function' object.""" return getimfunc(self.obj) - @property - def instance(self): - try: - return self._instance - except AttributeError: - if isinstance(self.parent, Class): - # Each Function gets a fresh class instance. - self._instance = self._getinstance() - else: - self._instance = None - return self._instance - - def _getinstance(self): + def _getobj(self): + assert self.parent is not None if isinstance(self.parent, Class): # Each Function gets a fresh class instance. - return self.parent.newinstance() + parent_obj = self.parent.newinstance() else: - return None - - def _getobj(self): - instance = self.instance - if instance is not None: - parent_obj = instance - else: - assert self.parent is not None parent_obj = self.parent.obj # type: ignore[attr-defined] return getattr(parent_obj, self.originalname) @@ -1741,11 +1813,10 @@ class Function(PyobjMixin, nodes.Item): if self.config.getoption("tbstyle", "auto") == "auto": if len(ntraceback) > 2: ntraceback = Traceback( - ( - ntraceback[0], - *(t.with_repr_style("short") for t in ntraceback[1:-1]), - ntraceback[-1], - ) + entry + if i == 0 or i == len(ntraceback) - 1 + else entry.with_repr_style("short") + for i, entry in enumerate(ntraceback) ) return ntraceback @@ -1755,7 +1826,7 @@ class Function(PyobjMixin, nodes.Item): def repr_failure( # type: ignore[override] self, excinfo: ExceptionInfo[BaseException], - ) -> str | TerminalRepr: + ) -> Union[str, TerminalRepr]: style = self.config.getoption("tbstyle", "auto") if style == "auto": style = "long" diff --git a/Backend/venv/lib/python3.12/site-packages/_pytest/python_api.py b/Backend/venv/lib/python3.12/site-packages/_pytest/python_api.py index 1e389eb0..18335610 100644 --- a/Backend/venv/lib/python3.12/site-packages/_pytest/python_api.py +++ b/Backend/venv/lib/python3.12/site-packages/_pytest/python_api.py @@ -1,31 +1,53 @@ -# mypy: allow-untyped-defs -from __future__ import annotations - +import math +import pprint from collections.abc import Collection -from collections.abc import Mapping -from collections.abc import Sequence from collections.abc import Sized from decimal import Decimal -import math from numbers import Complex -import pprint -import sys +from types import TracebackType from typing import Any +from typing import Callable +from typing import cast +from typing import ContextManager +from typing import List +from typing import Mapping +from typing import Optional +from typing import Pattern +from typing import Sequence +from typing import Tuple +from typing import Type from typing import TYPE_CHECKING - +from typing import TypeVar +from typing import Union if TYPE_CHECKING: from numpy import ndarray +import _pytest._code +from _pytest.compat import final +from _pytest.compat import STRING_TYPES +from _pytest.compat import overload +from _pytest.outcomes import fail + + +def _non_numeric_type_error(value, at: Optional[str]) -> TypeError: + at_str = f" at {at}" if at else "" + return TypeError( + "cannot make approximate comparisons to non-numeric values: {!r} {}".format( + value, at_str + ) + ) + + def _compare_approx( full_object: object, - message_data: Sequence[tuple[str, str, str]], + message_data: Sequence[Tuple[str, str, str]], number_of_elements: int, different_ids: Sequence[object], max_abs_diff: float, max_rel_diff: float, -) -> list[str]: +) -> List[str]: message_list = list(message_data) message_list.insert(0, ("Index", "Obtained", "Expected")) max_sizes = [0, 0, 0] @@ -66,7 +88,7 @@ class ApproxBase: def __repr__(self) -> str: raise NotImplementedError - def _repr_compare(self, other_side: Any) -> list[str]: + def _repr_compare(self, other_side: Any) -> List[str]: return [ "comparison failed", f"Obtained: {other_side}", @@ -90,7 +112,7 @@ class ApproxBase: def __ne__(self, actual) -> bool: return not (actual == self) - def _approx_scalar(self, x) -> ApproxScalar: + def _approx_scalar(self, x) -> "ApproxScalar": if isinstance(x, Decimal): return ApproxDecimal(x, rel=self.rel, abs=self.abs, nan_ok=self.nan_ok) return ApproxScalar(x, rel=self.rel, abs=self.abs, nan_ok=self.nan_ok) @@ -113,11 +135,9 @@ class ApproxBase: def _recursive_sequence_map(f, x): """Recursively map a function over a sequence of arbitrary depth""" - if isinstance(x, list | tuple): + if isinstance(x, (list, tuple)): seq_type = type(x) return seq_type(_recursive_sequence_map(f, xi) for xi in x) - elif _is_sequence_like(x): - return [_recursive_sequence_map(f, xi) for xi in x] else: return f(x) @@ -131,12 +151,12 @@ class ApproxNumpy(ApproxBase): ) return f"approx({list_scalars!r})" - def _repr_compare(self, other_side: ndarray | list[Any]) -> list[str]: + def _repr_compare(self, other_side: "ndarray") -> List[str]: import itertools import math def get_value_from_nested_list( - nested_list: list[Any], nd_index: tuple[Any, ...] + nested_list: List[Any], nd_index: Tuple[Any, ...] ) -> Any: """ Helper function to get the value out of a nested list, given an n-dimensional index. @@ -152,14 +172,10 @@ class ApproxNumpy(ApproxBase): self._approx_scalar, self.expected.tolist() ) - # convert other_side to numpy array to ensure shape attribute is available - other_side_as_array = _as_numpy_array(other_side) - assert other_side_as_array is not None - - if np_array_shape != other_side_as_array.shape: + if np_array_shape != other_side.shape: return [ "Impossible to compare arrays with different shapes.", - f"Shapes: {np_array_shape} and {other_side_as_array.shape}", + f"Shapes: {np_array_shape} and {other_side.shape}", ] number_of_elements = self.expected.size @@ -168,7 +184,7 @@ class ApproxNumpy(ApproxBase): different_ids = [] for index in itertools.product(*(range(i) for i in np_array_shape)): approx_value = get_value_from_nested_list(approx_side_as_seq, index) - other_value = get_value_from_nested_list(other_side_as_array, index) + other_value = get_value_from_nested_list(other_side, index) if approx_value != other_value: abs_diff = abs(approx_value.expected - other_value) max_abs_diff = max(max_abs_diff, abs_diff) @@ -181,7 +197,7 @@ class ApproxNumpy(ApproxBase): message_data = [ ( str(index), - str(get_value_from_nested_list(other_side_as_array, index)), + str(get_value_from_nested_list(other_side, index)), str(get_value_from_nested_list(approx_side_as_seq, index)), ) for index in different_ids @@ -231,23 +247,13 @@ class ApproxMapping(ApproxBase): with numeric values (the keys can be anything).""" def __repr__(self) -> str: - return f"approx({ ({k: self._approx_scalar(v) for k, v in self.expected.items()})!r})" + return "approx({!r})".format( + {k: self._approx_scalar(v) for k, v in self.expected.items()} + ) - def _repr_compare(self, other_side: Mapping[object, float]) -> list[str]: + def _repr_compare(self, other_side: Mapping[object, float]) -> List[str]: import math - if len(self.expected) != len(other_side): - return [ - "Impossible to compare mappings with different sizes.", - f"Lengths: {len(self.expected)} and {len(other_side)}", - ] - - if set(self.expected.keys()) != set(other_side.keys()): - return [ - "comparison failed.", - f"Mappings has different keys: expected {self.expected.keys()} but got {other_side.keys()}", - ] - approx_side_as_map = { k: self._approx_scalar(v) for k, v in self.expected.items() } @@ -257,26 +263,23 @@ class ApproxMapping(ApproxBase): max_rel_diff = -math.inf different_ids = [] for (approx_key, approx_value), other_value in zip( - approx_side_as_map.items(), other_side.values(), strict=True + approx_side_as_map.items(), other_side.values() ): if approx_value != other_value: if approx_value.expected is not None and other_value is not None: - try: - max_abs_diff = max( - max_abs_diff, abs(approx_value.expected - other_value) + max_abs_diff = max( + max_abs_diff, abs(approx_value.expected - other_value) + ) + if approx_value.expected == 0.0: + max_rel_diff = math.inf + else: + max_rel_diff = max( + max_rel_diff, + abs( + (approx_value.expected - other_value) + / approx_value.expected + ), ) - if approx_value.expected == 0.0: - max_rel_diff = math.inf - else: - max_rel_diff = max( - max_rel_diff, - abs( - (approx_value.expected - other_value) - / approx_value.expected - ), - ) - except ZeroDivisionError: - pass different_ids.append(approx_key) message_data = [ @@ -321,9 +324,11 @@ class ApproxSequenceLike(ApproxBase): seq_type = type(self.expected) if seq_type not in (tuple, list): seq_type = list - return f"approx({seq_type(self._approx_scalar(x) for x in self.expected)!r})" + return "approx({!r})".format( + seq_type(self._approx_scalar(x) for x in self.expected) + ) - def _repr_compare(self, other_side: Sequence[float]) -> list[str]: + def _repr_compare(self, other_side: Sequence[float]) -> List[str]: import math if len(self.expected) != len(other_side): @@ -339,21 +344,17 @@ class ApproxSequenceLike(ApproxBase): max_rel_diff = -math.inf different_ids = [] for i, (approx_value, other_value) in enumerate( - zip(approx_side_as_map, other_side, strict=True) + zip(approx_side_as_map, other_side) ): if approx_value != other_value: - try: - abs_diff = abs(approx_value.expected - other_value) - max_abs_diff = max(max_abs_diff, abs_diff) - # Ignore non-numbers for the diff calculations (#13012). - except TypeError: - pass + abs_diff = abs(approx_value.expected - other_value) + max_abs_diff = max(max_abs_diff, abs_diff) + if other_value == 0.0: + max_rel_diff = math.inf else: - if other_value == 0.0: - max_rel_diff = math.inf - else: - max_rel_diff = max(max_rel_diff, abs_diff / abs(other_value)) + max_rel_diff = max(max_rel_diff, abs_diff / abs(other_value)) different_ids.append(i) + message_data = [ (str(i), str(other_side[i]), str(approx_side_as_map[i])) for i in different_ids @@ -377,7 +378,7 @@ class ApproxSequenceLike(ApproxBase): return super().__eq__(actual) def _yield_comparisons(self, actual): - return zip(actual, self.expected, strict=True) + return zip(actual, self.expected) def _check_type(self) -> None: __tracebackhide__ = True @@ -392,8 +393,8 @@ class ApproxScalar(ApproxBase): # Using Real should be better than this Union, but not possible yet: # https://github.com/python/typeshed/pull/3108 - DEFAULT_ABSOLUTE_TOLERANCE: float | Decimal = 1e-12 - DEFAULT_RELATIVE_TOLERANCE: float | Decimal = 1e-6 + DEFAULT_ABSOLUTE_TOLERANCE: Union[float, Decimal] = 1e-12 + DEFAULT_RELATIVE_TOLERANCE: Union[float, Decimal] = 1e-6 def __repr__(self) -> str: """Return a string communicating both the expected value and the @@ -404,21 +405,15 @@ class ApproxScalar(ApproxBase): # Don't show a tolerance for values that aren't compared using # tolerances, i.e. non-numerics and infinities. Need to call abs to # handle complex numbers, e.g. (inf + 1j). - if ( - isinstance(self.expected, bool) - or (not isinstance(self.expected, Complex | Decimal)) - or math.isinf(abs(self.expected) or isinstance(self.expected, bool)) + if (not isinstance(self.expected, (Complex, Decimal))) or math.isinf( + abs(self.expected) # type: ignore[arg-type] ): return str(self.expected) # If a sensible tolerance can't be calculated, self.tolerance will # raise a ValueError. In this case, display '???'. try: - if 1e-3 <= self.tolerance < 1e3: - vetted_tolerance = f"{self.tolerance:n}" - else: - vetted_tolerance = f"{self.tolerance:.1e}" - + vetted_tolerance = f"{self.tolerance:.1e}" if ( isinstance(self.expected, Complex) and self.expected.imag @@ -433,42 +428,30 @@ class ApproxScalar(ApproxBase): def __eq__(self, actual) -> bool: """Return whether the given value is equal to the expected value within the pre-specified tolerance.""" - - def is_bool(val: Any) -> bool: - # Check if `val` is a native bool or numpy bool. - if isinstance(val, bool): - return True - if np := sys.modules.get("numpy"): - return isinstance(val, np.bool_) - return False - asarray = _as_numpy_array(actual) if asarray is not None: # Call ``__eq__()`` manually to prevent infinite-recursion with # numpy<1.13. See #3748. return all(self.__eq__(a) for a in asarray.flat) - # Short-circuit exact equality, except for bool and np.bool_ - if is_bool(self.expected) and not is_bool(actual): - return False - elif actual == self.expected: + # Short-circuit exact equality. + if actual == self.expected: return True # If either type is non-numeric, fall back to strict equality. # NB: we need Complex, rather than just Number, to ensure that __abs__, - # __sub__, and __float__ are defined. Also, consider bool to be - # non-numeric, even though it has the required arithmetic. - if is_bool(self.expected) or not ( - isinstance(self.expected, Complex | Decimal) - and isinstance(actual, Complex | Decimal) + # __sub__, and __float__ are defined. + if not ( + isinstance(self.expected, (Complex, Decimal)) + and isinstance(actual, (Complex, Decimal)) ): return False # Allow the user to control whether NaNs are considered equal to each # other or not. The abs() calls are for compatibility with complex # numbers. - if math.isnan(abs(self.expected)): - return self.nan_ok and math.isnan(abs(actual)) + if math.isnan(abs(self.expected)): # type: ignore[arg-type] + return self.nan_ok and math.isnan(abs(actual)) # type: ignore[arg-type] # Infinity shouldn't be approximately equal to anything but itself, but # if there's a relative tolerance, it will be infinite and infinity @@ -476,14 +459,15 @@ class ApproxScalar(ApproxBase): # case would have been short circuited above, so here we can just # return false if the expected value is infinite. The abs() call is # for compatibility with complex numbers. - if math.isinf(abs(self.expected)): + if math.isinf(abs(self.expected)): # type: ignore[arg-type] return False # Return true if the two numbers are within the tolerance. result: bool = abs(self.expected - actual) <= self.tolerance return result - __hash__ = None + # Ignore type because of https://github.com/python/mypy/issues/4266. + __hash__ = None # type: ignore @property def tolerance(self): @@ -539,25 +523,6 @@ class ApproxDecimal(ApproxScalar): DEFAULT_ABSOLUTE_TOLERANCE = Decimal("1e-12") DEFAULT_RELATIVE_TOLERANCE = Decimal("1e-6") - def __repr__(self) -> str: - if isinstance(self.rel, float): - rel = Decimal.from_float(self.rel) - else: - rel = self.rel - - if isinstance(self.abs, float): - abs_ = Decimal.from_float(self.abs) - else: - abs_ = self.abs - - tol_str = "???" - if rel is not None and Decimal("1e-3") <= rel <= Decimal("1e3"): - tol_str = f"{rel:.1e}" - elif abs_ is not None: - tol_str = f"{abs_:.1e}" - - return f"{self.expected} ± {tol_str}" - def approx(expected, rel=None, abs=None, nan_ok: bool = False) -> ApproxBase: """Assert that two numbers (or two ordered sequences of numbers) are equal to each other @@ -659,10 +624,8 @@ def approx(expected, rel=None, abs=None, nan_ok: bool = False) -> ApproxBase: >>> 1 + 1e-8 == approx(1, rel=1e-6, abs=1e-12) True - **Non-numeric types** - - You can also use ``approx`` to compare non-numeric types, or dicts and - sequences containing non-numeric types, in which case it falls back to + You can also use ``approx`` to compare nonnumeric types, or dicts and + sequences containing nonnumeric types, in which case it falls back to strict equality. This can be useful for comparing dicts and sequences that can contain optional values:: @@ -719,15 +682,6 @@ def approx(expected, rel=None, abs=None, nan_ok: bool = False) -> ApproxBase: from the `re_assert package `_. - - .. note:: - - Unlike built-in equality, this function considers - booleans unequal to numeric zero or one. For example:: - - >>> 1 == approx(True) - False - .. warning:: .. versionchanged:: 3.2 @@ -746,12 +700,13 @@ def approx(expected, rel=None, abs=None, nan_ok: bool = False) -> ApproxBase: .. versionchanged:: 3.7.1 ``approx`` raises ``TypeError`` when it encounters a dict value or - sequence element of non-numeric type. + sequence element of nonnumeric type. .. versionchanged:: 6.1.0 - ``approx`` falls back to strict equality for non-numeric types instead + ``approx`` falls back to strict equality for nonnumeric types instead of raising ``TypeError``. """ + # Delegate the comparison to a class that knows how to deal with the type # of the expected value (e.g. int, float, list, dict, numpy.array, etc). # @@ -770,16 +725,25 @@ def approx(expected, rel=None, abs=None, nan_ok: bool = False) -> ApproxBase: __tracebackhide__ = True if isinstance(expected, Decimal): - cls: type[ApproxBase] = ApproxDecimal + cls: Type[ApproxBase] = ApproxDecimal elif isinstance(expected, Mapping): cls = ApproxMapping elif _is_numpy_array(expected): expected = _as_numpy_array(expected) cls = ApproxNumpy - elif _is_sequence_like(expected): + elif ( + hasattr(expected, "__getitem__") + and isinstance(expected, Sized) + # Type ignored because the error is wrong -- not unreachable. + and not isinstance(expected, STRING_TYPES) # type: ignore[unreachable] + ): cls = ApproxSequenceLike - elif isinstance(expected, Collection) and not isinstance(expected, str | bytes): - msg = f"pytest.approx() only supports ordered sequences, but got: {expected!r}" + elif ( + isinstance(expected, Collection) + # Type ignored because the error is wrong -- not unreachable. + and not isinstance(expected, STRING_TYPES) # type: ignore[unreachable] + ): + msg = f"pytest.approx() only supports ordered sequences, but got: {repr(expected)}" raise TypeError(msg) else: cls = ApproxScalar @@ -787,14 +751,6 @@ def approx(expected, rel=None, abs=None, nan_ok: bool = False) -> ApproxBase: return cls(expected, rel, abs, nan_ok) -def _is_sequence_like(expected: object) -> bool: - return ( - hasattr(expected, "__getitem__") - and isinstance(expected, Sized) - and not isinstance(expected, str | bytes) - ) - - def _is_numpy_array(obj: object) -> bool: """ Return true if the given object is implicitly convertible to ndarray, @@ -803,11 +759,13 @@ def _is_numpy_array(obj: object) -> bool: return _as_numpy_array(obj) is not None -def _as_numpy_array(obj: object) -> ndarray | None: +def _as_numpy_array(obj: object) -> Optional["ndarray"]: """ Return an ndarray if the given object is implicitly convertible to ndarray, and numpy is already imported, otherwise None. """ + import sys + np: Any = sys.modules.get("numpy") if np is not None: # avoid infinite recursion on numpy scalars, which have __array__ @@ -818,3 +776,221 @@ def _as_numpy_array(obj: object) -> ndarray | None: elif hasattr(obj, "__array__") or hasattr("obj", "__array_interface__"): return np.asarray(obj) return None + + +# builtin pytest.raises helper + +E = TypeVar("E", bound=BaseException) + + +@overload +def raises( + expected_exception: Union[Type[E], Tuple[Type[E], ...]], + *, + match: Optional[Union[str, Pattern[str]]] = ..., +) -> "RaisesContext[E]": + ... + + +@overload +def raises( # noqa: F811 + expected_exception: Union[Type[E], Tuple[Type[E], ...]], + func: Callable[..., Any], + *args: Any, + **kwargs: Any, +) -> _pytest._code.ExceptionInfo[E]: + ... + + +def raises( # noqa: F811 + expected_exception: Union[Type[E], Tuple[Type[E], ...]], *args: Any, **kwargs: Any +) -> Union["RaisesContext[E]", _pytest._code.ExceptionInfo[E]]: + r"""Assert that a code block/function call raises an exception. + + :param typing.Type[E] | typing.Tuple[typing.Type[E], ...] expected_exception: + The expected exception type, or a tuple if one of multiple possible + exception types are expected. + :kwparam str | typing.Pattern[str] | None match: + If specified, a string containing a regular expression, + or a regular expression object, that is tested against the string + representation of the exception using :func:`re.search`. + + To match a literal string that may contain :ref:`special characters + `, the pattern can first be escaped with :func:`re.escape`. + + (This is only used when :py:func:`pytest.raises` is used as a context manager, + and passed through to the function otherwise. + When using :py:func:`pytest.raises` as a function, you can use: + ``pytest.raises(Exc, func, match="passed on").match("my pattern")``.) + + .. currentmodule:: _pytest._code + + Use ``pytest.raises`` as a context manager, which will capture the exception of the given + type:: + + >>> import pytest + >>> with pytest.raises(ZeroDivisionError): + ... 1/0 + + If the code block does not raise the expected exception (``ZeroDivisionError`` in the example + above), or no exception at all, the check will fail instead. + + You can also use the keyword argument ``match`` to assert that the + exception matches a text or regex:: + + >>> with pytest.raises(ValueError, match='must be 0 or None'): + ... raise ValueError("value must be 0 or None") + + >>> with pytest.raises(ValueError, match=r'must be \d+$'): + ... raise ValueError("value must be 42") + + The context manager produces an :class:`ExceptionInfo` object which can be used to inspect the + details of the captured exception:: + + >>> with pytest.raises(ValueError) as exc_info: + ... raise ValueError("value must be 42") + >>> assert exc_info.type is ValueError + >>> assert exc_info.value.args[0] == "value must be 42" + + .. note:: + + When using ``pytest.raises`` as a context manager, it's worthwhile to + note that normal context manager rules apply and that the exception + raised *must* be the final line in the scope of the context manager. + Lines of code after that, within the scope of the context manager will + not be executed. For example:: + + >>> value = 15 + >>> with pytest.raises(ValueError) as exc_info: + ... if value > 10: + ... raise ValueError("value must be <= 10") + ... assert exc_info.type is ValueError # this will not execute + + Instead, the following approach must be taken (note the difference in + scope):: + + >>> with pytest.raises(ValueError) as exc_info: + ... if value > 10: + ... raise ValueError("value must be <= 10") + ... + >>> assert exc_info.type is ValueError + + **Using with** ``pytest.mark.parametrize`` + + When using :ref:`pytest.mark.parametrize ref` + it is possible to parametrize tests such that + some runs raise an exception and others do not. + + See :ref:`parametrizing_conditional_raising` for an example. + + **Legacy form** + + It is possible to specify a callable by passing a to-be-called lambda:: + + >>> raises(ZeroDivisionError, lambda: 1/0) + + + or you can specify an arbitrary callable with arguments:: + + >>> def f(x): return 1/x + ... + >>> raises(ZeroDivisionError, f, 0) + + >>> raises(ZeroDivisionError, f, x=0) + + + The form above is fully supported but discouraged for new code because the + context manager form is regarded as more readable and less error-prone. + + .. note:: + Similar to caught exception objects in Python, explicitly clearing + local references to returned ``ExceptionInfo`` objects can + help the Python interpreter speed up its garbage collection. + + Clearing those references breaks a reference cycle + (``ExceptionInfo`` --> caught exception --> frame stack raising + the exception --> current frame stack --> local variables --> + ``ExceptionInfo``) which makes Python keep all objects referenced + from that cycle (including all local variables in the current + frame) alive until the next cyclic garbage collection run. + More detailed information can be found in the official Python + documentation for :ref:`the try statement `. + """ + __tracebackhide__ = True + + if not expected_exception: + raise ValueError( + f"Expected an exception type or a tuple of exception types, but got `{expected_exception!r}`. " + f"Raising exceptions is already understood as failing the test, so you don't need " + f"any special code to say 'this should never raise an exception'." + ) + if isinstance(expected_exception, type): + expected_exceptions: Tuple[Type[E], ...] = (expected_exception,) + else: + expected_exceptions = expected_exception + for exc in expected_exceptions: + if not isinstance(exc, type) or not issubclass(exc, BaseException): + msg = "expected exception must be a BaseException type, not {}" # type: ignore[unreachable] + not_a = exc.__name__ if isinstance(exc, type) else type(exc).__name__ + raise TypeError(msg.format(not_a)) + + message = f"DID NOT RAISE {expected_exception}" + + if not args: + match: Optional[Union[str, Pattern[str]]] = kwargs.pop("match", None) + if kwargs: + msg = "Unexpected keyword arguments passed to pytest.raises: " + msg += ", ".join(sorted(kwargs)) + msg += "\nUse context-manager form instead?" + raise TypeError(msg) + return RaisesContext(expected_exception, message, match) + else: + func = args[0] + if not callable(func): + raise TypeError(f"{func!r} object (type: {type(func)}) must be callable") + try: + func(*args[1:], **kwargs) + except expected_exception as e: + return _pytest._code.ExceptionInfo.from_exception(e) + fail(message) + + +# This doesn't work with mypy for now. Use fail.Exception instead. +raises.Exception = fail.Exception # type: ignore + + +@final +class RaisesContext(ContextManager[_pytest._code.ExceptionInfo[E]]): + def __init__( + self, + expected_exception: Union[Type[E], Tuple[Type[E], ...]], + message: str, + match_expr: Optional[Union[str, Pattern[str]]] = None, + ) -> None: + self.expected_exception = expected_exception + self.message = message + self.match_expr = match_expr + self.excinfo: Optional[_pytest._code.ExceptionInfo[E]] = None + + def __enter__(self) -> _pytest._code.ExceptionInfo[E]: + self.excinfo = _pytest._code.ExceptionInfo.for_later() + return self.excinfo + + def __exit__( + self, + exc_type: Optional[Type[BaseException]], + exc_val: Optional[BaseException], + exc_tb: Optional[TracebackType], + ) -> bool: + __tracebackhide__ = True + if exc_type is None: + fail(self.message) + assert self.excinfo is not None + if not issubclass(exc_type, self.expected_exception): + return False + # Cast to narrow the exception type now that it's verified. + exc_info = cast(Tuple[Type[E], E, TracebackType], (exc_type, exc_val, exc_tb)) + self.excinfo.fill_unfilled(exc_info) + if self.match_expr is not None: + self.excinfo.match(self.match_expr) + return True diff --git a/Backend/venv/lib/python3.12/site-packages/_pytest/python_path.py b/Backend/venv/lib/python3.12/site-packages/_pytest/python_path.py new file mode 100644 index 00000000..cceabbca --- /dev/null +++ b/Backend/venv/lib/python3.12/site-packages/_pytest/python_path.py @@ -0,0 +1,24 @@ +import sys + +import pytest +from pytest import Config +from pytest import Parser + + +def pytest_addoption(parser: Parser) -> None: + parser.addini("pythonpath", type="paths", help="Add paths to sys.path", default=[]) + + +@pytest.hookimpl(tryfirst=True) +def pytest_load_initial_conftests(early_config: Config) -> None: + # `pythonpath = a b` will set `sys.path` to `[a, b, x, y, z, ...]` + for path in reversed(early_config.getini("pythonpath")): + sys.path.insert(0, str(path)) + + +@pytest.hookimpl(trylast=True) +def pytest_unconfigure(config: Config) -> None: + for path in config.getini("pythonpath"): + path_str = str(path) + if path_str in sys.path: + sys.path.remove(path_str) diff --git a/Backend/venv/lib/python3.12/site-packages/_pytest/raises.py b/Backend/venv/lib/python3.12/site-packages/_pytest/raises.py deleted file mode 100644 index 7c246fde..00000000 --- a/Backend/venv/lib/python3.12/site-packages/_pytest/raises.py +++ /dev/null @@ -1,1517 +0,0 @@ -from __future__ import annotations - -from abc import ABC -from abc import abstractmethod -import re -from re import Pattern -import sys -from textwrap import indent -from typing import Any -from typing import cast -from typing import final -from typing import Generic -from typing import get_args -from typing import get_origin -from typing import Literal -from typing import overload -from typing import TYPE_CHECKING -import warnings - -from _pytest._code import ExceptionInfo -from _pytest._code.code import stringify_exception -from _pytest.outcomes import fail -from _pytest.warning_types import PytestWarning - - -if TYPE_CHECKING: - from collections.abc import Callable - from collections.abc import Sequence - - # for some reason Sphinx does not play well with 'from types import TracebackType' - import types - from typing import TypeGuard - - from typing_extensions import ParamSpec - from typing_extensions import TypeVar - - P = ParamSpec("P") - - # this conditional definition is because we want to allow a TypeVar default - BaseExcT_co_default = TypeVar( - "BaseExcT_co_default", - bound=BaseException, - default=BaseException, - covariant=True, - ) - - # Use short name because it shows up in docs. - E = TypeVar("E", bound=BaseException, default=BaseException) -else: - from typing import TypeVar - - BaseExcT_co_default = TypeVar( - "BaseExcT_co_default", bound=BaseException, covariant=True - ) - -# RaisesGroup doesn't work with a default. -BaseExcT_co = TypeVar("BaseExcT_co", bound=BaseException, covariant=True) -BaseExcT_1 = TypeVar("BaseExcT_1", bound=BaseException) -BaseExcT_2 = TypeVar("BaseExcT_2", bound=BaseException) -ExcT_1 = TypeVar("ExcT_1", bound=Exception) -ExcT_2 = TypeVar("ExcT_2", bound=Exception) - -if sys.version_info < (3, 11): - from exceptiongroup import BaseExceptionGroup - from exceptiongroup import ExceptionGroup - - -# String patterns default to including the unicode flag. -_REGEX_NO_FLAGS = re.compile(r"").flags - - -# pytest.raises helper -@overload -def raises( - expected_exception: type[E] | tuple[type[E], ...], - *, - match: str | re.Pattern[str] | None = ..., - check: Callable[[E], bool] = ..., -) -> RaisesExc[E]: ... - - -@overload -def raises( - *, - match: str | re.Pattern[str], - # If exception_type is not provided, check() must do any typechecks itself. - check: Callable[[BaseException], bool] = ..., -) -> RaisesExc[BaseException]: ... - - -@overload -def raises(*, check: Callable[[BaseException], bool]) -> RaisesExc[BaseException]: ... - - -@overload -def raises( - expected_exception: type[E] | tuple[type[E], ...], - func: Callable[..., Any], - *args: Any, - **kwargs: Any, -) -> ExceptionInfo[E]: ... - - -def raises( - expected_exception: type[E] | tuple[type[E], ...] | None = None, - *args: Any, - **kwargs: Any, -) -> RaisesExc[BaseException] | ExceptionInfo[E]: - r"""Assert that a code block/function call raises an exception type, or one of its subclasses. - - :param expected_exception: - The expected exception type, or a tuple if one of multiple possible - exception types are expected. Note that subclasses of the passed exceptions - will also match. - - This is not a required parameter, you may opt to only use ``match`` and/or - ``check`` for verifying the raised exception. - - :kwparam str | re.Pattern[str] | None match: - If specified, a string containing a regular expression, - or a regular expression object, that is tested against the string - representation of the exception and its :pep:`678` `__notes__` - using :func:`re.search`. - - To match a literal string that may contain :ref:`special characters - `, the pattern can first be escaped with :func:`re.escape`. - - (This is only used when ``pytest.raises`` is used as a context manager, - and passed through to the function otherwise. - When using ``pytest.raises`` as a function, you can use: - ``pytest.raises(Exc, func, match="passed on").match("my pattern")``.) - - :kwparam Callable[[BaseException], bool] check: - - .. versionadded:: 8.4 - - If specified, a callable that will be called with the exception as a parameter - after checking the type and the match regex if specified. - If it returns ``True`` it will be considered a match, if not it will - be considered a failed match. - - - Use ``pytest.raises`` as a context manager, which will capture the exception of the given - type, or any of its subclasses:: - - >>> import pytest - >>> with pytest.raises(ZeroDivisionError): - ... 1/0 - - If the code block does not raise the expected exception (:class:`ZeroDivisionError` in the example - above), or no exception at all, the check will fail instead. - - You can also use the keyword argument ``match`` to assert that the - exception matches a text or regex:: - - >>> with pytest.raises(ValueError, match='must be 0 or None'): - ... raise ValueError("value must be 0 or None") - - >>> with pytest.raises(ValueError, match=r'must be \d+$'): - ... raise ValueError("value must be 42") - - The ``match`` argument searches the formatted exception string, which includes any - `PEP-678 `__ ``__notes__``: - - >>> with pytest.raises(ValueError, match=r"had a note added"): # doctest: +SKIP - ... e = ValueError("value must be 42") - ... e.add_note("had a note added") - ... raise e - - The ``check`` argument, if provided, must return True when passed the raised exception - for the match to be successful, otherwise an :exc:`AssertionError` is raised. - - >>> import errno - >>> with pytest.raises(OSError, check=lambda e: e.errno == errno.EACCES): - ... raise OSError(errno.EACCES, "no permission to view") - - The context manager produces an :class:`ExceptionInfo` object which can be used to inspect the - details of the captured exception:: - - >>> with pytest.raises(ValueError) as exc_info: - ... raise ValueError("value must be 42") - >>> assert exc_info.type is ValueError - >>> assert exc_info.value.args[0] == "value must be 42" - - .. warning:: - - Given that ``pytest.raises`` matches subclasses, be wary of using it to match :class:`Exception` like this:: - - # Careful, this will catch ANY exception raised. - with pytest.raises(Exception): - some_function() - - Because :class:`Exception` is the base class of almost all exceptions, it is easy for this to hide - real bugs, where the user wrote this expecting a specific exception, but some other exception is being - raised due to a bug introduced during a refactoring. - - Avoid using ``pytest.raises`` to catch :class:`Exception` unless certain that you really want to catch - **any** exception raised. - - .. note:: - - When using ``pytest.raises`` as a context manager, it's worthwhile to - note that normal context manager rules apply and that the exception - raised *must* be the final line in the scope of the context manager. - Lines of code after that, within the scope of the context manager will - not be executed. For example:: - - >>> value = 15 - >>> with pytest.raises(ValueError) as exc_info: - ... if value > 10: - ... raise ValueError("value must be <= 10") - ... assert exc_info.type is ValueError # This will not execute. - - Instead, the following approach must be taken (note the difference in - scope):: - - >>> with pytest.raises(ValueError) as exc_info: - ... if value > 10: - ... raise ValueError("value must be <= 10") - ... - >>> assert exc_info.type is ValueError - - **Expecting exception groups** - - When expecting exceptions wrapped in :exc:`BaseExceptionGroup` or - :exc:`ExceptionGroup`, you should instead use :class:`pytest.RaisesGroup`. - - **Using with** ``pytest.mark.parametrize`` - - When using :ref:`pytest.mark.parametrize ref` - it is possible to parametrize tests such that - some runs raise an exception and others do not. - - See :ref:`parametrizing_conditional_raising` for an example. - - .. seealso:: - - :ref:`assertraises` for more examples and detailed discussion. - - **Legacy form** - - It is possible to specify a callable by passing a to-be-called lambda:: - - >>> raises(ZeroDivisionError, lambda: 1/0) - - - or you can specify an arbitrary callable with arguments:: - - >>> def f(x): return 1/x - ... - >>> raises(ZeroDivisionError, f, 0) - - >>> raises(ZeroDivisionError, f, x=0) - - - The form above is fully supported but discouraged for new code because the - context manager form is regarded as more readable and less error-prone. - - .. note:: - Similar to caught exception objects in Python, explicitly clearing - local references to returned ``ExceptionInfo`` objects can - help the Python interpreter speed up its garbage collection. - - Clearing those references breaks a reference cycle - (``ExceptionInfo`` --> caught exception --> frame stack raising - the exception --> current frame stack --> local variables --> - ``ExceptionInfo``) which makes Python keep all objects referenced - from that cycle (including all local variables in the current - frame) alive until the next cyclic garbage collection run. - More detailed information can be found in the official Python - documentation for :ref:`the try statement `. - """ - __tracebackhide__ = True - - if not args: - if set(kwargs) - {"match", "check", "expected_exception"}: - msg = "Unexpected keyword arguments passed to pytest.raises: " - msg += ", ".join(sorted(kwargs)) - msg += "\nUse context-manager form instead?" - raise TypeError(msg) - - if expected_exception is None: - return RaisesExc(**kwargs) - return RaisesExc(expected_exception, **kwargs) - - if not expected_exception: - raise ValueError( - f"Expected an exception type or a tuple of exception types, but got `{expected_exception!r}`. " - f"Raising exceptions is already understood as failing the test, so you don't need " - f"any special code to say 'this should never raise an exception'." - ) - func = args[0] - if not callable(func): - raise TypeError(f"{func!r} object (type: {type(func)}) must be callable") - with RaisesExc(expected_exception) as excinfo: - func(*args[1:], **kwargs) - try: - return excinfo - finally: - del excinfo - - -# note: RaisesExc/RaisesGroup uses fail() internally, so this alias -# indicates (to [internal] plugins?) that `pytest.raises` will -# raise `_pytest.outcomes.Failed`, where -# `outcomes.Failed is outcomes.fail.Exception is raises.Exception` -# note: this is *not* the same as `_pytest.main.Failed` -# note: mypy does not recognize this attribute, and it's not possible -# to use a protocol/decorator like the others in outcomes due to -# https://github.com/python/mypy/issues/18715 -raises.Exception = fail.Exception # type: ignore[attr-defined] - - -def _match_pattern(match: Pattern[str]) -> str | Pattern[str]: - """Helper function to remove redundant `re.compile` calls when printing regex""" - return match.pattern if match.flags == _REGEX_NO_FLAGS else match - - -def repr_callable(fun: Callable[[BaseExcT_1], bool]) -> str: - """Get the repr of a ``check`` parameter. - - Split out so it can be monkeypatched (e.g. by hypothesis) - """ - return repr(fun) - - -def backquote(s: str) -> str: - return "`" + s + "`" - - -def _exception_type_name( - e: type[BaseException] | tuple[type[BaseException], ...], -) -> str: - if isinstance(e, type): - return e.__name__ - if len(e) == 1: - return e[0].__name__ - return "(" + ", ".join(ee.__name__ for ee in e) + ")" - - -def _check_raw_type( - expected_type: type[BaseException] | tuple[type[BaseException], ...] | None, - exception: BaseException, -) -> str | None: - if expected_type is None or expected_type == (): - return None - - if not isinstance( - exception, - expected_type, - ): - actual_type_str = backquote(_exception_type_name(type(exception)) + "()") - expected_type_str = backquote(_exception_type_name(expected_type)) - if ( - isinstance(exception, BaseExceptionGroup) - and isinstance(expected_type, type) - and not issubclass(expected_type, BaseExceptionGroup) - ): - return f"Unexpected nested {actual_type_str}, expected {expected_type_str}" - return f"{actual_type_str} is not an instance of {expected_type_str}" - return None - - -def is_fully_escaped(s: str) -> bool: - # we know we won't compile with re.VERBOSE, so whitespace doesn't need to be escaped - metacharacters = "{}()+.*?^$[]" - return not any( - c in metacharacters and (i == 0 or s[i - 1] != "\\") for (i, c) in enumerate(s) - ) - - -def unescape(s: str) -> str: - return re.sub(r"\\([{}()+-.*?^$\[\]\s\\])", r"\1", s) - - -# These classes conceptually differ from ExceptionInfo in that ExceptionInfo is tied, and -# constructed from, a particular exception - whereas these are constructed with expected -# exceptions, and later allow matching towards particular exceptions. -# But there's overlap in `ExceptionInfo.match` and `AbstractRaises._check_match`, as with -# `AbstractRaises.matches` and `ExceptionInfo.errisinstance`+`ExceptionInfo.group_contains`. -# The interaction between these classes should perhaps be improved. -class AbstractRaises(ABC, Generic[BaseExcT_co]): - """ABC with common functionality shared between RaisesExc and RaisesGroup""" - - def __init__( - self, - *, - match: str | Pattern[str] | None, - check: Callable[[BaseExcT_co], bool] | None, - ) -> None: - if isinstance(match, str): - # juggle error in order to avoid context to fail (necessary?) - re_error = None - try: - self.match: Pattern[str] | None = re.compile(match) - except re.error as e: - re_error = e - if re_error is not None: - fail(f"Invalid regex pattern provided to 'match': {re_error}") - if match == "": - warnings.warn( - PytestWarning( - "matching against an empty string will *always* pass. If you want " - "to check for an empty message you need to pass '^$'. If you don't " - "want to match you should pass `None` or leave out the parameter." - ), - stacklevel=2, - ) - else: - self.match = match - - # check if this is a fully escaped regex and has ^$ to match fully - # in which case we can do a proper diff on error - self.rawmatch: str | None = None - if isinstance(match, str) or ( - isinstance(match, Pattern) and match.flags == _REGEX_NO_FLAGS - ): - if isinstance(match, Pattern): - match = match.pattern - if ( - match - and match[0] == "^" - and match[-1] == "$" - and is_fully_escaped(match[1:-1]) - ): - self.rawmatch = unescape(match[1:-1]) - - self.check = check - self._fail_reason: str | None = None - - # used to suppress repeated printing of `repr(self.check)` - self._nested: bool = False - - # set in self._parse_exc - self.is_baseexception = False - - def _parse_exc( - self, exc: type[BaseExcT_1] | types.GenericAlias, expected: str - ) -> type[BaseExcT_1]: - if isinstance(exc, type) and issubclass(exc, BaseException): - if not issubclass(exc, Exception): - self.is_baseexception = True - return exc - # because RaisesGroup does not support variable number of exceptions there's - # still a use for RaisesExc(ExceptionGroup[Exception]). - origin_exc: type[BaseException] | None = get_origin(exc) - if origin_exc and issubclass(origin_exc, BaseExceptionGroup): - exc_type = get_args(exc)[0] - if ( - issubclass(origin_exc, ExceptionGroup) and exc_type in (Exception, Any) - ) or ( - issubclass(origin_exc, BaseExceptionGroup) - and exc_type in (BaseException, Any) - ): - if not issubclass(origin_exc, ExceptionGroup): - self.is_baseexception = True - return cast(type[BaseExcT_1], origin_exc) - else: - raise ValueError( - f"Only `ExceptionGroup[Exception]` or `BaseExceptionGroup[BaseException]` " - f"are accepted as generic types but got `{exc}`. " - f"As `raises` will catch all instances of the specified group regardless of the " - f"generic argument specific nested exceptions has to be checked " - f"with `RaisesGroup`." - ) - # unclear if the Type/ValueError distinction is even helpful here - msg = f"Expected {expected}, but got " - if isinstance(exc, type): # type: ignore[unreachable] - raise ValueError(msg + f"{exc.__name__!r}") - if isinstance(exc, BaseException): # type: ignore[unreachable] - raise TypeError(msg + f"an exception instance: {type(exc).__name__}") - raise TypeError(msg + repr(type(exc).__name__)) - - @property - def fail_reason(self) -> str | None: - """Set after a call to :meth:`matches` to give a human-readable reason for why the match failed. - When used as a context manager the string will be printed as the reason for the - test failing.""" - return self._fail_reason - - def _check_check( - self: AbstractRaises[BaseExcT_1], - exception: BaseExcT_1, - ) -> bool: - if self.check is None: - return True - - if self.check(exception): - return True - - check_repr = "" if self._nested else " " + repr_callable(self.check) - self._fail_reason = f"check{check_repr} did not return True" - return False - - # TODO: harmonize with ExceptionInfo.match - def _check_match(self, e: BaseException) -> bool: - if self.match is None or re.search( - self.match, - stringified_exception := stringify_exception( - e, include_subexception_msg=False - ), - ): - return True - - # if we're matching a group, make sure we're explicit to reduce confusion - # if they're trying to match an exception contained within the group - maybe_specify_type = ( - f" the `{_exception_type_name(type(e))}()`" - if isinstance(e, BaseExceptionGroup) - else "" - ) - if isinstance(self.rawmatch, str): - # TODO: it instructs to use `-v` to print leading text, but that doesn't work - # I also don't know if this is the proper entry point, or tool to use at all - from _pytest.assertion.util import _diff_text - from _pytest.assertion.util import dummy_highlighter - - diff = _diff_text(self.rawmatch, stringified_exception, dummy_highlighter) - self._fail_reason = ("\n" if diff[0][0] == "-" else "") + "\n".join(diff) - return False - - self._fail_reason = ( - f"Regex pattern did not match{maybe_specify_type}.\n" - f" Expected regex: {_match_pattern(self.match)!r}\n" - f" Actual message: {stringified_exception!r}" - ) - if _match_pattern(self.match) == stringified_exception: - self._fail_reason += "\n Did you mean to `re.escape()` the regex?" - return False - - @abstractmethod - def matches( - self: AbstractRaises[BaseExcT_1], exception: BaseException - ) -> TypeGuard[BaseExcT_1]: - """Check if an exception matches the requirements of this AbstractRaises. - If it fails, :meth:`AbstractRaises.fail_reason` should be set. - """ - - -@final -class RaisesExc(AbstractRaises[BaseExcT_co_default]): - """ - .. versionadded:: 8.4 - - - This is the class constructed when calling :func:`pytest.raises`, but may be used - directly as a helper class with :class:`RaisesGroup` when you want to specify - requirements on sub-exceptions. - - You don't need this if you only want to specify the type, since :class:`RaisesGroup` - accepts ``type[BaseException]``. - - :param type[BaseException] | tuple[type[BaseException]] | None expected_exception: - The expected type, or one of several possible types. - May be ``None`` in order to only make use of ``match`` and/or ``check`` - - The type is checked with :func:`isinstance`, and does not need to be an exact match. - If that is wanted you can use the ``check`` parameter. - - :kwparam str | Pattern[str] match: - A regex to match. - - :kwparam Callable[[BaseException], bool] check: - If specified, a callable that will be called with the exception as a parameter - after checking the type and the match regex if specified. - If it returns ``True`` it will be considered a match, if not it will - be considered a failed match. - - :meth:`RaisesExc.matches` can also be used standalone to check individual exceptions. - - Examples:: - - with RaisesGroup(RaisesExc(ValueError, match="string")) - ... - with RaisesGroup(RaisesExc(check=lambda x: x.args == (3, "hello"))): - ... - with RaisesGroup(RaisesExc(check=lambda x: type(x) is ValueError)): - ... - """ - - # Trio bundled hypothesis monkeypatching, we will probably instead assume that - # hypothesis will handle that in their pytest plugin by the time this is released. - # Alternatively we could add a version of get_pretty_function_description ourselves - # https://github.com/HypothesisWorks/hypothesis/blob/8ced2f59f5c7bea3344e35d2d53e1f8f8eb9fcd8/hypothesis-python/src/hypothesis/internal/reflection.py#L439 - - # At least one of the three parameters must be passed. - @overload - def __init__( - self, - expected_exception: ( - type[BaseExcT_co_default] | tuple[type[BaseExcT_co_default], ...] - ), - /, - *, - match: str | Pattern[str] | None = ..., - check: Callable[[BaseExcT_co_default], bool] | None = ..., - ) -> None: ... - - @overload - def __init__( - self: RaisesExc[BaseException], # Give E a value. - /, - *, - match: str | Pattern[str] | None, - # If exception_type is not provided, check() must do any typechecks itself. - check: Callable[[BaseException], bool] | None = ..., - ) -> None: ... - - @overload - def __init__(self, /, *, check: Callable[[BaseException], bool]) -> None: ... - - def __init__( - self, - expected_exception: ( - type[BaseExcT_co_default] | tuple[type[BaseExcT_co_default], ...] | None - ) = None, - /, - *, - match: str | Pattern[str] | None = None, - check: Callable[[BaseExcT_co_default], bool] | None = None, - ): - super().__init__(match=match, check=check) - if isinstance(expected_exception, tuple): - expected_exceptions = expected_exception - elif expected_exception is None: - expected_exceptions = () - else: - expected_exceptions = (expected_exception,) - - if (expected_exceptions == ()) and match is None and check is None: - raise ValueError("You must specify at least one parameter to match on.") - - self.expected_exceptions = tuple( - self._parse_exc(e, expected="a BaseException type") - for e in expected_exceptions - ) - - self._just_propagate = False - - def matches( - self, - exception: BaseException | None, - ) -> TypeGuard[BaseExcT_co_default]: - """Check if an exception matches the requirements of this :class:`RaisesExc`. - If it fails, :attr:`RaisesExc.fail_reason` will be set. - - Examples:: - - assert RaisesExc(ValueError).matches(my_exception): - # is equivalent to - assert isinstance(my_exception, ValueError) - - # this can be useful when checking e.g. the ``__cause__`` of an exception. - with pytest.raises(ValueError) as excinfo: - ... - assert RaisesExc(SyntaxError, match="foo").matches(excinfo.value.__cause__) - # above line is equivalent to - assert isinstance(excinfo.value.__cause__, SyntaxError) - assert re.search("foo", str(excinfo.value.__cause__) - - """ - self._just_propagate = False - if exception is None: - self._fail_reason = "exception is None" - return False - if not self._check_type(exception): - self._just_propagate = True - return False - - if not self._check_match(exception): - return False - - return self._check_check(exception) - - def __repr__(self) -> str: - parameters = [] - if self.expected_exceptions: - parameters.append(_exception_type_name(self.expected_exceptions)) - if self.match is not None: - # If no flags were specified, discard the redundant re.compile() here. - parameters.append( - f"match={_match_pattern(self.match)!r}", - ) - if self.check is not None: - parameters.append(f"check={repr_callable(self.check)}") - return f"RaisesExc({', '.join(parameters)})" - - def _check_type(self, exception: BaseException) -> TypeGuard[BaseExcT_co_default]: - self._fail_reason = _check_raw_type(self.expected_exceptions, exception) - return self._fail_reason is None - - def __enter__(self) -> ExceptionInfo[BaseExcT_co_default]: - self.excinfo: ExceptionInfo[BaseExcT_co_default] = ExceptionInfo.for_later() - return self.excinfo - - # TODO: move common code into superclass - def __exit__( - self, - exc_type: type[BaseException] | None, - exc_val: BaseException | None, - exc_tb: types.TracebackType | None, - ) -> bool: - __tracebackhide__ = True - if exc_type is None: - if not self.expected_exceptions: - fail("DID NOT RAISE any exception") - if len(self.expected_exceptions) > 1: - fail(f"DID NOT RAISE any of {self.expected_exceptions!r}") - - fail(f"DID NOT RAISE {self.expected_exceptions[0]!r}") - - assert self.excinfo is not None, ( - "Internal error - should have been constructed in __enter__" - ) - - if not self.matches(exc_val): - if self._just_propagate: - return False - raise AssertionError(self._fail_reason) - - # Cast to narrow the exception type now that it's verified.... - # even though the TypeGuard in self.matches should be narrowing - exc_info = cast( - "tuple[type[BaseExcT_co_default], BaseExcT_co_default, types.TracebackType]", - (exc_type, exc_val, exc_tb), - ) - self.excinfo.fill_unfilled(exc_info) - return True - - -@final -class RaisesGroup(AbstractRaises[BaseExceptionGroup[BaseExcT_co]]): - """ - .. versionadded:: 8.4 - - Contextmanager for checking for an expected :exc:`ExceptionGroup`. - This works similar to :func:`pytest.raises`, but allows for specifying the structure of an :exc:`ExceptionGroup`. - :meth:`ExceptionInfo.group_contains` also tries to handle exception groups, - but it is very bad at checking that you *didn't* get unexpected exceptions. - - The catching behaviour differs from :ref:`except* `, being much - stricter about the structure by default. - By using ``allow_unwrapped=True`` and ``flatten_subgroups=True`` you can match - :ref:`except* ` fully when expecting a single exception. - - :param args: - Any number of exception types, :class:`RaisesGroup` or :class:`RaisesExc` - to specify the exceptions contained in this exception. - All specified exceptions must be present in the raised group, *and no others*. - - If you expect a variable number of exceptions you need to use - :func:`pytest.raises(ExceptionGroup) ` and manually check - the contained exceptions. Consider making use of :meth:`RaisesExc.matches`. - - It does not care about the order of the exceptions, so - ``RaisesGroup(ValueError, TypeError)`` - is equivalent to - ``RaisesGroup(TypeError, ValueError)``. - :kwparam str | re.Pattern[str] | None match: - If specified, a string containing a regular expression, - or a regular expression object, that is tested against the string - representation of the exception group and its :pep:`678` `__notes__` - using :func:`re.search`. - - To match a literal string that may contain :ref:`special characters - `, the pattern can first be escaped with :func:`re.escape`. - - Note that " (5 subgroups)" will be stripped from the ``repr`` before matching. - :kwparam Callable[[E], bool] check: - If specified, a callable that will be called with the group as a parameter - after successfully matching the expected exceptions. If it returns ``True`` - it will be considered a match, if not it will be considered a failed match. - :kwparam bool allow_unwrapped: - If expecting a single exception or :class:`RaisesExc` it will match even - if the exception is not inside an exceptiongroup. - - Using this together with ``match``, ``check`` or expecting multiple exceptions - will raise an error. - :kwparam bool flatten_subgroups: - "flatten" any groups inside the raised exception group, extracting all exceptions - inside any nested groups, before matching. Without this it expects you to - fully specify the nesting structure by passing :class:`RaisesGroup` as expected - parameter. - - Examples:: - - with RaisesGroup(ValueError): - raise ExceptionGroup("", (ValueError(),)) - # match - with RaisesGroup( - ValueError, - ValueError, - RaisesExc(TypeError, match="^expected int$"), - match="^my group$", - ): - raise ExceptionGroup( - "my group", - [ - ValueError(), - TypeError("expected int"), - ValueError(), - ], - ) - # check - with RaisesGroup( - KeyboardInterrupt, - match="^hello$", - check=lambda x: isinstance(x.__cause__, ValueError), - ): - raise BaseExceptionGroup("hello", [KeyboardInterrupt()]) from ValueError - # nested groups - with RaisesGroup(RaisesGroup(ValueError)): - raise ExceptionGroup("", (ExceptionGroup("", (ValueError(),)),)) - - # flatten_subgroups - with RaisesGroup(ValueError, flatten_subgroups=True): - raise ExceptionGroup("", (ExceptionGroup("", (ValueError(),)),)) - - # allow_unwrapped - with RaisesGroup(ValueError, allow_unwrapped=True): - raise ValueError - - - :meth:`RaisesGroup.matches` can also be used directly to check a standalone exception group. - - - The matching algorithm is greedy, which means cases such as this may fail:: - - with RaisesGroup(ValueError, RaisesExc(ValueError, match="hello")): - raise ExceptionGroup("", (ValueError("hello"), ValueError("goodbye"))) - - even though it generally does not care about the order of the exceptions in the group. - To avoid the above you should specify the first :exc:`ValueError` with a :class:`RaisesExc` as well. - - .. note:: - When raised exceptions don't match the expected ones, you'll get a detailed error - message explaining why. This includes ``repr(check)`` if set, which in Python can be - overly verbose, showing memory locations etc etc. - - If installed and imported (in e.g. ``conftest.py``), the ``hypothesis`` library will - monkeypatch this output to provide shorter & more readable repr's. - """ - - # allow_unwrapped=True requires: singular exception, exception not being - # RaisesGroup instance, match is None, check is None - @overload - def __init__( - self, - expected_exception: type[BaseExcT_co] | RaisesExc[BaseExcT_co], - /, - *, - allow_unwrapped: Literal[True], - flatten_subgroups: bool = False, - ) -> None: ... - - # flatten_subgroups = True also requires no nested RaisesGroup - @overload - def __init__( - self, - expected_exception: type[BaseExcT_co] | RaisesExc[BaseExcT_co], - /, - *other_exceptions: type[BaseExcT_co] | RaisesExc[BaseExcT_co], - flatten_subgroups: Literal[True], - match: str | Pattern[str] | None = None, - check: Callable[[BaseExceptionGroup[BaseExcT_co]], bool] | None = None, - ) -> None: ... - - # simplify the typevars if possible (the following 3 are equivalent but go simpler->complicated) - # ... the first handles RaisesGroup[ValueError], the second RaisesGroup[ExceptionGroup[ValueError]], - # the third RaisesGroup[ValueError | ExceptionGroup[ValueError]]. - # ... otherwise, we will get results like RaisesGroup[ValueError | ExceptionGroup[Never]] (I think) - # (technically correct but misleading) - @overload - def __init__( - self: RaisesGroup[ExcT_1], - expected_exception: type[ExcT_1] | RaisesExc[ExcT_1], - /, - *other_exceptions: type[ExcT_1] | RaisesExc[ExcT_1], - match: str | Pattern[str] | None = None, - check: Callable[[ExceptionGroup[ExcT_1]], bool] | None = None, - ) -> None: ... - - @overload - def __init__( - self: RaisesGroup[ExceptionGroup[ExcT_2]], - expected_exception: RaisesGroup[ExcT_2], - /, - *other_exceptions: RaisesGroup[ExcT_2], - match: str | Pattern[str] | None = None, - check: Callable[[ExceptionGroup[ExceptionGroup[ExcT_2]]], bool] | None = None, - ) -> None: ... - - @overload - def __init__( - self: RaisesGroup[ExcT_1 | ExceptionGroup[ExcT_2]], - expected_exception: type[ExcT_1] | RaisesExc[ExcT_1] | RaisesGroup[ExcT_2], - /, - *other_exceptions: type[ExcT_1] | RaisesExc[ExcT_1] | RaisesGroup[ExcT_2], - match: str | Pattern[str] | None = None, - check: ( - Callable[[ExceptionGroup[ExcT_1 | ExceptionGroup[ExcT_2]]], bool] | None - ) = None, - ) -> None: ... - - # same as the above 3 but handling BaseException - @overload - def __init__( - self: RaisesGroup[BaseExcT_1], - expected_exception: type[BaseExcT_1] | RaisesExc[BaseExcT_1], - /, - *other_exceptions: type[BaseExcT_1] | RaisesExc[BaseExcT_1], - match: str | Pattern[str] | None = None, - check: Callable[[BaseExceptionGroup[BaseExcT_1]], bool] | None = None, - ) -> None: ... - - @overload - def __init__( - self: RaisesGroup[BaseExceptionGroup[BaseExcT_2]], - expected_exception: RaisesGroup[BaseExcT_2], - /, - *other_exceptions: RaisesGroup[BaseExcT_2], - match: str | Pattern[str] | None = None, - check: ( - Callable[[BaseExceptionGroup[BaseExceptionGroup[BaseExcT_2]]], bool] | None - ) = None, - ) -> None: ... - - @overload - def __init__( - self: RaisesGroup[BaseExcT_1 | BaseExceptionGroup[BaseExcT_2]], - expected_exception: type[BaseExcT_1] - | RaisesExc[BaseExcT_1] - | RaisesGroup[BaseExcT_2], - /, - *other_exceptions: type[BaseExcT_1] - | RaisesExc[BaseExcT_1] - | RaisesGroup[BaseExcT_2], - match: str | Pattern[str] | None = None, - check: ( - Callable[ - [BaseExceptionGroup[BaseExcT_1 | BaseExceptionGroup[BaseExcT_2]]], - bool, - ] - | None - ) = None, - ) -> None: ... - - def __init__( - self: RaisesGroup[ExcT_1 | BaseExcT_1 | BaseExceptionGroup[BaseExcT_2]], - expected_exception: type[BaseExcT_1] - | RaisesExc[BaseExcT_1] - | RaisesGroup[BaseExcT_2], - /, - *other_exceptions: type[BaseExcT_1] - | RaisesExc[BaseExcT_1] - | RaisesGroup[BaseExcT_2], - allow_unwrapped: bool = False, - flatten_subgroups: bool = False, - match: str | Pattern[str] | None = None, - check: ( - Callable[[BaseExceptionGroup[BaseExcT_1]], bool] - | Callable[[ExceptionGroup[ExcT_1]], bool] - | None - ) = None, - ): - # The type hint on the `self` and `check` parameters uses different formats - # that are *very* hard to reconcile while adhering to the overloads, so we cast - # it to avoid an error when passing it to super().__init__ - check = cast( - "Callable[[BaseExceptionGroup[ExcT_1|BaseExcT_1|BaseExceptionGroup[BaseExcT_2]]], bool]", - check, - ) - super().__init__(match=match, check=check) - self.allow_unwrapped = allow_unwrapped - self.flatten_subgroups: bool = flatten_subgroups - self.is_baseexception = False - - if allow_unwrapped and other_exceptions: - raise ValueError( - "You cannot specify multiple exceptions with `allow_unwrapped=True.`" - " If you want to match one of multiple possible exceptions you should" - " use a `RaisesExc`." - " E.g. `RaisesExc(check=lambda e: isinstance(e, (...)))`", - ) - if allow_unwrapped and isinstance(expected_exception, RaisesGroup): - raise ValueError( - "`allow_unwrapped=True` has no effect when expecting a `RaisesGroup`." - " You might want it in the expected `RaisesGroup`, or" - " `flatten_subgroups=True` if you don't care about the structure.", - ) - if allow_unwrapped and (match is not None or check is not None): - raise ValueError( - "`allow_unwrapped=True` bypasses the `match` and `check` parameters" - " if the exception is unwrapped. If you intended to match/check the" - " exception you should use a `RaisesExc` object. If you want to match/check" - " the exceptiongroup when the exception *is* wrapped you need to" - " do e.g. `if isinstance(exc.value, ExceptionGroup):" - " assert RaisesGroup(...).matches(exc.value)` afterwards.", - ) - - self.expected_exceptions: tuple[ - type[BaseExcT_co] | RaisesExc[BaseExcT_co] | RaisesGroup[BaseException], ... - ] = tuple( - self._parse_excgroup(e, "a BaseException type, RaisesExc, or RaisesGroup") - for e in ( - expected_exception, - *other_exceptions, - ) - ) - - def _parse_excgroup( - self, - exc: ( - type[BaseExcT_co] - | types.GenericAlias - | RaisesExc[BaseExcT_1] - | RaisesGroup[BaseExcT_2] - ), - expected: str, - ) -> type[BaseExcT_co] | RaisesExc[BaseExcT_1] | RaisesGroup[BaseExcT_2]: - # verify exception type and set `self.is_baseexception` - if isinstance(exc, RaisesGroup): - if self.flatten_subgroups: - raise ValueError( - "You cannot specify a nested structure inside a RaisesGroup with" - " `flatten_subgroups=True`. The parameter will flatten subgroups" - " in the raised exceptiongroup before matching, which would never" - " match a nested structure.", - ) - self.is_baseexception |= exc.is_baseexception - exc._nested = True - return exc - elif isinstance(exc, RaisesExc): - self.is_baseexception |= exc.is_baseexception - exc._nested = True - return exc - elif isinstance(exc, tuple): - raise TypeError( - f"Expected {expected}, but got {type(exc).__name__!r}.\n" - "RaisesGroup does not support tuples of exception types when expecting one of " - "several possible exception types like RaisesExc.\n" - "If you meant to expect a group with multiple exceptions, list them as separate arguments." - ) - else: - return super()._parse_exc(exc, expected) - - @overload - def __enter__( - self: RaisesGroup[ExcT_1], - ) -> ExceptionInfo[ExceptionGroup[ExcT_1]]: ... - @overload - def __enter__( - self: RaisesGroup[BaseExcT_1], - ) -> ExceptionInfo[BaseExceptionGroup[BaseExcT_1]]: ... - - def __enter__(self) -> ExceptionInfo[BaseExceptionGroup[BaseException]]: - self.excinfo: ExceptionInfo[BaseExceptionGroup[BaseExcT_co]] = ( - ExceptionInfo.for_later() - ) - return self.excinfo - - def __repr__(self) -> str: - reqs = [ - e.__name__ if isinstance(e, type) else repr(e) - for e in self.expected_exceptions - ] - if self.allow_unwrapped: - reqs.append(f"allow_unwrapped={self.allow_unwrapped}") - if self.flatten_subgroups: - reqs.append(f"flatten_subgroups={self.flatten_subgroups}") - if self.match is not None: - # If no flags were specified, discard the redundant re.compile() here. - reqs.append(f"match={_match_pattern(self.match)!r}") - if self.check is not None: - reqs.append(f"check={repr_callable(self.check)}") - return f"RaisesGroup({', '.join(reqs)})" - - def _unroll_exceptions( - self, - exceptions: Sequence[BaseException], - ) -> Sequence[BaseException]: - """Used if `flatten_subgroups=True`.""" - res: list[BaseException] = [] - for exc in exceptions: - if isinstance(exc, BaseExceptionGroup): - res.extend(self._unroll_exceptions(exc.exceptions)) - - else: - res.append(exc) - return res - - @overload - def matches( - self: RaisesGroup[ExcT_1], - exception: BaseException | None, - ) -> TypeGuard[ExceptionGroup[ExcT_1]]: ... - @overload - def matches( - self: RaisesGroup[BaseExcT_1], - exception: BaseException | None, - ) -> TypeGuard[BaseExceptionGroup[BaseExcT_1]]: ... - - def matches( - self, - exception: BaseException | None, - ) -> bool: - """Check if an exception matches the requirements of this RaisesGroup. - If it fails, `RaisesGroup.fail_reason` will be set. - - Example:: - - with pytest.raises(TypeError) as excinfo: - ... - assert RaisesGroup(ValueError).matches(excinfo.value.__cause__) - # the above line is equivalent to - myexc = excinfo.value.__cause - assert isinstance(myexc, BaseExceptionGroup) - assert len(myexc.exceptions) == 1 - assert isinstance(myexc.exceptions[0], ValueError) - """ - self._fail_reason = None - if exception is None: - self._fail_reason = "exception is None" - return False - if not isinstance(exception, BaseExceptionGroup): - # we opt to only print type of the exception here, as the repr would - # likely be quite long - not_group_msg = f"`{type(exception).__name__}()` is not an exception group" - if len(self.expected_exceptions) > 1: - self._fail_reason = not_group_msg - return False - # if we have 1 expected exception, check if it would work even if - # allow_unwrapped is not set - res = self._check_expected(self.expected_exceptions[0], exception) - if res is None and self.allow_unwrapped: - return True - - if res is None: - self._fail_reason = ( - f"{not_group_msg}, but would match with `allow_unwrapped=True`" - ) - elif self.allow_unwrapped: - self._fail_reason = res - else: - self._fail_reason = not_group_msg - return False - - actual_exceptions: Sequence[BaseException] = exception.exceptions - if self.flatten_subgroups: - actual_exceptions = self._unroll_exceptions(actual_exceptions) - - if not self._check_match(exception): - self._fail_reason = cast(str, self._fail_reason) - old_reason = self._fail_reason - if ( - len(actual_exceptions) == len(self.expected_exceptions) == 1 - and isinstance(expected := self.expected_exceptions[0], type) - and isinstance(actual := actual_exceptions[0], expected) - and self._check_match(actual) - ): - assert self.match is not None, "can't be None if _check_match failed" - assert self._fail_reason is old_reason is not None - self._fail_reason += ( - f"\n" - f" but matched the expected `{self._repr_expected(expected)}`.\n" - f" You might want " - f"`RaisesGroup(RaisesExc({expected.__name__}, match={_match_pattern(self.match)!r}))`" - ) - else: - self._fail_reason = old_reason - return False - - # do the full check on expected exceptions - if not self._check_exceptions( - exception, - actual_exceptions, - ): - self._fail_reason = cast(str, self._fail_reason) - assert self._fail_reason is not None - old_reason = self._fail_reason - # if we're not expecting a nested structure, and there is one, do a second - # pass where we try flattening it - if ( - not self.flatten_subgroups - and not any( - isinstance(e, RaisesGroup) for e in self.expected_exceptions - ) - and any(isinstance(e, BaseExceptionGroup) for e in actual_exceptions) - and self._check_exceptions( - exception, - self._unroll_exceptions(exception.exceptions), - ) - ): - # only indent if it's a single-line reason. In a multi-line there's already - # indented lines that this does not belong to. - indent = " " if "\n" not in self._fail_reason else "" - self._fail_reason = ( - old_reason - + f"\n{indent}Did you mean to use `flatten_subgroups=True`?" - ) - else: - self._fail_reason = old_reason - return False - - # Only run `self.check` once we know `exception` is of the correct type. - if not self._check_check(exception): - reason = ( - cast(str, self._fail_reason) + f" on the {type(exception).__name__}" - ) - if ( - len(actual_exceptions) == len(self.expected_exceptions) == 1 - and isinstance(expected := self.expected_exceptions[0], type) - # we explicitly break typing here :) - and self._check_check(actual_exceptions[0]) # type: ignore[arg-type] - ): - self._fail_reason = reason + ( - f", but did return True for the expected {self._repr_expected(expected)}." - f" You might want RaisesGroup(RaisesExc({expected.__name__}, check=<...>))" - ) - else: - self._fail_reason = reason - return False - - return True - - @staticmethod - def _check_expected( - expected_type: ( - type[BaseException] | RaisesExc[BaseException] | RaisesGroup[BaseException] - ), - exception: BaseException, - ) -> str | None: - """Helper method for `RaisesGroup.matches` and `RaisesGroup._check_exceptions` - to check one of potentially several expected exceptions.""" - if isinstance(expected_type, type): - return _check_raw_type(expected_type, exception) - res = expected_type.matches(exception) - if res: - return None - assert expected_type.fail_reason is not None - if expected_type.fail_reason.startswith("\n"): - return f"\n{expected_type!r}: {indent(expected_type.fail_reason, ' ')}" - return f"{expected_type!r}: {expected_type.fail_reason}" - - @staticmethod - def _repr_expected(e: type[BaseException] | AbstractRaises[BaseException]) -> str: - """Get the repr of an expected type/RaisesExc/RaisesGroup, but we only want - the name if it's a type""" - if isinstance(e, type): - return _exception_type_name(e) - return repr(e) - - @overload - def _check_exceptions( - self: RaisesGroup[ExcT_1], - _exception: Exception, - actual_exceptions: Sequence[Exception], - ) -> TypeGuard[ExceptionGroup[ExcT_1]]: ... - @overload - def _check_exceptions( - self: RaisesGroup[BaseExcT_1], - _exception: BaseException, - actual_exceptions: Sequence[BaseException], - ) -> TypeGuard[BaseExceptionGroup[BaseExcT_1]]: ... - - def _check_exceptions( - self, - _exception: BaseException, - actual_exceptions: Sequence[BaseException], - ) -> bool: - """Helper method for RaisesGroup.matches that attempts to pair up expected and actual exceptions""" - # The _exception parameter is not used, but necessary for the TypeGuard - - # full table with all results - results = ResultHolder(self.expected_exceptions, actual_exceptions) - - # (indexes of) raised exceptions that haven't (yet) found an expected - remaining_actual = list(range(len(actual_exceptions))) - # (indexes of) expected exceptions that haven't found a matching raised - failed_expected: list[int] = [] - # successful greedy matches - matches: dict[int, int] = {} - - # loop over expected exceptions first to get a more predictable result - for i_exp, expected in enumerate(self.expected_exceptions): - for i_rem in remaining_actual: - res = self._check_expected(expected, actual_exceptions[i_rem]) - results.set_result(i_exp, i_rem, res) - if res is None: - remaining_actual.remove(i_rem) - matches[i_exp] = i_rem - break - else: - failed_expected.append(i_exp) - - # All exceptions matched up successfully - if not remaining_actual and not failed_expected: - return True - - # in case of a single expected and single raised we simplify the output - if 1 == len(actual_exceptions) == len(self.expected_exceptions): - assert not matches - self._fail_reason = res - return False - - # The test case is failing, so we can do a slow and exhaustive check to find - # duplicate matches etc that will be helpful in debugging - for i_exp, expected in enumerate(self.expected_exceptions): - for i_actual, actual in enumerate(actual_exceptions): - if results.has_result(i_exp, i_actual): - continue - results.set_result( - i_exp, i_actual, self._check_expected(expected, actual) - ) - - successful_str = ( - f"{len(matches)} matched exception{'s' if len(matches) > 1 else ''}. " - if matches - else "" - ) - - # all expected were found - if not failed_expected and results.no_match_for_actual(remaining_actual): - self._fail_reason = ( - f"{successful_str}Unexpected exception(s):" - f" {[actual_exceptions[i] for i in remaining_actual]!r}" - ) - return False - # all raised exceptions were expected - if not remaining_actual and results.no_match_for_expected(failed_expected): - no_match_for_str = ", ".join( - self._repr_expected(self.expected_exceptions[i]) - for i in failed_expected - ) - self._fail_reason = f"{successful_str}Too few exceptions raised, found no match for: [{no_match_for_str}]" - return False - - # if there's only one remaining and one failed, and the unmatched didn't match anything else, - # we elect to only print why the remaining and the failed didn't match. - if ( - 1 == len(remaining_actual) == len(failed_expected) - and results.no_match_for_actual(remaining_actual) - and results.no_match_for_expected(failed_expected) - ): - self._fail_reason = f"{successful_str}{results.get_result(failed_expected[0], remaining_actual[0])}" - return False - - # there's both expected and raised exceptions without matches - s = "" - if matches: - s += f"\n{successful_str}" - indent_1 = " " * 2 - indent_2 = " " * 4 - - if not remaining_actual: - s += "\nToo few exceptions raised!" - elif not failed_expected: - s += "\nUnexpected exception(s)!" - - if failed_expected: - s += "\nThe following expected exceptions did not find a match:" - rev_matches = {v: k for k, v in matches.items()} - for i_failed in failed_expected: - s += ( - f"\n{indent_1}{self._repr_expected(self.expected_exceptions[i_failed])}" - ) - for i_actual, actual in enumerate(actual_exceptions): - if results.get_result(i_exp, i_actual) is None: - # we print full repr of match target - s += ( - f"\n{indent_2}It matches {backquote(repr(actual))} which was paired with " - + backquote( - self._repr_expected( - self.expected_exceptions[rev_matches[i_actual]] - ) - ) - ) - - if remaining_actual: - s += "\nThe following raised exceptions did not find a match" - for i_actual in remaining_actual: - s += f"\n{indent_1}{actual_exceptions[i_actual]!r}:" - for i_exp, expected in enumerate(self.expected_exceptions): - res = results.get_result(i_exp, i_actual) - if i_exp in failed_expected: - assert res is not None - if res[0] != "\n": - s += "\n" - s += indent(res, indent_2) - if res is None: - # we print full repr of match target - s += ( - f"\n{indent_2}It matches {backquote(self._repr_expected(expected))} " - f"which was paired with {backquote(repr(actual_exceptions[matches[i_exp]]))}" - ) - - if len(self.expected_exceptions) == len(actual_exceptions) and possible_match( - results - ): - s += ( - "\nThere exist a possible match when attempting an exhaustive check," - " but RaisesGroup uses a greedy algorithm. " - "Please make your expected exceptions more stringent with `RaisesExc` etc" - " so the greedy algorithm can function." - ) - self._fail_reason = s - return False - - def __exit__( - self, - exc_type: type[BaseException] | None, - exc_val: BaseException | None, - exc_tb: types.TracebackType | None, - ) -> bool: - __tracebackhide__ = True - if exc_type is None: - fail(f"DID NOT RAISE any exception, expected `{self.expected_type()}`") - - assert self.excinfo is not None, ( - "Internal error - should have been constructed in __enter__" - ) - - # group_str is the only thing that differs between RaisesExc and RaisesGroup... - # I might just scrap it? Or make it part of fail_reason - group_str = ( - "(group)" - if self.allow_unwrapped and not issubclass(exc_type, BaseExceptionGroup) - else "group" - ) - - if not self.matches(exc_val): - fail(f"Raised exception {group_str} did not match: {self._fail_reason}") - - # Cast to narrow the exception type now that it's verified.... - # even though the TypeGuard in self.matches should be narrowing - exc_info = cast( - "tuple[type[BaseExceptionGroup[BaseExcT_co]], BaseExceptionGroup[BaseExcT_co], types.TracebackType]", - (exc_type, exc_val, exc_tb), - ) - self.excinfo.fill_unfilled(exc_info) - return True - - def expected_type(self) -> str: - subexcs = [] - for e in self.expected_exceptions: - if isinstance(e, RaisesExc): - subexcs.append(repr(e)) - elif isinstance(e, RaisesGroup): - subexcs.append(e.expected_type()) - elif isinstance(e, type): - subexcs.append(e.__name__) - else: # pragma: no cover - raise AssertionError("unknown type") - group_type = "Base" if self.is_baseexception else "" - return f"{group_type}ExceptionGroup({', '.join(subexcs)})" - - -@final -class NotChecked: - """Singleton for unchecked values in ResultHolder""" - - -class ResultHolder: - """Container for results of checking exceptions. - Used in RaisesGroup._check_exceptions and possible_match. - """ - - def __init__( - self, - expected_exceptions: tuple[ - type[BaseException] | AbstractRaises[BaseException], ... - ], - actual_exceptions: Sequence[BaseException], - ) -> None: - self.results: list[list[str | type[NotChecked] | None]] = [ - [NotChecked for _ in expected_exceptions] for _ in actual_exceptions - ] - - def set_result(self, expected: int, actual: int, result: str | None) -> None: - self.results[actual][expected] = result - - def get_result(self, expected: int, actual: int) -> str | None: - res = self.results[actual][expected] - assert res is not NotChecked - # mypy doesn't support identity checking against anything but None - return res # type: ignore[return-value] - - def has_result(self, expected: int, actual: int) -> bool: - return self.results[actual][expected] is not NotChecked - - def no_match_for_expected(self, expected: list[int]) -> bool: - for i in expected: - for actual_results in self.results: - assert actual_results[i] is not NotChecked - if actual_results[i] is None: - return False - return True - - def no_match_for_actual(self, actual: list[int]) -> bool: - for i in actual: - for res in self.results[i]: - assert res is not NotChecked - if res is None: - return False - return True - - -def possible_match(results: ResultHolder, used: set[int] | None = None) -> bool: - if used is None: - used = set() - curr_row = len(used) - if curr_row == len(results.results): - return True - return any( - val is None and i not in used and possible_match(results, used | {i}) - for (i, val) in enumerate(results.results[curr_row]) - ) diff --git a/Backend/venv/lib/python3.12/site-packages/_pytest/recwarn.py b/Backend/venv/lib/python3.12/site-packages/_pytest/recwarn.py index e3db717b..d76ea020 100644 --- a/Backend/venv/lib/python3.12/site-packages/_pytest/recwarn.py +++ b/Backend/venv/lib/python3.12/site-packages/_pytest/recwarn.py @@ -1,29 +1,25 @@ -# mypy: allow-untyped-defs """Record warnings during test function execution.""" - -from __future__ import annotations - -from collections.abc import Callable -from collections.abc import Generator -from collections.abc import Iterator -from pprint import pformat import re +import warnings +from pprint import pformat from types import TracebackType from typing import Any -from typing import final -from typing import overload -from typing import TYPE_CHECKING +from typing import Callable +from typing import Generator +from typing import Iterator +from typing import List +from typing import Optional +from typing import Pattern +from typing import Tuple +from typing import Type from typing import TypeVar +from typing import Union - -if TYPE_CHECKING: - from typing_extensions import Self - -import warnings - +from _pytest.compat import final +from _pytest.compat import overload from _pytest.deprecated import check_ispytest +from _pytest.deprecated import WARNS_NONE_ARG from _pytest.fixtures import fixture -from _pytest.outcomes import Exit from _pytest.outcomes import fail @@ -31,10 +27,11 @@ T = TypeVar("T") @fixture -def recwarn() -> Generator[WarningsRecorder]: +def recwarn() -> Generator["WarningsRecorder", None, None]: """Return a :class:`WarningsRecorder` instance that records all warnings emitted by test functions. - See :ref:`warnings` for information on warning categories. + See https://docs.pytest.org/en/latest/how-to/capture-warnings.html for information + on warning categories. """ wrec = WarningsRecorder(_ispytest=True) with wrec: @@ -44,18 +41,22 @@ def recwarn() -> Generator[WarningsRecorder]: @overload def deprecated_call( - *, match: str | re.Pattern[str] | None = ... -) -> WarningsRecorder: ... + *, match: Optional[Union[str, Pattern[str]]] = ... +) -> "WarningsRecorder": + ... @overload -def deprecated_call(func: Callable[..., T], *args: Any, **kwargs: Any) -> T: ... +def deprecated_call( # noqa: F811 + func: Callable[..., T], *args: Any, **kwargs: Any +) -> T: + ... -def deprecated_call( - func: Callable[..., Any] | None = None, *args: Any, **kwargs: Any -) -> WarningsRecorder | Any: - """Assert that code produces a ``DeprecationWarning`` or ``PendingDeprecationWarning`` or ``FutureWarning``. +def deprecated_call( # noqa: F811 + func: Optional[Callable[..., Any]] = None, *args: Any, **kwargs: Any +) -> Union["WarningsRecorder", Any]: + """Assert that code produces a ``DeprecationWarning`` or ``PendingDeprecationWarning``. This function can be used as a context manager:: @@ -80,46 +81,46 @@ def deprecated_call( """ __tracebackhide__ = True if func is not None: - args = (func, *args) - return warns( - (DeprecationWarning, PendingDeprecationWarning, FutureWarning), *args, **kwargs - ) + args = (func,) + args + return warns((DeprecationWarning, PendingDeprecationWarning), *args, **kwargs) @overload def warns( - expected_warning: type[Warning] | tuple[type[Warning], ...] = ..., + expected_warning: Union[Type[Warning], Tuple[Type[Warning], ...]] = ..., *, - match: str | re.Pattern[str] | None = ..., -) -> WarningsChecker: ... + match: Optional[Union[str, Pattern[str]]] = ..., +) -> "WarningsChecker": + ... @overload -def warns( - expected_warning: type[Warning] | tuple[type[Warning], ...], +def warns( # noqa: F811 + expected_warning: Union[Type[Warning], Tuple[Type[Warning], ...]], func: Callable[..., T], *args: Any, **kwargs: Any, -) -> T: ... +) -> T: + ... -def warns( - expected_warning: type[Warning] | tuple[type[Warning], ...] = Warning, +def warns( # noqa: F811 + expected_warning: Union[Type[Warning], Tuple[Type[Warning], ...]] = Warning, *args: Any, - match: str | re.Pattern[str] | None = None, + match: Optional[Union[str, Pattern[str]]] = None, **kwargs: Any, -) -> WarningsChecker | Any: +) -> Union["WarningsChecker", Any]: r"""Assert that code raises a particular class of warning. - Specifically, the parameter ``expected_warning`` can be a warning class or tuple + Specifically, the parameter ``expected_warning`` can be a warning class or sequence of warning classes, and the code inside the ``with`` block must issue at least one warning of that class or classes. This helper produces a list of :class:`warnings.WarningMessage` objects, one for - each warning emitted (regardless of whether it is an ``expected_warning`` or not). - Since pytest 8.0, unmatched warnings are also re-emitted when the context closes. + each warning raised (regardless of whether it is an ``expected_warning`` or not). - This function can be used as a context manager:: + This function can be used as a context manager, which will capture all the raised + warnings inside it:: >>> import pytest >>> with pytest.warns(RuntimeWarning): @@ -134,9 +135,8 @@ def warns( >>> with pytest.warns(UserWarning, match=r'must be \d+$'): ... warnings.warn("value must be 42", UserWarning) - >>> with pytest.warns(UserWarning): # catch re-emitted warning - ... with pytest.warns(UserWarning, match=r'must be \d+$'): - ... warnings.warn("this is not here", UserWarning) + >>> with pytest.warns(UserWarning, match=r'must be \d+$'): + ... warnings.warn("this is not here", UserWarning) Traceback (most recent call last): ... Failed: DID NOT WARN. No warnings of type ...UserWarning... were emitted... @@ -167,7 +167,7 @@ def warns( return func(*args[1:], **kwargs) -class WarningsRecorder(warnings.catch_warnings): +class WarningsRecorder(warnings.catch_warnings): # type:ignore[type-arg] """A context manager to record raised warnings. Each recorded warning is an instance of :class:`warnings.WarningMessage`. @@ -182,20 +182,21 @@ class WarningsRecorder(warnings.catch_warnings): def __init__(self, *, _ispytest: bool = False) -> None: check_ispytest(_ispytest) - super().__init__(record=True) + # Type ignored due to the way typeshed handles warnings.catch_warnings. + super().__init__(record=True) # type: ignore[call-arg] self._entered = False - self._list: list[warnings.WarningMessage] = [] + self._list: List[warnings.WarningMessage] = [] @property - def list(self) -> list[warnings.WarningMessage]: + def list(self) -> List["warnings.WarningMessage"]: """The list of recorded warnings.""" return self._list - def __getitem__(self, i: int) -> warnings.WarningMessage: + def __getitem__(self, i: int) -> "warnings.WarningMessage": """Get a recorded warning by index.""" return self._list[i] - def __iter__(self) -> Iterator[warnings.WarningMessage]: + def __iter__(self) -> Iterator["warnings.WarningMessage"]: """Iterate through the recorded warnings.""" return iter(self._list) @@ -203,22 +204,11 @@ class WarningsRecorder(warnings.catch_warnings): """The number of recorded warnings.""" return len(self._list) - def pop(self, cls: type[Warning] = Warning) -> warnings.WarningMessage: - """Pop the first recorded warning which is an instance of ``cls``, - but not an instance of a child class of any other match. - Raises ``AssertionError`` if there is no match. - """ - best_idx: int | None = None + def pop(self, cls: Type[Warning] = Warning) -> "warnings.WarningMessage": + """Pop the first recorded warning, raise exception if not exists.""" for i, w in enumerate(self._list): - if w.category == cls: - return self._list.pop(i) # exact match, stop looking - if issubclass(w.category, cls) and ( - best_idx is None - or not issubclass(w.category, self._list[best_idx].category) - ): - best_idx = i - if best_idx is not None: - return self._list.pop(best_idx) + if issubclass(w.category, cls): + return self._list.pop(i) __tracebackhide__ = True raise AssertionError(f"{cls!r} not found in warning list") @@ -226,9 +216,9 @@ class WarningsRecorder(warnings.catch_warnings): """Clear the list of recorded warnings.""" self._list[:] = [] - # Type ignored because we basically want the `catch_warnings` generic type - # parameter to be ourselves but that is not possible(?). - def __enter__(self) -> Self: # type: ignore[override] + # Type ignored because it doesn't exactly warnings.catch_warnings.__enter__ + # -- it returns a List but we only emulate one. + def __enter__(self) -> "WarningsRecorder": # type: ignore if self._entered: __tracebackhide__ = True raise RuntimeError(f"Cannot enter {self!r} twice") @@ -241,9 +231,9 @@ class WarningsRecorder(warnings.catch_warnings): def __exit__( self, - exc_type: type[BaseException] | None, - exc_val: BaseException | None, - exc_tb: TracebackType | None, + exc_type: Optional[Type[BaseException]], + exc_val: Optional[BaseException], + exc_tb: Optional[TracebackType], ) -> None: if not self._entered: __tracebackhide__ = True @@ -260,8 +250,10 @@ class WarningsRecorder(warnings.catch_warnings): class WarningsChecker(WarningsRecorder): def __init__( self, - expected_warning: type[Warning] | tuple[type[Warning], ...] = Warning, - match_expr: str | re.Pattern[str] | None = None, + expected_warning: Optional[ + Union[Type[Warning], Tuple[Type[Warning], ...]] + ] = Warning, + match_expr: Optional[Union[str, Pattern[str]]] = None, *, _ispytest: bool = False, ) -> None: @@ -269,14 +261,15 @@ class WarningsChecker(WarningsRecorder): super().__init__(_ispytest=True) msg = "exceptions must be derived from Warning, not %s" - if isinstance(expected_warning, tuple): + if expected_warning is None: + warnings.warn(WARNS_NONE_ARG, stacklevel=4) + expected_warning_tup = None + elif isinstance(expected_warning, tuple): for exc in expected_warning: if not issubclass(exc, Warning): raise TypeError(msg % type(exc)) expected_warning_tup = expected_warning - elif isinstance(expected_warning, type) and issubclass( - expected_warning, Warning - ): + elif issubclass(expected_warning, Warning): expected_warning_tup = (expected_warning,) else: raise TypeError(msg % type(expected_warning)) @@ -284,84 +277,37 @@ class WarningsChecker(WarningsRecorder): self.expected_warning = expected_warning_tup self.match_expr = match_expr - def matches(self, warning: warnings.WarningMessage) -> bool: - assert self.expected_warning is not None - return issubclass(warning.category, self.expected_warning) and bool( - self.match_expr is None or re.search(self.match_expr, str(warning.message)) - ) - def __exit__( self, - exc_type: type[BaseException] | None, - exc_val: BaseException | None, - exc_tb: TracebackType | None, + exc_type: Optional[Type[BaseException]], + exc_val: Optional[BaseException], + exc_tb: Optional[TracebackType], ) -> None: super().__exit__(exc_type, exc_val, exc_tb) __tracebackhide__ = True - # BaseExceptions like pytest.{skip,fail,xfail,exit} or Ctrl-C within - # pytest.warns should *not* trigger "DID NOT WARN" and get suppressed - # when the warning doesn't happen. Control-flow exceptions should always - # propagate. - if exc_val is not None and ( - not isinstance(exc_val, Exception) - # Exit is an Exception, not a BaseException, for some reason. - or isinstance(exc_val, Exit) - ): - return - - def found_str() -> str: + def found_str(): return pformat([record.message for record in self], indent=2) - try: - if not any(issubclass(w.category, self.expected_warning) for w in self): - fail( - f"DID NOT WARN. No warnings of type {self.expected_warning} were emitted.\n" - f" Emitted warnings: {found_str()}." - ) - elif not any(self.matches(w) for w in self): - fail( - f"DID NOT WARN. No warnings of type {self.expected_warning} matching the regex were emitted.\n" - f" Regex: {self.match_expr}\n" - f" Emitted warnings: {found_str()}." - ) - finally: - # Whether or not any warnings matched, we want to re-emit all unmatched warnings. - for w in self: - if not self.matches(w): - warnings.warn_explicit( - message=w.message, - category=w.category, - filename=w.filename, - lineno=w.lineno, - module=w.__module__, - source=w.source, + # only check if we're not currently handling an exception + if exc_type is None and exc_val is None and exc_tb is None: + if self.expected_warning is not None: + if not any(issubclass(r.category, self.expected_warning) for r in self): + __tracebackhide__ = True + fail( + f"DID NOT WARN. No warnings of type {self.expected_warning} were emitted.\n" + f"The list of emitted warnings is: {found_str()}." ) - - # Currently in Python it is possible to pass other types than an - # `str` message when creating `Warning` instances, however this - # causes an exception when :func:`warnings.filterwarnings` is used - # to filter those warnings. See - # https://github.com/python/cpython/issues/103577 for a discussion. - # While this can be considered a bug in CPython, we put guards in - # pytest as the error message produced without this check in place - # is confusing (#10865). - for w in self: - if type(w.message) is not UserWarning: - # If the warning was of an incorrect type then `warnings.warn()` - # creates a UserWarning. Any other warning must have been specified - # explicitly. - continue - if not w.message.args: - # UserWarning() without arguments must have been specified explicitly. - continue - msg = w.message.args[0] - if isinstance(msg, str): - continue - # It's possible that UserWarning was explicitly specified, and - # its first argument was not a string. But that case can't be - # distinguished from an invalid type. - raise TypeError( - f"Warning must be str or Warning, got {msg!r} (type {type(msg).__name__})" - ) + elif self.match_expr is not None: + for r in self: + if issubclass(r.category, self.expected_warning): + if re.compile(self.match_expr).search(str(r.message)): + break + else: + fail( + f"""\ +DID NOT WARN. No warnings of type {self.expected_warning} matching the regex were emitted. + Regex: {self.match_expr} + Emitted warnings: {found_str()}""" + ) diff --git a/Backend/venv/lib/python3.12/site-packages/_pytest/reports.py b/Backend/venv/lib/python3.12/site-packages/_pytest/reports.py index 011a69db..74e8794b 100644 --- a/Backend/venv/lib/python3.12/site-packages/_pytest/reports.py +++ b/Backend/venv/lib/python3.12/site-packages/_pytest/reports.py @@ -1,21 +1,21 @@ -# mypy: allow-untyped-defs -from __future__ import annotations - -from collections.abc import Iterable -from collections.abc import Iterator -from collections.abc import Mapping -from collections.abc import Sequence import dataclasses -from io import StringIO import os +from io import StringIO from pprint import pprint -import sys from typing import Any from typing import cast -from typing import final -from typing import Literal +from typing import Dict +from typing import Iterable +from typing import Iterator +from typing import List +from typing import Mapping from typing import NoReturn +from typing import Optional +from typing import Tuple +from typing import Type from typing import TYPE_CHECKING +from typing import TypeVar +from typing import Union from _pytest._code.code import ExceptionChainRepr from _pytest._code.code import ExceptionInfo @@ -29,19 +29,14 @@ from _pytest._code.code import ReprLocals from _pytest._code.code import ReprTraceback from _pytest._code.code import TerminalRepr from _pytest._io import TerminalWriter +from _pytest.compat import final from _pytest.config import Config from _pytest.nodes import Collector from _pytest.nodes import Item -from _pytest.outcomes import fail from _pytest.outcomes import skip - -if sys.version_info < (3, 11): - from exceptiongroup import BaseExceptionGroup - - if TYPE_CHECKING: - from typing_extensions import Self + from typing_extensions import Literal from _pytest.runner import CallInfo @@ -51,29 +46,33 @@ def getworkerinfoline(node): return node._workerinfocache except AttributeError: d = node.workerinfo - ver = "{}.{}.{}".format(*d["version_info"][:3]) + ver = "%s.%s.%s" % d["version_info"][:3] node._workerinfocache = s = "[{}] {} -- Python {} {}".format( d["id"], d["sysplatform"], ver, d["executable"] ) return s +_R = TypeVar("_R", bound="BaseReport") + + class BaseReport: - when: str | None - location: tuple[str, int | None, str] | None - longrepr: ( - None | ExceptionInfo[BaseException] | tuple[str, int, str] | str | TerminalRepr - ) - sections: list[tuple[str, str]] + when: Optional[str] + location: Optional[Tuple[str, Optional[int], str]] + longrepr: Union[ + None, ExceptionInfo[BaseException], Tuple[str, int, str], str, TerminalRepr + ] + sections: List[Tuple[str, str]] nodeid: str - outcome: Literal["passed", "failed", "skipped"] + outcome: "Literal['passed', 'failed', 'skipped']" def __init__(self, **kw: Any) -> None: self.__dict__.update(kw) if TYPE_CHECKING: # Can have arbitrary fields given to __init__(). - def __getattr__(self, key: str) -> Any: ... + def __getattr__(self, key: str) -> Any: + ... def toterminal(self, out: TerminalWriter) -> None: if hasattr(self, "node"): @@ -95,7 +94,7 @@ class BaseReport: s = "" out.line(s) - def get_sections(self, prefix: str) -> Iterator[tuple[str, str]]: + def get_sections(self, prefix: str) -> Iterator[Tuple[str, str]]: for name, content in self.sections: if name.startswith(prefix): yield prefix, content @@ -177,7 +176,7 @@ class BaseReport: return True @property - def head_line(self) -> str | None: + def head_line(self) -> Optional[str]: """**Experimental** The head line shown with longrepr output for this report, more commonly during traceback representation during failures:: @@ -193,32 +192,17 @@ class BaseReport: even in patch releases. """ if self.location is not None: - _fspath, _lineno, domain = self.location + fspath, lineno, domain = self.location return domain return None - def _get_verbose_word_with_markup( - self, config: Config, default_markup: Mapping[str, bool] - ) -> tuple[str, Mapping[str, bool]]: + def _get_verbose_word(self, config: Config): _category, _short, verbose = config.hook.pytest_report_teststatus( report=self, config=config ) + return verbose - if isinstance(verbose, str): - return verbose, default_markup - - if isinstance(verbose, Sequence) and len(verbose) == 2: - word, markup = verbose - if isinstance(word, str) and isinstance(markup, Mapping): - return word, markup - - fail( # pragma: no cover - "pytest_report_teststatus() hook (from a plugin) returned " - f"an invalid verbose value: {verbose!r}.\nExpected either a string " - "or a tuple of (word, markup)." - ) - - def _to_json(self) -> dict[str, Any]: + def _to_json(self) -> Dict[str, Any]: """Return the contents of this report as a dict of builtin entries, suitable for serialization. @@ -229,7 +213,7 @@ class BaseReport: return _report_to_json(self) @classmethod - def _from_json(cls, reportdict: dict[str, object]) -> Self: + def _from_json(cls: Type[_R], reportdict: Dict[str, object]) -> _R: """Create either a TestReport or CollectReport, depending on the calling class. It is the callers responsibility to know which class to pass here. @@ -243,65 +227,20 @@ class BaseReport: def _report_unserialization_failure( - type_name: str, report_class: type[BaseReport], reportdict + type_name: str, report_class: Type[BaseReport], reportdict ) -> NoReturn: url = "https://github.com/pytest-dev/pytest/issues" stream = StringIO() pprint("-" * 100, stream=stream) - pprint(f"INTERNALERROR: Unknown entry type returned: {type_name}", stream=stream) - pprint(f"report_name: {report_class}", stream=stream) + pprint("INTERNALERROR: Unknown entry type returned: %s" % type_name, stream=stream) + pprint("report_name: %s" % report_class, stream=stream) pprint(reportdict, stream=stream) - pprint(f"Please report this bug at {url}", stream=stream) + pprint("Please report this bug at %s" % url, stream=stream) pprint("-" * 100, stream=stream) raise RuntimeError(stream.getvalue()) -def _format_failed_longrepr( - item: Item, call: CallInfo[None], excinfo: ExceptionInfo[BaseException] -): - if call.when == "call": - longrepr = item.repr_failure(excinfo) - else: - # Exception in setup or teardown. - longrepr = item._repr_failure_py( - excinfo, style=item.config.getoption("tbstyle", "auto") - ) - return longrepr - - -def _format_exception_group_all_skipped_longrepr( - item: Item, - excinfo: ExceptionInfo[BaseExceptionGroup[BaseException | BaseExceptionGroup]], -) -> tuple[str, int, str]: - r = excinfo._getreprcrash() - assert r is not None, ( - "There should always be a traceback entry for skipping a test." - ) - if all( - getattr(skip, "_use_item_location", False) for skip in excinfo.value.exceptions - ): - path, line = item.reportinfo()[:2] - assert line is not None - loc = (os.fspath(path), line + 1) - default_msg = "skipped" - else: - loc = (str(r.path), r.lineno) - default_msg = r.message - - # Get all unique skip messages. - msgs: list[str] = [] - for exception in excinfo.value.exceptions: - m = getattr(exception, "msg", None) or ( - exception.args[0] if exception.args else None - ) - if m and m not in msgs: - msgs.append(m) - - reason = "; ".join(msgs) if msgs else default_msg - longrepr = (*loc, reason) - return longrepr - - +@final class TestReport(BaseReport): """Basic test report object (also used for setup and teardown calls if they fail). @@ -311,27 +250,21 @@ class TestReport(BaseReport): __test__ = False - # Defined by skipping plugin. - # xfail reason if xfailed, otherwise not defined. Use hasattr to distinguish. - wasxfail: str - def __init__( self, nodeid: str, - location: tuple[str, int | None, str], + location: Tuple[str, Optional[int], str], keywords: Mapping[str, Any], - outcome: Literal["passed", "failed", "skipped"], - longrepr: None - | ExceptionInfo[BaseException] - | tuple[str, int, str] - | str - | TerminalRepr, - when: Literal["setup", "call", "teardown"], - sections: Iterable[tuple[str, str]] = (), + outcome: "Literal['passed', 'failed', 'skipped']", + longrepr: Union[ + None, ExceptionInfo[BaseException], Tuple[str, int, str], str, TerminalRepr + ], + when: "Literal['setup', 'call', 'teardown']", + sections: Iterable[Tuple[str, str]] = (), duration: float = 0, start: float = 0, stop: float = 0, - user_properties: Iterable[tuple[str, object]] | None = None, + user_properties: Optional[Iterable[Tuple[str, object]]] = None, **extra, ) -> None: #: Normalized collection nodeid. @@ -342,7 +275,7 @@ class TestReport(BaseReport): #: collected one e.g. if a method is inherited from a different module. #: The filesystempath may be relative to ``config.rootdir``. #: The line number is 0-based. - self.location: tuple[str, int | None, str] = location + self.location: Tuple[str, Optional[int], str] = location #: A name -> value dictionary containing all keywords and #: markers associated with a test invocation. @@ -355,7 +288,7 @@ class TestReport(BaseReport): self.longrepr = longrepr #: One of 'setup', 'call', 'teardown' to indicate runtest phase. - self.when: Literal["setup", "call", "teardown"] = when + self.when = when #: User properties is a list of tuples (name, value) that holds user #: defined properties of the test. @@ -378,10 +311,12 @@ class TestReport(BaseReport): self.__dict__.update(extra) def __repr__(self) -> str: - return f"<{self.__class__.__name__} {self.nodeid!r} when={self.when!r} outcome={self.outcome!r}>" + return "<{} {!r} when={!r} outcome={!r}>".format( + self.__class__.__name__, self.nodeid, self.when, self.outcome + ) @classmethod - def from_item_and_call(cls, item: Item, call: CallInfo[None]) -> TestReport: + def from_item_and_call(cls, item: Item, call: "CallInfo[None]") -> "TestReport": """Create and fill a TestReport with standard item and call info. :param item: The item. @@ -398,13 +333,13 @@ class TestReport(BaseReport): sections = [] if not call.excinfo: outcome: Literal["passed", "failed", "skipped"] = "passed" - longrepr: ( - None - | ExceptionInfo[BaseException] - | tuple[str, int, str] - | str - | TerminalRepr - ) = None + longrepr: Union[ + None, + ExceptionInfo[BaseException], + Tuple[str, int, str], + str, + TerminalRepr, + ] = None else: if not isinstance(excinfo, ExceptionInfo): outcome = "failed" @@ -412,30 +347,23 @@ class TestReport(BaseReport): elif isinstance(excinfo.value, skip.Exception): outcome = "skipped" r = excinfo._getreprcrash() - assert r is not None, ( - "There should always be a traceback entry for skipping a test." - ) + assert ( + r is not None + ), "There should always be a traceback entry for skipping a test." if excinfo.value._use_item_location: path, line = item.reportinfo()[:2] assert line is not None - longrepr = (os.fspath(path), line + 1, r.message) + longrepr = os.fspath(path), line + 1, r.message else: longrepr = (str(r.path), r.lineno, r.message) - elif isinstance(excinfo.value, BaseExceptionGroup) and ( - excinfo.value.split(skip.Exception)[1] is None - ): - # All exceptions in the group are skip exceptions. - outcome = "skipped" - excinfo = cast( - ExceptionInfo[ - BaseExceptionGroup[BaseException | BaseExceptionGroup] - ], - excinfo, - ) - longrepr = _format_exception_group_all_skipped_longrepr(item, excinfo) else: outcome = "failed" - longrepr = _format_failed_longrepr(item, call, excinfo) + if call.when == "call": + longrepr = item.repr_failure(excinfo) + else: # exception in setup or teardown + longrepr = item._repr_failure_py( + excinfo, style=item.config.getoption("tbstyle", "auto") + ) for rwhen, key, content in item._report_sections: sections.append((f"Captured {key} {rwhen}", content)) return cls( @@ -465,14 +393,12 @@ class CollectReport(BaseReport): def __init__( self, nodeid: str, - outcome: Literal["passed", "failed", "skipped"], - longrepr: None - | ExceptionInfo[BaseException] - | tuple[str, int, str] - | str - | TerminalRepr, - result: list[Item | Collector] | None, - sections: Iterable[tuple[str, str]] = (), + outcome: "Literal['passed', 'failed', 'skipped']", + longrepr: Union[ + None, ExceptionInfo[BaseException], Tuple[str, int, str], str, TerminalRepr + ], + result: Optional[List[Union[Item, Collector]]], + sections: Iterable[Tuple[str, str]] = (), **extra, ) -> None: #: Normalized collection nodeid. @@ -498,11 +424,13 @@ class CollectReport(BaseReport): @property def location( # type:ignore[override] self, - ) -> tuple[str, int | None, str] | None: + ) -> Optional[Tuple[str, Optional[int], str]]: return (self.fspath, None, self.fspath) def __repr__(self) -> str: - return f"" + return "".format( + self.nodeid, len(self.result), self.outcome + ) class CollectErrorRepr(TerminalRepr): @@ -514,9 +442,9 @@ class CollectErrorRepr(TerminalRepr): def pytest_report_to_serializable( - report: CollectReport | TestReport, -) -> dict[str, Any] | None: - if isinstance(report, TestReport | CollectReport): + report: Union[CollectReport, TestReport] +) -> Optional[Dict[str, Any]]: + if isinstance(report, (TestReport, CollectReport)): data = report._to_json() data["$report_type"] = report.__class__.__name__ return data @@ -525,8 +453,8 @@ def pytest_report_to_serializable( def pytest_report_from_serializable( - data: dict[str, Any], -) -> CollectReport | TestReport | None: + data: Dict[str, Any], +) -> Optional[Union[CollectReport, TestReport]]: if "$report_type" in data: if data["$report_type"] == "TestReport": return TestReport._from_json(data) @@ -538,7 +466,7 @@ def pytest_report_from_serializable( return None -def _report_to_json(report: BaseReport) -> dict[str, Any]: +def _report_to_json(report: BaseReport) -> Dict[str, Any]: """Return the contents of this report as a dict of builtin entries, suitable for serialization. @@ -546,8 +474,8 @@ def _report_to_json(report: BaseReport) -> dict[str, Any]: """ def serialize_repr_entry( - entry: ReprEntry | ReprEntryNative, - ) -> dict[str, Any]: + entry: Union[ReprEntry, ReprEntryNative] + ) -> Dict[str, Any]: data = dataclasses.asdict(entry) for key, value in data.items(): if hasattr(value, "__dict__"): @@ -555,7 +483,7 @@ def _report_to_json(report: BaseReport) -> dict[str, Any]: entry_data = {"type": type(entry).__name__, "data": data} return entry_data - def serialize_repr_traceback(reprtraceback: ReprTraceback) -> dict[str, Any]: + def serialize_repr_traceback(reprtraceback: ReprTraceback) -> Dict[str, Any]: result = dataclasses.asdict(reprtraceback) result["reprentries"] = [ serialize_repr_entry(x) for x in reprtraceback.reprentries @@ -563,18 +491,18 @@ def _report_to_json(report: BaseReport) -> dict[str, Any]: return result def serialize_repr_crash( - reprcrash: ReprFileLocation | None, - ) -> dict[str, Any] | None: + reprcrash: Optional[ReprFileLocation], + ) -> Optional[Dict[str, Any]]: if reprcrash is not None: return dataclasses.asdict(reprcrash) else: return None - def serialize_exception_longrepr(rep: BaseReport) -> dict[str, Any]: + def serialize_exception_longrepr(rep: BaseReport) -> Dict[str, Any]: assert rep.longrepr is not None # TODO: Investigate whether the duck typing is really necessary here. longrepr = cast(ExceptionRepr, rep.longrepr) - result: dict[str, Any] = { + result: Dict[str, Any] = { "reprcrash": serialize_repr_crash(longrepr.reprcrash), "reprtraceback": serialize_repr_traceback(longrepr.reprtraceback), "sections": longrepr.sections, @@ -611,7 +539,7 @@ def _report_to_json(report: BaseReport) -> dict[str, Any]: return d -def _report_kwargs_from_json(reportdict: dict[str, Any]) -> dict[str, Any]: +def _report_kwargs_from_json(reportdict: Dict[str, Any]) -> Dict[str, Any]: """Return **kwargs that can be used to construct a TestReport or CollectReport instance. @@ -632,7 +560,7 @@ def _report_kwargs_from_json(reportdict: dict[str, Any]) -> dict[str, Any]: if data["reprlocals"]: reprlocals = ReprLocals(data["reprlocals"]["lines"]) - reprentry: ReprEntry | ReprEntryNative = ReprEntry( + reprentry: Union[ReprEntry, ReprEntryNative] = ReprEntry( lines=data["lines"], reprfuncargs=reprfuncargs, reprlocals=reprlocals, @@ -651,7 +579,7 @@ def _report_kwargs_from_json(reportdict: dict[str, Any]) -> dict[str, Any]: ] return ReprTraceback(**repr_traceback_dict) - def deserialize_repr_crash(repr_crash_dict: dict[str, Any] | None): + def deserialize_repr_crash(repr_crash_dict: Optional[Dict[str, Any]]): if repr_crash_dict is not None: return ReprFileLocation(**repr_crash_dict) else: @@ -678,9 +606,9 @@ def _report_kwargs_from_json(reportdict: dict[str, Any]) -> dict[str, Any]: description, ) ) - exception_info: ExceptionChainRepr | ReprExceptionInfo = ExceptionChainRepr( - chain - ) + exception_info: Union[ + ExceptionChainRepr, ReprExceptionInfo + ] = ExceptionChainRepr(chain) else: exception_info = ReprExceptionInfo( reprtraceback=reprtraceback, diff --git a/Backend/venv/lib/python3.12/site-packages/_pytest/runner.py b/Backend/venv/lib/python3.12/site-packages/_pytest/runner.py index 9c20ff9e..f861c05a 100644 --- a/Backend/venv/lib/python3.12/site-packages/_pytest/runner.py +++ b/Backend/venv/lib/python3.12/site-packages/_pytest/runner.py @@ -1,22 +1,20 @@ -# mypy: allow-untyped-defs """Basic collect and runtest protocol implementations.""" - -from __future__ import annotations - import bdb -from collections.abc import Callable import dataclasses import os import sys -import types +from typing import Callable from typing import cast -from typing import final +from typing import Dict from typing import Generic -from typing import Literal +from typing import List +from typing import Optional +from typing import Tuple +from typing import Type from typing import TYPE_CHECKING from typing import TypeVar +from typing import Union -from .config import Config from .reports import BaseReport from .reports import CollectErrorRepr from .reports import CollectReport @@ -25,10 +23,10 @@ from _pytest import timing from _pytest._code.code import ExceptionChainRepr from _pytest._code.code import ExceptionInfo from _pytest._code.code import TerminalRepr +from _pytest.compat import final from _pytest.config.argparsing import Parser from _pytest.deprecated import check_ispytest from _pytest.nodes import Collector -from _pytest.nodes import Directory from _pytest.nodes import Item from _pytest.nodes import Node from _pytest.outcomes import Exit @@ -36,11 +34,12 @@ from _pytest.outcomes import OutcomeException from _pytest.outcomes import Skipped from _pytest.outcomes import TEST_OUTCOME - -if sys.version_info < (3, 11): +if sys.version_info[:2] < (3, 11): from exceptiongroup import BaseExceptionGroup if TYPE_CHECKING: + from typing_extensions import Literal + from _pytest.main import Session from _pytest.terminal import TerminalReporter @@ -62,21 +61,19 @@ def pytest_addoption(parser: Parser) -> None: "--durations-min", action="store", type=float, - default=None, + default=0.005, metavar="N", help="Minimal duration in seconds for inclusion in slowest list. " - "Default: 0.005 (or 0.0 if -vv is given).", + "Default: 0.005.", ) -def pytest_terminal_summary(terminalreporter: TerminalReporter) -> None: +def pytest_terminal_summary(terminalreporter: "TerminalReporter") -> None: durations = terminalreporter.config.option.durations durations_min = terminalreporter.config.option.durations_min - verbose = terminalreporter.config.get_verbosity() + verbose = terminalreporter.config.getvalue("verbose") if durations is None: return - if durations_min is None: - durations_min = 0.005 if verbose < 2 else 0.0 tr = terminalreporter dlist = [] for replist in tr.stats.values(): @@ -85,34 +82,33 @@ def pytest_terminal_summary(terminalreporter: TerminalReporter) -> None: dlist.append(rep) if not dlist: return - dlist.sort(key=lambda x: x.duration, reverse=True) + dlist.sort(key=lambda x: x.duration, reverse=True) # type: ignore[no-any-return] if not durations: tr.write_sep("=", "slowest durations") else: - tr.write_sep("=", f"slowest {durations} durations") + tr.write_sep("=", "slowest %s durations" % durations) dlist = dlist[:durations] for i, rep in enumerate(dlist): - if rep.duration < durations_min: + if verbose < 2 and rep.duration < durations_min: tr.write_line("") - message = f"({len(dlist) - i} durations < {durations_min:g}s hidden." - if terminalreporter.config.option.durations_min is None: - message += " Use -vv to show these durations." - message += ")" - tr.write_line(message) + tr.write_line( + "(%s durations < %gs hidden. Use -vv to show these durations.)" + % (len(dlist) - i, durations_min) + ) break tr.write_line(f"{rep.duration:02.2f}s {rep.when:<8} {rep.nodeid}") -def pytest_sessionstart(session: Session) -> None: +def pytest_sessionstart(session: "Session") -> None: session._setupstate = SetupState() -def pytest_sessionfinish(session: Session) -> None: +def pytest_sessionfinish(session: "Session") -> None: session._setupstate.teardown_exact(None) -def pytest_runtest_protocol(item: Item, nextitem: Item | None) -> bool: +def pytest_runtest_protocol(item: Item, nextitem: Optional[Item]) -> bool: ihook = item.ihook ihook.pytest_runtest_logstart(nodeid=item.nodeid, location=item.location) runtestprotocol(item, nextitem=nextitem) @@ -121,8 +117,8 @@ def pytest_runtest_protocol(item: Item, nextitem: Item | None) -> bool: def runtestprotocol( - item: Item, log: bool = True, nextitem: Item | None = None -) -> list[TestReport]: + item: Item, log: bool = True, nextitem: Optional[Item] = None +) -> List[TestReport]: hasrequest = hasattr(item, "_request") if hasrequest and not item._request: # type: ignore[attr-defined] # This only happens if the item is re-run, as is done by @@ -135,10 +131,6 @@ def runtestprotocol( show_test_item(item) if not item.config.getoption("setuponly", False): reports.append(call_and_report(item, "call", log)) - # If the session is about to fail or stop, teardown everything - this is - # necessary to correctly report fixture teardown errors (see #11706) - if item.session.shouldfail or item.session.shouldstop: - nextitem = None reports.append(call_and_report(item, "teardown", log, nextitem=nextitem)) # After all teardown hooks have been called # want funcargs and request info to go away. @@ -171,8 +163,6 @@ def pytest_runtest_call(item: Item) -> None: del sys.last_type del sys.last_value del sys.last_traceback - if sys.version_info >= (3, 12, 0): - del sys.last_exc # type:ignore[attr-defined] except AttributeError: pass try: @@ -181,22 +171,20 @@ def pytest_runtest_call(item: Item) -> None: # Store trace info to allow postmortem debugging sys.last_type = type(e) sys.last_value = e - if sys.version_info >= (3, 12, 0): - sys.last_exc = e # type:ignore[attr-defined] assert e.__traceback__ is not None # Skip *this* frame sys.last_traceback = e.__traceback__.tb_next - raise + raise e -def pytest_runtest_teardown(item: Item, nextitem: Item | None) -> None: +def pytest_runtest_teardown(item: Item, nextitem: Optional[Item]) -> None: _update_current_test_var(item, "teardown") item.session._setupstate.teardown_exact(nextitem) _update_current_test_var(item, None) def _update_current_test_var( - item: Item, when: Literal["setup", "call", "teardown"] | None + item: Item, when: Optional["Literal['setup', 'call', 'teardown']"] ) -> None: """Update :envvar:`PYTEST_CURRENT_TEST` to reflect the current item and stage. @@ -212,7 +200,7 @@ def _update_current_test_var( os.environ.pop(var_name) -def pytest_report_teststatus(report: BaseReport) -> tuple[str, str, str] | None: +def pytest_report_teststatus(report: BaseReport) -> Optional[Tuple[str, str, str]]: if report.when in ("setup", "teardown"): if report.failed: # category, shortletter, verbose-word @@ -229,40 +217,19 @@ def pytest_report_teststatus(report: BaseReport) -> tuple[str, str, str] | None: def call_and_report( - item: Item, when: Literal["setup", "call", "teardown"], log: bool = True, **kwds + item: Item, when: "Literal['setup', 'call', 'teardown']", log: bool = True, **kwds ) -> TestReport: - ihook = item.ihook - if when == "setup": - runtest_hook: Callable[..., None] = ihook.pytest_runtest_setup - elif when == "call": - runtest_hook = ihook.pytest_runtest_call - elif when == "teardown": - runtest_hook = ihook.pytest_runtest_teardown - else: - assert False, f"Unhandled runtest hook case: {when}" - - call = CallInfo.from_call( - lambda: runtest_hook(item=item, **kwds), - when=when, - reraise=get_reraise_exceptions(item.config), - ) - report: TestReport = ihook.pytest_runtest_makereport(item=item, call=call) + call = call_runtest_hook(item, when, **kwds) + hook = item.ihook + report: TestReport = hook.pytest_runtest_makereport(item=item, call=call) if log: - ihook.pytest_runtest_logreport(report=report) + hook.pytest_runtest_logreport(report=report) if check_interactive_exception(call, report): - ihook.pytest_exception_interact(node=item, call=call, report=report) + hook.pytest_exception_interact(node=item, call=call, report=report) return report -def get_reraise_exceptions(config: Config) -> tuple[type[BaseException], ...]: - """Return exception types that should not be suppressed in general.""" - reraise: tuple[type[BaseException], ...] = (Exit,) - if not config.getoption("usepdb", False): - reraise += (KeyboardInterrupt,) - return reraise - - -def check_interactive_exception(call: CallInfo[object], report: BaseReport) -> bool: +def check_interactive_exception(call: "CallInfo[object]", report: BaseReport) -> bool: """Check whether the call raised an exception that should be reported as interactive.""" if call.excinfo is None: @@ -271,12 +238,31 @@ def check_interactive_exception(call: CallInfo[object], report: BaseReport) -> b if hasattr(report, "wasxfail"): # Exception was expected. return False - if isinstance(call.excinfo.value, Skipped | bdb.BdbQuit): + if isinstance(call.excinfo.value, (Skipped, bdb.BdbQuit)): # Special control flow exception. return False return True +def call_runtest_hook( + item: Item, when: "Literal['setup', 'call', 'teardown']", **kwds +) -> "CallInfo[None]": + if when == "setup": + ihook: Callable[..., None] = item.ihook.pytest_runtest_setup + elif when == "call": + ihook = item.ihook.pytest_runtest_call + elif when == "teardown": + ihook = item.ihook.pytest_runtest_teardown + else: + assert False, f"Unhandled runtest hook case: {when}" + reraise: Tuple[Type[BaseException], ...] = (Exit,) + if not item.config.getoption("usepdb", False): + reraise += (KeyboardInterrupt,) + return CallInfo.from_call( + lambda: ihook(item=item, **kwds), when=when, reraise=reraise + ) + + TResult = TypeVar("TResult", covariant=True) @@ -285,9 +271,9 @@ TResult = TypeVar("TResult", covariant=True) class CallInfo(Generic[TResult]): """Result/Exception info of a function invocation.""" - _result: TResult | None + _result: Optional[TResult] #: The captured exception of the call, if it raised. - excinfo: ExceptionInfo[BaseException] | None + excinfo: Optional[ExceptionInfo[BaseException]] #: The system time when the call started, in seconds since the epoch. start: float #: The system time when the call ended, in seconds since the epoch. @@ -295,16 +281,16 @@ class CallInfo(Generic[TResult]): #: The call duration, in seconds. duration: float #: The context of invocation: "collect", "setup", "call" or "teardown". - when: Literal["collect", "setup", "call", "teardown"] + when: "Literal['collect', 'setup', 'call', 'teardown']" def __init__( self, - result: TResult | None, - excinfo: ExceptionInfo[BaseException] | None, + result: Optional[TResult], + excinfo: Optional[ExceptionInfo[BaseException]], start: float, stop: float, duration: float, - when: Literal["collect", "setup", "call", "teardown"], + when: "Literal['collect', 'setup', 'call', 'teardown']", *, _ispytest: bool = False, ) -> None: @@ -332,15 +318,16 @@ class CallInfo(Generic[TResult]): @classmethod def from_call( cls, - func: Callable[[], TResult], - when: Literal["collect", "setup", "call", "teardown"], - reraise: type[BaseException] | tuple[type[BaseException], ...] | None = None, - ) -> CallInfo[TResult]: + func: "Callable[[], TResult]", + when: "Literal['collect', 'setup', 'call', 'teardown']", + reraise: Optional[ + Union[Type[BaseException], Tuple[Type[BaseException], ...]] + ] = None, + ) -> "CallInfo[TResult]": """Call func, wrapping the result in a CallInfo. :param func: The function to call. Called without arguments. - :type func: Callable[[], _pytest.runner.TResult] :param when: The phase in which the function is called. :param reraise: @@ -348,19 +335,23 @@ class CallInfo(Generic[TResult]): function, instead of being wrapped in the CallInfo. """ excinfo = None - instant = timing.Instant() + start = timing.time() + precise_start = timing.perf_counter() try: - result: TResult | None = func() + result: Optional[TResult] = func() except BaseException: excinfo = ExceptionInfo.from_current() if reraise is not None and isinstance(excinfo.value, reraise): raise result = None - duration = instant.elapsed() + # use the perf counter + precise_stop = timing.perf_counter() + duration = precise_stop - precise_start + stop = timing.time() return cls( - start=duration.start.time, - stop=duration.stop.time, - duration=duration.seconds, + start=start, + stop=stop, + duration=duration, when=when, result=result, excinfo=excinfo, @@ -378,36 +369,16 @@ def pytest_runtest_makereport(item: Item, call: CallInfo[None]) -> TestReport: def pytest_make_collect_report(collector: Collector) -> CollectReport: - def collect() -> list[Item | Collector]: - # Before collecting, if this is a Directory, load the conftests. - # If a conftest import fails to load, it is considered a collection - # error of the Directory collector. This is why it's done inside of the - # CallInfo wrapper. - # - # Note: initial conftests are loaded early, not here. - if isinstance(collector, Directory): - collector.config.pluginmanager._loadconftestmodules( - collector.path, - collector.config.getoption("importmode"), - rootpath=collector.config.rootpath, - consider_namespace_packages=collector.config.getini( - "consider_namespace_packages" - ), - ) - - return list(collector.collect()) - - call = CallInfo.from_call( - collect, "collect", reraise=(KeyboardInterrupt, SystemExit) - ) - longrepr: None | tuple[str, int, str] | str | TerminalRepr = None + call = CallInfo.from_call(lambda: list(collector.collect()), "collect") + longrepr: Union[None, Tuple[str, int, str], str, TerminalRepr] = None if not call.excinfo: outcome: Literal["passed", "skipped", "failed"] = "passed" else: skip_exceptions = [Skipped] unittest = sys.modules.get("unittest") if unittest is not None: - skip_exceptions.append(unittest.SkipTest) + # Type ignored because unittest is loaded dynamically. + skip_exceptions.append(unittest.SkipTest) # type: ignore if isinstance(call.excinfo.value, tuple(skip_exceptions)): outcome = "skipped" r_ = collector._repr_failure_py(call.excinfo, "line") @@ -494,13 +465,13 @@ class SetupState: def __init__(self) -> None: # The stack is in the dict insertion order. - self.stack: dict[ + self.stack: Dict[ Node, - tuple[ + Tuple[ # Node's finalizers. - list[Callable[[], object]], - # Node's exception and original traceback, if its setup raised. - tuple[OutcomeException | Exception, types.TracebackType | None] | None, + List[Callable[[], object]], + # Node's exception, if its setup raised. + Optional[Union[OutcomeException, Exception]], ], ] = {} @@ -513,7 +484,7 @@ class SetupState: for col, (finalizers, exc) in self.stack.items(): assert col in needed_collectors, "previous item was not torn down properly" if exc: - raise exc[0].with_traceback(exc[1]) + raise exc for col in needed_collectors[len(self.stack) :]: assert col not in self.stack @@ -522,8 +493,8 @@ class SetupState: try: col.setup() except TEST_OUTCOME as exc: - self.stack[col] = (self.stack[col][0], (exc, exc.__traceback__)) - raise + self.stack[col] = (self.stack[col][0], exc) + raise exc def addfinalizer(self, finalizer: Callable[[], object], node: Node) -> None: """Attach a finalizer to the given node. @@ -535,15 +506,15 @@ class SetupState: assert node in self.stack, (node, self.stack) self.stack[node][0].append(finalizer) - def teardown_exact(self, nextitem: Item | None) -> None: + def teardown_exact(self, nextitem: Optional[Item]) -> None: """Teardown the current stack up until reaching nodes that nextitem also descends from. When nextitem is None (meaning we're at the last item), the entire stack is torn down. """ - needed_collectors = (nextitem and nextitem.listchain()) or [] - exceptions: list[BaseException] = [] + needed_collectors = nextitem and nextitem.listchain() or [] + exceptions: List[BaseException] = [] while self.stack: if list(self.stack.keys()) == needed_collectors[: len(self.stack)]: break diff --git a/Backend/venv/lib/python3.12/site-packages/_pytest/scope.py b/Backend/venv/lib/python3.12/site-packages/_pytest/scope.py index 2b007e87..7a746fb9 100644 --- a/Backend/venv/lib/python3.12/site-packages/_pytest/scope.py +++ b/Backend/venv/lib/python3.12/site-packages/_pytest/scope.py @@ -7,15 +7,15 @@ would cause circular references. Also this makes the module light to import, as it should. """ - -from __future__ import annotations - from enum import Enum from functools import total_ordering -from typing import Literal +from typing import Optional +from typing import TYPE_CHECKING +if TYPE_CHECKING: + from typing_extensions import Literal -_ScopeName = Literal["session", "package", "module", "class", "function"] + _ScopeName = Literal["session", "package", "module", "class", "function"] @total_ordering @@ -33,35 +33,35 @@ class Scope(Enum): """ # Scopes need to be listed from lower to higher. - Function = "function" - Class = "class" - Module = "module" - Package = "package" - Session = "session" + Function: "_ScopeName" = "function" + Class: "_ScopeName" = "class" + Module: "_ScopeName" = "module" + Package: "_ScopeName" = "package" + Session: "_ScopeName" = "session" - def next_lower(self) -> Scope: + def next_lower(self) -> "Scope": """Return the next lower scope.""" index = _SCOPE_INDICES[self] if index == 0: raise ValueError(f"{self} is the lower-most scope") return _ALL_SCOPES[index - 1] - def next_higher(self) -> Scope: + def next_higher(self) -> "Scope": """Return the next higher scope.""" index = _SCOPE_INDICES[self] if index == len(_SCOPE_INDICES) - 1: raise ValueError(f"{self} is the upper-most scope") return _ALL_SCOPES[index + 1] - def __lt__(self, other: Scope) -> bool: + def __lt__(self, other: "Scope") -> bool: self_index = _SCOPE_INDICES[self] other_index = _SCOPE_INDICES[other] return self_index < other_index @classmethod def from_user( - cls, scope_name: _ScopeName, descr: str, where: str | None = None - ) -> Scope: + cls, scope_name: "_ScopeName", descr: str, where: Optional[str] = None + ) -> "Scope": """ Given a scope name from the user, return the equivalent Scope enum. Should be used whenever we want to convert a user provided scope name to its enum object. diff --git a/Backend/venv/lib/python3.12/site-packages/_pytest/setuponly.py b/Backend/venv/lib/python3.12/site-packages/_pytest/setuponly.py index 7e6b46bc..583590d6 100644 --- a/Backend/venv/lib/python3.12/site-packages/_pytest/setuponly.py +++ b/Backend/venv/lib/python3.12/site-packages/_pytest/setuponly.py @@ -1,7 +1,8 @@ -from __future__ import annotations - -from collections.abc import Generator +from typing import Generator +from typing import Optional +from typing import Union +import pytest from _pytest._io.saferepr import saferepr from _pytest.config import Config from _pytest.config import ExitCode @@ -9,7 +10,6 @@ from _pytest.config.argparsing import Parser from _pytest.fixtures import FixtureDef from _pytest.fixtures import SubRequest from _pytest.scope import Scope -import pytest def pytest_addoption(parser: Parser) -> None: @@ -28,42 +28,37 @@ def pytest_addoption(parser: Parser) -> None: ) -@pytest.hookimpl(wrapper=True) +@pytest.hookimpl(hookwrapper=True) def pytest_fixture_setup( fixturedef: FixtureDef[object], request: SubRequest -) -> Generator[None, object, object]: - try: - return (yield) - finally: - if request.config.option.setupshow: - if hasattr(request, "param"): - # Save the fixture parameter so ._show_fixture_action() can - # display it now and during the teardown (in .finish()). - if fixturedef.ids: - if callable(fixturedef.ids): - param = fixturedef.ids(request.param) - else: - param = fixturedef.ids[request.param_index] +) -> Generator[None, None, None]: + yield + if request.config.option.setupshow: + if hasattr(request, "param"): + # Save the fixture parameter so ._show_fixture_action() can + # display it now and during the teardown (in .finish()). + if fixturedef.ids: + if callable(fixturedef.ids): + param = fixturedef.ids(request.param) else: - param = request.param - fixturedef.cached_param = param # type: ignore[attr-defined] - _show_fixture_action(fixturedef, request.config, "SETUP") + param = fixturedef.ids[request.param_index] + else: + param = request.param + fixturedef.cached_param = param # type: ignore[attr-defined] + _show_fixture_action(fixturedef, "SETUP") -def pytest_fixture_post_finalizer( - fixturedef: FixtureDef[object], request: SubRequest -) -> None: +def pytest_fixture_post_finalizer(fixturedef: FixtureDef[object]) -> None: if fixturedef.cached_result is not None: - config = request.config + config = fixturedef._fixturemanager.config if config.option.setupshow: - _show_fixture_action(fixturedef, request.config, "TEARDOWN") + _show_fixture_action(fixturedef, "TEARDOWN") if hasattr(fixturedef, "cached_param"): - del fixturedef.cached_param + del fixturedef.cached_param # type: ignore[attr-defined] -def _show_fixture_action( - fixturedef: FixtureDef[object], config: Config, msg: str -) -> None: +def _show_fixture_action(fixturedef: FixtureDef[object], msg: str) -> None: + config = fixturedef._fixturemanager.config capman = config.pluginmanager.getplugin("capturemanager") if capman: capman.suspend_global_capture() @@ -73,9 +68,13 @@ def _show_fixture_action( # Use smaller indentation the higher the scope: Session = 0, Package = 1, etc. scope_indent = list(reversed(Scope)).index(fixturedef._scope) tw.write(" " * 2 * scope_indent) - - scopename = fixturedef.scope[0].upper() - tw.write(f"{msg:<8} {scopename} {fixturedef.argname}") + tw.write( + "{step} {scope} {fixture}".format( + step=msg.ljust(8), # align the output to TEARDOWN + scope=fixturedef.scope[0].upper(), + fixture=fixturedef.argname, + ) + ) if msg == "SETUP": deps = sorted(arg for arg in fixturedef.argnames if arg != "request") @@ -83,7 +82,7 @@ def _show_fixture_action( tw.write(" (fixtures used: {})".format(", ".join(deps))) if hasattr(fixturedef, "cached_param"): - tw.write(f"[{saferepr(fixturedef.cached_param, maxsize=42)}]") + tw.write(f"[{saferepr(fixturedef.cached_param, maxsize=42)}]") # type: ignore[attr-defined] tw.flush() @@ -92,7 +91,7 @@ def _show_fixture_action( @pytest.hookimpl(tryfirst=True) -def pytest_cmdline_main(config: Config) -> int | ExitCode | None: +def pytest_cmdline_main(config: Config) -> Optional[Union[int, ExitCode]]: if config.option.setuponly: config.option.setupshow = True return None diff --git a/Backend/venv/lib/python3.12/site-packages/_pytest/setupplan.py b/Backend/venv/lib/python3.12/site-packages/_pytest/setupplan.py index 4e124cce..1a4ebdd9 100644 --- a/Backend/venv/lib/python3.12/site-packages/_pytest/setupplan.py +++ b/Backend/venv/lib/python3.12/site-packages/_pytest/setupplan.py @@ -1,11 +1,12 @@ -from __future__ import annotations +from typing import Optional +from typing import Union +import pytest from _pytest.config import Config from _pytest.config import ExitCode from _pytest.config.argparsing import Parser from _pytest.fixtures import FixtureDef from _pytest.fixtures import SubRequest -import pytest def pytest_addoption(parser: Parser) -> None: @@ -22,7 +23,7 @@ def pytest_addoption(parser: Parser) -> None: @pytest.hookimpl(tryfirst=True) def pytest_fixture_setup( fixturedef: FixtureDef[object], request: SubRequest -) -> object | None: +) -> Optional[object]: # Will return a dummy fixture if the setuponly option is provided. if request.config.option.setupplan: my_cache_key = fixturedef.cache_key(request) @@ -32,7 +33,7 @@ def pytest_fixture_setup( @pytest.hookimpl(tryfirst=True) -def pytest_cmdline_main(config: Config) -> int | ExitCode | None: +def pytest_cmdline_main(config: Config) -> Optional[Union[int, ExitCode]]: if config.option.setupplan: config.option.setuponly = True config.option.setupshow = True diff --git a/Backend/venv/lib/python3.12/site-packages/_pytest/skipping.py b/Backend/venv/lib/python3.12/site-packages/_pytest/skipping.py index 3b067629..26ce7375 100644 --- a/Backend/venv/lib/python3.12/site-packages/_pytest/skipping.py +++ b/Backend/venv/lib/python3.12/site-packages/_pytest/skipping.py @@ -1,15 +1,14 @@ -# mypy: allow-untyped-defs """Support for skip/xfail functions and markers.""" - -from __future__ import annotations - -from collections.abc import Generator -from collections.abc import Mapping import dataclasses import os import platform import sys import traceback +from collections.abc import Mapping +from typing import Generator +from typing import Optional +from typing import Tuple +from typing import Type from _pytest.config import Config from _pytest.config import hookimpl @@ -19,9 +18,7 @@ from _pytest.nodes import Item from _pytest.outcomes import fail from _pytest.outcomes import skip from _pytest.outcomes import xfail -from _pytest.raises import AbstractRaises from _pytest.reports import BaseReport -from _pytest.reports import TestReport from _pytest.runner import CallInfo from _pytest.stash import StashKey @@ -37,13 +34,11 @@ def pytest_addoption(parser: Parser) -> None: ) parser.addini( - "strict_xfail", + "xfail_strict", "Default for the strict parameter of xfail " - "markers when not given explicitly (default: False) (alias: xfail_strict)", + "markers when not given explicitly (default: False)", + default=False, type="bool", - # None => fallback to `strict`. - default=None, - aliases=["xfail_strict"], ) @@ -76,7 +71,7 @@ def pytest_configure(config: Config) -> None: ) config.addinivalue_line( "markers", - "xfail(condition, ..., *, reason=..., run=True, raises=None, strict=strict_xfail): " + "xfail(condition, ..., *, reason=..., run=True, raises=None, strict=xfail_strict): " "mark the test function as an expected failure if any of the conditions " "evaluate to True. Optionally specify a reason for better reporting " "and run=False if you don't even want to execute the test function. " @@ -86,7 +81,7 @@ def pytest_configure(config: Config) -> None: ) -def evaluate_condition(item: Item, mark: Mark, condition: object) -> tuple[bool, str]: +def evaluate_condition(item: Item, mark: Mark, condition: object) -> Tuple[bool, str]: """Evaluate a single skipif/xfail condition. If an old-style string condition is given, it is eval()'d, otherwise the @@ -108,18 +103,20 @@ def evaluate_condition(item: Item, mark: Mark, condition: object) -> tuple[bool, ): if not isinstance(dictionary, Mapping): raise ValueError( - f"pytest_markeval_namespace() needs to return a dict, got {dictionary!r}" + "pytest_markeval_namespace() needs to return a dict, got {!r}".format( + dictionary + ) ) globals_.update(dictionary) if hasattr(item, "obj"): - globals_.update(item.obj.__globals__) + globals_.update(item.obj.__globals__) # type: ignore[attr-defined] try: filename = f"<{mark.name} condition>" condition_code = compile(condition, filename, "eval") result = eval(condition_code, globals_) except SyntaxError as exc: msglines = [ - f"Error evaluating {mark.name!r} condition", + "Error evaluating %r condition" % mark.name, " " + condition, " " + " " * (exc.offset or 0) + "^", "SyntaxError: invalid syntax", @@ -127,7 +124,7 @@ def evaluate_condition(item: Item, mark: Mark, condition: object) -> tuple[bool, fail("\n".join(msglines), pytrace=False) except Exception as exc: msglines = [ - f"Error evaluating {mark.name!r} condition", + "Error evaluating %r condition" % mark.name, " " + condition, *traceback.format_exception_only(type(exc), exc), ] @@ -139,7 +136,7 @@ def evaluate_condition(item: Item, mark: Mark, condition: object) -> tuple[bool, result = bool(condition) except Exception as exc: msglines = [ - f"Error evaluating {mark.name!r} condition as a boolean", + "Error evaluating %r condition as a boolean" % mark.name, *traceback.format_exception_only(type(exc), exc), ] fail("\n".join(msglines), pytrace=False) @@ -151,7 +148,7 @@ def evaluate_condition(item: Item, mark: Mark, condition: object) -> tuple[bool, else: # XXX better be checked at collection time msg = ( - f"Error evaluating {mark.name!r}: " + "Error evaluating %r: " % mark.name + "you need to specify reason=STRING when using booleans as conditions." ) fail(msg, pytrace=False) @@ -166,7 +163,7 @@ class Skip: reason: str = "unconditional skip" -def evaluate_skip_marks(item: Item) -> Skip | None: +def evaluate_skip_marks(item: Item) -> Optional[Skip]: """Evaluate skip and skipif marks on item, returning Skip if triggered.""" for mark in item.iter_markers(name="skipif"): if "condition" not in mark.kwargs: @@ -198,28 +195,19 @@ def evaluate_skip_marks(item: Item) -> Skip | None: class Xfail: """The result of evaluate_xfail_marks().""" - __slots__ = ("raises", "reason", "run", "strict") + __slots__ = ("reason", "run", "strict", "raises") reason: str run: bool strict: bool - raises: ( - type[BaseException] - | tuple[type[BaseException], ...] - | AbstractRaises[BaseException] - | None - ) + raises: Optional[Tuple[Type[BaseException], ...]] -def evaluate_xfail_marks(item: Item) -> Xfail | None: +def evaluate_xfail_marks(item: Item) -> Optional[Xfail]: """Evaluate xfail marks on item, returning Xfail if triggered.""" for mark in item.iter_markers(name="xfail"): run = mark.kwargs.get("run", True) - strict = mark.kwargs.get("strict") - if strict is None: - strict = item.config.getini("strict_xfail") - if strict is None: - strict = item.config.getini("strict") + strict = mark.kwargs.get("strict", item.config.getini("xfail_strict")) raises = mark.kwargs.get("raises", None) if "condition" not in mark.kwargs: conditions = mark.args @@ -241,7 +229,7 @@ def evaluate_xfail_marks(item: Item) -> Xfail | None: # Saves the xfail mark evaluation. Can be refreshed during call if None. -xfailed_key = StashKey[Xfail | None]() +xfailed_key = StashKey[Optional[Xfail]]() @hookimpl(tryfirst=True) @@ -255,8 +243,8 @@ def pytest_runtest_setup(item: Item) -> None: xfail("[NOTRUN] " + xfailed.reason) -@hookimpl(wrapper=True) -def pytest_runtest_call(item: Item) -> Generator[None]: +@hookimpl(hookwrapper=True) +def pytest_runtest_call(item: Item) -> Generator[None, None, None]: xfailed = item.stash.get(xfailed_key, None) if xfailed is None: item.stash[xfailed_key] = xfailed = evaluate_xfail_marks(item) @@ -264,44 +252,33 @@ def pytest_runtest_call(item: Item) -> Generator[None]: if xfailed and not item.config.option.runxfail and not xfailed.run: xfail("[NOTRUN] " + xfailed.reason) - try: - return (yield) - finally: - # The test run may have added an xfail mark dynamically. - xfailed = item.stash.get(xfailed_key, None) - if xfailed is None: - item.stash[xfailed_key] = xfailed = evaluate_xfail_marks(item) + yield + + # The test run may have added an xfail mark dynamically. + xfailed = item.stash.get(xfailed_key, None) + if xfailed is None: + item.stash[xfailed_key] = xfailed = evaluate_xfail_marks(item) -@hookimpl(wrapper=True) -def pytest_runtest_makereport( - item: Item, call: CallInfo[None] -) -> Generator[None, TestReport, TestReport]: - rep = yield +@hookimpl(hookwrapper=True) +def pytest_runtest_makereport(item: Item, call: CallInfo[None]): + outcome = yield + rep = outcome.get_result() xfailed = item.stash.get(xfailed_key, None) if item.config.option.runxfail: pass # don't interfere elif call.excinfo and isinstance(call.excinfo.value, xfail.Exception): assert call.excinfo.value.msg is not None - rep.wasxfail = call.excinfo.value.msg + rep.wasxfail = "reason: " + call.excinfo.value.msg rep.outcome = "skipped" elif not rep.skipped and xfailed: if call.excinfo: raises = xfailed.raises - if raises is None or ( - ( - isinstance(raises, type | tuple) - and isinstance(call.excinfo.value, raises) - ) - or ( - isinstance(raises, AbstractRaises) - and raises.matches(call.excinfo.value) - ) - ): + if raises is not None and not isinstance(call.excinfo.value, raises): + rep.outcome = "failed" + else: rep.outcome = "skipped" rep.wasxfail = xfailed.reason - else: - rep.outcome = "failed" elif call.when == "call": if xfailed.strict: rep.outcome = "failed" @@ -309,10 +286,9 @@ def pytest_runtest_makereport( else: rep.outcome = "passed" rep.wasxfail = xfailed.reason - return rep -def pytest_report_teststatus(report: BaseReport) -> tuple[str, str, str] | None: +def pytest_report_teststatus(report: BaseReport) -> Optional[Tuple[str, str, str]]: if hasattr(report, "wasxfail"): if report.skipped: return "xfailed", "x", "XFAIL" diff --git a/Backend/venv/lib/python3.12/site-packages/_pytest/stash.py b/Backend/venv/lib/python3.12/site-packages/_pytest/stash.py index 6a9ff884..e61d75b9 100644 --- a/Backend/venv/lib/python3.12/site-packages/_pytest/stash.py +++ b/Backend/venv/lib/python3.12/site-packages/_pytest/stash.py @@ -1,9 +1,9 @@ -from __future__ import annotations - from typing import Any from typing import cast +from typing import Dict from typing import Generic from typing import TypeVar +from typing import Union __all__ = ["Stash", "StashKey"] @@ -19,8 +19,6 @@ class StashKey(Generic[T]): A ``StashKey`` is associated with the type ``T`` of the value of the key. A ``StashKey`` is unique and cannot conflict with another key. - - .. versionadded:: 7.0 """ __slots__ = () @@ -63,14 +61,12 @@ class Stash: some_str = stash[some_str_key] # The static type of some_bool is bool. some_bool = stash[some_bool_key] - - .. versionadded:: 7.0 """ __slots__ = ("_storage",) def __init__(self) -> None: - self._storage: dict[StashKey[Any], object] = {} + self._storage: Dict[StashKey[Any], object] = {} def __setitem__(self, key: StashKey[T], value: T) -> None: """Set a value for key.""" @@ -83,7 +79,7 @@ class Stash: """ return cast(T, self._storage[key]) - def get(self, key: StashKey[T], default: D) -> T | D: + def get(self, key: StashKey[T], default: D) -> Union[T, D]: """Get the value for key, or return default if the key wasn't set before.""" try: diff --git a/Backend/venv/lib/python3.12/site-packages/_pytest/stepwise.py b/Backend/venv/lib/python3.12/site-packages/_pytest/stepwise.py index 8901540e..74ad9dbd 100644 --- a/Backend/venv/lib/python3.12/site-packages/_pytest/stepwise.py +++ b/Backend/venv/lib/python3.12/site-packages/_pytest/stepwise.py @@ -1,21 +1,16 @@ -from __future__ import annotations - -import dataclasses -from datetime import datetime -from datetime import timedelta -from typing import Any +from typing import List +from typing import Optional from typing import TYPE_CHECKING +import pytest from _pytest import nodes -from _pytest.cacheprovider import Cache from _pytest.config import Config from _pytest.config.argparsing import Parser from _pytest.main import Session from _pytest.reports import TestReport - if TYPE_CHECKING: - from typing_extensions import Self + from _pytest.cacheprovider import Cache STEPWISE_CACHE_DIR = "cache/stepwise" @@ -39,20 +34,12 @@ def pytest_addoption(parser: Parser) -> None: help="Ignore the first failing test but stop on the next failing test. " "Implicitly enables --stepwise.", ) - group.addoption( - "--sw-reset", - "--stepwise-reset", - action="store_true", - default=False, - dest="stepwise_reset", - help="Resets stepwise state, restarting the stepwise workflow. " - "Implicitly enables --stepwise.", - ) +@pytest.hookimpl def pytest_configure(config: Config) -> None: - # --stepwise-skip/--stepwise-reset implies stepwise. - if config.option.stepwise_skip or config.option.stepwise_reset: + if config.option.stepwise_skip: + # allow --stepwise-skip to work on it's own merits. config.option.stepwise = True if config.getoption("stepwise"): config.pluginmanager.register(StepwisePlugin(config), "stepwiseplugin") @@ -65,108 +52,43 @@ def pytest_sessionfinish(session: Session) -> None: # Do not update cache if this process is a xdist worker to prevent # race conditions (#10641). return - - -@dataclasses.dataclass -class StepwiseCacheInfo: - # The nodeid of the last failed test. - last_failed: str | None - - # The number of tests in the last time --stepwise was run. - # We use this information as a simple way to invalidate the cache information, avoiding - # confusing behavior in case the cache is stale. - last_test_count: int | None - - # The date when the cache was last updated, for information purposes only. - last_cache_date_str: str - - @property - def last_cache_date(self) -> datetime: - return datetime.fromisoformat(self.last_cache_date_str) - - @classmethod - def empty(cls) -> Self: - return cls( - last_failed=None, - last_test_count=None, - last_cache_date_str=datetime.now().isoformat(), - ) - - def update_date_to_now(self) -> None: - self.last_cache_date_str = datetime.now().isoformat() + # Clear the list of failing tests if the plugin is not active. + session.config.cache.set(STEPWISE_CACHE_DIR, []) class StepwisePlugin: def __init__(self, config: Config) -> None: self.config = config - self.session: Session | None = None - self.report_status: list[str] = [] + self.session: Optional[Session] = None + self.report_status = "" assert config.cache is not None self.cache: Cache = config.cache + self.lastfailed: Optional[str] = self.cache.get(STEPWISE_CACHE_DIR, None) self.skip: bool = config.getoption("stepwise_skip") - self.reset: bool = config.getoption("stepwise_reset") - self.cached_info = self._load_cached_info() - - def _load_cached_info(self) -> StepwiseCacheInfo: - cached_dict: dict[str, Any] | None = self.cache.get(STEPWISE_CACHE_DIR, None) - if cached_dict: - try: - return StepwiseCacheInfo( - cached_dict["last_failed"], - cached_dict["last_test_count"], - cached_dict["last_cache_date_str"], - ) - except (KeyError, TypeError) as e: - error = f"{type(e).__name__}: {e}" - self.report_status.append(f"error reading cache, discarding ({error})") - - # Cache not found or error during load, return a new cache. - return StepwiseCacheInfo.empty() def pytest_sessionstart(self, session: Session) -> None: self.session = session def pytest_collection_modifyitems( - self, config: Config, items: list[nodes.Item] + self, config: Config, items: List[nodes.Item] ) -> None: - last_test_count = self.cached_info.last_test_count - self.cached_info.last_test_count = len(items) - - if self.reset: - self.report_status.append("resetting state, not skipping.") - self.cached_info.last_failed = None + if not self.lastfailed: + self.report_status = "no previously failed tests, not skipping." return - if not self.cached_info.last_failed: - self.report_status.append("no previously failed tests, not skipping.") - return - - if last_test_count is not None and last_test_count != len(items): - self.report_status.append( - f"test count changed, not skipping (now {len(items)} tests, previously {last_test_count})." - ) - self.cached_info.last_failed = None - return - - # Check all item nodes until we find a match on last failed. + # check all item nodes until we find a match on last failed failed_index = None for index, item in enumerate(items): - if item.nodeid == self.cached_info.last_failed: + if item.nodeid == self.lastfailed: failed_index = index break # If the previously failed test was not found among the test items, # do not skip any tests. if failed_index is None: - self.report_status.append("previously failed test not found, not skipping.") + self.report_status = "previously failed test not found, not skipping." else: - cache_age = datetime.now() - self.cached_info.last_cache_date - # Round up to avoid showing microseconds. - cache_age = timedelta(seconds=int(cache_age.total_seconds())) - self.report_status.append( - f"skipping {failed_index} already passed items (cache from {cache_age} ago," - f" use --sw-reset to discard)." - ) + self.report_status = f"skipping {failed_index} already passed items." deselected = items[:failed_index] del items[:failed_index] config.hook.pytest_deselected(items=deselected) @@ -176,13 +98,13 @@ class StepwisePlugin: if self.skip: # Remove test from the failed ones (if it exists) and unset the skip option # to make sure the following tests will not be skipped. - if report.nodeid == self.cached_info.last_failed: - self.cached_info.last_failed = None + if report.nodeid == self.lastfailed: + self.lastfailed = None self.skip = False else: # Mark test as the last failing and interrupt the test session. - self.cached_info.last_failed = report.nodeid + self.lastfailed = report.nodeid assert self.session is not None self.session.shouldstop = ( "Test failed, continuing from this test next run." @@ -192,12 +114,12 @@ class StepwisePlugin: # If the test was actually run and did pass. if report.when == "call": # Remove test from the failed ones, if exists. - if report.nodeid == self.cached_info.last_failed: - self.cached_info.last_failed = None + if report.nodeid == self.lastfailed: + self.lastfailed = None - def pytest_report_collectionfinish(self) -> list[str] | None: - if self.config.get_verbosity() >= 0 and self.report_status: - return [f"stepwise: {x}" for x in self.report_status] + def pytest_report_collectionfinish(self) -> Optional[str]: + if self.config.getoption("verbose") >= 0 and self.report_status: + return f"stepwise: {self.report_status}" return None def pytest_sessionfinish(self) -> None: @@ -205,5 +127,4 @@ class StepwisePlugin: # Do not update cache if this process is a xdist worker to prevent # race conditions (#10641). return - self.cached_info.update_date_to_now() - self.cache.set(STEPWISE_CACHE_DIR, dataclasses.asdict(self.cached_info)) + self.cache.set(STEPWISE_CACHE_DIR, self.lastfailed) diff --git a/Backend/venv/lib/python3.12/site-packages/_pytest/subtests.py b/Backend/venv/lib/python3.12/site-packages/_pytest/subtests.py deleted file mode 100644 index e0ceb27f..00000000 --- a/Backend/venv/lib/python3.12/site-packages/_pytest/subtests.py +++ /dev/null @@ -1,411 +0,0 @@ -"""Builtin plugin that adds subtests support.""" - -from __future__ import annotations - -from collections import defaultdict -from collections.abc import Callable -from collections.abc import Iterator -from collections.abc import Mapping -from contextlib import AbstractContextManager -from contextlib import contextmanager -from contextlib import ExitStack -from contextlib import nullcontext -import dataclasses -import time -from types import TracebackType -from typing import Any -from typing import TYPE_CHECKING - -import pluggy - -from _pytest._code import ExceptionInfo -from _pytest._io.saferepr import saferepr -from _pytest.capture import CaptureFixture -from _pytest.capture import FDCapture -from _pytest.capture import SysCapture -from _pytest.config import Config -from _pytest.config import hookimpl -from _pytest.config.argparsing import Parser -from _pytest.deprecated import check_ispytest -from _pytest.fixtures import fixture -from _pytest.fixtures import SubRequest -from _pytest.logging import catching_logs -from _pytest.logging import LogCaptureHandler -from _pytest.logging import LoggingPlugin -from _pytest.reports import TestReport -from _pytest.runner import CallInfo -from _pytest.runner import check_interactive_exception -from _pytest.runner import get_reraise_exceptions -from _pytest.stash import StashKey - - -if TYPE_CHECKING: - from typing_extensions import Self - - -def pytest_addoption(parser: Parser) -> None: - Config._add_verbosity_ini( - parser, - Config.VERBOSITY_SUBTESTS, - help=( - "Specify verbosity level for subtests. " - "Higher levels will generate output for passed subtests. Failed subtests are always reported." - ), - ) - - -@dataclasses.dataclass(frozen=True, slots=True, kw_only=True) -class SubtestContext: - """The values passed to Subtests.test() that are included in the test report.""" - - msg: str | None - kwargs: Mapping[str, Any] - - def _to_json(self) -> dict[str, Any]: - return dataclasses.asdict(self) - - @classmethod - def _from_json(cls, d: dict[str, Any]) -> Self: - return cls(msg=d["msg"], kwargs=d["kwargs"]) - - -@dataclasses.dataclass(init=False) -class SubtestReport(TestReport): - context: SubtestContext - - @property - def head_line(self) -> str: - _, _, domain = self.location - return f"{domain} {self._sub_test_description()}" - - def _sub_test_description(self) -> str: - parts = [] - if self.context.msg is not None: - parts.append(f"[{self.context.msg}]") - if self.context.kwargs: - params_desc = ", ".join( - f"{k}={saferepr(v)}" for (k, v) in self.context.kwargs.items() - ) - parts.append(f"({params_desc})") - return " ".join(parts) or "()" - - def _to_json(self) -> dict[str, Any]: - data = super()._to_json() - del data["context"] - data["_report_type"] = "SubTestReport" - data["_subtest.context"] = self.context._to_json() - return data - - @classmethod - def _from_json(cls, reportdict: dict[str, Any]) -> SubtestReport: - report = super()._from_json(reportdict) - report.context = SubtestContext._from_json(reportdict["_subtest.context"]) - return report - - @classmethod - def _new( - cls, - test_report: TestReport, - context: SubtestContext, - captured_output: Captured | None, - captured_logs: CapturedLogs | None, - ) -> Self: - result = super()._from_json(test_report._to_json()) - result.context = context - - if captured_output: - if captured_output.out: - result.sections.append(("Captured stdout call", captured_output.out)) - if captured_output.err: - result.sections.append(("Captured stderr call", captured_output.err)) - - if captured_logs and (log := captured_logs.handler.stream.getvalue()): - result.sections.append(("Captured log call", log)) - - return result - - -@fixture -def subtests(request: SubRequest) -> Subtests: - """Provides subtests functionality.""" - capmam = request.node.config.pluginmanager.get_plugin("capturemanager") - suspend_capture_ctx = ( - capmam.global_and_fixture_disabled if capmam is not None else nullcontext - ) - return Subtests(request.node.ihook, suspend_capture_ctx, request, _ispytest=True) - - -class Subtests: - """Subtests fixture, enables declaring subtests inside test functions via the :meth:`test` method.""" - - def __init__( - self, - ihook: pluggy.HookRelay, - suspend_capture_ctx: Callable[[], AbstractContextManager[None]], - request: SubRequest, - *, - _ispytest: bool = False, - ) -> None: - check_ispytest(_ispytest) - self._ihook = ihook - self._suspend_capture_ctx = suspend_capture_ctx - self._request = request - - def test( - self, - msg: str | None = None, - **kwargs: Any, - ) -> _SubTestContextManager: - """ - Context manager for subtests, capturing exceptions raised inside the subtest scope and - reporting assertion failures and errors individually. - - Usage - ----- - - .. code-block:: python - - def test(subtests): - for i in range(5): - with subtests.test("custom message", i=i): - assert i % 2 == 0 - - :param msg: - If given, the message will be shown in the test report in case of subtest failure. - - :param kwargs: - Arbitrary values that are also added to the subtest report. - """ - return _SubTestContextManager( - self._ihook, - msg, - kwargs, - request=self._request, - suspend_capture_ctx=self._suspend_capture_ctx, - config=self._request.config, - ) - - -@dataclasses.dataclass -class _SubTestContextManager: - """ - Context manager for subtests, capturing exceptions raised inside the subtest scope and handling - them through the pytest machinery. - """ - - # Note: initially the logic for this context manager was implemented directly - # in Subtests.test() as a @contextmanager, however, it is not possible to control the output fully when - # exiting from it due to an exception when in `--exitfirst` mode, so this was refactored into an - # explicit context manager class (pytest-dev/pytest-subtests#134). - - ihook: pluggy.HookRelay - msg: str | None - kwargs: dict[str, Any] - suspend_capture_ctx: Callable[[], AbstractContextManager[None]] - request: SubRequest - config: Config - - def __enter__(self) -> None: - __tracebackhide__ = True - - self._start = time.time() - self._precise_start = time.perf_counter() - self._exc_info = None - - self._exit_stack = ExitStack() - self._captured_output = self._exit_stack.enter_context( - capturing_output(self.request) - ) - self._captured_logs = self._exit_stack.enter_context( - capturing_logs(self.request) - ) - - def __exit__( - self, - exc_type: type[BaseException] | None, - exc_val: BaseException | None, - exc_tb: TracebackType | None, - ) -> bool: - __tracebackhide__ = True - if exc_val is not None: - exc_info = ExceptionInfo.from_exception(exc_val) - else: - exc_info = None - - self._exit_stack.close() - - precise_stop = time.perf_counter() - duration = precise_stop - self._precise_start - stop = time.time() - - call_info = CallInfo[None]( - None, - exc_info, - start=self._start, - stop=stop, - duration=duration, - when="call", - _ispytest=True, - ) - report = self.ihook.pytest_runtest_makereport( - item=self.request.node, call=call_info - ) - sub_report = SubtestReport._new( - report, - SubtestContext(msg=self.msg, kwargs=self.kwargs), - captured_output=self._captured_output, - captured_logs=self._captured_logs, - ) - - if sub_report.failed: - failed_subtests = self.config.stash[failed_subtests_key] - failed_subtests[self.request.node.nodeid] += 1 - - with self.suspend_capture_ctx(): - self.ihook.pytest_runtest_logreport(report=sub_report) - - if check_interactive_exception(call_info, sub_report): - self.ihook.pytest_exception_interact( - node=self.request.node, call=call_info, report=sub_report - ) - - if exc_val is not None: - if isinstance(exc_val, get_reraise_exceptions(self.config)): - return False - if self.request.session.shouldfail: - return False - return True - - -@contextmanager -def capturing_output(request: SubRequest) -> Iterator[Captured]: - option = request.config.getoption("capture", None) - - capman = request.config.pluginmanager.getplugin("capturemanager") - if getattr(capman, "_capture_fixture", None): - # capsys or capfd are active, subtest should not capture. - fixture = None - elif option == "sys": - fixture = CaptureFixture(SysCapture, request, _ispytest=True) - elif option == "fd": - fixture = CaptureFixture(FDCapture, request, _ispytest=True) - else: - fixture = None - - if fixture is not None: - fixture._start() - - captured = Captured() - try: - yield captured - finally: - if fixture is not None: - out, err = fixture.readouterr() - fixture.close() - captured.out = out - captured.err = err - - -@contextmanager -def capturing_logs( - request: SubRequest, -) -> Iterator[CapturedLogs | None]: - logging_plugin: LoggingPlugin | None = request.config.pluginmanager.getplugin( - "logging-plugin" - ) - if logging_plugin is None: - yield None - else: - handler = LogCaptureHandler() - handler.setFormatter(logging_plugin.formatter) - - captured_logs = CapturedLogs(handler) - with catching_logs(handler, level=logging_plugin.log_level): - yield captured_logs - - -@dataclasses.dataclass -class Captured: - out: str = "" - err: str = "" - - -@dataclasses.dataclass -class CapturedLogs: - handler: LogCaptureHandler - - -def pytest_report_to_serializable(report: TestReport) -> dict[str, Any] | None: - if isinstance(report, SubtestReport): - return report._to_json() - return None - - -def pytest_report_from_serializable(data: dict[str, Any]) -> SubtestReport | None: - if data.get("_report_type") == "SubTestReport": - return SubtestReport._from_json(data) - return None - - -# Dict of nodeid -> number of failed subtests. -# Used to fail top-level tests that passed but contain failed subtests. -failed_subtests_key = StashKey[defaultdict[str, int]]() - - -def pytest_configure(config: Config) -> None: - config.stash[failed_subtests_key] = defaultdict(lambda: 0) - - -@hookimpl(tryfirst=True) -def pytest_report_teststatus( - report: TestReport, - config: Config, -) -> tuple[str, str, str | Mapping[str, bool]] | None: - if report.when != "call": - return None - - quiet = config.get_verbosity(Config.VERBOSITY_SUBTESTS) == 0 - if isinstance(report, SubtestReport): - outcome = report.outcome - description = report._sub_test_description() - - if hasattr(report, "wasxfail"): - if quiet: - return "", "", "" - elif outcome == "skipped": - category = "xfailed" - short = "y" # x letter is used for regular xfail, y for subtest xfail - status = "SUBXFAIL" - # outcome == "passed" in an xfail is only possible via a @pytest.mark.xfail mark, which - # is not applicable to a subtest, which only handles pytest.xfail(). - else: # pragma: no cover - # This should not normally happen, unless some plugin is setting wasxfail without - # the correct outcome. Pytest expects the call outcome to be either skipped or - # passed in case of xfail. - # Let's pass this report to the next hook. - return None - return category, short, f"{status}{description}" - - if report.failed: - return outcome, "u", f"SUBFAILED{description}" - else: - if report.passed: - if quiet: - return "", "", "" - else: - return f"subtests {outcome}", "u", f"SUBPASSED{description}" - elif report.skipped: - if quiet: - return "", "", "" - else: - return outcome, "-", f"SUBSKIPPED{description}" - - else: - failed_subtests_count = config.stash[failed_subtests_key][report.nodeid] - # Top-level test, fail if it contains failed subtests and it has passed. - if report.passed and failed_subtests_count > 0: - report.outcome = "failed" - suffix = "s" if failed_subtests_count > 1 else "" - report.longrepr = f"contains {failed_subtests_count} failed subtest{suffix}" - - return None diff --git a/Backend/venv/lib/python3.12/site-packages/_pytest/terminal.py b/Backend/venv/lib/python3.12/site-packages/_pytest/terminal.py index 4517b05b..b0cdb58c 100644 --- a/Backend/venv/lib/python3.12/site-packages/_pytest/terminal.py +++ b/Backend/venv/lib/python3.12/site-packages/_pytest/terminal.py @@ -1,46 +1,46 @@ -# mypy: allow-untyped-defs """Terminal reporting of the full testing process. This is a good source for looking at the various reporting hooks. """ - -from __future__ import annotations - import argparse -from collections import Counter -from collections.abc import Callable -from collections.abc import Generator -from collections.abc import Mapping -from collections.abc import Sequence import dataclasses import datetime -from functools import partial import inspect -import os -from pathlib import Path import platform import sys import textwrap -from typing import Any -from typing import ClassVar -from typing import final -from typing import Literal -from typing import NamedTuple -from typing import TextIO -from typing import TYPE_CHECKING import warnings +from collections import Counter +from functools import partial +from pathlib import Path +from typing import Any +from typing import Callable +from typing import cast +from typing import ClassVar +from typing import Dict +from typing import Generator +from typing import List +from typing import Mapping +from typing import NamedTuple +from typing import Optional +from typing import Sequence +from typing import Set +from typing import TextIO +from typing import Tuple +from typing import TYPE_CHECKING +from typing import Union import pluggy -from _pytest import compat +import _pytest._version from _pytest import nodes from _pytest import timing from _pytest._code import ExceptionInfo from _pytest._code.code import ExceptionRepr from _pytest._io import TerminalWriter from _pytest._io.wcwidth import wcswidth -import _pytest._version -from _pytest.compat import running_on_ci +from _pytest.assertion.util import running_on_ci +from _pytest.compat import final from _pytest.config import _PluggyPlugin from _pytest.config import Config from _pytest.config import ExitCode @@ -54,8 +54,9 @@ from _pytest.reports import BaseReport from _pytest.reports import CollectReport from _pytest.reports import TestReport - if TYPE_CHECKING: + from typing_extensions import Literal + from _pytest.main import Session @@ -70,9 +71,6 @@ KNOWN_TYPES = ( "xpassed", "warnings", "error", - "subtests passed", - "subtests failed", - "subtests skipped", ) _REPORTCHARS_DEFAULT = "fE" @@ -91,7 +89,7 @@ class MoreQuietAction(argparse.Action): dest: str, default: object = None, required: bool = False, - help: str | None = None, + help: Optional[str] = None, ) -> None: super().__init__( option_strings=option_strings, @@ -106,8 +104,8 @@ class MoreQuietAction(argparse.Action): self, parser: argparse.ArgumentParser, namespace: argparse.Namespace, - values: str | Sequence[object] | None, - option_string: str | None = None, + values: Union[str, Sequence[object], None], + option_string: Optional[str] = None, ) -> None: new_count = getattr(namespace, self.dest, 0) - 1 setattr(namespace, self.dest, new_count) @@ -132,12 +130,12 @@ class TestShortLogReport(NamedTuple): category: str letter: str - word: str | tuple[str, Mapping[str, bool]] + word: Union[str, Tuple[str, Mapping[str, bool]]] def pytest_addoption(parser: Parser) -> None: group = parser.getgroup("terminal reporting", "Reporting", after="general") - group._addoption( # private to use reserved lower-case short option + group._addoption( "-v", "--verbose", action="count", @@ -145,35 +143,21 @@ def pytest_addoption(parser: Parser) -> None: dest="verbose", help="Increase verbosity", ) - group.addoption( + group._addoption( "--no-header", action="store_true", default=False, dest="no_header", help="Disable header", ) - group.addoption( + group._addoption( "--no-summary", action="store_true", default=False, dest="no_summary", help="Disable summary", ) - group.addoption( - "--no-fold-skipped", - action="store_false", - dest="fold_skipped", - default=True, - help="Do not fold skipped tests in short summary.", - ) - group.addoption( - "--force-short-summary", - action="store_true", - dest="force_short_summary", - default=False, - help="Force condensed summary output regardless of verbosity level.", - ) - group._addoption( # private to use reserved lower-case short option + group._addoption( "-q", "--quiet", action=MoreQuietAction, @@ -181,14 +165,14 @@ def pytest_addoption(parser: Parser) -> None: dest="verbose", help="Decrease verbosity", ) - group.addoption( + group._addoption( "--verbosity", dest="verbose", type=int, default=0, help="Set verbosity. Default: 0.", ) - group._addoption( # private to use reserved lower-case short option + group._addoption( "-r", action="store", dest="reportchars", @@ -200,7 +184,7 @@ def pytest_addoption(parser: Parser) -> None: "(w)arnings are enabled by default (see --disable-warnings), " "'N' can be used to reset the list. (default: 'fE').", ) - group.addoption( + group._addoption( "--disable-warnings", "--disable-pytest-warnings", default=False, @@ -208,7 +192,7 @@ def pytest_addoption(parser: Parser) -> None: action="store_true", help="Disable warnings summary", ) - group._addoption( # private to use reserved lower-case short option + group._addoption( "-l", "--showlocals", action="store_true", @@ -216,13 +200,13 @@ def pytest_addoption(parser: Parser) -> None: default=False, help="Show locals in tracebacks (disabled by default)", ) - group.addoption( + group._addoption( "--no-showlocals", action="store_false", dest="showlocals", help="Hide locals in tracebacks (negate --showlocals passed through addopts)", ) - group.addoption( + group._addoption( "--tb", metavar="style", action="store", @@ -231,14 +215,7 @@ def pytest_addoption(parser: Parser) -> None: choices=["auto", "long", "short", "no", "line", "native"], help="Traceback print mode (auto/long/short/line/native/no)", ) - group.addoption( - "--xfail-tb", - action="store_true", - dest="xfail_tb", - default=False, - help="Show tracebacks for xfail (as long as --tb != no)", - ) - group.addoption( + group._addoption( "--show-capture", action="store", dest="showcapture", @@ -247,14 +224,14 @@ def pytest_addoption(parser: Parser) -> None: help="Controls how captured stdout/stderr/log is shown on failed tests. " "Default: all.", ) - group.addoption( + group._addoption( "--fulltrace", "--full-trace", action="store_true", default=False, help="Don't cut any tracebacks (default is to cut)", ) - group.addoption( + group._addoption( "--color", metavar="color", action="store", @@ -263,7 +240,7 @@ def pytest_addoption(parser: Parser) -> None: choices=["yes", "no", "auto"], help="Color terminal output (yes/no/auto)", ) - group.addoption( + group._addoption( "--code-highlight", default="yes", choices=["yes", "no"], @@ -278,14 +255,6 @@ def pytest_addoption(parser: Parser) -> None: "progress even when capture=no)", default="progress", ) - Config._add_verbosity_ini( - parser, - Config.VERBOSITY_TEST_CASES, - help=( - "Specify a verbosity level for test case execution, overriding the main level. " - "Higher levels will provide more detailed information about each test case executed." - ), - ) def pytest_configure(config: Config) -> None: @@ -299,17 +268,6 @@ def pytest_configure(config: Config) -> None: config.trace.root.setprocessor("pytest:config", mywriter) - if reporter.isatty(): - # Some terminals interpret OSC 9;4 as desktop notification, - # skip on those we know (#13896). - should_skip_terminal_progress = ( - # iTerm2 (reported on version 3.6.5). - "ITERM_SESSION_ID" in os.environ - ) - if not should_skip_terminal_progress: - plugin = TerminalProgressPlugin(reporter) - config.pluginmanager.register(plugin, "terminalprogress") - def getreportopt(config: Config) -> str: reportchars: str = config.option.reportchars @@ -337,7 +295,7 @@ def getreportopt(config: Config) -> str: @hookimpl(trylast=True) # after _pytest.runner -def pytest_report_teststatus(report: BaseReport) -> tuple[str, str, str]: +def pytest_report_teststatus(report: BaseReport) -> Tuple[str, str, str]: letter = "F" if report.passed: letter = "." @@ -365,12 +323,12 @@ class WarningReport: """ message: str - nodeid: str | None = None - fslocation: tuple[str, int] | None = None + nodeid: Optional[str] = None + fslocation: Optional[Tuple[str, int]] = None count_towards_summary: ClassVar = True - def get_location(self, config: Config) -> str | None: + def get_location(self, config: Config) -> Optional[str]: """Return the more user-friendly information about the location of a warning, or None.""" if self.nodeid: return self.nodeid @@ -383,39 +341,33 @@ class WarningReport: @final class TerminalReporter: - def __init__(self, config: Config, file: TextIO | None = None) -> None: + def __init__(self, config: Config, file: Optional[TextIO] = None) -> None: import _pytest.config self.config = config self._numcollected = 0 - self._session: Session | None = None - self._showfspath: bool | None = None + self._session: Optional[Session] = None + self._showfspath: Optional[bool] = None - self.stats: dict[str, list[Any]] = {} - self._main_color: str | None = None - self._known_types: list[str] | None = None + self.stats: Dict[str, List[Any]] = {} + self._main_color: Optional[str] = None + self._known_types: Optional[List[str]] = None self.startpath = config.invocation_params.dir if file is None: file = sys.stdout self._tw = _pytest.config.create_terminal_writer(config, file) self._screen_width = self._tw.fullwidth - self.currentfspath: None | Path | str | int = None + self.currentfspath: Union[None, Path, str, int] = None self.reportchars = getreportopt(config) - self.foldskipped = config.option.fold_skipped self.hasmarkup = self._tw.hasmarkup - # isatty should be a method but was wrongly implemented as a boolean. - # We use CallableBool here to support both. - self.isatty = compat.CallableBool(file.isatty()) - self._progress_nodeids_reported: set[str] = set() - self._timing_nodeids_reported: set[str] = set() + self.isatty = file.isatty() + self._progress_nodeids_reported: Set[str] = set() self._show_progress_info = self._determine_show_progress_info() - self._collect_report_last_write = timing.Instant() - self._already_displayed_warnings: int | None = None - self._keyboardinterrupt_memo: ExceptionRepr | None = None + self._collect_report_last_write: Optional[float] = None + self._already_displayed_warnings: Optional[int] = None + self._keyboardinterrupt_memo: Optional[ExceptionRepr] = None - def _determine_show_progress_info( - self, - ) -> Literal["progress", "count", "times", False]: + def _determine_show_progress_info(self) -> "Literal['progress', 'count', False]": """Return whether we should display progress information based on the current config.""" # do not show progress if we are not capturing output (#3038) unless explicitly # overridden by progress-even-when-capture-no @@ -429,12 +381,10 @@ class TerminalReporter: if self.config.getoption("setupshow", False): return False cfg: str = self.config.getini("console_output_style") - if cfg in {"progress", "progress-even-when-capture-no"}: + if cfg == "progress" or cfg == "progress-even-when-capture-no": return "progress" elif cfg == "count": return "count" - elif cfg == "times": - return "times" else: return False @@ -458,30 +408,22 @@ class TerminalReporter: @property def showfspath(self) -> bool: if self._showfspath is None: - return self.config.get_verbosity(Config.VERBOSITY_TEST_CASES) >= 0 + return self.verbosity >= 0 return self._showfspath @showfspath.setter - def showfspath(self, value: bool | None) -> None: + def showfspath(self, value: Optional[bool]) -> None: self._showfspath = value @property def showlongtestinfo(self) -> bool: - return self.config.get_verbosity(Config.VERBOSITY_TEST_CASES) > 0 - - @property - def reported_progress(self) -> int: - """The amount of items reported in the progress so far. - - :meta private: - """ - return len(self._progress_nodeids_reported) + return self.verbosity > 0 def hasopt(self, char: str) -> bool: char = {"xfailed": "x", "skipped": "s"}.get(char, char) return char in self.reportchars - def write_fspath_result(self, nodeid: str, res: str, **markup: bool) -> None: + def write_fspath_result(self, nodeid: str, res, **markup: bool) -> None: fspath = self.config.rootpath / nodeid.split("::")[0] if self.currentfspath is None or fspath != self.currentfspath: if self.currentfspath is not None and self._show_progress_info: @@ -531,13 +473,10 @@ class TerminalReporter: def write(self, content: str, *, flush: bool = False, **markup: bool) -> None: self._tw.write(content, flush=flush, **markup) - def write_raw(self, content: str, *, flush: bool = False) -> None: - self._tw.write_raw(content, flush=flush) - def flush(self) -> None: self._tw.flush() - def write_line(self, line: str | bytes, **markup: bool) -> None: + def write_line(self, line: Union[str, bytes], **markup: bool) -> None: if not isinstance(line, str): line = str(line, errors="replace") self.ensure_newline() @@ -564,8 +503,8 @@ class TerminalReporter: def write_sep( self, sep: str, - title: str | None = None, - fullwidth: int | None = None, + title: Optional[str] = None, + fullwidth: Optional[int] = None, **markup: bool, ) -> None: self.ensure_newline() @@ -615,13 +554,12 @@ class TerminalReporter: self._add_stats("deselected", items) def pytest_runtest_logstart( - self, nodeid: str, location: tuple[str, int | None, str] + self, nodeid: str, location: Tuple[str, Optional[int], str] ) -> None: - fspath, lineno, domain = location # Ensure that the path is printed before the # 1st test of a module starts running. if self.showlongtestinfo: - line = self._locationline(nodeid, fspath, lineno, domain) + line = self._locationline(nodeid, *location) self.write_ensure_prefix(line, "") self.flush() elif self.showfspath: @@ -644,6 +582,7 @@ class TerminalReporter: if not letter and not word: # Probably passed setup/teardown. return + running_xdist = hasattr(rep, "node") if markup is None: was_xfail = hasattr(report, "wasxfail") if rep.passed and not was_xfail: @@ -656,25 +595,16 @@ class TerminalReporter: markup = {"yellow": True} else: markup = {} - self._progress_nodeids_reported.add(rep.nodeid) - if self.config.get_verbosity(Config.VERBOSITY_TEST_CASES) <= 0: + if self.verbosity <= 0: self._tw.write(letter, **markup) - # When running in xdist, the logreport and logfinish of multiple - # items are interspersed, e.g. `logreport`, `logreport`, - # `logfinish`, `logfinish`. To avoid the "past edge" calculation - # from getting confused and overflowing (#7166), do the past edge - # printing here and not in logfinish, except for the 100% which - # should only be printed after all teardowns are finished. - if self._show_progress_info and not self._is_last_item: - self._write_progress_information_if_past_edge() else: + self._progress_nodeids_reported.add(rep.nodeid) line = self._locationline(rep.nodeid, *rep.location) - running_xdist = hasattr(rep, "node") if not running_xdist: self.write_ensure_prefix(line, word, **markup) if rep.skipped or hasattr(report, "wasxfail"): reason = _get_raw_skip_reason(rep) - if self.config.get_verbosity(Config.VERBOSITY_TEST_CASES) < 2: + if self.config.option.verbose < 2: available_width = ( (self._tw.fullwidth - self._tw.width_of_current_line) - len(" [100%]") @@ -692,7 +622,7 @@ class TerminalReporter: self._write_progress_information_filling_space() else: self.ensure_newline() - self._tw.write(f"[{rep.node.gateway.id}]") + self._tw.write("[%s]" % rep.node.gateway.id) if self._show_progress_info: self._tw.write( self._get_progress_information_message() + " ", cyan=True @@ -707,82 +637,45 @@ class TerminalReporter: @property def _is_last_item(self) -> bool: assert self._session is not None - return self.reported_progress == self._session.testscollected + return len(self._progress_nodeids_reported) == self._session.testscollected - @hookimpl(wrapper=True) - def pytest_runtestloop(self) -> Generator[None, object, object]: - result = yield + def pytest_runtest_logfinish(self, nodeid: str) -> None: + assert self._session + if self.verbosity <= 0 and self._show_progress_info: + if self._show_progress_info == "count": + num_tests = self._session.testscollected + progress_length = len(f" [{num_tests}/{num_tests}]") + else: + progress_length = len(" [100%]") - # Write the final/100% progress -- deferred until the loop is complete. - if ( - self.config.get_verbosity(Config.VERBOSITY_TEST_CASES) <= 0 - and self._show_progress_info - and self.reported_progress - ): - self._write_progress_information_filling_space() + self._progress_nodeids_reported.add(nodeid) - return result + if self._is_last_item: + self._write_progress_information_filling_space() + else: + main_color, _ = self._get_main_color() + w = self._width_of_current_line + past_edge = w + progress_length + 1 >= self._screen_width + if past_edge: + msg = self._get_progress_information_message() + self._tw.write(msg + "\n", **{main_color: True}) def _get_progress_information_message(self) -> str: assert self._session collected = self._session.testscollected if self._show_progress_info == "count": if collected: - progress = self.reported_progress + progress = self._progress_nodeids_reported counter_format = f"{{:{len(str(collected))}d}}" format_string = f" [{counter_format}/{{}}]" - return format_string.format(progress, collected) + return format_string.format(len(progress), collected) return f" [ {collected} / {collected} ]" - if self._show_progress_info == "times": - if not collected: - return "" - all_reports = ( - self._get_reports_to_display("passed") - + self._get_reports_to_display("xpassed") - + self._get_reports_to_display("failed") - + self._get_reports_to_display("xfailed") - + self._get_reports_to_display("skipped") - + self._get_reports_to_display("error") - + self._get_reports_to_display("") - ) - current_location = all_reports[-1].location[0] - not_reported = [ - r for r in all_reports if r.nodeid not in self._timing_nodeids_reported - ] - tests_in_module = sum( - i.location[0] == current_location for i in self._session.items - ) - tests_completed = sum( - r.when == "setup" - for r in not_reported - if r.location[0] == current_location - ) - last_in_module = tests_completed == tests_in_module - if self.showlongtestinfo or last_in_module: - self._timing_nodeids_reported.update(r.nodeid for r in not_reported) - return format_node_duration( - sum(r.duration for r in not_reported if isinstance(r, TestReport)) - ) - return "" - if collected: - return f" [{self.reported_progress * 100 // collected:3d}%]" - return " [100%]" - - def _write_progress_information_if_past_edge(self) -> None: - w = self._width_of_current_line - if self._show_progress_info == "count": - assert self._session - num_tests = self._session.testscollected - progress_length = len(f" [{num_tests}/{num_tests}]") - elif self._show_progress_info == "times": - progress_length = len(" 99h 59m") else: - progress_length = len(" [100%]") - past_edge = w + progress_length + 1 >= self._screen_width - if past_edge: - main_color, _ = self._get_main_color() - msg = self._get_progress_information_message() - self._tw.write(msg + "\n", **{main_color: True}) + if collected: + return " [{:3d}%]".format( + len(self._progress_nodeids_reported) * 100 // collected + ) + return " [100%]" def _write_progress_information_filling_space(self) -> None: color, _ = self._get_main_color() @@ -797,9 +690,10 @@ class TerminalReporter: return self._tw.width_of_current_line def pytest_collection(self) -> None: - if self.isatty(): + if self.isatty: if self.config.option.verbose >= 0: self.write("collecting ... ", flush=True, bold=True) + self._collect_report_last_write = timing.time() elif self.config.option.verbose >= 1: self.write("collecting ... ", flush=True, bold=True) @@ -810,7 +704,7 @@ class TerminalReporter: self._add_stats("skipped", [report]) items = [x for x in report.result if isinstance(x, Item)] self._numcollected += len(items) - if self.isatty(): + if self.isatty: self.report_collect() def report_collect(self, final: bool = False) -> None: @@ -818,13 +712,14 @@ class TerminalReporter: return if not final: - # Only write the "collecting" report every `REPORT_COLLECTING_RESOLUTION`. + # Only write "collecting" report every 0.5s. + t = timing.time() if ( - self._collect_report_last_write.elapsed().seconds - < REPORT_COLLECTING_RESOLUTION + self._collect_report_last_write is not None + and self._collect_report_last_write > t - REPORT_COLLECTING_RESOLUTION ): return - self._collect_report_last_write = timing.Instant() + self._collect_report_last_write = t errors = len(self.stats.get("error", [])) skipped = len(self.stats.get("skipped", [])) @@ -835,14 +730,14 @@ class TerminalReporter: str(self._numcollected) + " item" + ("" if self._numcollected == 1 else "s") ) if errors: - line += f" / {errors} error{'s' if errors != 1 else ''}" + line += " / %d error%s" % (errors, "s" if errors != 1 else "") if deselected: - line += f" / {deselected} deselected" + line += " / %d deselected" % deselected if skipped: - line += f" / {skipped} skipped" + line += " / %d skipped" % skipped if self._numcollected > selected: - line += f" / {selected} selected" - if self.isatty(): + line += " / %d selected" % selected + if self.isatty: self.rewrite(line, bold=True, erase=True) if final: self.write("\n") @@ -850,9 +745,9 @@ class TerminalReporter: self.write_line(line) @hookimpl(trylast=True) - def pytest_sessionstart(self, session: Session) -> None: + def pytest_sessionstart(self, session: "Session") -> None: self._session = session - self._session_start = timing.Instant() + self._sessionstarttime = timing.time() if not self.showheader: return self.write_sep("=", "test session starts", bold=True) @@ -863,7 +758,9 @@ class TerminalReporter: if pypy_version_info: verinfo = ".".join(map(str, pypy_version_info[:3])) msg += f"[pypy-{verinfo}-{pypy_version_info[3]}]" - msg += f", pytest-{_pytest._version.version}, pluggy-{pluggy.__version__}" + msg += ", pytest-{}, pluggy-{}".format( + _pytest._version.version, pluggy.__version__ + ) if ( self.verbosity > 0 or self.config.option.debug @@ -877,7 +774,7 @@ class TerminalReporter: self._write_report_lines_from_hooks(lines) def _write_report_lines_from_hooks( - self, lines: Sequence[str | Sequence[str]] + self, lines: Sequence[Union[str, Sequence[str]]] ) -> None: for line_or_lines in reversed(lines): if isinstance(line_or_lines, str): @@ -886,29 +783,22 @@ class TerminalReporter: for line in line_or_lines: self.write_line(line) - def pytest_report_header(self, config: Config) -> list[str]: + def pytest_report_header(self, config: Config) -> List[str]: result = [f"rootdir: {config.rootpath}"] if config.inipath: - warning = "" - if config._ignored_config_files: - warning = f" (WARNING: ignoring pytest config in {', '.join(config._ignored_config_files)}!)" - result.append( - "configfile: " + bestrelpath(config.rootpath, config.inipath) + warning - ) + result.append("configfile: " + bestrelpath(config.rootpath, config.inipath)) if config.args_source == Config.ArgsSource.TESTPATHS: - testpaths: list[str] = config.getini("testpaths") + testpaths: List[str] = config.getini("testpaths") result.append("testpaths: {}".format(", ".join(testpaths))) plugininfo = config.pluginmanager.list_plugin_distinfo() if plugininfo: - result.append( - "plugins: {}".format(", ".join(_plugin_nameversions(plugininfo))) - ) + result.append("plugins: %s" % ", ".join(_plugin_nameversions(plugininfo))) return result - def pytest_collection_finish(self, session: Session) -> None: + def pytest_collection_finish(self, session: "Session") -> None: self.report_collect(True) lines = self.config.hook.pytest_report_collectionfinish( @@ -931,17 +821,16 @@ class TerminalReporter: rep.toterminal(self._tw) def _printcollecteditems(self, items: Sequence[Item]) -> None: - test_cases_verbosity = self.config.get_verbosity(Config.VERBOSITY_TEST_CASES) - if test_cases_verbosity < 0: - if test_cases_verbosity < -1: + if self.config.option.verbose < 0: + if self.config.option.verbose < -1: counts = Counter(item.nodeid.split("::", 1)[0] for item in items) for name, count in sorted(counts.items()): - self._tw.line(f"{name}: {count}") + self._tw.line("%s: %d" % (name, count)) else: for item in items: self._tw.line(item.nodeid) return - stack: list[Node] = [] + stack: List[Node] = [] indent = "" for item in items: needed_collectors = item.listchain()[1:] # strip root node @@ -953,18 +842,19 @@ class TerminalReporter: stack.append(col) indent = (len(stack) - 1) * " " self._tw.line(f"{indent}{col}") - if test_cases_verbosity >= 1: + if self.config.option.verbose >= 1: obj = getattr(col, "obj", None) doc = inspect.getdoc(obj) if obj else None if doc: for line in doc.splitlines(): self._tw.line("{}{}".format(indent + " ", line)) - @hookimpl(wrapper=True) + @hookimpl(hookwrapper=True) def pytest_sessionfinish( - self, session: Session, exitstatus: int | ExitCode - ) -> Generator[None]: - result = yield + self, session: "Session", exitstatus: Union[int, ExitCode] + ): + outcome = yield + outcome.get_result() self._tw.line("") summary_exit_codes = ( ExitCode.OK, @@ -985,22 +875,17 @@ class TerminalReporter: elif session.shouldstop: self.write_sep("!", str(session.shouldstop), red=True) self.summary_stats() - return result - @hookimpl(wrapper=True) - def pytest_terminal_summary(self) -> Generator[None]: + @hookimpl(hookwrapper=True) + def pytest_terminal_summary(self) -> Generator[None, None, None]: self.summary_errors() self.summary_failures() - self.summary_xfailures() self.summary_warnings() self.summary_passes() - self.summary_xpasses() - try: - return (yield) - finally: - self.short_test_summary() - # Display any extra warnings from teardown here (if any). - self.summary_warnings() + yield + self.short_test_summary() + # Display any extra warnings from teardown here (if any). + self.summary_warnings() def pytest_keyboard_interrupt(self, excinfo: ExceptionInfo[BaseException]) -> None: self._keyboardinterrupt_memo = excinfo.getrepr(funcargs=True) @@ -1026,7 +911,7 @@ class TerminalReporter: ) def _locationline( - self, nodeid: str, fspath: str, lineno: int | None, domain: str + self, nodeid: str, fspath: str, lineno: Optional[int], domain: str ) -> str: def mkrel(nodeid: str) -> str: line = self.config.cwd_relative_nodeid(nodeid) @@ -1037,7 +922,7 @@ class TerminalReporter: line += "[".join(values) return line - # fspath comes from testid which has a "/"-normalized path. + # collect_fspath comes from testid which has a "/"-normalized path. if fspath: res = mkrel(nodeid) if self.verbosity >= 2 and nodeid.split("::")[0] != fspath.replace( @@ -1071,7 +956,7 @@ class TerminalReporter: def summary_warnings(self) -> None: if self.hasopt("w"): - all_warnings: list[WarningReport] | None = self.stats.get("warnings") + all_warnings: Optional[List[WarningReport]] = self.stats.get("warnings") if not all_warnings: return @@ -1084,11 +969,11 @@ class TerminalReporter: if not warning_reports: return - reports_grouped_by_message: dict[str, list[WarningReport]] = {} + reports_grouped_by_message: Dict[str, List[WarningReport]] = {} for wr in warning_reports: reports_grouped_by_message.setdefault(wr.message, []).append(wr) - def collapsed_location_report(reports: list[WarningReport]) -> str: + def collapsed_location_report(reports: List[WarningReport]) -> str: locations = [] for w in reports: location = w.get_location(self.config) @@ -1124,20 +1009,12 @@ class TerminalReporter: ) def summary_passes(self) -> None: - self.summary_passes_combined("passed", "PASSES", "P") - - def summary_xpasses(self) -> None: - self.summary_passes_combined("xpassed", "XPASSES", "X") - - def summary_passes_combined( - self, which_reports: str, sep_title: str, needed_opt: str - ) -> None: if self.config.option.tbstyle != "no": - if self.hasopt(needed_opt): - reports: list[TestReport] = self.getreports(which_reports) + if self.hasopt("P"): + reports: List[TestReport] = self.getreports("passed") if not reports: return - self.write_sep("=", sep_title) + self.write_sep("=", "PASSES") for rep in reports: if rep.sections: msg = self._getfailureheadline(rep) @@ -1145,7 +1022,7 @@ class TerminalReporter: self._outrep_summary(rep) self._handle_teardown_sections(rep.nodeid) - def _get_teardown_reports(self, nodeid: str) -> list[TestReport]: + def _get_teardown_reports(self, nodeid: str) -> List[TestReport]: reports = self.getreports("") return [ report @@ -1171,43 +1048,25 @@ class TerminalReporter: self._tw.line(content) def summary_failures(self) -> None: - style = self.config.option.tbstyle - self.summary_failures_combined("failed", "FAILURES", style=style) - - def summary_xfailures(self) -> None: - show_tb = self.config.option.xfail_tb - style = self.config.option.tbstyle if show_tb else "no" - self.summary_failures_combined("xfailed", "XFAILURES", style=style) - - def summary_failures_combined( - self, - which_reports: str, - sep_title: str, - *, - style: str, - needed_opt: str | None = None, - ) -> None: - if style != "no": - if not needed_opt or self.hasopt(needed_opt): - reports: list[BaseReport] = self.getreports(which_reports) - if not reports: - return - self.write_sep("=", sep_title) - if style == "line": - for rep in reports: - line = self._getcrashline(rep) - self._outrep_summary(rep) - self.write_line(line) - else: - for rep in reports: - msg = self._getfailureheadline(rep) - self.write_sep("_", msg, red=True, bold=True) - self._outrep_summary(rep) - self._handle_teardown_sections(rep.nodeid) + if self.config.option.tbstyle != "no": + reports: List[BaseReport] = self.getreports("failed") + if not reports: + return + self.write_sep("=", "FAILURES") + if self.config.option.tbstyle == "line": + for rep in reports: + line = self._getcrashline(rep) + self.write_line(line) + else: + for rep in reports: + msg = self._getfailureheadline(rep) + self.write_sep("_", msg, red=True, bold=True) + self._outrep_summary(rep) + self._handle_teardown_sections(rep.nodeid) def summary_errors(self) -> None: if self.config.option.tbstyle != "no": - reports: list[BaseReport] = self.getreports("error") + reports: List[BaseReport] = self.getreports("error") if not reports: return self.write_sep("=", "ERRORS") @@ -1237,7 +1096,7 @@ class TerminalReporter: if self.verbosity < -1: return - session_duration = self._session_start.elapsed() + session_duration = timing.time() - self._sessionstarttime (parts, main_color) = self.build_summary_stats_line() line_parts = [] @@ -1252,7 +1111,7 @@ class TerminalReporter: msg = ", ".join(line_parts) main_markup = {main_color: True} - duration = f" in {format_session_duration(session_duration.seconds)}" + duration = f" in {format_session_duration(session_duration)}" duration_with_markup = self._tw.markup(duration, **main_markup) if display_sep: fullwidth += len(duration_with_markup) - len(duration) @@ -1274,7 +1133,7 @@ class TerminalReporter: if not self.reportchars: return - def show_simple(lines: list[str], *, stat: str) -> None: + def show_simple(lines: List[str], *, stat: str) -> None: failed = self.stats.get(stat, []) if not failed: return @@ -1286,13 +1145,13 @@ class TerminalReporter: ) lines.append(line) - def show_xfailed(lines: list[str]) -> None: + def show_xfailed(lines: List[str]) -> None: xfailed = self.stats.get("xfailed", []) for rep in xfailed: - verbose_word, verbose_markup = rep._get_verbose_word_with_markup( - self.config, {_color_for_type["warnings"]: True} + verbose_word = rep._get_verbose_word(self.config) + markup_word = self._tw.markup( + verbose_word, **{_color_for_type["warnings"]: True} ) - markup_word = self._tw.markup(verbose_word, **verbose_markup) nodeid = _get_node_id_with_markup(self._tw, self.config, rep) line = f"{markup_word} {nodeid}" reason = rep.wasxfail @@ -1301,64 +1160,38 @@ class TerminalReporter: lines.append(line) - def show_xpassed(lines: list[str]) -> None: + def show_xpassed(lines: List[str]) -> None: xpassed = self.stats.get("xpassed", []) for rep in xpassed: - verbose_word, verbose_markup = rep._get_verbose_word_with_markup( - self.config, {_color_for_type["warnings"]: True} + verbose_word = rep._get_verbose_word(self.config) + markup_word = self._tw.markup( + verbose_word, **{_color_for_type["warnings"]: True} ) - markup_word = self._tw.markup(verbose_word, **verbose_markup) nodeid = _get_node_id_with_markup(self._tw, self.config, rep) - line = f"{markup_word} {nodeid}" reason = rep.wasxfail - if reason: - line += " - " + str(reason) - lines.append(line) + lines.append(f"{markup_word} {nodeid} {reason}") - def show_skipped_folded(lines: list[str]) -> None: - skipped: list[CollectReport] = self.stats.get("skipped", []) + def show_skipped(lines: List[str]) -> None: + skipped: List[CollectReport] = self.stats.get("skipped", []) fskips = _folded_skips(self.startpath, skipped) if skipped else [] if not fskips: return - verbose_word, verbose_markup = skipped[0]._get_verbose_word_with_markup( - self.config, {_color_for_type["warnings"]: True} + verbose_word = skipped[0]._get_verbose_word(self.config) + markup_word = self._tw.markup( + verbose_word, **{_color_for_type["warnings"]: True} ) - markup_word = self._tw.markup(verbose_word, **verbose_markup) prefix = "Skipped: " for num, fspath, lineno, reason in fskips: if reason.startswith(prefix): reason = reason[len(prefix) :] if lineno is not None: - lines.append(f"{markup_word} [{num}] {fspath}:{lineno}: {reason}") + lines.append( + "%s [%d] %s:%d: %s" % (markup_word, num, fspath, lineno, reason) + ) else: - lines.append(f"{markup_word} [{num}] {fspath}: {reason}") + lines.append("%s [%d] %s: %s" % (markup_word, num, fspath, reason)) - def show_skipped_unfolded(lines: list[str]) -> None: - skipped: list[CollectReport] = self.stats.get("skipped", []) - - for rep in skipped: - assert rep.longrepr is not None - assert isinstance(rep.longrepr, tuple), (rep, rep.longrepr) - assert len(rep.longrepr) == 3, (rep, rep.longrepr) - - verbose_word, verbose_markup = rep._get_verbose_word_with_markup( - self.config, {_color_for_type["warnings"]: True} - ) - markup_word = self._tw.markup(verbose_word, **verbose_markup) - nodeid = _get_node_id_with_markup(self._tw, self.config, rep) - line = f"{markup_word} {nodeid}" - reason = rep.longrepr[2] - if reason: - line += " - " + str(reason) - lines.append(line) - - def show_skipped(lines: list[str]) -> None: - if self.foldskipped: - show_skipped_folded(lines) - else: - show_skipped_unfolded(lines) - - REPORTCHAR_ACTIONS: Mapping[str, Callable[[list[str]], None]] = { + REPORTCHAR_ACTIONS: Mapping[str, Callable[[List[str]], None]] = { "x": show_xfailed, "X": show_xpassed, "f": partial(show_simple, stat="failed"), @@ -1367,7 +1200,7 @@ class TerminalReporter: "E": partial(show_simple, stat="error"), } - lines: list[str] = [] + lines: List[str] = [] for char in self.reportchars: action = REPORTCHAR_ACTIONS.get(char) if action: # skipping e.g. "P" (passed with output) here. @@ -1378,7 +1211,7 @@ class TerminalReporter: for line in lines: self.write_line(line) - def _get_main_color(self) -> tuple[str, list[str]]: + def _get_main_color(self) -> Tuple[str, List[str]]: if self._main_color is None or self._known_types is None or self._is_last_item: self._set_main_color() assert self._main_color @@ -1398,22 +1231,22 @@ class TerminalReporter: return main_color def _set_main_color(self) -> None: - unknown_types: list[str] = [] - for found_type in self.stats: + unknown_types: List[str] = [] + for found_type in self.stats.keys(): if found_type: # setup/teardown reports have an empty key, ignore them if found_type not in KNOWN_TYPES and found_type not in unknown_types: unknown_types.append(found_type) self._known_types = list(KNOWN_TYPES) + unknown_types self._main_color = self._determine_main_color(bool(unknown_types)) - def build_summary_stats_line(self) -> tuple[list[tuple[str, dict[str, bool]]], str]: + def build_summary_stats_line(self) -> Tuple[List[Tuple[str, Dict[str, bool]]], str]: """ Build the parts used in the last summary stats line. The summary stats line is the line shown at the end, "=== 12 passed, 2 errors in Xs===". This function builds a list of the "parts" that make up for the text in that line, in - the example above it would be:: + the example above it would be: [ ("12 passed", {"green": True}), @@ -1431,14 +1264,14 @@ class TerminalReporter: else: return self._build_normal_summary_stats_line() - def _get_reports_to_display(self, key: str) -> list[Any]: + def _get_reports_to_display(self, key: str) -> List[Any]: """Get test/collection reports for the given status key, such as `passed` or `error`.""" reports = self.stats.get(key, []) return [x for x in reports if getattr(x, "count_towards_summary", True)] def _build_normal_summary_stats_line( self, - ) -> tuple[list[tuple[str, dict[str, bool]]], str]: + ) -> Tuple[List[Tuple[str, Dict[str, bool]]], str]: main_color, known_types = self._get_main_color() parts = [] @@ -1448,7 +1281,7 @@ class TerminalReporter: count = len(reports) color = _color_for_type.get(key, _color_for_type_default) markup = {color: True, "bold": color == main_color} - parts.append(("%d %s" % pluralize(count, key), markup)) # noqa: UP031 + parts.append(("%d %s" % pluralize(count, key), markup)) if not parts: parts = [("no tests ran", {_color_for_type_default: True})] @@ -1457,7 +1290,7 @@ class TerminalReporter: def _build_collect_only_summary_stats_line( self, - ) -> tuple[list[tuple[str, dict[str, bool]]], str]: + ) -> Tuple[List[Tuple[str, Dict[str, bool]]], str]: deselected = len(self._get_reports_to_display("deselected")) errors = len(self._get_reports_to_display("error")) @@ -1467,7 +1300,7 @@ class TerminalReporter: elif deselected == 0: main_color = "green" - collected_output = "%d %s collected" % pluralize(self._numcollected, "test") # noqa: UP031 + collected_output = "%d %s collected" % pluralize(self._numcollected, "test") parts = [(collected_output, {main_color: True})] else: all_tests_were_deselected = self._numcollected == deselected @@ -1483,7 +1316,7 @@ class TerminalReporter: if errors: main_color = _color_for_type["error"] - parts += [("%d %s" % pluralize(errors, "error"), {main_color: True})] # noqa: UP031 + parts += [("%d %s" % pluralize(errors, "error"), {main_color: True})] return parts, main_color @@ -1498,7 +1331,7 @@ def _get_node_id_with_markup(tw: TerminalWriter, config: Config, rep: BaseReport return path -def _format_trimmed(format: str, msg: str, available_width: int) -> str | None: +def _format_trimmed(format: str, msg: str, available_width: int) -> Optional[str]: """Format msg into format, ellipsizing it if doesn't fit in available_width. Returns None if even the ellipsis can't fit. @@ -1524,35 +1357,27 @@ def _format_trimmed(format: str, msg: str, available_width: int) -> str | None: def _get_line_with_reprcrash_message( - config: Config, rep: BaseReport, tw: TerminalWriter, word_markup: dict[str, bool] + config: Config, rep: BaseReport, tw: TerminalWriter, word_markup: Dict[str, bool] ) -> str: """Get summary line for a report, trying to add reprcrash message.""" - verbose_word, verbose_markup = rep._get_verbose_word_with_markup( - config, word_markup - ) - word = tw.markup(verbose_word, **verbose_markup) + verbose_word = rep._get_verbose_word(config) + word = tw.markup(verbose_word, **word_markup) node = _get_node_id_with_markup(tw, config, rep) line = f"{word} {node}" line_width = wcswidth(line) - msg: str | None try: - if isinstance(rep.longrepr, str): - msg = rep.longrepr - else: - # Type ignored intentionally -- possible AttributeError expected. - msg = rep.longrepr.reprcrash.message # type: ignore[union-attr] + # Type ignored intentionally -- possible AttributeError expected. + msg = rep.longrepr.reprcrash.message # type: ignore[union-attr] except AttributeError: pass else: - if ( - running_on_ci() or config.option.verbose >= 2 - ) and not config.option.force_short_summary: - msg = f" - {msg}" - else: + if not running_on_ci(): available_width = tw.fullwidth - line_width msg = _format_trimmed(" - {}", msg, available_width) + else: + msg = f" - {msg}" if msg is not None: line += msg @@ -1562,8 +1387,8 @@ def _get_line_with_reprcrash_message( def _folded_skips( startpath: Path, skipped: Sequence[CollectReport], -) -> list[tuple[int, str, int | None, str]]: - d: dict[tuple[str, int | None, str], list[CollectReport]] = {} +) -> List[Tuple[int, str, Optional[int], str]]: + d: Dict[Tuple[str, Optional[int], str], List[CollectReport]] = {} for event in skipped: assert event.longrepr is not None assert isinstance(event.longrepr, tuple), (event, event.longrepr) @@ -1580,11 +1405,11 @@ def _folded_skips( and "skip" in keywords and "pytestmark" not in keywords ): - key: tuple[str, int | None, str] = (fspath, None, reason) + key: Tuple[str, Optional[int], str] = (fspath, None, reason) else: key = (fspath, lineno, reason) d.setdefault(key, []).append(event) - values: list[tuple[int, str, int | None, str]] = [] + values: List[Tuple[int, str, Optional[int], str]] = [] for key, events in d.items(): values.append((len(events), *key)) return values @@ -1595,13 +1420,11 @@ _color_for_type = { "error": "red", "warnings": "yellow", "passed": "green", - "subtests passed": "green", - "subtests failed": "red", } _color_for_type_default = "yellow" -def pluralize(count: int, noun: str) -> tuple[int, str]: +def pluralize(count: int, noun: str) -> Tuple[int, str]: # No need to pluralize words such as `failed` or `passed`. if noun not in ["error", "warnings", "test"]: return count, noun @@ -1614,11 +1437,11 @@ def pluralize(count: int, noun: str) -> tuple[int, str]: return count, noun + "s" if count != 1 else noun -def _plugin_nameversions(plugininfo) -> list[str]: - values: list[str] = [] +def _plugin_nameversions(plugininfo) -> List[str]: + values: List[str] = [] for plugin, dist in plugininfo: # Gets us name and version! - name = f"{dist.project_name}-{dist.version}" + name = "{dist.project_name}-{dist.version}".format(dist=dist) # Questionable convenience, but it keeps things short. if name.startswith("pytest-"): name = name[7:] @@ -1637,36 +1460,13 @@ def format_session_duration(seconds: float) -> str: return f"{seconds:.2f}s ({dt})" -def format_node_duration(seconds: float) -> str: - """Format the given seconds in a human readable manner to show in the test progress.""" - # The formatting is designed to be compact and readable, with at most 7 characters - # for durations below 100 hours. - if seconds < 0.00001: - return f" {seconds * 1000000:.3f}us" - if seconds < 0.0001: - return f" {seconds * 1000000:.2f}us" - if seconds < 0.001: - return f" {seconds * 1000000:.1f}us" - if seconds < 0.01: - return f" {seconds * 1000:.3f}ms" - if seconds < 0.1: - return f" {seconds * 1000:.2f}ms" - if seconds < 1: - return f" {seconds * 1000:.1f}ms" - if seconds < 60: - return f" {seconds:.3f}s" - if seconds < 3600: - return f" {seconds // 60:.0f}m {seconds % 60:.0f}s" - return f" {seconds // 3600:.0f}h {(seconds % 3600) // 60:.0f}m" - - def _get_raw_skip_reason(report: TestReport) -> str: """Get the reason string of a skip/xfail/xpass test report. The string is just the part given by the user. """ if hasattr(report, "wasxfail"): - reason = report.wasxfail + reason = cast(str, report.wasxfail) if reason.startswith("reason: "): reason = reason[len("reason: ") :] return reason @@ -1679,92 +1479,3 @@ def _get_raw_skip_reason(report: TestReport) -> str: elif reason == "Skipped": reason = "" return reason - - -class TerminalProgressPlugin: - """Terminal progress reporting plugin using OSC 9;4 ANSI sequences. - - Emits OSC 9;4 sequences to indicate test progress to terminal - tabs/windows/etc. - - Not all terminal emulators support this feature. - - Ref: https://conemu.github.io/en/AnsiEscapeCodes.html#ConEmu_specific_OSC - """ - - def __init__(self, tr: TerminalReporter) -> None: - self._tr = tr - self._session: Session | None = None - self._has_failures = False - - def _emit_progress( - self, - state: Literal["remove", "normal", "error", "indeterminate", "paused"], - progress: int | None = None, - ) -> None: - """Emit OSC 9;4 sequence for indicating progress to the terminal. - - :param state: - Progress state to set. - :param progress: - Progress value 0-100. Required for "normal", optional for "error" - and "paused", otherwise ignored. - """ - assert progress is None or 0 <= progress <= 100 - - # OSC 9;4 sequence: ESC ] 9 ; 4 ; state ; progress ST - # ST can be ESC \ or BEL. ESC \ seems better supported. - match state: - case "remove": - sequence = "\x1b]9;4;0;\x1b\\" - case "normal": - assert progress is not None - sequence = f"\x1b]9;4;1;{progress}\x1b\\" - case "error": - if progress is not None: - sequence = f"\x1b]9;4;2;{progress}\x1b\\" - else: - sequence = "\x1b]9;4;2;\x1b\\" - case "indeterminate": - sequence = "\x1b]9;4;3;\x1b\\" - case "paused": - if progress is not None: - sequence = f"\x1b]9;4;4;{progress}\x1b\\" - else: - sequence = "\x1b]9;4;4;\x1b\\" - - self._tr.write_raw(sequence, flush=True) - - @hookimpl - def pytest_sessionstart(self, session: Session) -> None: - self._session = session - # Show indeterminate progress during collection. - self._emit_progress("indeterminate") - - @hookimpl - def pytest_collection_finish(self) -> None: - assert self._session is not None - if self._session.testscollected > 0: - # Switch from indeterminate to 0% progress. - self._emit_progress("normal", 0) - - @hookimpl - def pytest_runtest_logreport(self, report: TestReport) -> None: - if report.failed: - self._has_failures = True - - # Let's consider the "call" phase for progress. - if report.when != "call": - return - - # Calculate and emit progress. - assert self._session is not None - collected = self._session.testscollected - if collected > 0: - reported = self._tr.reported_progress - progress = min(reported * 100 // collected, 100) - self._emit_progress("error" if self._has_failures else "normal", progress) - - @hookimpl - def pytest_sessionfinish(self) -> None: - self._emit_progress("remove") diff --git a/Backend/venv/lib/python3.12/site-packages/_pytest/threadexception.py b/Backend/venv/lib/python3.12/site-packages/_pytest/threadexception.py index eb57783b..43341e73 100644 --- a/Backend/venv/lib/python3.12/site-packages/_pytest/threadexception.py +++ b/Backend/venv/lib/python3.12/site-packages/_pytest/threadexception.py @@ -1,152 +1,88 @@ -from __future__ import annotations - -import collections -from collections.abc import Callable -import functools -import sys import threading import traceback -from typing import NamedTuple -from typing import TYPE_CHECKING import warnings +from types import TracebackType +from typing import Any +from typing import Callable +from typing import Generator +from typing import Optional +from typing import Type -from _pytest.config import Config -from _pytest.nodes import Item -from _pytest.stash import StashKey -from _pytest.tracemalloc import tracemalloc_message import pytest -if TYPE_CHECKING: - pass +# Copied from cpython/Lib/test/support/threading_helper.py, with modifications. +class catch_threading_exception: + """Context manager catching threading.Thread exception using + threading.excepthook. -if sys.version_info < (3, 11): - from exceptiongroup import ExceptionGroup + Storing exc_value using a custom hook can create a reference cycle. The + reference cycle is broken explicitly when the context manager exits. + + Storing thread using a custom hook can resurrect it if it is set to an + object which is being finalized. Exiting the context manager clears the + stored object. + + Usage: + with threading_helper.catch_threading_exception() as cm: + # code spawning a thread which raises an exception + ... + # check the thread exception: use cm.args + ... + # cm.args attribute no longer exists at this point + # (to break a reference cycle) + """ + + def __init__(self) -> None: + self.args: Optional["threading.ExceptHookArgs"] = None + self._old_hook: Optional[Callable[["threading.ExceptHookArgs"], Any]] = None + + def _hook(self, args: "threading.ExceptHookArgs") -> None: + self.args = args + + def __enter__(self) -> "catch_threading_exception": + self._old_hook = threading.excepthook + threading.excepthook = self._hook + return self + + def __exit__( + self, + exc_type: Optional[Type[BaseException]], + exc_val: Optional[BaseException], + exc_tb: Optional[TracebackType], + ) -> None: + assert self._old_hook is not None + threading.excepthook = self._old_hook + self._old_hook = None + del self.args -class ThreadExceptionMeta(NamedTuple): - msg: str - cause_msg: str - exc_value: BaseException | None - - -thread_exceptions: StashKey[collections.deque[ThreadExceptionMeta | BaseException]] = ( - StashKey() -) - - -def collect_thread_exception(config: Config) -> None: - pop_thread_exception = config.stash[thread_exceptions].pop - errors: list[pytest.PytestUnhandledThreadExceptionWarning | RuntimeError] = [] - meta = None - hook_error = None - try: - while True: - try: - meta = pop_thread_exception() - except IndexError: - break - - if isinstance(meta, BaseException): - hook_error = RuntimeError("Failed to process thread exception") - hook_error.__cause__ = meta - errors.append(hook_error) - continue - - msg = meta.msg - try: - warnings.warn(pytest.PytestUnhandledThreadExceptionWarning(msg)) - except pytest.PytestUnhandledThreadExceptionWarning as e: - # This except happens when the warning is treated as an error (e.g. `-Werror`). - if meta.exc_value is not None: - # Exceptions have a better way to show the traceback, but - # warnings do not, so hide the traceback from the msg and - # set the cause so the traceback shows up in the right place. - e.args = (meta.cause_msg,) - e.__cause__ = meta.exc_value - errors.append(e) - - if len(errors) == 1: - raise errors[0] - if errors: - raise ExceptionGroup("multiple thread exception warnings", errors) - finally: - del errors, meta, hook_error - - -def cleanup( - *, config: Config, prev_hook: Callable[[threading.ExceptHookArgs], object] -) -> None: - try: - try: - # We don't join threads here, so exceptions raised from any - # threads still running by the time _threading_atexits joins them - # do not get captured (see #13027). - collect_thread_exception(config) - finally: - threading.excepthook = prev_hook - finally: - del config.stash[thread_exceptions] - - -def thread_exception_hook( - args: threading.ExceptHookArgs, - /, - *, - append: Callable[[ThreadExceptionMeta | BaseException], object], -) -> None: - try: - # we need to compute these strings here as they might change after - # the excepthook finishes and before the metadata object is - # collected by a pytest hook - thread_name = "" if args.thread is None else args.thread.name - summary = f"Exception in thread {thread_name}" - traceback_message = "\n\n" + "".join( - traceback.format_exception( - args.exc_type, - args.exc_value, - args.exc_traceback, +def thread_exception_runtest_hook() -> Generator[None, None, None]: + with catch_threading_exception() as cm: + yield + if cm.args: + thread_name = "" if cm.args.thread is None else cm.args.thread.name + msg = f"Exception in thread {thread_name}\n\n" + msg += "".join( + traceback.format_exception( + cm.args.exc_type, + cm.args.exc_value, + cm.args.exc_traceback, + ) ) - ) - tracemalloc_tb = "\n" + tracemalloc_message(args.thread) - msg = summary + traceback_message + tracemalloc_tb - cause_msg = summary + tracemalloc_tb - - append( - ThreadExceptionMeta( - # Compute these strings here as they might change later - msg=msg, - cause_msg=cause_msg, - exc_value=args.exc_value, - ) - ) - except BaseException as e: - append(e) - # Raising this will cause the exception to be logged twice, once in our - # collect_thread_exception and once by sys.excepthook - # which is fine - this should never happen anyway and if it does - # it should probably be reported as a pytest bug. - raise + warnings.warn(pytest.PytestUnhandledThreadExceptionWarning(msg)) -def pytest_configure(config: Config) -> None: - prev_hook = threading.excepthook - deque: collections.deque[ThreadExceptionMeta | BaseException] = collections.deque() - config.stash[thread_exceptions] = deque - config.add_cleanup(functools.partial(cleanup, config=config, prev_hook=prev_hook)) - threading.excepthook = functools.partial(thread_exception_hook, append=deque.append) +@pytest.hookimpl(hookwrapper=True, trylast=True) +def pytest_runtest_setup() -> Generator[None, None, None]: + yield from thread_exception_runtest_hook() -@pytest.hookimpl(trylast=True) -def pytest_runtest_setup(item: Item) -> None: - collect_thread_exception(item.config) +@pytest.hookimpl(hookwrapper=True, tryfirst=True) +def pytest_runtest_call() -> Generator[None, None, None]: + yield from thread_exception_runtest_hook() -@pytest.hookimpl(trylast=True) -def pytest_runtest_call(item: Item) -> None: - collect_thread_exception(item.config) - - -@pytest.hookimpl(trylast=True) -def pytest_runtest_teardown(item: Item) -> None: - collect_thread_exception(item.config) +@pytest.hookimpl(hookwrapper=True, tryfirst=True) +def pytest_runtest_teardown() -> Generator[None, None, None]: + yield from thread_exception_runtest_hook() diff --git a/Backend/venv/lib/python3.12/site-packages/_pytest/timing.py b/Backend/venv/lib/python3.12/site-packages/_pytest/timing.py index 51c3db23..925163a5 100644 --- a/Backend/venv/lib/python3.12/site-packages/_pytest/timing.py +++ b/Backend/venv/lib/python3.12/site-packages/_pytest/timing.py @@ -5,91 +5,8 @@ pytest runtime information (issue #185). Fixture "mock_timing" also interacts with this module for pytest's own tests. """ - -from __future__ import annotations - -import dataclasses -from datetime import datetime -from datetime import timezone from time import perf_counter from time import sleep from time import time -from typing import TYPE_CHECKING - - -if TYPE_CHECKING: - from pytest import MonkeyPatch - - -@dataclasses.dataclass(frozen=True) -class Instant: - """ - Represents an instant in time, used to both get the timestamp value and to measure - the duration of a time span. - - Inspired by Rust's `std::time::Instant`. - """ - - # Creation time of this instant, using time.time(), to measure actual time. - # Note: using a `lambda` to correctly get the mocked time via `MockTiming`. - time: float = dataclasses.field(default_factory=lambda: time(), init=False) - - # Performance counter tick of the instant, used to measure precise elapsed time. - # Note: using a `lambda` to correctly get the mocked time via `MockTiming`. - perf_count: float = dataclasses.field( - default_factory=lambda: perf_counter(), init=False - ) - - def elapsed(self) -> Duration: - """Measure the duration since `Instant` was created.""" - return Duration(start=self, stop=Instant()) - - def as_utc(self) -> datetime: - """Instant as UTC datetime.""" - return datetime.fromtimestamp(self.time, timezone.utc) - - -@dataclasses.dataclass(frozen=True) -class Duration: - """A span of time as measured by `Instant.elapsed()`.""" - - start: Instant - stop: Instant - - @property - def seconds(self) -> float: - """Elapsed time of the duration in seconds, measured using a performance counter for precise timing.""" - return self.stop.perf_count - self.start.perf_count - - -@dataclasses.dataclass -class MockTiming: - """Mocks _pytest.timing with a known object that can be used to control timing in tests - deterministically. - - pytest itself should always use functions from `_pytest.timing` instead of `time` directly. - - This then allows us more control over time during testing, if testing code also - uses `_pytest.timing` functions. - - Time is static, and only advances through `sleep` calls, thus tests might sleep over large - numbers and obtain accurate time() calls at the end, making tests reliable and instant.""" - - _current_time: float = datetime(2020, 5, 22, 14, 20, 50).timestamp() - - def sleep(self, seconds: float) -> None: - self._current_time += seconds - - def time(self) -> float: - return self._current_time - - def patch(self, monkeypatch: MonkeyPatch) -> None: - # pylint: disable-next=import-self - from _pytest import timing # noqa: PLW0406 - - monkeypatch.setattr(timing, "sleep", self.sleep) - monkeypatch.setattr(timing, "time", self.time) - monkeypatch.setattr(timing, "perf_counter", self.time) - __all__ = ["perf_counter", "sleep", "time"] diff --git a/Backend/venv/lib/python3.12/site-packages/_pytest/tmpdir.py b/Backend/venv/lib/python3.12/site-packages/_pytest/tmpdir.py index dcd5784f..3cc2bace 100644 --- a/Backend/venv/lib/python3.12/site-packages/_pytest/tmpdir.py +++ b/Backend/venv/lib/python3.12/site-packages/_pytest/tmpdir.py @@ -1,63 +1,68 @@ -# mypy: allow-untyped-defs """Support for providing temporary directories to test functions.""" - -from __future__ import annotations - -from collections.abc import Generator import dataclasses import os -from pathlib import Path import re -from shutil import rmtree import tempfile +from pathlib import Path +from shutil import rmtree from typing import Any -from typing import final -from typing import Literal +from typing import Dict +from typing import Generator +from typing import Optional +from typing import TYPE_CHECKING +from typing import Union + +from _pytest.nodes import Item +from _pytest.reports import CollectReport +from _pytest.stash import StashKey + +if TYPE_CHECKING: + from typing_extensions import Literal + + RetentionType = Literal["all", "failed", "none"] + + +from _pytest.config.argparsing import Parser -from .pathlib import cleanup_dead_symlinks from .pathlib import LOCK_TIMEOUT from .pathlib import make_numbered_dir from .pathlib import make_numbered_dir_with_cleanup from .pathlib import rm_rf -from _pytest.compat import get_user_id +from .pathlib import cleanup_dead_symlinks +from _pytest.compat import final, get_user_id from _pytest.config import Config from _pytest.config import ExitCode from _pytest.config import hookimpl -from _pytest.config.argparsing import Parser from _pytest.deprecated import check_ispytest from _pytest.fixtures import fixture from _pytest.fixtures import FixtureRequest from _pytest.monkeypatch import MonkeyPatch -from _pytest.nodes import Item -from _pytest.reports import TestReport -from _pytest.stash import StashKey - -tmppath_result_key = StashKey[dict[str, bool]]() -RetentionType = Literal["all", "failed", "none"] +tmppath_result_key = StashKey[Dict[str, bool]]() @final @dataclasses.dataclass class TempPathFactory: - """Factory for temporary directories under the common base temp directory, - as discussed at :ref:`temporary directory location and retention`. + """Factory for temporary directories under the common base temp directory. + + The base directory can be configured using the ``--basetemp`` option. """ - _given_basetemp: Path | None + _given_basetemp: Optional[Path] # pluggy TagTracerSub, not currently exposed, so Any. _trace: Any - _basetemp: Path | None + _basetemp: Optional[Path] _retention_count: int - _retention_policy: RetentionType + _retention_policy: "RetentionType" def __init__( self, - given_basetemp: Path | None, + given_basetemp: Optional[Path], retention_count: int, - retention_policy: RetentionType, + retention_policy: "RetentionType", trace, - basetemp: Path | None = None, + basetemp: Optional[Path] = None, *, _ispytest: bool = False, ) -> None: @@ -80,7 +85,7 @@ class TempPathFactory: config: Config, *, _ispytest: bool = False, - ) -> TempPathFactory: + ) -> "TempPathFactory": """Create a factory according to pytest configuration. :meta private: @@ -196,7 +201,7 @@ class TempPathFactory: return basetemp -def get_user() -> str | None: +def get_user() -> Optional[str]: """Return the current user name, or None if getuser() does not work in the current environment (see #1010).""" try: @@ -204,7 +209,7 @@ def get_user() -> str | None: import getpass return getpass.getuser() - except (ImportError, OSError, KeyError): + except (ImportError, KeyError): return None @@ -254,17 +259,26 @@ def _mk_tmp(request: FixtureRequest, factory: TempPathFactory) -> Path: @fixture def tmp_path( request: FixtureRequest, tmp_path_factory: TempPathFactory -) -> Generator[Path]: - """Return a temporary directory (as :class:`pathlib.Path` object) - which is unique to each test function invocation. - The temporary directory is created as a subdirectory - of the base temporary directory, with configurable retention, - as discussed in :ref:`temporary directory location and retention`. +) -> Generator[Path, None, None]: + """Return a temporary directory path object which is unique to each test + function invocation, created as a sub directory of the base temporary + directory. + + By default, a new base temporary directory is created each test session, + and old bases are removed after 3 sessions, to aid in debugging. + This behavior can be configured with :confval:`tmp_path_retention_count` and + :confval:`tmp_path_retention_policy`. + If ``--basetemp`` is used then it is cleared each session. See :ref:`base + temporary directory`. + + The returned object is a :class:`pathlib.Path` object. """ + path = _mk_tmp(request, tmp_path_factory) yield path # Remove the tmpdir if the policy is "failed" and the test passed. + tmp_path_factory: TempPathFactory = request.session.config._tmp_path_factory # type: ignore policy = tmp_path_factory._retention_policy result_dict = request.node.stash[tmppath_result_key] @@ -276,7 +290,7 @@ def tmp_path( del request.node.stash[tmppath_result_key] -def pytest_sessionfinish(session, exitstatus: int | ExitCode): +def pytest_sessionfinish(session, exitstatus: Union[int, ExitCode]): """After each session, remove base directory if all the tests passed, the policy is "failed", and the basetemp is not specified by a user. """ @@ -301,12 +315,10 @@ def pytest_sessionfinish(session, exitstatus: int | ExitCode): cleanup_dead_symlinks(basetemp) -@hookimpl(wrapper=True, tryfirst=True) -def pytest_runtest_makereport( - item: Item, call -) -> Generator[None, TestReport, TestReport]: - rep = yield - assert rep.when is not None - empty: dict[str, bool] = {} - item.stash.setdefault(tmppath_result_key, empty)[rep.when] = rep.passed - return rep +@hookimpl(tryfirst=True, hookwrapper=True) +def pytest_runtest_makereport(item: Item, call): + outcome = yield + result: CollectReport = outcome.get_result() + + empty: Dict[str, bool] = {} + item.stash.setdefault(tmppath_result_key, empty)[result.when] = result.passed diff --git a/Backend/venv/lib/python3.12/site-packages/_pytest/tracemalloc.py b/Backend/venv/lib/python3.12/site-packages/_pytest/tracemalloc.py deleted file mode 100644 index 5d0b1985..00000000 --- a/Backend/venv/lib/python3.12/site-packages/_pytest/tracemalloc.py +++ /dev/null @@ -1,24 +0,0 @@ -from __future__ import annotations - - -def tracemalloc_message(source: object) -> str: - if source is None: - return "" - - try: - import tracemalloc - except ImportError: - return "" - - tb = tracemalloc.get_object_traceback(source) - if tb is not None: - formatted_tb = "\n".join(tb.format()) - # Use a leading new line to better separate the (large) output - # from the traceback to the previous warning text. - return f"\nObject allocated at:\n{formatted_tb}" - # No need for a leading new line. - url = "https://docs.pytest.org/en/stable/how-to/capture-warnings.html#resource-warnings" - return ( - "Enable tracemalloc to get traceback where the object was allocated.\n" - f"See {url} for more info." - ) diff --git a/Backend/venv/lib/python3.12/site-packages/_pytest/unittest.py b/Backend/venv/lib/python3.12/site-packages/_pytest/unittest.py index 7498f1b0..d42a12a3 100644 --- a/Backend/venv/lib/python3.12/site-packages/_pytest/unittest.py +++ b/Backend/venv/lib/python3.12/site-packages/_pytest/unittest.py @@ -1,29 +1,24 @@ -# mypy: allow-untyped-defs """Discover and run std-library "unittest" style tests.""" - -from __future__ import annotations - -from collections.abc import Callable -from collections.abc import Generator -from collections.abc import Iterable -from collections.abc import Iterator -from enum import auto -from enum import Enum -import inspect import sys import traceback import types from typing import Any +from typing import Callable +from typing import Generator +from typing import Iterable +from typing import List +from typing import Optional +from typing import Tuple +from typing import Type from typing import TYPE_CHECKING -from unittest import TestCase +from typing import Union import _pytest._code -from _pytest._code import ExceptionInfo -from _pytest.compat import assert_never +import pytest +from _pytest.compat import getimfunc from _pytest.compat import is_async_function from _pytest.config import hookimpl from _pytest.fixtures import FixtureRequest -from _pytest.monkeypatch import MonkeyPatch from _pytest.nodes import Collector from _pytest.nodes import Item from _pytest.outcomes import exit @@ -34,45 +29,32 @@ from _pytest.python import Class from _pytest.python import Function from _pytest.python import Module from _pytest.runner import CallInfo -from _pytest.runner import check_interactive_exception -from _pytest.subtests import SubtestContext -from _pytest.subtests import SubtestReport - - -if sys.version_info[:2] < (3, 11): - from exceptiongroup import ExceptionGroup +from _pytest.scope import Scope if TYPE_CHECKING: - from types import TracebackType import unittest - import twisted.trial.unittest - -_SysExcInfoType = ( - tuple[type[BaseException], BaseException, types.TracebackType] - | tuple[None, None, None] -) + _SysExcInfoType = Union[ + Tuple[Type[BaseException], BaseException, types.TracebackType], + Tuple[None, None, None], + ] def pytest_pycollect_makeitem( - collector: Module | Class, name: str, obj: object -) -> UnitTestCase | None: + collector: Union[Module, Class], name: str, obj: object +) -> Optional["UnitTestCase"]: + # Has unittest been imported and is obj a subclass of its TestCase? try: - # Has unittest been imported? ut = sys.modules["unittest"] - # Is obj a subclass of unittest.TestCase? # Type ignored because `ut` is an opaque module. if not issubclass(obj, ut.TestCase): # type: ignore return None except Exception: return None - # Is obj a concrete class? - # Abstract classes can't be instantiated so no point collecting them. - if inspect.isabstract(obj): - return None # Yes, so let's collect it. - return UnitTestCase.from_parent(collector, name=name, obj=obj) + item: UnitTestCase = UnitTestCase.from_parent(collector, name=name, obj=obj) + return item class UnitTestCase(Class): @@ -80,15 +62,7 @@ class UnitTestCase(Class): # to declare that our children do not support funcargs. nofuncargs = True - def newinstance(self): - # TestCase __init__ takes the method (test) name. The TestCase - # constructor treats the name "runTest" as a special no-op, so it can be - # used when a dummy instance is needed. While unittest.TestCase has a - # default, some subclasses omit the default (#9610), so always supply - # it. - return self.obj("runTest") - - def collect(self) -> Iterable[Item | Collector]: + def collect(self) -> Iterable[Union[Item, Collector]]: from unittest import TestLoader cls = self.obj @@ -97,156 +71,157 @@ class UnitTestCase(Class): skipped = _is_skipped(cls) if not skipped: - self._register_unittest_setup_method_fixture(cls) - self._register_unittest_setup_class_fixture(cls) - self._register_setup_class_fixture() - - self.session._fixturemanager.parsefactories(self.newinstance(), self.nodeid) + self._inject_setup_teardown_fixtures(cls) + self._inject_setup_class_fixture() + self.session._fixturemanager.parsefactories(self, unittest=True) loader = TestLoader() foundsomething = False for name in loader.getTestCaseNames(self.obj): x = getattr(self.obj, name) if not getattr(x, "__test__", True): continue - yield TestCaseFunction.from_parent(self, name=name) + funcobj = getimfunc(x) + yield TestCaseFunction.from_parent(self, name=name, callobj=funcobj) foundsomething = True if not foundsomething: runtest = getattr(self.obj, "runTest", None) if runtest is not None: ut = sys.modules.get("twisted.trial.unittest", None) - if ut is None or runtest != ut.TestCase.runTest: + # Type ignored because `ut` is an opaque module. + if ut is None or runtest != ut.TestCase.runTest: # type: ignore yield TestCaseFunction.from_parent(self, name="runTest") - def _register_unittest_setup_class_fixture(self, cls: type) -> None: - """Register an auto-use fixture to invoke setUpClass and - tearDownClass (#517).""" - setup = getattr(cls, "setUpClass", None) - teardown = getattr(cls, "tearDownClass", None) - if setup is None and teardown is None: - return None - cleanup = getattr(cls, "doClassCleanups", lambda: None) + def _inject_setup_teardown_fixtures(self, cls: type) -> None: + """Injects a hidden auto-use fixture to invoke setUpClass/setup_method and corresponding + teardown functions (#517).""" + class_fixture = _make_xunit_fixture( + cls, + "setUpClass", + "tearDownClass", + "doClassCleanups", + scope=Scope.Class, + pass_self=False, + ) + if class_fixture: + cls.__pytest_class_setup = class_fixture # type: ignore[attr-defined] - def process_teardown_exceptions() -> None: - # tearDown_exceptions is a list set in the class containing exc_infos for errors during - # teardown for the class. - exc_infos = getattr(cls, "tearDown_exceptions", None) - if not exc_infos: - return - exceptions = [exc for (_, exc, _) in exc_infos] - # If a single exception, raise it directly as this provides a more readable - # error (hopefully this will improve in #12255). - if len(exceptions) == 1: - raise exceptions[0] - else: - raise ExceptionGroup("Unittest class cleanup errors", exceptions) + method_fixture = _make_xunit_fixture( + cls, + "setup_method", + "teardown_method", + None, + scope=Scope.Function, + pass_self=True, + ) + if method_fixture: + cls.__pytest_method_setup = method_fixture # type: ignore[attr-defined] - def unittest_setup_class_fixture( - request: FixtureRequest, - ) -> Generator[None]: - cls = request.cls - if _is_skipped(cls): - reason = cls.__unittest_skip_why__ - raise skip.Exception(reason, _use_item_location=True) - if setup is not None: - try: - setup() - # unittest does not call the cleanup function for every BaseException, so we - # follow this here. - except Exception: - cleanup() - process_teardown_exceptions() - raise - yield + +def _make_xunit_fixture( + obj: type, + setup_name: str, + teardown_name: str, + cleanup_name: Optional[str], + scope: Scope, + pass_self: bool, +): + setup = getattr(obj, setup_name, None) + teardown = getattr(obj, teardown_name, None) + if setup is None and teardown is None: + return None + + if cleanup_name: + cleanup = getattr(obj, cleanup_name, lambda *args: None) + else: + + def cleanup(*args): + pass + + @pytest.fixture( + scope=scope.value, + autouse=True, + # Use a unique name to speed up lookup. + name=f"_unittest_{setup_name}_fixture_{obj.__qualname__}", + ) + def fixture(self, request: FixtureRequest) -> Generator[None, None, None]: + if _is_skipped(self): + reason = self.__unittest_skip_why__ + raise pytest.skip.Exception(reason, _use_item_location=True) + if setup is not None: try: - if teardown is not None: - teardown() - finally: - cleanup() - process_teardown_exceptions() + if pass_self: + setup(self, request.function) + else: + setup() + # unittest does not call the cleanup function for every BaseException, so we + # follow this here. + except Exception: + if pass_self: + cleanup(self) + else: + cleanup() - self.session._fixturemanager._register_fixture( - # Use a unique name to speed up lookup. - name=f"_unittest_setUpClass_fixture_{cls.__qualname__}", - func=unittest_setup_class_fixture, - nodeid=self.nodeid, - scope="class", - autouse=True, - ) - - def _register_unittest_setup_method_fixture(self, cls: type) -> None: - """Register an auto-use fixture to invoke setup_method and - teardown_method (#517).""" - setup = getattr(cls, "setup_method", None) - teardown = getattr(cls, "teardown_method", None) - if setup is None and teardown is None: - return None - - def unittest_setup_method_fixture( - request: FixtureRequest, - ) -> Generator[None]: - self = request.instance - if _is_skipped(self): - reason = self.__unittest_skip_why__ - raise skip.Exception(reason, _use_item_location=True) - if setup is not None: - setup(self, request.function) - yield + raise + yield + try: if teardown is not None: - teardown(self, request.function) + if pass_self: + teardown(self, request.function) + else: + teardown() + finally: + if pass_self: + cleanup(self) + else: + cleanup() - self.session._fixturemanager._register_fixture( - # Use a unique name to speed up lookup. - name=f"_unittest_setup_method_fixture_{cls.__qualname__}", - func=unittest_setup_method_fixture, - nodeid=self.nodeid, - scope="function", - autouse=True, - ) + return fixture class TestCaseFunction(Function): nofuncargs = True - failfast = False - _excinfo: list[_pytest._code.ExceptionInfo[BaseException]] | None = None + _excinfo: Optional[List[_pytest._code.ExceptionInfo[BaseException]]] = None + _testcase: Optional["unittest.TestCase"] = None - def _getinstance(self): - assert isinstance(self.parent, UnitTestCase) - return self.parent.obj(self.name) - - # Backward compat for pytest-django; can be removed after pytest-django - # updates + some slack. - @property - def _testcase(self): - return self.instance + def _getobj(self): + assert self.parent is not None + # Unlike a regular Function in a Class, where `item.obj` returns + # a *bound* method (attached to an instance), TestCaseFunction's + # `obj` returns an *unbound* method (not attached to an instance). + # This inconsistency is probably not desirable, but needs some + # consideration before changing. + return getattr(self.parent.obj, self.originalname) # type: ignore[attr-defined] def setup(self) -> None: # A bound method to be called during teardown() if set (see 'runtest()'). - self._explicit_tearDown: Callable[[], None] | None = None - super().setup() + self._explicit_tearDown: Optional[Callable[[], None]] = None + assert self.parent is not None + self._testcase = self.parent.obj(self.name) # type: ignore[attr-defined] + self._obj = getattr(self._testcase, self.name) + if hasattr(self, "_request"): + self._request._fillfixtures() def teardown(self) -> None: if self._explicit_tearDown is not None: self._explicit_tearDown() self._explicit_tearDown = None + self._testcase = None self._obj = None - del self._instance - super().teardown() - def startTest(self, testcase: unittest.TestCase) -> None: + def startTest(self, testcase: "unittest.TestCase") -> None: pass - def _addexcinfo(self, rawexcinfo: _SysExcInfoType) -> None: - rawexcinfo = _handle_twisted_exc_info(rawexcinfo) + def _addexcinfo(self, rawexcinfo: "_SysExcInfoType") -> None: + # Unwrap potential exception info (see twisted trial support below). + rawexcinfo = getattr(rawexcinfo, "_rawexcinfo", rawexcinfo) try: - excinfo = _pytest._code.ExceptionInfo[BaseException].from_exc_info( - rawexcinfo # type: ignore[arg-type] - ) + excinfo = _pytest._code.ExceptionInfo[BaseException].from_exc_info(rawexcinfo) # type: ignore[arg-type] # Invoke the attributes to trigger storing the traceback # trial causes some issue there. - _ = excinfo.value - _ = excinfo.traceback + excinfo.value + excinfo.traceback except TypeError: try: try: @@ -262,7 +237,7 @@ class TestCaseFunction(Function): except BaseException: fail( "ERROR: Unknown Incompatible Exception " - f"representation:\n{rawexcinfo!r}", + "representation:\n%r" % (rawexcinfo,), pytrace=False, ) except KeyboardInterrupt: @@ -272,7 +247,7 @@ class TestCaseFunction(Function): self.__dict__.setdefault("_excinfo", []).append(excinfo) def addError( - self, testcase: unittest.TestCase, rawexcinfo: _SysExcInfoType + self, testcase: "unittest.TestCase", rawexcinfo: "_SysExcInfoType" ) -> None: try: if isinstance(rawexcinfo[1], exit.Exception): @@ -282,51 +257,20 @@ class TestCaseFunction(Function): self._addexcinfo(rawexcinfo) def addFailure( - self, testcase: unittest.TestCase, rawexcinfo: _SysExcInfoType + self, testcase: "unittest.TestCase", rawexcinfo: "_SysExcInfoType" ) -> None: self._addexcinfo(rawexcinfo) - def addSkip( - self, testcase: unittest.TestCase, reason: str, *, handle_subtests: bool = True - ) -> None: - from unittest.case import _SubTest # type: ignore[attr-defined] - - def add_skip() -> None: - try: - raise skip.Exception(reason, _use_item_location=True) - except skip.Exception: - self._addexcinfo(sys.exc_info()) - - if not handle_subtests: - add_skip() - return - - if isinstance(testcase, _SubTest): - add_skip() - if self._excinfo is not None: - exc_info = self._excinfo[-1] - self.addSubTest(testcase.test_case, testcase, exc_info) - else: - # For python < 3.11: the non-subtest skips have to be added by `add_skip` only after all subtest - # failures are processed by `_addSubTest`: `self.instance._outcome` has no attribute - # `skipped/errors` anymore. - # We also need to check if `self.instance._outcome` is `None` (this happens if the test - # class/method is decorated with `unittest.skip`, see pytest-dev/pytest-subtests#173). - if sys.version_info < (3, 11) and self.instance._outcome is not None: - subtest_errors = [ - x - for x, y in self.instance._outcome.errors - if isinstance(x, _SubTest) and y is not None - ] - if len(subtest_errors) == 0: - add_skip() - else: - add_skip() + def addSkip(self, testcase: "unittest.TestCase", reason: str) -> None: + try: + raise pytest.skip.Exception(reason, _use_item_location=True) + except skip.Exception: + self._addexcinfo(sys.exc_info()) def addExpectedFailure( self, - testcase: unittest.TestCase, - rawexcinfo: _SysExcInfoType, + testcase: "unittest.TestCase", + rawexcinfo: "_SysExcInfoType", reason: str = "", ) -> None: try: @@ -336,8 +280,8 @@ class TestCaseFunction(Function): def addUnexpectedSuccess( self, - testcase: unittest.TestCase, - reason: twisted.trial.unittest.Todo | None = None, + testcase: "unittest.TestCase", + reason: Optional["twisted.trial.unittest.Todo"] = None, ) -> None: msg = "Unexpected success" if reason: @@ -348,26 +292,26 @@ class TestCaseFunction(Function): except fail.Exception: self._addexcinfo(sys.exc_info()) - def addSuccess(self, testcase: unittest.TestCase) -> None: + def addSuccess(self, testcase: "unittest.TestCase") -> None: pass - def stopTest(self, testcase: unittest.TestCase) -> None: + def stopTest(self, testcase: "unittest.TestCase") -> None: pass - def addDuration(self, testcase: unittest.TestCase, elapsed: float) -> None: + def addDuration(self, testcase: "unittest.TestCase", elapsed: float) -> None: pass def runtest(self) -> None: from _pytest.debugging import maybe_wrap_pytest_function_for_tracing - testcase = self.instance - assert testcase is not None + assert self._testcase is not None maybe_wrap_pytest_function_for_tracing(self) # Let the unittest framework handle async functions. if is_async_function(self.obj): - testcase(result=self) + # Type ignored because self acts as the TestResult, but is not actually one. + self._testcase(result=self) # type: ignore[arg-type] else: # When --pdb is given, we want to postpone calling tearDown() otherwise # when entering the pdb prompt, tearDown() would have probably cleaned up @@ -379,16 +323,16 @@ class TestCaseFunction(Function): assert isinstance(self.parent, UnitTestCase) skipped = _is_skipped(self.obj) or _is_skipped(self.parent.obj) if self.config.getoption("usepdb") and not skipped: - self._explicit_tearDown = testcase.tearDown - setattr(testcase, "tearDown", lambda *args: None) + self._explicit_tearDown = self._testcase.tearDown + setattr(self._testcase, "tearDown", lambda *args: None) # We need to update the actual bound method with self.obj, because # wrap_pytest_function_for_tracing replaces self.obj by a wrapper. - setattr(testcase, self.name, self.obj) + setattr(self._testcase, self.name, self.obj) try: - testcase(result=self) + self._testcase(result=self) # type: ignore[arg-type] finally: - delattr(testcase, self.name) + delattr(self._testcase, self.name) def _traceback_filter( self, excinfo: _pytest._code.ExceptionInfo[BaseException] @@ -401,70 +345,6 @@ class TestCaseFunction(Function): ntraceback = traceback return ntraceback - def addSubTest( - self, - test_case: Any, - test: TestCase, - exc_info: ExceptionInfo[BaseException] - | tuple[type[BaseException], BaseException, TracebackType] - | None, - ) -> None: - exception_info: ExceptionInfo[BaseException] | None - match exc_info: - case tuple(): - exception_info = ExceptionInfo(exc_info, _ispytest=True) - case ExceptionInfo() | None: - exception_info = exc_info - case unreachable: - assert_never(unreachable) - - call_info = CallInfo[None]( - None, - exception_info, - start=0, - stop=0, - duration=0, - when="call", - _ispytest=True, - ) - msg = test._message if isinstance(test._message, str) else None # type: ignore[attr-defined] - report = self.ihook.pytest_runtest_makereport(item=self, call=call_info) - sub_report = SubtestReport._new( - report, - SubtestContext(msg=msg, kwargs=dict(test.params)), # type: ignore[attr-defined] - captured_output=None, - captured_logs=None, - ) - self.ihook.pytest_runtest_logreport(report=sub_report) - if check_interactive_exception(call_info, sub_report): - self.ihook.pytest_exception_interact( - node=self, call=call_info, report=sub_report - ) - - # For python < 3.11: add non-subtest skips once all subtest failures are processed by # `_addSubTest`. - if sys.version_info < (3, 11): - from unittest.case import _SubTest # type: ignore[attr-defined] - - non_subtest_skip = [ - (x, y) - for x, y in self.instance._outcome.skipped - if not isinstance(x, _SubTest) - ] - subtest_errors = [ - (x, y) - for x, y in self.instance._outcome.errors - if isinstance(x, _SubTest) and y is not None - ] - # Check if we have non-subtest skips: if there are also sub failures, non-subtest skips are not treated in - # `_addSubTest` and have to be added using `add_skip` after all subtest failures are processed. - if len(non_subtest_skip) > 0 and len(subtest_errors) > 0: - # Make sure we have processed the last subtest failure - last_subset_error = subtest_errors[-1] - if exc_info is last_subset_error[-1]: - # Add non-subtest skips (as they could not be treated in `_addSkip`) - for testcase, reason in non_subtest_skip: - self.addSkip(testcase, reason, handle_subtests=False) - @hookimpl(tryfirst=True) def pytest_runtest_makereport(item: Item, call: CallInfo[None]) -> None: @@ -477,138 +357,65 @@ def pytest_runtest_makereport(item: Item, call: CallInfo[None]) -> None: pass # Convert unittest.SkipTest to pytest.skip. - # This covers explicit `raise unittest.SkipTest`. + # This is actually only needed for nose, which reuses unittest.SkipTest for + # its own nose.SkipTest. For unittest TestCases, SkipTest is already + # handled internally, and doesn't reach here. unittest = sys.modules.get("unittest") - if unittest and call.excinfo and isinstance(call.excinfo.value, unittest.SkipTest): + if ( + unittest + and call.excinfo + and isinstance(call.excinfo.value, unittest.SkipTest) # type: ignore[attr-defined] + ): excinfo = call.excinfo - call2 = CallInfo[None].from_call(lambda: skip(str(excinfo.value)), call.when) + call2 = CallInfo[None].from_call( + lambda: pytest.skip(str(excinfo.value)), call.when + ) call.excinfo = call2.excinfo +# Twisted trial support. + + +@hookimpl(hookwrapper=True) +def pytest_runtest_protocol(item: Item) -> Generator[None, None, None]: + if isinstance(item, TestCaseFunction) and "twisted.trial.unittest" in sys.modules: + ut: Any = sys.modules["twisted.python.failure"] + Failure__init__ = ut.Failure.__init__ + check_testcase_implements_trial_reporter() + + def excstore( + self, exc_value=None, exc_type=None, exc_tb=None, captureVars=None + ): + if exc_value is None: + self._rawexcinfo = sys.exc_info() + else: + if exc_type is None: + exc_type = type(exc_value) + self._rawexcinfo = (exc_type, exc_value, exc_tb) + try: + Failure__init__( + self, exc_value, exc_type, exc_tb, captureVars=captureVars + ) + except TypeError: + Failure__init__(self, exc_value, exc_type, exc_tb) + + ut.Failure.__init__ = excstore + yield + ut.Failure.__init__ = Failure__init__ + else: + yield + + +def check_testcase_implements_trial_reporter(done: List[int] = []) -> None: + if done: + return + from zope.interface import classImplements + from twisted.trial.itrial import IReporter + + classImplements(TestCaseFunction, IReporter) + done.append(1) + + def _is_skipped(obj) -> bool: """Return True if the given object has been marked with @unittest.skip.""" return bool(getattr(obj, "__unittest_skip__", False)) - - -def pytest_configure() -> None: - """Register the TestCaseFunction class as an IReporter if twisted.trial is available.""" - if _get_twisted_version() is not TwistedVersion.NotInstalled: - from twisted.trial.itrial import IReporter - from zope.interface import classImplements - - classImplements(TestCaseFunction, IReporter) - - -class TwistedVersion(Enum): - """ - The Twisted version installed in the environment. - - We have different workarounds in place for different versions of Twisted. - """ - - # Twisted version 24 or prior. - Version24 = auto() - # Twisted version 25 or later. - Version25 = auto() - # Twisted version is not available. - NotInstalled = auto() - - -def _get_twisted_version() -> TwistedVersion: - # We need to check if "twisted.trial.unittest" is specifically present in sys.modules. - # This is because we intend to integrate with Trial only when it's actively running - # the test suite, but not needed when only other Twisted components are in use. - if "twisted.trial.unittest" not in sys.modules: - return TwistedVersion.NotInstalled - - import importlib.metadata - - import packaging.version - - version_str = importlib.metadata.version("twisted") - version = packaging.version.parse(version_str) - if version.major <= 24: - return TwistedVersion.Version24 - else: - return TwistedVersion.Version25 - - -# Name of the attribute in `twisted.python.Failure` instances that stores -# the `sys.exc_info()` tuple. -# See twisted.trial support in `pytest_runtest_protocol`. -TWISTED_RAW_EXCINFO_ATTR = "_twisted_raw_excinfo" - - -@hookimpl(wrapper=True) -def pytest_runtest_protocol(item: Item) -> Iterator[None]: - if _get_twisted_version() is TwistedVersion.Version24: - import twisted.python.failure as ut - - # Monkeypatch `Failure.__init__` to store the raw exception info. - original__init__ = ut.Failure.__init__ - - def store_raw_exception_info( - self, exc_value=None, exc_type=None, exc_tb=None, captureVars=None - ): # pragma: no cover - if exc_value is None: - raw_exc_info = sys.exc_info() - else: - if exc_type is None: - exc_type = type(exc_value) - if exc_tb is None: - exc_tb = sys.exc_info()[2] - raw_exc_info = (exc_type, exc_value, exc_tb) - setattr(self, TWISTED_RAW_EXCINFO_ATTR, tuple(raw_exc_info)) - try: - original__init__( - self, exc_value, exc_type, exc_tb, captureVars=captureVars - ) - except TypeError: # pragma: no cover - original__init__(self, exc_value, exc_type, exc_tb) - - with MonkeyPatch.context() as patcher: - patcher.setattr(ut.Failure, "__init__", store_raw_exception_info) - return (yield) - else: - return (yield) - - -def _handle_twisted_exc_info( - rawexcinfo: _SysExcInfoType | BaseException, -) -> _SysExcInfoType: - """ - Twisted passes a custom Failure instance to `addError()` instead of using `sys.exc_info()`. - Therefore, if `rawexcinfo` is a `Failure` instance, convert it into the equivalent `sys.exc_info()` tuple - as expected by pytest. - """ - twisted_version = _get_twisted_version() - if twisted_version is TwistedVersion.NotInstalled: - # Unfortunately, because we cannot import `twisted.python.failure` at the top of the file - # and use it in the signature, we need to use `type:ignore` here because we cannot narrow - # the type properly in the `if` statement above. - return rawexcinfo # type:ignore[return-value] - elif twisted_version is TwistedVersion.Version24: - # Twisted calls addError() passing its own classes (like `twisted.python.Failure`), which violates - # the `addError()` signature, so we extract the original `sys.exc_info()` tuple which is stored - # in the object. - if hasattr(rawexcinfo, TWISTED_RAW_EXCINFO_ATTR): - saved_exc_info = getattr(rawexcinfo, TWISTED_RAW_EXCINFO_ATTR) - # Delete the attribute from the original object to avoid leaks. - delattr(rawexcinfo, TWISTED_RAW_EXCINFO_ATTR) - return saved_exc_info # type:ignore[no-any-return] - return rawexcinfo # type:ignore[return-value] - elif twisted_version is TwistedVersion.Version25: - if isinstance(rawexcinfo, BaseException): - import twisted.python.failure - - if isinstance(rawexcinfo, twisted.python.failure.Failure): - tb = rawexcinfo.__traceback__ - if tb is None: - tb = sys.exc_info()[2] - return type(rawexcinfo.value), rawexcinfo.value, tb - - return rawexcinfo # type:ignore[return-value] - else: - # Ideally we would use assert_never() here, but it is not available in all Python versions - # we support, plus we do not require `type_extensions` currently. - assert False, f"Unexpected Twisted version: {twisted_version}" diff --git a/Backend/venv/lib/python3.12/site-packages/_pytest/unraisableexception.py b/Backend/venv/lib/python3.12/site-packages/_pytest/unraisableexception.py index 0faca36a..fcb5d823 100644 --- a/Backend/venv/lib/python3.12/site-packages/_pytest/unraisableexception.py +++ b/Backend/venv/lib/python3.12/site-packages/_pytest/unraisableexception.py @@ -1,163 +1,93 @@ -from __future__ import annotations - -import collections -from collections.abc import Callable -import functools -import gc import sys import traceback -from typing import NamedTuple -from typing import TYPE_CHECKING import warnings +from types import TracebackType +from typing import Any +from typing import Callable +from typing import Generator +from typing import Optional +from typing import Type -from _pytest.config import Config -from _pytest.nodes import Item -from _pytest.stash import StashKey -from _pytest.tracemalloc import tracemalloc_message import pytest -if TYPE_CHECKING: - pass +# Copied from cpython/Lib/test/support/__init__.py, with modifications. +class catch_unraisable_exception: + """Context manager catching unraisable exception using sys.unraisablehook. -if sys.version_info < (3, 11): - from exceptiongroup import ExceptionGroup + Storing the exception value (cm.unraisable.exc_value) creates a reference + cycle. The reference cycle is broken explicitly when the context manager + exits. + + Storing the object (cm.unraisable.object) can resurrect it if it is set to + an object which is being finalized. Exiting the context manager clears the + stored object. + + Usage: + with catch_unraisable_exception() as cm: + # code creating an "unraisable exception" + ... + # check the unraisable exception: use cm.unraisable + ... + # cm.unraisable attribute no longer exists at this point + # (to break a reference cycle) + """ + + def __init__(self) -> None: + self.unraisable: Optional["sys.UnraisableHookArgs"] = None + self._old_hook: Optional[Callable[["sys.UnraisableHookArgs"], Any]] = None + + def _hook(self, unraisable: "sys.UnraisableHookArgs") -> None: + # Storing unraisable.object can resurrect an object which is being + # finalized. Storing unraisable.exc_value creates a reference cycle. + self.unraisable = unraisable + + def __enter__(self) -> "catch_unraisable_exception": + self._old_hook = sys.unraisablehook + sys.unraisablehook = self._hook + return self + + def __exit__( + self, + exc_type: Optional[Type[BaseException]], + exc_val: Optional[BaseException], + exc_tb: Optional[TracebackType], + ) -> None: + assert self._old_hook is not None + sys.unraisablehook = self._old_hook + self._old_hook = None + del self.unraisable -# This is a stash item and not a simple constant to allow pytester to override it. -gc_collect_iterations_key = StashKey[int]() - - -def gc_collect_harder(iterations: int) -> None: - for _ in range(iterations): - gc.collect() - - -class UnraisableMeta(NamedTuple): - msg: str - cause_msg: str - exc_value: BaseException | None - - -unraisable_exceptions: StashKey[collections.deque[UnraisableMeta | BaseException]] = ( - StashKey() -) - - -def collect_unraisable(config: Config) -> None: - pop_unraisable = config.stash[unraisable_exceptions].pop - errors: list[pytest.PytestUnraisableExceptionWarning | RuntimeError] = [] - meta = None - hook_error = None - try: - while True: - try: - meta = pop_unraisable() - except IndexError: - break - - if isinstance(meta, BaseException): - hook_error = RuntimeError("Failed to process unraisable exception") - hook_error.__cause__ = meta - errors.append(hook_error) - continue - - msg = meta.msg - try: - warnings.warn(pytest.PytestUnraisableExceptionWarning(msg)) - except pytest.PytestUnraisableExceptionWarning as e: - # This except happens when the warning is treated as an error (e.g. `-Werror`). - if meta.exc_value is not None: - # Exceptions have a better way to show the traceback, but - # warnings do not, so hide the traceback from the msg and - # set the cause so the traceback shows up in the right place. - e.args = (meta.cause_msg,) - e.__cause__ = meta.exc_value - errors.append(e) - - if len(errors) == 1: - raise errors[0] - if errors: - raise ExceptionGroup("multiple unraisable exception warnings", errors) - finally: - del errors, meta, hook_error - - -def cleanup( - *, config: Config, prev_hook: Callable[[sys.UnraisableHookArgs], object] -) -> None: - # A single collection doesn't necessarily collect everything. - # Constant determined experimentally by the Trio project. - gc_collect_iterations = config.stash.get(gc_collect_iterations_key, 5) - try: - try: - gc_collect_harder(gc_collect_iterations) - collect_unraisable(config) - finally: - sys.unraisablehook = prev_hook - finally: - del config.stash[unraisable_exceptions] - - -def unraisable_hook( - unraisable: sys.UnraisableHookArgs, - /, - *, - append: Callable[[UnraisableMeta | BaseException], object], -) -> None: - try: - # we need to compute these strings here as they might change after - # the unraisablehook finishes and before the metadata object is - # collected by a pytest hook - err_msg = ( - "Exception ignored in" if unraisable.err_msg is None else unraisable.err_msg - ) - summary = f"{err_msg}: {unraisable.object!r}" - traceback_message = "\n\n" + "".join( - traceback.format_exception( - unraisable.exc_type, - unraisable.exc_value, - unraisable.exc_traceback, +def unraisable_exception_runtest_hook() -> Generator[None, None, None]: + with catch_unraisable_exception() as cm: + yield + if cm.unraisable: + if cm.unraisable.err_msg is not None: + err_msg = cm.unraisable.err_msg + else: + err_msg = "Exception ignored in" + msg = f"{err_msg}: {cm.unraisable.object!r}\n\n" + msg += "".join( + traceback.format_exception( + cm.unraisable.exc_type, + cm.unraisable.exc_value, + cm.unraisable.exc_traceback, + ) ) - ) - tracemalloc_tb = "\n" + tracemalloc_message(unraisable.object) - msg = summary + traceback_message + tracemalloc_tb - cause_msg = summary + tracemalloc_tb - - append( - UnraisableMeta( - msg=msg, - cause_msg=cause_msg, - exc_value=unraisable.exc_value, - ) - ) - except BaseException as e: - append(e) - # Raising this will cause the exception to be logged twice, once in our - # collect_unraisable and once by the unraisablehook calling machinery - # which is fine - this should never happen anyway and if it does - # it should probably be reported as a pytest bug. - raise + warnings.warn(pytest.PytestUnraisableExceptionWarning(msg)) -def pytest_configure(config: Config) -> None: - prev_hook = sys.unraisablehook - deque: collections.deque[UnraisableMeta | BaseException] = collections.deque() - config.stash[unraisable_exceptions] = deque - config.add_cleanup(functools.partial(cleanup, config=config, prev_hook=prev_hook)) - sys.unraisablehook = functools.partial(unraisable_hook, append=deque.append) +@pytest.hookimpl(hookwrapper=True, tryfirst=True) +def pytest_runtest_setup() -> Generator[None, None, None]: + yield from unraisable_exception_runtest_hook() -@pytest.hookimpl(trylast=True) -def pytest_runtest_setup(item: Item) -> None: - collect_unraisable(item.config) +@pytest.hookimpl(hookwrapper=True, tryfirst=True) +def pytest_runtest_call() -> Generator[None, None, None]: + yield from unraisable_exception_runtest_hook() -@pytest.hookimpl(trylast=True) -def pytest_runtest_call(item: Item) -> None: - collect_unraisable(item.config) - - -@pytest.hookimpl(trylast=True) -def pytest_runtest_teardown(item: Item) -> None: - collect_unraisable(item.config) +@pytest.hookimpl(hookwrapper=True, tryfirst=True) +def pytest_runtest_teardown() -> Generator[None, None, None]: + yield from unraisable_exception_runtest_hook() diff --git a/Backend/venv/lib/python3.12/site-packages/_pytest/warning_types.py b/Backend/venv/lib/python3.12/site-packages/_pytest/warning_types.py index 93071b4a..bd5f4187 100644 --- a/Backend/venv/lib/python3.12/site-packages/_pytest/warning_types.py +++ b/Backend/venv/lib/python3.12/site-packages/_pytest/warning_types.py @@ -1,13 +1,13 @@ -from __future__ import annotations - import dataclasses import inspect +import warnings from types import FunctionType from typing import Any -from typing import final from typing import Generic +from typing import Type from typing import TypeVar -import warnings + +from _pytest.compat import final class PytestWarning(UserWarning): @@ -50,14 +50,14 @@ class PytestDeprecationWarning(PytestWarning, DeprecationWarning): __module__ = "pytest" -class PytestRemovedIn9Warning(PytestDeprecationWarning): - """Warning class for features that will be removed in pytest 9.""" +class PytestRemovedIn8Warning(PytestDeprecationWarning): + """Warning class for features that will be removed in pytest 8.""" __module__ = "pytest" -class PytestRemovedIn10Warning(PytestDeprecationWarning): - """Warning class for features that will be removed in pytest 10.""" +class PytestReturnNotNoneWarning(PytestRemovedIn8Warning): + """Warning emitted when a test function is returning value other than None.""" __module__ = "pytest" @@ -73,16 +73,21 @@ class PytestExperimentalApiWarning(PytestWarning, FutureWarning): __module__ = "pytest" @classmethod - def simple(cls, apiname: str) -> PytestExperimentalApiWarning: - return cls(f"{apiname} is an experimental api that may change over time") + def simple(cls, apiname: str) -> "PytestExperimentalApiWarning": + return cls( + "{apiname} is an experimental api that may change over time".format( + apiname=apiname + ) + ) @final -class PytestReturnNotNoneWarning(PytestWarning): - """ - Warning emitted when a test function returns a value other than ``None``. +class PytestUnhandledCoroutineWarning(PytestReturnNotNoneWarning): + """Warning emitted for an unhandled coroutine. - See :ref:`return-not-none` for details. + A coroutine was encountered when collecting test functions, but was not + handled by any async-aware plugin. + Coroutine test functions are not natively supported. """ __module__ = "pytest" @@ -132,7 +137,7 @@ class UnformattedWarning(Generic[_W]): as opposed to a direct message. """ - category: type[_W] + category: Type["_W"] template: str def format(self, **kwargs: Any) -> _W: @@ -140,13 +145,6 @@ class UnformattedWarning(Generic[_W]): return self.category(self.template.format(**kwargs)) -@final -class PytestFDWarning(PytestWarning): - """When the lsof plugin finds leaked fds.""" - - __module__ = "pytest" - - def warn_explicit_for(method: FunctionType, message: PytestWarning) -> None: """ Issue the warning :param:`message` for the definition of the given :param:`method` diff --git a/Backend/venv/lib/python3.12/site-packages/_pytest/warnings.py b/Backend/venv/lib/python3.12/site-packages/_pytest/warnings.py index 1dbf0025..4aaa9445 100644 --- a/Backend/venv/lib/python3.12/site-packages/_pytest/warnings.py +++ b/Backend/venv/lib/python3.12/site-packages/_pytest/warnings.py @@ -1,32 +1,37 @@ -# mypy: allow-untyped-defs -from __future__ import annotations - -from collections.abc import Generator -from contextlib import contextmanager -from contextlib import ExitStack import sys -from typing import Literal import warnings +from contextlib import contextmanager +from typing import Generator +from typing import Optional +from typing import TYPE_CHECKING +import pytest from _pytest.config import apply_warning_filters from _pytest.config import Config from _pytest.config import parse_warning_filter from _pytest.main import Session from _pytest.nodes import Item from _pytest.terminal import TerminalReporter -from _pytest.tracemalloc import tracemalloc_message -import pytest + +if TYPE_CHECKING: + from typing_extensions import Literal + + +def pytest_configure(config: Config) -> None: + config.addinivalue_line( + "markers", + "filterwarnings(warning): add a warning filter to the given test. " + "see https://docs.pytest.org/en/stable/how-to/capture-warnings.html#pytest-mark-filterwarnings ", + ) @contextmanager def catch_warnings_for_item( config: Config, ihook, - when: Literal["config", "collect", "runtest"], - item: Item | None, - *, - record: bool = True, -) -> Generator[None]: + when: "Literal['config', 'collect', 'runtest']", + item: Optional[Item], +) -> Generator[None, None, None]: """Context manager that catches warnings generated in the contained execution block. ``item`` can be None if we are not in the context of an item execution. @@ -35,14 +40,15 @@ def catch_warnings_for_item( """ config_filters = config.getini("filterwarnings") cmdline_filters = config.known_args_namespace.pythonwarnings or [] - with warnings.catch_warnings(record=record) as log: + with warnings.catch_warnings(record=True) as log: + # mypy can't infer that record=True means log is not None; help it. + assert log is not None + if not sys.warnoptions: # If user is not explicitly configuring warning filters, show deprecation warnings by default (#2908). warnings.filterwarnings("always", category=DeprecationWarning) warnings.filterwarnings("always", category=PendingDeprecationWarning) - warnings.filterwarnings("error", category=pytest.PytestRemovedIn9Warning) - apply_warning_filters(config_filters, cmdline_filters) # apply filters from "filterwarnings" marks @@ -52,100 +58,91 @@ def catch_warnings_for_item( for arg in mark.args: warnings.filterwarnings(*parse_warning_filter(arg, escape=False)) - try: - yield - finally: - if record: - # mypy can't infer that record=True means log is not None; help it. - assert log is not None + yield - for warning_message in log: - ihook.pytest_warning_recorded.call_historic( - kwargs=dict( - warning_message=warning_message, - nodeid=nodeid, - when=when, - location=None, - ) - ) + for warning_message in log: + ihook.pytest_warning_recorded.call_historic( + kwargs=dict( + warning_message=warning_message, + nodeid=nodeid, + when=when, + location=None, + ) + ) def warning_record_to_str(warning_message: warnings.WarningMessage) -> str: """Convert a warnings.WarningMessage to a string.""" - return warnings.formatwarning( - str(warning_message.message), + warn_msg = warning_message.message + msg = warnings.formatwarning( + str(warn_msg), warning_message.category, warning_message.filename, warning_message.lineno, warning_message.line, - ) + tracemalloc_message(warning_message.source) + ) + if warning_message.source is not None: + try: + import tracemalloc + except ImportError: + pass + else: + tb = tracemalloc.get_object_traceback(warning_message.source) + if tb is not None: + formatted_tb = "\n".join(tb.format()) + # Use a leading new line to better separate the (large) output + # from the traceback to the previous warning text. + msg += f"\nObject allocated at:\n{formatted_tb}" + else: + # No need for a leading new line. + url = "https://docs.pytest.org/en/stable/how-to/capture-warnings.html#resource-warnings" + msg += "Enable tracemalloc to get traceback where the object was allocated.\n" + msg += f"See {url} for more info." + return msg -@pytest.hookimpl(wrapper=True, tryfirst=True) -def pytest_runtest_protocol(item: Item) -> Generator[None, object, object]: +@pytest.hookimpl(hookwrapper=True, tryfirst=True) +def pytest_runtest_protocol(item: Item) -> Generator[None, None, None]: with catch_warnings_for_item( config=item.config, ihook=item.ihook, when="runtest", item=item ): - return (yield) + yield -@pytest.hookimpl(wrapper=True, tryfirst=True) -def pytest_collection(session: Session) -> Generator[None, object, object]: +@pytest.hookimpl(hookwrapper=True, tryfirst=True) +def pytest_collection(session: Session) -> Generator[None, None, None]: config = session.config with catch_warnings_for_item( config=config, ihook=config.hook, when="collect", item=None ): - return (yield) + yield -@pytest.hookimpl(wrapper=True) +@pytest.hookimpl(hookwrapper=True) def pytest_terminal_summary( terminalreporter: TerminalReporter, -) -> Generator[None]: +) -> Generator[None, None, None]: config = terminalreporter.config with catch_warnings_for_item( config=config, ihook=config.hook, when="config", item=None ): - return (yield) + yield -@pytest.hookimpl(wrapper=True) -def pytest_sessionfinish(session: Session) -> Generator[None]: +@pytest.hookimpl(hookwrapper=True) +def pytest_sessionfinish(session: Session) -> Generator[None, None, None]: config = session.config with catch_warnings_for_item( config=config, ihook=config.hook, when="config", item=None ): - return (yield) + yield -@pytest.hookimpl(wrapper=True) +@pytest.hookimpl(hookwrapper=True) def pytest_load_initial_conftests( - early_config: Config, -) -> Generator[None]: + early_config: "Config", +) -> Generator[None, None, None]: with catch_warnings_for_item( config=early_config, ihook=early_config.hook, when="config", item=None ): - return (yield) - - -def pytest_configure(config: Config) -> None: - with ExitStack() as stack: - stack.enter_context( - catch_warnings_for_item( - config=config, - ihook=config.hook, - when="config", - item=None, - # this disables recording because the terminalreporter has - # finished by the time it comes to reporting logged warnings - # from the end of config cleanup. So for now, this is only - # useful for setting a warning filter with an 'error' action. - record=False, - ) - ) - config.addinivalue_line( - "markers", - "filterwarnings(warning): add a warning filter to the given test. " - "see https://docs.pytest.org/en/stable/how-to/capture-warnings.html#pytest-mark-filterwarnings ", - ) - config.add_cleanup(stack.pop_all().close) + yield diff --git a/Backend/venv/lib/python3.12/site-packages/aiofiles/__pycache__/__init__.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/aiofiles/__pycache__/__init__.cpython-312.pyc index 47c3d7802485f3221b31b53d3c58061c3dab8b1b..adf6c598d8052396ef675f71945a9db73b303ee1 100644 GIT binary patch delta 20 acmbQhGJ%ErG%qg~0}$MDFy6?`$^-x})&w&E delta 20 acmbQhGJ%ErG%qg~0}wokP}s=L$^-x~O$0&! diff --git a/Backend/venv/lib/python3.12/site-packages/aiofiles/__pycache__/base.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/aiofiles/__pycache__/base.cpython-312.pyc index 34b358f337e3bfcf1829fa35959d6042cb1aa385..f975bb722a60bd7c1ea851d73da77b182d4f72ac 100644 GIT binary patch delta 20 acmZ2rw7`h_G%qg~0}$MDFy6>5DhU8MLpAP^yb_G8G delta 20 acmZ1_yGoY(G%qg~0}wokP}s;lpAP^y?FCK% diff --git a/Backend/venv/lib/python3.12/site-packages/aiofiles/threadpool/__pycache__/__init__.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/aiofiles/threadpool/__pycache__/__init__.cpython-312.pyc index c489af889ce18c10ea1b9f46cbe6ce3726e74836..73c841f82a4c1bb7c4f6af41b0f5ec427f992116 100644 GIT binary patch delta 20 acmaE?{8*X$G%qg~0}$MDFy6?0Ll6K$IR*Iu delta 20 acmaE?{8*X$G%qg~0}wokP}sqa diff --git a/Backend/venv/lib/python3.12/site-packages/aiosmtplib/__pycache__/__init__.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/aiosmtplib/__pycache__/__init__.cpython-312.pyc index 731e8e184eb6bcd26d750c6e233ac6de1fb2496c..2491ad2e3f95986fa3e5c9d9c1a1a06a9f6f8fe0 100644 GIT binary patch delta 20 acmcb>b%BffG%qg~0}$MDFy6@R$_fBFu>}GE delta 20 acmcb>b%BffG%qg~0}wokP}s=r$_fBGC5APoRGuLRKm delta 20 acmbPjHrtH*G%qg~0}wokP}s;VAPoRHCIsLB diff --git a/Backend/venv/lib/python3.12/site-packages/aiosmtplib/__pycache__/auth.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/aiosmtplib/__pycache__/auth.cpython-312.pyc index a5406ee771f5c87b51a5fe95933fc367c1783bfb..5b2e28102a3cb775c42945e56962afde3ff43c03 100644 GIT binary patch delta 20 acmZ20x>l6?G%qg~0}$MDFy6?$hzkHW$^|q4 delta 20 acmZ20x>l6?G%qg~0}wokP}s=5hzkHXK?Oqq diff --git a/Backend/venv/lib/python3.12/site-packages/aiosmtplib/__pycache__/email.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/aiosmtplib/__pycache__/email.cpython-312.pyc index a7bcae01002c5dbf90df0f356f32943ef4bc5cf3..96b6c945a6c4cbd6c0234a68f691caa390b6ceb9 100644 GIT binary patch delta 20 acmexu`P-8FG%qg~0}$MDFy6@hK?VRx90qs* delta 20 acmexu`P-8FG%qg~0}wokP}s=*K?VRxlLm(X diff --git a/Backend/venv/lib/python3.12/site-packages/aiosmtplib/__pycache__/errors.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/aiosmtplib/__pycache__/errors.cpython-312.pyc index f71076a108b3505eeaa9af6742fab6cb635c8ad5..8772c0612e001cb3ac6416bbc184a61c477fd556 100644 GIT binary patch delta 20 acmeyT@lS*MG%qg~0}$MDFy6>rECK*VCk delta 22 ccmeC{VeIQ+LX71Cxyj%=GaLd7XBlp@509;fD*#H0l delta 22 ccmdn-ka@>LX71Cxyj%=G@FYTEBlp@509?xl=l}o! diff --git a/Backend/venv/lib/python3.12/site-packages/aiosmtplib/__pycache__/typing.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/aiosmtplib/__pycache__/typing.cpython-312.pyc index cd3ea2f42277aae7e27e8b138d7a442b53497085..77dfd99d32e0aa23512a90727782eca240ac7176 100644 GIT binary patch delta 20 acmdljuv>upG%qg~0}$MDFy6>*zySa_LupG%qg~0}wokP}sy` diff --git a/Backend/venv/lib/python3.12/site-packages/alembic/__pycache__/command.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/alembic/__pycache__/command.cpython-312.pyc index e5b0425d93b7cce26151dc648a43ac7a1c1ea423..aa5429115c0110f0759f4e3f77b18de312e6b182 100644 GIT binary patch delta 22 ccmaETmGSjeM()$Ryj%=GaLd7XBlm+W0AfK0&;S4c delta 22 ccmaETmGSjeM()$Ryj%=G@FYTEBlm+W0AjcY-v9sr diff --git a/Backend/venv/lib/python3.12/site-packages/alembic/__pycache__/config.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/alembic/__pycache__/config.cpython-312.pyc index e71f2454feef30fa90774a70d025f4a13c158f5f..531e1a088ca4b795d96ab6fc32959ae543f447c8 100644 GIT binary patch delta 22 ccmbQYg>l{%M()$Ryj%=GaLd7XBe!rA08cvx7XSbN delta 22 ccmbQYg>l{%M()$Ryj%=G@FYTEBe!rA08g?8CIA2c diff --git a/Backend/venv/lib/python3.12/site-packages/alembic/__pycache__/context.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/alembic/__pycache__/context.cpython-312.pyc index 46f99ee137bce86b72c14ea323dd32a4de66b643..27c383d2c28117c277ed1837d4989bff3d7f4c3c 100644 GIT binary patch delta 20 acmey%^p}bIG%qg~0}$MDFy6>r#0UUDl?8PG delta 20 acmey%^p}bIG%qg~0}wokP}s;_#0UUE3T>t<8 delta 22 ccmaF1mhstIM()$Ryj%=G@FYTEBlqnv09&;OYybcN diff --git a/Backend/venv/lib/python3.12/site-packages/alembic/autogenerate/__pycache__/compare.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/alembic/autogenerate/__pycache__/compare.cpython-312.pyc index fcc88a5202e3c07343d628f4c3e2a9f635e9cffd..088812343098d9ad6f279d1753accaa3a8a2c870 100644 GIT binary patch delta 22 ccmX^1m+9DFChpU`yj%=GaLd7XBlqro0Aia62LJ#7 delta 22 ccmX^1m+9DFChpU`yj%=G@FYTEBlqro0Amse761SM diff --git a/Backend/venv/lib/python3.12/site-packages/alembic/autogenerate/__pycache__/render.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/alembic/autogenerate/__pycache__/render.cpython-312.pyc index 576ead090e430d89677cab2f651f988a212e2cfa..a8dc32bd3fd6ad16c6f048b9f12075f3561950a0 100644 GIT binary patch delta 22 ccmbPvpK0cOChpU`yj%=GaLd7XBX{3=09I=UH2?qr delta 22 ccmbPvpK0cOChpU`yj%=G@FYTEBX{3=09N7$L;wH) diff --git a/Backend/venv/lib/python3.12/site-packages/alembic/autogenerate/__pycache__/rewriter.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/alembic/autogenerate/__pycache__/rewriter.cpython-312.pyc index e7145d335d475e8d3b1330c609471947de7ab8a8..b25b6b26c59ed9c451c04227d60f531e21359e69 100644 GIT binary patch delta 20 acmccVe$$=%G%qg~0}$MDFy6?0P8k42%LX+7 delta 20 acmccVe$$=%G%qg~0}wokP}sG%qg~0}$MDFy6?$+6DkebOuQP delta 20 acmdm1xvi4>G%qg~0}wokP}s=5+6Dke>jqc= diff --git a/Backend/venv/lib/python3.12/site-packages/alembic/ddl/__pycache__/impl.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/alembic/ddl/__pycache__/impl.cpython-312.pyc index 238d48e29392c148420cf998b18aa88e8170c297..507f364f0b727080d9bf6277566387705e0d6a8c 100644 GIT binary patch delta 22 ccmbRLj&c4wM()$Ryj%=GaLd7XBezI709aWDs{jB1 delta 22 ccmbRLj&c4wM()$Ryj%=G@FYTEBezI709eolx&QzG diff --git a/Backend/venv/lib/python3.12/site-packages/alembic/ddl/__pycache__/mssql.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/alembic/ddl/__pycache__/mssql.cpython-312.pyc index 5acbf8c72c7a693f0531d8d1678fe4600809dfca..f1255070ef41356f21a67ba9a11e6e2f95ed23e3 100644 GIT binary patch delta 20 acmX?Bd#slGG%qg~0}$MDFy6?$+YSIqh6aNG delta 20 acmX?Bd#slGG%qg~0}wokP}s=5+YSIq{RWZ% diff --git a/Backend/venv/lib/python3.12/site-packages/alembic/ddl/__pycache__/mysql.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/alembic/ddl/__pycache__/mysql.cpython-312.pyc index f35befea42a98d873c8256aeb1e490fdf052d207..b13f57e2a323ff29e6f743b19abf312ec1078979 100644 GIT binary patch delta 20 acmbPNGp~mGG%qg~0}$MDFy6>5YzF{CA_a*6 delta 20 acmbPNGp~mGG%qg~0}wokP}s;VYzF{CnFW{t diff --git a/Backend/venv/lib/python3.12/site-packages/alembic/ddl/__pycache__/oracle.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/alembic/ddl/__pycache__/oracle.cpython-312.pyc index db7fca238797fc84d95415e4559d471b24c5cbd6..117313b0c767e51561992d8391b385b805ad0420 100644 GIT binary patch delta 20 acmX@%bi#@IG%qg~0}$MDFy6>*s|Wx=Z3T7! delta 20 acmX@%bi#@IG%qg~0}wokP}s@?6 delta 20 acmaFO{F<5jG%qg~0}wokP}s=*fDr&cU%k<7Vgu$yj%=GaLd8Ck$WpQ<24Ncb=(L4 delta 25 fcmaEOk>%k<7Vgu$yj%=G@FYT^k$WpQ<24Ncc7O;D diff --git a/Backend/venv/lib/python3.12/site-packages/alembic/operations/__pycache__/batch.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/alembic/operations/__pycache__/batch.cpython-312.pyc index 016821bc5a2ba2a0fad9caefecd7bccaba490832..b94fcfcc87680b3eaadd3b2ff9a6b714d66e4362 100644 GIT binary patch delta 22 ccmezPmGR?OM()$Ryj%=GaLd7XBloi^0BAD^G5`Po delta 22 ccmezPmGR?OM()$Ryj%=G@FYTEBloi^0BEWRK>z>% diff --git a/Backend/venv/lib/python3.12/site-packages/alembic/operations/__pycache__/ops.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/alembic/operations/__pycache__/ops.cpython-312.pyc index 29befe7d9ea1f675fffd3226877626a8ef3c9349..3d25a4356eeb7380d6ceb917590bdee0a95fc398 100644 GIT binary patch delta 25 fcmZ2+k!{6AHty5Byj%=GaLd8Ck$WpQCG%qg~0}$MDFy6@Br40Z*a|MwA delta 20 acmbOlJ~f>CG%qg~0}wokP}s=br40Z*>II+x diff --git a/Backend/venv/lib/python3.12/site-packages/alembic/runtime/__pycache__/__init__.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/alembic/runtime/__pycache__/__init__.cpython-312.pyc index 4ee5fcc6c3891337aa68ec4b0cc2f3691db52075..e61e36032856202531a19ad676021346a9416b1b 100644 GIT binary patch delta 19 ZcmX@cc#M(zG%qg~0}$MDFrLW08vrva1uXyo delta 19 ZcmX@cc#M(zG%qg~0}wokP?*TQ8vrwt1v~%% diff --git a/Backend/venv/lib/python3.12/site-packages/alembic/runtime/__pycache__/environment.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/alembic/runtime/__pycache__/environment.cpython-312.pyc index 91ca0ba5fe3ef04906e38827d81abf4e645e4fdc..993d2258bba72d50911e5112957ea6a6d47663eb 100644 GIT binary patch delta 22 ccmZp;%G7X`iTgA!FBbz4+;TA9$X&V$08p(4(EtDd delta 22 ccmZp;%G7X`iTgA!FBbz4Jc&@)$X&V$08u0c-~a#s diff --git a/Backend/venv/lib/python3.12/site-packages/alembic/runtime/__pycache__/migration.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/alembic/runtime/__pycache__/migration.cpython-312.pyc index e4f90bb9984fe4dc38366bff6258d2bd67d3ba46..0d262948a57fef47ac139cae324353e61ac1aacb 100644 GIT binary patch delta 22 ccmdmbntAJKX71Cxyj%=GaLd7XBloJO09bAZnE(I) delta 22 ccmdmbntAJKX71Cxyj%=G@FYTEBloJO09fS*r~m)} diff --git a/Backend/venv/lib/python3.12/site-packages/alembic/script/__pycache__/__init__.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/alembic/script/__pycache__/__init__.cpython-312.pyc index 3dad6ce92b5939a5f62450af8c59b731fe708918..f85e575c594168badb37deb10c4b9e46746efc5c 100644 GIT binary patch delta 20 acmdnaw4I6jG%qg~0}$MDFy6?m!w3L1r39k@ delta 20 acmdnaw4I6jG%qg~0}wokP}s<=!w3L290ale diff --git a/Backend/venv/lib/python3.12/site-packages/alembic/script/__pycache__/base.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/alembic/script/__pycache__/base.cpython-312.pyc index cf1d4ecad61cd5c649d01ebb69b34529d86bf9c8..825773ab2fb0d98a0bbbd22aa62504a433df7ecd 100644 GIT binary patch delta 22 ccmX?ch3UiLn-u^xMFj=` delta 20 acmZ3+y^NdtG%qg~0}wokP}s;ln-u^xyag2i diff --git a/Backend/venv/lib/python3.12/site-packages/alembic/util/__pycache__/compat.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/alembic/util/__pycache__/compat.cpython-312.pyc index be1fa17706d3391026a542bd6eb284a0bdae2b56..968f5ae673443251c425f08dd0832f0dd4640dd7 100644 GIT binary patch delta 20 acmZ1|xloe(G%qg~0}$MDFy6>LjRycWd<7Z+ delta 20 acmZ1|xloe(G%qg~0}wokP}s;ljRycW^93mY diff --git a/Backend/venv/lib/python3.12/site-packages/alembic/util/__pycache__/editor.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/alembic/util/__pycache__/editor.cpython-312.pyc index d139ac5cb6b55fb9172624d1e8fd475b68d4db67..25d10dc54175f552535077b0a704e12537b112a3 100644 GIT binary patch delta 20 acmZ20xmJ?u%)EWCs8`4Fq=p diff --git a/Backend/venv/lib/python3.12/site-packages/annotated_types/__pycache__/__init__.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/annotated_types/__pycache__/__init__.cpython-312.pyc index 34459304e91e724ef91eb706d299f5e708a879fd..ee8295cee1f13cf180a08efc20a4d7d7f8cc76b7 100644 GIT binary patch delta 22 ccmX>)k@4t6M()$Ryj%=GaLd7XBlj*308wEEv;Y7A delta 22 ccmX>)k@4t6M()$Ryj%=G@FYTEBlj*308!Wm!vFvP diff --git a/Backend/venv/lib/python3.12/site-packages/anyio/__pycache__/__init__.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/anyio/__pycache__/__init__.cpython-312.pyc index eb02f314b5417433abe1c9bef9334228287115ca..2f459bc517bd0d98b375f3cb1c37bbcf61ec9af6 100644 GIT binary patch delta 20 acmX>meN3ABG%qg~0}$MDFy6?$n->5)jRlSX delta 20 acmX>meN3ABG%qg~0}!YiDsAN6%?kiF`2@QF diff --git a/Backend/venv/lib/python3.12/site-packages/anyio/__pycache__/from_thread.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/anyio/__pycache__/from_thread.cpython-312.pyc index 11032773f333b7e6b946744846d3f289ae767ae4..52bdc564cef7df0837a00b1999c82e64ee4aa34e 100644 GIT binary patch delta 22 ccmcbziSf!NM()$Ryj%=GaLd7XBe!QH09XD7v;Y7A delta 22 ccmcbziSf!NM()$Ryj%=Gpl+zNk=rv808(lN;Q#;t diff --git a/Backend/venv/lib/python3.12/site-packages/anyio/__pycache__/lowlevel.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/anyio/__pycache__/lowlevel.cpython-312.pyc index e85045a7e4ca69741515dc7b383f2a7a211578d0..349d13f4df8b659b75eabe5c0398ffcafdff622b 100644 GIT binary patch delta 20 acmaE1@xp@pG%qg~0}$MDFy6==D+2&U00q4O delta 20 acmaE1@xp@pG%qg~0}!YiDsAMBl>q=hYy|26 diff --git a/Backend/venv/lib/python3.12/site-packages/anyio/__pycache__/to_thread.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/anyio/__pycache__/to_thread.cpython-312.pyc index 24dcba9b1ad0824a4e8c9c8312d0bcc615df4919..b964cd5add49fc751c88ba60dc83d19fdf893c9a 100644 GIT binary patch delta 20 acmZn`YZl`^&CAQh00g%jj5l)s-~s?LUIjP+ delta 20 acmZn`YZl`^&CAQh00ioWN*lRNq diff --git a/Backend/venv/lib/python3.12/site-packages/anyio/_backends/__pycache__/__init__.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/anyio/_backends/__pycache__/__init__.cpython-312.pyc index 2ed58217ca17efed041621138d3c29fc850c1c18..885177c9aba463720a3d06c2e25bfb1ab6f3e6a2 100644 GIT binary patch delta 19 ZcmX@cc#M(zG%qg~0}$MDFrLW08vrva1uXyo delta 19 ZcmX@cc#M(zG%qg~0}!YiDoy0x4FE1`1X=(9 diff --git a/Backend/venv/lib/python3.12/site-packages/anyio/_backends/__pycache__/_asyncio.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/anyio/_backends/__pycache__/_asyncio.cpython-312.pyc index 4e8f26b392168dd8470eb9ed6610f07fb34e55cf..b46887d7ee897acd59f22223d06bc9e524fae706 100644 GIT binary patch delta 25 fcmX>-jqUU_Hty5Byj%=GaLd8Ck$WpQqeC|UX8;E- delta 25 fcmX>-jqUU_Hty5Byj%=Gpl+zt$i0=D(V-gvUh@W9 diff --git a/Backend/venv/lib/python3.12/site-packages/anyio/_core/__pycache__/__init__.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/anyio/_core/__pycache__/__init__.cpython-312.pyc index 78b221cfd53dbafc26da55af764c111f127aa9d0..fa06bdc3f86cc4aa9acf5b42d4898e522e9e1ef0 100644 GIT binary patch delta 19 ZcmX@ac!-hvG%qg~0}$MDFrLW09RMrs0IK^`UWci delta 20 acmez4^T&t#G%qg~0}!YiDsAL0R09A-W(8OP diff --git a/Backend/venv/lib/python3.12/site-packages/anyio/_core/__pycache__/_eventloop.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/anyio/_core/__pycache__/_eventloop.cpython-312.pyc index ce7bb6b729c9a82d0a587f872c42e4d4bb6eae4a..ac2b0d67e4ff08573f82be38a3da251dfb03647a 100644 GIT binary patch delta 20 acmbQGH%pKEG%qg~0}$MDFy6?`FAe}VV+6VY delta 20 acmbQGH%pKEG%qg~0}!YiDsANE7Y6__&jaTG diff --git a/Backend/venv/lib/python3.12/site-packages/anyio/_core/__pycache__/_exceptions.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/anyio/_core/__pycache__/_exceptions.cpython-312.pyc index 40f6fd140a215d90402a7065ed1afd3a44ca835b..7dc6555fff770427bc5234ad2926ceb4921b5047 100644 GIT binary patch delta 20 acmZ3Yy+oV)G%qg~0}$MDFy6>LQxpI>g#}Om delta 20 acmZ3Yy+oV)G%qg~0}!YiDsAMRDGC5H@dSMU diff --git a/Backend/venv/lib/python3.12/site-packages/anyio/_core/__pycache__/_fileio.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/anyio/_core/__pycache__/_fileio.cpython-312.pyc index 810a87ff15895485408b8fb9dc2d806b6e6b49d9..67614ec5155a9673b2d510a1b31e127e29ed19b5 100644 GIT binary patch delta 22 ccmX>%f$7`?ChpU`yj%=GaLd7XBe!!008%0bj{pDw delta 22 ccmX>%f$7`?ChpU`yj%=Gpl+zNk=wZg08EYryZ`_I diff --git a/Backend/venv/lib/python3.12/site-packages/anyio/_core/__pycache__/_resources.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/anyio/_core/__pycache__/_resources.cpython-312.pyc index a3e340b47075e58d095bc1c5a286543a996c537a..590f6d401783f96c78bd6fc2d075fa9c134ed9fb 100644 GIT binary patch delta 20 acmdnYzL}l-G%qg~0}$MDFy6?$f*Aldy9FZv delta 20 acmdnYzL}l-G%qg~0}!YiDsALm!3+Q~Cj?Lc diff --git a/Backend/venv/lib/python3.12/site-packages/anyio/_core/__pycache__/_signals.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/anyio/_core/__pycache__/_signals.cpython-312.pyc index a6aa146199b98c5850ec144d1549ccea20ebb28b..2b959fb59cb60356ff96d00e00330142fede20ce 100644 GIT binary patch delta 20 acmX@ld7hK|G%qg~0}$MDFy6?0garUQWCeTx delta 20 acmX@ld7hK|G%qg~0}!YiDsALG!U6y_&;+Rf diff --git a/Backend/venv/lib/python3.12/site-packages/anyio/_core/__pycache__/_sockets.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/anyio/_core/__pycache__/_sockets.cpython-312.pyc index 72544100ef81fdca82bd8a7427c819ba4f80fd3f..6f079a185834d8b48d65a791db6514c4c5caa95c 100644 GIT binary patch delta 22 ccmZqM&)Bw~k^3|+FBbz4+;TA9$Xy)|08QlvY5)KL delta 22 ccmZqM&)Bw~k^3|+FBbz4s2eJ6Li4OoaZUqX=L8b~ diff --git a/Backend/venv/lib/python3.12/site-packages/anyio/abc/__pycache__/__init__.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/anyio/abc/__pycache__/__init__.cpython-312.pyc index 1724b5b4c193cf059d99c5ed511ceb379bf6f77a..9aa6d67aa02b59f3753fed014923f698c3f8750b 100644 GIT binary patch delta 20 acmZ23uv~!qG%qg~0}$MDFy6>5!vO#_Bm|ZK delta 20 acmZ23uv~!qG%qg~0}!YiDsAMJ;Q#4mG%qg~0}$MDFy6@R%mx5Dss#Z6 delta 20 acmX@dbB>4mG%qg~0}!YiDsAL;W&;2<76dK; diff --git a/Backend/venv/lib/python3.12/site-packages/anyio/abc/__pycache__/_sockets.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/anyio/abc/__pycache__/_sockets.cpython-312.pyc index b07563370c2c0d21687105b9548744b672eaa7f6..7963e0d4a534dddc36a8704738a7424781fb54aa 100644 GIT binary patch delta 20 acmca)f61QvG%qg~0}$MDFy6?0Tpj>Jj|L0? delta 20 acmca)f61QvG%qg~0}!YiDsALGE)M`b`vo}w diff --git a/Backend/venv/lib/python3.12/site-packages/anyio/abc/__pycache__/_streams.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/anyio/abc/__pycache__/_streams.cpython-312.pyc index c6035583d871bc302dfdeef36097ab151c51c37c..c5d4fec3f6e027f31b3796cdb64a9f208a9157e8 100644 GIT binary patch delta 20 acmaFp_|TF2G%qg~0}$MDFy6?0O#uK#Fa|yV delta 20 acmaFp_|TF2G%qg~0}!YiDsAMxrT_pyoCRwD diff --git a/Backend/venv/lib/python3.12/site-packages/anyio/abc/__pycache__/_subprocesses.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/anyio/abc/__pycache__/_subprocesses.cpython-312.pyc index 0938df15921865840738e14fdc55c6a1c64f6e34..4fd264313b3ba973cb7e59596507ce190527a210 100644 GIT binary patch delta 20 acmdlexlxk)G%qg~0}$MDFy6?$j0XTX`~^w? delta 20 acmdlexlxk)G%qg~0}!YiDsALm#sdH|Xasiv diff --git a/Backend/venv/lib/python3.12/site-packages/anyio/abc/__pycache__/_tasks.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/anyio/abc/__pycache__/_tasks.cpython-312.pyc index de8538640fd049a93b8428a20285cc306f4fe9de..79eae19a6cc6a1c9d539cd1aee882d57af2427c9 100644 GIT binary patch delta 20 acmeBD>r&%B&CAQh00g%jj5l)s7Xkn^z6Esv delta 20 acmeBD>r&%B&CAQh00ioWN*lTV3jqKyDg>ec diff --git a/Backend/venv/lib/python3.12/site-packages/anyio/abc/__pycache__/_testing.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/anyio/abc/__pycache__/_testing.cpython-312.pyc index 7e9f0c8d75dff5653b48ce10971225a7079730f4..457be38012cdf564248f747de143c2cbe0badabc 100644 GIT binary patch delta 20 acmca9ep8(LG%qg~0}$MDFy6?0jvD|z^98*C delta 20 acmca9ep8(LG%qg~0}!YiDsALG#|;2EUj*s^ diff --git a/Backend/venv/lib/python3.12/site-packages/anyio/streams/__pycache__/__init__.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/anyio/streams/__pycache__/__init__.cpython-312.pyc index acbc05d72ff529a05e34675342b6c927a3de83b4..613630f566512e3df541fdc3f04eca04f86b4016 100644 GIT binary patch delta 19 ZcmX@Yc!ZJrG%qg~0}$MDFrLW0696*d1t$Oi delta 19 ZcmX@Yc!ZJrG%qg~0}!YiDoy0x2>>o21XKV3 diff --git a/Backend/venv/lib/python3.12/site-packages/anyio/streams/__pycache__/memory.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/anyio/streams/__pycache__/memory.cpython-312.pyc index c442d5858c69e9e06f6bd0e49cf5fbf4101f1d44..1455cb9f4ac9385f0aab93238d832b52f19cdbe6 100644 GIT binary patch delta 20 acmeyB@+*b=G%qg~0}$MDFy6?WZv+5N76xGe delta 20 acmeyB@+*b=G%qg~0}!YiDsAM>Hv#}if(4EM diff --git a/Backend/venv/lib/python3.12/site-packages/anyio/streams/__pycache__/stapled.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/anyio/streams/__pycache__/stapled.cpython-312.pyc index e34f74a55638c02f134217ff297df34c1808677c..45034471360a54b0dc25c99cc82364577b10394c 100644 GIT binary patch delta 20 acmaE2^~8$%G%qg~0}$MDFy6==DGLBZsRgzG delta 20 acmaE2^~8$%G%qg~0}!YiDsAMBlm!4k6$Ik| diff --git a/Backend/venv/lib/python3.12/site-packages/anyio/streams/__pycache__/tls.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/anyio/streams/__pycache__/tls.cpython-312.pyc index d69a02d9cb46ddd8625d4c7103f6ab310efc87d6..907ae9e10529a6f3ac8b4092e0c5dec6cf92fbb4 100644 GIT binary patch delta 22 ccmZ48!nnGHk^3|+FBbz4+;TA9$gSW607?P{#sB~S delta 22 ccmZ48!nnGHk^3|+FBbz4s2eJ6*!vp|0ZUoo> delta 20 acmX@ka-45!Vds7;{>4q delta 20 acmbO)H(!qXG%qg~0}zzG*4W4`!Vds8@&w%g diff --git a/Backend/venv/lib/python3.12/site-packages/bleach/__pycache__/callbacks.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/bleach/__pycache__/callbacks.cpython-312.pyc index 89e7a347c2274b9ec2b8363e90fca1890a141d12..1597d68ead112ebff0846aacee3df0e647089b8c 100644 GIT binary patch delta 27 hcmeyx`HPeLG%qg~0}$MDFy6@hjFIuz=1+_q%m8@a2%P`` delta 27 hcmeyx`HPeLG%qg~0}zzG*4W7XjFIuy=1+_q%m8}P2)O_N diff --git a/Backend/venv/lib/python3.12/site-packages/bleach/__pycache__/html5lib_shim.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/bleach/__pycache__/html5lib_shim.cpython-312.pyc index c8fbf9ace45cdaa5936cbd75cd6e5c331fe39f8d..6968a69f24d5dc55ce82267e74ef670f5c08602c 100644 GIT binary patch delta 52 zcmZ26iE+gwM()$Ryj%=GaLd7XBX^hxYhrn9M>;KyP~r|S-)SKy`Ar} F0syz45wQRO delta 52 zcmZ26iE+gwM()$Ryj%=GQ1)75BX^hxYhrn9M>&IyP~r|S-)GGy`Ar} F0sywQ5p4hf diff --git a/Backend/venv/lib/python3.12/site-packages/bleach/__pycache__/linkifier.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/bleach/__pycache__/linkifier.cpython-312.pyc index 92bb82211ff6ca932aef422a7942b0fdab8aaf91..5cab0b8fe631db51d4461268107fb4b63232f38d 100644 GIT binary patch delta 29 jcmX@y&v>|>k^3|+FBbz4+;TA9$gRN1_-nHc=X5&&gRBUP delta 29 jcmX@y&v>|>k^3|+FBbz4l)cv2$gRN1cx$r`=X5&&g`Wtg diff --git a/Backend/venv/lib/python3.12/site-packages/bleach/__pycache__/parse_shim.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/bleach/__pycache__/parse_shim.cpython-312.pyc index 2faa0926a446d5e07f59b2edee8a39a30392130c..46fcc34da3e6c2c963a63b5870afc715092300f7 100644 GIT binary patch delta 19 Zcmey)_??maG%qg~0}$MDFrLW$1^_xh1;79R delta 19 Zcmey)_??maG%qg~0}zzG)|kls1^_z~1^fU2 diff --git a/Backend/venv/lib/python3.12/site-packages/bleach/__pycache__/sanitizer.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/bleach/__pycache__/sanitizer.cpython-312.pyc index b322e54b16504c1e6f40ab4d2fd2476e0548c15c..96b17ec5081721da9560af845491c9648c7ccf40 100644 GIT binary patch delta 42 vcmeC^VeIH(3jj0O1!e#M diff --git a/Backend/venv/lib/python3.12/site-packages/bleach/_vendor/__pycache__/parse.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/bleach/_vendor/__pycache__/parse.cpython-312.pyc index 0fe6248b095aa5de70c8ca2503f13363f233af16..2d55291cd55744b68de8ea8d269c34759f9e3983 100644 GIT binary patch delta 57 zcmZ2_nQ7@|ChpU`yj%=GaLd7XBR2~l_(3 delta 20 acmdnMwSkNKG%qg~0}zzG*4W6c$_fBBzy#g^ diff --git a/Backend/venv/lib/python3.12/site-packages/bleach/_vendor/html5lib/__pycache__/_inputstream.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/bleach/_vendor/html5lib/__pycache__/_inputstream.cpython-312.pyc index 6623940ccca1ca74a9fc57f113290137d3e1cf8c..ad3b6d6135a418d98e60d6dfef6a4cc85a0b6f29 100644 GIT binary patch delta 29 kcmex8nd$drChpU`yj%=GaLd7XBljF7#$TIPC5BLx6DMg;Hx delta 20 acmZ2(vfPCGG%qg~0}zzG*4W4`BLx6ERRt^n diff --git a/Backend/venv/lib/python3.12/site-packages/bleach/_vendor/html5lib/__pycache__/constants.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/bleach/_vendor/html5lib/__pycache__/constants.cpython-312.pyc index 46a7a5238c0d96241bed164ccde0ae382677867a..4d23015c9d93e4ce6be7c3fd9b7cd98996b7ec23 100644 GIT binary patch delta 63 zcmX>+mHqHkcJ9->yj%=GaLd7XBlo<;?7tYfelha=+Pq+mHqHkcJ9->yj%=GQ1)75Blo<;?6(-Xelhag+Pq{j8e%G%qg~0}$MDFy6>*sLk?=QQ_BQ2kmK$zb0STPGbDE*-B@PAOJyj50U@? delta 42 xcmaD>{j8e%G%qg~0}zzG*4W5xsLgVVQQ_8P2kmK$wZ*-B@PAOJv(4^998 diff --git a/Backend/venv/lib/python3.12/site-packages/bleach/_vendor/html5lib/_trie/__pycache__/__init__.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/bleach/_vendor/html5lib/_trie/__pycache__/__init__.cpython-312.pyc index b6f1c0bf4fceee3801aaecd26fd02abec98b7e4d..48dc89f04c7fede49f7518d7b112b3a77d3f621b 100644 GIT binary patch delta 20 acmeyx^oxo6G%qg~0}$MDFy6?W&jjb4G^yG%qg~0}$MDFy6@R$OiyCq6H%W delta 20 acmX>jb4G^yG%qg~0}zzG*4W7H$OiyDu?1fM diff --git a/Backend/venv/lib/python3.12/site-packages/bleach/_vendor/html5lib/filters/__pycache__/__init__.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/bleach/_vendor/html5lib/filters/__pycache__/__init__.cpython-312.pyc index 0da68e4c486ceec3422b1318abe50b5bd73b078d..e5ce84264c92712477d0767ab16c1a5d0ffddad2 100644 GIT binary patch delta 19 Zcmcb{c#VEgC delta 51 zcmaEJkMYetM()$Ryj%=GQ1)75BliM(##@`$*cY&J-eR;Vl4oLIxV2f;HINl3TJH5# F1pwNz5(@wT diff --git a/Backend/venv/lib/python3.12/site-packages/bleach/_vendor/html5lib/treebuilders/__pycache__/__init__.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/bleach/_vendor/html5lib/treebuilders/__pycache__/__init__.cpython-312.pyc index e952866e7d60e4d4b1282558b8e2d6dea5fa5033..f47fb64d3b3de9a9f4ecfce1c73ad906347e9fd7 100644 GIT binary patch delta 20 acmZpXZIR_Z&CAQh00g%jj5l&u@&N!ch6K$3 delta 20 acmZpXZIR_Z&CAQh00d>PH8yfr@&N!dl?4d^ diff --git a/Backend/venv/lib/python3.12/site-packages/bleach/_vendor/html5lib/treebuilders/__pycache__/base.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/bleach/_vendor/html5lib/treebuilders/__pycache__/base.cpython-312.pyc index 2daf0f4ff81ad50eb3f7d613dfa41bd73a762e78..5b47b8e700f5422868658850e827ec1da24e9f5b 100644 GIT binary patch delta 40 tcmX?Id%BkUG%qg~0}$MDFy6>Lg_Z9Yqe2yvtAhP+jc`d7)B>)W;4Lbk; delta 40 vcmX?Id%BkUG%qg~0}zzG*4W5Bg_Z9Xqe2yvtrCW?Pw>Gb3m9qo@4wVfT diff --git a/Backend/venv/lib/python3.12/site-packages/bleach/_vendor/html5lib/treewalkers/__pycache__/__init__.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/bleach/_vendor/html5lib/treewalkers/__pycache__/__init__.cpython-312.pyc index 6571f10cb85bd153b6ffa08571393bac5421255d..7455b59a1a86faf9a3f7bf8310d7ce3aacc3b57b 100644 GIT binary patch delta 45 zcmbQBGeL*@G%qg~0}$MDFy6@hQ-Jpuqrxqgyu{qpUyL@tCJPF_X8g7Jub?ms07cdh A&;S4c delta 45 zcmbQBGeL*@G%qg~0}zzG*4W7XQ-Jptqrxqgyu{qpTZ}fhCJPF_X1uleub?ms07an> Ai~s-t diff --git a/Backend/venv/lib/python3.12/site-packages/certifi/__pycache__/__init__.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/certifi/__pycache__/__init__.cpython-312.pyc index eece9f2f342aa66aaff3abe4f8707bca742e069f..cda1d6e4801ca3e7450477a2f20d4c91c9e4b8fa 100644 GIT binary patch delta 20 acmdnXw3mtdG%qg~0}$MDFy6>*#0UU3l?1f_ delta 20 acmdnXw3mtdG%qg~0}!YiDsAL8Vgvv&0R!Ry diff --git a/Backend/venv/lib/python3.12/site-packages/certifi/__pycache__/core.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/certifi/__pycache__/core.cpython-312.pyc index c50579ca0a5835f277273547a552decd44306a1f..bbf91bbbb80201fa40c2d7013e71a5bf8469e67b 100644 GIT binary patch delta 20 acmbOrFhPL(G%qg~0}$MDFy6?`$^if|j08~t delta 20 acmbOrFhPL(G%qg~0}!YiDsALuqepHqepH@&CAQh00g%jj5l(ZF#-TCSp@&CAQh00d7X6gF~~F#-TC*94OQ diff --git a/Backend/venv/lib/python3.12/site-packages/click/__pycache__/__init__.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/click/__pycache__/__init__.cpython-312.pyc index d32cbd45a5ab5cfb1bfa9b5603a61e5ca562c1c9..971ea2a9f3d22941cd803f2bdeadb2a65f340f3e 100644 GIT binary patch delta 20 acmaDQ|4N?wG%qg~0}$MDFy6?0pC151zXk*V delta 20 acmaDQ|4N?wG%qg~0}wooP}sa<09~F38UO$Q delta 22 ccmeyphVl0rM()$Ryj%=G@H9eUBX>a<0A3siDgXcg diff --git a/Backend/venv/lib/python3.12/site-packages/click/__pycache__/exceptions.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/click/__pycache__/exceptions.cpython-312.pyc index ce303a28e6526666a49e9c9d95b87814f76ba9b5..fc6fb447daee382ecf246c6b8d691fb7ca2b4068 100644 GIT binary patch delta 20 acmdm0ysMb|G%qg~0}$MDFy6?$-Vy*uIR-`m delta 20 acmdm0ysMb|G%qg~0}wooP}s=5-Vy*uw+2=K diff --git a/Backend/venv/lib/python3.12/site-packages/click/__pycache__/formatting.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/click/__pycache__/formatting.cpython-312.pyc index 73fbb11c1b9c54e3e5f2c8df7b5f4b2d2291717d..6e3e35cecd39c29a7c7739a60d4ad62dde5e2ece 100644 GIT binary patch delta 20 acmaEr^(u?|G%qg~0}$MDFy6==ZwdfRaRxvD delta 20 acmaEr^(u?|G%qg~0}wooP}s;FZwdfR?*>o+ diff --git a/Backend/venv/lib/python3.12/site-packages/click/__pycache__/globals.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/click/__pycache__/globals.cpython-312.pyc index 89b635e74525f83e4db662b9973a91eac12750ab..4f1475d20058aece6293db68806efb9d882dc5cc 100644 GIT binary patch delta 20 acmbO(K3$yqG%qg~0}$MDFy6@B!wmp5qXhQ= delta 20 acmbO(K3$yqG%qg~0}wooP}s=b!wmp6Aq58j diff --git a/Backend/venv/lib/python3.12/site-packages/click/__pycache__/parser.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/click/__pycache__/parser.cpython-312.pyc index 5627c80d4a8cabf5fe434310e7d290be05deb330..bd20dd790743198322c0e9b0a35737fcc0b67671 100644 GIT binary patch delta 22 ccmcaJpYhIoM()$Ryj%=GaLd7XBlksr09R)R8~^|S delta 22 ccmcaJpYhIoM()$Ryj%=G@H9eUBlksr09WM)EC2ui diff --git a/Backend/venv/lib/python3.12/site-packages/click/__pycache__/termui.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/click/__pycache__/termui.cpython-312.pyc index 1c77cb4c972b5e927a2adc401c4bbe077878aa96..0732898d9fea86bd922864ddd4d0873fc2503683 100644 GIT binary patch delta 22 ccmccH$8@)kiTgA!FBbz4+;TA9$Q{%U09058w*UYD delta 22 ccmccH$8@)kiTgA!FBbz4JdIG;$Q{%U094in#{d8T diff --git a/Backend/venv/lib/python3.12/site-packages/click/__pycache__/types.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/click/__pycache__/types.cpython-312.pyc index 50cebef4964f71cc08e1fb90e99f07edf3674290..dc84d73702573ae3df36bf45d0699c6cc78d16b6 100644 GIT binary patch delta 22 ccmey-#{8p=nfo*^FBbz4+;TA9$enu_09XnKHUIzs delta 22 ccmey-#{8p=nfo*^FBbz4JdIG;$enu_09c3zMgRZ+ diff --git a/Backend/venv/lib/python3.12/site-packages/click/__pycache__/utils.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/click/__pycache__/utils.cpython-312.pyc index 76bf5f63994a9aaf74e954712c908cce7f3822f0..202906df13b8b2e08b2dbd75c24a07cf4c54a504 100644 GIT binary patch delta 22 ccmdmZh;ic~M()$Ryj%=GaLd7XBez;2092I*a{vGU delta 22 ccmdmZh;ic~M()$Ryj%=G@H9eUBez;2096wPg8%>k diff --git a/Backend/venv/lib/python3.12/site-packages/cryptography/__pycache__/__about__.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/cryptography/__pycache__/__about__.cpython-312.pyc index 20e2ee20a0754b4bb76da711b090d088c0ba4e7c..88dec6be643754c59f77ab943a698ff2d8efa11a 100644 GIT binary patch delta 20 acmcc2e3_a1G%qg~0}$MDFy6?0f)M~aDFt}| delta 20 acmcc2e3_a1G%qg~0}wooP}sLM-l)#Aq8y! delta 20 acmZ2(yxf@kG%qg~0}wooP}s;lM-l)#p9OsY diff --git a/Backend/venv/lib/python3.12/site-packages/cryptography/hazmat/__pycache__/__init__.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/cryptography/hazmat/__pycache__/__init__.cpython-312.pyc index eeeef84cbf35b5ebb8a1ee1e98ce9e22d275ac73..e4f6b15d84c045b69e7d4f328eb999c493d1634a 100644 GIT binary patch delta 19 ZcmZo-YGUF(&CAQh00g%jj3;t`2LLJg1mgez delta 19 ZcmZo-YGUF(&CAQh00d7X6eeLLks{prUg;} delta 20 acmZ3iyI7a|G%qg~0}wooP}s;lLks{qBn4ss diff --git a/Backend/venv/lib/python3.12/site-packages/cryptography/hazmat/bindings/openssl/__pycache__/binding.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/cryptography/hazmat/bindings/openssl/__pycache__/binding.cpython-312.pyc index df6fc35e307a7ccbae8dfd17ce26de6483693a86..58942c8fa123b3bcbc7e0499cab90b3ed06c9729 100644 GIT binary patch delta 20 acmeyO{Y9JmG%qg~0}$MDFy6@hQWOA21qMI> delta 20 acmeyO{Y9JmG%qg~0}wooP}s=*QWOA2g9cCl diff --git a/Backend/venv/lib/python3.12/site-packages/cryptography/hazmat/decrepit/__pycache__/__init__.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/cryptography/hazmat/decrepit/__pycache__/__init__.cpython-312.pyc index 37c376dfbac6a8a0d6e017580f137f8d9505cc3c..c4329e89d55d0aa95f60592fd3852566de515fad 100644 GIT binary patch delta 19 ZcmZo;YGdL)&CAQh00g%jj3;vc1^_CJ1n&R< delta 19 ZcmZo;YGdL)&CAQh00d7X6ee>21^_Di1pfd4 diff --git a/Backend/venv/lib/python3.12/site-packages/cryptography/hazmat/decrepit/ciphers/__pycache__/__init__.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/cryptography/hazmat/decrepit/ciphers/__pycache__/__init__.cpython-312.pyc index 8d696a25974df3051921cd5f35165c4ca51e7b40..399a9a52a93e8e14d66ee499c5de0e260f603c4c 100644 GIT binary patch delta 20 acmeBU>SN+Q&CAQh00g%jj5l&KGXelFJp?EK delta 20 acmeBU>SN+Q&CAQh00d7X6gF}*GXelFy977@ diff --git a/Backend/venv/lib/python3.12/site-packages/cryptography/hazmat/decrepit/ciphers/__pycache__/algorithms.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/cryptography/hazmat/decrepit/ciphers/__pycache__/algorithms.cpython-312.pyc index f7acfa3faacfb8bb3c651bcd0768c56820340f6c..f819de16f9c89849be267f344d74f1c4cfaa31a9 100644 GIT binary patch delta 20 acmX@4dPtS~G%qg~0}$MDFy6?$T?ha@S_PW` delta 20 acmX@4dPtS~G%qg~0}wooP}s=5T?ha@*afQq diff --git a/Backend/venv/lib/python3.12/site-packages/cryptography/hazmat/primitives/__pycache__/__init__.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/cryptography/hazmat/primitives/__pycache__/__init__.cpython-312.pyc index 7ac68e709c49211ec547d498bc146f873f38019f..ad3b01ea22e49383ae7561c8e8f60df43bd11dd3 100644 GIT binary patch delta 19 Zcmcc0c$Ja+G%qg~0}$MDFrLVL3IH`$1zG?A delta 19 Zcmcc0c$Ja+G%qg~0}wooP?*Sl3IH|41!@2Q diff --git a/Backend/venv/lib/python3.12/site-packages/cryptography/hazmat/primitives/__pycache__/_asymmetric.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/cryptography/hazmat/primitives/__pycache__/_asymmetric.cpython-312.pyc index 153678cdb376da2c4cfb58b9279dde709a10fa7c..3c4a37cb4dda373d165b786488dc4c821e19b8ee 100644 GIT binary patch delta 20 acmdnYwwaClG%qg~0}$MDFy6?m!3+R3mjs~z delta 20 acmdnYwwaClG%qg~0}wooP}s<=!3+R46$G&W diff --git a/Backend/venv/lib/python3.12/site-packages/cryptography/hazmat/primitives/__pycache__/_cipheralgorithm.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/cryptography/hazmat/primitives/__pycache__/_cipheralgorithm.cpython-312.pyc index 90962e3e9cd48fc32cd905fb88f2d9928514d1d5..57a81b899decfbf9ddd064427c5e9fb5d3995f4c 100644 GIT binary patch delta 20 acmX>sd{~(KG%qg~0}$MDFy6?$gA)Kc@da@J delta 20 acmX>sd{~(KG%qg~0}wooP}s=5gA)KdZv}w> diff --git a/Backend/venv/lib/python3.12/site-packages/cryptography/hazmat/primitives/__pycache__/_serialization.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/cryptography/hazmat/primitives/__pycache__/_serialization.cpython-312.pyc index df3e329107100452146e844f8bc79afb0863ec3a..19d229f63d4fd9369e096d59d0bd10e9fc83646d 100644 GIT binary patch delta 20 acmZoRZ#L&X&CAQh00g%jj5l&uNCN;i69o$Z delta 20 acmZoRZ#L&X&CAQh00d7X6gF~KNCN;ikp&w7 diff --git a/Backend/venv/lib/python3.12/site-packages/cryptography/hazmat/primitives/__pycache__/constant_time.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/cryptography/hazmat/primitives/__pycache__/constant_time.cpython-312.pyc index 66895bece6066479ef353070102152455f14bfb3..f88d54dfcf47df8ff7356aecc839093ce37d5f88 100644 GIT binary patch delta 20 acmZ3^x}25!G%qg~0}$MDFy6>LhY0{Qk_7qy delta 20 acmZ3^x}25!G%qg~0}wooP}s;lhY0{R5CsYV diff --git a/Backend/venv/lib/python3.12/site-packages/cryptography/hazmat/primitives/__pycache__/hashes.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/cryptography/hazmat/primitives/__pycache__/hashes.cpython-312.pyc index aeb00d1f6c97eb6d1a5690933e44f20f7c91237a..c3524b6ccd2bd4861330a76725cde76f491ddf2e 100644 GIT binary patch delta 20 acmccZaNB|VG%qg~0}$MDFy6==pa1|w90jTX delta 20 acmccZaNB|VG%qg~0}wooP}s;Fpa1|wngzN5 diff --git a/Backend/venv/lib/python3.12/site-packages/cryptography/hazmat/primitives/__pycache__/hmac.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/cryptography/hazmat/primitives/__pycache__/hmac.cpython-312.pyc index 9dd7f6f9985f926d9fbce23b1d2ba7cc465edccd..980959b938de6d8c28e134d22de6469abf747781 100644 GIT binary patch delta 20 acmcb?a)X8YG%qg~0}$MDFy6@R%LD*B76l6c delta 20 acmcb?a)X8YG%qg~0}wooP}s=r%LD*Blm#0A diff --git a/Backend/venv/lib/python3.12/site-packages/cryptography/hazmat/primitives/__pycache__/keywrap.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/cryptography/hazmat/primitives/__pycache__/keywrap.cpython-312.pyc index 1d4218f3ec9c1fdb48f6e29ef7608a9b0408f9ea..d287662085e5a143aa057dab72b1d7b452b63512 100644 GIT binary patch delta 20 acmdmLwbhFIG%qg~0}$MDFy6?mB?|yOQ3WXg delta 20 acmdmLwbhFIG%qg~0}wooP}s<=B?|yO&jmRE diff --git a/Backend/venv/lib/python3.12/site-packages/cryptography/hazmat/primitives/__pycache__/padding.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/cryptography/hazmat/primitives/__pycache__/padding.cpython-312.pyc index 3e1651aa2566d903032b4d52502104bf07825dfd..f3a4d334a73298ab4f556dc02009e389700c7bf1 100644 GIT binary patch delta 20 acmX>gc|el;G%qg~0}$MDFy6?$l?MPjR0Vec delta 20 acmX>gc|el;G%qg~0}wooP}s=5l?MPj(glYA diff --git a/Backend/venv/lib/python3.12/site-packages/cryptography/hazmat/primitives/asymmetric/__pycache__/__init__.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/cryptography/hazmat/primitives/asymmetric/__pycache__/__init__.cpython-312.pyc index 44f0728e7b6298526da1d5b3b1fad5d747b35395..c58198973a76cdd18223fa556bc4f4d79f3bcc94 100644 GIT binary patch delta 19 ZcmaFB_<)i7G%qg~0}$MDFrLVL6#zEv1$zJh delta 19 ZcmaFB_<)i7G%qg~0}wooP?*Sl6#zF|1&aUx diff --git a/Backend/venv/lib/python3.12/site-packages/cryptography/hazmat/primitives/asymmetric/__pycache__/dh.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/cryptography/hazmat/primitives/asymmetric/__pycache__/dh.cpython-312.pyc index 1d851a77d088b72b938d951b2065c0403a0cebaf..60aaccd2cf76d1e5264285ceac47c30cf7fe4b06 100644 GIT binary patch delta 20 acmX@6e@vhIG%qg~0}$MDFy6?$TO0sCX9d6j delta 20 acmX@6e@vhIG%qg~0}wooP}s=5TO0sC delta 20 acmeyO{Y9JmG%qg~0}wooP}s=*QWOA2g9cCl diff --git a/Backend/venv/lib/python3.12/site-packages/cryptography/hazmat/primitives/asymmetric/__pycache__/ed448.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/cryptography/hazmat/primitives/asymmetric/__pycache__/ed448.cpython-312.pyc index a103a52a7791e50c02b9cb1cd5af9e7f943f8093..24d6c03c9a1b1d35040b51405abd5b74af443c53 100644 GIT binary patch delta 20 acmbQQGhc`MG%qg~0}$MDFy6>5A_f3A;snG1 delta 20 acmbQQGhc`MG%qg~0}wooP}s;VA_f3BU5Ckg;LDFodB delta 20 acmZ3fwNi`wG%qg~0}wooP}s;VCkg;Lrv&W) diff --git a/Backend/venv/lib/python3.12/site-packages/cryptography/hazmat/primitives/asymmetric/__pycache__/x448.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/cryptography/hazmat/primitives/asymmetric/__pycache__/x448.cpython-312.pyc index 33bdc8b19d74308a010f0d0f396df5425eb7e63a..5bb83822ef466608987e0479d9abeaaf1a7aff9a 100644 GIT binary patch delta 20 acmcblbxDi+G%qg~0}$MDFy6@RE(!oYkp)-) delta 20 acmcblbxDi+G%qg~0}wooP}s=rE(!oZ4+Urd diff --git a/Backend/venv/lib/python3.12/site-packages/cryptography/hazmat/primitives/ciphers/__pycache__/__init__.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/cryptography/hazmat/primitives/ciphers/__pycache__/__init__.cpython-312.pyc index 992f920c8908b1f59d1c17c26ea0b8aa7407ef91..6cc7ec5e9771ea62f6191d207bde14b589bf548d 100644 GIT binary patch delta 20 acmeBS?P29U&CAQh00g%jj5l&OG64WES_G*8 delta 20 acmeBS?P29U&CAQh00d7X6gF}*&kO)LF9hZQ delta 20 acmX@bc8ZPrG%qg~0}wooP}s5p$7mzS_Mb| delta 20 acmZ1+vp9zPG%qg~0}wooP}s;Vp$7mz*acVs diff --git a/Backend/venv/lib/python3.12/site-packages/cryptography/hazmat/primitives/kdf/__pycache__/__init__.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/cryptography/hazmat/primitives/kdf/__pycache__/__init__.cpython-312.pyc index bc3daee13635e77b8f34eabf3753af24f4333566..724b0a80e4271044365390350c69fbbaf2dcf026 100644 GIT binary patch delta 20 acmaFE`G%AGG%qg~0}$MDFy6@hkOcrg>;=;R delta 20 acmaFE`G%AGG%qg~0}wooP}s=*kOcrhY6ar} diff --git a/Backend/venv/lib/python3.12/site-packages/cryptography/hazmat/primitives/kdf/__pycache__/pbkdf2.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/cryptography/hazmat/primitives/kdf/__pycache__/pbkdf2.cpython-312.pyc index 016a0c6a9478d1a97f04f66eaa7b528ace56b53e..666035fd7cc8dcb2056e1d556839a1e45518253b 100644 GIT binary patch delta 20 acmdlix>=O_G%qg~0}$MDFy6?$f(rmRx&=l6 delta 20 acmdlix>=O_G%qg~0}wooP}s=5f(rmSI0aS! diff --git a/Backend/venv/lib/python3.12/site-packages/cryptography/hazmat/primitives/serialization/__pycache__/__init__.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/cryptography/hazmat/primitives/serialization/__pycache__/__init__.cpython-312.pyc index c8f443ef12e553ca18eb01a74584cdd1690ab150..17b7a94559111fc11f64cb05d3d1c3f65c312b3b 100644 GIT binary patch delta 20 acmeys^?{4~G%qg~0}$MDFy6?W$_fBKu?1oP delta 20 acmeys^?{4~G%qg~0}wooP}sxwmpN*02EpSvm$+ diff --git a/Backend/venv/lib/python3.12/site-packages/cryptography/x509/__pycache__/__init__.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/cryptography/x509/__pycache__/__init__.cpython-312.pyc index 3c9f74e5f1ede982bc836959bb1e434def11a533..328abd09f640561b5a48823836e5ad6dd297c6a4 100644 GIT binary patch delta 20 acmZp7YIov3&CAQh00g%jj5l)sQ2+orL?&an_&CAQh00g%jj5l&Ou>t@wT?D%T delta 20 acmeC>?&an_&CAQh00d7X6gF}t@w+XTx1 diff --git a/Backend/venv/lib/python3.12/site-packages/cryptography/x509/__pycache__/extensions.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/cryptography/x509/__pycache__/extensions.cpython-312.pyc index 4550b4597837187f7905ca0e4b23311b363f24c2..44fca66bf8f679e2fa2e228bf70941693307856d 100644 GIT binary patch delta 25 fcmX@~p6$?kHty5Byj%=GaLd8Ck$WpQCF9m!6 delta 20 acmZ3JwkD1HG%qg~0}wooP}s<=Xbb>Ctp$t# diff --git a/Backend/venv/lib/python3.12/site-packages/cryptography/x509/__pycache__/name.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/cryptography/x509/__pycache__/name.cpython-312.pyc index 1d5cf10ca672054e7b48b57c98190c34d2d15de1..c7f2a85910ce2ecb882b3920df4545825d680938 100644 GIT binary patch delta 22 ccmX@OmGR(KM()$Ryj%=GaLd7XBlor_09Hc>0ssI2 delta 22 ccmX@OmGR(KM()$Ryj%=G@H9eUBlor_09L^V5&!@I diff --git a/Backend/venv/lib/python3.12/site-packages/cryptography/x509/__pycache__/oid.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/cryptography/x509/__pycache__/oid.cpython-312.pyc index 02678a99f431b9934eceeb7522d1d45a87618a5b..3669b95fbd090f63c573689607c01db56579456a 100644 GIT binary patch delta 20 acmZo;Yh&X+&CAQh00g%jj5l)sW&!{(js+P2 delta 20 acmZo;Yh&X+&CAQh00d7X6gG1IW&!{)32Bn976AY{LIj@x diff --git a/Backend/venv/lib/python3.12/site-packages/defusedxml/__pycache__/__init__.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/defusedxml/__pycache__/__init__.cpython-312.pyc index f219052c156e168005071b65a45d6db9daa4f18a..8917c8d438ac8d8a3214bdaf4dc100267891355b 100644 GIT binary patch delta 20 acmX@kbDW3!G%qg~0}$MDFy6>*!v+93k_7Ak delta 20 acmX@kbDW3!G%qg~0}#YX>2Bn2Bm!5C;G?r36I) diff --git a/Backend/venv/lib/python3.12/site-packages/deprecated/__pycache__/__init__.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/deprecated/__pycache__/__init__.cpython-312.pyc index 26a6ae0fb5dc1f4a045c2b9d63daf0d41486124d..ed0331d7c0c76eea32428a7a05cb18e7fd8e21cc 100644 GIT binary patch delta 20 acmey#@{@)8G%qg~0}$MDFy6?W#{>XCJ_T+7 delta 20 acmey#@{@)8G%qg~0}wooP}sXCyaj#$ diff --git a/Backend/venv/lib/python3.12/site-packages/deprecated/__pycache__/classic.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/deprecated/__pycache__/classic.cpython-312.pyc index b7b805faeed10263bc2d7a35a65e726dddacc0de..1f5678485db5f08ed782b541fe65542bb9fe5c63 100644 GIT binary patch delta 20 acmbOgH!F_&G%qg~0}$MDFy6?`uMYq|I|VWT delta 20 acmbOgH!F_&G%qg~0}wooP}s=LuMYq|xdlQ1 diff --git a/Backend/venv/lib/python3.12/site-packages/deprecated/__pycache__/params.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/deprecated/__pycache__/params.cpython-312.pyc index 126f50852ffa455c4e731168503a9b2c2b9b9bd7..a7446fb0d5fd812dfd0cf9c0ccc6584250d3c28f 100644 GIT binary patch delta 20 acmaE?@K}NSG%qg~0}$MDFy6==ApihC%ms1) delta 20 acmaE?@K}NSG%qg~0}wooP}s;FApihDN(F)d diff --git a/Backend/venv/lib/python3.12/site-packages/deprecated/__pycache__/sphinx.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/deprecated/__pycache__/sphinx.cpython-312.pyc index 7b1edb631c603b4c19615fb4d7c397a954742210..fdde562f6e8e7539e6d68f5a794858fb3834c916 100644 GIT binary patch delta 20 acmZ1%wJwVLG%qg~0}$MDFy6?mtP21@$pvHp delta 20 acmZ1%wJwVLG%qg~0}wooP}s<=tP21^M+I~M diff --git a/Backend/venv/lib/python3.12/site-packages/dotenv/__pycache__/__init__.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/dotenv/__pycache__/__init__.cpython-312.pyc index 9b08bf6dc93a96b48f004181011b372084325b13..9d488177ec35116d24d41f3a15645e584d126f96 100644 GIT binary patch delta 20 acmZ3)yNH+jG%qg~0}$MDFy6>Loecmq?gak; delta 20 acmZ3)yNH+jG%qg~0}wooP}s;loecmrYy}Sh diff --git a/Backend/venv/lib/python3.12/site-packages/dotenv/__pycache__/main.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/dotenv/__pycache__/main.cpython-312.pyc index 2cff714931fa909e1b1a0d7a13d031d5345a69cc..4dce75479ff8a11d11a1a6bdc9fcf13506c87b48 100644 GIT binary patch delta 20 acmZ2ox4Mq|G%qg~0}$MDFy6?mU=ILAa|N{k delta 20 acmZ2ox4Mq|G%qg~0}wooP}s<=U=ILA@dd>I diff --git a/Backend/venv/lib/python3.12/site-packages/dotenv/__pycache__/parser.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/dotenv/__pycache__/parser.cpython-312.pyc index 2bfa895327c9da6ec3c0258000ec661fabdabc91..8b1b41a64be8345f67424b82a8a5b1c0a6b75fc1 100644 GIT binary patch delta 20 acmbQ@H^qV diff --git a/Backend/venv/lib/python3.12/site-packages/email_validator/__pycache__/rfc_constants.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/email_validator/__pycache__/rfc_constants.cpython-312.pyc index afdef37fb9b7f1d8ef713b20f07248516d3da7b6..28b68fd40ddb70646b50fe9816064033c3259723 100644 GIT binary patch delta 20 acmeyw`-zwPG%qg~0}$MDFy6@hoDBd$ZUyfE delta 20 acmeyw`-zwPG%qg~0}wooP}s=*oDBd$>;?Y- diff --git a/Backend/venv/lib/python3.12/site-packages/email_validator/__pycache__/syntax.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/email_validator/__pycache__/syntax.cpython-312.pyc index ca955e878329c21ead81bc0ceec677faa2244043..40b72ad2599e40ceb90e0d7287f89c393bc48717 100644 GIT binary patch delta 22 ccmdnlz__!4k^3|+FBbz4+;TA9$gSr90873F<^TWy delta 22 ccmdnlz__!4k^3|+FBbz4JdIG;$gSr908Bgu_5c6? diff --git a/Backend/venv/lib/python3.12/site-packages/email_validator/__pycache__/validate_email.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/email_validator/__pycache__/validate_email.cpython-312.pyc index 942703cce469ff40f8bced96f6cb2863fef6ff19..55a4b962b234cff325a9694829744ea3cad5ee15 100644 GIT binary patch delta 20 acmbQBIzg5DG%qg~0}$MDFy6@BDg*#EiUkD# delta 20 acmbQBIzg5DG%qg~0}wooP}s=bDg*#F2n7`Y diff --git a/Backend/venv/lib/python3.12/site-packages/email_validator/__pycache__/version.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/email_validator/__pycache__/version.cpython-312.pyc index 35fbde4e6cd5bc87c560f1ed1abfd21b02901d2f..0600da2480b77f90c8770baab4b72062a0ef79f9 100644 GIT binary patch delta 19 Zcmcc5c%PB`G%qg~0}$MDFrLVL1pqe41$Y1e delta 19 Zcmcc5c%PB`G%qg~0}wooP?*Sl1pqfT1&9Cu diff --git a/Backend/venv/lib/python3.12/site-packages/fastapi/__pycache__/__init__.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/fastapi/__pycache__/__init__.cpython-312.pyc index 3092536be0bff859bde341536e2401cd32b4cb7e..2c2983ade8d0c61c55c1bba7ca9c0244d3f7da74 100644 GIT binary patch delta 20 acmcb}agl@jG%qg~0}$MDFy6@R#sUC3kOcq$ delta 20 acmcb}agl@jG%qg~0}!xC>u%(BV*vm&x&!|J diff --git a/Backend/venv/lib/python3.12/site-packages/fastapi/__pycache__/applications.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/fastapi/__pycache__/applications.cpython-312.pyc index 39d1e3c8f64bd68cf8d86c7fa4c47196d102b730..10715f4ca1b4c8ba1d9334842bcf70dde4186b5b 100644 GIT binary patch delta 25 fcmZ3pn03u!R_@chyj%=GaLd8Ck$WpQ_>Y delta 20 acmaDX^jL`dG%qg~0}!xC>u%(Z-~<3S_XJJ= diff --git a/Backend/venv/lib/python3.12/site-packages/fastapi/__pycache__/concurrency.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/fastapi/__pycache__/concurrency.cpython-312.pyc index cd34b086cc1a8c8fb8e87fe1bf381ee7d5b013aa..ab291c1c57cbb2e4ae70a26cfe19d8d7efe92446 100644 GIT binary patch delta 20 acmeC@?dRn_&CAQh00g%jj5l((umJ!u_5{WN delta 20 ZcmeC@?dRn_&CAQh00b=3x*NG$*Z?aa1H}LU diff --git a/Backend/venv/lib/python3.12/site-packages/fastapi/__pycache__/datastructures.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/fastapi/__pycache__/datastructures.cpython-312.pyc index 28ad4f3fd4436083f35c414f37fe05b6e749e8d9..6069edfadac7aedea2adb77ae91fb1ca108bb5f1 100644 GIT binary patch delta 20 acmaED|Jt7WG%qg~0}$MDFy6@hKpp@`cLrAg delta 20 acmaED|Jt7WG%qg~0}!xC>u%(JAP)dQp#@d| diff --git a/Backend/venv/lib/python3.12/site-packages/fastapi/__pycache__/encoders.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/fastapi/__pycache__/encoders.cpython-312.pyc index 9eb15469ffbcd9dcf478f875b1b5963112995711..4fa9548ae005a06ec551adb0774e19516826b28b 100644 GIT binary patch delta 20 acmZ1yu_S`~G%qg~0}$MDFy6>5sRIB$@C88t delta 20 acmZ1yu_S`~G%qg~0}!xC>u%(h)BylE8U#Q9 diff --git a/Backend/venv/lib/python3.12/site-packages/fastapi/__pycache__/exception_handlers.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/fastapi/__pycache__/exception_handlers.cpython-312.pyc index b39938e1c5d45533f66253be7eebf0457bb1603e..2fcb01105dfdeca149b2c71ff7a89fa6948308f0 100644 GIT binary patch delta 20 acmeys|AC+TG%qg~0}$MDFy6@hlpO#;X9ey6 delta 20 acmeys|AC+TG%qg~0}!xC>u%(J$_@ZJkp%4k diff --git a/Backend/venv/lib/python3.12/site-packages/fastapi/__pycache__/exceptions.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/fastapi/__pycache__/exceptions.cpython-312.pyc index 806f0b5986629f7bc84a5e31c1ce15b4b875dbd7..ae9ea813d708f5f8a62d28eae3534cedd53bed57 100644 GIT binary patch delta 20 acmZ2ywa$wBG%qg~0}$MDFy6?mEDHcUIRz8| delta 20 acmZ2ywa$wBG%qg~0}!xC>u%&$mIVMcV+0cb diff --git a/Backend/venv/lib/python3.12/site-packages/fastapi/__pycache__/logger.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/fastapi/__pycache__/logger.cpython-312.pyc index e06b1611c4b796cd640e2cb4e8731891d5e34765..752c759d5a9cbf72b401a2a548128b6e07cb597a 100644 GIT binary patch delta 20 acmZ3&w1kQKG%qg~0}$MDFy6>5$p`>4tpsWS delta 20 acmZ3&w1kQKG%qg~0}!xC>u%(hWCQ>!*8^z) diff --git a/Backend/venv/lib/python3.12/site-packages/fastapi/__pycache__/param_functions.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/fastapi/__pycache__/param_functions.cpython-312.pyc index 5372428af947810d548b2271914a747ab9a477cb..6bb4d57e80fd42da0579c58555f8bc7412fea308 100644 GIT binary patch delta 22 ccmbO|n`!oJChpU`yj%=GaLd7XBlm<}08B#$kpKVy delta 22 ccmbO|n`!oJChpU`yj%=Gz#^@?k$XZf07Y#DkN^Mx diff --git a/Backend/venv/lib/python3.12/site-packages/fastapi/__pycache__/params.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/fastapi/__pycache__/params.cpython-312.pyc index 6ea4ad0e07b9b090335e5125549c69f9e05ea009..11808a14e45cd392daa5d5d31917e31391182ec4 100644 GIT binary patch delta 22 ccmcb#m+{hGM()$Ryj%=GaLd7XBlqz*09slHNdN!< delta 22 ccmcb#m+{hGM()$Ryj%=Gz#^@?k^6WY08@kpNB{r; diff --git a/Backend/venv/lib/python3.12/site-packages/fastapi/__pycache__/requests.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/fastapi/__pycache__/requests.cpython-312.pyc index 7b34323eb1a8daa6c46b552fa03a21b245872a65..37f84c81abf9f2cf7534fdc91a902fff675f4f73 100644 GIT binary patch delta 20 acmbQqG?R(@G%qg~0}$MDFy6?`#|Qv0^#n-( delta 20 acmbQqG?R(@G%qg~0}!xC>u%)cV*~&y9|K4L diff --git a/Backend/venv/lib/python3.12/site-packages/fastapi/__pycache__/responses.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/fastapi/__pycache__/responses.cpython-312.pyc index 4c194a5ae5ab5491ab139fbfd152bdb3465758de..81de2d04129cb3435507c723fb2165cbc2face54 100644 GIT binary patch delta 20 acmaDU^iqiXG%qg~0}$MDFy6==#|Z#Gy#-+a delta 20 acmaDU^iqiXG%qg~0}!xC>u%(Z;{*UW=LBE? diff --git a/Backend/venv/lib/python3.12/site-packages/fastapi/__pycache__/routing.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/fastapi/__pycache__/routing.cpython-312.pyc index 6c9d29168fbbf211b4d918655c2a0c045e9b2a1f..d0ef2b3f02ecd4b8d4be8c960bc2d807d5f4e617 100644 GIT binary patch delta 25 fcmdnBfOXdbR_@chyj%=GaLd8Ck$WpQqkaGYWg7<4 delta 25 fcmdnBfOXdbR_@chyj%=Gz#^^N$i0=DQ9l3xTS5iV diff --git a/Backend/venv/lib/python3.12/site-packages/fastapi/__pycache__/staticfiles.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/fastapi/__pycache__/staticfiles.cpython-312.pyc index 3dec0d96c31d9209bdd55124483323c31571a1c9..7ec95c65f3d88e3c3d135fd0adf3b5bfb67c7ca6 100644 GIT binary patch delta 19 Zcmey%_?MCUG%qg~0}$MDFrLW$2>?4D1=0Wj delta 19 Zcmey%_?MCUG%qg~0}!xC>rUkU1OPQj1knHh diff --git a/Backend/venv/lib/python3.12/site-packages/fastapi/__pycache__/temp_pydantic_v1_params.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/fastapi/__pycache__/temp_pydantic_v1_params.cpython-312.pyc index 3ee922ffb4b316c6889b9fd9eb5eaddf74474c0c..4d432f6690582013eb201d5d186f49df01867d47 100644 GIT binary patch delta 22 ccmeC(%-Fk`k^3|+FBbz4+;TA9$lVkP08KasVE_OC delta 22 ccmeC(%-Fk`k^3|+FBbz4ut@7}@&CAQh00g%jj5l(ZGXnrG69kX| delta 20 ZcmZo-Z(`>@&CAQh00b=3x*NI6nE@z01CIaz diff --git a/Backend/venv/lib/python3.12/site-packages/fastapi/__pycache__/utils.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/fastapi/__pycache__/utils.cpython-312.pyc index 8ecb0f41cc2949b92f9bda928fe1dd3d789711ce..77a51287a3cb8540d5723f9d126a5c5902d9352b 100644 GIT binary patch delta 20 acmdnzwa<(DG%qg~0}$MDFy6>*tO@`@0R?OT delta 20 acmdnzwa<(DG%qg~0}!xC>u%&WRs{e$D+Fr* diff --git a/Backend/venv/lib/python3.12/site-packages/fastapi/__pycache__/websockets.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/fastapi/__pycache__/websockets.cpython-312.pyc index 8fa57874744668a984968e34b72ee44993a4b52f..994146979781fe29351efd243a9994ff41548ff8 100644 GIT binary patch delta 20 acmX@bbc%`lG%qg~0}$MDFy6>*&ju%(>X9NH-#{=5{ diff --git a/Backend/venv/lib/python3.12/site-packages/fastapi/_compat/__pycache__/__init__.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/fastapi/_compat/__pycache__/__init__.cpython-312.pyc index 975d1c592f6b998628d664b3e7b3ee9077a22d2f..09b545e5cb4937d7f6437abd9c833d5b2c359a38 100644 GIT binary patch delta 20 acmX>ja7KXpG%qg~0}$MDFy6@R$N>O4>;(k? delta 20 acmX>ja7KXpG%qg~0}!xC>u%(Bu%&u*9QPaB?UPE diff --git a/Backend/venv/lib/python3.12/site-packages/fastapi/_compat/__pycache__/may_v1.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/fastapi/_compat/__pycache__/may_v1.cpython-312.pyc index dd224cdcfa0ae6915d4f6d1ab91a6118c2646814..0e13b8177d9a1fc3cd22774d17ef8ad6030aabcd 100644 GIT binary patch delta 20 acmaE&{zRSoG%qg~0}$MDFy6?0Qy2h3^9BY0 delta 20 acmaE&{zRSoG%qg~0}!xC>u%(}DGUHS9R&pd diff --git a/Backend/venv/lib/python3.12/site-packages/fastapi/_compat/__pycache__/model_field.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/fastapi/_compat/__pycache__/model_field.cpython-312.pyc index 0f2fc81505ad6fdd8d38f6c1cf2e209e745ee8dd..6186c4d7762bdba6634fe360d72b91c2ce55beaf 100644 GIT binary patch delta 19 ZcmeAc=@#KW&CAQh00g%jj2Ciq0RSxI1Uvu$ delta 19 YcmeAc=@#KW&CAQh00b=3x(m6v04EOvI{*Lx diff --git a/Backend/venv/lib/python3.12/site-packages/fastapi/_compat/__pycache__/shared.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/fastapi/_compat/__pycache__/shared.cpython-312.pyc index 17f7dab64e1991a869eb9453312614e755d352ba..b76580fdc7e1924df457b905add51c4a3f42d383 100644 GIT binary patch delta 20 acmZ4Fy2zFLG%qg~0}$MDFy6>LT?qg@>II7c delta 20 acmZ4Fy2zFLG%qg~0}!xC>u%(pt^@!!6ag delta 20 acmaDJ_B@RHG%qg~0}!xC>u%(Z(FOoQNd*J| diff --git a/Backend/venv/lib/python3.12/site-packages/fastapi/_compat/__pycache__/v2.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/fastapi/_compat/__pycache__/v2.cpython-312.pyc index eeb60b29a17a15b180364e969df2ab71b52853e5..72cc9ce1f20e26bdcb345e91a32c8d03993bb2f2 100644 GIT binary patch delta 22 ccmZ27k8#O7M()$Ryj%=GaLd7XBe$eK08H2g@&Et; delta 22 ccmZ27k8#O7M()$Ryj%=Gz#^@?kz3Lq07e1?@c;k- diff --git a/Backend/venv/lib/python3.12/site-packages/fastapi/dependencies/__pycache__/__init__.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/fastapi/dependencies/__pycache__/__init__.cpython-312.pyc index 7a348f656ae8955eaef2c952b2f3189b615b9beb..355b73734c0d2c5941af4b4043d47e1424520f77 100644 GIT binary patch delta 19 ZcmX@jc$$&>G%qg~0}$MDFrLVL001-O1v~%% delta 19 ZcmX@jc$$&>G%qg~0}!xC>rUi8001rz1Umo# diff --git a/Backend/venv/lib/python3.12/site-packages/fastapi/dependencies/__pycache__/models.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/fastapi/dependencies/__pycache__/models.cpython-312.pyc index 3229674513a9401d8b9212270c07792e364cd413..30e899c44902a956adf5f9fb82b7434dea4d89b5 100644 GIT binary patch delta 20 acmX@3dq$W0G%qg~0}$MDFy6?0Pz(S-4h78s delta 20 acmX@3dq$W0G%qg~0}!xC>u%&eCYG&d-&CAQh00g%jj3;vc001f;1m*w$ delta 19 ZcmZo>YG&d-&CAQh00b=3x)Zs7001OO1LXh! diff --git a/Backend/venv/lib/python3.12/site-packages/fastapi/middleware/__pycache__/asyncexitstack.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/fastapi/middleware/__pycache__/asyncexitstack.cpython-312.pyc index 2408625790bee505fe823623c9158e759f5e41e1..8f42512035291b1c175077c139bc62514019298f 100644 GIT binary patch delta 20 acmaFP{hXWoG%qg~0}$MDFy6?0hZO)nZ3W2y delta 20 acmaFP{hXWoG%qg~0}!xC>u%(}!wLX6mjuWF diff --git a/Backend/venv/lib/python3.12/site-packages/fastapi/middleware/__pycache__/cors.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/fastapi/middleware/__pycache__/cors.cpython-312.pyc index 57b18ced3ef3ee601755a535fa798ec1dc2a759d..bea2aebec33d1fe9e48f74591bda58aaf5aba3d7 100644 GIT binary patch delta 19 ZcmeBR>R{qN&CAQh00g%jj3;vc1pq471oZ#_ delta 19 ZcmeBR>R{qN&CAQh00b=3x)Zto0stif1M~m@ diff --git a/Backend/venv/lib/python3.12/site-packages/fastapi/openapi/__pycache__/__init__.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/fastapi/openapi/__pycache__/__init__.cpython-312.pyc index 526bd85853591994dbc73f5f060c2c906321951b..fde6cbfac35a9b030828ff9d88783aaf21d3a390 100644 GIT binary patch delta 19 ZcmX@cc#M(zG%qg~0}$MDFrLW08vrva1uXyo delta 19 ZcmX@cc#M(zG%qg~0}!xC>rUj}4FD}x1S|jm diff --git a/Backend/venv/lib/python3.12/site-packages/fastapi/openapi/__pycache__/constants.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/fastapi/openapi/__pycache__/constants.cpython-312.pyc index 3d4fd6b22f8679a23def54df698eb9b7dfdc97d9..671694f70822d4e109262de6877f136b09a6dd2b 100644 GIT binary patch delta 20 acmeys^nr={G%qg~0}$MDFy6?W$_M~HjRj5s delta 20 acmeys^nr={G%qg~0}!xC>u%&uWdr~>w**Z9 diff --git a/Backend/venv/lib/python3.12/site-packages/fastapi/openapi/__pycache__/docs.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/fastapi/openapi/__pycache__/docs.cpython-312.pyc index e5f103d46e8e2b9dd0f366afabbc813e4adf9797..5281e6f00d1e47d404229caa72464e988e1e9ad5 100644 GIT binary patch delta 20 acmaD9@+gG+G%qg~0}$MDFy6==t_1){4h8W5 delta 20 acmaD9@+gG+G%qg~0}!xC>u%%@*8%`RI0Wzj diff --git a/Backend/venv/lib/python3.12/site-packages/fastapi/openapi/__pycache__/models.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/fastapi/openapi/__pycache__/models.cpython-312.pyc index b60c38230a4045aad132f63c895e58054248174f..9c01beeeac8412be68f07d71bef8dfff38ea38f3 100644 GIT binary patch delta 22 ccmcb&h4J1NM()$Ryj%=GaLd7XBX@8V09pG6*8l(j delta 22 ccmcb&h4J1NM()$Ryj%=Gz#^@?kvljF08=Fe)&Kwi diff --git a/Backend/venv/lib/python3.12/site-packages/fastapi/openapi/__pycache__/utils.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/fastapi/openapi/__pycache__/utils.cpython-312.pyc index 51eada15d8960acb4bb07fc117b04311136cc640..8726c2c6e6e10c6cecedeeb68b177f08252b7468 100644 GIT binary patch delta 22 ccmaFAi1Ga*M()$Ryj%=GaLd7XBX>$509p?Q-2eap delta 22 ccmaFAi1Ga*M()$Ryj%=Gz#^@?kvk<208=>y+yDRo diff --git a/Backend/venv/lib/python3.12/site-packages/fastapi/security/__pycache__/__init__.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/fastapi/security/__pycache__/__init__.cpython-312.pyc index 9565cd3fe18ff9dd76b04cec6a7c794f194658f7..6300ade328d699ced3310bb48c172a833fb8b54a 100644 GIT binary patch delta 20 acmcc4cAbs;G%qg~0}$MDFy6@R!wdjBHw6s< delta 20 acmcc4cAbs;G%qg~0}!xC>u%)sVFmy+VFU~S diff --git a/Backend/venv/lib/python3.12/site-packages/fastapi/security/__pycache__/api_key.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/fastapi/security/__pycache__/api_key.cpython-312.pyc index 6b9226cfa60fb87e6d9073d267f3ccf9aa19a239..fb4d44b1f82eaba64d30407f66ec97e6e163a869 100644 GIT binary patch delta 20 acmbOkG&6|%G%qg~0}$MDFy6?`rwIT&T?G*U delta 20 acmbOkG&6|%G%qg~0}!xC>u%)c(*yuDhXfD+ diff --git a/Backend/venv/lib/python3.12/site-packages/fastapi/security/__pycache__/base.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/fastapi/security/__pycache__/base.cpython-312.pyc index 794b94bf7e5455849a573e57448a6a486dc7151d..7182510669f7f816ffff8c35ec2e6fd958042f8b 100644 GIT binary patch delta 20 acmZo=X=UL)&CAQh00g%jj5l)sVgvv%9R(2p delta 20 acmZo=X=UL)&CAQh00b=3x*NHFF#-T7M+6W6 diff --git a/Backend/venv/lib/python3.12/site-packages/fastapi/security/__pycache__/http.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/fastapi/security/__pycache__/http.cpython-312.pyc index d07cc9a82623e856106cd4be0c448ec12cdae4d1..2f93fe604d34e9c1673a195775850dfd75492498 100644 GIT binary patch delta 20 acmexg_`i_*G%qg~0}$MDFy6@h#R33PxCamb delta 20 acmexg_`i_*G%qg~0}!xC>u%)!VgUe3;sy@@ diff --git a/Backend/venv/lib/python3.12/site-packages/fastapi/security/__pycache__/oauth2.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/fastapi/security/__pycache__/oauth2.cpython-312.pyc index 8594d7c5c94d089e6ad809cc9426c8b50a6c2dc5..1b7115f41a0313cc804273f9015efdc1042665e1 100644 GIT binary patch delta 22 ccmew{jq%4cM()$Ryj%=GaLd7XBX_Ph09m*O+5i9m delta 22 ccmew{jq%4cM()$Ryj%=Gz#^@?kvrEL08-)w*#H0l diff --git a/Backend/venv/lib/python3.12/site-packages/fastapi/security/__pycache__/open_id_connect_url.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/fastapi/security/__pycache__/open_id_connect_url.cpython-312.pyc index def1976c00b65ab88ad44ccbd2c5eff5950ea3cf..446b441008b48d0898a12e5a963e8d6d7ad73f8f 100644 GIT binary patch delta 20 acmcaDds~+KG%qg~0}$MDFy6?0fe!#c9tF|> delta 20 acmcaDds~+KG%qg~0}!xC>u%(}zy|<1NCeRU diff --git a/Backend/venv/lib/python3.12/site-packages/fastapi/security/__pycache__/utils.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/fastapi/security/__pycache__/utils.cpython-312.pyc index 99a6ecb1feadebfe0887c5c210462ecb683c1958..96ba825ed8dbea976fadbba82b5a3c92d5f5a3d2 100644 GIT binary patch delta 20 acmaFF@`#1|G%qg~0}$MDFy6==&IABFrUfYg delta 20 acmaFF@`#1|G%qg~0}!xC>u%%@X955<&;%#| diff --git a/Backend/venv/lib/python3.12/site-packages/greenlet/__pycache__/__init__.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/greenlet/__pycache__/__init__.cpython-312.pyc index 62fab2c1b4e67741a417cf84b20e464677b98993..706ddd621e8ee6bead6a7bf578db0665e688536f 100644 GIT binary patch delta 20 acmdnWv6X}SG%qg~0}$MDFy6?m#R32}Fa)ds delta 20 acmdnWv6X}SG%qg~0}wooP}s<=#R32}t^~XQ diff --git a/Backend/venv/lib/python3.12/site-packages/httptools/__pycache__/__init__.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/httptools/__pycache__/__init__.cpython-312.pyc index 0c473e8b2ce53aabb3c710c08425018ce694dfdd..a7d76042e15502ec52f1589688379a9d984f2b29 100644 GIT binary patch delta 20 acmcc4be)O&G%qg~0}$MDFy6@R!w3L6r3C{3 delta 20 acmcc4be)O&G%qg~0}wooP}s=r!w3L7BLx!x diff --git a/Backend/venv/lib/python3.12/site-packages/httptools/__pycache__/_version.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/httptools/__pycache__/_version.cpython-312.pyc index 959fc73e942602493ac6c682fb3f92849e597898..e12fa2e82a51b5931d649e50b63472e94a7769f8 100644 GIT binary patch delta 19 Zcmcb^c!!buG%qg~0}$MDFrLVL5dbz>1#bWV delta 19 Zcmcb^c!!buG%qg~0}wooP?*Sl5db#F1%Chl diff --git a/Backend/venv/lib/python3.12/site-packages/httptools/parser/__pycache__/__init__.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/httptools/parser/__pycache__/__init__.cpython-312.pyc index 4e93220d53e68de0cd8014813952688a418f3a29..0338e72d3f18b0e3263b8a7846f757c9eac43562 100644 GIT binary patch delta 20 acmdnUypfsvG%qg~0}$MDFy6?$j1d4e*##2- delta 20 acmdnUypfsvG%qg~0}wooP}s=5j1d4fR|O*g diff --git a/Backend/venv/lib/python3.12/site-packages/httptools/parser/__pycache__/errors.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/httptools/parser/__pycache__/errors.cpython-312.pyc index b5a73483cc54206c8f2e3bc1a9f504105b758db9..e8054be8ff4dfcb837d10fcc2e4d06b267174a0b 100644 GIT binary patch delta 20 acmX@ed61L)G%qg~0}$MDFy6?$jRgQXGzC%s delta 20 acmX@ed61L)G%qg~0}wooP}s=5jRgQXvISxQ diff --git a/Backend/venv/lib/python3.12/site-packages/httptools/parser/__pycache__/protocol.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/httptools/parser/__pycache__/protocol.cpython-312.pyc index 0070ee078242d4d6d631c9135e1b454ae1b4b141..99b0a564d1ab9fece74efdc8e8dbcf3ae1edaf71 100644 GIT binary patch delta 20 acmbQsH5#0~&6O9XQO delta 20 acmbQsHva9)7>G%qg~0}$MDFy6@R!T|s~WCacY delta 20 acmX>va9)7>G%qg~0}u#E>u%(B;Q#*#0UU3l?1f_ delta 20 acmdnXw3mtdG%qg~0}u#E>u%&WVgvv%69d2i diff --git a/Backend/venv/lib/python3.12/site-packages/httpx/__pycache__/_api.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/httpx/__pycache__/_api.cpython-312.pyc index 629c6f558b407820dddc3049a774342bbbd81f8e..d85b18d82c65bb7f1ede60d276b550347af28571 100644 GIT binary patch delta 20 acmewm@F9TvG%qg~0}$MDFy6?WssR8=tOgMP delta 20 acmewm@F9TvG%qg~0}u#E>u%&u)c^oPDg_(> diff --git a/Backend/venv/lib/python3.12/site-packages/httpx/__pycache__/_auth.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/httpx/__pycache__/_auth.cpython-312.pyc index 78e10a7979081c74fb141dd1d3a0228f1e790c7d..367abf2182cddaf020ec33efc1c7e221d56402e6 100644 GIT binary patch delta 38 tcmexT`K6NkG%qg~0}$MDFy6?0Tb1V)qrxq=l+5(h;*wjNKdCZ_0{{+>4gvrG delta 38 scmexT`K6NkG%qg~0}u#E>u%(}t;+L@QQ;O_N@jX$amlaEpH!K|0r{j2O#lD@ diff --git a/Backend/venv/lib/python3.12/site-packages/httpx/__pycache__/_client.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/httpx/__pycache__/_client.cpython-312.pyc index 2f065d6821a8ddbab58ca44678fbca9fd87ff92d..b1af977dbcc06f9f9f5939e396aba065ae8343d0 100644 GIT binary patch delta 22 ccmdn{m3i-1X71Cxyj%=GaLd7XBlo6X0AN7~8UO$Q delta 22 ccmdn{m3i-1X71Cxyj%=GARw)~k$clG09n5WB>(^b diff --git a/Backend/venv/lib/python3.12/site-packages/httpx/__pycache__/_config.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/httpx/__pycache__/_config.cpython-312.pyc index 1683b230e319e79336e36ae0b9b03288a2dda22a..f4c6e9f20126bf681c374c362496d7b48e948306 100644 GIT binary patch delta 20 acmaDE`ZARJG%qg~0}$MDFy6?0PYVD_N(P7k delta 20 acmaDE`ZARJG%qg~0}u#E>u%(}rv(5*$OV%C diff --git a/Backend/venv/lib/python3.12/site-packages/httpx/__pycache__/_content.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/httpx/__pycache__/_content.cpython-312.pyc index 21f90ecf14c2869bb76fa6953afec95b74f6fcbb..aaa4d9acc1030c81d7d49b6688935c0ecfae36e5 100644 GIT binary patch delta 20 acmZ1#xGIqQG%qg~0}$MDFy6>LUjqO?;03_| delta 20 acmZ1#xGIqQG%qg~0}u#E>u%(puK@r#UIfel diff --git a/Backend/venv/lib/python3.12/site-packages/httpx/__pycache__/_decoders.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/httpx/__pycache__/_decoders.cpython-312.pyc index 2a4c84e0df0768892419f7ce8203def9e73c68ae..9d5d24d3aad2471e659044909e25915c07e0cffb 100644 GIT binary patch delta 22 ccmey>#Q3X;k^3|+FBbz4+;TA9$er&909N=0t^fc4 delta 22 ccmey>#Q3X;k^3|+FBbz42uSO0^&gG%qg~0}$MDFy6?mqYnT=!v%=| delta 20 acmdlUw>^&gG%qg~0}u#E>u%)M(FXuLK?IZl diff --git a/Backend/venv/lib/python3.12/site-packages/httpx/__pycache__/_main.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/httpx/__pycache__/_main.cpython-312.pyc index 3d14086926e9efd29331e681cce5ad0cd0554e38..aed352f854646428f6a79519fbb3f0aaf041843d 100644 GIT binary patch delta 50 zcmbQZka6NdM()$Ryj%=GaLd7XBe#hZ$1O&MUrbgCw>G;=8FMq<+FY&LD+;7Itvf^k Dcp49U delta 50 zcmbQZka6NdM()$Ryj%=GARw)~k=sOy;}@gCFD5I6Uz^>fjJX+qZLU`B6$Mh9)*Ye% DUknci diff --git a/Backend/venv/lib/python3.12/site-packages/httpx/__pycache__/_models.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/httpx/__pycache__/_models.cpython-312.pyc index f653a961a0ddc57c256864f1ef9d4a284f0411a6..135262ea3edb5f6e2e8ae0ecddb0a198496f6c97 100644 GIT binary patch delta 43 vcmaEUlKJ^bX71Cxyj%=GaLd7XBex+xB@_h!Nf-}@ delta 43 vcmaEUlKJ^bX71Cxyj%=GARw)~k=u};@z-Ws{u(DBwJT7{5=dR`5{d!u%)cWM=%eS(I7S2moV&22cP1 diff --git a/Backend/venv/lib/python3.12/site-packages/httpx/__pycache__/_status_codes.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/httpx/__pycache__/_status_codes.cpython-312.pyc index d5129e5138fbf4f161d880bbf2cff5b4773f23b0..8404e780f86d999658b278f1bf923fe0e28ca31c 100644 GIT binary patch delta 20 acmbPhG1r3oG%qg~0}$MDFy6>5Bm)3BNCeyf delta 20 acmbPhG1r3oG%qg~0}u#E>u%&0k^ulR#slX7 diff --git a/Backend/venv/lib/python3.12/site-packages/httpx/__pycache__/_types.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/httpx/__pycache__/_types.cpython-312.pyc index 792ba9afa8d8cecb8bc495518cfc0d01ebd3ddfa..c4df4b6338ff203ca86724af431cd7cde7e35c74 100644 GIT binary patch delta 20 acmew=`&E|vG%qg~0}$MDFy6@hiVpxpE(Ra~ delta 20 acmew=`&E|vG%qg~0}u#E>u%(J#RmXAtOY9o diff --git a/Backend/venv/lib/python3.12/site-packages/httpx/__pycache__/_urlparse.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/httpx/__pycache__/_urlparse.cpython-312.pyc index c7a5d712b3418f519ca2936e37c30db5495e45b3..5aabf7d7b048c3a88d91cb69baec183c410dcaf7 100644 GIT binary patch delta 29 jcmccA!FZ{Ik^3|+FBbz4+;TA9$h}CI@z&;b!b=PQi^d6( delta 29 jcmccA!FZ{Ik^3|+FBbz42uSO0I!_z`jSmTA delta 29 jcmbPxi*fEPM()$Ryj%=GARw)~ky}@X@z-WcohJ?efSL%8 diff --git a/Backend/venv/lib/python3.12/site-packages/httpx/__pycache__/_utils.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/httpx/__pycache__/_utils.cpython-312.pyc index 6ee67ae3285adea8474a0446251d59b708f1c040..4b1cdb10f242aa37822810f626588fde5ba57289 100644 GIT binary patch delta 20 acmbQ{In9&%G%qg~0}$MDFy6@BtpWf$oCR?J delta 20 acmbQ{In9&%G%qg~0}u#E>u%)kRsjGt8U%a* diff --git a/Backend/venv/lib/python3.12/site-packages/httpx/_transports/__pycache__/__init__.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/httpx/_transports/__pycache__/__init__.cpython-312.pyc index 08fb82a7e91d4ca8342b1eb4dd10f20555572103..2b0b41c980ad612501c497f6b61cc97f9a3b7fc9 100644 GIT binary patch delta 20 acmdnTypNgtG%qg~0}$MDFy6?$nGpat;RQMX delta 20 acmdnTypNgtG%qg~0}u#E>u%)U%m@H6Uj#(} diff --git a/Backend/venv/lib/python3.12/site-packages/httpx/_transports/__pycache__/asgi.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/httpx/_transports/__pycache__/asgi.cpython-312.pyc index c26f7cbc0c995b303b1409c3b1f91170f5793872..00e7a1c7e17e638104744ddb671257a84865689a 100644 GIT binary patch delta 20 acmbPlJ>Q!9G%qg~0}$MDFy6>LMHT=%1qEpU delta 20 acmbPlJ>Q!9G%qg~0}u#E>u%(pA`1XCg9LN{ diff --git a/Backend/venv/lib/python3.12/site-packages/httpx/_transports/__pycache__/base.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/httpx/_transports/__pycache__/base.cpython-312.pyc index 9c578e8aeced0baa7aa97fd558233c106b5811c3..24ae6c76de9c79bb17e5a599dbe61312c538e26c 100644 GIT binary patch delta 20 acmZ1?w?vNnG%qg~0}$MDFy6>5$qxWFs|2tB delta 20 acmZ1?w?vNnG%qg~0}u#E>u%(hu%)kWd{H)B?IvQ diff --git a/Backend/venv/lib/python3.12/site-packages/httpx/_transports/__pycache__/wsgi.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/httpx/_transports/__pycache__/wsgi.cpython-312.pyc index 38312f2666fb5d3628e5306f4847c66ce2402568..9f548b006e23420124b31c1d4e272c9f1c0bea2c 100644 GIT binary patch delta 27 hcmZ2vy2zCKG%qg~0}$MDFy6@hSdj77=J$e|IRJ3F2=4#@ delta 27 hcmZ2vy2zCKG%qg~0}u#E>u%(JEXeq4^LxR~8~|iR2pRwY diff --git a/Backend/venv/lib/python3.12/site-packages/idna/__pycache__/__init__.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/idna/__pycache__/__init__.cpython-312.pyc index f523ba29c532b76a49d9f07d7657d098e1204a40..d0d8e6540248cfa1c860eade5c5c14f458dc7805 100644 GIT binary patch delta 20 acmey$_LYtMG%qg~0}$MDFy6?W#S8#H=LKf~ delta 20 acmey$_LYtMG%qg~0}!YiDsAM>Vg>*@Qv{R% diff --git a/Backend/venv/lib/python3.12/site-packages/idna/__pycache__/core.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/idna/__pycache__/core.cpython-312.pyc index f4e1608278635a4bd181f82b0aa8c6d4c0b11344..97b41d8182cfeaf811fe9fa513174f50d0854751 100644 GIT binary patch delta 20 acmX?FceIZCG%qg~0}$MDFy6>*We)&Jg9ZZt delta 20 acmX?FceIZCG%qg~0}!YiDsAMpvIhV|?*%Xb diff --git a/Backend/venv/lib/python3.12/site-packages/idna/__pycache__/idnadata.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/idna/__pycache__/idnadata.cpython-312.pyc index c8117e6073bd21a5a2ccf73133ab701d04c9ed67..eac06ad5ef9a8ef7fa3a055dc82d69a7a04c2ef0 100644 GIT binary patch delta 25 fcmdlqg>BOmHty5Byj%=GaLd8Ck$WpQqk0zrVcZ7Z delta 25 fcmdlqg>BOmHty5Byj%=Gpl+zt$i0=DQN0TQSra#n=ra#n=@?6 delta 20 acmaFO{F<5jG%qg~0}!xC>u%(Jzz6_169m8j diff --git a/Backend/venv/lib/python3.12/site-packages/jose/__pycache__/constants.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/jose/__pycache__/constants.cpython-312.pyc index cc271883fec81aa4a710d264d7574509e3204881..22d05a132e2972dddad727fb05c2e067140768f1 100644 GIT binary patch delta 20 acmcaDaa)4>G%qg~0}$MDFy6==zykn2Xaz<9 delta 20 acmcaDaa)4>G%qg~0}!xC>u%%@-~j+Pk_1Hn diff --git a/Backend/venv/lib/python3.12/site-packages/jose/__pycache__/exceptions.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/jose/__pycache__/exceptions.cpython-312.pyc index f933eb20589eb9eec3c2536e6f99f02d4ba940f5..ebc5cad2b7ec2f3f00c9db383f0c227a8a18c74c 100644 GIT binary patch delta 20 acmaDO_(qWXG%qg~0}$MDFy6@hkOKfg5C!J| delta 20 acmaDO_(qWXG%qg~0}!xC>u%(J$N>O4It1nb diff --git a/Backend/venv/lib/python3.12/site-packages/jose/__pycache__/jwk.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/jose/__pycache__/jwk.cpython-312.pyc index ef71fa60468a501ed4b539aac1cc876a5ab034a7..e9223f72753825ef53de70c14f73dc0cd731edf9 100644 GIT binary patch delta 20 acmZ1?yhND$G%qg~0}$MDFy6>LlM?_o83hyo delta 20 acmZ1?yhND$G%qg~0}!xC>u%(p$q4{2Lj)55 diff --git a/Backend/venv/lib/python3.12/site-packages/jose/__pycache__/jws.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/jose/__pycache__/jws.cpython-312.pyc index f8ac68594d86cb11b03ba8a208b97fb366997cf7..5b290ae0fd82522327237d047ea1d7227021183a 100644 GIT binary patch delta 20 acmZ4Gv&x72G%qg~0}$MDFy6>5uLb}u%(hR|5byR0K2t diff --git a/Backend/venv/lib/python3.12/site-packages/jose/__pycache__/jwt.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/jose/__pycache__/jwt.cpython-312.pyc index 3cc655850cd644b59769d5556590884c5974eaa2..9cee352d4c0702efce9bd514620ef00062301900 100644 GIT binary patch delta 22 ccmaE|knzbvM()$Ryj%=GaLd7XBlpb!09g(PIRF3v delta 22 ccmaE|knzbvM()$Ryj%=Gz#^@?k^5!<08%&xH~;_u diff --git a/Backend/venv/lib/python3.12/site-packages/jose/__pycache__/utils.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/jose/__pycache__/utils.cpython-312.pyc index dbb450f53470c837c2af3d5ce232ed44137c003b..353e7d5d2fb4e8b73db7a0459ee064d9f86aa97c 100644 GIT binary patch delta 20 acmdmDy2X_HG%qg~0}$MDFy6?$QVIY)as`u%&;DFpyFoCKHv diff --git a/Backend/venv/lib/python3.12/site-packages/jose/backends/__pycache__/__init__.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/jose/backends/__pycache__/__init__.cpython-312.pyc index 43850aeeb0729454ad51921d06fcdc34fec14e2c..2e44cafdc44245db8e14368aba28311f8b31a77a 100644 GIT binary patch delta 20 acmZqYXy@QQ&CAQh00g%jj5l)sVFmy&{{u%)c<^upNTmygr diff --git a/Backend/venv/lib/python3.12/site-packages/jose/backends/__pycache__/cryptography_backend.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/jose/backends/__pycache__/cryptography_backend.cpython-312.pyc index 5dd6a4052657d3195488505ef1a260b7504996f6..5050a660bd1bd11ea3b3200cdbaf39f9ba11d817 100644 GIT binary patch delta 22 ccmccgkMYt!M()$Ryj%=GaLd7XBe#1!0ApeYYybcN delta 22 ccmccgkMYt!M()$Ryj%=Gz#^@?k=wl<09=d)YXATM diff --git a/Backend/venv/lib/python3.12/site-packages/jose/backends/__pycache__/native.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/jose/backends/__pycache__/native.cpython-312.pyc index 2ed385fb4ac8432e085621ab032d15e5cb7518ea..38d76c12d8bdef0d0ec70e0c36710993c74862d7 100644 GIT binary patch delta 20 acmZ1>yF!-xG%qg~0}$MDFy6>Lmk$6qCIvYF delta 20 acmZ1>yF!-xG%qg~0}!xC>u%(p%Lf24Py{#t diff --git a/Backend/venv/lib/python3.12/site-packages/limits/__pycache__/__init__.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/limits/__pycache__/__init__.cpython-312.pyc index d158c2369b07767a60f2354f8ee5a6271a4f37cb..a41b897f1cf01f34f05f9ac8b9d94bf54b724615 100644 GIT binary patch delta 20 acmaFM_LhzNG%qg~0}$MDFy6?W#0&sFrv*;{ delta 20 acmaFM_LhzNG%qg~0}wooP}s5#0&s3Cj?&r delta 20 acmbQsHkXb2G%qg~0}wooP}s;V#0&s3r37yP diff --git a/Backend/venv/lib/python3.12/site-packages/limits/__pycache__/errors.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/limits/__pycache__/errors.cpython-312.pyc index b8670cbd9f6c4e1207a583a7c52dc090da25342c..bca70456b39229352e81abba1e817d1da53d921b 100644 GIT binary patch delta 20 acmdnbv!93iG%qg~0}$MDFy6>*!Uh01QUufh delta 20 acmdnbv!93iG%qg~0}wooP}s diff --git a/Backend/venv/lib/python3.12/site-packages/limits/__pycache__/strategies.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/limits/__pycache__/strategies.cpython-312.pyc index 5066e3b12e02f47e476ea74b07d01b6fa6ba1eff..4ff91da6e1bf8897f95668ed566e5900dea5d032 100644 GIT binary patch delta 20 acmX>ReIlCsG%qg~0}$MDFy6?$R~G<9{RT7u delta 20 acmX>ReIlCsG%qg~0}wooP}s=5R~G=R diff --git a/Backend/venv/lib/python3.12/site-packages/limits/__pycache__/typing.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/limits/__pycache__/typing.cpython-312.pyc index 4aa0ee7f45e62877778ace669e4482e8cc88f158..7ac1c3593c2c47c5b49708aedc5edf2b7f434d9e 100644 GIT binary patch delta 20 acmdm?yF-`zG%qg~0}$MDFy6?$Rtx|ww8_iG%qg~0}$MDFy6?m#0&s5rv#4x delta 20 acmZ3>ww8_iG%qg~0}wooP}s<=#0&s6B?O-U diff --git a/Backend/venv/lib/python3.12/site-packages/limits/aio/storage/__pycache__/base.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/limits/aio/storage/__pycache__/base.cpython-312.pyc index 1265a57b2e44a732075ca71b12c2668131e2633c..58a7d54b147c4ae2daad0709c2add6a59425cee2 100644 GIT binary patch delta 20 acmX@>an^(TG%qg~0}$MDFy6@Rqyhj#5CxO~ delta 20 acmX@>an^(TG%qg~0}wooP}s=rqyhj#js>Iu diff --git a/Backend/venv/lib/python3.12/site-packages/limits/aio/storage/__pycache__/memory.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/limits/aio/storage/__pycache__/memory.cpython-312.pyc index 1718b1a83cc697796314827701ff80dea611bb02..fde4705784b48c263dff97150040deac25007104 100644 GIT binary patch delta 22 ccmbQy$T*{sk^3|+FBbz4+;TA9$ldDz07qH|1poj5 delta 22 ccmbQy$T*{sk^3|+FBbz4JdIG;$ldDz07uvc6#xJL diff --git a/Backend/venv/lib/python3.12/site-packages/limits/aio/storage/__pycache__/mongodb.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/limits/aio/storage/__pycache__/mongodb.cpython-312.pyc index c368616114e36ccfc85d1d54481c64130131f3df..0e3343947e8446a02e5bf98d89b265ef83f7dbe3 100644 GIT binary patch delta 22 ccmcc9#(1ZVk^3|+FBbz4+;TA9$Q|em08)$wUH||9 delta 22 ccmcc9#(1ZVk^3|+FBbz4JdIG;$Q|em08< delta 20 acmZotY*OSt&CAQh00d7X6gF~~3jhE!Mg-vi diff --git a/Backend/venv/lib/python3.12/site-packages/limits/aio/storage/memcached/__pycache__/emcache.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/limits/aio/storage/memcached/__pycache__/emcache.cpython-312.pyc index 94a019074c1fedfe3df37c6928a1d2a91312638a..12a166e88f3025fc973360ae5c92f0017f1a6c10 100644 GIT binary patch delta 20 acmexl^~s9+G%qg~0}$MDFy6?WE(-ug*#+PL delta 20 acmexl^~s9+G%qg~0}wooP}stKG%qg~0}$MDFy6?0SR4RArv=ym delta 20 acmX@7e@>tKG%qg~0}wooP}s*ZUg{DRt32L delta 20 acmX?(9 delta 20 acmcbYbuWwiG%qg~0}wooP}s;FYzhEN4+bm% diff --git a/Backend/venv/lib/python3.12/site-packages/limits/aio/storage/redis/__pycache__/valkey.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/limits/aio/storage/redis/__pycache__/valkey.cpython-312.pyc index e42a18499fac53d524000734133fc7baee2ef3ae..031c3afb1c61e42e8b33d7964e8eae4cf9aed718 100644 GIT binary patch delta 20 acmbQkHiwP-G%qg~0}$MDFy6>5$P556{{&nB delta 20 acmbQkHiwP-G%qg~0}wooP}s;V$P557eFSU( diff --git a/Backend/venv/lib/python3.12/site-packages/limits/storage/__pycache__/__init__.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/limits/storage/__pycache__/__init__.cpython-312.pyc index bfafbbcd9828100302a4105d1dd86b044729f1dd..62280065b90e170d8eb7528b82f198a432d753fa 100644 GIT binary patch delta 20 acmbOrF+qa+G%qg~0}$MDFy6?`$^!s0umoiQ delta 20 acmbOrF+qa+G%qg~0}wooP}s=L$^!s1E(CP| diff --git a/Backend/venv/lib/python3.12/site-packages/limits/storage/__pycache__/base.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/limits/storage/__pycache__/base.cpython-312.pyc index 9263b63e46c55bbbfdc36d39eec3ed9f86a15c21..e4779eefe0bb3601a3fdbd72a6ba5fdebca1f832 100644 GIT binary patch delta 20 acmaFk`^K01G%qg~0}$MDFy6@hPz?Y{o(6pY delta 20 acmaFk`^K01G%qg~0}wooP}s=*Pz?Y|90rX5 diff --git a/Backend/venv/lib/python3.12/site-packages/limits/storage/__pycache__/memcached.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/limits/storage/__pycache__/memcached.cpython-312.pyc index 055306ae7c8df17133b10c3ce8e08069f98a4e6e..51df251f597602d0752c5b1f2cb82a112f587252 100644 GIT binary patch delta 20 acmaEp@g{@&G%qg~0}$MDFy6?WXaWFCcm_cL delta 20 acmaEp@g{@&G%qg~0}wooP}s5XaN9090g?n delta 20 acmbPJFsFd~G%qg~0}wooP}s;VXaN90ngw+L diff --git a/Backend/venv/lib/python3.12/site-packages/limits/storage/__pycache__/redis_cluster.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/limits/storage/__pycache__/redis_cluster.cpython-312.pyc index 9183036537016dc1b47fa7f4f2e6d498da5f5f64..65fc2ca282c21d830fe2bea1aa784da00ffa0c53 100644 GIT binary patch delta 20 acmZoSXgA#hw0QDChpU`yj%=GaLd7XBlkfTzFUknzZlhiF~(If+1lRPe2b-^696gA4$=Ss delta 42 xcmX>#hw0QDChpU`yj%=G@H9eUBlkfTzF&+rzZlhiF~(If+1mcve2b-^696u&4={8 delta 20 acmX?Ob;gSOG%qg~0}wooP}s=rC<_2VX9a!$ diff --git a/Backend/venv/lib/python3.12/site-packages/mako/__pycache__/cache.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/mako/__pycache__/cache.cpython-312.pyc index 01b753a00de786b1506654aeb0c3ac1986436349..25d0158e5733abc0a19ff73f3826b162df5528bd 100644 GIT binary patch delta 20 acmdn&wAqRKG%qg~0}$MDFy6?mp$GszB?UJC delta 20 acmdn&wAqRKG%qg~0}wooP}s<=p$GszqXkC* diff --git a/Backend/venv/lib/python3.12/site-packages/mako/__pycache__/codegen.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/mako/__pycache__/codegen.cpython-312.pyc index 3b937af54ae31acc94e73dd283b8f38db8cb3cc5..fe0890ee59205e1d73cc467e639b2e7eccf052d9 100644 GIT binary patch delta 22 ccmX?fmif?GX71Cxyj%=GaLd7XBlq@a09xz^#Q*>R delta 22 ccmX?fmif?GX71Cxyj%=G@H9eUBlq@a09$GY)c^nh diff --git a/Backend/venv/lib/python3.12/site-packages/mako/__pycache__/compat.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/mako/__pycache__/compat.cpython-312.pyc index b74742c2c79c3fbe8cd7c1cc120e686e6f4e2637..3ecc97b39d1e0346c5bf9ab9ab3903ecb3d74e03 100644 GIT binary patch delta 20 acmZpXXp!JP&CAQh00g%jj5l)s5CJq2Ndj!t_ delta 20 acmZ3ew@{D!G%qg~0}wooP}s;VCJq2N`2^np diff --git a/Backend/venv/lib/python3.12/site-packages/markupsafe/__pycache__/__init__.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/markupsafe/__pycache__/__init__.cpython-312.pyc index f16873a9f676233c1257ff36f031deacce7c92a0..307cd095125cdd054ef52607754e4abbbbd61a01 100644 GIT binary patch delta 29 jcmaE{nDND8M()$Ryj%=GaLd7XBe#PpvX+JWG%qg~0}$MDFy6?m!~_5|UIdB& delta 20 acmZ3>vX+JWG%qg~0}wooP}s<=!~_5|+yt5c diff --git a/Backend/venv/lib/python3.12/site-packages/packaging/__pycache__/_structures.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/packaging/__pycache__/_structures.cpython-312.pyc index 4aa32fe43305cd37cee4a9a90c01dd71d23eee37..d3af0ebca35c04f7b12342eb46fe419d92d9bac0 100644 GIT binary patch delta 20 acmZ1>xk8frG%qg~0}$MDFy6>Lmj?hhlm#yU delta 20 acmZ1>xk8frG%qg~0}wooP}s;lmj?hi5(Pg1 diff --git a/Backend/venv/lib/python3.12/site-packages/packaging/__pycache__/version.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/packaging/__pycache__/version.cpython-312.pyc index eff75247ca1dee0ed6f905b99421cbb2e9354397..71f5c3127c09e76675e583db57749b735302d1f8 100644 GIT binary patch delta 22 ccmex7pYij2M()$Ryj%=GaLd7XBlin`09!-{VE_OC delta 22 ccmex7pYij2M()$Ryj%=G@H9eUBlin`09(QbaR2}S diff --git a/Backend/venv/lib/python3.12/site-packages/paypalcheckoutsdk/__pycache__/__init__.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/paypalcheckoutsdk/__pycache__/__init__.cpython-312.pyc index 2bed8584f40dc1379dddb01cab951faa74230a91..e88b0fc31ef4aa1850e9635bc1fd4dc0690661f9 100644 GIT binary patch delta 20 acmbQiG=quzG%qg~0}$MDFy6?`%Lo84%>+gO delta 20 acmbQiG=quzG%qg~0}wooP}s=L%Lo85O9WN` diff --git a/Backend/venv/lib/python3.12/site-packages/paypalcheckoutsdk/__pycache__/config.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/paypalcheckoutsdk/__pycache__/config.cpython-312.pyc index 388fc07aacda1b79e220ca7d038a3875ba2dc023..25346ea5a60a71ef18d295a7110a83ba404cc9ab 100644 GIT binary patch delta 20 acmbQsK9`;QG%qg~0}$MDFy6>Li5UPhO9bHn delta 20 acmbQsK9`;QG%qg~0}wooP}s;li5UPh$prBL diff --git a/Backend/venv/lib/python3.12/site-packages/paypalcheckoutsdk/core/__pycache__/__init__.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/paypalcheckoutsdk/core/__pycache__/__init__.cpython-312.pyc index b46719388fcbcf99e601d91bdd0d24d6a94b4982..f60b76dbef74c6b1ea92971305ab5774548322a7 100644 GIT binary patch delta 20 acmeBU>0{wO&CAQh00g%jj5l&KGXVfEh6F7D delta 20 acmeBU>0{wO&CAQh00d7X6gF}*GXVfF1Oz<* diff --git a/Backend/venv/lib/python3.12/site-packages/paypalcheckoutsdk/core/__pycache__/access_token.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/paypalcheckoutsdk/core/__pycache__/access_token.cpython-312.pyc index 899516db526ca62d9c0ce00642a3e46a666a1e4d..f4dc13cec4d37dd2e46200dd4ecf7a3373ccd596 100644 GIT binary patch delta 20 acmaFI`HqwOG%qg~0}$MDFy6@hm<0epJO$YR delta 20 acmaFI`HqwOG%qg~0}wooP}s=*m<0epx&`R~ diff --git a/Backend/venv/lib/python3.12/site-packages/paypalcheckoutsdk/core/__pycache__/access_token_request.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/paypalcheckoutsdk/core/__pycache__/access_token_request.cpython-312.pyc index 97882416e1f0ca9cf8f2aa4075f7e88a664557ac..dd751d4799e214e252d7e32f62fc9cba3844de6c 100644 GIT binary patch delta 20 acmeyt{)3(SG%qg~0}$MDFy6@hmKgv+g9Y*c delta 20 acmeyt{)3(SG%qg~0}wooP}s=*mKgv-0R{p9 diff --git a/Backend/venv/lib/python3.12/site-packages/paypalcheckoutsdk/core/__pycache__/environment.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/paypalcheckoutsdk/core/__pycache__/environment.cpython-312.pyc index 35096f48d8772b0125172423059e22cd0b7b290d..5ead4ed325978e2851c06b13c36af54987df9a1f 100644 GIT binary patch delta 20 acmeAZ?i1!d&CAQh00g%jj5l&Oa{>S|sRYsh delta 20 acmeAZ?i1!d&CAQh00d7X6gF}S}Cj{aE diff --git a/Backend/venv/lib/python3.12/site-packages/paypalcheckoutsdk/core/__pycache__/paypal_http_client.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/paypalcheckoutsdk/core/__pycache__/paypal_http_client.cpython-312.pyc index bb7ec43fc7686ee1d660a2908d471c20562342d7..cd408d82cfc9169024f4e570c1656e014f5cdc3e 100644 GIT binary patch delta 20 acmaDO{zjbpG%qg~0}$MDFy6@hkQ)F&>jm}z delta 20 acmaDO{zjbpG%qg~0}wooP}s=*kQ)F(X$A%W diff --git a/Backend/venv/lib/python3.12/site-packages/paypalcheckoutsdk/core/__pycache__/refresh_token_request.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/paypalcheckoutsdk/core/__pycache__/refresh_token_request.cpython-312.pyc index c0a43e657938c7d1c46321b685fe0baf18fb170d..d17a7d9c176e8bdc3c608d3758be16626c168be8 100644 GIT binary patch delta 20 acmZo?Z)fK|&CAQh00g%jj5l)EFarQD+XSBg delta 20 acmZo?Z)fK|&CAQh00d7X6gG0#FarQESp=^D diff --git a/Backend/venv/lib/python3.12/site-packages/paypalcheckoutsdk/core/__pycache__/util.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/paypalcheckoutsdk/core/__pycache__/util.cpython-312.pyc index 5624dfd5303cc388b4edd14395ec3fcaa6a56e08..069e401cd7b2cbbab8a99a1c82d705f822e238f8 100644 GIT binary patch delta 20 acmZ3-ypEasG%qg~0}$MDFy6?$m=ORqVFd~R delta 20 acmZ3-ypEasG%qg~0}wooP}s=5m=ORq-vt@~ diff --git a/Backend/venv/lib/python3.12/site-packages/paypalcheckoutsdk/orders/__pycache__/__init__.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/paypalcheckoutsdk/orders/__pycache__/__init__.cpython-312.pyc index e332d4497ccb951a5f0c5a2c7521996bd24c8183..c9b136fd09a81d7d29db2318da62e230e59de4f5 100644 GIT binary patch delta 20 acmX@ca*T!hG%qg~0}$MDFy6>*%>)2AMg-LW delta 20 acmX@ca*T!hG%qg~0}wooP}s)2A#02F4 diff --git a/Backend/venv/lib/python3.12/site-packages/paypalcheckoutsdk/orders/__pycache__/orders_authorize_request.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/paypalcheckoutsdk/orders/__pycache__/orders_authorize_request.cpython-312.pyc index 0e66a296ee604f7b00ea71a5d9f5db9c0774ee5c..564850d8c8e80546f522ffd919d816e4f934d3ae 100644 GIT binary patch delta 20 acmdlaut|XXG%qg~0}$MDFy6?m&H(^6+yu7( delta 20 acmdlaut|XXG%qg~0}wooP}s<=&H(^7S_H=c diff --git a/Backend/venv/lib/python3.12/site-packages/paypalcheckoutsdk/orders/__pycache__/orders_capture_request.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/paypalcheckoutsdk/orders/__pycache__/orders_capture_request.cpython-312.pyc index 5b7e5335da0540bc470246ed8cc64e438cceb43e..82cae2dae09f291fea2911b7daffb404c12b83c1 100644 GIT binary patch delta 20 acmeyt|AU|VG%qg~0}$MDFy6@hmK^{>rv?T9 delta 20 acmeyt|AU|VG%qg~0}wooP}s=*mK^{?B?cA% diff --git a/Backend/venv/lib/python3.12/site-packages/paypalcheckoutsdk/orders/__pycache__/orders_create_request.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/paypalcheckoutsdk/orders/__pycache__/orders_create_request.cpython-312.pyc index ca2b3c45bf10f1df74fcc680eefcecc877bf719f..14cec159c98d6116c2daa9fa0b0609cf408033a6 100644 GIT binary patch delta 20 acmcb}bCHMpG%qg~0}$MDFy6@R#s&a8A_WQn delta 20 acmcb}bCHMpG%qg~0}wooP}s=r#s&a8pamKL diff --git a/Backend/venv/lib/python3.12/site-packages/paypalcheckoutsdk/orders/__pycache__/orders_get_request.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/paypalcheckoutsdk/orders/__pycache__/orders_get_request.cpython-312.pyc index b86a6c98e1be879a03db9557efcc7ea3c52e293b..66989d3bdbd8778e15f2b3af4befd5459b01a312 100644 GIT binary patch delta 20 acmcb_afyTbG%qg~0}$MDFy6@R&H?~BxCH|M delta 20 acmcb_afyTbG%qg~0}wooP}s=r&H?~CHU$#^ diff --git a/Backend/venv/lib/python3.12/site-packages/paypalcheckoutsdk/orders/__pycache__/orders_patch_request.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/paypalcheckoutsdk/orders/__pycache__/orders_patch_request.cpython-312.pyc index c8bd4c16acf9949323333829e4032cf382e5c433..9d768c35d5a78d9c678e0869780b82c75648a56b 100644 GIT binary patch delta 20 acmew^^j(PiG%qg~0}$MDFy6?W!wCRE?FEYf delta 20 acmew^^j(PiG%qg~0}wooP}s*!wvvB+XV3d delta 20 acmX@kcbt#=G%qg~0}wooP}sLodp0iTm(JG%qg~0}$MDFy6?0h6?~bS_QHI delta 20 acmcaEdR>(JG%qg~0}wooP}s diff --git a/Backend/venv/lib/python3.12/site-packages/paypalhttp/__pycache__/environment.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/paypalhttp/__pycache__/environment.cpython-312.pyc index d4d6e52cebabb7dcb6c9f7c91d39cb104fe7a5be..c72cb4cedc096b1e5db9b156506ed407e8284419 100644 GIT binary patch delta 20 acmbQrGL?n*&JF-M69nP_ delta 20 acmX@acZiSsG%qg~0}wooP}sLUkCs>ngvq; delta 20 acmZ3bx=NM%G%qg~0}wooP}s;lUkCs?7zJYh diff --git a/Backend/venv/lib/python3.12/site-packages/paypalhttp/__pycache__/http_error.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/paypalhttp/__pycache__/http_error.cpython-312.pyc index acf7955f61ff99cc4dca5b8ec054e2204274ff65..844b87b3a1e903fcbb4763aa181b58fd5cb77a8e 100644 GIT binary patch delta 20 acmdnaww;apG%qg~0}$MDFy6?m!wdj6Hw3K! delta 20 acmdnaww;apG%qg~0}wooP}s<=!wdj6wFJEY diff --git a/Backend/venv/lib/python3.12/site-packages/paypalhttp/__pycache__/http_response.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/paypalhttp/__pycache__/http_response.cpython-312.pyc index 28a37638d099a029e9e7a2eea12baa7a18e0d276..d9c013d79777fb3f6050dfb90a757d772d79b96b 100644 GIT binary patch delta 20 acmdljzFVC8G%qg~0}$MDFy6?$fg1oiLj_|1 delta 20 acmdljzFVC8G%qg~0}wooP}s=5fg1oi!3A>w diff --git a/Backend/venv/lib/python3.12/site-packages/paypalhttp/serializers/__pycache__/__init__.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/paypalhttp/serializers/__pycache__/__init__.cpython-312.pyc index ee95ea3aa355478d9f3e1b6f0ea6aee6821ebc52..90bf365d169b2342105283134551959664b595c5 100644 GIT binary patch delta 20 acmdnRvWtcLG%qg~0}$MDFy6?m&jbKAW(2VS delta 20 acmdnRvWtcLG%qg~0}wooP}s<=&jbKAn>1SOiZ1 delta 20 acmbQnF^z-!G%qg~0}wooP}s=L%>n>1)&ySw diff --git a/Backend/venv/lib/python3.12/site-packages/paypalhttp/serializers/__pycache__/json_serializer.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/paypalhttp/serializers/__pycache__/json_serializer.cpython-312.pyc index a4865d6a947e9cb2007ac25145e398eba1419646..900aba9d85946011d51f37e72293b6d80e71f5c4 100644 GIT binary patch delta 20 acmZ3^zMP%=G%qg~0}$MDFy6>LhZz7g+XVjr delta 20 acmZ3^zMP%=G%qg~0}wooP}s;lhZz7hSp^RO diff --git a/Backend/venv/lib/python3.12/site-packages/paypalhttp/serializers/__pycache__/multipart_serializer.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/paypalhttp/serializers/__pycache__/multipart_serializer.cpython-312.pyc index e618d7453fc7a0c04ef77ffba15eeef475b41cb0..77a1056bbf64fc9ac08aac7b13d44f890c54e285 100644 GIT binary patch delta 20 acmeCs?$G8w&CAQh00g%jj5l)EiUI&NB?SBc delta 20 acmeCs?$G8w&CAQh00d7X6gG0#iUI&NqXi5A diff --git a/Backend/venv/lib/python3.12/site-packages/paypalhttp/serializers/__pycache__/text_serializer.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/paypalhttp/serializers/__pycache__/text_serializer.cpython-312.pyc index 9a5edaaf1fd8b236884e25b88b9fb887fc528b9f..c234943d1a65e0a69e8fb12f1976e013abcc6e9f 100644 GIT binary patch delta 20 acmX@fc9M*#|!{D2L$5) delta 20 acmX@fc9MOGG%qg~0}$vs8*k+9U;+Rv$pjPt delta 20 acmbQtI+>OGG%qg~0}wngP}<1d!2|#>=LDkw diff --git a/Backend/venv/lib/python3.12/site-packages/pip/__pycache__/__main__.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/pip/__pycache__/__main__.cpython-312.pyc index dfccec438593d00fb3f6583fd3d5f03ab8f3d62c..5cb40a4e0b49bedc8bc4dd8b407604c64f63db1b 100644 GIT binary patch delta 20 acmcc2cA1U)G%qg~0}$vs8*k+HUO-vg{6n?Y2{>RvfArR6e8zoI~<)4zIN>mY2g^+|q0s`bvOVw)Q9m9gX>+G%x zCLmFS)Ksce4ppHyPE}G`smC6B@5RQbkd-2(Y7fng#D}(=`o`-GNNM||eKT+0yl>vT z`R4r`4hI1x*?(UB)&uYxGh7KYCv}Setbzg=P>90iNrotVhEs%P$nca*`Q3p1QQ;I% z7f^1R12B3xpdQ6L72fx|GxYo~!Upclq_K{3tqnwF;@V53k(V#y!_k-b7Xq08VY&MA z!9pk#A}l_{KHB2OxML>F!3|IX%b)~Z+)OK;>V&h$K|OWqpykXJg1D_4O^1s>fF4pp z)7=23?-nR6u78QG_D!An7o4yXQd+-@Z19ecK$(k2=e`-3rP-22MLH{It$bOuCRJ0+ z>cz6C=ft8~Oo$Iu{HKYssHnLdHK=BZRGU!^T`S-`6%3BEker&QB959|po%D)qH3X; z5G@^7na482V~O`LtWeYq3&UnqIVfvQTQn`%qRt*KSkgmr?gh*K z1tU(jd2`GG0)EU>KZgpLM5YdU@gEa~TZVbK25zm~8ybT+KeR_uZy=t>pa$Y?Ac#5- zA4dQd2xF@w^TfsYimVa>pC1yS4Bzt)NSqACiOrjq5$9|!^`1>;OhzhE+>_FidV!`V zwAu7EYED~vF@00FXg+yW*QZr&B7IfPPE$=u&tR3)dG%hpShgm0?R=`|T-sDEnk?c1 zd4ig0yq>fqp-vhlO{0b+rHbXfK<@#T>4O7)M2@^^6=Jl+cH~Uhr{ZY)w zY(w=2{Iv+1vBcW_FZh)?Y@wdr}y42o*XR(DTUDa^(HStVV0?`PewnGQ@Ft9+t zKC=VWBJ6}(zqs_-C4^hQu@y_yLWzoysG|#BuxiX*X;7yL&?KCw=oD$BTcTMiGG2(z z`Nf9|Vz)u>msA7&eU~3D#8a43a74ByudA9u4VIvy8jOKiwudW>8BFTz$*lqf>@Sev zD6jCy3F7i0Ba}&8u)9Xo;$VZ2qZH9-*1}71HW10OE!g+YlN{%!w?yUzq$)RL^LXQN-Z+d505ov7r?r8tOm^3;(JRbMhf=Tl^+n+1t^Q^B-uepa=HZ0TO{dz zNp2hftxz^En`VLHn@}3bK7j^=lYKja8BCqQufgqQ*zrVPab8bbod@rsmu%()uw`t^ zf~;ziG}qHFYm9dImc%z+73*j+vQkU3)uNM|!B{?yFWiqYjm+(UoVV~Hnq@N{vwf1J z=vmB}N865!d^CP@ct{!@xN~=KbYQIUSnL+}`KVe>w}WG46MNpktZLcboNg3k%l066 zv24ejE{P2xRgkmTk*QI3IN;OG6uVa=);tjF#gb$kMYB;0JAmbqCFkx{&7_89oMdZ* zEbr!7PP5hQE*gd0^Y=Rc`-}_tkG*%Zf@+s1guLVgBGjWmLc3mw9bJsP@)DBV^@HHs z=3`YpwsLjlPKEDSOK+6f_muklnwOFzO(LcR@()JQi?H&Ol zd>Z~FybWztXj{2c?L1fOys!oDKlepeKG^gfufS;Klf&4ocJF(#3vg7 literal 0 HcmV?d00001 diff --git a/Backend/venv/lib/python3.12/site-packages/pip/_internal/__pycache__/__init__.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/pip/_internal/__pycache__/__init__.cpython-312.pyc index 5c438fa78210693f3c5725a09e88c594a1734bcc..2380107de3d99505a0b1d73326401a7cf6d9abed 100644 GIT binary patch delta 20 acmey#`jeIWG%qg~0}$vs8*k)(#{>X8xdlc5 delta 20 acmey#`jeIWG%qg~0}wngP}<1-jtKxj*9Fx8 diff --git a/Backend/venv/lib/python3.12/site-packages/pip/_internal/__pycache__/build_env.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/pip/_internal/__pycache__/build_env.cpython-312.pyc index 8475356a261f0144e42ad536dc25b7802ee7f160..a3a851a16205f288abd82e0e424f210722358396 100644 GIT binary patch delta 22 ccmdnh$GEGHk^3|+FBbz4=sFv3DVgLXD delta 22 ccmdnh$GEGHk^3|+FBbz4JTOq&$gS@V08NJl@c;k- diff --git a/Backend/venv/lib/python3.12/site-packages/pip/_internal/__pycache__/cache.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/pip/_internal/__pycache__/cache.cpython-312.pyc index bda1830cbddb04df15dc231d6e08ff6bd0f6ce05..f056e70ea292190e4feee416a1552806ccc9abbf 100644 GIT binary patch delta 20 acmcbSa3g{HG%qg~0}$vs8*k+HH2?rZiv>pj delta 20 acmcbSa3g{HG%qg~0}wngP}<1tYXAU8sRh;m diff --git a/Backend/venv/lib/python3.12/site-packages/pip/_internal/__pycache__/configuration.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/pip/_internal/__pycache__/configuration.cpython-312.pyc index 50e17387b52526f2de11c9ecde2d9665ebbbd303..61cf35d82c497447c7281a1c8a871f2a2586e3ff 100644 GIT binary patch delta 22 ccmaFg$N0XFk^3|+FBbz4=sFv3 delta 22 ccmZ3mmubOXChpU`yj%=G@W4Q6BlpyK08!2c+5i9m diff --git a/Backend/venv/lib/python3.12/site-packages/pip/_internal/__pycache__/main.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/pip/_internal/__pycache__/main.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ec0dd64c72b43307280c007ed994bf35219d9c98 GIT binary patch literal 644 zcmX|aRw)fQ@XB4IZ3b~9`;Gt5j*_gKNg z&c@EpUi?#RtOFKeWhX4xT;OeI-?Xj1|6g;O?o7D^FVEtbp&RaI;X z%)tyC=tAlFkYT8h4L9NmB7~HxvnMJhAqZ9Z+sp&7G6d@%az0m~Y^GUZYHpWSaH}j= z-Z$X+{d>C)vJJ>ZxCE{{$X`2QEx0slZ{lQ@D;>ZgJZsR6&p-#av*lEs7Qv;vtH~awnA{fh`ngG>!-W literal 0 HcmV?d00001 diff --git a/Backend/venv/lib/python3.12/site-packages/pip/_internal/__pycache__/pyproject.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/pip/_internal/__pycache__/pyproject.cpython-312.pyc index d1f1fd066df62af039b8a6f9080592f43fbfca7a..a6f2b0b46a63d3d748ce79974c72286783bd0dd7 100644 GIT binary patch delta 19 YcmeBH=vLr9&CAQh00g?u#tXRx04jq6umAu6 delta 19 ZcmeBH=vLr9&CAQh00a*VlooOe001r$1U~=( diff --git a/Backend/venv/lib/python3.12/site-packages/pip/_internal/__pycache__/self_outdated_check.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/pip/_internal/__pycache__/self_outdated_check.cpython-312.pyc index 8017583cf113b098f28cbcbb44fb1c1d607b63be..bc839fe447f9e773aceb17e233b71363d5d7974a 100644 GIT binary patch delta 20 acmZ1)urz@CG%qg~0}$vs8*k*6(f|NCO9X}h delta 20 acmZ1)urz@CG%qg~0}wngP};~Xr2zmvX$2Jk diff --git a/Backend/venv/lib/python3.12/site-packages/pip/_internal/__pycache__/wheel_builder.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/pip/_internal/__pycache__/wheel_builder.cpython-312.pyc index b3f6ff918e41abc2378b7349eee7d2dfcbaf53f3..168194c05c6b34ca204218a25af9eff05fb990d0 100644 GIT binary patch delta 20 acmaD7{3MwBG%qg~0}$vs8*k*ksR;l?kOj&B delta 20 acmaD7{3MwBG%qg~0}wngP}<0SQxgD4t_E2E diff --git a/Backend/venv/lib/python3.12/site-packages/pip/_internal/cli/__pycache__/__init__.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/pip/_internal/cli/__pycache__/__init__.cpython-312.pyc index f6962d6e5c036d09789d7b388f469171a02982bc..e9999f36c655fa467466304ebfbf7bed24c523d2 100644 GIT binary patch delta 20 acmbQsG?$6{G%qg~0}$vs8*k(mVgvvz>;tO+ delta 20 acmbQsG?$6{G%qg~0}wngP};~X#0UT}3IsX; diff --git a/Backend/venv/lib/python3.12/site-packages/pip/_internal/cli/__pycache__/autocompletion.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/pip/_internal/cli/__pycache__/autocompletion.cpython-312.pyc index eb971aed021e52d63eb56c35fced3d59460304d6..ae17246666cfcc3635bb6e6abc0637b80fb1400a 100644 GIT binary patch delta 20 acmZ4QzTTbtG%qg~0}$vs8*k)Zq6`2!k_8O_ delta 20 acmZ4QzTTbtG%qg~0}wngP}<17L>T}+umzj| diff --git a/Backend/venv/lib/python3.12/site-packages/pip/_internal/cli/__pycache__/base_command.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/pip/_internal/cli/__pycache__/base_command.cpython-312.pyc index 79ce44c06f2cb3db77287db8173c28ff261179c3..6219c2481b18eb6e12b45969bafe398c11a60fe7 100644 GIT binary patch delta 20 acmaDA^eTw^G%qg~0}$vs8*k)}*8~7WTm@PH delta 20 acmaDA^eTw^G%qg~0}wngP};~HuL%H1dIjkK diff --git a/Backend/venv/lib/python3.12/site-packages/pip/_internal/cli/__pycache__/cmdoptions.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/pip/_internal/cli/__pycache__/cmdoptions.cpython-312.pyc index 9bf3d2ea89e72ab1fa7921f3895258a4ddcc1561..d30aad459d8f4b946d310d2c5bc20b5f0d1d5e43 100644 GIT binary patch delta 22 ccmbREmT}@+M()$Ryj%=GpzCbBk-M!708%anQ~&?~ delta 22 ccmbREmT}@+M()$Ryj%=G@W4Q6BX?UF09H%};{X5v diff --git a/Backend/venv/lib/python3.12/site-packages/pip/_internal/cli/__pycache__/command_context.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/pip/_internal/cli/__pycache__/command_context.cpython-312.pyc index bff8db8ec8bb03397d7b8b545daa973fab68ab06..53339b54931a3055f7a4f2ed5647199fb847b484 100644 GIT binary patch delta 20 acmZ3+w~UYbG%qg~0}$vs8*k*6W(NQ;3IpT- delta 20 acmZ3+w~UYbG%qg~0}wngP};~X%?A diff --git a/Backend/venv/lib/python3.12/site-packages/pip/_internal/cli/__pycache__/main.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/pip/_internal/cli/__pycache__/main.cpython-312.pyc index 2d3e1a58e1bad837c31c8f43cee4f994cb116676..f39dd2de44e3493f514423d1e2f77975d6dbfcdc 100644 GIT binary patch delta 20 acmcaBcvq17G%qg~0}$vs8*k*k!~p<04+Rha delta 20 acmcaBcvq17G%qg~0}wngP}<0Si30#WEd`$d diff --git a/Backend/venv/lib/python3.12/site-packages/pip/_internal/cli/__pycache__/main_parser.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/pip/_internal/cli/__pycache__/main_parser.cpython-312.pyc index 052063e6d4fc51725572bc84d602152cde579dfa..d26d25e4668573fbcc5d229131cf3bd60e6f3613 100644 GIT binary patch delta 20 acmaE@`dXFyG%qg~0}$vs8*k)(AOrwE83k+r delta 20 acmaE@`dXFyG%qg~0}wngP}<1-KnMUsHwF6u diff --git a/Backend/venv/lib/python3.12/site-packages/pip/_internal/cli/__pycache__/parser.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/pip/_internal/cli/__pycache__/parser.cpython-312.pyc index 8b55a966691734ec743fc82fd582dbcd6a8077b7..20e30abfb9aaaaf12931731c8f36052d28089a69 100644 GIT binary patch delta 20 acmbPQGPQ*JG%qg~0}$vs8*k+1vH}1*?F6s@ delta 20 acmbPQGPQ*JG%qg~0}wngP}<1NWd#603k5#_ diff --git a/Backend/venv/lib/python3.12/site-packages/pip/_internal/cli/__pycache__/progress_bars.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/pip/_internal/cli/__pycache__/progress_bars.cpython-312.pyc index 88760d393edfef9ea19f79a4d764068e6cab8181..4e1e9a2f5aa2b3700ed2353f894dfdab797b0e4c 100644 GIT binary patch delta 20 acmaE)|45(vG%qg~0}$vs8*k*kE)D=c9tCOu delta 20 acmaE)|45(vG%qg~0}wngP}<0ST^s;IJO%jx diff --git a/Backend/venv/lib/python3.12/site-packages/pip/_internal/cli/__pycache__/req_command.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/pip/_internal/cli/__pycache__/req_command.cpython-312.pyc index df76262b662f09ed9d38df4f216e39698f024fee..646f21f7232092b09a7494264ae529ac1ad25675 100644 GIT binary patch delta 20 acmZ3PvoeSKG%qg~0}$vs8*k*6GXnrU=>*sS delta 20 acmZ3PvoeSKG%qg~0}wngP};~XX9fU52L)#U diff --git a/Backend/venv/lib/python3.12/site-packages/pip/_internal/cli/__pycache__/spinners.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/pip/_internal/cli/__pycache__/spinners.cpython-312.pyc index 735b1621d670bcf98e4b92c58b7e82269c4d62b4..0ee65e483d5279dd2700e23caadb5bddaa4b092e 100644 GIT binary patch delta 20 acmeB(=!oDx&CAQh00g?u#v8f+Y6Ac_<^@6k delta 20 acmeB(=!oDx&CAQh00a*Vls0nz)dm1O1O?Fm diff --git a/Backend/venv/lib/python3.12/site-packages/pip/_internal/cli/__pycache__/status_codes.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/pip/_internal/cli/__pycache__/status_codes.cpython-312.pyc index 846bdbc8dc9a8b42393fc300aa87623fa94dc526..cde67eaf26d759072d43df3f4c74660079a1bdc9 100644 GIT binary patch delta 20 ZcmZo@&CAQh00g?u#v8fI7y&7;1K9uo delta 20 acmZo@&CAQh00a*Vls0mgF#-TB&ID)x diff --git a/Backend/venv/lib/python3.12/site-packages/pip/_internal/commands/__pycache__/__init__.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/pip/_internal/commands/__pycache__/__init__.cpython-312.pyc index 22242d8d2d1eb4305ebd3480a5def219a5ad0ea8..853a15b005506ec517d70f14ddab07f96628c2bf 100644 GIT binary patch delta 20 acmbQQFkgZDG%qg~0}$vs8*k(m5dZ)&g9H2k delta 20 acmbQQFkgZDG%qg~0}wngP};~XA^-q2p#+Nn diff --git a/Backend/venv/lib/python3.12/site-packages/pip/_internal/commands/__pycache__/cache.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/pip/_internal/commands/__pycache__/cache.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..1bcb49c3f404fec15b7664e048770533f1b81cc1 GIT binary patch literal 10182 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 literal 0 HcmV?d00001 diff --git a/Backend/venv/lib/python3.12/site-packages/pip/_internal/commands/__pycache__/check.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/pip/_internal/commands/__pycache__/check.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c5fce98a1040b04f9dc3f77c9d228fc8243950e6 GIT binary patch literal 2590 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

=2!TlLvzrxvAP0KC@ZuW{LELzsr+yJ_HO zU{?Xt%l2?Zfy5+Er3(sz#bJKqw{H?axQ2>byU)HlJL&y}0I&>0)e0Flq$yLztnf7kMa1Hlbw$fY8Fp)i zre=qcHDYhfa28J5FK#h2SQ;1%%o#j{z{SvOR*2QL#@_C_0>i5)@N2l;;651`-WHJ@!mss z#COHVsq|**$VTeOd)I#4{9*IK;-l2b&D5EV)S2Hd{bu=L>dd3mH=cxo&+WQ-{%M3u z4t_7cIhffP%shyESou};m(_=ZnMZ>c|B!g&@zDO8Q=cSu-+ukp>zj##8;OHksTVg> z;~S~*2Pb}U`lqKqY(6^v#-r5K(@-$E3$XSaxH`g4_`^WN^3Dzb62lT? z@hY7Cz*8o(Lf}a@4ukJ=>>x6roms-WO#@-%;r0&qXTI>4{f8g&&p+YQ;ZxhM1$KoG z+&!_)!Qs#}MrZ+^iVXN2hz)dK`wPlJlENuB0kC=-Sxk z?RLTNKw@-sTZamwjBxt0v~blkGS0*a|iy$jem?kVVe&Q@i%sF$79LZ_Ta8WZ2NEusPx{U e*gr1^&IFzdKI8_Uo)3O4aNutA-yA&brTz=Ms#y&H literal 0 HcmV?d00001 diff --git a/Backend/venv/lib/python3.12/site-packages/pip/_internal/commands/__pycache__/configuration.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/pip/_internal/commands/__pycache__/configuration.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..7ecf8fa0dde45b8f3677e7b20504a55cead40664 GIT binary patch literal 13414 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 VS8Vre&sq6Ces1p{IM!gZ{x2DCOo;#h literal 0 HcmV?d00001 diff --git a/Backend/venv/lib/python3.12/site-packages/pip/_internal/commands/__pycache__/debug.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/pip/_internal/commands/__pycache__/debug.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ea4df7b8e3de68486f2768334d81f17b795dbdfc GIT binary patch literal 10017 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 delta 20 acmaDR_)L)dG%qg~0}wngP}<0Sn*#tpl?A#0 diff --git a/Backend/venv/lib/python3.12/site-packages/pip/_vendor/truststore/__pycache__/_ssl_constants.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/pip/_vendor/truststore/__pycache__/_ssl_constants.cpython-312.pyc index 8a812ed73754e2b6cc2e66bdbc9b762206e1b2ee..97cb4f12ed8a044d47f9cdfeada02ccc043db84e 100644 GIT binary patch delta 20 acmcc4ah-$vG%qg~0}$vs8*k+HVF3U(*92$) delta 20 acmcc4ah-$vG%qg~0}wngP}<1t!vX+0^#u0- diff --git a/Backend/venv/lib/python3.12/site-packages/pip/_vendor/truststore/__pycache__/_windows.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/pip/_vendor/truststore/__pycache__/_windows.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..3e86aab6d762305e80af602059bf8c707f7be6a6 GIT binary patch literal 15787 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 diff --git a/Backend/venv/lib/python3.12/site-packages/pip/_vendor/urllib3/__pycache__/_collections.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/pip/_vendor/urllib3/__pycache__/_collections.cpython-312.pyc index 0052f69fce4d0fb7c0b4d0da172a9d9676f32cc8..013c32141125a89afa429fb3d7f63c63977d6c90 100644 GIT binary patch delta 22 ccmey;!1$$sk^3|+FBbz4=sFv37VJG%qg~0}$vs8&BlE4FEID1mgez delta 19 ZcmaFH_>7VJG%qg~0}wngP@2en8vr+31#$oY diff --git a/Backend/venv/lib/python3.12/site-packages/pip/_vendor/urllib3/__pycache__/connection.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/pip/_vendor/urllib3/__pycache__/connection.cpython-312.pyc index e8d5d9244c850a7ef4a87d6a47a5d99f968c6cc1..6ba8695741b7a7e3424d5137947dcb12dfa73be1 100644 GIT binary patch delta 22 ccmX>+pYiZ~M()$Ryj%=GpzCbBk$Z+pYiZ~M()$Ryj%=G@W4Q6Bliw}08*(2wg3PC diff --git a/Backend/venv/lib/python3.12/site-packages/pip/_vendor/urllib3/__pycache__/connectionpool.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/pip/_vendor/urllib3/__pycache__/connectionpool.cpython-312.pyc index 0ec988d26aad92b824421873b4d015e14c2c0d0e..0bd4a18c55f864d02b3dfc09f4f9b582addbeb48 100644 GIT binary patch delta 22 ccmX>-m+ACeChpU`yj%=GpzCbBk^4X&08jY_d;kCd delta 22 ccmX>-m+ACeChpU`yj%=G@W4Q6Blm$m08|$T3jhEB diff --git a/Backend/venv/lib/python3.12/site-packages/pip/_vendor/urllib3/__pycache__/exceptions.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/pip/_vendor/urllib3/__pycache__/exceptions.cpython-312.pyc index ac298f96e75cc394a14720ded1629720c1014539..40a2fe60f06e1d0c43c8d1f7c511a5b781a0721d 100644 GIT binary patch delta 20 acmX?@c`%dvG%qg~0}$vs8*k*^W&!|0I|Y~k delta 20 acmX?@c`%dvG%qg~0}wngP}<17%>)2OSq3Kn diff --git a/Backend/venv/lib/python3.12/site-packages/pip/_vendor/urllib3/__pycache__/fields.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/pip/_vendor/urllib3/__pycache__/fields.cpython-312.pyc index 8b973218398e3434ed96a494c3035a94f1c703aa..79b54d5854a8a30b96629147adc7e448dc51dfb3 100644 GIT binary patch delta 20 acmdlPxHFLZG%qg~0}$vs8*k)ZrvU&xj|D^k delta 20 acmdlPxHFLZG%qg~0}wngP}<17P6Gfztp(En diff --git a/Backend/venv/lib/python3.12/site-packages/pip/_vendor/urllib3/__pycache__/filepost.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/pip/_vendor/urllib3/__pycache__/filepost.cpython-312.pyc index 3f1b9732e1dba303d1a54db0beeba0594ed3167d..ffdca1f3a88889481db116b573e1365c5c2b8be3 100644 GIT binary patch delta 20 acmdldzfYd~G%qg~0}$vs8*k*^%ntxJHU!oH delta 20 acmdldzfYd~G%qg~0}wngP}<17nI8Z;M1& delta 22 ccmZo!z}T{Yk^3|+FBbz4JTOq&$o-Y^ diff --git a/Backend/venv/lib/python3.12/site-packages/pip/_vendor/urllib3/__pycache__/response.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/pip/_vendor/urllib3/__pycache__/response.cpython-312.pyc index 7142faf8f556f7a3bf614893314a3f8e57a45995..6bb1cdd8e3a0d3e1bdc9c0ccec343f576078f770 100644 GIT binary patch delta 22 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 Ib2IS#Um>7&`~Uy| literal 0 HcmV?d00001 diff --git a/Backend/venv/lib/python3.12/site-packages/pip/_vendor/urllib3/contrib/__pycache__/ntlmpool.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/pip/_vendor/urllib3/contrib/__pycache__/ntlmpool.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..623702c5654579c92930b2650ecbf853edb18226 GIT binary patch literal 5731 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 OMMw5pf3k;1_Fx0iXy91egO* z5;>qFyS`I8R})J!X~i^|Ml+MPa_!zIU0FAp+qr9;N#fhP(sls?J)kk1HJUZp}eUY#KHpl%9eaKI< zMHl)def zcJ_8mI@sGe>16M+$+D0+WQmr~x+YyH+Z?h+-Ln;w70h1}t(^5tdf>N(N~2Y?-bwFl z^n7`F>nH1H8zviO8z&oQn@afSvY9b8MD~3kc_w!ug>&X5Ib3}! zDY`=L$?kB?%&Tgg>_h15vR{28^bPe(_966~>{s6i4XIzU51~`CUwtEVTK$rJ2%VAr z>Kma^^-K04G$#AiH$vysFWHAsLH4U}geKK5*@w`JvR{28^s@RT`w+S)`_(r>Q|g!O zL+G2bUwtF=iuxt{5c;<4SKkPINBxq02*qkDeh|7`9L8}7{hDs*Ro&39>xN#_4gFo+ z&~NC5{^QM|=bI--uonKw<`}g3+q$9ubaUvGG3@#E(npMwXRvBs4BJB$9~i|Fg&ip4 zyPHeb4@I44!uFYezB&Cd1W9FA7LD+H#r%qf%}`GTDY%<>fpYH zaj2g8lg)X;uYO<xQ!a=`+5n0Y=Gmz=b~Xg8CMFJPlSa8ACDnl z@box;DUzIy&nNlhbl8q4K0d{xg81xQBpMccJgWhf1Y&$-mKqa?CHbjvAc=PJ=fc4N zv&QFI0 z9!aI(&C&sQJ7Dx$`4@1{Zf$~op$@lz}(ydEeZf*n=}W4 z@emui0Dmr!NCt#ZBmn?o4JK%=VQI1BrO7 zOCEo;5+gky4FP+gJ+VY2gta5j*Jp&&wT@6H4U z!RKQ=>pmBa2QSE@(jT8&5P*!5d`Ga8-@B*xKsTI&YOncYG_jw(bPf>k#lp#F#L+y1 z85l`0sG(CdK~UX!j9fAt>f)z_FvF<9>40!Pj9$gjq6K~qa3(OHO9mn_f=GakXAo@= zVUMB`@u}n`Of=SoKq3(jMgk}kC@wfZi^T;jk0Pdkr4xJyjaKWpl%ut?ixr2;Lg7GE zUNLgCGT(s>vATj(P8Sjdqw{RJ$OIu8nT?3Gh^3(l1|WtuG4Z zi0>PHg@0jqbfAkL{EahXgX81;=`mK^@ToH+!-EJP9_=4FJ1{)@9Df3NM^8`iBg3bL zCs6RjX?_BgO2rKiBJU7?YH+OoBuei)F+4In@rpQZL&FoJRQAy6F}{yK(>FFT+<$hY zZ;U^4cI?dQ@j*0W07Z`uj}DEYromH#qZ2;Vj4*!iC4BJXC;LW5s5;iTzO(4b7`2t} zKYiwvvEk=VPVgsBj|>bV@Wdcm*mq)NP^=Ce>>ueHKGnq!^quN^j#@d!pGHYyKPjo$ zQvT(WgA`2l_Thj3#PI1+>Qevd(TOp9cA>{(6H4}%hsOuI_`b2>aWt7VYiR5=sv!^~ z7ivL4$U8bHmPFuZ08>T@NeF;v0f2%w4Gi{;piB(gXh8;_{pZA8b{g`oz&S?x!+w!0 zjQ*VVDTpwG>xklQN<=Q><-shNINg7G#1A~~@5hLaPW+sh+fGxyygx34hX_qGoRGIM z_9K#9$d}2!eoVJyr#0{P1CxY>q(2t-hXo-n z`Ag=j{6R__5QM;je@ckY`sc#4`D%Xd| zB$oI1lVRc=K`8te!V4@AeRB8-d&SSu`h4GzuQ&(Rk=BNv7+Q+TdvqvTzAAhfv?G`l z8zj-Wi3s;B$K}fvFoA2lxVPwgpXQtKh0r7IzeQtCsD|N`M@rCQ9W~L@0oZ8&K2&FjjQQ?XW*UF>kYl{4E)34w}w~Ewdv0#A|K$Y~{q#zSZ$r&@OYEj*f`-YpJwk36mz>NatxJLMn@^>%5fJBo&y zP>KA|qNVSLZ^DI?+^}RS)gYJ|ZCWW$iu*v4Z!DQorYr8Gvhel5JkF&|Gs=+4)pFdD zIb{qP>kzPHK?;W&Bl~0t^O6;m+oB!qFHO=ov1g`M z_Nnhw=_01;OoJLC`%(s!fDZ+p_LO<1Nsd+DDSN6^u6M}+7&sQu-zB^go|G-29RZqW zMb9`Fvnp^iT>X9c0eO;|vCyXgKWz!^McMH=&Mg?XbLzs>gB#>c(IscfIitW&EoZ4D zRr1zEs^syoy+AGL)3i>To>xngeHS{gCOieD(();KD3##V%u!lcMNiQ93e9}yo6d3W zZOF((|J8pazAqVMc^P1U(!>Y--H!g6-YQAK^%GKNkESLC!N_qyvznTUOYbx$obJL7SCG;`=09?9?e@t*%aP>+O6iD zjNc1{Lf9rI@})vJc#%mKz<;r7`=fD)44wlg7M_}q=Iw*TA!Fk)IFYvuo*6zfn6J<# z>^ld}F7FnDUZx%W3EF<=O9w9p!*kTVyxkv`{hej`GEK)Lp}d3O2wrt+DlFtZ>?0bE zolj2tne+&O<(C8qI>I5p1O^8r8)5mwO;Rz838KYp`4SmKdkB_xf(&3iA4^hSXT^Pa z-YQjS4^D$Q_9r5X;k+T7ARI>{raX*D$6 zVf0zL*6TWRb={e|?pw3jx?{`bYmU0KW81oi&v|+>o}RR`XRW#|SG_w^y?fblufccg zE18Dgw5|4DC7-L@ovGZNt?XVdS#wt{Th_eQ%k~X(O=zXA>&*RRZE+#T2KpVn;qv|-13OINO?FVoVOu0{5`jV8|1gob4+dp7oPtzBtb!%APq z)_l+5P1kkab#$_B_hvl3X=m>}m-`ownz)LZ8_w&_2V4nyRpq_$-1X;{2k*J6(k}ky z*$>0ti@qPdyW_}O=f1Ri`^~#nEkw&hQ}f7*!n_U3KnQcQxi*yECrcpV)T) za-#(CUnHh5gzvNuxw#K^!1+>EEs<9kg8ly+8G@w3 z4$L?KhN1^#)1r_=E0_mYQ38A_%mWnpOExeMrC=UPCFbEA$dM%lmO^44D&+in#0$(r ziCkL&^Ps~XJf0CKU>?l641ra{3Y4bojLes&tSOis)N@N#r3Z$q=irygIQ6TTjO&oX zO=MiB2aJq6QjQsgrIBI77!DiAxb5-1l*qW+I&Jz!wKUl$k#TJ*9VTWI8RzBv>RTeN zjyD|&8Hb;dal8x2xWWW5GVWkx9IoFZm-eN|II9WstDtm{@yoho{E~oO-~Tinhv-36 zY=EFAAn71g8p&TF6TTD|E@)}F(1~7jRtdZC5_XeA%Sq@Wr<MQf>3}$^WYK5o=Yr5rF-K@<^ah{TrZ@1 zyMA4|SJ!px#Y|n#a{0Q;n{%~fTrD>pw_eY>jxC$@2%*cpY~CYwFH4b>9kQoAwc5t6H&V+^yHl8#b=Capn1y7t%Ey`0{X` znw92k<<5CpeQ*@ck9PL8_jhtXF0aGK zk2^hs9i|^2>uVU?Zu)7B0UtlDH6!AuO$G{Swvd0jg~B^bJl=&qfif+ftiug7P7!C z4O!vZLnUw>Asbw0s1$Bl$PTwWo;Owl=m%S`d2PWG^r#H6TSsvw9;QFdJ{C2ar1C&kUkUd?+(A^mEg z%sQYfMN+UuZe`b}<_;M?kosZZ7P$9K;`VB&)4@=0zJvsO5Iurxm*ve2@c9x*uxV?< zkZ8VCkyz);6t6!N5%QIrCEW~v=WTvzYmv7nl$}_ok#Kf&idCKFC6m4=by3b$6>xNN@aSgUEk%emIvvTR9UcO2hzZNR)4Q z+pu8xS0>oY7z3}NiEPT#wC^Kz9*rhUIbv7~v@o#uCVK)|E7-$8Wh<#CDZRYEgSr=rNmQY1TSc|CQdV)Bm}NvTE?_U6gpmMD zDdqy_p-5q?SSf@LOkqRM!luA$hzpoHIYDakz{PkZ1nn@?BQYu@aS6LkQKJd_8)&?h za>zc2ve7e479xo_pd?og8ESXYlT=VwQbAiENI6JosD^%>TQX?MvK1ACPfTOGPN?B=b;#ysOGZ_I znlj2Q00N^azaI@!hIBlfOz`t_Yy{a9z#I=o=3s%4fT7F+RR5w071LYKlG;WdZjc{I zM@>_MgycR_w)h4Hhx*QrO!)hU&p>-R&J1*-Fvq~$!Gse{(NGD*T+Cidm4AieF_HRE zc|jO3LAXVR7om7K5!)#lC-IOf#mh95n4rYYE8Udor`R=K zWR;om)_G>@1-(92cz`S|0;KKXV`RiJ%Pe%LIrKmyAkc{9%Sjo)U^G6DEkNFcMU*cS z`|BS+3uX9tz6xmo+rb#wl!e693E?-8T_E8grgq8PBc{$A8e2?LMCI9REpoy7J6&$$CXyuELk8 z@X`Dqd3R)G=XdvgcPYF50HiXN_GRlMD_2^#QvHcd(jjSQIL&Of4*nb-BKHX(QFR8V z6f(JFgu;PRvS&si?Q#g4*~;qBgc{{t`I1Q$>8DKU?0te1pL_ULhi+EpQo zgFB6j$CMePT^M~MXGRInCgWg?n9(C4JP9vrQC*2Zq6=}Bc*Ge%dC$mM)d?UFE0Qnm z9~ukO;s|$|CA_FqlP^=eq!|~Y$dDjtVtPpP!^7rBAUYTGD`^+E=}eQtByZ7dnLtTb zxcfHFUAN|}T(9-rTFBNOUM|}(noIYudz*6J-i){RcH0lTzTfpxS=KwcJhbj?TzP5L z+4h;UKId%9INNT%_K9=fFRqSizP?Bh*styGtAL2Brmv$=7^O@iH>Q>{iI72jbWy4t z$>~j{DI@8(fGQQfP)W|ILk!)NIc2)Y37E3rKFw2xMNGgYi#kP6f}(L!OOQE7c?v@B z!RhIv^tet4nIyz-;F5|MLRSZclO`dng1T*6)KR0hOZFud-I$)9N)uZz=TP4%n_MH~ zxOB8sa_`Z8QgpIshL=2=SEwXqA$ZFDecPbbEkPjTg2vC3vVP0>`^F^;)5ciev|jyF z2wLz~#WzkX2}a%nmoBg4$;01T>t@MOAhF%XSF*Z_IIkAFD~5+Tw8vg*79 z{sapO_E@w~=z-B@A_@CWDvK;pcr`cKdw~OjRVRoCOwAa!KFY`rH1)9U60<2q%@b7t zosh^=QXo6qffFhY7$f$D**RnR4-yN*M`SZdSp!3r!tM*Ui^v@gshLL?Ng0DIWHNb# z-w|4LC~VRZK5vXf1Y#7Jf@iUbx)Pa+1c~*70VAyE_$e4elEL7PL}!Jl-KoC-R&;_Y z8e;_JENnr;L1YVu^3_FgKvO{&z~){4Fd#HfwmGbcqA-ZoN4`X|?UXh@BtF7GL1%=7 z!DQY{HV|yTLfl|{4#J;t7#oeB?tcLaozn5sellbl920_6m%#0*Bb(V@4&?@#N z?__mDR}%}thNm-rk+f)lsADV&YMwhB0>0-jXpUdIfWLCaTR`P z{KJdQMYysk{_BJ&{{{sCQMx&IH4r68WErsE{)}_~y0b3l+>>$c*|3;0||eA)8D z%O+(D)sTT=qkq-L!v@4%{oZfA`&%pfZ&uvw%et@wQ&Q1J>)RJ|EqgL8dw$TK+j}Cj z_rym7tF~cEVSm?t)wy0?@m}=ZXu9FZotH8V{n_$?v~A!Qj~amRA9BXhuD|Z+OnZ0# z&d@J6Ecp5&L89D$=I!t1{*4vRkGo3;ET$hHvgLTf=LgB z&nR3ma!8NLF90iR3-0K1~U{)Evz#WmYvDTeVnILaQdLS%!QncjL*Y7PIHvd-*M%aMKKkZSaD3Bx5ELVX2d z4Fh-0aCJ~Tkh7ipwcAtugw|`?bBR+pSMzAzD4bht9%2N5tOuACI76YZ7l5`q91Dgg zUt@|AKDk#J4mtP1p1=z`+=4;r~EP2eK8N8=Rr6y9oz56V#8ob&oJUf-?c z_fqet{^X@Uef5uD{kJ=^PoK$pUsSp9Pd&Bk)pa+b*Q4p}{n_e)w0qz)V%v{qyhra0 zesrXeWv7_q8Sn9rEFUGa-VwE!&l}fRt#~bA2s&x8Y<&H<}5?@l8?)Jhn_J7wZah^NJftA zAWTmZ(!h|=jP&f$vvAYI>WF1zt{IX`g{-ODU_FuplA&#@RI|#RClxXym%U_HcMK`J zN*Oj6kqs1|%7Biq?P;hQAju?PE}ij*T{BFnTb;tf|TQkG`Jw=$TwT`3bL@_cf|Lu8DHJhT#;e0JlT{cKGl}6>|L@L{#p`y7!1H~w z!39oVL2WTBYAtYJ1Hy$^2nVn(;AkjQj$nH(%;Ws-JS5PNF_5ALlH~=Zq)Vb6SJHTh znpN?5A&IFWN2X(>5OG5q0iBV!o7ZgeBft99ufEDQ@{5-FeiA9gn1fIm%qS;!GzF&nt7erS$Ffv*+MN8vP0-mCikb2ynbH!VN_mM<@q`ZB&ZZ>5=r z!=Cy!IHk%wT&yV+jVKYH0y8A80|`Ub(8ksBxtcwhnmte`e4{&8>C065eo&U%Gm_ae z0-Zvw9ojf2L?)H>xr&{cik*_)VYPnG>fYf(r2`2(>|A;4ea>9kweGE1G5_9g+_Y!B zyOxL6Dr;9^lUdodR?pw;{pPM)_DtPg*pQkyPaPueR(9RnxqFp_(~wDjUW)u+qN&PV znTlPv_A?XJ>TJcc%hq*U?MgLjx^Ly24eOq!mH3DAtDXaEt-ZO{Lz&h?cWSb&eb-!! zkKUW{?uF$J8IU4b;`Z@uPd}PmT@L9Dgg{M96b_EQv@B<<%h>9mL6^SxjE%q9ylUGc z^?YxpV(;z!KRovRV;?nSD^97+_>A;1TgKjZLjJSTn6B$p#PL#lzCD|39?dk5rq4`l zY7upHu~1vpQg;^*UMr1G>Ke0%a;dMo!ikw+HUk@ygj$g zKXiWIc_);6=4|Gfvsv#;>L%e{dF5J#H&?MEQ?VmkvGYD>FRNd#+m@^IW$L7D3ha-s zS?_u3zWrLR>1d|u=v~iIvI6#f)0ggiCR=|zU3GlT+wkqBT+2|VW$3PVXsxO?SJj!R z>b%u{yK5D(RgIs!Q0@j5{-~1k?zs8VYE>63e?Rxi!JkJA7+p3+zW99FAP0Yeso?S? zh@1P-zMU`ZHvL&cDct|RrO)@mA=A&Qo#gJeyl|l8XNN2!hLQpWFQ&4%cQ^R9}J16$|`BBP@8QTP*h7pn?am6-S-nvfs~5-c-Z9+LQp zd#9{xd)l^rvn2)Xbl7g^x8d2U#UaB5U?jnt;w~FzkgoW_P5}Fdpi#BIK+g#lMGy84 zoSpzr=2*xoW&!$4(JqFOH7GY*ccO9+3DLH4$U1!V9UM&AloGqmIKlZg_glnMV|D6#`4ri?h zMQ#7gD2qYyb$Fh%XH@qG5K8L81H6tRy2LpuBdnE7F!6=vX`B=O4XOZCn7pJ)I`#@7 z3Umq5Spk1Ho=RFm4(owuxANi zRO1zHy`m;p(Uqy_y7f}FV*j#r&0BZl_3N+S9J)1>_3m4?uerR}E?iqoyILV(c6pW^ z3|gZFcH|_7W#C#yxm!&-Qn00rR~)MTR|_}|V@mSlq9`LEsqDCF0X^uo-|s9Ip?sq<8g^#?S?@GO~&<xDstGW zZdJ-zD38_a@n#9@)jyCfJd)7PVmZxt4ewkfA|J+B(i#wGH<)*@!${I$99xhb#DR*7 z*gBEdE&*>hMk|dOYWyCB6SFOHc`M{oSUmv-`dr~DrqMV|FrkJMaUL`C5LdLglC3e3 z7j{8c&s13)3~b zN$!@Mt1aVdyJfiR>in#_@kZ==EWP7Ew)$Y&eQ={$iBH?waGa;SimA|i;8PS2bZNDA zw4~gQ;>#*TE3FN1LQ=`d`KVOkzMvsf!#{tT8bzJ>g0Z(hYCSk`$n=v#mO)T_Kumea z&rlhyZ?ZywEI^4|5V17~IMD^kT#ebZYt1bM%CJ~lh;^Z#mP|IkLIXsY48*DyCTYJ@ zwwa0(YrtATYkVt&D$x$%-y=;i6=i0k#cfaz?a`Ti1_zO=SbBFUZEM_21{J(c%FZW| zK@EQ0f(*(lpW#;$%d%(2Ci~PkFo%v<6hgT&IgN_k zzU#j9w%%;z-n4V?XOdwO_Fr0jP^aPp!s7q@_=%&YKRasaHy5G<;zig(dao+Ap3~{3Gg;4z%L8l9>J?al zH7`HEVc}eLVwO+J+cu**1;STR2}5;+{ED6e%t7P99zCNkjDQaRDB}RK0w}Z!SlFbY zU63wJ6d7}{(5Oq~0B8}hGs)s2D&Dx*64Ud^5N@|Awz8MQzfQ0`fZ_nl0@`YTRKr=7 zb2eq1O)DWfJiF@L4Xt2l*XJA@sK>|%gRt>+{)p-SvGkb=x2XgXHcJOk!&c-1n2P4; ze`QB36c__u%DhA=(j&C1b{AXVXPsPHD1&UGHu2HN=3k-?9U4$n2XRL1K^=s#iXP#D zYR9n!AFq>3t>cMMczkY;+#Eg1ffiTG@#!cba?N&~F}^elnNpoeLPhB)jT2;|;ou9>)k^~~T!rzom1cef zCSbxWIO(t`MP*!akV+|9K#VnB^c12Yb}-;~Y2o}kWMMq5c7G3>{sCC(Lo$;3T1wR& zSADPX{l-=I!L^p{*UaB=B0lG8zw2t(q{wwXo9TRZ)!nzY%XiJZ>fT9(y!o{^nF4-S z#!bS(XWoBi)qO;h>3hxZH?O)6t-GsllwB`d3FVsiWSaM^x_j3S9!a~8pswCGEFx|x? z_^2Z5>0ciB6m5Uu+J0zPNJDloQ*-ckGFx+O`Q)b_95}mn=(GBcT>YU;{h>Rx z+4>X9FRat|;Y|JEJ002jetg$9=W07LwH>z_ZePgOo>(6KYgf(V`orw7YH_v8FYY_O zWV^pekPYg;=;MY=+@ICf!2L1bw-2w6O}#_=O$AC4g=|e>_?{#sP>7S}e2^Xy1BatS zsFK8eut#4$AahR&g4*J&8;pi@WCdSB3gCUbEvlACKd}xS6wf3Lh6Sh#p3puWWH044 zJu$Bi`j_&WpO{yNAV_&FPt40pL#KI3d96=?YDtP6%8^I+Z9}JRbg`otUDH`Wc6LI( z)1K@%dVTvAOW4huzP+-iH*aAfc?&jl7x#&;y^A$x#mha9n~hxDKS2 z?GExS_yC3-4WEZt7xot+IYzQb(8c>J=(>3HqWl6Xk+byf6RuFqTX0~jp^d@)q6Oc* z`Lcp;?ukdp(gamI;nKnq3nYn~0zad@_$XPUNUBE~2-d{2?_$xxk>xhR0$J3DW z?96y}W<8zDHg;C&@Bwtf!;HJa0cP^YgsJY)n*s^7zzro(p~ zhu15;H@dEOrCWxxmCvW0&##qv-+TSt*Gc_*G}ChQZrRZ_PvesUk7Qbo+$}qT>o+th zpAh(&T=AhhhcYew*~)>mb6~SXg1|$64}EZGH@$_D)Ic&Dt&&uf&JZWvX%M$fMLV3l zRlH=OSk)_rJ|b|_mJ#9sn=@x?xQoLcUxB^ApW7N9)5@6C${D1B~B7((!0pbSXAnIbm`fALN(Z(%n}6z}C&;OErKUC4x97VBz7ovi*&NfgHz zhB_N?`+=VfWBh*H=jIo$#fRVN_kRVq=14Imem|};_v6Sossi64nn&Sk)_l3-myYp^ z@|{`gMS`4n$+=9VB@g5zLz6m5f6LRD*Sp1xPw5o)^Bj=ao zw34%(oHlaK%FZBooy70p>mBaC(PFVZD0f?0H`+L>J7;OmSeow}D=m!=O`Nr5gM1G< z9F}bl>K&H-59+r;b@5=x&~9mcaK`YP221^eMWeye_P}Pg)ID&TEmaSlot7OBUNRUg z`~$1O()7UU!gs6L((=G*v~)eNRakaBY(Iq5NrQ(9+hwq9duTOVc8D#dMiyv!6*~Vs zVt$=

EAmq)@@u=R=b$jUVSa&7;gRU;>MV04Pr^QozUv%#2YE=SxK0cQ|1}l#Iag zHu-K1!2)Q~%1scEix<%+wuW_AJ&sFN-Mn-=wCXyVwjE_1E$Ac3lV}tBumg@L?^U

@e`Sq8NBUjE*9}m^+(lx6R<5L_7ffhLzEo5uV$YB_<8FQ!x?R9+`{xry zT6)%O=2)riG*xh2ft7=_wR9bq(N*0{-g+hNI(et+uIuDS)fv~xwC$wWawJtAEGzar z{Lgsl-+)ta+l@7B)#EYf4jdUTOj^Shx(!G9wuNoFd2m;bCXFRjqWLZjm+I!hojOXM zQg*kFo!zbDV0Y^{Llx|9ow86RZr3s3#vK>#&2g3DC(`I&$b)-!aPtoC&Z!cb(BZ}J z*)bvbVLpI+0hDWUf>Bt!DVNw3^9#}sOR%3zU_XQrrPGo)z0HckPh7wj6jx8m_i~WY zVhBHD!Atr0H{Jm0g=r&Q3i8Gq(tSJZcnyp~aen}QBZHMxRIh05S)g>J`AmNgX~zf- z8m{=H40Z5GX3aFa*`t-MhDb(8dD+8cyJqDJSY17cz^=$qcS?EEYQOS5U|)%1b%72l&f!Q0KCL0qy&@G)Bn-Q zOwXx|t&8rnsax5<+R(LDTgPs(kuJcIue@pGSrQ!Sq<8IF`!0HKhrn^!{E4hfRYnZO z)5FG?hUW&mZR3ltv-v?2x2TbHtqh$4W=ESNxP?PD2E`Q@;UK$&LOzhpe%J(8TnJ(D z_Y{me(+;(6PM`_Q3|nu;lCNp@VBX5wh3Qw^YJ|%SgglK5!VUstF#@Y(KN=!8oMe!R#m+5SygBIvwUxx|;3!Ft z)Rl2{WnI3s&9`}`5F{BiC&X4iVW#LU8FrF%LK66 zh+L24s(UikJ$D^FOr|@Ltvs7{o+azsJq(JYL7IQ^qwF+jYlQ`8d}|9uSjvDi+5~X+ zsMZ){VFWI*NY|e-Ts9&24v^x^G@2 zE~ftT5(=XPUnGb-{Fb5D^nJ^bl7hifR;nZ}DWFy`ZPDEISPXdC_PLT)Eq*hZ!w>vO zJRd<-!}Q58WU2`U#S)xuVICVDYr(a+p&~%K7-(2IxECxETWo(E2-S4c1U!oA>VB5pGrQm(dP#e>ZxR#v&)P31R*IDoZT?WSnl zSazm_1HUT%fM)L={G`rq`k9}S=|Ccogf7dDLh>G+76>#b`7-=SAGCUYQOhNGX+er& zQQ<2TZ&s)(zfR1uYT&n9nkG*SNo^z;7{7M z9ajL=@4T7J)^#n@bSkaM+30ZDnzKQY%Co~S%`n1a9>HnOOl87CdX%Q^Xs zlYiu~m)bX~Id^l~*2IW3Sk_S-X2PF&Xkua%dXfK1z5Z|H{C9GGMNR+?(>UOuX>viJ z?HUY$VE&BbkF-4zh@%x5wVmYKMNSVn2go@}P9HhM`LTLMp=lF+lH(@${0trvnwlXr zb=oX#xZl%SPBPT0hY**RZ;%i7(ORo=mimmPo?^-_3)9`bg0sa*(^EC*g zol^{^BpNC?EY04uvOtilDcO zl0(7|IU4}NQwclCX(5MHltMe4yysy*O z_79vKBzL^ePd~uu?;9NV?>%tP|6KnmKYmnl-=Y1FN!Yvhkem>C@;lTL#~xGOR>_J= z>sCwCv=2X?iT``|_|Kdkd8K#Xo&(fMs(iPaT&aA^#M>z`^;}7+({KGmMXh{16#Gx~ z%TR1n+o$P{T&2 z&<@FyxS-B{aS3i+rvwQ71ez{Vf=1m|%b?sGtH~}z2wga}zv(GFBs6lL94BGrr^xwR z`UDHl36IFBC5J@$!UJ+>cOlR*5b^gNtI0>(HDMf1p6m?hpc&oEAp8M^(6s{W^acz1 zLkhBr*ZYes4=KJFX)L0dU)YX`>d|L}i%5e1T;gk>9~&lv!EoQW-(db*h*bbjGuFGHY&}AXAOU8ZpG;? z=eBg~p|t(*l@d@!hwDnoy{g(9BiBdLTm`O@zp-$AAy>0IQ?onGRYAX5)pPBsoX3~( z__CfoY0kY?v*X&rjW@5qnXTDLDew!IjcLvU!Lg+>XFi-UA6_$8Xgp74%ulfp#dADk zKF&g(&X}KOo&y>4fkKZ`&cTfNAdA`@q7=A4W8TlwYz|RM-kUM+Ev!Nb>ByKnSd`-F z&6s;xh~n9mG4Fa(8ehijV`<2<@pMat@k-go^9IgRnlpPdX75T_u6AFhcHiySatB__ z9C$HZGqz@~S?SKzAIQ`nxV@BnYCQAQc)D(a4$m0@+xvFT>{!OHTJfu6oNaps zdJEZuWP7Y>bM1;JSGPNZ|K={-1N`@wqjlA^owcehV{2orA`e=%S8f&kq#0nLwCYRe zc;GBGbUdgnHFQ3x-EZi65HsvCbZtZpT)l6lR{E*5ShnuzG*`V=-?IXvyPiya&uv$> z{@FBF^T>M9YS?jY=n+Tn`$8FKc0Dp1Eyo^0*$$qr9JYd2%2v7RN7j=@L-Wc@f6LMP z7aL1n&gOZ*8L?FGqcK-r_$%}AwD~wL)m@vcXYm-GK)Q2fy7fWw zUcwj1Yq6L|qIjR0!QVssS3i->BkH21Iz1yE$;%Y4^x%vGEm%PeE!V=PkdqB8N7`fFG6v49 jcf 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 WI{(kh^Ql~AqjEJX*Of;)^ZzfKsoFRI literal 0 HcmV?d00001 diff --git a/Backend/venv/lib/python3.12/site-packages/pip/_vendor/urllib3/contrib/_securetransport/__pycache__/low_level.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/pip/_vendor/urllib3/contrib/_securetransport/__pycache__/low_level.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..56f702c5b6e55f4257ee012f74085b4a62c48483 GIT binary patch literal 14813 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 literal 0 HcmV?d00001 diff --git a/Backend/venv/lib/python3.12/site-packages/pip/_vendor/urllib3/packages/__pycache__/__init__.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/pip/_vendor/urllib3/packages/__pycache__/__init__.cpython-312.pyc index 23fe7cb8c2a57ab1ff3c87e11b755bd567b86b2c..b66685ded3c33f5523b33123e338fb4ff07be6fa 100644 GIT binary patch delta 19 Zcmcc2c$ty=G%qg~0}$vs8&Bju0RS-#1gZc4 delta 19 Zcmcc2c$ty=G%qg~0}wngP@2en0su6e1vvl! diff --git a/Backend/venv/lib/python3.12/site-packages/pip/_vendor/urllib3/packages/__pycache__/six.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/pip/_vendor/urllib3/packages/__pycache__/six.cpython-312.pyc index 7b57f3066b072110a3649e900455593819a0f022..d088516d925e48c2431bb348b7167d3ed8861899 100644 GIT binary patch delta 22 ccmex-i0ShoChpU`yj%=GpzCbBkvn4{09$7U(EtDd delta 22 ccmex-i0ShoChpU`yj%=G@W4Q6BX`C^0AGa%U;qFB diff --git a/Backend/venv/lib/python3.12/site-packages/pip/_vendor/urllib3/packages/backports/__pycache__/__init__.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/pip/_vendor/urllib3/packages/backports/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c3df771da68bb9e58c64c07017c9a9a3bcefd4a3 GIT binary patch literal 221 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 BLgoMf literal 0 HcmV?d00001 diff --git a/Backend/venv/lib/python3.12/site-packages/pip/_vendor/urllib3/util/__pycache__/__init__.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/pip/_vendor/urllib3/util/__pycache__/__init__.cpython-312.pyc index 286e8a8a278ee6510ad379d6c50169a97a0825eb..0a877a7d1adc88e0be30d6ff354218d873743e4a 100644 GIT binary patch delta 20 ZcmZqUY~$oU&CAQh00g?u#v8e-SpX|j1NQ&` delta 20 acmZqUY~$oU&CAQh00a*Vls0l#vj6}uaRi0{ diff --git a/Backend/venv/lib/python3.12/site-packages/pip/_vendor/urllib3/util/__pycache__/connection.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/pip/_vendor/urllib3/util/__pycache__/connection.cpython-312.pyc index d3eaa37f3d77f553908fad8ff12080c7ebebbf88..d637064b7a1a1d00981ee818bdc7774ff6dd7ff7 100644 GIT binary patch delta 20 acmZ3Wx delta 20 acmbQkGlz%!G%qg~0}wngP};~X$OZs1PXtf^ diff --git a/Backend/venv/lib/python3.12/site-packages/pip/_vendor/urllib3/util/__pycache__/queue.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/pip/_vendor/urllib3/util/__pycache__/queue.cpython-312.pyc index a15ef655d551e912d8a2a7068125e72af863ad6c..250b98c43b3876f1f331cf784be69a38e729882d 100644 GIT binary patch delta 20 acmcb@b%l%jG%qg~0}$vs8*k+HWCZ{=s03sH delta 20 acmcb@b%l%jG%qg~0}wngP}<1t$qE2E#su>K diff --git a/Backend/venv/lib/python3.12/site-packages/pip/_vendor/urllib3/util/__pycache__/request.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/pip/_vendor/urllib3/util/__pycache__/request.cpython-312.pyc index 0f0bf6956561ef806a14f5b844af5ef99bca335d..1e5f6667a23908619ac2d487e67d9ed8a30f599e 100644 GIT binary patch delta 20 acmaE?@K}NSG%qg~0}$vs8*k)}5C8x?BLv6* delta 20 acmaE?@K}NSG%qg~0}wngP};~HApihCK?PR; diff --git a/Backend/venv/lib/python3.12/site-packages/pip/_vendor/urllib3/util/__pycache__/response.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/pip/_vendor/urllib3/util/__pycache__/response.cpython-312.pyc index 445fef98ec548db403ead55086b6debc24f301f1..8a686e49c834849f96da1efbe58802d0513a4b5f 100644 GIT binary patch delta 20 acmdlfzEhn0G%qg~0}$vs8*k)Z#|;2AN(8e2 delta 20 acmdlfzEhn0G%qg~0}wngP}<17jvD|uXazz5 diff --git a/Backend/venv/lib/python3.12/site-packages/pip/_vendor/urllib3/util/__pycache__/retry.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/pip/_vendor/urllib3/util/__pycache__/retry.cpython-312.pyc index c1b42a114ea5c131051492a7e567c155d618d1dd..356391352954d40b905aea2066685b0353e30bb5 100644 GIT binary patch delta 22 ccmaE~lJU_>M()$Ryj%=GpzCbBk^6cG098u{od5s; delta 22 ccmaE~lJU_>M()$Ryj%=G@W4Q6Blq%miTo delta 20 acmdn5v|ow)G%qg~0}wngP}<0CA_xFF>ICor diff --git a/Backend/venv/lib/python3.12/site-packages/py.py b/Backend/venv/lib/python3.12/site-packages/py.py index 5c661e66..7813c9b9 100644 --- a/Backend/venv/lib/python3.12/site-packages/py.py +++ b/Backend/venv/lib/python3.12/site-packages/py.py @@ -1,15 +1,10 @@ # shim for pylib going away # if pylib is installed this file will get skipped # (`py/__init__.py` has higher precedence) -from __future__ import annotations - import sys import _pytest._py.error as error import _pytest._py.path as path - sys.modules["py.error"] = error sys.modules["py.path"] = path - -__all__ = ["error", "path"] diff --git a/Backend/venv/lib/python3.12/site-packages/pydantic-2.12.5.dist-info/METADATA b/Backend/venv/lib/python3.12/site-packages/pydantic-2.12.5.dist-info/METADATA deleted file mode 100644 index fe0df088..00000000 --- a/Backend/venv/lib/python3.12/site-packages/pydantic-2.12.5.dist-info/METADATA +++ /dev/null @@ -1,1029 +0,0 @@ -Metadata-Version: 2.4 -Name: pydantic -Version: 2.12.5 -Summary: Data validation using Python type hints -Project-URL: Homepage, https://github.com/pydantic/pydantic -Project-URL: Documentation, https://docs.pydantic.dev -Project-URL: Funding, https://github.com/sponsors/samuelcolvin -Project-URL: Source, https://github.com/pydantic/pydantic -Project-URL: Changelog, https://docs.pydantic.dev/latest/changelog/ -Author-email: Samuel Colvin , Eric Jolibois , Hasan Ramezani , Adrian Garcia Badaracco <1755071+adriangb@users.noreply.github.com>, Terrence Dorsey , David Montague , Serge Matveenko , Marcelo Trylesinski , Sydney Runkle , David Hewitt , Alex Hall , Victorien Plot , Douwe Maan -License-Expression: MIT -License-File: LICENSE -Classifier: Development Status :: 5 - Production/Stable -Classifier: Framework :: Hypothesis -Classifier: Framework :: Pydantic -Classifier: Intended Audience :: Developers -Classifier: Intended Audience :: Information Technology -Classifier: Operating System :: OS Independent -Classifier: Programming Language :: Python -Classifier: Programming Language :: Python :: 3 -Classifier: Programming Language :: Python :: 3 :: Only -Classifier: Programming Language :: Python :: 3.9 -Classifier: Programming Language :: Python :: 3.10 -Classifier: Programming Language :: Python :: 3.11 -Classifier: Programming Language :: Python :: 3.12 -Classifier: Programming Language :: Python :: 3.13 -Classifier: Programming Language :: Python :: 3.14 -Classifier: Programming Language :: Python :: Implementation :: CPython -Classifier: Programming Language :: Python :: Implementation :: PyPy -Classifier: Topic :: Internet -Classifier: Topic :: Software Development :: Libraries :: Python Modules -Requires-Python: >=3.9 -Requires-Dist: annotated-types>=0.6.0 -Requires-Dist: pydantic-core==2.41.5 -Requires-Dist: typing-extensions>=4.14.1 -Requires-Dist: typing-inspection>=0.4.2 -Provides-Extra: email -Requires-Dist: email-validator>=2.0.0; extra == 'email' -Provides-Extra: timezone -Requires-Dist: tzdata; (python_version >= '3.9' and platform_system == 'Windows') and extra == 'timezone' -Description-Content-Type: text/markdown - -# Pydantic Validation - -[![CI](https://img.shields.io/github/actions/workflow/status/pydantic/pydantic/ci.yml?branch=main&logo=github&label=CI)](https://github.com/pydantic/pydantic/actions?query=event%3Apush+branch%3Amain+workflow%3ACI) -[![Coverage](https://coverage-badge.samuelcolvin.workers.dev/pydantic/pydantic.svg)](https://coverage-badge.samuelcolvin.workers.dev/redirect/pydantic/pydantic) -[![pypi](https://img.shields.io/pypi/v/pydantic.svg)](https://pypi.python.org/pypi/pydantic) -[![CondaForge](https://img.shields.io/conda/v/conda-forge/pydantic.svg)](https://anaconda.org/conda-forge/pydantic) -[![downloads](https://static.pepy.tech/badge/pydantic/month)](https://pepy.tech/project/pydantic) -[![versions](https://img.shields.io/pypi/pyversions/pydantic.svg)](https://github.com/pydantic/pydantic) -[![license](https://img.shields.io/github/license/pydantic/pydantic.svg)](https://github.com/pydantic/pydantic/blob/main/LICENSE) -[![Pydantic v2](https://img.shields.io/endpoint?url=https://raw.githubusercontent.com/pydantic/pydantic/main/docs/badge/v2.json)](https://docs.pydantic.dev/latest/contributing/#badges) -[![llms.txt](https://img.shields.io/badge/llms.txt-green)](https://docs.pydantic.dev/latest/llms.txt) - -Data validation using Python type hints. - -Fast and extensible, Pydantic plays nicely with your linters/IDE/brain. -Define how data should be in pure, canonical Python 3.9+; validate it with Pydantic. - -## Pydantic Logfire :fire: - -We've recently launched Pydantic Logfire to help you monitor your applications. -[Learn more](https://pydantic.dev/articles/logfire-announcement) - -## Pydantic V1.10 vs. V2 - -Pydantic V2 is a ground-up rewrite that offers many new features, performance improvements, and some breaking changes compared to Pydantic V1. - -If you're using Pydantic V1 you may want to look at the -[pydantic V1.10 Documentation](https://docs.pydantic.dev/) or, -[`1.10.X-fixes` git branch](https://github.com/pydantic/pydantic/tree/1.10.X-fixes). Pydantic V2 also ships with the latest version of Pydantic V1 built in so that you can incrementally upgrade your code base and projects: `from pydantic import v1 as pydantic_v1`. - -## Help - -See [documentation](https://docs.pydantic.dev/) for more details. - -## Installation - -Install using `pip install -U pydantic` or `conda install pydantic -c conda-forge`. -For more installation options to make Pydantic even faster, -see the [Install](https://docs.pydantic.dev/install/) section in the documentation. - -## A Simple Example - -```python -from datetime import datetime -from typing import Optional -from pydantic import BaseModel - -class User(BaseModel): - id: int - name: str = 'John Doe' - signup_ts: Optional[datetime] = None - friends: list[int] = [] - -external_data = {'id': '123', 'signup_ts': '2017-06-01 12:22', 'friends': [1, '2', b'3']} -user = User(**external_data) -print(user) -#> User id=123 name='John Doe' signup_ts=datetime.datetime(2017, 6, 1, 12, 22) friends=[1, 2, 3] -print(user.id) -#> 123 -``` - -## Contributing - -For guidance on setting up a development environment and how to make a -contribution to Pydantic, see -[Contributing to Pydantic](https://docs.pydantic.dev/contributing/). - -## Reporting a Security Vulnerability - -See our [security policy](https://github.com/pydantic/pydantic/security/policy). - -## Changelog - - - - - -## v2.12.5 (2025-11-26) - -[GitHub release](https://github.com/pydantic/pydantic/releases/tag/v2.12.5) - -This is the fifth 2.12 patch release, addressing an issue with the `MISSING` sentinel and providing several documentation improvements. - -The next 2.13 minor release will be published in a couple weeks, and will include a new *polymorphic serialization* feature addressing -the remaining unexpected changes to the *serialize as any* behavior. - -* Fix pickle error when using `model_construct()` on a model with `MISSING` as a default value by [@ornariece](https://github.com/ornariece) in [#12522](https://github.com/pydantic/pydantic/pull/12522). -* Several updates to the documentation by [@Viicos](https://github.com/Viicos). - -## v2.12.4 (2025-11-05) - -[GitHub release](https://github.com/pydantic/pydantic/releases/tag/v2.12.4) - -This is the fourth 2.12 patch release, fixing more regressions, and reverting a change in the `build()` method -of the [`AnyUrl` and Dsn types](https://docs.pydantic.dev/latest/api/networks/). - -This patch release also fixes an issue with the serialization of IP address types, when `serialize_as_any` is used. The next patch release -will try to address the remaining issues with *serialize as any* behavior by introducing a new *polymorphic serialization* feature, that -should be used in most cases in place of *serialize as any*. - -* Fix issue with forward references in parent `TypedDict` classes by [@Viicos](https://github.com/Viicos) in [#12427](https://github.com/pydantic/pydantic/pull/12427). - - This issue is only relevant on Python 3.14 and greater. -* Exclude fields with `exclude_if` from JSON Schema required fields by [@Viicos](https://github.com/Viicos) in [#12430](https://github.com/pydantic/pydantic/pull/12430) -* Revert URL percent-encoding of credentials in the `build()` method - of the [`AnyUrl` and Dsn types](https://docs.pydantic.dev/latest/api/networks/) by [@davidhewitt](https://github.com/davidhewitt) in - [pydantic-core#1833](https://github.com/pydantic/pydantic-core/pull/1833). - - This was initially considered as a bugfix, but caused regressions and as such was fully reverted. The next release will include - an opt-in option to percent-encode components of the URL. -* Add type inference for IP address types by [@davidhewitt](https://github.com/davidhewitt) in [pydantic-core#1868](https://github.com/pydantic/pydantic-core/pull/1868). - - The 2.12 changes to the `serialize_as_any` behavior made it so that IP address types could not properly serialize to JSON. -* Avoid getting default values from defaultdict by [@davidhewitt](https://github.com/davidhewitt) in [pydantic-core#1853](https://github.com/pydantic/pydantic-core/pull/1853). - - This fixes a subtle regression in the validation behavior of the [`collections.defaultdict`](https://docs.python.org/3/library/collections.html#collections.defaultdict) - type. -* Fix issue with field serializers on nested typed dictionaries by [@davidhewitt](https://github.com/davidhewitt) in [pydantic-core#1879](https://github.com/pydantic/pydantic-core/pull/1879). -* Add more `pydantic-core` builds for the three-threaded version of Python 3.14 by [@davidhewitt](https://github.com/davidhewitt) in [pydantic-core#1864](https://github.com/pydantic/pydantic-core/pull/1864). - -## v2.12.3 (2025-10-17) - -[GitHub release](https://github.com/pydantic/pydantic/releases/tag/v2.12.3) - -### What's Changed - -This is the third 2.12 patch release, fixing issues related to the `FieldInfo` class, and reverting a change to the supported -[*after* model validator](https://docs.pydantic.dev/latest/concepts/validators/#model-validators) function signatures. - -* Raise a warning when an invalid after model validator function signature is raised by [@Viicos](https://github.com/Viicos) in [#12414](https://github.com/pydantic/pydantic/pull/12414). - Starting in 2.12.0, using class methods for *after* model validators raised an error, but the error wasn't raised concistently. We decided - to emit a deprecation warning instead. -* Add [`FieldInfo.asdict()`](https://docs.pydantic.dev/latest/api/fields/#pydantic.fields.FieldInfo.asdict) method, improve documentation around `FieldInfo` by [@Viicos](https://github.com/Viicos) in [#12411](https://github.com/pydantic/pydantic/pull/12411). - This also add back support for mutations on `FieldInfo` classes, that are reused as `Annotated` metadata. **However**, note that this is still - *not* a supported pattern. Instead, please refer to the [added example](https://docs.pydantic.dev/latest/examples/dynamic_models/) in the documentation. - -The [blog post](https://pydantic.dev/articles/pydantic-v2-12-release#changes) section on changes was also updated to document the changes related to `serialize_as_any`. - -## v2.12.2 (2025-10-14) - -[GitHub release](https://github.com/pydantic/pydantic/releases/tag/v2.12.2) - -### What's Changed - -#### Fixes - -* Release a new `pydantic-core` version, as a corrupted CPython 3.10 `manylinux2014_aarch64` wheel got uploaded ([pydantic-core#1843](https://github.com/pydantic/pydantic-core/pull/1843)). -* Fix issue with recursive generic models with a parent model class by [@Viicos](https://github.com/Viicos) in [#12398](https://github.com/pydantic/pydantic/pull/12398) - -## v2.12.1 (2025-10-13) - -[GitHub release](https://github.com/pydantic/pydantic/releases/tag/v2.12.1) - -### What's Changed - -This is the first 2.12 patch release, addressing most (but not all yet) regressions from the initial 2.12.0 release. - -#### Fixes - -* Do not evaluate annotations when inspecting validators and serializers by [@Viicos](https://github.com/Viicos) in [#12355](https://github.com/pydantic/pydantic/pull/12355) -* Make sure `None` is converted as `NoneType` in Python 3.14 by [@Viicos](https://github.com/Viicos) in [#12370](https://github.com/pydantic/pydantic/pull/12370) -* Backport V1 runtime warning when using Python 3.14 by [@Viicos](https://github.com/Viicos) in [#12367](https://github.com/pydantic/pydantic/pull/12367) -* Fix error message for invalid validator signatures by [@Viicos](https://github.com/Viicos) in [#12366](https://github.com/pydantic/pydantic/pull/12366) -* Populate field name in `ValidationInfo` for validation of default value by [@Viicos](https://github.com/Viicos) in [pydantic-core#1826](https://github.com/pydantic/pydantic-core/pull/1826) -* Encode credentials in `MultiHostUrl` builder by [@willswire](https://github.com/willswire) in [pydantic-core#1829](https://github.com/pydantic/pydantic-core/pull/1829) -* Respect field serializers when using `serialize_as_any` serialization flag by [@davidhewitt](https://github.com/davidhewitt) in [pydantic-core#1829](https://github.com/pydantic/pydantic-core/pull/1829) -* Fix various `RootModel` serialization issues by [@davidhewitt](https://github.com/davidhewitt) in [pydantic-core#1836](https://github.com/pydantic/pydantic-core/pull/1836) - -### New Contributors - -* [@willswire](https://github.com/willswire) made their first contribution in [pydantic-core#1829](https://github.com/pydantic/pydantic-core/pull/1829) - -## v2.12.0 (2025-10-07) - -[GitHub release](https://github.com/pydantic/pydantic/releases/tag/v2.12.0) - -### What's Changed - -This is the final 2.12 release. It features the work of 20 external contributors and provides useful new features, along with initial Python 3.14 support. -Several minor changes (considered non-breaking changes according to our [versioning policy](https://docs.pydantic.dev/2.12/version-policy/#pydantic-v2)) -are also included in this release. Make sure to look into them before upgrading. - -**Note that Pydantic V1 is not compatible with Python 3.14 and greater**. - -Changes (see the alpha and beta releases for additional changes since 2.11): - -#### Packaging - -* Update V1 copy to v1.10.24 by [@Viicos](https://github.com/Viicos) in [#12338](https://github.com/pydantic/pydantic/pull/12338) - -#### New Features - -* Add `extra` parameter to the validate functions by [@anvilpete](https://github.com/anvilpete) in [#12233](https://github.com/pydantic/pydantic/pull/12233) -* Add `exclude_computed_fields` serialization option by [@Viicos](https://github.com/Viicos) in [#12334](https://github.com/pydantic/pydantic/pull/12334) -* Add `preverse_empty_path` URL options by [@Viicos](https://github.com/Viicos) in [#12336](https://github.com/pydantic/pydantic/pull/12336) -* Add `union_format` parameter to JSON Schema generation by [@Viicos](https://github.com/Viicos) in [#12147](https://github.com/pydantic/pydantic/pull/12147) -* Add `__qualname__` parameter for `create_model` by [@Atry](https://github.com/Atry) in [#12001](https://github.com/pydantic/pydantic/pull/12001) - -#### Fixes - -* Do not try to infer name from lambda definitions in pipelines API by [@Viicos](https://github.com/Viicos) in [#12289](https://github.com/pydantic/pydantic/pull/12289) -* Use proper namespace for functions in `TypeAdapter` by [@Viicos](https://github.com/Viicos) in [#12324](https://github.com/pydantic/pydantic/pull/12324) -* Use `Any` for context type annotation in `TypeAdapter` by [@inducer](https://github.com/inducer) in [#12279](https://github.com/pydantic/pydantic/pull/12279) -* Expose `FieldInfo` in `pydantic.fields.__all__` by [@Viicos](https://github.com/Viicos) in [#12339](https://github.com/pydantic/pydantic/pull/12339) -* Respect `validation_alias` in `@validate_call` by [@Viicos](https://github.com/Viicos) in [#12340](https://github.com/pydantic/pydantic/pull/12340) -* Use `Any` as context annotation in plugin API by [@Viicos](https://github.com/Viicos) in [#12341](https://github.com/pydantic/pydantic/pull/12341) -* Use proper `stacklevel` in warnings when possible by [@Viicos](https://github.com/Viicos) in [#12342](https://github.com/pydantic/pydantic/pull/12342) - -### New Contributors - -* [@anvilpete](https://github.com/anvilpete) made their first contribution in [#12233](https://github.com/pydantic/pydantic/pull/12233) -* [@JonathanWindell](https://github.com/JonathanWindell) made their first contribution in [#12327](https://github.com/pydantic/pydantic/pull/12327) -* [@inducer](https://github.com/inducer) made their first contribution in [#12279](https://github.com/pydantic/pydantic/pull/12279) -* [@Atry](https://github.com/Atry) made their first contribution in [#12001](https://github.com/pydantic/pydantic/pull/12001) - -## v2.12.0b1 (2025-10-03) - -[GitHub release](https://github.com/pydantic/pydantic/releases/tag/v2.12.0b1) - -This is the first beta release of the upcoming 2.12 release. - -### What's Changed - -#### Packaging - -* Bump `pydantic-core` to v2.40.1 by [@Viicos](https://github.com/Viicos) in [#12314](https://github.com/pydantic/pydantic/pull/12314) - -#### New Features - -* Add support for `exclude_if` at the field level by [@andresliszt](https://github.com/andresliszt) in [#12141](https://github.com/pydantic/pydantic/pull/12141) -* Add `ValidateAs` annotation helper by [@Viicos](https://github.com/Viicos) in [#11942](https://github.com/pydantic/pydantic/pull/11942) -* Add configuration options for validation and JSON serialization of temporal types by [@ollz272](https://github.com/ollz272) in [#12068](https://github.com/pydantic/pydantic/pull/12068) -* Add support for PEP 728 by [@Viicos](https://github.com/Viicos) in [#12179](https://github.com/pydantic/pydantic/pull/12179) -* Add field name in serialization error by [@NicolasPllr1](https://github.com/NicolasPllr1) in [pydantic-core#1799](https://github.com/pydantic/pydantic-core/pull/1799) -* Add option to preserve empty URL paths by [@davidhewitt](https://github.com/davidhewitt) in [pydantic-core#1789](https://github.com/pydantic/pydantic-core/pull/1789) - -#### Changes - -* Raise error if an incompatible `pydantic-core` version is installed by [@Viicos](https://github.com/Viicos) in [#12196](https://github.com/pydantic/pydantic/pull/12196) -* Remove runtime warning for experimental features by [@Viicos](https://github.com/Viicos) in [#12265](https://github.com/pydantic/pydantic/pull/12265) -* Warn if registering virtual subclasses on Pydantic models by [@Viicos](https://github.com/Viicos) in [#11669](https://github.com/pydantic/pydantic/pull/11669) - -#### Fixes - -* Fix `__getattr__()` behavior on Pydantic models when a property raised an `AttributeError` and extra values are present by [@raspuchin](https://github.com/raspuchin) in [#12106](https://github.com/pydantic/pydantic/pull/12106) -* Add test to prevent regression with Pydantic models used as annotated metadata by [@Viicos](https://github.com/Viicos) in [#12133](https://github.com/pydantic/pydantic/pull/12133) -* Allow to use property setters on Pydantic dataclasses with `validate_assignment` set by [@Viicos](https://github.com/Viicos) in [#12173](https://github.com/pydantic/pydantic/pull/12173) -* Fix mypy v2 plugin for upcoming mypy release by [@cdce8p](https://github.com/cdce8p) in [#12209](https://github.com/pydantic/pydantic/pull/12209) -* Respect custom title in functions JSON Schema by [@Viicos](https://github.com/Viicos) in [#11892](https://github.com/pydantic/pydantic/pull/11892) -* Fix `ImportString` JSON serialization for objects with a `name` attribute by [@chr1sj0nes](https://github.com/chr1sj0nes) in [#12219](https://github.com/pydantic/pydantic/pull/12219) -* Do not error on fields overridden by methods in the mypy plugin by [@Viicos](https://github.com/Viicos) in [#12290](https://github.com/pydantic/pydantic/pull/12290) - -### New Contributors - -* [@raspuchin](https://github.com/raspuchin) made their first contribution in [#12106](https://github.com/pydantic/pydantic/pull/12106) -* [@chr1sj0nes](https://github.com/chr1sj0nes) made their first contribution in [#12219](https://github.com/pydantic/pydantic/pull/12219) - -## v2.12.0a1 (2025-07-26) - -[GitHub release](https://github.com/pydantic/pydantic/releases/tag/v2.12.0a1) - -This is the first alpha release of the upcoming 2.12 release, which adds initial support for Python 3.14. - -### What's Changed - -#### New Features - -* Add `__pydantic_on_complete__()` hook that is called once model is fully ready to be used by [@DouweM](https://github.com/DouweM) in [#11762](https://github.com/pydantic/pydantic/pull/11762) -* Add initial support for Python 3.14 by [@Viicos](https://github.com/Viicos) in [#11991](https://github.com/pydantic/pydantic/pull/11991) -* Add regex patterns to JSON schema for `Decimal` type by [@Dima-Bulavenko](https://github.com/Dima-Bulavenko) in [#11987](https://github.com/pydantic/pydantic/pull/11987) -* Add support for `doc` attribute on dataclass fields by [@Viicos](https://github.com/Viicos) in [#12077](https://github.com/pydantic/pydantic/pull/12077) -* Add experimental `MISSING` sentinel by [@Viicos](https://github.com/Viicos) in [#11883](https://github.com/pydantic/pydantic/pull/11883) - -#### Changes - -* Allow config and bases to be specified together in `create_model()` by [@Viicos](https://github.com/Viicos) in [#11714](https://github.com/pydantic/pydantic/pull/11714) -* Move some field logic out of the `GenerateSchema` class by [@Viicos](https://github.com/Viicos) in [#11733](https://github.com/pydantic/pydantic/pull/11733) -* Always make use of `inspect.getsourcelines()` for docstring extraction on Python 3.13 and greater by [@Viicos](https://github.com/Viicos) in [#11829](https://github.com/pydantic/pydantic/pull/11829) -* Only support the latest Mypy version by [@Viicos](https://github.com/Viicos) in [#11832](https://github.com/pydantic/pydantic/pull/11832) -* Do not implicitly convert after model validators to class methods by [@Viicos](https://github.com/Viicos) in [#11957](https://github.com/pydantic/pydantic/pull/11957) -* Refactor `FieldInfo` creation implementation by [@Viicos](https://github.com/Viicos) in [#11898](https://github.com/pydantic/pydantic/pull/11898) -* Make `Secret` covariant by [@bluenote10](https://github.com/bluenote10) in [#12008](https://github.com/pydantic/pydantic/pull/12008) -* Emit warning when field-specific metadata is used in invalid contexts by [@Viicos](https://github.com/Viicos) in [#12028](https://github.com/pydantic/pydantic/pull/12028) - -#### Fixes - -* Properly fetch plain serializer function when serializing default value in JSON Schema by [@Viicos](https://github.com/Viicos) in [#11721](https://github.com/pydantic/pydantic/pull/11721) -* Remove generics cache workaround by [@Viicos](https://github.com/Viicos) in [#11755](https://github.com/pydantic/pydantic/pull/11755) -* Remove coercion of decimal constraints by [@Viicos](https://github.com/Viicos) in [#11772](https://github.com/pydantic/pydantic/pull/11772) -* Fix crash when expanding root type in the mypy plugin by [@Viicos](https://github.com/Viicos) in [#11735](https://github.com/pydantic/pydantic/pull/11735) -* Only mark model as complete once all fields are complete by [@DouweM](https://github.com/DouweM) in [#11759](https://github.com/pydantic/pydantic/pull/11759) -* Do not provide `field_name` in validator core schemas by [@DouweM](https://github.com/DouweM) in [#11761](https://github.com/pydantic/pydantic/pull/11761) -* Fix issue with recursive generic models by [@Viicos](https://github.com/Viicos) in [#11775](https://github.com/pydantic/pydantic/pull/11775) -* Fix qualified name comparison of private attributes during namespace inspection by [@karta9821](https://github.com/karta9821) in [#11803](https://github.com/pydantic/pydantic/pull/11803) -* Make sure Pydantic dataclasses with slots and `validate_assignment` can be unpickled by [@Viicos](https://github.com/Viicos) in [#11769](https://github.com/pydantic/pydantic/pull/11769) -* Traverse `function-before` schemas during schema gathering by [@Viicos](https://github.com/Viicos) in [#11801](https://github.com/pydantic/pydantic/pull/11801) -* Fix check for stdlib dataclasses by [@Viicos](https://github.com/Viicos) in [#11822](https://github.com/pydantic/pydantic/pull/11822) -* Check if `FieldInfo` is complete after applying type variable map by [@Viicos](https://github.com/Viicos) in [#11855](https://github.com/pydantic/pydantic/pull/11855) -* Do not delete mock validator/serializer in `model_rebuild()` by [@Viicos](https://github.com/Viicos) in [#11890](https://github.com/pydantic/pydantic/pull/11890) -* Rebuild dataclass fields before schema generation by [@Viicos](https://github.com/Viicos) in [#11949](https://github.com/pydantic/pydantic/pull/11949) -* Always store the original field assignment on `FieldInfo` by [@Viicos](https://github.com/Viicos) in [#11946](https://github.com/pydantic/pydantic/pull/11946) -* Do not use deprecated methods as default field values by [@Viicos](https://github.com/Viicos) in [#11914](https://github.com/pydantic/pydantic/pull/11914) -* Allow callable discriminator to be applied on PEP 695 type aliases by [@Viicos](https://github.com/Viicos) in [#11941](https://github.com/pydantic/pydantic/pull/11941) -* Suppress core schema generation warning when using `SkipValidation` by [@ygsh0816](https://github.com/ygsh0816) in [#12002](https://github.com/pydantic/pydantic/pull/12002) -* Do not emit typechecking error for invalid `Field()` default with `validate_default` set to `True` by [@Viicos](https://github.com/Viicos) in [#11988](https://github.com/pydantic/pydantic/pull/11988) -* Refactor logic to support Pydantic's `Field()` function in dataclasses by [@Viicos](https://github.com/Viicos) in [#12051](https://github.com/pydantic/pydantic/pull/12051) - -#### Packaging - -* Update project metadata to use PEP 639 by [@Viicos](https://github.com/Viicos) in [#11694](https://github.com/pydantic/pydantic/pull/11694) -* Bump `mkdocs-llmstxt` to v0.2.0 by [@Viicos](https://github.com/Viicos) in [#11725](https://github.com/pydantic/pydantic/pull/11725) -* Bump `pydantic-core` to v2.35.1 by [@Viicos](https://github.com/Viicos) in [#11963](https://github.com/pydantic/pydantic/pull/11963) -* Bump dawidd6/action-download-artifact from 10 to 11 by [@dependabot](https://github.com/dependabot)[bot] in [#12033](https://github.com/pydantic/pydantic/pull/12033) -* Bump astral-sh/setup-uv from 5 to 6 by [@dependabot](https://github.com/dependabot)[bot] in [#11826](https://github.com/pydantic/pydantic/pull/11826) -* Update mypy to 1.17.0 by [@Viicos](https://github.com/Viicos) in [#12076](https://github.com/pydantic/pydantic/pull/12076) - -### New Contributors - -* [@parth-paradkar](https://github.com/parth-paradkar) made their first contribution in [#11695](https://github.com/pydantic/pydantic/pull/11695) -* [@dqkqd](https://github.com/dqkqd) made their first contribution in [#11739](https://github.com/pydantic/pydantic/pull/11739) -* [@fhightower](https://github.com/fhightower) made their first contribution in [#11722](https://github.com/pydantic/pydantic/pull/11722) -* [@gbaian10](https://github.com/gbaian10) made their first contribution in [#11766](https://github.com/pydantic/pydantic/pull/11766) -* [@DouweM](https://github.com/DouweM) made their first contribution in [#11759](https://github.com/pydantic/pydantic/pull/11759) -* [@bowenliang123](https://github.com/bowenliang123) made their first contribution in [#11719](https://github.com/pydantic/pydantic/pull/11719) -* [@rawwar](https://github.com/rawwar) made their first contribution in [#11799](https://github.com/pydantic/pydantic/pull/11799) -* [@karta9821](https://github.com/karta9821) made their first contribution in [#11803](https://github.com/pydantic/pydantic/pull/11803) -* [@jinnovation](https://github.com/jinnovation) made their first contribution in [#11834](https://github.com/pydantic/pydantic/pull/11834) -* [@zmievsa](https://github.com/zmievsa) made their first contribution in [#11861](https://github.com/pydantic/pydantic/pull/11861) -* [@Otto-AA](https://github.com/Otto-AA) made their first contribution in [#11860](https://github.com/pydantic/pydantic/pull/11860) -* [@ygsh0816](https://github.com/ygsh0816) made their first contribution in [#12002](https://github.com/pydantic/pydantic/pull/12002) -* [@lukland](https://github.com/lukland) made their first contribution in [#12015](https://github.com/pydantic/pydantic/pull/12015) -* [@Dima-Bulavenko](https://github.com/Dima-Bulavenko) made their first contribution in [#11987](https://github.com/pydantic/pydantic/pull/11987) -* [@GSemikozov](https://github.com/GSemikozov) made their first contribution in [#12050](https://github.com/pydantic/pydantic/pull/12050) -* [@hannah-heywa](https://github.com/hannah-heywa) made their first contribution in [#12082](https://github.com/pydantic/pydantic/pull/12082) - -## v2.11.7 (2025-06-14) - -[GitHub release](https://github.com/pydantic/pydantic/releases/tag/v2.11.7) - -### What's Changed - -#### Fixes - -* Copy `FieldInfo` instance if necessary during `FieldInfo` build by [@Viicos](https://github.com/Viicos) in [#11898](https://github.com/pydantic/pydantic/pull/11898) - -## v2.11.6 (2025-06-13) - -[GitHub release](https://github.com/pydantic/pydantic/releases/tag/v2.11.6) - -### What's Changed - -#### Fixes - -* Rebuild dataclass fields before schema generation by [@Viicos](https://github.com/Viicos) in [#11949](https://github.com/pydantic/pydantic/pull/11949) -* Always store the original field assignment on `FieldInfo` by [@Viicos](https://github.com/Viicos) in [#11946](https://github.com/pydantic/pydantic/pull/11946) - -## v2.11.5 (2025-05-22) - -[GitHub release](https://github.com/pydantic/pydantic/releases/tag/v2.11.5) - -### What's Changed - -#### Fixes - -* Check if `FieldInfo` is complete after applying type variable map by [@Viicos](https://github.com/Viicos) in [#11855](https://github.com/pydantic/pydantic/pull/11855) -* Do not delete mock validator/serializer in `model_rebuild()` by [@Viicos](https://github.com/Viicos) in [#11890](https://github.com/pydantic/pydantic/pull/11890) -* Do not duplicate metadata on model rebuild by [@Viicos](https://github.com/Viicos) in [#11902](https://github.com/pydantic/pydantic/pull/11902) - -## v2.11.4 (2025-04-29) - -[GitHub release](https://github.com/pydantic/pydantic/releases/tag/v2.11.4) - -### What's Changed - -#### Packaging - -* Bump `mkdocs-llmstxt` to v0.2.0 by [@Viicos](https://github.com/Viicos) in [#11725](https://github.com/pydantic/pydantic/pull/11725) - -#### Changes - -* Allow config and bases to be specified together in `create_model()` by [@Viicos](https://github.com/Viicos) in [#11714](https://github.com/pydantic/pydantic/pull/11714). - This change was backported as it was previously possible (although not meant to be supported) - to provide `model_config` as a field, which would make it possible to provide both configuration - and bases. - -#### Fixes - -* Remove generics cache workaround by [@Viicos](https://github.com/Viicos) in [#11755](https://github.com/pydantic/pydantic/pull/11755) -* Remove coercion of decimal constraints by [@Viicos](https://github.com/Viicos) in [#11772](https://github.com/pydantic/pydantic/pull/11772) -* Fix crash when expanding root type in the mypy plugin by [@Viicos](https://github.com/Viicos) in [#11735](https://github.com/pydantic/pydantic/pull/11735) -* Fix issue with recursive generic models by [@Viicos](https://github.com/Viicos) in [#11775](https://github.com/pydantic/pydantic/pull/11775) -* Traverse `function-before` schemas during schema gathering by [@Viicos](https://github.com/Viicos) in [#11801](https://github.com/pydantic/pydantic/pull/11801) - -## v2.11.3 (2025-04-08) - -[GitHub release](https://github.com/pydantic/pydantic/releases/tag/v2.11.3) - -### What's Changed - -#### Packaging - -* Update V1 copy to v1.10.21 by [@Viicos](https://github.com/Viicos) in [#11706](https://github.com/pydantic/pydantic/pull/11706) - -#### Fixes - -* Preserve field description when rebuilding model fields by [@Viicos](https://github.com/Viicos) in [#11698](https://github.com/pydantic/pydantic/pull/11698) - -## v2.11.2 (2025-04-03) - -[GitHub release](https://github.com/pydantic/pydantic/releases/tag/v2.11.2) - -### What's Changed - -#### Fixes - -* Bump `pydantic-core` to v2.33.1 by [@Viicos](https://github.com/Viicos) in [#11678](https://github.com/pydantic/pydantic/pull/11678) -* Make sure `__pydantic_private__` exists before setting private attributes by [@Viicos](https://github.com/Viicos) in [#11666](https://github.com/pydantic/pydantic/pull/11666) -* Do not override `FieldInfo._complete` when using field from parent class by [@Viicos](https://github.com/Viicos) in [#11668](https://github.com/pydantic/pydantic/pull/11668) -* Provide the available definitions when applying discriminated unions by [@Viicos](https://github.com/Viicos) in [#11670](https://github.com/pydantic/pydantic/pull/11670) -* Do not expand root type in the mypy plugin for variables by [@Viicos](https://github.com/Viicos) in [#11676](https://github.com/pydantic/pydantic/pull/11676) -* Mention the attribute name in model fields deprecation message by [@Viicos](https://github.com/Viicos) in [#11674](https://github.com/pydantic/pydantic/pull/11674) -* Properly validate parameterized mappings by [@Viicos](https://github.com/Viicos) in [#11658](https://github.com/pydantic/pydantic/pull/11658) - -## v2.11.1 (2025-03-28) - -[GitHub release](https://github.com/pydantic/pydantic/releases/tag/v2.11.1) - -### What's Changed - -#### Fixes - -* Do not override `'definitions-ref'` schemas containing serialization schemas or metadata by [@Viicos](https://github.com/Viicos) in [#11644](https://github.com/pydantic/pydantic/pull/11644) - -## v2.11.0 (2025-03-27) - -[GitHub release](https://github.com/pydantic/pydantic/releases/tag/v2.11.0) - -### What's Changed - -Pydantic v2.11 is a version strongly focused on build time performance of Pydantic models (and core schema generation in general). -See the [blog post](https://pydantic.dev/articles/pydantic-v2-11-release) for more details. - -#### Packaging - -* Bump `pydantic-core` to v2.33.0 by [@Viicos](https://github.com/Viicos) in [#11631](https://github.com/pydantic/pydantic/pull/11631) - -#### New Features - -* Add `encoded_string()` method to the URL types by [@YassinNouh21](https://github.com/YassinNouh21) in [#11580](https://github.com/pydantic/pydantic/pull/11580) -* Add support for `defer_build` with `@validate_call` decorator by [@Viicos](https://github.com/Viicos) in [#11584](https://github.com/pydantic/pydantic/pull/11584) -* Allow `@with_config` decorator to be used with keyword arguments by [@Viicos](https://github.com/Viicos) in [#11608](https://github.com/pydantic/pydantic/pull/11608) -* Simplify customization of default value inclusion in JSON Schema generation by [@Viicos](https://github.com/Viicos) in [#11634](https://github.com/pydantic/pydantic/pull/11634) -* Add `generate_arguments_schema()` function by [@Viicos](https://github.com/Viicos) in [#11572](https://github.com/pydantic/pydantic/pull/11572) - -#### Fixes - -* Allow generic typed dictionaries to be used for unpacked variadic keyword parameters by [@Viicos](https://github.com/Viicos) in [#11571](https://github.com/pydantic/pydantic/pull/11571) -* Fix runtime error when computing model string representation involving cached properties and self-referenced models by [@Viicos](https://github.com/Viicos) in [#11579](https://github.com/pydantic/pydantic/pull/11579) -* Preserve other steps when using the ellipsis in the pipeline API by [@Viicos](https://github.com/Viicos) in [#11626](https://github.com/pydantic/pydantic/pull/11626) -* Fix deferred discriminator application logic by [@Viicos](https://github.com/Viicos) in [#11591](https://github.com/pydantic/pydantic/pull/11591) - -### New Contributors - -* [@cmenon12](https://github.com/cmenon12) made their first contribution in [#11562](https://github.com/pydantic/pydantic/pull/11562) -* [@Jeukoh](https://github.com/Jeukoh) made their first contribution in [#11611](https://github.com/pydantic/pydantic/pull/11611) - -## v2.11.0b2 (2025-03-17) - -[GitHub release](https://github.com/pydantic/pydantic/releases/tag/v2.11.0b2) - -### What's Changed - -#### Packaging - -* Bump `pydantic-core` to v2.32.0 by [@Viicos](https://github.com/Viicos) in [#11567](https://github.com/pydantic/pydantic/pull/11567) - -#### New Features - -* Add experimental support for free threading by [@Viicos](https://github.com/Viicos) in [#11516](https://github.com/pydantic/pydantic/pull/11516) - -#### Fixes - -* Fix `NotRequired` qualifier not taken into account in stringified annotation by [@Viicos](https://github.com/Viicos) in [#11559](https://github.com/pydantic/pydantic/pull/11559) - -### New Contributors - -* [@joren485](https://github.com/joren485) made their first contribution in [#11547](https://github.com/pydantic/pydantic/pull/11547) - -## v2.11.0b1 (2025-03-06) - -[GitHub release](https://github.com/pydantic/pydantic/releases/tag/v2.11.0b1) - -### What's Changed - -#### Packaging - -* Add a `check_pydantic_core_version()` function by [@Viicos](https://github.com/Viicos) in https://github.com/pydantic/pydantic/pull/11324 -* Remove `greenlet` development dependency by [@Viicos](https://github.com/Viicos) in https://github.com/pydantic/pydantic/pull/11351 -* Use the `typing-inspection` library by [@Viicos](https://github.com/Viicos) in https://github.com/pydantic/pydantic/pull/11479 -* Bump `pydantic-core` to `v2.31.1` by [@sydney-runkle](https://github.com/sydney-runkle) in https://github.com/pydantic/pydantic/pull/11526 - -#### New Features - -* Support unsubstituted type variables with both a default and a bound or constraints by [@FyZzyss](https://github.com/FyZzyss) in https://github.com/pydantic/pydantic/pull/10789 -* Add a `default_factory_takes_validated_data` property to `FieldInfo` by [@Viicos](https://github.com/Viicos) in https://github.com/pydantic/pydantic/pull/11034 -* Raise a better error when a generic alias is used inside `type[]` by [@Viicos](https://github.com/Viicos) in https://github.com/pydantic/pydantic/pull/11088 -* Properly support PEP 695 generics syntax by [@Viicos](https://github.com/Viicos) in https://github.com/pydantic/pydantic/pull/11189 -* Properly support type variable defaults by [@Viicos](https://github.com/Viicos) in https://github.com/pydantic/pydantic/pull/11332 -* Add support for validating v6, v7, v8 UUIDs by [@astei](https://github.com/astei) in https://github.com/pydantic/pydantic/pull/11436 -* Improve alias configuration APIs by [@sydney-runkle](https://github.com/sydney-runkle) in https://github.com/pydantic/pydantic/pull/11468 - -#### Changes - -* Rework `create_model` field definitions format by [@Viicos](https://github.com/Viicos) in https://github.com/pydantic/pydantic/pull/11032 -* Raise a deprecation warning when a field is annotated as final with a default value by [@Viicos](https://github.com/Viicos) in https://github.com/pydantic/pydantic/pull/11168 -* Deprecate accessing `model_fields` and `model_computed_fields` on instances by [@Viicos](https://github.com/Viicos) in https://github.com/pydantic/pydantic/pull/11169 -* **Breaking Change:** Move core schema generation logic for path types inside the `GenerateSchema` class by [@sydney-runkle](https://github.com/sydney-runkle) in https://github.com/pydantic/pydantic/pull/10846 -* Remove Python 3.8 Support by [@sydney-runkle](https://github.com/sydney-runkle) in https://github.com/pydantic/pydantic/pull/11258 -* Optimize calls to `get_type_ref` by [@Viicos](https://github.com/Viicos) in https://github.com/pydantic/pydantic/pull/10863 -* Disable `pydantic-core` core schema validation by [@sydney-runkle](https://github.com/sydney-runkle) in https://github.com/pydantic/pydantic/pull/11271 - -#### Performance - -* Only evaluate `FieldInfo` annotations if required during schema building by [@Viicos](https://github.com/Viicos) in https://github.com/pydantic/pydantic/pull/10769 -* Improve `__setattr__` performance of Pydantic models by caching setter functions by [@MarkusSintonen](https://github.com/MarkusSintonen) in https://github.com/pydantic/pydantic/pull/10868 -* Improve annotation application performance by [@Viicos](https://github.com/Viicos) in https://github.com/pydantic/pydantic/pull/11186 -* Improve performance of `_typing_extra` module by [@Viicos](https://github.com/Viicos) in https://github.com/pydantic/pydantic/pull/11255 -* Refactor and optimize schema cleaning logic by [@Viicos](https://github.com/Viicos) in https://github.com/pydantic/pydantic/pull/11244 -* Create a single dictionary when creating a `CoreConfig` instance by [@sydney-runkle](https://github.com/sydney-runkle) in https://github.com/pydantic/pydantic/pull/11384 -* Bump `pydantic-core` and thus use `SchemaValidator` and `SchemaSerializer` caching by [@sydney-runkle](https://github.com/sydney-runkle) in https://github.com/pydantic/pydantic/pull/11402 -* Reuse cached core schemas for parametrized generic Pydantic models by [@MarkusSintonen](https://github.com/MarkusSintonen) in https://github.com/pydantic/pydantic/pull/11434 - -#### Fixes - -* Improve `TypeAdapter` instance repr by [@sydney-runkle](https://github.com/sydney-runkle) in https://github.com/pydantic/pydantic/pull/10872 -* Use the correct frame when instantiating a parametrized `TypeAdapter` by [@Viicos](https://github.com/Viicos) in https://github.com/pydantic/pydantic/pull/10893 -* Infer final fields with a default value as class variables in the mypy plugin by [@Viicos](https://github.com/Viicos) in https://github.com/pydantic/pydantic/pull/11121 -* Recursively unpack `Literal` values if using PEP 695 type aliases by [@Viicos](https://github.com/Viicos) in https://github.com/pydantic/pydantic/pull/11114 -* Override `__subclasscheck__` on `ModelMetaclass` to avoid memory leak and performance issues by [@Viicos](https://github.com/Viicos) in https://github.com/pydantic/pydantic/pull/11116 -* Remove unused `_extract_get_pydantic_json_schema()` parameter by [@Viicos](https://github.com/Viicos) in https://github.com/pydantic/pydantic/pull/11155 -* Improve discriminated union error message for invalid union variants by [@Viicos](https://github.com/Viicos) in https://github.com/pydantic/pydantic/pull/11161 -* Unpack PEP 695 type aliases if using the `Annotated` form by [@Viicos](https://github.com/Viicos) in https://github.com/pydantic/pydantic/pull/11109 -* Add missing stacklevel in `deprecated_instance_property` warning by [@Viicos](https://github.com/Viicos) in https://github.com/pydantic/pydantic/pull/11200 -* Copy `WithJsonSchema` schema to avoid sharing mutated data by [@thejcannon](https://github.com/thejcannon) in https://github.com/pydantic/pydantic/pull/11014 -* Do not cache parametrized models when in the process of parametrizing another model by [@Viicos](https://github.com/Viicos) in https://github.com/pydantic/pydantic/pull/10704 -* Add discriminated union related metadata entries to the `CoreMetadata` definition by [@Viicos](https://github.com/Viicos) in https://github.com/pydantic/pydantic/pull/11216 -* Consolidate schema definitions logic in the `_Definitions` class by [@Viicos](https://github.com/Viicos) in https://github.com/pydantic/pydantic/pull/11208 -* Support initializing root model fields with values of the `root` type in the mypy plugin by [@Viicos](https://github.com/Viicos) in https://github.com/pydantic/pydantic/pull/11212 -* Fix various issues with dataclasses and `use_attribute_docstrings` by [@Viicos](https://github.com/Viicos) in https://github.com/pydantic/pydantic/pull/11246 -* Only compute normalized decimal places if necessary in `decimal_places_validator` by [@misrasaurabh1](https://github.com/misrasaurabh1) in https://github.com/pydantic/pydantic/pull/11281 -* Add support for `validation_alias` in the mypy plugin by [@Viicos](https://github.com/Viicos) in https://github.com/pydantic/pydantic/pull/11295 -* Fix JSON Schema reference collection with `"examples"` keys by [@Viicos](https://github.com/Viicos) in https://github.com/pydantic/pydantic/pull/11305 -* Do not transform model serializer functions as class methods in the mypy plugin by [@Viicos](https://github.com/Viicos) in https://github.com/pydantic/pydantic/pull/11298 -* Simplify `GenerateJsonSchema.literal_schema()` implementation by [@misrasaurabh1](https://github.com/misrasaurabh1) in https://github.com/pydantic/pydantic/pull/11321 -* Add additional allowed schemes for `ClickHouseDsn` by [@Maze21127](https://github.com/Maze21127) in https://github.com/pydantic/pydantic/pull/11319 -* Coerce decimal constraints to `Decimal` instances by [@Viicos](https://github.com/Viicos) in https://github.com/pydantic/pydantic/pull/11350 -* Use the correct JSON Schema mode when handling function schemas by [@Viicos](https://github.com/Viicos) in https://github.com/pydantic/pydantic/pull/11367 -* Improve exception message when encountering recursion errors during type evaluation by [@Viicos](https://github.com/Viicos) in https://github.com/pydantic/pydantic/pull/11356 -* Always include `additionalProperties: True` for arbitrary dictionary schemas by [@austinyu](https://github.com/austinyu) in https://github.com/pydantic/pydantic/pull/11392 -* Expose `fallback` parameter in serialization methods by [@Viicos](https://github.com/Viicos) in https://github.com/pydantic/pydantic/pull/11398 -* Fix path serialization behavior by [@sydney-runkle](https://github.com/sydney-runkle) in https://github.com/pydantic/pydantic/pull/11416 -* Do not reuse validators and serializers during model rebuild by [@Viicos](https://github.com/Viicos) in https://github.com/pydantic/pydantic/pull/11429 -* Collect model fields when rebuilding a model by [@Viicos](https://github.com/Viicos) in https://github.com/pydantic/pydantic/pull/11388 -* Allow cached properties to be altered on frozen models by [@Viicos](https://github.com/Viicos) in https://github.com/pydantic/pydantic/pull/11432 -* Fix tuple serialization for `Sequence` types by [@sydney-runkle](https://github.com/sydney-runkle) in https://github.com/pydantic/pydantic/pull/11435 -* Fix: do not check for `__get_validators__` on classes where `__get_pydantic_core_schema__` is also defined by [@tlambert03](https://github.com/tlambert03) in https://github.com/pydantic/pydantic/pull/11444 -* Allow callable instances to be used as serializers by [@Viicos](https://github.com/Viicos) in https://github.com/pydantic/pydantic/pull/11451 -* Improve error thrown when overriding field with a property by [@sydney-runkle](https://github.com/sydney-runkle) in https://github.com/pydantic/pydantic/pull/11459 -* Fix JSON Schema generation with referenceable core schemas holding JSON metadata by [@Viicos](https://github.com/Viicos) in https://github.com/pydantic/pydantic/pull/11475 -* Support strict specification on union member types by [@sydney-runkle](https://github.com/sydney-runkle) in https://github.com/pydantic/pydantic/pull/11481 -* Implicitly set `validate_by_name` to `True` when `validate_by_alias` is `False` by [@sydney-runkle](https://github.com/sydney-runkle) in https://github.com/pydantic/pydantic/pull/11503 -* Change type of `Any` when synthesizing `BaseSettings.__init__` signature in the mypy plugin by [@Viicos](https://github.com/Viicos) in https://github.com/pydantic/pydantic/pull/11497 -* Support type variable defaults referencing other type variables by [@Viicos](https://github.com/Viicos) in https://github.com/pydantic/pydantic/pull/11520 -* Fix `ValueError` on year zero by [@davidhewitt](https://github.com/davidhewitt) in https://github.com/pydantic/pydantic-core/pull/1583 -* `dataclass` `InitVar` shouldn't be required on serialization by [@sydney-runkle](https://github.com/sydney-runkle) in https://github.com/pydantic/pydantic-core/pull/1602 - -## New Contributors - -* [@FyZzyss](https://github.com/FyZzyss) made their first contribution in https://github.com/pydantic/pydantic/pull/10789 -* [@tamird](https://github.com/tamird) made their first contribution in https://github.com/pydantic/pydantic/pull/10948 -* [@felixxm](https://github.com/felixxm) made their first contribution in https://github.com/pydantic/pydantic/pull/11077 -* [@alexprabhat99](https://github.com/alexprabhat99) made their first contribution in https://github.com/pydantic/pydantic/pull/11082 -* [@Kharianne](https://github.com/Kharianne) made their first contribution in https://github.com/pydantic/pydantic/pull/11111 -* [@mdaffad](https://github.com/mdaffad) made their first contribution in https://github.com/pydantic/pydantic/pull/11177 -* [@thejcannon](https://github.com/thejcannon) made their first contribution in https://github.com/pydantic/pydantic/pull/11014 -* [@thomasfrimannkoren](https://github.com/thomasfrimannkoren) made their first contribution in https://github.com/pydantic/pydantic/pull/11251 -* [@usernameMAI](https://github.com/usernameMAI) made their first contribution in https://github.com/pydantic/pydantic/pull/11275 -* [@ananiavito](https://github.com/ananiavito) made their first contribution in https://github.com/pydantic/pydantic/pull/11302 -* [@pawamoy](https://github.com/pawamoy) made their first contribution in https://github.com/pydantic/pydantic/pull/11311 -* [@Maze21127](https://github.com/Maze21127) made their first contribution in https://github.com/pydantic/pydantic/pull/11319 -* [@kauabh](https://github.com/kauabh) made their first contribution in https://github.com/pydantic/pydantic/pull/11369 -* [@jaceklaskowski](https://github.com/jaceklaskowski) made their first contribution in https://github.com/pydantic/pydantic/pull/11353 -* [@tmpbeing](https://github.com/tmpbeing) made their first contribution in https://github.com/pydantic/pydantic/pull/11375 -* [@petyosi](https://github.com/petyosi) made their first contribution in https://github.com/pydantic/pydantic/pull/11405 -* [@austinyu](https://github.com/austinyu) made their first contribution in https://github.com/pydantic/pydantic/pull/11392 -* [@mikeedjones](https://github.com/mikeedjones) made their first contribution in https://github.com/pydantic/pydantic/pull/11402 -* [@astei](https://github.com/astei) made their first contribution in https://github.com/pydantic/pydantic/pull/11436 -* [@dsayling](https://github.com/dsayling) made their first contribution in https://github.com/pydantic/pydantic/pull/11522 -* [@sobolevn](https://github.com/sobolevn) made their first contribution in https://github.com/pydantic/pydantic-core/pull/1645 - -## v2.11.0a2 (2025-02-10) - -[GitHub release](https://github.com/pydantic/pydantic/releases/tag/v2.11.0a2) - -### What's Changed - -Pydantic v2.11 is a version strongly focused on build time performance of Pydantic models (and core schema generation in general). -This is another early alpha release, meant to collect early feedback from users having issues with core schema builds. - -#### Packaging - -* Bump `ruff` from 0.9.2 to 0.9.5 by [@Viicos](https://github.com/Viicos) in [#11407](https://github.com/pydantic/pydantic/pull/11407) -* Bump `pydantic-core` to v2.29.0 by [@mikeedjones](https://github.com/mikeedjones) in [#11402](https://github.com/pydantic/pydantic/pull/11402) -* Use locally-built rust with symbols & pgo by [@davidhewitt](https://github.com/davidhewitt) in [#11403](https://github.com/pydantic/pydantic/pull/11403) - -#### Performance - -* Create a single dictionary when creating a `CoreConfig` instance by [@sydney-runkle](https://github.com/sydney-runkle) in [#11384](https://github.com/pydantic/pydantic/pull/11384) - -#### Fixes - -* Use the correct JSON Schema mode when handling function schemas by [@Viicos](https://github.com/Viicos) in [#11367](https://github.com/pydantic/pydantic/pull/11367) -* Fix JSON Schema reference logic with `examples` keys by [@Viicos](https://github.com/Viicos) in [#11366](https://github.com/pydantic/pydantic/pull/11366) -* Improve exception message when encountering recursion errors during type evaluation by [@Viicos](https://github.com/Viicos) in [#11356](https://github.com/pydantic/pydantic/pull/11356) -* Always include `additionalProperties: True` for arbitrary dictionary schemas by [@austinyu](https://github.com/austinyu) in [#11392](https://github.com/pydantic/pydantic/pull/11392) -* Expose `fallback` parameter in serialization methods by [@Viicos](https://github.com/Viicos) in [#11398](https://github.com/pydantic/pydantic/pull/11398) -* Fix path serialization behavior by [@sydney-runkle](https://github.com/sydney-runkle) in [#11416](https://github.com/pydantic/pydantic/pull/11416) - -### New Contributors - -* [@kauabh](https://github.com/kauabh) made their first contribution in [#11369](https://github.com/pydantic/pydantic/pull/11369) -* [@jaceklaskowski](https://github.com/jaceklaskowski) made their first contribution in [#11353](https://github.com/pydantic/pydantic/pull/11353) -* [@tmpbeing](https://github.com/tmpbeing) made their first contribution in [#11375](https://github.com/pydantic/pydantic/pull/11375) -* [@petyosi](https://github.com/petyosi) made their first contribution in [#11405](https://github.com/pydantic/pydantic/pull/11405) -* [@austinyu](https://github.com/austinyu) made their first contribution in [#11392](https://github.com/pydantic/pydantic/pull/11392) -* [@mikeedjones](https://github.com/mikeedjones) made their first contribution in [#11402](https://github.com/pydantic/pydantic/pull/11402) - -## v2.11.0a1 (2025-01-30) - -[GitHub release](https://github.com/pydantic/pydantic/releases/tag/v2.11.0a1) - -### What's Changed - -Pydantic v2.11 is a version strongly focused on build time performance of Pydantic models (and core schema generation in general). -This is an early alpha release, meant to collect early feedback from users having issues with core schema builds. - -#### Packaging - -* Bump dawidd6/action-download-artifact from 6 to 7 by [@dependabot](https://github.com/dependabot) in [#11018](https://github.com/pydantic/pydantic/pull/11018) -* Re-enable memray related tests on Python 3.12+ by [@Viicos](https://github.com/Viicos) in [#11191](https://github.com/pydantic/pydantic/pull/11191) -* Bump astral-sh/setup-uv to 5 by [@dependabot](https://github.com/dependabot) in [#11205](https://github.com/pydantic/pydantic/pull/11205) -* Bump `ruff` to v0.9.0 by [@sydney-runkle](https://github.com/sydney-runkle) in [#11254](https://github.com/pydantic/pydantic/pull/11254) -* Regular `uv.lock` deps update by [@sydney-runkle](https://github.com/sydney-runkle) in [#11333](https://github.com/pydantic/pydantic/pull/11333) -* Add a `check_pydantic_core_version()` function by [@Viicos](https://github.com/Viicos) in [#11324](https://github.com/pydantic/pydantic/pull/11324) -* Remove `greenlet` development dependency by [@Viicos](https://github.com/Viicos) in [#11351](https://github.com/pydantic/pydantic/pull/11351) -* Bump `pydantic-core` to v2.28.0 by [@Viicos](https://github.com/Viicos) in [#11364](https://github.com/pydantic/pydantic/pull/11364) - -#### New Features - -* Support unsubstituted type variables with both a default and a bound or constraints by [@FyZzyss](https://github.com/FyZzyss) in [#10789](https://github.com/pydantic/pydantic/pull/10789) -* Add a `default_factory_takes_validated_data` property to `FieldInfo` by [@Viicos](https://github.com/Viicos) in [#11034](https://github.com/pydantic/pydantic/pull/11034) -* Raise a better error when a generic alias is used inside `type[]` by [@Viicos](https://github.com/Viicos) in [#11088](https://github.com/pydantic/pydantic/pull/11088) -* Properly support PEP 695 generics syntax by [@Viicos](https://github.com/Viicos) in [#11189](https://github.com/pydantic/pydantic/pull/11189) -* Properly support type variable defaults by [@Viicos](https://github.com/Viicos) in [#11332](https://github.com/pydantic/pydantic/pull/11332) - -#### Changes - -* Rework `create_model` field definitions format by [@Viicos](https://github.com/Viicos) in [#11032](https://github.com/pydantic/pydantic/pull/11032) -* Raise a deprecation warning when a field is annotated as final with a default value by [@Viicos](https://github.com/Viicos) in [#11168](https://github.com/pydantic/pydantic/pull/11168) -* Deprecate accessing `model_fields` and `model_computed_fields` on instances by [@Viicos](https://github.com/Viicos) in [#11169](https://github.com/pydantic/pydantic/pull/11169) -* Move core schema generation logic for path types inside the `GenerateSchema` class by [@sydney-runkle](https://github.com/sydney-runkle) in [#10846](https://github.com/pydantic/pydantic/pull/10846) -* Move `deque` schema gen to `GenerateSchema` class by [@sydney-runkle](https://github.com/sydney-runkle) in [#11239](https://github.com/pydantic/pydantic/pull/11239) -* Move `Mapping` schema gen to `GenerateSchema` to complete removal of `prepare_annotations_for_known_type` workaround by [@sydney-runkle](https://github.com/sydney-runkle) in [#11247](https://github.com/pydantic/pydantic/pull/11247) -* Remove Python 3.8 Support by [@sydney-runkle](https://github.com/sydney-runkle) in [#11258](https://github.com/pydantic/pydantic/pull/11258) -* Disable `pydantic-core` core schema validation by [@sydney-runkle](https://github.com/sydney-runkle) in [#11271](https://github.com/pydantic/pydantic/pull/11271) - -#### Performance - -* Only evaluate `FieldInfo` annotations if required during schema building by [@Viicos](https://github.com/Viicos) in [#10769](https://github.com/pydantic/pydantic/pull/10769) -* Optimize calls to `get_type_ref` by [@Viicos](https://github.com/Viicos) in [#10863](https://github.com/pydantic/pydantic/pull/10863) -* Improve `__setattr__` performance of Pydantic models by caching setter functions by [@MarkusSintonen](https://github.com/MarkusSintonen) in [#10868](https://github.com/pydantic/pydantic/pull/10868) -* Improve annotation application performance by [@Viicos](https://github.com/Viicos) in [#11186](https://github.com/pydantic/pydantic/pull/11186) -* Improve performance of `_typing_extra` module by [@Viicos](https://github.com/Viicos) in [#11255](https://github.com/pydantic/pydantic/pull/11255) -* Refactor and optimize schema cleaning logic by [@Viicos](https://github.com/Viicos) and [@MarkusSintonen](https://github.com/MarkusSintonen) in [#11244](https://github.com/pydantic/pydantic/pull/11244) - -#### Fixes - -* Add validation tests for `_internal/_validators.py` by [@tkasuz](https://github.com/tkasuz) in [#10763](https://github.com/pydantic/pydantic/pull/10763) -* Improve `TypeAdapter` instance repr by [@sydney-runkle](https://github.com/sydney-runkle) in [#10872](https://github.com/pydantic/pydantic/pull/10872) -* Revert "ci: use locally built pydantic-core with debug symbols by [@sydney-runkle](https://github.com/sydney-runkle) in [#10942](https://github.com/pydantic/pydantic/pull/10942) -* Re-enable all FastAPI tests by [@tamird](https://github.com/tamird) in [#10948](https://github.com/pydantic/pydantic/pull/10948) -* Fix typo in HISTORY.md. by [@felixxm](https://github.com/felixxm) in [#11077](https://github.com/pydantic/pydantic/pull/11077) -* Infer final fields with a default value as class variables in the mypy plugin by [@Viicos](https://github.com/Viicos) in [#11121](https://github.com/pydantic/pydantic/pull/11121) -* Recursively unpack `Literal` values if using PEP 695 type aliases by [@Viicos](https://github.com/Viicos) in [#11114](https://github.com/pydantic/pydantic/pull/11114) -* Override `__subclasscheck__` on `ModelMetaclass` to avoid memory leak and performance issues by [@Viicos](https://github.com/Viicos) in [#11116](https://github.com/pydantic/pydantic/pull/11116) -* Remove unused `_extract_get_pydantic_json_schema()` parameter by [@Viicos](https://github.com/Viicos) in [#11155](https://github.com/pydantic/pydantic/pull/11155) -* Add FastAPI and SQLModel to third-party tests by [@sydney-runkle](https://github.com/sydney-runkle) in [#11044](https://github.com/pydantic/pydantic/pull/11044) -* Fix conditional expressions syntax for third-party tests by [@Viicos](https://github.com/Viicos) in [#11162](https://github.com/pydantic/pydantic/pull/11162) -* Move FastAPI tests to third-party workflow by [@Viicos](https://github.com/Viicos) in [#11164](https://github.com/pydantic/pydantic/pull/11164) -* Improve discriminated union error message for invalid union variants by [@Viicos](https://github.com/Viicos) in [#11161](https://github.com/pydantic/pydantic/pull/11161) -* Unpack PEP 695 type aliases if using the `Annotated` form by [@Viicos](https://github.com/Viicos) in [#11109](https://github.com/pydantic/pydantic/pull/11109) -* Include `openapi-python-client` check in issue creation for third-party failures, use `main` branch by [@sydney-runkle](https://github.com/sydney-runkle) in [#11182](https://github.com/pydantic/pydantic/pull/11182) -* Add pandera third-party tests by [@Viicos](https://github.com/Viicos) in [#11193](https://github.com/pydantic/pydantic/pull/11193) -* Add ODMantic third-party tests by [@sydney-runkle](https://github.com/sydney-runkle) in [#11197](https://github.com/pydantic/pydantic/pull/11197) -* Add missing stacklevel in `deprecated_instance_property` warning by [@Viicos](https://github.com/Viicos) in [#11200](https://github.com/pydantic/pydantic/pull/11200) -* Copy `WithJsonSchema` schema to avoid sharing mutated data by [@thejcannon](https://github.com/thejcannon) in [#11014](https://github.com/pydantic/pydantic/pull/11014) -* Do not cache parametrized models when in the process of parametrizing another model by [@Viicos](https://github.com/Viicos) in [#10704](https://github.com/pydantic/pydantic/pull/10704) -* Re-enable Beanie third-party tests by [@Viicos](https://github.com/Viicos) in [#11214](https://github.com/pydantic/pydantic/pull/11214) -* Add discriminated union related metadata entries to the `CoreMetadata` definition by [@Viicos](https://github.com/Viicos) in [#11216](https://github.com/pydantic/pydantic/pull/11216) -* Consolidate schema definitions logic in the `_Definitions` class by [@Viicos](https://github.com/Viicos) in [#11208](https://github.com/pydantic/pydantic/pull/11208) -* Support initializing root model fields with values of the `root` type in the mypy plugin by [@Viicos](https://github.com/Viicos) in [#11212](https://github.com/pydantic/pydantic/pull/11212) -* Fix various issues with dataclasses and `use_attribute_docstrings` by [@Viicos](https://github.com/Viicos) in [#11246](https://github.com/pydantic/pydantic/pull/11246) -* Only compute normalized decimal places if necessary in `decimal_places_validator` by [@misrasaurabh1](https://github.com/misrasaurabh1) in [#11281](https://github.com/pydantic/pydantic/pull/11281) -* Fix two misplaced sentences in validation errors documentation by [@ananiavito](https://github.com/ananiavito) in [#11302](https://github.com/pydantic/pydantic/pull/11302) -* Fix mkdocstrings inventory example in documentation by [@pawamoy](https://github.com/pawamoy) in [#11311](https://github.com/pydantic/pydantic/pull/11311) -* Add support for `validation_alias` in the mypy plugin by [@Viicos](https://github.com/Viicos) in [#11295](https://github.com/pydantic/pydantic/pull/11295) -* Do not transform model serializer functions as class methods in the mypy plugin by [@Viicos](https://github.com/Viicos) in [#11298](https://github.com/pydantic/pydantic/pull/11298) -* Simplify `GenerateJsonSchema.literal_schema()` implementation by [@misrasaurabh1](https://github.com/misrasaurabh1) in [#11321](https://github.com/pydantic/pydantic/pull/11321) -* Add additional allowed schemes for `ClickHouseDsn` by [@Maze21127](https://github.com/Maze21127) in [#11319](https://github.com/pydantic/pydantic/pull/11319) -* Coerce decimal constraints to `Decimal` instances by [@Viicos](https://github.com/Viicos) in [#11350](https://github.com/pydantic/pydantic/pull/11350) -* Fix `ValueError` on year zero by [@davidhewitt](https://github.com/davidhewitt) in [pydantic-core#1583](https://github.com/pydantic/pydantic-core/pull/1583) - -### New Contributors - -* [@FyZzyss](https://github.com/FyZzyss) made their first contribution in [#10789](https://github.com/pydantic/pydantic/pull/10789) -* [@tamird](https://github.com/tamird) made their first contribution in [#10948](https://github.com/pydantic/pydantic/pull/10948) -* [@felixxm](https://github.com/felixxm) made their first contribution in [#11077](https://github.com/pydantic/pydantic/pull/11077) -* [@alexprabhat99](https://github.com/alexprabhat99) made their first contribution in [#11082](https://github.com/pydantic/pydantic/pull/11082) -* [@Kharianne](https://github.com/Kharianne) made their first contribution in [#11111](https://github.com/pydantic/pydantic/pull/11111) -* [@mdaffad](https://github.com/mdaffad) made their first contribution in [#11177](https://github.com/pydantic/pydantic/pull/11177) -* [@thejcannon](https://github.com/thejcannon) made their first contribution in [#11014](https://github.com/pydantic/pydantic/pull/11014) -* [@thomasfrimannkoren](https://github.com/thomasfrimannkoren) made their first contribution in [#11251](https://github.com/pydantic/pydantic/pull/11251) -* [@usernameMAI](https://github.com/usernameMAI) made their first contribution in [#11275](https://github.com/pydantic/pydantic/pull/11275) -* [@ananiavito](https://github.com/ananiavito) made their first contribution in [#11302](https://github.com/pydantic/pydantic/pull/11302) -* [@pawamoy](https://github.com/pawamoy) made their first contribution in [#11311](https://github.com/pydantic/pydantic/pull/11311) -* [@Maze21127](https://github.com/Maze21127) made their first contribution in [#11319](https://github.com/pydantic/pydantic/pull/11319) - -## v2.10.6 (2025-01-23) - -[GitHub release](https://github.com/pydantic/pydantic/releases/tag/v2.10.6) - -### What's Changed - -#### Fixes - -* Fix JSON Schema reference collection with `'examples'` keys by [@Viicos](https://github.com/Viicos) in [#11325](https://github.com/pydantic/pydantic/pull/11325) -* Fix url python serialization by [@sydney-runkle](https://github.com/sydney-runkle) in [#11331](https://github.com/pydantic/pydantic/pull/11331) - -## v2.10.5 (2025-01-08) - -[GitHub release](https://github.com/pydantic/pydantic/releases/tag/v2.10.5) - -### What's Changed - -#### Fixes - -* Remove custom MRO implementation of Pydantic models by [@Viicos](https://github.com/Viicos) in [#11184](https://github.com/pydantic/pydantic/pull/11184) -* Fix URL serialization for unions by [@sydney-runkle](https://github.com/sydney-runkle) in [#11233](https://github.com/pydantic/pydantic/pull/11233) - -## v2.10.4 (2024-12-18) - -[GitHub release](https://github.com/pydantic/pydantic/releases/tag/v2.10.4) - -### What's Changed - -#### Packaging - -* Bump `pydantic-core` to v2.27.2 by [@davidhewitt](https://github.com/davidhewitt) in [#11138](https://github.com/pydantic/pydantic/pull/11138) - -#### Fixes - -* Fix for comparison of `AnyUrl` objects by [@alexprabhat99](https://github.com/alexprabhat99) in [#11082](https://github.com/pydantic/pydantic/pull/11082) -* Properly fetch PEP 695 type params for functions, do not fetch annotations from signature by [@Viicos](https://github.com/Viicos) in [#11093](https://github.com/pydantic/pydantic/pull/11093) -* Include JSON Schema input core schema in function schemas by [@Viicos](https://github.com/Viicos) in [#11085](https://github.com/pydantic/pydantic/pull/11085) -* Add `len` to `_BaseUrl` to avoid TypeError by [@Kharianne](https://github.com/Kharianne) in [#11111](https://github.com/pydantic/pydantic/pull/11111) -* Make sure the type reference is removed from the seen references by [@Viicos](https://github.com/Viicos) in [#11143](https://github.com/pydantic/pydantic/pull/11143) - -### New Contributors - -* [@FyZzyss](https://github.com/FyZzyss) made their first contribution in [#10789](https://github.com/pydantic/pydantic/pull/10789) -* [@tamird](https://github.com/tamird) made their first contribution in [#10948](https://github.com/pydantic/pydantic/pull/10948) -* [@felixxm](https://github.com/felixxm) made their first contribution in [#11077](https://github.com/pydantic/pydantic/pull/11077) -* [@alexprabhat99](https://github.com/alexprabhat99) made their first contribution in [#11082](https://github.com/pydantic/pydantic/pull/11082) -* [@Kharianne](https://github.com/Kharianne) made their first contribution in [#11111](https://github.com/pydantic/pydantic/pull/11111) - -## v2.10.3 (2024-12-03) - -[GitHub release](https://github.com/pydantic/pydantic/releases/tag/v2.10.3) - -### What's Changed - -#### Fixes - -* Set fields when `defer_build` is set on Pydantic dataclasses by [@Viicos](https://github.com/Viicos) in [#10984](https://github.com/pydantic/pydantic/pull/10984) -* Do not resolve the JSON Schema reference for `dict` core schema keys by [@Viicos](https://github.com/Viicos) in [#10989](https://github.com/pydantic/pydantic/pull/10989) -* Use the globals of the function when evaluating the return type for `PlainSerializer` and `WrapSerializer` functions by [@Viicos](https://github.com/Viicos) in [#11008](https://github.com/pydantic/pydantic/pull/11008) -* Fix host required enforcement for urls to be compatible with v2.9 behavior by [@sydney-runkle](https://github.com/sydney-runkle) in [#11027](https://github.com/pydantic/pydantic/pull/11027) -* Add a `default_factory_takes_validated_data` property to `FieldInfo` by [@Viicos](https://github.com/Viicos) in [#11034](https://github.com/pydantic/pydantic/pull/11034) -* Fix url json schema in `serialization` mode by [@sydney-runkle](https://github.com/sydney-runkle) in [#11035](https://github.com/pydantic/pydantic/pull/11035) - -## v2.10.2 (2024-11-25) - -[GitHub release](https://github.com/pydantic/pydantic/releases/tag/v2.10.2) - -### What's Changed - -#### Fixes - -* Only evaluate FieldInfo annotations if required during schema building by [@Viicos](https://github.com/Viicos) in [#10769](https://github.com/pydantic/pydantic/pull/10769) -* Do not evaluate annotations for private fields by [@Viicos](https://github.com/Viicos) in [#10962](https://github.com/pydantic/pydantic/pull/10962) -* Support serialization as any for `Secret` types and `Url` types by [@sydney-runkle](https://github.com/sydney-runkle) in [#10947](https://github.com/pydantic/pydantic/pull/10947) -* Fix type hint of `Field.default` to be compatible with Python 3.8 and 3.9 by [@Viicos](https://github.com/Viicos) in [#10972](https://github.com/pydantic/pydantic/pull/10972) -* Add hashing support for URL types by [@sydney-runkle](https://github.com/sydney-runkle) in [#10975](https://github.com/pydantic/pydantic/pull/10975) -* Hide `BaseModel.__replace__` definition from type checkers by [@Viicos](https://github.com/Viicos) in [#10979](https://github.com/pydantic/pydantic/pull/10979) - -## v2.10.1 (2024-11-21) - -[GitHub release](https://github.com/pydantic/pydantic/releases/tag/v2.10.1) - -### What's Changed - -#### Packaging - -* Bump `pydantic-core` version to `v2.27.1` by [@sydney-runkle](https://github.com/sydney-runkle) in [#10938](https://github.com/pydantic/pydantic/pull/10938) - -#### Fixes - -* Use the correct frame when instantiating a parametrized `TypeAdapter` by [@Viicos](https://github.com/Viicos) in [#10893](https://github.com/pydantic/pydantic/pull/10893) -* Relax check for validated data in `default_factory` utils by [@sydney-runkle](https://github.com/sydney-runkle) in [#10909](https://github.com/pydantic/pydantic/pull/10909) -* Fix type checking issue with `model_fields` and `model_computed_fields` by [@sydney-runkle](https://github.com/sydney-runkle) in [#10911](https://github.com/pydantic/pydantic/pull/10911) -* Use the parent configuration during schema generation for stdlib `dataclass`es by [@sydney-runkle](https://github.com/sydney-runkle) in [#10928](https://github.com/pydantic/pydantic/pull/10928) -* Use the `globals` of the function when evaluating the return type of serializers and `computed_field`s by [@Viicos](https://github.com/Viicos) in [#10929](https://github.com/pydantic/pydantic/pull/10929) -* Fix URL constraint application by [@sydney-runkle](https://github.com/sydney-runkle) in [#10922](https://github.com/pydantic/pydantic/pull/10922) -* Fix URL equality with different validation methods by [@sydney-runkle](https://github.com/sydney-runkle) in [#10934](https://github.com/pydantic/pydantic/pull/10934) -* Fix JSON schema title when specified as `''` by [@sydney-runkle](https://github.com/sydney-runkle) in [#10936](https://github.com/pydantic/pydantic/pull/10936) -* Fix `python` mode serialization for `complex` inference by [@sydney-runkle](https://github.com/sydney-runkle) in [pydantic-core#1549](https://github.com/pydantic/pydantic-core/pull/1549) - -### New Contributors - -## v2.10.0 (2024-11-20) - -The code released in v2.10.0 is practically identical to that of v2.10.0b2. - -[GitHub release](https://github.com/pydantic/pydantic/releases/tag/v2.10.0) - -See the [v2.10 release blog post](https://pydantic.dev/articles/pydantic-v2-10-release) for the highlights! - -### What's Changed - -#### Packaging - -* Bump `pydantic-core` to `v2.27.0` by [@sydney-runkle](https://github.com/sydney-runkle) in [#10825](https://github.com/pydantic/pydantic/pull/10825) -* Replaced pdm with uv by [@frfahim](https://github.com/frfahim) in [#10727](https://github.com/pydantic/pydantic/pull/10727) - -#### New Features - -* Support `fractions.Fraction` by [@sydney-runkle](https://github.com/sydney-runkle) in [#10318](https://github.com/pydantic/pydantic/pull/10318) -* Support `Hashable` for json validation by [@sydney-runkle](https://github.com/sydney-runkle) in [#10324](https://github.com/pydantic/pydantic/pull/10324) -* Add a `SocketPath` type for `linux` systems by [@theunkn0wn1](https://github.com/theunkn0wn1) in [#10378](https://github.com/pydantic/pydantic/pull/10378) -* Allow arbitrary refs in JSON schema `examples` by [@sydney-runkle](https://github.com/sydney-runkle) in [#10417](https://github.com/pydantic/pydantic/pull/10417) -* Support `defer_build` for Pydantic dataclasses by [@Viicos](https://github.com/Viicos) in [#10313](https://github.com/pydantic/pydantic/pull/10313) -* Adding v1 / v2 incompatibility warning for nested v1 model by [@sydney-runkle](https://github.com/sydney-runkle) in [#10431](https://github.com/pydantic/pydantic/pull/10431) -* Add support for unpacked `TypedDict` to type hint variadic keyword arguments with `@validate_call` by [@Viicos](https://github.com/Viicos) in [#10416](https://github.com/pydantic/pydantic/pull/10416) -* Support compiled patterns in `protected_namespaces` by [@sydney-runkle](https://github.com/sydney-runkle) in [#10522](https://github.com/pydantic/pydantic/pull/10522) -* Add support for `propertyNames` in JSON schema by [@FlorianSW](https://github.com/FlorianSW) in [#10478](https://github.com/pydantic/pydantic/pull/10478) -* Adding `__replace__` protocol for Python 3.13+ support by [@sydney-runkle](https://github.com/sydney-runkle) in [#10596](https://github.com/pydantic/pydantic/pull/10596) -* Expose public `sort` method for JSON schema generation by [@sydney-runkle](https://github.com/sydney-runkle) in [#10595](https://github.com/pydantic/pydantic/pull/10595) -* Add runtime validation of `@validate_call` callable argument by [@kc0506](https://github.com/kc0506) in [#10627](https://github.com/pydantic/pydantic/pull/10627) -* Add `experimental_allow_partial` support by [@samuelcolvin](https://github.com/samuelcolvin) in [#10748](https://github.com/pydantic/pydantic/pull/10748) -* Support default factories taking validated data as an argument by [@Viicos](https://github.com/Viicos) in [#10678](https://github.com/pydantic/pydantic/pull/10678) -* Allow subclassing `ValidationError` and `PydanticCustomError` by [@Youssefares](https://github.com/Youssefares) in [pydantic/pydantic-core#1413](https://github.com/pydantic/pydantic-core/pull/1413) -* Add `trailing-strings` support to `experimental_allow_partial` by [@sydney-runkle](https://github.com/sydney-runkle) in [#10825](https://github.com/pydantic/pydantic/pull/10825) -* Add `rebuild()` method for `TypeAdapter` and simplify `defer_build` patterns by [@sydney-runkle](https://github.com/sydney-runkle) in [#10537](https://github.com/pydantic/pydantic/pull/10537) -* Improve `TypeAdapter` instance repr by [@sydney-runkle](https://github.com/sydney-runkle) in [#10872](https://github.com/pydantic/pydantic/pull/10872) - -#### Changes - -* Don't allow customization of `SchemaGenerator` until interface is more stable by [@sydney-runkle](https://github.com/sydney-runkle) in [#10303](https://github.com/pydantic/pydantic/pull/10303) -* Cleanly `defer_build` on `TypeAdapters`, removing experimental flag by [@sydney-runkle](https://github.com/sydney-runkle) in [#10329](https://github.com/pydantic/pydantic/pull/10329) -* Fix `mro` of generic subclass by [@kc0506](https://github.com/kc0506) in [#10100](https://github.com/pydantic/pydantic/pull/10100) -* Strip whitespaces on JSON Schema title generation by [@sydney-runkle](https://github.com/sydney-runkle) in [#10404](https://github.com/pydantic/pydantic/pull/10404) -* Use `b64decode` and `b64encode` for `Base64Bytes` type by [@sydney-runkle](https://github.com/sydney-runkle) in [#10486](https://github.com/pydantic/pydantic/pull/10486) -* Relax protected namespace config default by [@sydney-runkle](https://github.com/sydney-runkle) in [#10441](https://github.com/pydantic/pydantic/pull/10441) -* Revalidate parametrized generics if instance's origin is subclass of OG class by [@sydney-runkle](https://github.com/sydney-runkle) in [#10666](https://github.com/pydantic/pydantic/pull/10666) -* Warn if configuration is specified on the `@dataclass` decorator and with the `__pydantic_config__` attribute by [@sydney-runkle](https://github.com/sydney-runkle) in [#10406](https://github.com/pydantic/pydantic/pull/10406) -* Recommend against using `Ellipsis` (...) with `Field` by [@Viicos](https://github.com/Viicos) in [#10661](https://github.com/pydantic/pydantic/pull/10661) -* Migrate to subclassing instead of annotated approach for pydantic url types by [@sydney-runkle](https://github.com/sydney-runkle) in [#10662](https://github.com/pydantic/pydantic/pull/10662) -* Change JSON schema generation of `Literal`s and `Enums` by [@Viicos](https://github.com/Viicos) in [#10692](https://github.com/pydantic/pydantic/pull/10692) -* Simplify unions involving `Any` or `Never` when replacing type variables by [@Viicos](https://github.com/Viicos) in [#10338](https://github.com/pydantic/pydantic/pull/10338) -* Do not require padding when decoding `base64` bytes by [@bschoenmaeckers](https://github.com/bschoenmaeckers) in [pydantic/pydantic-core#1448](https://github.com/pydantic/pydantic-core/pull/1448) -* Support dates all the way to 1BC by [@changhc](https://github.com/changhc) in [pydantic/speedate#77](https://github.com/pydantic/speedate/pull/77) - -#### Performance - -* Schema cleaning: skip unnecessary copies during schema walking by [@Viicos](https://github.com/Viicos) in [#10286](https://github.com/pydantic/pydantic/pull/10286) -* Refactor namespace logic for annotations evaluation by [@Viicos](https://github.com/Viicos) in [#10530](https://github.com/pydantic/pydantic/pull/10530) -* Improve email regexp on edge cases by [@AlekseyLobanov](https://github.com/AlekseyLobanov) in [#10601](https://github.com/pydantic/pydantic/pull/10601) -* `CoreMetadata` refactor with an emphasis on documentation, schema build time performance, and reducing complexity by [@sydney-runkle](https://github.com/sydney-runkle) in [#10675](https://github.com/pydantic/pydantic/pull/10675) - -#### Fixes - -* Remove guarding check on `computed_field` with `field_serializer` by [@nix010](https://github.com/nix010) in [#10390](https://github.com/pydantic/pydantic/pull/10390) -* Fix `Predicate` issue in `v2.9.0` by [@sydney-runkle](https://github.com/sydney-runkle) in [#10321](https://github.com/pydantic/pydantic/pull/10321) -* Fixing `annotated-types` bound by [@sydney-runkle](https://github.com/sydney-runkle) in [#10327](https://github.com/pydantic/pydantic/pull/10327) -* Turn `tzdata` install requirement into optional `timezone` dependency by [@jakob-keller](https://github.com/jakob-keller) in [#10331](https://github.com/pydantic/pydantic/pull/10331) -* Use correct types namespace when building `namedtuple` core schemas by [@Viicos](https://github.com/Viicos) in [#10337](https://github.com/pydantic/pydantic/pull/10337) -* Fix evaluation of stringified annotations during namespace inspection by [@Viicos](https://github.com/Viicos) in [#10347](https://github.com/pydantic/pydantic/pull/10347) -* Fix `IncEx` type alias definition by [@Viicos](https://github.com/Viicos) in [#10339](https://github.com/pydantic/pydantic/pull/10339) -* Do not error when trying to evaluate annotations of private attributes by [@Viicos](https://github.com/Viicos) in [#10358](https://github.com/pydantic/pydantic/pull/10358) -* Fix nested type statement by [@kc0506](https://github.com/kc0506) in [#10369](https://github.com/pydantic/pydantic/pull/10369) -* Improve typing of `ModelMetaclass.mro` by [@Viicos](https://github.com/Viicos) in [#10372](https://github.com/pydantic/pydantic/pull/10372) -* Fix class access of deprecated `computed_field`s by [@Viicos](https://github.com/Viicos) in [#10391](https://github.com/pydantic/pydantic/pull/10391) -* Make sure `inspect.iscoroutinefunction` works on coroutines decorated with `@validate_call` by [@MovisLi](https://github.com/MovisLi) in [#10374](https://github.com/pydantic/pydantic/pull/10374) -* Fix `NameError` when using `validate_call` with PEP 695 on a class by [@kc0506](https://github.com/kc0506) in [#10380](https://github.com/pydantic/pydantic/pull/10380) -* Fix `ZoneInfo` with various invalid types by [@sydney-runkle](https://github.com/sydney-runkle) in [#10408](https://github.com/pydantic/pydantic/pull/10408) -* Fix `PydanticUserError` on empty `model_config` with annotations by [@cdwilson](https://github.com/cdwilson) in [#10412](https://github.com/pydantic/pydantic/pull/10412) -* Fix variance issue in `_IncEx` type alias, only allow `True` by [@Viicos](https://github.com/Viicos) in [#10414](https://github.com/pydantic/pydantic/pull/10414) -* Fix serialization schema generation when using `PlainValidator` by [@Viicos](https://github.com/Viicos) in [#10427](https://github.com/pydantic/pydantic/pull/10427) -* Fix schema generation error when serialization schema holds references by [@Viicos](https://github.com/Viicos) in [#10444](https://github.com/pydantic/pydantic/pull/10444) -* Inline references if possible when generating schema for `json_schema_input_type` by [@Viicos](https://github.com/Viicos) in [#10439](https://github.com/pydantic/pydantic/pull/10439) -* Fix recursive arguments in `Representation` by [@Viicos](https://github.com/Viicos) in [#10480](https://github.com/pydantic/pydantic/pull/10480) -* Fix representation for builtin function types by [@kschwab](https://github.com/kschwab) in [#10479](https://github.com/pydantic/pydantic/pull/10479) -* Add python validators for decimal constraints (`max_digits` and `decimal_places`) by [@sydney-runkle](https://github.com/sydney-runkle) in [#10506](https://github.com/pydantic/pydantic/pull/10506) -* Only fetch `__pydantic_core_schema__` from the current class during schema generation by [@Viicos](https://github.com/Viicos) in [#10518](https://github.com/pydantic/pydantic/pull/10518) -* Fix `stacklevel` on deprecation warnings for `BaseModel` by [@sydney-runkle](https://github.com/sydney-runkle) in [#10520](https://github.com/pydantic/pydantic/pull/10520) -* Fix warning `stacklevel` in `BaseModel.__init__` by [@Viicos](https://github.com/Viicos) in [#10526](https://github.com/pydantic/pydantic/pull/10526) -* Improve error handling for in-evaluable refs for discriminator application by [@sydney-runkle](https://github.com/sydney-runkle) in [#10440](https://github.com/pydantic/pydantic/pull/10440) -* Change the signature of `ConfigWrapper.core_config` to take the title directly by [@Viicos](https://github.com/Viicos) in [#10562](https://github.com/pydantic/pydantic/pull/10562) -* Do not use the previous config from the stack for dataclasses without config by [@Viicos](https://github.com/Viicos) in [#10576](https://github.com/pydantic/pydantic/pull/10576) -* Fix serialization for IP types with `mode='python'` by [@sydney-runkle](https://github.com/sydney-runkle) in [#10594](https://github.com/pydantic/pydantic/pull/10594) -* Support constraint application for `Base64Etc` types by [@sydney-runkle](https://github.com/sydney-runkle) in [#10584](https://github.com/pydantic/pydantic/pull/10584) -* Fix `validate_call` ignoring `Field` in `Annotated` by [@kc0506](https://github.com/kc0506) in [#10610](https://github.com/pydantic/pydantic/pull/10610) -* Raise an error when `Self` is invalid by [@kc0506](https://github.com/kc0506) in [#10609](https://github.com/pydantic/pydantic/pull/10609) -* Using `core_schema.InvalidSchema` instead of metadata injection + checks by [@sydney-runkle](https://github.com/sydney-runkle) in [#10523](https://github.com/pydantic/pydantic/pull/10523) -* Tweak type alias logic by [@kc0506](https://github.com/kc0506) in [#10643](https://github.com/pydantic/pydantic/pull/10643) -* Support usage of `type` with `typing.Self` and type aliases by [@kc0506](https://github.com/kc0506) in [#10621](https://github.com/pydantic/pydantic/pull/10621) -* Use overloads for `Field` and `PrivateAttr` functions by [@Viicos](https://github.com/Viicos) in [#10651](https://github.com/pydantic/pydantic/pull/10651) -* Clean up the `mypy` plugin implementation by [@Viicos](https://github.com/Viicos) in [#10669](https://github.com/pydantic/pydantic/pull/10669) -* Properly check for `typing_extensions` variant of `TypeAliasType` by [@Daraan](https://github.com/Daraan) in [#10713](https://github.com/pydantic/pydantic/pull/10713) -* Allow any mapping in `BaseModel.model_copy()` by [@Viicos](https://github.com/Viicos) in [#10751](https://github.com/pydantic/pydantic/pull/10751) -* Fix `isinstance` behavior for urls by [@sydney-runkle](https://github.com/sydney-runkle) in [#10766](https://github.com/pydantic/pydantic/pull/10766) -* Ensure `cached_property` can be set on Pydantic models by [@Viicos](https://github.com/Viicos) in [#10774](https://github.com/pydantic/pydantic/pull/10774) -* Fix equality checks for primitives in literals by [@sydney-runkle](https://github.com/sydney-runkle) in [pydantic/pydantic-core#1459](https://github.com/pydantic/pydantic-core/pull/1459) -* Properly enforce `host_required` for URLs by [@Viicos](https://github.com/Viicos) in [pydantic/pydantic-core#1488](https://github.com/pydantic/pydantic-core/pull/1488) -* Fix when `coerce_numbers_to_str` enabled and string has invalid Unicode character by [@andrey-berenda](https://github.com/andrey-berenda) in [pydantic/pydantic-core#1515](https://github.com/pydantic/pydantic-core/pull/1515) -* Fix serializing `complex` values in `Enum`s by [@changhc](https://github.com/changhc) in [pydantic/pydantic-core#1524](https://github.com/pydantic/pydantic-core/pull/1524) -* Refactor `_typing_extra` module by [@Viicos](https://github.com/Viicos) in [#10725](https://github.com/pydantic/pydantic/pull/10725) -* Support intuitive equality for urls by [@sydney-runkle](https://github.com/sydney-runkle) in [#10798](https://github.com/pydantic/pydantic/pull/10798) -* Add `bytearray` to `TypeAdapter.validate_json` signature by [@samuelcolvin](https://github.com/samuelcolvin) in [#10802](https://github.com/pydantic/pydantic/pull/10802) -* Ensure class access of method descriptors is performed when used as a default with `Field` by [@Viicos](https://github.com/Viicos) in [#10816](https://github.com/pydantic/pydantic/pull/10816) -* Fix circular import with `validate_call` by [@sydney-runkle](https://github.com/sydney-runkle) in [#10807](https://github.com/pydantic/pydantic/pull/10807) -* Fix error when using type aliases referencing other type aliases by [@Viicos](https://github.com/Viicos) in [#10809](https://github.com/pydantic/pydantic/pull/10809) -* Fix `IncEx` type alias to be compatible with mypy by [@Viicos](https://github.com/Viicos) in [#10813](https://github.com/pydantic/pydantic/pull/10813) -* Make `__signature__` a lazy property, do not deepcopy defaults by [@Viicos](https://github.com/Viicos) in [#10818](https://github.com/pydantic/pydantic/pull/10818) -* Make `__signature__` lazy for dataclasses, too by [@sydney-runkle](https://github.com/sydney-runkle) in [#10832](https://github.com/pydantic/pydantic/pull/10832) -* Subclass all single host url classes from `AnyUrl` to preserve behavior from v2.9 by [@sydney-runkle](https://github.com/sydney-runkle) in [#10856](https://github.com/pydantic/pydantic/pull/10856) - -### New Contributors - -* [@jakob-keller](https://github.com/jakob-keller) made their first contribution in [#10331](https://github.com/pydantic/pydantic/pull/10331) -* [@MovisLi](https://github.com/MovisLi) made their first contribution in [#10374](https://github.com/pydantic/pydantic/pull/10374) -* [@joaopalmeiro](https://github.com/joaopalmeiro) made their first contribution in [#10405](https://github.com/pydantic/pydantic/pull/10405) -* [@theunkn0wn1](https://github.com/theunkn0wn1) made their first contribution in [#10378](https://github.com/pydantic/pydantic/pull/10378) -* [@cdwilson](https://github.com/cdwilson) made their first contribution in [#10412](https://github.com/pydantic/pydantic/pull/10412) -* [@dlax](https://github.com/dlax) made their first contribution in [#10421](https://github.com/pydantic/pydantic/pull/10421) -* [@kschwab](https://github.com/kschwab) made their first contribution in [#10479](https://github.com/pydantic/pydantic/pull/10479) -* [@santibreo](https://github.com/santibreo) made their first contribution in [#10453](https://github.com/pydantic/pydantic/pull/10453) -* [@FlorianSW](https://github.com/FlorianSW) made their first contribution in [#10478](https://github.com/pydantic/pydantic/pull/10478) -* [@tkasuz](https://github.com/tkasuz) made their first contribution in [#10555](https://github.com/pydantic/pydantic/pull/10555) -* [@AlekseyLobanov](https://github.com/AlekseyLobanov) made their first contribution in [#10601](https://github.com/pydantic/pydantic/pull/10601) -* [@NiclasvanEyk](https://github.com/NiclasvanEyk) made their first contribution in [#10667](https://github.com/pydantic/pydantic/pull/10667) -* [@mschoettle](https://github.com/mschoettle) made their first contribution in [#10677](https://github.com/pydantic/pydantic/pull/10677) -* [@Daraan](https://github.com/Daraan) made their first contribution in [#10713](https://github.com/pydantic/pydantic/pull/10713) -* [@k4nar](https://github.com/k4nar) made their first contribution in [#10736](https://github.com/pydantic/pydantic/pull/10736) -* [@UriyaHarpeness](https://github.com/UriyaHarpeness) made their first contribution in [#10740](https://github.com/pydantic/pydantic/pull/10740) -* [@frfahim](https://github.com/frfahim) made their first contribution in [#10727](https://github.com/pydantic/pydantic/pull/10727) - -## v2.10.0b2 (2024-11-13) - -Pre-release, see [the GitHub release](https://github.com/pydantic/pydantic/releases/tag/v2.10.0b2) for details. - -## v2.10.0b1 (2024-11-06) - -Pre-release, see [the GitHub release](https://github.com/pydantic/pydantic/releases/tag/v2.10.0b1) for details. - - -... see [here](https://docs.pydantic.dev/changelog/#v0322-2019-08-17) for earlier changes. diff --git a/Backend/venv/lib/python3.12/site-packages/pydantic-2.12.5.dist-info/RECORD b/Backend/venv/lib/python3.12/site-packages/pydantic-2.12.5.dist-info/RECORD deleted file mode 100644 index 532d6f6c..00000000 --- a/Backend/venv/lib/python3.12/site-packages/pydantic-2.12.5.dist-info/RECORD +++ /dev/null @@ -1,217 +0,0 @@ -pydantic-2.12.5.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 -pydantic-2.12.5.dist-info/METADATA,sha256=o7oj6JUZH-1puDI8vLzcgphMoLajzcYsSKI0GIapwI0,90587 -pydantic-2.12.5.dist-info/RECORD,, -pydantic-2.12.5.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87 -pydantic-2.12.5.dist-info/licenses/LICENSE,sha256=qeGG88oWte74QxjnpwFyE1GgDLe4rjpDlLZ7SeNSnvM,1129 -pydantic/__init__.py,sha256=5iEnJ4wHv1OEzdKQPzaKaZKfO4pSQAC65ODrYI6_S8Y,15812 -pydantic/__pycache__/__init__.cpython-312.pyc,, -pydantic/__pycache__/_migration.cpython-312.pyc,, -pydantic/__pycache__/alias_generators.cpython-312.pyc,, -pydantic/__pycache__/aliases.cpython-312.pyc,, -pydantic/__pycache__/annotated_handlers.cpython-312.pyc,, -pydantic/__pycache__/class_validators.cpython-312.pyc,, -pydantic/__pycache__/color.cpython-312.pyc,, -pydantic/__pycache__/config.cpython-312.pyc,, -pydantic/__pycache__/dataclasses.cpython-312.pyc,, -pydantic/__pycache__/datetime_parse.cpython-312.pyc,, -pydantic/__pycache__/decorator.cpython-312.pyc,, -pydantic/__pycache__/env_settings.cpython-312.pyc,, -pydantic/__pycache__/error_wrappers.cpython-312.pyc,, -pydantic/__pycache__/errors.cpython-312.pyc,, -pydantic/__pycache__/fields.cpython-312.pyc,, -pydantic/__pycache__/functional_serializers.cpython-312.pyc,, -pydantic/__pycache__/functional_validators.cpython-312.pyc,, -pydantic/__pycache__/generics.cpython-312.pyc,, -pydantic/__pycache__/json.cpython-312.pyc,, -pydantic/__pycache__/json_schema.cpython-312.pyc,, -pydantic/__pycache__/main.cpython-312.pyc,, -pydantic/__pycache__/mypy.cpython-312.pyc,, -pydantic/__pycache__/networks.cpython-312.pyc,, -pydantic/__pycache__/parse.cpython-312.pyc,, -pydantic/__pycache__/root_model.cpython-312.pyc,, -pydantic/__pycache__/schema.cpython-312.pyc,, -pydantic/__pycache__/tools.cpython-312.pyc,, -pydantic/__pycache__/type_adapter.cpython-312.pyc,, -pydantic/__pycache__/types.cpython-312.pyc,, -pydantic/__pycache__/typing.cpython-312.pyc,, -pydantic/__pycache__/utils.cpython-312.pyc,, -pydantic/__pycache__/validate_call_decorator.cpython-312.pyc,, -pydantic/__pycache__/validators.cpython-312.pyc,, -pydantic/__pycache__/version.cpython-312.pyc,, -pydantic/__pycache__/warnings.cpython-312.pyc,, -pydantic/_internal/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -pydantic/_internal/__pycache__/__init__.cpython-312.pyc,, -pydantic/_internal/__pycache__/_config.cpython-312.pyc,, -pydantic/_internal/__pycache__/_core_metadata.cpython-312.pyc,, -pydantic/_internal/__pycache__/_core_utils.cpython-312.pyc,, -pydantic/_internal/__pycache__/_dataclasses.cpython-312.pyc,, -pydantic/_internal/__pycache__/_decorators.cpython-312.pyc,, -pydantic/_internal/__pycache__/_decorators_v1.cpython-312.pyc,, -pydantic/_internal/__pycache__/_discriminated_union.cpython-312.pyc,, -pydantic/_internal/__pycache__/_docs_extraction.cpython-312.pyc,, -pydantic/_internal/__pycache__/_fields.cpython-312.pyc,, -pydantic/_internal/__pycache__/_forward_ref.cpython-312.pyc,, -pydantic/_internal/__pycache__/_generate_schema.cpython-312.pyc,, -pydantic/_internal/__pycache__/_generics.cpython-312.pyc,, -pydantic/_internal/__pycache__/_git.cpython-312.pyc,, -pydantic/_internal/__pycache__/_import_utils.cpython-312.pyc,, -pydantic/_internal/__pycache__/_internal_dataclass.cpython-312.pyc,, -pydantic/_internal/__pycache__/_known_annotated_metadata.cpython-312.pyc,, -pydantic/_internal/__pycache__/_mock_val_ser.cpython-312.pyc,, -pydantic/_internal/__pycache__/_model_construction.cpython-312.pyc,, -pydantic/_internal/__pycache__/_namespace_utils.cpython-312.pyc,, -pydantic/_internal/__pycache__/_repr.cpython-312.pyc,, -pydantic/_internal/__pycache__/_schema_gather.cpython-312.pyc,, -pydantic/_internal/__pycache__/_schema_generation_shared.cpython-312.pyc,, -pydantic/_internal/__pycache__/_serializers.cpython-312.pyc,, -pydantic/_internal/__pycache__/_signature.cpython-312.pyc,, -pydantic/_internal/__pycache__/_typing_extra.cpython-312.pyc,, -pydantic/_internal/__pycache__/_utils.cpython-312.pyc,, -pydantic/_internal/__pycache__/_validate_call.cpython-312.pyc,, -pydantic/_internal/__pycache__/_validators.cpython-312.pyc,, -pydantic/_internal/_config.py,sha256=TWZwg3c0bZHiT3boR5-YYqkouHcwjRdenmyGHofV7E0,14674 -pydantic/_internal/_core_metadata.py,sha256=Y_g2t3i7uluK-wXCZvzJfRFMPUM23aBYLfae4FzBPy0,5162 -pydantic/_internal/_core_utils.py,sha256=1jru4VbJ0x63R6dtVcuOI-dKQTC_d_lSnJWEBQzGNEQ,6487 -pydantic/_internal/_dataclasses.py,sha256=Tk1mEafhad1kV7K5tPX5BwxWSXY7C-MKwf0OLFgIlEA,13158 -pydantic/_internal/_decorators.py,sha256=PnyAoKSg3BNbCVSZnwqw9naEg1UDtYvDT9LluigPiO8,33529 -pydantic/_internal/_decorators_v1.py,sha256=tfdfdpQKY4R2XCOwqHbZeoQMur6VNigRrfhudXBHx38,6185 -pydantic/_internal/_discriminated_union.py,sha256=aMl0SRSyQyHfW4-klnMTHNvwSRoqE3H3PRV_05vRsTg,25478 -pydantic/_internal/_docs_extraction.py,sha256=fyznSAHh5AzohnXZStV0HvH-nRbavNHPyg-knx-S_EE,4127 -pydantic/_internal/_fields.py,sha256=YSfEKq21FgjLJ6YqYXKh0eEEs5nxMPvQ6hp9pA8Nzfw,28093 -pydantic/_internal/_forward_ref.py,sha256=5n3Y7-3AKLn8_FS3Yc7KutLiPUhyXmAtkEZOaFnonwM,611 -pydantic/_internal/_generate_schema.py,sha256=TT49vzYzqH90rWrv5ptNoZgjzOsR0KPlSkqPVFrnrBw,132665 -pydantic/_internal/_generics.py,sha256=ELqjT6LMzQzWAK0EB5_9qke_iAazz0OQ4gunp_uKuYY,23822 -pydantic/_internal/_git.py,sha256=IwPh3DPfa2Xq3rBuB9Nx8luR2A1i69QdeTfWWXIuCVg,809 -pydantic/_internal/_import_utils.py,sha256=TRhxD5OuY6CUosioBdBcJUs0om7IIONiZdYAV7zQ8jM,402 -pydantic/_internal/_internal_dataclass.py,sha256=_bedc1XbuuygRGiLZqkUkwwFpQaoR1hKLlR501nyySY,144 -pydantic/_internal/_known_annotated_metadata.py,sha256=Jc7KTNFZoB3f-0ibP_NgJINOeVvYE3q3OTBQDjVMk3U,16765 -pydantic/_internal/_mock_val_ser.py,sha256=wmRRFSBvqfcLbI41PsFliB4u2AZ3mJpZeiERbD3xKTo,8885 -pydantic/_internal/_model_construction.py,sha256=wk-bNGDAJvduaGvn0U0_8zEl0GERu0shJvN8_ZfkYaw,37783 -pydantic/_internal/_namespace_utils.py,sha256=hl3-TRAr82U2jTyPP3t-QqsvKLirxtkLfNfrN-fp0x8,12878 -pydantic/_internal/_repr.py,sha256=jQfnJuyDxQpSRNhG29II9PX8e4Nv2qWZrEw2lqih3UE,5172 -pydantic/_internal/_schema_gather.py,sha256=VLEv51TYEeeND2czsyrmJq1MVnJqTOmnLan7VG44c8A,9114 -pydantic/_internal/_schema_generation_shared.py,sha256=F_rbQbrkoomgxsskdHpP0jUJ7TCfe0BADAEkq6CJ4nM,4842 -pydantic/_internal/_serializers.py,sha256=YIWvSmAR5fnbGSWCOQduWt1yB4ZQY42eAruc-enrb6c,1491 -pydantic/_internal/_signature.py,sha256=8EljPJe4pSnapuirG5DkBAgD1hggHxEAyzFPH-9H0zE,6779 -pydantic/_internal/_typing_extra.py,sha256=_GRYopNi4a9USi5UQ285ObrlsYmvqKEWTNbBoJFSK2c,30309 -pydantic/_internal/_utils.py,sha256=c6Naqf3bds4jBctepiW5jV0xISQQQk5EBUhMNmVQ3Nk,15912 -pydantic/_internal/_validate_call.py,sha256=PfdVnSzhXOrENtaDoDw3PFWPVYD5W_gNYPe8p3Ug6Lg,5321 -pydantic/_internal/_validators.py,sha256=dv0a2Nkc4zcYqv31Gh_QId2lcf-W0kQpV0oSNzgEdfg,20588 -pydantic/_migration.py,sha256=VF73LRCUz3Irb5xVt13jb3NAcXVnEF6T1-J0OLfeZ5A,12160 -pydantic/alias_generators.py,sha256=KM1n3u4JfLSBl1UuYg3hoYHzXJD-yvgrnq8u1ccwh_A,2124 -pydantic/aliases.py,sha256=vhCHyoSWnX-EJ-wWb5qj4xyRssgGWnTQfzQp4GSZ9ug,4937 -pydantic/annotated_handlers.py,sha256=WfyFSqwoEIFXBh7T73PycKloI1DiX45GWi0-JOsCR4Y,4407 -pydantic/class_validators.py,sha256=i_V3j-PYdGLSLmj_IJZekTRjunO8SIVz8LMlquPyP7E,148 -pydantic/color.py,sha256=AzqGfVQHF92_ZctDcue0DM4yTp2P6tekkwRINTWrLIo,21481 -pydantic/config.py,sha256=5MjjzlAR0_xq7C1yAEPf7qWp5qraQwStRvma9nzbqVI,44267 -pydantic/dataclasses.py,sha256=VlknbEulg08xdmPg_60hBsCVIw-W603OJWY2n5gyXA0,18936 -pydantic/datetime_parse.py,sha256=QC-WgMxMr_wQ_mNXUS7AVf-2hLEhvvsPY1PQyhSGOdk,150 -pydantic/decorator.py,sha256=YX-jUApu5AKaVWKPoaV-n-4l7UbS69GEt9Ra3hszmKI,145 -pydantic/deprecated/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -pydantic/deprecated/__pycache__/__init__.cpython-312.pyc,, -pydantic/deprecated/__pycache__/class_validators.cpython-312.pyc,, -pydantic/deprecated/__pycache__/config.cpython-312.pyc,, -pydantic/deprecated/__pycache__/copy_internals.cpython-312.pyc,, -pydantic/deprecated/__pycache__/decorator.cpython-312.pyc,, -pydantic/deprecated/__pycache__/json.cpython-312.pyc,, -pydantic/deprecated/__pycache__/parse.cpython-312.pyc,, -pydantic/deprecated/__pycache__/tools.cpython-312.pyc,, -pydantic/deprecated/class_validators.py,sha256=EAcaVQM5zp2wBml0ybN62CfQfyJvDLx5Qd9Pk4_tb4U,10273 -pydantic/deprecated/config.py,sha256=k_lsVk57paxLJOcBueH07cu1OgEgWdVBxm6lfaC3CCU,2663 -pydantic/deprecated/copy_internals.py,sha256=Ghd-vkMd5EYCCgyCGtPKO58np9cEKBQC6qkBeIEFI2g,7618 -pydantic/deprecated/decorator.py,sha256=TBm6bJ7wJsNih_8Wq5IzDcwP32m9_vfxs96desLuk00,10845 -pydantic/deprecated/json.py,sha256=HlWCG35RRrxyzuTS6LTQiZBwRhmDZWmeqQH8rLW6wA8,4657 -pydantic/deprecated/parse.py,sha256=Gzd6b_g8zJXcuE7QRq5adhx_EMJahXfcpXCF0RgrqqI,2511 -pydantic/deprecated/tools.py,sha256=Nrm9oFRZWp8-jlfvPgJILEsywp4YzZD52XIGPDLxHcI,3330 -pydantic/env_settings.py,sha256=6IHeeWEqlUPRUv3V-AXiF_W91fg2Jw_M3O0l34J_eyA,148 -pydantic/error_wrappers.py,sha256=RK6mqATc9yMD-KBD9IJS9HpKCprWHd8wo84Bnm-3fR8,150 -pydantic/errors.py,sha256=7ctBNCtt57kZFx71Ls2H86IufQARv4wPKf8DhdsVn5w,6002 -pydantic/experimental/__init__.py,sha256=QT7rKYdDsCiTJ9GEjmsQdWHScwpKrrNkGq6vqONP6RQ,104 -pydantic/experimental/__pycache__/__init__.cpython-312.pyc,, -pydantic/experimental/__pycache__/arguments_schema.cpython-312.pyc,, -pydantic/experimental/__pycache__/missing_sentinel.cpython-312.pyc,, -pydantic/experimental/__pycache__/pipeline.cpython-312.pyc,, -pydantic/experimental/arguments_schema.py,sha256=EFnjX_ulp-tPyUjQX5pmQtug1OFL_Acc8bcMbLd-fVY,1866 -pydantic/experimental/missing_sentinel.py,sha256=hQejgtF00wUuQMni9429evg-eXyIwpKvjsD8ofqfj-w,127 -pydantic/experimental/pipeline.py,sha256=Kv_dvcexKumazfRL0y69AayeA6H37SrmsZ3SUl_n0qY,23582 -pydantic/fields.py,sha256=WuDGOvB22KWuuW3fXnS4Wvg4qX_tdp8X7BrAlza4sw8,79194 -pydantic/functional_serializers.py,sha256=rEzH391zqy3o_bWk2QEuvySmcQNZmwXmJQLC3ZGF7QA,17151 -pydantic/functional_validators.py,sha256=c_-7weWpGNcOYfRfVUFu11jrxMVMdfY_c-4istwk95Y,31839 -pydantic/generics.py,sha256=0ZqZ9O9annIj_3mGBRqps4htey3b5lV1-d2tUxPMMnA,144 -pydantic/json.py,sha256=ZH8RkI7h4Bz-zp8OdTAxbJUoVvcoU-jhMdRZ0B-k0xc,140 -pydantic/json_schema.py,sha256=-h8c7vsNGAJCIxR-n52-69Q54w38EM-j0AGC_4VGt30,123653 -pydantic/main.py,sha256=WZTxwW81igl75Y00zHJJmoU3qCNSy-1KCEmEsBPftiQ,84205 -pydantic/mypy.py,sha256=p6KU1GwPHazF7E5vJq1uLd4tHd6DE6bre4-m5Ln23ms,58986 -pydantic/networks.py,sha256=Smf_RyImQ-F5FZLCgFwHPfROYxW_e-Hz68R_8LW0sZ0,42099 -pydantic/parse.py,sha256=wkd82dgtvWtD895U_I6E1htqMlGhBSYEV39cuBSeo3A,141 -pydantic/plugin/__init__.py,sha256=a7Tw366U6K3kltCCNZY76nc9ss-7uGGQ40TXad9OypQ,7333 -pydantic/plugin/__pycache__/__init__.cpython-312.pyc,, -pydantic/plugin/__pycache__/_loader.cpython-312.pyc,, -pydantic/plugin/__pycache__/_schema_validator.cpython-312.pyc,, -pydantic/plugin/_loader.py,sha256=9QLXneLEmvyhXka_9j4Lrkbme4qPv6qYphlsjF2MGsA,2210 -pydantic/plugin/_schema_validator.py,sha256=QbmqsG33MBmftNQ2nNiuN22LhbrexUA7ipDVv3J02BU,5267 -pydantic/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -pydantic/root_model.py,sha256=BvmLtW4i11dJk-dLOM3rl-jnJdQGeeQTFBcmEOq6pMg,6311 -pydantic/schema.py,sha256=Vqqjvq_LnapVknebUd3Bp_J1p2gXZZnZRgL48bVEG7o,142 -pydantic/tools.py,sha256=iHQpd8SJ5DCTtPV5atAV06T89bjSaMFeZZ2LX9lasZY,141 -pydantic/type_adapter.py,sha256=VT--yg4a27shSBzWHBPKz493f3iQ9obdkEkhjZKlE7Q,35653 -pydantic/types.py,sha256=nqdS-J2ZXqTh2qeyJOzBTBtHWyZ5YRFe8gaMV59d9HE,105431 -pydantic/typing.py,sha256=P7feA35MwTcLsR1uL7db0S-oydBxobmXa55YDoBgajQ,138 -pydantic/utils.py,sha256=15nR2QpqTBFlQV4TNtTItMyTJx_fbyV-gPmIEY1Gooc,141 -pydantic/v1/__init__.py,sha256=FLQ8ISp6MVZRfjnS7fQ4m1FxQxFCF2QVikE4DK-4PhE,3164 -pydantic/v1/__pycache__/__init__.cpython-312.pyc,, -pydantic/v1/__pycache__/_hypothesis_plugin.cpython-312.pyc,, -pydantic/v1/__pycache__/annotated_types.cpython-312.pyc,, -pydantic/v1/__pycache__/class_validators.cpython-312.pyc,, -pydantic/v1/__pycache__/color.cpython-312.pyc,, -pydantic/v1/__pycache__/config.cpython-312.pyc,, -pydantic/v1/__pycache__/dataclasses.cpython-312.pyc,, -pydantic/v1/__pycache__/datetime_parse.cpython-312.pyc,, -pydantic/v1/__pycache__/decorator.cpython-312.pyc,, -pydantic/v1/__pycache__/env_settings.cpython-312.pyc,, -pydantic/v1/__pycache__/error_wrappers.cpython-312.pyc,, -pydantic/v1/__pycache__/errors.cpython-312.pyc,, -pydantic/v1/__pycache__/fields.cpython-312.pyc,, -pydantic/v1/__pycache__/generics.cpython-312.pyc,, -pydantic/v1/__pycache__/json.cpython-312.pyc,, -pydantic/v1/__pycache__/main.cpython-312.pyc,, -pydantic/v1/__pycache__/mypy.cpython-312.pyc,, -pydantic/v1/__pycache__/networks.cpython-312.pyc,, -pydantic/v1/__pycache__/parse.cpython-312.pyc,, -pydantic/v1/__pycache__/schema.cpython-312.pyc,, -pydantic/v1/__pycache__/tools.cpython-312.pyc,, -pydantic/v1/__pycache__/types.cpython-312.pyc,, -pydantic/v1/__pycache__/typing.cpython-312.pyc,, -pydantic/v1/__pycache__/utils.cpython-312.pyc,, -pydantic/v1/__pycache__/validators.cpython-312.pyc,, -pydantic/v1/__pycache__/version.cpython-312.pyc,, -pydantic/v1/_hypothesis_plugin.py,sha256=5ES5xWuw1FQAsymLezy8QgnVz0ZpVfU3jkmT74H27VQ,14847 -pydantic/v1/annotated_types.py,sha256=uk2NAAxqiNELKjiHhyhxKaIOh8F1lYW_LzrW3X7oZBc,3157 -pydantic/v1/class_validators.py,sha256=ULOaIUgYUDBsHL7EEVEarcM-UubKUggoN8hSbDonsFE,14672 -pydantic/v1/color.py,sha256=iZABLYp6OVoo2AFkP9Ipri_wSc6-Kklu8YuhSartd5g,16844 -pydantic/v1/config.py,sha256=a6P0Wer9x4cbwKW7Xv8poSUqM4WP-RLWwX6YMpYq9AA,6532 -pydantic/v1/dataclasses.py,sha256=784cqvInbwIPWr9usfpX3ch7z4t3J2tTK6N067_wk1o,18172 -pydantic/v1/datetime_parse.py,sha256=4Qy1kQpq3rNVZJeIHeSPDpuS2Bvhp1KPtzJG1xu-H00,7724 -pydantic/v1/decorator.py,sha256=zaaxxxoWPCm818D1bs0yhapRjXm32V8G0ZHWCdM1uXA,10339 -pydantic/v1/env_settings.py,sha256=A9VXwtRl02AY-jH0C0ouy5VNw3fi6F_pkzuHDjgAAOM,14105 -pydantic/v1/error_wrappers.py,sha256=6625Mfw9qkC2NwitB_JFAWe8B-Xv6zBU7rL9k28tfyo,5196 -pydantic/v1/errors.py,sha256=mIwPED5vGM5Q5v4C4Z1JPldTRH-omvEylH6ksMhOmPw,17726 -pydantic/v1/fields.py,sha256=VqWJCriUNiEyptXroDVJ501JpVA0en2VANcksqXL2b8,50649 -pydantic/v1/generics.py,sha256=VzC9YUV-EbPpQ3aAfk1cNFej79_IzznkQ7WrmTTZS9E,17871 -pydantic/v1/json.py,sha256=WQ5Hy_hIpfdR3YS8k6N2E6KMJzsdbBi_ldWOPJaV81M,3390 -pydantic/v1/main.py,sha256=zuNpdN5Q0V0wG2UUTKt0HUy3XJ4OAvPSZDdiXY-FIzs,44824 -pydantic/v1/mypy.py,sha256=Cl8XRfCmIcVE3j5AEU52C8iDh8lcX__D3hz2jIWxMAs,38860 -pydantic/v1/networks.py,sha256=HYNtKAfOmOnKJpsDg1g6SIkj9WPhU_-i8l5e2JKBpG4,22124 -pydantic/v1/parse.py,sha256=BJtdqiZRtav9VRFCmOxoY-KImQmjPy-A_NoojiFUZxY,1821 -pydantic/v1/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -pydantic/v1/schema.py,sha256=aqBuA--cq8gAVkim5BJPFASHzOZ8dFtmFX_fNGr6ip4,47801 -pydantic/v1/tools.py,sha256=1lDdXHk0jL5uP3u5RCYAvUAlGClgAO-45lkq9j7fyBA,2881 -pydantic/v1/types.py,sha256=Bzl-RcnitPBHnqwwj9iv7JjHuN1GpnWH24dKkF3l9e8,35455 -pydantic/v1/typing.py,sha256=7GdBg1YTHULU81thB_9cjRNDfZfn4khoX7nGtw_keCE,19677 -pydantic/v1/utils.py,sha256=M5FRyfNUb1A2mk9laGgCVdfHHb3AtQgrjO5qfyBf4xA,25989 -pydantic/v1/validators.py,sha256=lyUkn1MWhHxlCX5ZfEgFj_CAHojoiPcaQeMdEM9XviU,22187 -pydantic/v1/version.py,sha256=HXnXW-1bMW5qKhlr5RgOEPohrZDCDSuyy8-gi8GCgZo,1039 -pydantic/validate_call_decorator.py,sha256=8jqLlgXTjWEj4dXDg0wI3EGQKkb0JnCsL_JSUjbU5Sg,4389 -pydantic/validators.py,sha256=pwbIJXVb1CV2mAE4w_EGfNj7DwzsKaWw_tTL6cviTus,146 -pydantic/version.py,sha256=XNmGSyOP87Mqa_A9HFzfDcNippfnqfRK3ZUiGyBb4-A,3985 -pydantic/warnings.py,sha256=Wu1VGzrvFZw4T6yCIKHjH7LSY66HjbtyCFbn5uWoMJ4,4802 diff --git a/Backend/venv/lib/python3.12/site-packages/pydantic-2.12.5.dist-info/INSTALLER b/Backend/venv/lib/python3.12/site-packages/pydantic-2.5.0.dist-info/INSTALLER similarity index 100% rename from Backend/venv/lib/python3.12/site-packages/pydantic-2.12.5.dist-info/INSTALLER rename to Backend/venv/lib/python3.12/site-packages/pydantic-2.5.0.dist-info/INSTALLER diff --git a/Backend/venv/lib/python3.12/site-packages/pydantic-2.5.0.dist-info/METADATA b/Backend/venv/lib/python3.12/site-packages/pydantic-2.5.0.dist-info/METADATA new file mode 100644 index 00000000..09e8216b --- /dev/null +++ b/Backend/venv/lib/python3.12/site-packages/pydantic-2.5.0.dist-info/METADATA @@ -0,0 +1,1464 @@ +Metadata-Version: 2.1 +Name: pydantic +Version: 2.5.0 +Summary: Data validation using Python type hints +Project-URL: Homepage, https://github.com/pydantic/pydantic +Project-URL: Documentation, https://docs.pydantic.dev +Project-URL: Funding, https://github.com/sponsors/samuelcolvin +Project-URL: Source, https://github.com/pydantic/pydantic +Project-URL: Changelog, https://docs.pydantic.dev/latest/changelog/ +Author-email: Samuel Colvin , Eric Jolibois , Hasan Ramezani , Adrian Garcia Badaracco <1755071+adriangb@users.noreply.github.com>, Terrence Dorsey , David Montague , Serge Matveenko , Marcelo Trylesinski , Sydney Runkle , David Hewitt +License-Expression: MIT +License-File: LICENSE +Classifier: Development Status :: 5 - Production/Stable +Classifier: Environment :: Console +Classifier: Environment :: MacOS X +Classifier: Framework :: Hypothesis +Classifier: Framework :: Pydantic +Classifier: Intended Audience :: Developers +Classifier: Intended Audience :: Information Technology +Classifier: Intended Audience :: System Administrators +Classifier: License :: OSI Approved :: MIT License +Classifier: Operating System :: POSIX :: Linux +Classifier: Operating System :: Unix +Classifier: Programming Language :: Python +Classifier: Programming Language :: Python :: 3 +Classifier: Programming Language :: Python :: 3 :: Only +Classifier: Programming Language :: Python :: 3.7 +Classifier: Programming Language :: Python :: 3.8 +Classifier: Programming Language :: Python :: 3.9 +Classifier: Programming Language :: Python :: 3.10 +Classifier: Programming Language :: Python :: 3.11 +Classifier: Programming Language :: Python :: 3.12 +Classifier: Programming Language :: Python :: Implementation :: CPython +Classifier: Programming Language :: Python :: Implementation :: PyPy +Classifier: Topic :: Internet +Classifier: Topic :: Software Development :: Libraries :: Python Modules +Requires-Python: >=3.7 +Requires-Dist: annotated-types>=0.4.0 +Requires-Dist: importlib-metadata; python_version == '3.7' +Requires-Dist: pydantic-core==2.14.1 +Requires-Dist: typing-extensions>=4.6.1 +Provides-Extra: email +Requires-Dist: email-validator>=2.0.0; extra == 'email' +Description-Content-Type: text/markdown + +# Pydantic + +[![CI](https://github.com/pydantic/pydantic/workflows/CI/badge.svg?event=push)](https://github.com/pydantic/pydantic/actions?query=event%3Apush+branch%3Amain+workflow%3ACI) +[![Coverage](https://coverage-badge.samuelcolvin.workers.dev/pydantic/pydantic.svg)](https://coverage-badge.samuelcolvin.workers.dev/redirect/pydantic/pydantic) +[![pypi](https://img.shields.io/pypi/v/pydantic.svg)](https://pypi.python.org/pypi/pydantic) +[![CondaForge](https://img.shields.io/conda/v/conda-forge/pydantic.svg)](https://anaconda.org/conda-forge/pydantic) +[![downloads](https://static.pepy.tech/badge/pydantic/month)](https://pepy.tech/project/pydantic) +[![versions](https://img.shields.io/pypi/pyversions/pydantic.svg)](https://github.com/pydantic/pydantic) +[![license](https://img.shields.io/github/license/pydantic/pydantic.svg)](https://github.com/pydantic/pydantic/blob/main/LICENSE) +[![Pydantic v2](https://img.shields.io/endpoint?url=https://raw.githubusercontent.com/pydantic/pydantic/main/docs/badge/v2.json)](https://docs.pydantic.dev/latest/contributing/#badges) + +Data validation using Python type hints. + +Fast and extensible, Pydantic plays nicely with your linters/IDE/brain. +Define how data should be in pure, canonical Python 3.7+; validate it with Pydantic. + +## Pydantic Company :rocket: + +We've started a company based on the principles that I believe have led to Pydantic's success. +Learning more from the [Company Announcement](https://pydantic.dev/announcement/). + +## Pydantic V1.10 vs. V2 + +Pydantic V2 is a ground-up rewrite that offers many new features, performance improvements, and some breaking changes compared to Pydantic V1. + +If you're using Pydantic V1 you may want to look at the +[pydantic V1.10 Documentation](https://docs.pydantic.dev/) or, +[`1.10.X-fixes` git branch](https://github.com/pydantic/pydantic/tree/1.10.X-fixes). Pydantic V2 also ships with the latest version of Pydantic V1 built in so that you can incrementally upgrade your code base and projects: `from pydantic import v1 as pydantic_v1`. + +## Help + +See [documentation](https://docs.pydantic.dev/) for more details. + +## Installation + +Install using `pip install -U pydantic` or `conda install pydantic -c conda-forge`. +For more installation options to make Pydantic even faster, +see the [Install](https://docs.pydantic.dev/install/) section in the documentation. + +## A Simple Example + +```py +from datetime import datetime +from typing import List, Optional +from pydantic import BaseModel + +class User(BaseModel): + id: int + name: str = 'John Doe' + signup_ts: Optional[datetime] = None + friends: List[int] = [] + +external_data = {'id': '123', 'signup_ts': '2017-06-01 12:22', 'friends': [1, '2', b'3']} +user = User(**external_data) +print(user) +#> User id=123 name='John Doe' signup_ts=datetime.datetime(2017, 6, 1, 12, 22) friends=[1, 2, 3] +print(user.id) +#> 123 +``` + +## Contributing + +For guidance on setting up a development environment and how to make a +contribution to Pydantic, see +[Contributing to Pydantic](https://docs.pydantic.dev/contributing/). + +## Reporting a Security Vulnerability + +See our [security policy](https://github.com/pydantic/pydantic/security/policy). + +## Changelog + +## v2.5.0 (2023-11-13) + +[GitHub release](https://github.com/pydantic/pydantic/releases/tag/v2.5.0) + +The code released in v2.5.0 is functionally identical to that of v2.5.0b1. + +### What's Changed + +#### Packaging + +* Update pydantic-core from 2.10.1 to 2.14.1, significant changes from these updates are described below, full changelog [here](https://github.com/pydantic/pydantic-core/compare/v2.10.1...v2.14.1) +* Update to `pyright==1.1.335` by [@Viicos](https://github.com/Viicos) in [#8075](https://github.com/pydantic/pydantic/pull/8075) + +#### New Features + +* Allow plugins to catch non `ValidationError` errors by [@adriangb](https://github.com/adriangb) in [#7806](https://github.com/pydantic/pydantic/pull/7806) +* Support `__doc__` argument in `create_model()` by [@chris-spann](https://github.com/chris-spann) in [#7863](https://github.com/pydantic/pydantic/pull/7863) +* Expose `regex_engine` flag - meaning you can use with the Rust or Python regex libraries in constraints by [@utkini](https://github.com/utkini) in [#7768](https://github.com/pydantic/pydantic/pull/7768) +* Save return type generated from type annotation in `ComputedFieldInfo` by [@alexmojaki](https://github.com/alexmojaki) in [#7889](https://github.com/pydantic/pydantic/pull/7889) +* Adopting `ruff` formatter by [@Luca-Blight](https://github.com/Luca-Blight) in [#7930](https://github.com/pydantic/pydantic/pull/7930) +* Added `validation_error_cause` to config by [@zakstucke](https://github.com/zakstucke) in [#7626](https://github.com/pydantic/pydantic/pull/7626) +* Make path of the item to validate available in plugin by [@hramezani](https://github.com/hramezani) in [#7861](https://github.com/pydantic/pydantic/pull/7861) +* Add `CallableDiscriminator` and `Tag` by [@dmontagu](https://github.com/dmontagu) in [#7983](https://github.com/pydantic/pydantic/pull/7983) +* Make union case tags affect union error messages by [@dmontagu](https://github.com/dmontagu) in [#8001](https://github.com/pydantic/pydantic/pull/8001) +* Add `examples` and `json_schema_extra` to `@computed_field` by [@alexmojaki](https://github.com/alexmojaki) in [#8013](https://github.com/pydantic/pydantic/pull/8013) +* Add `JsonValue` type by [@dmontagu](https://github.com/dmontagu) in [#7998](https://github.com/pydantic/pydantic/pull/7998) +* Allow `str` as argument to `Discriminator` by [@dmontagu](https://github.com/dmontagu) in [#8047](https://github.com/pydantic/pydantic/pull/8047) +* Add `SchemaSerializer.__reduce__` method to enable pickle serialization by [@edoakes](https://github.com/edoakes) in [pydantic/pydantic-core#1006](https://github.com/pydantic/pydantic-core/pull/1006) + +#### Changes + +* **Significant Change:** replace `ultra_strict` with new smart union implementation, the way unions are validated has changed significantly to improve performance and correctness, we have worked hard to absolutely minimise the number of cases where behaviour has changed, see the PR for details - by [@davidhewitt](https://github.com/davidhewitt) in [pydantic/pydantic-core#867](https://github.com/pydantic/pydantic-core/pull/867) +* Add support for instance method reassignment when `extra='allow'` by [@sydney-runkle](https://github.com/sydney-runkle) in [#7683](https://github.com/pydantic/pydantic/pull/7683) +* Support JSON schema generation for `Enum` types with no cases by [@sydney-runkle](https://github.com/sydney-runkle) in [#7927](https://github.com/pydantic/pydantic/pull/7927) +* Warn if a class inherits from `Generic` before `BaseModel` by [@alexmojaki](https://github.com/alexmojaki) in [#7891](https://github.com/pydantic/pydantic/pull/7891) + +#### Performance + +* New custom JSON parser, `jiter` by [@samuelcolvin](https://github.com/samuelcolvin) in [pydantic/pydantic-core#974](https://github.com/pydantic/pydantic-core/pull/974) +* PGO build for MacOS M1 by [@samuelcolvin](https://github.com/samuelcolvin) in [pydantic/pydantic-core#1063](https://github.com/pydantic/pydantic-core/pull/1063) +* Use `__getattr__` for all package imports, improve import time by [@samuelcolvin](https://github.com/samuelcolvin) in [#7947](https://github.com/pydantic/pydantic/pull/7947) + +#### Fixes + +* Fix `mypy` issue with subclasses of `RootModel` by [@sydney-runkle](https://github.com/sydney-runkle) in [#7677](https://github.com/pydantic/pydantic/pull/7677) +* Properly rebuild the `FieldInfo` when a forward ref gets evaluated by [@dmontagu](https://github.com/dmontagu) in [#7698](https://github.com/pydantic/pydantic/pull/7698) +* Fix failure to load `SecretStr` from JSON (regression in v2.4) by [@sydney-runkle](https://github.com/sydney-runkle) in [#7729](https://github.com/pydantic/pydantic/pull/7729) +* Fix `defer_build` behavior with `TypeAdapter` by [@sydney-runkle](https://github.com/sydney-runkle) in [#7736](https://github.com/pydantic/pydantic/pull/7736) +* Improve compatibility with legacy `mypy` versions by [@dmontagu](https://github.com/dmontagu) in [#7742](https://github.com/pydantic/pydantic/pull/7742) +* Fix: update `TypeVar` handling when default is not set by [@pmmmwh](https://github.com/pmmmwh) in [#7719](https://github.com/pydantic/pydantic/pull/7719) +* Support specification of `strict` on `Enum` type fields by [@sydney-runkle](https://github.com/sydney-runkle) in [#7761](https://github.com/pydantic/pydantic/pull/7761) +* Wrap `weakref.ref` instead of subclassing to fix `cloudpickle` serialization by [@edoakes](https://github.com/edoakes) in [#7780](https://github.com/pydantic/pydantic/pull/7780) +* Keep values of private attributes set within `model_post_init` in subclasses by [@alexmojaki](https://github.com/alexmojaki) in [#7775](https://github.com/pydantic/pydantic/pull/7775) +* Add more specific type for non-callable `json_schema_extra` by [@alexmojaki](https://github.com/alexmojaki) in [#7803](https://github.com/pydantic/pydantic/pull/7803) +* Raise an error when deleting frozen (model) fields by [@alexmojaki](https://github.com/alexmojaki) in [#7800](https://github.com/pydantic/pydantic/pull/7800) +* Fix schema sorting bug with default values by [@sydney-runkle](https://github.com/sydney-runkle) in [#7817](https://github.com/pydantic/pydantic/pull/7817) +* Use generated alias for aliases that are not specified otherwise by [@alexmojaki](https://github.com/alexmojaki) in [#7802](https://github.com/pydantic/pydantic/pull/7802) +* Support `strict` specification for `UUID` types by [@sydney-runkle](https://github.com/sydney-runkle) in [#7865](https://github.com/pydantic/pydantic/pull/7865) +* JSON schema: fix extra parameter handling by [@me-and](https://github.com/me-and) in [#7810](https://github.com/pydantic/pydantic/pull/7810) +* Fix: support `pydantic.Field(kw_only=True)` with inherited dataclasses by [@PrettyWood](https://github.com/PrettyWood) in [#7827](https://github.com/pydantic/pydantic/pull/7827) +* Support `validate_call` decorator for methods in classes with `__slots__` by [@sydney-runkle](https://github.com/sydney-runkle) in [#7883](https://github.com/pydantic/pydantic/pull/7883) +* Fix pydantic dataclass problem with `dataclasses.field` default by [@hramezani](https://github.com/hramezani) in [#7898](https://github.com/pydantic/pydantic/pull/7898) +* Fix schema generation for generics with union type bounds by [@sydney-runkle](https://github.com/sydney-runkle) in [#7899](https://github.com/pydantic/pydantic/pull/7899) +* Fix version for `importlib_metadata` on python 3.7 by [@sydney-runkle](https://github.com/sydney-runkle) in [#7904](https://github.com/pydantic/pydantic/pull/7904) +* Support `|` operator (Union) in PydanticRecursiveRef by [@alexmojaki](https://github.com/alexmojaki) in [#7892](https://github.com/pydantic/pydantic/pull/7892) +* Fix `display_as_type` for `TypeAliasType` in python 3.12 by [@dmontagu](https://github.com/dmontagu) in [#7929](https://github.com/pydantic/pydantic/pull/7929) +* Add support for `NotRequired` generics in `TypedDict` by [@sydney-runkle](https://github.com/sydney-runkle) in [#7932](https://github.com/pydantic/pydantic/pull/7932) +* Make generic `TypeAliasType` specifications produce different schema definitions by [@alexdrydew](https://github.com/alexdrydew) in [#7893](https://github.com/pydantic/pydantic/pull/7893) +* Added fix for signature of inherited dataclass by [@howsunjow](https://github.com/howsunjow) in [#7925](https://github.com/pydantic/pydantic/pull/7925) +* Make the model name generation more robust in JSON schema by [@joakimnordling](https://github.com/joakimnordling) in [#7881](https://github.com/pydantic/pydantic/pull/7881) +* Fix plurals in validation error messages (in tests) by [@Iipin](https://github.com/Iipin) in [#7972](https://github.com/pydantic/pydantic/pull/7972) +* `PrivateAttr` is passed from `Annotated` default position by [@tabassco](https://github.com/tabassco) in [#8004](https://github.com/pydantic/pydantic/pull/8004) +* Don't decode bytes (which may not be UTF8) when displaying SecretBytes by [@alexmojaki](https://github.com/alexmojaki) in [#8012](https://github.com/pydantic/pydantic/pull/8012) +* Use `classmethod` instead of `classmethod[Any, Any, Any]` by [@Mr-Pepe](https://github.com/Mr-Pepe) in [#7979](https://github.com/pydantic/pydantic/pull/7979) +* Clearer error on invalid Plugin by [@samuelcolvin](https://github.com/samuelcolvin) in [#8023](https://github.com/pydantic/pydantic/pull/8023) +* Correct pydantic dataclasses import by [@samuelcolvin](https://github.com/samuelcolvin) in [#8027](https://github.com/pydantic/pydantic/pull/8027) +* Fix misbehavior for models referencing redefined type aliases by [@dmontagu](https://github.com/dmontagu) in [#8050](https://github.com/pydantic/pydantic/pull/8050) +* Fix `Optional` field with `validate_default` only performing one field validation by [@sydney-runkle](https://github.com/sydney-runkle) in [pydantic/pydantic-core#1002](https://github.com/pydantic/pydantic-core/pull/1002) +* Fix `definition-ref` bug with `Dict` keys by [@sydney-runkle](https://github.com/sydney-runkle) in [pydantic/pydantic-core#1014](https://github.com/pydantic/pydantic-core/pull/1014) +* Fix bug allowing validation of `bool` types with `coerce_numbers_to_str=True` by [@sydney-runkle](https://github.com/sydney-runkle) in [pydantic/pydantic-core#1017](https://github.com/pydantic/pydantic-core/pull/1017) +* Don't accept `NaN` in float and decimal constraints by [@davidhewitt](https://github.com/davidhewitt) in [pydantic/pydantic-core#1037](https://github.com/pydantic/pydantic-core/pull/1037) +* Add `lax_str` and `lax_int` support for enum values not inherited from str/int by [@michaelhly](https://github.com/michaelhly) in [pydantic/pydantic-core#1015](https://github.com/pydantic/pydantic-core/pull/1015) +* Support subclasses in lists in `Union` of `List` types by [@sydney-runkle](https://github.com/sydney-runkle) in [pydantic/pydantic-core#1039](https://github.com/pydantic/pydantic-core/pull/1039) +* Allow validation against `max_digits` and `decimals` to pass if normalized or non-normalized input is valid by [@sydney-runkle](https://github.com/sydney-runkle) in [pydantic/pydantic-core#1049](https://github.com/pydantic/pydantic-core/pull/1049) +* Fix: proper pluralization in `ValidationError` messages by [@Iipin](https://github.com/Iipin) in [pydantic/pydantic-core#1050](https://github.com/pydantic/pydantic-core/pull/1050) +* Disallow the string `'-'` as `datetime` input by [@davidhewitt](https://github.com/davidhewitt) in [pydantic/speedate#52](https://github.com/pydantic/speedate/pull/52) & [pydantic/pydantic-core#1060](https://github.com/pydantic/pydantic-core/pull/1060) +* Fix: NaN and Inf float serialization by [@davidhewitt](https://github.com/davidhewitt) in [pydantic/pydantic-core#1062](https://github.com/pydantic/pydantic-core/pull/1062) +* Restore manylinux-compatible PGO builds by [@davidhewitt](https://github.com/davidhewitt) in [pydantic/pydantic-core#1068](https://github.com/pydantic/pydantic-core/pull/1068) + +### New Contributors + +#### `pydantic` +* [@schneebuzz](https://github.com/schneebuzz) made their first contribution in [#7699](https://github.com/pydantic/pydantic/pull/7699) +* [@edoakes](https://github.com/edoakes) made their first contribution in [#7780](https://github.com/pydantic/pydantic/pull/7780) +* [@alexmojaki](https://github.com/alexmojaki) made their first contribution in [#7775](https://github.com/pydantic/pydantic/pull/7775) +* [@NickG123](https://github.com/NickG123) made their first contribution in [#7751](https://github.com/pydantic/pydantic/pull/7751) +* [@gowthamgts](https://github.com/gowthamgts) made their first contribution in [#7830](https://github.com/pydantic/pydantic/pull/7830) +* [@jamesbraza](https://github.com/jamesbraza) made their first contribution in [#7848](https://github.com/pydantic/pydantic/pull/7848) +* [@laundmo](https://github.com/laundmo) made their first contribution in [#7850](https://github.com/pydantic/pydantic/pull/7850) +* [@rahmatnazali](https://github.com/rahmatnazali) made their first contribution in [#7870](https://github.com/pydantic/pydantic/pull/7870) +* [@waterfountain1996](https://github.com/waterfountain1996) made their first contribution in [#7878](https://github.com/pydantic/pydantic/pull/7878) +* [@chris-spann](https://github.com/chris-spann) made their first contribution in [#7863](https://github.com/pydantic/pydantic/pull/7863) +* [@me-and](https://github.com/me-and) made their first contribution in [#7810](https://github.com/pydantic/pydantic/pull/7810) +* [@utkini](https://github.com/utkini) made their first contribution in [#7768](https://github.com/pydantic/pydantic/pull/7768) +* [@bn-l](https://github.com/bn-l) made their first contribution in [#7744](https://github.com/pydantic/pydantic/pull/7744) +* [@alexdrydew](https://github.com/alexdrydew) made their first contribution in [#7893](https://github.com/pydantic/pydantic/pull/7893) +* [@Luca-Blight](https://github.com/Luca-Blight) made their first contribution in [#7930](https://github.com/pydantic/pydantic/pull/7930) +* [@howsunjow](https://github.com/howsunjow) made their first contribution in [#7925](https://github.com/pydantic/pydantic/pull/7925) +* [@joakimnordling](https://github.com/joakimnordling) made their first contribution in [#7881](https://github.com/pydantic/pydantic/pull/7881) +* [@icfly2](https://github.com/icfly2) made their first contribution in [#7976](https://github.com/pydantic/pydantic/pull/7976) +* [@Yummy-Yums](https://github.com/Yummy-Yums) made their first contribution in [#8003](https://github.com/pydantic/pydantic/pull/8003) +* [@Iipin](https://github.com/Iipin) made their first contribution in [#7972](https://github.com/pydantic/pydantic/pull/7972) +* [@tabassco](https://github.com/tabassco) made their first contribution in [#8004](https://github.com/pydantic/pydantic/pull/8004) +* [@Mr-Pepe](https://github.com/Mr-Pepe) made their first contribution in [#7979](https://github.com/pydantic/pydantic/pull/7979) +* [@0x00cl](https://github.com/0x00cl) made their first contribution in [#8010](https://github.com/pydantic/pydantic/pull/8010) +* [@barraponto](https://github.com/barraponto) made their first contribution in [#8032](https://github.com/pydantic/pydantic/pull/8032) + +#### `pydantic-core` +* [@sisp](https://github.com/sisp) made their first contribution in [pydantic/pydantic-core#995](https://github.com/pydantic/pydantic-core/pull/995) +* [@michaelhly](https://github.com/michaelhly) made their first contribution in [pydantic/pydantic-core#1015](https://github.com/pydantic/pydantic-core/pull/1015) + +## v2.5.0b1 (2023-11-09) + +Pre-release, see [the GitHub release](https://github.com/pydantic/pydantic/releases/tag/v2.5.0b1) for details. + +## v2.4.2 (2023-09-27) + +[GitHub release](https://github.com/pydantic/pydantic/releases/tag/v2.4.2) + +### What's Changed + +#### Fixes + +* Fix bug with JSON schema for sequence of discriminated union by [@dmontagu](https://github.com/dmontagu) in [#7647](https://github.com/pydantic/pydantic/pull/7647) +* Fix schema references in discriminated unions by [@adriangb](https://github.com/adriangb) in [#7646](https://github.com/pydantic/pydantic/pull/7646) +* Fix json schema generation for recursive models by [@adriangb](https://github.com/adriangb) in [#7653](https://github.com/pydantic/pydantic/pull/7653) +* Fix `models_json_schema` for generic models by [@adriangb](https://github.com/adriangb) in [#7654](https://github.com/pydantic/pydantic/pull/7654) +* Fix xfailed test for generic model signatures by [@adriangb](https://github.com/adriangb) in [#7658](https://github.com/pydantic/pydantic/pull/7658) + +### New Contributors + +* [@austinorr](https://github.com/austinorr) made their first contribution in [#7657](https://github.com/pydantic/pydantic/pull/7657) +* [@peterHoburg](https://github.com/peterHoburg) made their first contribution in [#7670](https://github.com/pydantic/pydantic/pull/7670) + +## v2.4.1 (2023-09-26) + +[GitHub release](https://github.com/pydantic/pydantic/releases/tag/v2.4.1) + +### What's Changed + +#### Packaging + +* Update pydantic-core to 2.10.1 by [@davidhewitt](https://github.com/davidhewitt) in [#7633](https://github.com/pydantic/pydantic/pull/7633) + +#### Fixes + +* Serialize unsubstituted type vars as `Any` by [@adriangb](https://github.com/adriangb) in [#7606](https://github.com/pydantic/pydantic/pull/7606) +* Remove schema building caches by [@adriangb](https://github.com/adriangb) in [#7624](https://github.com/pydantic/pydantic/pull/7624) +* Fix an issue where JSON schema extras weren't JSON encoded by [@dmontagu](https://github.com/dmontagu) in [#7625](https://github.com/pydantic/pydantic/pull/7625) + +## v2.4.0 (2023-09-22) + +[GitHub release](https://github.com/pydantic/pydantic/releases/tag/v2.4.0) + +### What's Changed + +#### Packaging + +* Update pydantic-core to 2.10.0 by [@samuelcolvin](https://github.com/samuelcolvin) in [#7542](https://github.com/pydantic/pydantic/pull/7542) + +#### New Features + +* Add `Base64Url` types by [@dmontagu](https://github.com/dmontagu) in [#7286](https://github.com/pydantic/pydantic/pull/7286) +* Implement optional `number` to `str` coercion by [@lig](https://github.com/lig) in [#7508](https://github.com/pydantic/pydantic/pull/7508) +* Allow access to `field_name` and `data` in all validators if there is data and a field name by [@samuelcolvin](https://github.com/samuelcolvin) in [#7542](https://github.com/pydantic/pydantic/pull/7542) +* Add `BaseModel.model_validate_strings` and `TypeAdapter.validate_strings` by [@hramezani](https://github.com/hramezani) in [#7552](https://github.com/pydantic/pydantic/pull/7552) +* Add Pydantic `plugins` experimental implementation by [@lig](https://github.com/lig) [@samuelcolvin](https://github.com/samuelcolvin) and [@Kludex](https://github.com/Kludex) in [#6820](https://github.com/pydantic/pydantic/pull/6820) + +#### Changes + +* Do not override `model_post_init` in subclass with private attrs by [@Viicos](https://github.com/Viicos) in [#7302](https://github.com/pydantic/pydantic/pull/7302) +* Make fields with defaults not required in the serialization schema by default by [@dmontagu](https://github.com/dmontagu) in [#7275](https://github.com/pydantic/pydantic/pull/7275) +* Mark `Extra` as deprecated by [@disrupted](https://github.com/disrupted) in [#7299](https://github.com/pydantic/pydantic/pull/7299) +* Make `EncodedStr` a dataclass by [@Kludex](https://github.com/Kludex) in [#7396](https://github.com/pydantic/pydantic/pull/7396) +* Move `annotated_handlers` to be public by [@samuelcolvin](https://github.com/samuelcolvin) in [#7569](https://github.com/pydantic/pydantic/pull/7569) + +#### Performance + +* Simplify flattening and inlining of `CoreSchema` by [@adriangb](https://github.com/adriangb) in [#7523](https://github.com/pydantic/pydantic/pull/7523) +* Remove unused copies in `CoreSchema` walking by [@adriangb](https://github.com/adriangb) in [#7528](https://github.com/pydantic/pydantic/pull/7528) +* Add caches for collecting definitions and invalid schemas from a CoreSchema by [@adriangb](https://github.com/adriangb) in [#7527](https://github.com/pydantic/pydantic/pull/7527) +* Eagerly resolve discriminated unions and cache cases where we can't by [@adriangb](https://github.com/adriangb) in [#7529](https://github.com/pydantic/pydantic/pull/7529) +* Replace `dict.get` and `dict.setdefault` with more verbose versions in `CoreSchema` building hot paths by [@adriangb](https://github.com/adriangb) in [#7536](https://github.com/pydantic/pydantic/pull/7536) +* Cache invalid `CoreSchema` discovery by [@adriangb](https://github.com/adriangb) in [#7535](https://github.com/pydantic/pydantic/pull/7535) +* Allow disabling `CoreSchema` validation for faster startup times by [@adriangb](https://github.com/adriangb) in [#7565](https://github.com/pydantic/pydantic/pull/7565) + +#### Fixes + +* Fix config detection for `TypedDict` from grandparent classes by [@dmontagu](https://github.com/dmontagu) in [#7272](https://github.com/pydantic/pydantic/pull/7272) +* Fix hash function generation for frozen models with unusual MRO by [@dmontagu](https://github.com/dmontagu) in [#7274](https://github.com/pydantic/pydantic/pull/7274) +* Make `strict` config overridable in field for Path by [@hramezani](https://github.com/hramezani) in [#7281](https://github.com/pydantic/pydantic/pull/7281) +* Use `ser_json_` on default in `GenerateJsonSchema` by [@Kludex](https://github.com/Kludex) in [#7269](https://github.com/pydantic/pydantic/pull/7269) +* Adding a check that alias is validated as an identifier for Python by [@andree0](https://github.com/andree0) in [#7319](https://github.com/pydantic/pydantic/pull/7319) +* Raise an error when computed field overrides field by [@sydney-runkle](https://github.com/sydney-runkle) in [#7346](https://github.com/pydantic/pydantic/pull/7346) +* Fix applying `SkipValidation` to referenced schemas by [@adriangb](https://github.com/adriangb) in [#7381](https://github.com/pydantic/pydantic/pull/7381) +* Enforce behavior of private attributes having double leading underscore by [@lig](https://github.com/lig) in [#7265](https://github.com/pydantic/pydantic/pull/7265) +* Standardize `__get_pydantic_core_schema__` signature by [@hramezani](https://github.com/hramezani) in [#7415](https://github.com/pydantic/pydantic/pull/7415) +* Fix generic dataclass fields mutation bug (when using `TypeAdapter`) by [@sydney-runkle](https://github.com/sydney-runkle) in [#7435](https://github.com/pydantic/pydantic/pull/7435) +* Fix `TypeError` on `model_validator` in `wrap` mode by [@pmmmwh](https://github.com/pmmmwh) in [#7496](https://github.com/pydantic/pydantic/pull/7496) +* Improve enum error message by [@hramezani](https://github.com/hramezani) in [#7506](https://github.com/pydantic/pydantic/pull/7506) +* Make `repr` work for instances that failed initialization when handling `ValidationError`s by [@dmontagu](https://github.com/dmontagu) in [#7439](https://github.com/pydantic/pydantic/pull/7439) +* Fixed a regular expression denial of service issue by limiting whitespaces by [@prodigysml](https://github.com/prodigysml) in [#7360](https://github.com/pydantic/pydantic/pull/7360) +* Fix handling of `UUID` values having `UUID.version=None` by [@lig](https://github.com/lig) in [#7566](https://github.com/pydantic/pydantic/pull/7566) +* Fix `__iter__` returning private `cached_property` info by [@sydney-runkle](https://github.com/sydney-runkle) in [#7570](https://github.com/pydantic/pydantic/pull/7570) +* Improvements to version info message by [@samuelcolvin](https://github.com/samuelcolvin) in [#7594](https://github.com/pydantic/pydantic/pull/7594) + +### New Contributors +* [@15498th](https://github.com/15498th) made their first contribution in [#7238](https://github.com/pydantic/pydantic/pull/7238) +* [@GabrielCappelli](https://github.com/GabrielCappelli) made their first contribution in [#7213](https://github.com/pydantic/pydantic/pull/7213) +* [@tobni](https://github.com/tobni) made their first contribution in [#7184](https://github.com/pydantic/pydantic/pull/7184) +* [@redruin1](https://github.com/redruin1) made their first contribution in [#7282](https://github.com/pydantic/pydantic/pull/7282) +* [@FacerAin](https://github.com/FacerAin) made their first contribution in [#7288](https://github.com/pydantic/pydantic/pull/7288) +* [@acdha](https://github.com/acdha) made their first contribution in [#7297](https://github.com/pydantic/pydantic/pull/7297) +* [@andree0](https://github.com/andree0) made their first contribution in [#7319](https://github.com/pydantic/pydantic/pull/7319) +* [@gordonhart](https://github.com/gordonhart) made their first contribution in [#7375](https://github.com/pydantic/pydantic/pull/7375) +* [@pmmmwh](https://github.com/pmmmwh) made their first contribution in [#7496](https://github.com/pydantic/pydantic/pull/7496) +* [@disrupted](https://github.com/disrupted) made their first contribution in [#7299](https://github.com/pydantic/pydantic/pull/7299) +* [@prodigysml](https://github.com/prodigysml) made their first contribution in [#7360](https://github.com/pydantic/pydantic/pull/7360) + +## v2.3.0 (2023-08-23) + +[GitHub release](https://github.com/pydantic/pydantic/releases/tag/v2.3.0) + +* 🔥 Remove orphaned changes file from repo by [@lig](https://github.com/lig) in [#7168](https://github.com/pydantic/pydantic/pull/7168) +* Add copy button on documentation by [@Kludex](https://github.com/Kludex) in [#7190](https://github.com/pydantic/pydantic/pull/7190) +* Fix docs on JSON type by [@Kludex](https://github.com/Kludex) in [#7189](https://github.com/pydantic/pydantic/pull/7189) +* Update mypy 1.5.0 to 1.5.1 in CI by [@hramezani](https://github.com/hramezani) in [#7191](https://github.com/pydantic/pydantic/pull/7191) +* fix download links badge by [@samuelcolvin](https://github.com/samuelcolvin) in [#7200](https://github.com/pydantic/pydantic/pull/7200) +* add 2.2.1 to changelog by [@samuelcolvin](https://github.com/samuelcolvin) in [#7212](https://github.com/pydantic/pydantic/pull/7212) +* Make ModelWrapValidator protocols generic by [@dmontagu](https://github.com/dmontagu) in [#7154](https://github.com/pydantic/pydantic/pull/7154) +* Correct `Field(..., exclude: bool)` docs by [@samuelcolvin](https://github.com/samuelcolvin) in [#7214](https://github.com/pydantic/pydantic/pull/7214) +* Make shadowing attributes a warning instead of an error by [@adriangb](https://github.com/adriangb) in [#7193](https://github.com/pydantic/pydantic/pull/7193) +* Document `Base64Str` and `Base64Bytes` by [@Kludex](https://github.com/Kludex) in [#7192](https://github.com/pydantic/pydantic/pull/7192) +* Fix `config.defer_build` for serialization first cases by [@samuelcolvin](https://github.com/samuelcolvin) in [#7024](https://github.com/pydantic/pydantic/pull/7024) +* clean Model docstrings in JSON Schema by [@samuelcolvin](https://github.com/samuelcolvin) in [#7210](https://github.com/pydantic/pydantic/pull/7210) +* fix [#7228](https://github.com/pydantic/pydantic/pull/7228) (typo): docs in `validators.md` to correct `validate_default` kwarg by [@lmmx](https://github.com/lmmx) in [#7229](https://github.com/pydantic/pydantic/pull/7229) +* ✅ Implement `tzinfo.fromutc` method for `TzInfo` in `pydantic-core` by [@lig](https://github.com/lig) in [#7019](https://github.com/pydantic/pydantic/pull/7019) +* Support `__get_validators__` by [@hramezani](https://github.com/hramezani) in [#7197](https://github.com/pydantic/pydantic/pull/7197) + +## v2.2.1 (2023-08-18) + +[GitHub release](https://github.com/pydantic/pydantic/releases/tag/v2.2.1) + +* Make `xfail`ing test for root model extra stop `xfail`ing by [@dmontagu](https://github.com/dmontagu) in [#6937](https://github.com/pydantic/pydantic/pull/6937) +* Optimize recursion detection by stopping on the second visit for the same object by [@mciucu](https://github.com/mciucu) in [#7160](https://github.com/pydantic/pydantic/pull/7160) +* fix link in docs by [@tlambert03](https://github.com/tlambert03) in [#7166](https://github.com/pydantic/pydantic/pull/7166) +* Replace MiMalloc w/ default allocator by [@adriangb](https://github.com/adriangb) in [pydantic/pydantic-core#900](https://github.com/pydantic/pydantic-core/pull/900) +* Bump pydantic-core to 2.6.1 and prepare 2.2.1 release by [@adriangb](https://github.com/adriangb) in [#7176](https://github.com/pydantic/pydantic/pull/7176) + +## v2.2.0 (2023-08-17) + +[GitHub release](https://github.com/pydantic/pydantic/releases/tag/v2.2.0) + +* Split "pipx install" setup command into two commands on the documentation site by [@nomadmtb](https://github.com/nomadmtb) in [#6869](https://github.com/pydantic/pydantic/pull/6869) +* Deprecate `Field.include` by [@hramezani](https://github.com/hramezani) in [#6852](https://github.com/pydantic/pydantic/pull/6852) +* Fix typo in default factory error msg by [@hramezani](https://github.com/hramezani) in [#6880](https://github.com/pydantic/pydantic/pull/6880) +* Simplify handling of typing.Annotated in GenerateSchema by [@dmontagu](https://github.com/dmontagu) in [#6887](https://github.com/pydantic/pydantic/pull/6887) +* Re-enable fastapi tests in CI by [@dmontagu](https://github.com/dmontagu) in [#6883](https://github.com/pydantic/pydantic/pull/6883) +* Make it harder to hit collisions with json schema defrefs by [@dmontagu](https://github.com/dmontagu) in [#6566](https://github.com/pydantic/pydantic/pull/6566) +* Cleaner error for invalid input to `Path` fields by [@samuelcolvin](https://github.com/samuelcolvin) in [#6903](https://github.com/pydantic/pydantic/pull/6903) +* :memo: support Coordinate Type by [@yezz123](https://github.com/yezz123) in [#6906](https://github.com/pydantic/pydantic/pull/6906) +* Fix `ForwardRef` wrapper for py 3.10.0 (shim until bpo-45166) by [@randomir](https://github.com/randomir) in [#6919](https://github.com/pydantic/pydantic/pull/6919) +* Fix misbehavior related to copying of RootModel by [@dmontagu](https://github.com/dmontagu) in [#6918](https://github.com/pydantic/pydantic/pull/6918) +* Fix issue with recursion error caused by ParamSpec by [@dmontagu](https://github.com/dmontagu) in [#6923](https://github.com/pydantic/pydantic/pull/6923) +* Add section about Constrained classes to the Migration Guide by [@Kludex](https://github.com/Kludex) in [#6924](https://github.com/pydantic/pydantic/pull/6924) +* Use `main` branch for badge links by [@Viicos](https://github.com/Viicos) in [#6925](https://github.com/pydantic/pydantic/pull/6925) +* Add test for v1/v2 Annotated discrepancy by [@carlbordum](https://github.com/carlbordum) in [#6926](https://github.com/pydantic/pydantic/pull/6926) +* Make the v1 mypy plugin work with both v1 and v2 by [@dmontagu](https://github.com/dmontagu) in [#6921](https://github.com/pydantic/pydantic/pull/6921) +* Fix issue where generic models couldn't be parametrized with BaseModel by [@dmontagu](https://github.com/dmontagu) in [#6933](https://github.com/pydantic/pydantic/pull/6933) +* Remove xfail for discriminated union with alias by [@dmontagu](https://github.com/dmontagu) in [#6938](https://github.com/pydantic/pydantic/pull/6938) +* add field_serializer to computed_field by [@andresliszt](https://github.com/andresliszt) in [#6965](https://github.com/pydantic/pydantic/pull/6965) +* Use union_schema with Type[Union[...]] by [@JeanArhancet](https://github.com/JeanArhancet) in [#6952](https://github.com/pydantic/pydantic/pull/6952) +* Fix inherited typeddict attributes / config by [@adriangb](https://github.com/adriangb) in [#6981](https://github.com/pydantic/pydantic/pull/6981) +* fix dataclass annotated before validator called twice by [@davidhewitt](https://github.com/davidhewitt) in [#6998](https://github.com/pydantic/pydantic/pull/6998) +* Update test-fastapi deselected tests by [@hramezani](https://github.com/hramezani) in [#7014](https://github.com/pydantic/pydantic/pull/7014) +* Fix validator doc format by [@hramezani](https://github.com/hramezani) in [#7015](https://github.com/pydantic/pydantic/pull/7015) +* Fix typo in docstring of model_json_schema by [@AdamVinch-Federated](https://github.com/AdamVinch-Federated) in [#7032](https://github.com/pydantic/pydantic/pull/7032) +* remove unused "type ignores" with pyright by [@samuelcolvin](https://github.com/samuelcolvin) in [#7026](https://github.com/pydantic/pydantic/pull/7026) +* Add benchmark representing FastAPI startup time by [@adriangb](https://github.com/adriangb) in [#7030](https://github.com/pydantic/pydantic/pull/7030) +* Fix json_encoders for Enum subclasses by [@adriangb](https://github.com/adriangb) in [#7029](https://github.com/pydantic/pydantic/pull/7029) +* Update docstring of `ser_json_bytes` regarding base64 encoding by [@Viicos](https://github.com/Viicos) in [#7052](https://github.com/pydantic/pydantic/pull/7052) +* Allow `@validate_call` to work on async methods by [@adriangb](https://github.com/adriangb) in [#7046](https://github.com/pydantic/pydantic/pull/7046) +* Fix: mypy error with `Settings` and `SettingsConfigDict` by [@JeanArhancet](https://github.com/JeanArhancet) in [#7002](https://github.com/pydantic/pydantic/pull/7002) +* Fix some typos (repeated words and it's/its) by [@eumiro](https://github.com/eumiro) in [#7063](https://github.com/pydantic/pydantic/pull/7063) +* Fix the typo in docstring by [@harunyasar](https://github.com/harunyasar) in [#7062](https://github.com/pydantic/pydantic/pull/7062) +* Docs: Fix broken URL in the pydantic-settings package recommendation by [@swetjen](https://github.com/swetjen) in [#6995](https://github.com/pydantic/pydantic/pull/6995) +* Handle constraints being applied to schemas that don't accept it by [@adriangb](https://github.com/adriangb) in [#6951](https://github.com/pydantic/pydantic/pull/6951) +* Replace almost_equal_floats with math.isclose by [@eumiro](https://github.com/eumiro) in [#7082](https://github.com/pydantic/pydantic/pull/7082) +* bump pydantic-core to 2.5.0 by [@davidhewitt](https://github.com/davidhewitt) in [#7077](https://github.com/pydantic/pydantic/pull/7077) +* Add `short_version` and use it in links by [@hramezani](https://github.com/hramezani) in [#7115](https://github.com/pydantic/pydantic/pull/7115) +* 📝 Add usage link to `RootModel` by [@Kludex](https://github.com/Kludex) in [#7113](https://github.com/pydantic/pydantic/pull/7113) +* Revert "Fix default port for mongosrv DSNs (#6827)" by [@Kludex](https://github.com/Kludex) in [#7116](https://github.com/pydantic/pydantic/pull/7116) +* Clarify validate_default and _Unset handling in usage docs and migration guide by [@benbenbang](https://github.com/benbenbang) in [#6950](https://github.com/pydantic/pydantic/pull/6950) +* Tweak documentation of `Field.exclude` by [@Viicos](https://github.com/Viicos) in [#7086](https://github.com/pydantic/pydantic/pull/7086) +* Do not require `validate_assignment` to use `Field.frozen` by [@Viicos](https://github.com/Viicos) in [#7103](https://github.com/pydantic/pydantic/pull/7103) +* tweaks to `_core_utils` by [@samuelcolvin](https://github.com/samuelcolvin) in [#7040](https://github.com/pydantic/pydantic/pull/7040) +* Make DefaultDict working with set by [@hramezani](https://github.com/hramezani) in [#7126](https://github.com/pydantic/pydantic/pull/7126) +* Don't always require typing.Generic as a base for partially parametrized models by [@dmontagu](https://github.com/dmontagu) in [#7119](https://github.com/pydantic/pydantic/pull/7119) +* Fix issue with JSON schema incorrectly using parent class core schema by [@dmontagu](https://github.com/dmontagu) in [#7020](https://github.com/pydantic/pydantic/pull/7020) +* Fix xfailed test related to TypedDict and alias_generator by [@dmontagu](https://github.com/dmontagu) in [#6940](https://github.com/pydantic/pydantic/pull/6940) +* Improve error message for NameEmail by [@dmontagu](https://github.com/dmontagu) in [#6939](https://github.com/pydantic/pydantic/pull/6939) +* Fix generic computed fields by [@dmontagu](https://github.com/dmontagu) in [#6988](https://github.com/pydantic/pydantic/pull/6988) +* Reflect namedtuple default values during validation by [@dmontagu](https://github.com/dmontagu) in [#7144](https://github.com/pydantic/pydantic/pull/7144) +* Update dependencies, fix pydantic-core usage, fix CI issues by [@dmontagu](https://github.com/dmontagu) in [#7150](https://github.com/pydantic/pydantic/pull/7150) +* Add mypy 1.5.0 by [@hramezani](https://github.com/hramezani) in [#7118](https://github.com/pydantic/pydantic/pull/7118) +* Handle non-json native enum values by [@adriangb](https://github.com/adriangb) in [#7056](https://github.com/pydantic/pydantic/pull/7056) +* document `round_trip` in Json type documentation by [@jc-louis](https://github.com/jc-louis) in [#7137](https://github.com/pydantic/pydantic/pull/7137) +* Relax signature checks to better support builtins and C extension functions as validators by [@adriangb](https://github.com/adriangb) in [#7101](https://github.com/pydantic/pydantic/pull/7101) +* add union_mode='left_to_right' by [@davidhewitt](https://github.com/davidhewitt) in [#7151](https://github.com/pydantic/pydantic/pull/7151) +* Include an error message hint for inherited ordering by [@yvalencia91](https://github.com/yvalencia91) in [#7124](https://github.com/pydantic/pydantic/pull/7124) +* Fix one docs link and resolve some warnings for two others by [@dmontagu](https://github.com/dmontagu) in [#7153](https://github.com/pydantic/pydantic/pull/7153) +* Include Field extra keys name in warning by [@hramezani](https://github.com/hramezani) in [#7136](https://github.com/pydantic/pydantic/pull/7136) + +## v2.1.1 (2023-07-25) + +[GitHub release](https://github.com/pydantic/pydantic/releases/tag/v2.1.1) + +* Skip FieldInfo merging when unnecessary by [@dmontagu](https://github.com/dmontagu) in [#6862](https://github.com/pydantic/pydantic/pull/6862) + +## v2.1.0 (2023-07-25) + +[GitHub release](https://github.com/pydantic/pydantic/releases/tag/v2.1.0) + +* Add `StringConstraints` for use as Annotated metadata by [@adriangb](https://github.com/adriangb) in [#6605](https://github.com/pydantic/pydantic/pull/6605) +* Try to fix intermittently failing CI by [@adriangb](https://github.com/adriangb) in [#6683](https://github.com/pydantic/pydantic/pull/6683) +* Remove redundant example of optional vs default. by [@ehiggs-deliverect](https://github.com/ehiggs-deliverect) in [#6676](https://github.com/pydantic/pydantic/pull/6676) +* Docs update by [@samuelcolvin](https://github.com/samuelcolvin) in [#6692](https://github.com/pydantic/pydantic/pull/6692) +* Remove the Validate always section in validator docs by [@adriangb](https://github.com/adriangb) in [#6679](https://github.com/pydantic/pydantic/pull/6679) +* Fix recursion error in json schema generation by [@adriangb](https://github.com/adriangb) in [#6720](https://github.com/pydantic/pydantic/pull/6720) +* Fix incorrect subclass check for secretstr by [@AlexVndnblcke](https://github.com/AlexVndnblcke) in [#6730](https://github.com/pydantic/pydantic/pull/6730) +* update pdm / pdm lockfile to 2.8.0 by [@davidhewitt](https://github.com/davidhewitt) in [#6714](https://github.com/pydantic/pydantic/pull/6714) +* unpin pdm on more CI jobs by [@davidhewitt](https://github.com/davidhewitt) in [#6755](https://github.com/pydantic/pydantic/pull/6755) +* improve source locations for auxiliary packages in docs by [@davidhewitt](https://github.com/davidhewitt) in [#6749](https://github.com/pydantic/pydantic/pull/6749) +* Assume builtins don't accept an info argument by [@adriangb](https://github.com/adriangb) in [#6754](https://github.com/pydantic/pydantic/pull/6754) +* Fix bug where calling `help(BaseModelSubclass)` raises errors by [@hramezani](https://github.com/hramezani) in [#6758](https://github.com/pydantic/pydantic/pull/6758) +* Fix mypy plugin handling of `@model_validator(mode="after")` by [@ljodal](https://github.com/ljodal) in [#6753](https://github.com/pydantic/pydantic/pull/6753) +* update pydantic-core to 2.3.1 by [@davidhewitt](https://github.com/davidhewitt) in [#6756](https://github.com/pydantic/pydantic/pull/6756) +* Mypy plugin for settings by [@hramezani](https://github.com/hramezani) in [#6760](https://github.com/pydantic/pydantic/pull/6760) +* Use `contentSchema` keyword for JSON schema by [@dmontagu](https://github.com/dmontagu) in [#6715](https://github.com/pydantic/pydantic/pull/6715) +* fast-path checking finite decimals by [@davidhewitt](https://github.com/davidhewitt) in [#6769](https://github.com/pydantic/pydantic/pull/6769) +* Docs update by [@samuelcolvin](https://github.com/samuelcolvin) in [#6771](https://github.com/pydantic/pydantic/pull/6771) +* Improve json schema doc by [@hramezani](https://github.com/hramezani) in [#6772](https://github.com/pydantic/pydantic/pull/6772) +* Update validator docs by [@adriangb](https://github.com/adriangb) in [#6695](https://github.com/pydantic/pydantic/pull/6695) +* Fix typehint for wrap validator by [@dmontagu](https://github.com/dmontagu) in [#6788](https://github.com/pydantic/pydantic/pull/6788) +* 🐛 Fix validation warning for unions of Literal and other type by [@lig](https://github.com/lig) in [#6628](https://github.com/pydantic/pydantic/pull/6628) +* Update documentation for generics support in V2 by [@tpdorsey](https://github.com/tpdorsey) in [#6685](https://github.com/pydantic/pydantic/pull/6685) +* add pydantic-core build info to `version_info()` by [@samuelcolvin](https://github.com/samuelcolvin) in [#6785](https://github.com/pydantic/pydantic/pull/6785) +* Fix pydantic dataclasses that use slots with default values by [@dmontagu](https://github.com/dmontagu) in [#6796](https://github.com/pydantic/pydantic/pull/6796) +* Fix inheritance of hash function for frozen models by [@dmontagu](https://github.com/dmontagu) in [#6789](https://github.com/pydantic/pydantic/pull/6789) +* ✨ Add `SkipJsonSchema` annotation by [@Kludex](https://github.com/Kludex) in [#6653](https://github.com/pydantic/pydantic/pull/6653) +* Error if an invalid field name is used with Field by [@dmontagu](https://github.com/dmontagu) in [#6797](https://github.com/pydantic/pydantic/pull/6797) +* Add `GenericModel` to `MOVED_IN_V2` by [@adriangb](https://github.com/adriangb) in [#6776](https://github.com/pydantic/pydantic/pull/6776) +* Remove unused code from `docs/usage/types/custom.md` by [@hramezani](https://github.com/hramezani) in [#6803](https://github.com/pydantic/pydantic/pull/6803) +* Fix `float` -> `Decimal` coercion precision loss by [@adriangb](https://github.com/adriangb) in [#6810](https://github.com/pydantic/pydantic/pull/6810) +* remove email validation from the north star benchmark by [@davidhewitt](https://github.com/davidhewitt) in [#6816](https://github.com/pydantic/pydantic/pull/6816) +* Fix link to mypy by [@progsmile](https://github.com/progsmile) in [#6824](https://github.com/pydantic/pydantic/pull/6824) +* Improve initialization hooks example by [@hramezani](https://github.com/hramezani) in [#6822](https://github.com/pydantic/pydantic/pull/6822) +* Fix default port for mongosrv DSNs by [@dmontagu](https://github.com/dmontagu) in [#6827](https://github.com/pydantic/pydantic/pull/6827) +* Improve API documentation, in particular more links between usage and API docs by [@samuelcolvin](https://github.com/samuelcolvin) in [#6780](https://github.com/pydantic/pydantic/pull/6780) +* update pydantic-core to 2.4.0 by [@davidhewitt](https://github.com/davidhewitt) in [#6831](https://github.com/pydantic/pydantic/pull/6831) +* Fix `annotated_types.MaxLen` validator for custom sequence types by [@ImogenBits](https://github.com/ImogenBits) in [#6809](https://github.com/pydantic/pydantic/pull/6809) +* Update V1 by [@hramezani](https://github.com/hramezani) in [#6833](https://github.com/pydantic/pydantic/pull/6833) +* Make it so callable JSON schema extra works by [@dmontagu](https://github.com/dmontagu) in [#6798](https://github.com/pydantic/pydantic/pull/6798) +* Fix serialization issue with `InstanceOf` by [@dmontagu](https://github.com/dmontagu) in [#6829](https://github.com/pydantic/pydantic/pull/6829) +* Add back support for `json_encoders` by [@adriangb](https://github.com/adriangb) in [#6811](https://github.com/pydantic/pydantic/pull/6811) +* Update field annotations when building the schema by [@dmontagu](https://github.com/dmontagu) in [#6838](https://github.com/pydantic/pydantic/pull/6838) +* Use `WeakValueDictionary` to fix generic memory leak by [@dmontagu](https://github.com/dmontagu) in [#6681](https://github.com/pydantic/pydantic/pull/6681) +* Add `config.defer_build` to optionally make model building lazy by [@samuelcolvin](https://github.com/samuelcolvin) in [#6823](https://github.com/pydantic/pydantic/pull/6823) +* delegate `UUID` serialization to pydantic-core by [@davidhewitt](https://github.com/davidhewitt) in [#6850](https://github.com/pydantic/pydantic/pull/6850) +* Update `json_encoders` docs by [@adriangb](https://github.com/adriangb) in [#6848](https://github.com/pydantic/pydantic/pull/6848) +* Fix error message for `staticmethod`/`classmethod` order with validate_call by [@dmontagu](https://github.com/dmontagu) in [#6686](https://github.com/pydantic/pydantic/pull/6686) +* Improve documentation for `Config` by [@samuelcolvin](https://github.com/samuelcolvin) in [#6847](https://github.com/pydantic/pydantic/pull/6847) +* Update serialization doc to mention `Field.exclude` takes priority over call-time `include/exclude` by [@hramezani](https://github.com/hramezani) in [#6851](https://github.com/pydantic/pydantic/pull/6851) +* Allow customizing core schema generation by making `GenerateSchema` public by [@adriangb](https://github.com/adriangb) in [#6737](https://github.com/pydantic/pydantic/pull/6737) + +## v2.0.3 (2023-07-05) + +[GitHub release](https://github.com/pydantic/pydantic/releases/tag/v2.0.3) + +* Mention PyObject (v1) moving to ImportString (v2) in migration doc by [@slafs](https://github.com/slafs) in [#6456](https://github.com/pydantic/pydantic/pull/6456) +* Fix release-tweet CI by [@Kludex](https://github.com/Kludex) in [#6461](https://github.com/pydantic/pydantic/pull/6461) +* Revise the section on required / optional / nullable fields. by [@ybressler](https://github.com/ybressler) in [#6468](https://github.com/pydantic/pydantic/pull/6468) +* Warn if a type hint is not in fact a type by [@adriangb](https://github.com/adriangb) in [#6479](https://github.com/pydantic/pydantic/pull/6479) +* Replace TransformSchema with GetPydanticSchema by [@dmontagu](https://github.com/dmontagu) in [#6484](https://github.com/pydantic/pydantic/pull/6484) +* Fix the un-hashability of various annotation types, for use in caching generic containers by [@dmontagu](https://github.com/dmontagu) in [#6480](https://github.com/pydantic/pydantic/pull/6480) +* PYD-164: Rework custom types docs by [@adriangb](https://github.com/adriangb) in [#6490](https://github.com/pydantic/pydantic/pull/6490) +* Fix ci by [@adriangb](https://github.com/adriangb) in [#6507](https://github.com/pydantic/pydantic/pull/6507) +* Fix forward ref in generic by [@adriangb](https://github.com/adriangb) in [#6511](https://github.com/pydantic/pydantic/pull/6511) +* Fix generation of serialization JSON schemas for core_schema.ChainSchema by [@dmontagu](https://github.com/dmontagu) in [#6515](https://github.com/pydantic/pydantic/pull/6515) +* Document the change in `Field.alias` behavior in Pydantic V2 by [@hramezani](https://github.com/hramezani) in [#6508](https://github.com/pydantic/pydantic/pull/6508) +* Give better error message attempting to compute the json schema of a model with undefined fields by [@dmontagu](https://github.com/dmontagu) in [#6519](https://github.com/pydantic/pydantic/pull/6519) +* Document `alias_priority` by [@tpdorsey](https://github.com/tpdorsey) in [#6520](https://github.com/pydantic/pydantic/pull/6520) +* Add redirect for types documentation by [@tpdorsey](https://github.com/tpdorsey) in [#6513](https://github.com/pydantic/pydantic/pull/6513) +* Allow updating docs without release by [@samuelcolvin](https://github.com/samuelcolvin) in [#6551](https://github.com/pydantic/pydantic/pull/6551) +* Ensure docs tests always run in the right folder by [@dmontagu](https://github.com/dmontagu) in [#6487](https://github.com/pydantic/pydantic/pull/6487) +* Defer evaluation of return type hints for serializer functions by [@dmontagu](https://github.com/dmontagu) in [#6516](https://github.com/pydantic/pydantic/pull/6516) +* Disable E501 from Ruff and rely on just Black by [@adriangb](https://github.com/adriangb) in [#6552](https://github.com/pydantic/pydantic/pull/6552) +* Update JSON Schema documentation for V2 by [@tpdorsey](https://github.com/tpdorsey) in [#6492](https://github.com/pydantic/pydantic/pull/6492) +* Add documentation of cyclic reference handling by [@dmontagu](https://github.com/dmontagu) in [#6493](https://github.com/pydantic/pydantic/pull/6493) +* Remove the need for change files by [@samuelcolvin](https://github.com/samuelcolvin) in [#6556](https://github.com/pydantic/pydantic/pull/6556) +* add "north star" benchmark by [@davidhewitt](https://github.com/davidhewitt) in [#6547](https://github.com/pydantic/pydantic/pull/6547) +* Update Dataclasses docs by [@tpdorsey](https://github.com/tpdorsey) in [#6470](https://github.com/pydantic/pydantic/pull/6470) +* ♻️ Use different error message on v1 redirects by [@Kludex](https://github.com/Kludex) in [#6595](https://github.com/pydantic/pydantic/pull/6595) +* ⬆ Upgrade `pydantic-core` to v2.2.0 by [@lig](https://github.com/lig) in [#6589](https://github.com/pydantic/pydantic/pull/6589) +* Fix serialization for IPvAny by [@dmontagu](https://github.com/dmontagu) in [#6572](https://github.com/pydantic/pydantic/pull/6572) +* Improve CI by using PDM instead of pip to install typing-extensions by [@adriangb](https://github.com/adriangb) in [#6602](https://github.com/pydantic/pydantic/pull/6602) +* Add `enum` error type docs by [@lig](https://github.com/lig) in [#6603](https://github.com/pydantic/pydantic/pull/6603) +* 🐛 Fix `max_length` for unicode strings by [@lig](https://github.com/lig) in [#6559](https://github.com/pydantic/pydantic/pull/6559) +* Add documentation for accessing features via `pydantic.v1` by [@tpdorsey](https://github.com/tpdorsey) in [#6604](https://github.com/pydantic/pydantic/pull/6604) +* Include extra when iterating over a model by [@adriangb](https://github.com/adriangb) in [#6562](https://github.com/pydantic/pydantic/pull/6562) +* Fix typing of model_validator by [@adriangb](https://github.com/adriangb) in [#6514](https://github.com/pydantic/pydantic/pull/6514) +* Touch up Decimal validator by [@adriangb](https://github.com/adriangb) in [#6327](https://github.com/pydantic/pydantic/pull/6327) +* Fix various docstrings using fixed pytest-examples by [@dmontagu](https://github.com/dmontagu) in [#6607](https://github.com/pydantic/pydantic/pull/6607) +* Handle function validators in a discriminated union by [@dmontagu](https://github.com/dmontagu) in [#6570](https://github.com/pydantic/pydantic/pull/6570) +* Review json_schema.md by [@tpdorsey](https://github.com/tpdorsey) in [#6608](https://github.com/pydantic/pydantic/pull/6608) +* Make validate_call work on basemodel methods by [@dmontagu](https://github.com/dmontagu) in [#6569](https://github.com/pydantic/pydantic/pull/6569) +* add test for big int json serde by [@davidhewitt](https://github.com/davidhewitt) in [#6614](https://github.com/pydantic/pydantic/pull/6614) +* Fix pydantic dataclass problem with dataclasses.field default_factory by [@hramezani](https://github.com/hramezani) in [#6616](https://github.com/pydantic/pydantic/pull/6616) +* Fixed mypy type inference for TypeAdapter by [@zakstucke](https://github.com/zakstucke) in [#6617](https://github.com/pydantic/pydantic/pull/6617) +* Make it work to use None as a generic parameter by [@dmontagu](https://github.com/dmontagu) in [#6609](https://github.com/pydantic/pydantic/pull/6609) +* Make it work to use `$ref` as an alias by [@dmontagu](https://github.com/dmontagu) in [#6568](https://github.com/pydantic/pydantic/pull/6568) +* add note to migration guide about changes to `AnyUrl` etc by [@davidhewitt](https://github.com/davidhewitt) in [#6618](https://github.com/pydantic/pydantic/pull/6618) +* 🐛 Support defining `json_schema_extra` on `RootModel` using `Field` by [@lig](https://github.com/lig) in [#6622](https://github.com/pydantic/pydantic/pull/6622) +* Update pre-commit to prevent commits to main branch on accident by [@dmontagu](https://github.com/dmontagu) in [#6636](https://github.com/pydantic/pydantic/pull/6636) +* Fix PDM CI for python 3.7 on MacOS/windows by [@dmontagu](https://github.com/dmontagu) in [#6627](https://github.com/pydantic/pydantic/pull/6627) +* Produce more accurate signatures for pydantic dataclasses by [@dmontagu](https://github.com/dmontagu) in [#6633](https://github.com/pydantic/pydantic/pull/6633) +* Updates to Url types for Pydantic V2 by [@tpdorsey](https://github.com/tpdorsey) in [#6638](https://github.com/pydantic/pydantic/pull/6638) +* Fix list markdown in `transform` docstring by [@StefanBRas](https://github.com/StefanBRas) in [#6649](https://github.com/pydantic/pydantic/pull/6649) +* simplify slots_dataclass construction to appease mypy by [@davidhewitt](https://github.com/davidhewitt) in [#6639](https://github.com/pydantic/pydantic/pull/6639) +* Update TypedDict schema generation docstring by [@adriangb](https://github.com/adriangb) in [#6651](https://github.com/pydantic/pydantic/pull/6651) +* Detect and lint-error for prints by [@dmontagu](https://github.com/dmontagu) in [#6655](https://github.com/pydantic/pydantic/pull/6655) +* Add xfailing test for pydantic-core PR 766 by [@dmontagu](https://github.com/dmontagu) in [#6641](https://github.com/pydantic/pydantic/pull/6641) +* Ignore unrecognized fields from dataclasses metadata by [@dmontagu](https://github.com/dmontagu) in [#6634](https://github.com/pydantic/pydantic/pull/6634) +* Make non-existent class getattr a mypy error by [@dmontagu](https://github.com/dmontagu) in [#6658](https://github.com/pydantic/pydantic/pull/6658) +* Update pydantic-core to 2.3.0 by [@hramezani](https://github.com/hramezani) in [#6648](https://github.com/pydantic/pydantic/pull/6648) +* Use OrderedDict from typing_extensions by [@dmontagu](https://github.com/dmontagu) in [#6664](https://github.com/pydantic/pydantic/pull/6664) +* Fix typehint for JSON schema extra callable by [@dmontagu](https://github.com/dmontagu) in [#6659](https://github.com/pydantic/pydantic/pull/6659) + +## v2.0.2 (2023-07-05) + +[GitHub release](https://github.com/pydantic/pydantic/releases/tag/v2.0.2) + +* Fix bug where round-trip pickling/unpickling a `RootModel` would change the value of `__dict__`, [#6457](https://github.com/pydantic/pydantic/pull/6457) by [@dmontagu](https://github.com/dmontagu) +* Allow single-item discriminated unions, [#6405](https://github.com/pydantic/pydantic/pull/6405) by [@dmontagu](https://github.com/dmontagu) +* Fix issue with union parsing of enums, [#6440](https://github.com/pydantic/pydantic/pull/6440) by [@dmontagu](https://github.com/dmontagu) +* Docs: Fixed `constr` documentation, renamed old `regex` to new `pattern`, [#6452](https://github.com/pydantic/pydantic/pull/6452) by [@miili](https://github.com/miili) +* Change `GenerateJsonSchema.generate_definitions` signature, [#6436](https://github.com/pydantic/pydantic/pull/6436) by [@dmontagu](https://github.com/dmontagu) + +See the full changelog [here](https://github.com/pydantic/pydantic/releases/tag/v2.0.2) + +## v2.0.1 (2023-07-04) + +[GitHub release](https://github.com/pydantic/pydantic/releases/tag/v2.0.1) + +First patch release of Pydantic V2 + +* Extra fields added via `setattr` (i.e. `m.some_extra_field = 'extra_value'`) + are added to `.model_extra` if `model_config` `extra='allowed'`. Fixed [#6333](https://github.com/pydantic/pydantic/pull/6333), [#6365](https://github.com/pydantic/pydantic/pull/6365) by [@aaraney](https://github.com/aaraney) +* Automatically unpack JSON schema '$ref' for custom types, [#6343](https://github.com/pydantic/pydantic/pull/6343) by [@adriangb](https://github.com/adriangb) +* Fix tagged unions multiple processing in submodels, [#6340](https://github.com/pydantic/pydantic/pull/6340) by [@suharnikov](https://github.com/suharnikov) + +See the full changelog [here](https://github.com/pydantic/pydantic/releases/tag/v2.0.1) + +## v2.0 (2023-06-30) + +[GitHub release](https://github.com/pydantic/pydantic/releases/tag/v2.0) + +Pydantic V2 is here! :tada: + +See [this post](https://docs.pydantic.dev/2.0/blog/pydantic-v2-final/) for more details. + +## v2.0b3 (2023-06-16) + +Third beta pre-release of Pydantic V2 + +See the full changelog [here](https://github.com/pydantic/pydantic/releases/tag/v2.0b3) + +## v2.0b2 (2023-06-03) + +Add `from_attributes` runtime flag to `TypeAdapter.validate_python` and `BaseModel.model_validate`. + +See the full changelog [here](https://github.com/pydantic/pydantic/releases/tag/v2.0b2) + +## v2.0b1 (2023-06-01) + +First beta pre-release of Pydantic V2 + +See the full changelog [here](https://github.com/pydantic/pydantic/releases/tag/v2.0b1) + +## v2.0a4 (2023-05-05) + +Fourth pre-release of Pydantic V2 + +See the full changelog [here](https://github.com/pydantic/pydantic/releases/tag/v2.0a4) + +## v2.0a3 (2023-04-20) + +Third pre-release of Pydantic V2 + +See the full changelog [here](https://github.com/pydantic/pydantic/releases/tag/v2.0a3) + +## v2.0a2 (2023-04-12) + +Second pre-release of Pydantic V2 + +See the full changelog [here](https://github.com/pydantic/pydantic/releases/tag/v2.0a2) + +## v2.0a1 (2023-04-03) + +First pre-release of Pydantic V2! + +See [this post](https://docs.pydantic.dev/blog/pydantic-v2-alpha/) for more details. + +## v1.10.13 (2023-09-27) + +* Fix: Add max length check to `pydantic.validate_email`, [#7673](https://github.com/pydantic/pydantic/issues/7673) by [@hramezani](https://github.com/hramezani) +* Docs: Fix pip commands to install v1, [#6930](https://github.com/pydantic/pydantic/issues/6930) by [@chbndrhnns](https://github.com/chbndrhnns) + +## v1.10.12 (2023-07-24) + +* Fixes the `maxlen` property being dropped on `deque` validation. Happened only if the deque item has been typed. Changes the `_validate_sequence_like` func, [#6581](https://github.com/pydantic/pydantic/pull/6581) by [@maciekglowka](https://github.com/maciekglowka) + +## v1.10.11 (2023-07-04) + +* Importing create_model in tools.py through relative path instead of absolute path - so that it doesn't import V2 code when copied over to V2 branch, [#6361](https://github.com/pydantic/pydantic/pull/6361) by [@SharathHuddar](https://github.com/SharathHuddar) + +## v1.10.10 (2023-06-30) + +* Add Pydantic `Json` field support to settings management, [#6250](https://github.com/pydantic/pydantic/pull/6250) by [@hramezani](https://github.com/hramezani) +* Fixed literal validator errors for unhashable values, [#6188](https://github.com/pydantic/pydantic/pull/6188) by [@markus1978](https://github.com/markus1978) +* Fixed bug with generics receiving forward refs, [#6130](https://github.com/pydantic/pydantic/pull/6130) by [@mark-todd](https://github.com/mark-todd) +* Update install method of FastAPI for internal tests in CI, [#6117](https://github.com/pydantic/pydantic/pull/6117) by [@Kludex](https://github.com/Kludex) + +## v1.10.9 (2023-06-07) + +* Fix trailing zeros not ignored in Decimal validation, [#5968](https://github.com/pydantic/pydantic/pull/5968) by [@hramezani](https://github.com/hramezani) +* Fix mypy plugin for v1.4.0, [#5928](https://github.com/pydantic/pydantic/pull/5928) by [@cdce8p](https://github.com/cdce8p) +* Add future and past date hypothesis strategies, [#5850](https://github.com/pydantic/pydantic/pull/5850) by [@bschoenmaeckers](https://github.com/bschoenmaeckers) +* Discourage usage of Cython 3 with Pydantic 1.x, [#5845](https://github.com/pydantic/pydantic/pull/5845) by [@lig](https://github.com/lig) + +## v1.10.8 (2023-05-23) + +* Fix a bug in `Literal` usage with `typing-extension==4.6.0`, [#5826](https://github.com/pydantic/pydantic/pull/5826) by [@hramezani](https://github.com/hramezani) +* This solves the (closed) issue [#3849](https://github.com/pydantic/pydantic/pull/3849) where aliased fields that use discriminated union fail to validate when the data contains the non-aliased field name, [#5736](https://github.com/pydantic/pydantic/pull/5736) by [@benwah](https://github.com/benwah) +* Update email-validator dependency to >=2.0.0post2, [#5627](https://github.com/pydantic/pydantic/pull/5627) by [@adriangb](https://github.com/adriangb) +* update `AnyClassMethod` for changes in [python/typeshed#9771](https://github.com/python/typeshed/issues/9771), [#5505](https://github.com/pydantic/pydantic/pull/5505) by [@ITProKyle](https://github.com/ITProKyle) + +## v1.10.7 (2023-03-22) + +* Fix creating schema from model using `ConstrainedStr` with `regex` as dict key, [#5223](https://github.com/pydantic/pydantic/pull/5223) by [@matejetz](https://github.com/matejetz) +* Address bug in mypy plugin caused by explicit_package_bases=True, [#5191](https://github.com/pydantic/pydantic/pull/5191) by [@dmontagu](https://github.com/dmontagu) +* Add implicit defaults in the mypy plugin for Field with no default argument, [#5190](https://github.com/pydantic/pydantic/pull/5190) by [@dmontagu](https://github.com/dmontagu) +* Fix schema generated for Enum values used as Literals in discriminated unions, [#5188](https://github.com/pydantic/pydantic/pull/5188) by [@javibookline](https://github.com/javibookline) +* Fix mypy failures caused by the pydantic mypy plugin when users define `from_orm` in their own classes, [#5187](https://github.com/pydantic/pydantic/pull/5187) by [@dmontagu](https://github.com/dmontagu) +* Fix `InitVar` usage with pydantic dataclasses, mypy version `1.1.1` and the custom mypy plugin, [#5162](https://github.com/pydantic/pydantic/pull/5162) by [@cdce8p](https://github.com/cdce8p) + +## v1.10.6 (2023-03-08) + +* Implement logic to support creating validators from non standard callables by using defaults to identify them and unwrapping `functools.partial` and `functools.partialmethod` when checking the signature, [#5126](https://github.com/pydantic/pydantic/pull/5126) by [@JensHeinrich](https://github.com/JensHeinrich) +* Fix mypy plugin for v1.1.1, and fix `dataclass_transform` decorator for pydantic dataclasses, [#5111](https://github.com/pydantic/pydantic/pull/5111) by [@cdce8p](https://github.com/cdce8p) +* Raise `ValidationError`, not `ConfigError`, when a discriminator value is unhashable, [#4773](https://github.com/pydantic/pydantic/pull/4773) by [@kurtmckee](https://github.com/kurtmckee) + +## v1.10.5 (2023-02-15) + +* Fix broken parametrized bases handling with `GenericModel`s with complex sets of models, [#5052](https://github.com/pydantic/pydantic/pull/5052) by [@MarkusSintonen](https://github.com/MarkusSintonen) +* Invalidate mypy cache if plugin config changes, [#5007](https://github.com/pydantic/pydantic/pull/5007) by [@cdce8p](https://github.com/cdce8p) +* Fix `RecursionError` when deep-copying dataclass types wrapped by pydantic, [#4949](https://github.com/pydantic/pydantic/pull/4949) by [@mbillingr](https://github.com/mbillingr) +* Fix `X | Y` union syntax breaking `GenericModel`, [#4146](https://github.com/pydantic/pydantic/pull/4146) by [@thenx](https://github.com/thenx) +* Switch coverage badge to show coverage for this branch/release, [#5060](https://github.com/pydantic/pydantic/pull/5060) by [@samuelcolvin](https://github.com/samuelcolvin) + +## v1.10.4 (2022-12-30) + +* Change dependency to `typing-extensions>=4.2.0`, [#4885](https://github.com/pydantic/pydantic/pull/4885) by [@samuelcolvin](https://github.com/samuelcolvin) + +## v1.10.3 (2022-12-29) + +**NOTE: v1.10.3 was ["yanked"](https://pypi.org/help/#yanked) from PyPI due to [#4885](https://github.com/pydantic/pydantic/pull/4885) which is fixed in v1.10.4** + +* fix parsing of custom root models, [#4883](https://github.com/pydantic/pydantic/pull/4883) by [@gou177](https://github.com/gou177) +* fix: use dataclass proxy for frozen or empty dataclasses, [#4878](https://github.com/pydantic/pydantic/pull/4878) by [@PrettyWood](https://github.com/PrettyWood) +* Fix `schema` and `schema_json` on models where a model instance is a one of default values, [#4781](https://github.com/pydantic/pydantic/pull/4781) by [@Bobronium](https://github.com/Bobronium) +* Add Jina AI to sponsors on docs index page, [#4767](https://github.com/pydantic/pydantic/pull/4767) by [@samuelcolvin](https://github.com/samuelcolvin) +* fix: support assignment on `DataclassProxy`, [#4695](https://github.com/pydantic/pydantic/pull/4695) by [@PrettyWood](https://github.com/PrettyWood) +* Add `postgresql+psycopg` as allowed scheme for `PostgreDsn` to make it usable with SQLAlchemy 2, [#4689](https://github.com/pydantic/pydantic/pull/4689) by [@morian](https://github.com/morian) +* Allow dict schemas to have both `patternProperties` and `additionalProperties`, [#4641](https://github.com/pydantic/pydantic/pull/4641) by [@jparise](https://github.com/jparise) +* Fixes error passing None for optional lists with `unique_items`, [#4568](https://github.com/pydantic/pydantic/pull/4568) by [@mfulgo](https://github.com/mfulgo) +* Fix `GenericModel` with `Callable` param raising a `TypeError`, [#4551](https://github.com/pydantic/pydantic/pull/4551) by [@mfulgo](https://github.com/mfulgo) +* Fix field regex with `StrictStr` type annotation, [#4538](https://github.com/pydantic/pydantic/pull/4538) by [@sisp](https://github.com/sisp) +* Correct `dataclass_transform` keyword argument name from `field_descriptors` to `field_specifiers`, [#4500](https://github.com/pydantic/pydantic/pull/4500) by [@samuelcolvin](https://github.com/samuelcolvin) +* fix: avoid multiple calls of `__post_init__` when dataclasses are inherited, [#4487](https://github.com/pydantic/pydantic/pull/4487) by [@PrettyWood](https://github.com/PrettyWood) +* Reduce the size of binary wheels, [#2276](https://github.com/pydantic/pydantic/pull/2276) by [@samuelcolvin](https://github.com/samuelcolvin) + +## v1.10.2 (2022-09-05) + +* **Revert Change:** Revert percent encoding of URL parts which was originally added in [#4224](https://github.com/pydantic/pydantic/pull/4224), [#4470](https://github.com/pydantic/pydantic/pull/4470) by [@samuelcolvin](https://github.com/samuelcolvin) +* Prevent long (length > `4_300`) strings/bytes as input to int fields, see + [python/cpython#95778](https://github.com/python/cpython/issues/95778) and + [CVE-2020-10735](https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2020-10735), [#1477](https://github.com/pydantic/pydantic/pull/1477) by [@samuelcolvin](https://github.com/samuelcolvin) +* fix: dataclass wrapper was not always called, [#4477](https://github.com/pydantic/pydantic/pull/4477) by [@PrettyWood](https://github.com/PrettyWood) +* Use `tomllib` on Python 3.11 when parsing `mypy` configuration, [#4476](https://github.com/pydantic/pydantic/pull/4476) by [@hauntsaninja](https://github.com/hauntsaninja) +* Basic fix of `GenericModel` cache to detect order of arguments in `Union` models, [#4474](https://github.com/pydantic/pydantic/pull/4474) by [@sveinugu](https://github.com/sveinugu) +* Fix mypy plugin when using bare types like `list` and `dict` as `default_factory`, [#4457](https://github.com/pydantic/pydantic/pull/4457) by [@samuelcolvin](https://github.com/samuelcolvin) + +## v1.10.1 (2022-08-31) + +* Add `__hash__` method to `pydancic.color.Color` class, [#4454](https://github.com/pydantic/pydantic/pull/4454) by [@czaki](https://github.com/czaki) + +## v1.10.0 (2022-08-30) + +* Refactor the whole _pydantic_ `dataclass` decorator to really act like its standard lib equivalent. + It hence keeps `__eq__`, `__hash__`, ... and makes comparison with its non-validated version possible. + It also fixes usage of `frozen` dataclasses in fields and usage of `default_factory` in nested dataclasses. + The support of `Config.extra` has been added. + Finally, config customization directly via a `dict` is now possible, [#2557](https://github.com/pydantic/pydantic/pull/2557) by [@PrettyWood](https://github.com/PrettyWood) +

    + **BREAKING CHANGES:** + - The `compiled` boolean (whether _pydantic_ is compiled with cython) has been moved from `main.py` to `version.py` + - Now that `Config.extra` is supported, `dataclass` ignores by default extra arguments (like `BaseModel`) +* Fix PEP487 `__set_name__` protocol in `BaseModel` for PrivateAttrs, [#4407](https://github.com/pydantic/pydantic/pull/4407) by [@tlambert03](https://github.com/tlambert03) +* Allow for custom parsing of environment variables via `parse_env_var` in `Config`, [#4406](https://github.com/pydantic/pydantic/pull/4406) by [@acmiyaguchi](https://github.com/acmiyaguchi) +* Rename `master` to `main`, [#4405](https://github.com/pydantic/pydantic/pull/4405) by [@hramezani](https://github.com/hramezani) +* Fix `StrictStr` does not raise `ValidationError` when `max_length` is present in `Field`, [#4388](https://github.com/pydantic/pydantic/pull/4388) by [@hramezani](https://github.com/hramezani) +* Make `SecretStr` and `SecretBytes` hashable, [#4387](https://github.com/pydantic/pydantic/pull/4387) by [@chbndrhnns](https://github.com/chbndrhnns) +* Fix `StrictBytes` does not raise `ValidationError` when `max_length` is present in `Field`, [#4380](https://github.com/pydantic/pydantic/pull/4380) by [@JeanArhancet](https://github.com/JeanArhancet) +* Add support for bare `type`, [#4375](https://github.com/pydantic/pydantic/pull/4375) by [@hramezani](https://github.com/hramezani) +* Support Python 3.11, including binaries for 3.11 in PyPI, [#4374](https://github.com/pydantic/pydantic/pull/4374) by [@samuelcolvin](https://github.com/samuelcolvin) +* Add support for `re.Pattern`, [#4366](https://github.com/pydantic/pydantic/pull/4366) by [@hramezani](https://github.com/hramezani) +* Fix `__post_init_post_parse__` is incorrectly passed keyword arguments when no `__post_init__` is defined, [#4361](https://github.com/pydantic/pydantic/pull/4361) by [@hramezani](https://github.com/hramezani) +* Fix implicitly importing `ForwardRef` and `Callable` from `pydantic.typing` instead of `typing` and also expose `MappingIntStrAny`, [#4358](https://github.com/pydantic/pydantic/pull/4358) by [@aminalaee](https://github.com/aminalaee) +* remove `Any` types from the `dataclass` decorator so it can be used with the `disallow_any_expr` mypy option, [#4356](https://github.com/pydantic/pydantic/pull/4356) by [@DetachHead](https://github.com/DetachHead) +* moved repo to `pydantic/pydantic`, [#4348](https://github.com/pydantic/pydantic/pull/4348) by [@yezz123](https://github.com/yezz123) +* fix "extra fields not permitted" error when dataclass with `Extra.forbid` is validated multiple times, [#4343](https://github.com/pydantic/pydantic/pull/4343) by [@detachhead](https://github.com/detachhead) +* Add Python 3.9 and 3.10 examples to docs, [#4339](https://github.com/pydantic/pydantic/pull/4339) by [@Bobronium](https://github.com/Bobronium) +* Discriminated union models now use `oneOf` instead of `anyOf` when generating OpenAPI schema definitions, [#4335](https://github.com/pydantic/pydantic/pull/4335) by [@MaxwellPayne](https://github.com/MaxwellPayne) +* Allow type checkers to infer inner type of `Json` type. `Json[list[str]]` will be now inferred as `list[str]`, + `Json[Any]` should be used instead of plain `Json`. + Runtime behaviour is not changed, [#4332](https://github.com/pydantic/pydantic/pull/4332) by [@Bobronium](https://github.com/Bobronium) +* Allow empty string aliases by using a `alias is not None` check, rather than `bool(alias)`, [#4253](https://github.com/pydantic/pydantic/pull/4253) by [@sergeytsaplin](https://github.com/sergeytsaplin) +* Update `ForwardRef`s in `Field.outer_type_`, [#4249](https://github.com/pydantic/pydantic/pull/4249) by [@JacobHayes](https://github.com/JacobHayes) +* The use of `__dataclass_transform__` has been replaced by `typing_extensions.dataclass_transform`, which is the preferred way to mark pydantic models as a dataclass under [PEP 681](https://peps.python.org/pep-0681/), [#4241](https://github.com/pydantic/pydantic/pull/4241) by [@multimeric](https://github.com/multimeric) +* Use parent model's `Config` when validating nested `NamedTuple` fields, [#4219](https://github.com/pydantic/pydantic/pull/4219) by [@synek](https://github.com/synek) +* Update `BaseModel.construct` to work with aliased Fields, [#4192](https://github.com/pydantic/pydantic/pull/4192) by [@kylebamos](https://github.com/kylebamos) +* Catch certain raised errors in `smart_deepcopy` and revert to `deepcopy` if so, [#4184](https://github.com/pydantic/pydantic/pull/4184) by [@coneybeare](https://github.com/coneybeare) +* Add `Config.anystr_upper` and `to_upper` kwarg to constr and conbytes, [#4165](https://github.com/pydantic/pydantic/pull/4165) by [@satheler](https://github.com/satheler) +* Fix JSON schema for `set` and `frozenset` when they include default values, [#4155](https://github.com/pydantic/pydantic/pull/4155) by [@aminalaee](https://github.com/aminalaee) +* Teach the mypy plugin that methods decorated by `@validator` are classmethods, [#4102](https://github.com/pydantic/pydantic/pull/4102) by [@DMRobertson](https://github.com/DMRobertson) +* Improve mypy plugin's ability to detect required fields, [#4086](https://github.com/pydantic/pydantic/pull/4086) by [@richardxia](https://github.com/richardxia) +* Support fields of type `Type[]` in schema, [#4051](https://github.com/pydantic/pydantic/pull/4051) by [@aminalaee](https://github.com/aminalaee) +* Add `default` value in JSON Schema when `const=True`, [#4031](https://github.com/pydantic/pydantic/pull/4031) by [@aminalaee](https://github.com/aminalaee) +* Adds reserved word check to signature generation logic, [#4011](https://github.com/pydantic/pydantic/pull/4011) by [@strue36](https://github.com/strue36) +* Fix Json strategy failure for the complex nested field, [#4005](https://github.com/pydantic/pydantic/pull/4005) by [@sergiosim](https://github.com/sergiosim) +* Add JSON-compatible float constraint `allow_inf_nan`, [#3994](https://github.com/pydantic/pydantic/pull/3994) by [@tiangolo](https://github.com/tiangolo) +* Remove undefined behaviour when `env_prefix` had characters in common with `env_nested_delimiter`, [#3975](https://github.com/pydantic/pydantic/pull/3975) by [@arsenron](https://github.com/arsenron) +* Support generics model with `create_model`, [#3945](https://github.com/pydantic/pydantic/pull/3945) by [@hot123s](https://github.com/hot123s) +* allow submodels to overwrite extra field info, [#3934](https://github.com/pydantic/pydantic/pull/3934) by [@PrettyWood](https://github.com/PrettyWood) +* Document and test structural pattern matching ([PEP 636](https://peps.python.org/pep-0636/)) on `BaseModel`, [#3920](https://github.com/pydantic/pydantic/pull/3920) by [@irgolic](https://github.com/irgolic) +* Fix incorrect deserialization of python timedelta object to ISO 8601 for negative time deltas. + Minus was serialized in incorrect place ("P-1DT23H59M59.888735S" instead of correct "-P1DT23H59M59.888735S"), [#3899](https://github.com/pydantic/pydantic/pull/3899) by [@07pepa](https://github.com/07pepa) +* Fix validation of discriminated union fields with an alias when passing a model instance, [#3846](https://github.com/pydantic/pydantic/pull/3846) by [@chornsby](https://github.com/chornsby) +* Add a CockroachDsn type to validate CockroachDB connection strings. The type + supports the following schemes: `cockroachdb`, `cockroachdb+psycopg2` and `cockroachdb+asyncpg`, [#3839](https://github.com/pydantic/pydantic/pull/3839) by [@blubber](https://github.com/blubber) +* Fix MyPy plugin to not override pre-existing `__init__` method in models, [#3824](https://github.com/pydantic/pydantic/pull/3824) by [@patrick91](https://github.com/patrick91) +* Fix mypy version checking, [#3783](https://github.com/pydantic/pydantic/pull/3783) by [@KotlinIsland](https://github.com/KotlinIsland) +* support overwriting dunder attributes of `BaseModel` instances, [#3777](https://github.com/pydantic/pydantic/pull/3777) by [@PrettyWood](https://github.com/PrettyWood) +* Added `ConstrainedDate` and `condate`, [#3740](https://github.com/pydantic/pydantic/pull/3740) by [@hottwaj](https://github.com/hottwaj) +* Support `kw_only` in dataclasses, [#3670](https://github.com/pydantic/pydantic/pull/3670) by [@detachhead](https://github.com/detachhead) +* Add comparison method for `Color` class, [#3646](https://github.com/pydantic/pydantic/pull/3646) by [@aminalaee](https://github.com/aminalaee) +* Drop support for python3.6, associated cleanup, [#3605](https://github.com/pydantic/pydantic/pull/3605) by [@samuelcolvin](https://github.com/samuelcolvin) +* created new function `to_lower_camel()` for "non pascal case" camel case, [#3463](https://github.com/pydantic/pydantic/pull/3463) by [@schlerp](https://github.com/schlerp) +* Add checks to `default` and `default_factory` arguments in Mypy plugin, [#3430](https://github.com/pydantic/pydantic/pull/3430) by [@klaa97](https://github.com/klaa97) +* fix mangling of `inspect.signature` for `BaseModel`, [#3413](https://github.com/pydantic/pydantic/pull/3413) by [@fix-inspect-signature](https://github.com/fix-inspect-signature) +* Adds the `SecretField` abstract class so that all the current and future secret fields like `SecretStr` and `SecretBytes` will derive from it, [#3409](https://github.com/pydantic/pydantic/pull/3409) by [@expobrain](https://github.com/expobrain) +* Support multi hosts validation in `PostgresDsn`, [#3337](https://github.com/pydantic/pydantic/pull/3337) by [@rglsk](https://github.com/rglsk) +* Fix parsing of very small numeric timedelta values, [#3315](https://github.com/pydantic/pydantic/pull/3315) by [@samuelcolvin](https://github.com/samuelcolvin) +* Update `SecretsSettingsSource` to respect `config.case_sensitive`, [#3273](https://github.com/pydantic/pydantic/pull/3273) by [@JeanArhancet](https://github.com/JeanArhancet) +* Add MongoDB network data source name (DSN) schema, [#3229](https://github.com/pydantic/pydantic/pull/3229) by [@snosratiershad](https://github.com/snosratiershad) +* Add support for multiple dotenv files, [#3222](https://github.com/pydantic/pydantic/pull/3222) by [@rekyungmin](https://github.com/rekyungmin) +* Raise an explicit `ConfigError` when multiple fields are incorrectly set for a single validator, [#3215](https://github.com/pydantic/pydantic/pull/3215) by [@SunsetOrange](https://github.com/SunsetOrange) +* Allow ellipsis on `Field`s inside `Annotated` for `TypedDicts` required, [#3133](https://github.com/pydantic/pydantic/pull/3133) by [@ezegomez](https://github.com/ezegomez) +* Catch overflow errors in `int_validator`, [#3112](https://github.com/pydantic/pydantic/pull/3112) by [@ojii](https://github.com/ojii) +* Adds a `__rich_repr__` method to `Representation` class which enables pretty printing with [Rich](https://github.com/willmcgugan/rich), [#3099](https://github.com/pydantic/pydantic/pull/3099) by [@willmcgugan](https://github.com/willmcgugan) +* Add percent encoding in `AnyUrl` and descendent types, [#3061](https://github.com/pydantic/pydantic/pull/3061) by [@FaresAhmedb](https://github.com/FaresAhmedb) +* `validate_arguments` decorator now supports `alias`, [#3019](https://github.com/pydantic/pydantic/pull/3019) by [@MAD-py](https://github.com/MAD-py) +* Avoid `__dict__` and `__weakref__` attributes in `AnyUrl` and IP address fields, [#2890](https://github.com/pydantic/pydantic/pull/2890) by [@nuno-andre](https://github.com/nuno-andre) +* Add ability to use `Final` in a field type annotation, [#2766](https://github.com/pydantic/pydantic/pull/2766) by [@uriyyo](https://github.com/uriyyo) +* Update requirement to `typing_extensions>=4.1.0` to guarantee `dataclass_transform` is available, [#4424](https://github.com/pydantic/pydantic/pull/4424) by [@commonism](https://github.com/commonism) +* Add Explosion and AWS to main sponsors, [#4413](https://github.com/pydantic/pydantic/pull/4413) by [@samuelcolvin](https://github.com/samuelcolvin) +* Update documentation for `copy_on_model_validation` to reflect recent changes, [#4369](https://github.com/pydantic/pydantic/pull/4369) by [@samuelcolvin](https://github.com/samuelcolvin) +* Runtime warning if `__slots__` is passed to `create_model`, `__slots__` is then ignored, [#4432](https://github.com/pydantic/pydantic/pull/4432) by [@samuelcolvin](https://github.com/samuelcolvin) +* Add type hints to `BaseSettings.Config` to avoid mypy errors, also correct mypy version compatibility notice in docs, [#4450](https://github.com/pydantic/pydantic/pull/4450) by [@samuelcolvin](https://github.com/samuelcolvin) + +## v1.10.0b1 (2022-08-24) + +Pre-release, see [the GitHub release](https://github.com/pydantic/pydantic/releases/tag/v1.10.0b1) for details. + +## v1.10.0a2 (2022-08-24) + +Pre-release, see [the GitHub release](https://github.com/pydantic/pydantic/releases/tag/v1.10.0a2) for details. + +## v1.10.0a1 (2022-08-22) + +Pre-release, see [the GitHub release](https://github.com/pydantic/pydantic/releases/tag/v1.10.0a1) for details. + +## v1.9.2 (2022-08-11) + +**Revert Breaking Change**: _v1.9.1_ introduced a breaking change where model fields were +deep copied by default, this release reverts the default behaviour to match _v1.9.0_ and before, +while also allow deep-copy behaviour via `copy_on_model_validation = 'deep'`. See [#4092](https://github.com/pydantic/pydantic/pull/4092) for more information. + +* Allow for shallow copies of model fields, `Config.copy_on_model_validation` is now a str which must be + `'none'`, `'deep'`, or `'shallow'` corresponding to not copying, deep copy & shallow copy; default `'shallow'`, + [#4093](https://github.com/pydantic/pydantic/pull/4093) by [@timkpaine](https://github.com/timkpaine) + +## v1.9.1 (2022-05-19) + +Thank you to pydantic's sponsors: +[@tiangolo](https://github.com/tiangolo), [@stellargraph](https://github.com/stellargraph), [@JonasKs](https://github.com/JonasKs), [@grillazz](https://github.com/grillazz), [@Mazyod](https://github.com/Mazyod), [@kevinalh](https://github.com/kevinalh), [@chdsbd](https://github.com/chdsbd), [@povilasb](https://github.com/povilasb), [@povilasb](https://github.com/povilasb), [@jina-ai](https://github.com/jina-ai), +[@mainframeindustries](https://github.com/mainframeindustries), [@robusta-dev](https://github.com/robusta-dev), [@SendCloud](https://github.com/SendCloud), [@rszamszur](https://github.com/rszamszur), [@jodal](https://github.com/jodal), [@hardbyte](https://github.com/hardbyte), [@corleyma](https://github.com/corleyma), [@daddycocoaman](https://github.com/daddycocoaman), +[@Rehket](https://github.com/Rehket), [@jokull](https://github.com/jokull), [@reillysiemens](https://github.com/reillysiemens), [@westonsteimel](https://github.com/westonsteimel), [@primer-io](https://github.com/primer-io), [@koxudaxi](https://github.com/koxudaxi), [@browniebroke](https://github.com/browniebroke), [@stradivari96](https://github.com/stradivari96), +[@adriangb](https://github.com/adriangb), [@kamalgill](https://github.com/kamalgill), [@jqueguiner](https://github.com/jqueguiner), [@dev-zero](https://github.com/dev-zero), [@datarootsio](https://github.com/datarootsio), [@RedCarpetUp](https://github.com/RedCarpetUp) +for their kind support. + +* Limit the size of `generics._generic_types_cache` and `generics._assigned_parameters` + to avoid unlimited increase in memory usage, [#4083](https://github.com/pydantic/pydantic/pull/4083) by [@samuelcolvin](https://github.com/samuelcolvin) +* Add Jupyverse and FPS as Jupyter projects using pydantic, [#4082](https://github.com/pydantic/pydantic/pull/4082) by [@davidbrochart](https://github.com/davidbrochart) +* Speedup `__isinstancecheck__` on pydantic models when the type is not a model, may also avoid memory "leaks", [#4081](https://github.com/pydantic/pydantic/pull/4081) by [@samuelcolvin](https://github.com/samuelcolvin) +* Fix in-place modification of `FieldInfo` that caused problems with PEP 593 type aliases, [#4067](https://github.com/pydantic/pydantic/pull/4067) by [@adriangb](https://github.com/adriangb) +* Add support for autocomplete in VS Code via `__dataclass_transform__` when using `pydantic.dataclasses.dataclass`, [#4006](https://github.com/pydantic/pydantic/pull/4006) by [@giuliano-oliveira](https://github.com/giuliano-oliveira) +* Remove benchmarks from codebase and docs, [#3973](https://github.com/pydantic/pydantic/pull/3973) by [@samuelcolvin](https://github.com/samuelcolvin) +* Typing checking with pyright in CI, improve docs on vscode/pylance/pyright, [#3972](https://github.com/pydantic/pydantic/pull/3972) by [@samuelcolvin](https://github.com/samuelcolvin) +* Fix nested Python dataclass schema regression, [#3819](https://github.com/pydantic/pydantic/pull/3819) by [@himbeles](https://github.com/himbeles) +* Update documentation about lazy evaluation of sources for Settings, [#3806](https://github.com/pydantic/pydantic/pull/3806) by [@garyd203](https://github.com/garyd203) +* Prevent subclasses of bytes being converted to bytes, [#3706](https://github.com/pydantic/pydantic/pull/3706) by [@samuelcolvin](https://github.com/samuelcolvin) +* Fixed "error checking inheritance of" when using PEP585 and PEP604 type hints, [#3681](https://github.com/pydantic/pydantic/pull/3681) by [@aleksul](https://github.com/aleksul) +* Allow self referencing `ClassVar`s in models, [#3679](https://github.com/pydantic/pydantic/pull/3679) by [@samuelcolvin](https://github.com/samuelcolvin) +* **Breaking Change, see [#4106](https://github.com/pydantic/pydantic/pull/4106)**: Fix issue with self-referencing dataclass, [#3675](https://github.com/pydantic/pydantic/pull/3675) by [@uriyyo](https://github.com/uriyyo) +* Include non-standard port numbers in rendered URLs, [#3652](https://github.com/pydantic/pydantic/pull/3652) by [@dolfinus](https://github.com/dolfinus) +* `Config.copy_on_model_validation` does a deep copy and not a shallow one, [#3641](https://github.com/pydantic/pydantic/pull/3641) by [@PrettyWood](https://github.com/PrettyWood) +* fix: clarify that discriminated unions do not support singletons, [#3636](https://github.com/pydantic/pydantic/pull/3636) by [@tommilligan](https://github.com/tommilligan) +* Add `read_text(encoding='utf-8')` for `setup.py`, [#3625](https://github.com/pydantic/pydantic/pull/3625) by [@hswong3i](https://github.com/hswong3i) +* Fix JSON Schema generation for Discriminated Unions within lists, [#3608](https://github.com/pydantic/pydantic/pull/3608) by [@samuelcolvin](https://github.com/samuelcolvin) + +## v1.9.0 (2021-12-31) + +Thank you to pydantic's sponsors: +[@sthagen](https://github.com/sthagen), [@timdrijvers](https://github.com/timdrijvers), [@toinbis](https://github.com/toinbis), [@koxudaxi](https://github.com/koxudaxi), [@ginomempin](https://github.com/ginomempin), [@primer-io](https://github.com/primer-io), [@and-semakin](https://github.com/and-semakin), [@westonsteimel](https://github.com/westonsteimel), [@reillysiemens](https://github.com/reillysiemens), +[@es3n1n](https://github.com/es3n1n), [@jokull](https://github.com/jokull), [@JonasKs](https://github.com/JonasKs), [@Rehket](https://github.com/Rehket), [@corleyma](https://github.com/corleyma), [@daddycocoaman](https://github.com/daddycocoaman), [@hardbyte](https://github.com/hardbyte), [@datarootsio](https://github.com/datarootsio), [@jodal](https://github.com/jodal), [@aminalaee](https://github.com/aminalaee), [@rafsaf](https://github.com/rafsaf), +[@jqueguiner](https://github.com/jqueguiner), [@chdsbd](https://github.com/chdsbd), [@kevinalh](https://github.com/kevinalh), [@Mazyod](https://github.com/Mazyod), [@grillazz](https://github.com/grillazz), [@JonasKs](https://github.com/JonasKs), [@simw](https://github.com/simw), [@leynier](https://github.com/leynier), [@xfenix](https://github.com/xfenix) +for their kind support. + +### Highlights + +* add Python 3.10 support, [#2885](https://github.com/pydantic/pydantic/pull/2885) by [@PrettyWood](https://github.com/PrettyWood) +* [Discriminated unions](https://docs.pydantic.dev/usage/types/#discriminated-unions-aka-tagged-unions), [#619](https://github.com/pydantic/pydantic/pull/619) by [@PrettyWood](https://github.com/PrettyWood) +* [`Config.smart_union` for better union logic](https://docs.pydantic.dev/usage/model_config/#smart-union), [#2092](https://github.com/pydantic/pydantic/pull/2092) by [@PrettyWood](https://github.com/PrettyWood) +* Binaries for Macos M1 CPUs, [#3498](https://github.com/pydantic/pydantic/pull/3498) by [@samuelcolvin](https://github.com/samuelcolvin) +* Complex types can be set via [nested environment variables](https://docs.pydantic.dev/usage/settings/#parsing-environment-variable-values), e.g. `foo___bar`, [#3159](https://github.com/pydantic/pydantic/pull/3159) by [@Air-Mark](https://github.com/Air-Mark) +* add a dark mode to _pydantic_ documentation, [#2913](https://github.com/pydantic/pydantic/pull/2913) by [@gbdlin](https://github.com/gbdlin) +* Add support for autocomplete in VS Code via `__dataclass_transform__`, [#2721](https://github.com/pydantic/pydantic/pull/2721) by [@tiangolo](https://github.com/tiangolo) +* Add "exclude" as a field parameter so that it can be configured using model config, [#660](https://github.com/pydantic/pydantic/pull/660) by [@daviskirk](https://github.com/daviskirk) + +### v1.9.0 (2021-12-31) Changes + +* Apply `update_forward_refs` to `Config.json_encodes` prevent name clashes in types defined via strings, [#3583](https://github.com/pydantic/pydantic/pull/3583) by [@samuelcolvin](https://github.com/samuelcolvin) +* Extend pydantic's mypy plugin to support mypy versions `0.910`, `0.920`, `0.921` & `0.930`, [#3573](https://github.com/pydantic/pydantic/pull/3573) & [#3594](https://github.com/pydantic/pydantic/pull/3594) by [@PrettyWood](https://github.com/PrettyWood), [@christianbundy](https://github.com/christianbundy), [@samuelcolvin](https://github.com/samuelcolvin) + +### v1.9.0a2 (2021-12-24) Changes + +* support generic models with discriminated union, [#3551](https://github.com/pydantic/pydantic/pull/3551) by [@PrettyWood](https://github.com/PrettyWood) +* keep old behaviour of `json()` by default, [#3542](https://github.com/pydantic/pydantic/pull/3542) by [@PrettyWood](https://github.com/PrettyWood) +* Removed typing-only `__root__` attribute from `BaseModel`, [#3540](https://github.com/pydantic/pydantic/pull/3540) by [@layday](https://github.com/layday) +* Build Python 3.10 wheels, [#3539](https://github.com/pydantic/pydantic/pull/3539) by [@mbachry](https://github.com/mbachry) +* Fix display of `extra` fields with model `__repr__`, [#3234](https://github.com/pydantic/pydantic/pull/3234) by [@cocolman](https://github.com/cocolman) +* models copied via `Config.copy_on_model_validation` always have all fields, [#3201](https://github.com/pydantic/pydantic/pull/3201) by [@PrettyWood](https://github.com/PrettyWood) +* nested ORM from nested dictionaries, [#3182](https://github.com/pydantic/pydantic/pull/3182) by [@PrettyWood](https://github.com/PrettyWood) +* fix link to discriminated union section by [@PrettyWood](https://github.com/PrettyWood) + +### v1.9.0a1 (2021-12-18) Changes + +* Add support for `Decimal`-specific validation configurations in `Field()`, additionally to using `condecimal()`, + to allow better support from editors and tooling, [#3507](https://github.com/pydantic/pydantic/pull/3507) by [@tiangolo](https://github.com/tiangolo) +* Add `arm64` binaries suitable for MacOS with an M1 CPU to PyPI, [#3498](https://github.com/pydantic/pydantic/pull/3498) by [@samuelcolvin](https://github.com/samuelcolvin) +* Fix issue where `None` was considered invalid when using a `Union` type containing `Any` or `object`, [#3444](https://github.com/pydantic/pydantic/pull/3444) by [@tharradine](https://github.com/tharradine) +* When generating field schema, pass optional `field` argument (of type + `pydantic.fields.ModelField`) to `__modify_schema__()` if present, [#3434](https://github.com/pydantic/pydantic/pull/3434) by [@jasujm](https://github.com/jasujm) +* Fix issue when pydantic fail to parse `typing.ClassVar` string type annotation, [#3401](https://github.com/pydantic/pydantic/pull/3401) by [@uriyyo](https://github.com/uriyyo) +* Mention Python >= 3.9.2 as an alternative to `typing_extensions.TypedDict`, [#3374](https://github.com/pydantic/pydantic/pull/3374) by [@BvB93](https://github.com/BvB93) +* Changed the validator method name in the [Custom Errors example](https://docs.pydantic.dev/usage/models/#custom-errors) + to more accurately describe what the validator is doing; changed from `name_must_contain_space` to ` value_must_equal_bar`, [#3327](https://github.com/pydantic/pydantic/pull/3327) by [@michaelrios28](https://github.com/michaelrios28) +* Add `AmqpDsn` class, [#3254](https://github.com/pydantic/pydantic/pull/3254) by [@kludex](https://github.com/kludex) +* Always use `Enum` value as default in generated JSON schema, [#3190](https://github.com/pydantic/pydantic/pull/3190) by [@joaommartins](https://github.com/joaommartins) +* Add support for Mypy 0.920, [#3175](https://github.com/pydantic/pydantic/pull/3175) by [@christianbundy](https://github.com/christianbundy) +* `validate_arguments` now supports `extra` customization (used to always be `Extra.forbid`), [#3161](https://github.com/pydantic/pydantic/pull/3161) by [@PrettyWood](https://github.com/PrettyWood) +* Complex types can be set by nested environment variables, [#3159](https://github.com/pydantic/pydantic/pull/3159) by [@Air-Mark](https://github.com/Air-Mark) +* Fix mypy plugin to collect fields based on `pydantic.utils.is_valid_field` so that it ignores untyped private variables, [#3146](https://github.com/pydantic/pydantic/pull/3146) by [@hi-ogawa](https://github.com/hi-ogawa) +* fix `validate_arguments` issue with `Config.validate_all`, [#3135](https://github.com/pydantic/pydantic/pull/3135) by [@PrettyWood](https://github.com/PrettyWood) +* avoid dict coercion when using dict subclasses as field type, [#3122](https://github.com/pydantic/pydantic/pull/3122) by [@PrettyWood](https://github.com/PrettyWood) +* add support for `object` type, [#3062](https://github.com/pydantic/pydantic/pull/3062) by [@PrettyWood](https://github.com/PrettyWood) +* Updates pydantic dataclasses to keep `_special` properties on parent classes, [#3043](https://github.com/pydantic/pydantic/pull/3043) by [@zulrang](https://github.com/zulrang) +* Add a `TypedDict` class for error objects, [#3038](https://github.com/pydantic/pydantic/pull/3038) by [@matthewhughes934](https://github.com/matthewhughes934) +* Fix support for using a subclass of an annotation as a default, [#3018](https://github.com/pydantic/pydantic/pull/3018) by [@JacobHayes](https://github.com/JacobHayes) +* make `create_model_from_typeddict` mypy compliant, [#3008](https://github.com/pydantic/pydantic/pull/3008) by [@PrettyWood](https://github.com/PrettyWood) +* Make multiple inheritance work when using `PrivateAttr`, [#2989](https://github.com/pydantic/pydantic/pull/2989) by [@hmvp](https://github.com/hmvp) +* Parse environment variables as JSON, if they have a `Union` type with a complex subfield, [#2936](https://github.com/pydantic/pydantic/pull/2936) by [@cbartz](https://github.com/cbartz) +* Prevent `StrictStr` permitting `Enum` values where the enum inherits from `str`, [#2929](https://github.com/pydantic/pydantic/pull/2929) by [@samuelcolvin](https://github.com/samuelcolvin) +* Make `SecretsSettingsSource` parse values being assigned to fields of complex types when sourced from a secrets file, + just as when sourced from environment variables, [#2917](https://github.com/pydantic/pydantic/pull/2917) by [@davidmreed](https://github.com/davidmreed) +* add a dark mode to _pydantic_ documentation, [#2913](https://github.com/pydantic/pydantic/pull/2913) by [@gbdlin](https://github.com/gbdlin) +* Make `pydantic-mypy` plugin compatible with `pyproject.toml` configuration, consistent with `mypy` changes. + See the [doc](https://docs.pydantic.dev/mypy_plugin/#configuring-the-plugin) for more information, [#2908](https://github.com/pydantic/pydantic/pull/2908) by [@jrwalk](https://github.com/jrwalk) +* add Python 3.10 support, [#2885](https://github.com/pydantic/pydantic/pull/2885) by [@PrettyWood](https://github.com/PrettyWood) +* Correctly parse generic models with `Json[T]`, [#2860](https://github.com/pydantic/pydantic/pull/2860) by [@geekingfrog](https://github.com/geekingfrog) +* Update contrib docs re: Python version to use for building docs, [#2856](https://github.com/pydantic/pydantic/pull/2856) by [@paxcodes](https://github.com/paxcodes) +* Clarify documentation about _pydantic_'s support for custom validation and strict type checking, + despite _pydantic_ being primarily a parsing library, [#2855](https://github.com/pydantic/pydantic/pull/2855) by [@paxcodes](https://github.com/paxcodes) +* Fix schema generation for `Deque` fields, [#2810](https://github.com/pydantic/pydantic/pull/2810) by [@sergejkozin](https://github.com/sergejkozin) +* fix an edge case when mixing constraints and `Literal`, [#2794](https://github.com/pydantic/pydantic/pull/2794) by [@PrettyWood](https://github.com/PrettyWood) +* Fix postponed annotation resolution for `NamedTuple` and `TypedDict` when they're used directly as the type of fields + within Pydantic models, [#2760](https://github.com/pydantic/pydantic/pull/2760) by [@jameysharp](https://github.com/jameysharp) +* Fix bug when `mypy` plugin fails on `construct` method call for `BaseSettings` derived classes, [#2753](https://github.com/pydantic/pydantic/pull/2753) by [@uriyyo](https://github.com/uriyyo) +* Add function overloading for a `pydantic.create_model` function, [#2748](https://github.com/pydantic/pydantic/pull/2748) by [@uriyyo](https://github.com/uriyyo) +* Fix mypy plugin issue with self field declaration, [#2743](https://github.com/pydantic/pydantic/pull/2743) by [@uriyyo](https://github.com/uriyyo) +* The colon at the end of the line "The fields which were supplied when user was initialised:" suggests that the code following it is related. + Changed it to a period, [#2733](https://github.com/pydantic/pydantic/pull/2733) by [@krisaoe](https://github.com/krisaoe) +* Renamed variable `schema` to `schema_` to avoid shadowing of global variable name, [#2724](https://github.com/pydantic/pydantic/pull/2724) by [@shahriyarr](https://github.com/shahriyarr) +* Add support for autocomplete in VS Code via `__dataclass_transform__`, [#2721](https://github.com/pydantic/pydantic/pull/2721) by [@tiangolo](https://github.com/tiangolo) +* add missing type annotations in `BaseConfig` and handle `max_length = 0`, [#2719](https://github.com/pydantic/pydantic/pull/2719) by [@PrettyWood](https://github.com/PrettyWood) +* Change `orm_mode` checking to allow recursive ORM mode parsing with dicts, [#2718](https://github.com/pydantic/pydantic/pull/2718) by [@nuno-andre](https://github.com/nuno-andre) +* Add episode 313 of the *Talk Python To Me* podcast, where Michael Kennedy and Samuel Colvin discuss Pydantic, to the docs, [#2712](https://github.com/pydantic/pydantic/pull/2712) by [@RatulMaharaj](https://github.com/RatulMaharaj) +* fix JSON schema generation when a field is of type `NamedTuple` and has a default value, [#2707](https://github.com/pydantic/pydantic/pull/2707) by [@PrettyWood](https://github.com/PrettyWood) +* `Enum` fields now properly support extra kwargs in schema generation, [#2697](https://github.com/pydantic/pydantic/pull/2697) by [@sammchardy](https://github.com/sammchardy) +* **Breaking Change, see [#3780](https://github.com/pydantic/pydantic/pull/3780)**: Make serialization of referenced pydantic models possible, [#2650](https://github.com/pydantic/pydantic/pull/2650) by [@PrettyWood](https://github.com/PrettyWood) +* Add `uniqueItems` option to `ConstrainedList`, [#2618](https://github.com/pydantic/pydantic/pull/2618) by [@nuno-andre](https://github.com/nuno-andre) +* Try to evaluate forward refs automatically at model creation, [#2588](https://github.com/pydantic/pydantic/pull/2588) by [@uriyyo](https://github.com/uriyyo) +* Switch docs preview and coverage display to use [smokeshow](https://smokeshow.helpmanual.io/), [#2580](https://github.com/pydantic/pydantic/pull/2580) by [@samuelcolvin](https://github.com/samuelcolvin) +* Add `__version__` attribute to pydantic module, [#2572](https://github.com/pydantic/pydantic/pull/2572) by [@paxcodes](https://github.com/paxcodes) +* Add `postgresql+asyncpg`, `postgresql+pg8000`, `postgresql+psycopg2`, `postgresql+psycopg2cffi`, `postgresql+py-postgresql` + and `postgresql+pygresql` schemes for `PostgresDsn`, [#2567](https://github.com/pydantic/pydantic/pull/2567) by [@postgres-asyncpg](https://github.com/postgres-asyncpg) +* Enable the Hypothesis plugin to generate a constrained decimal when the `decimal_places` argument is specified, [#2524](https://github.com/pydantic/pydantic/pull/2524) by [@cwe5590](https://github.com/cwe5590) +* Allow `collections.abc.Callable` to be used as type in Python 3.9, [#2519](https://github.com/pydantic/pydantic/pull/2519) by [@daviskirk](https://github.com/daviskirk) +* Documentation update how to custom compile pydantic when using pip install, small change in `setup.py` + to allow for custom CFLAGS when compiling, [#2517](https://github.com/pydantic/pydantic/pull/2517) by [@peterroelants](https://github.com/peterroelants) +* remove side effect of `default_factory` to run it only once even if `Config.validate_all` is set, [#2515](https://github.com/pydantic/pydantic/pull/2515) by [@PrettyWood](https://github.com/PrettyWood) +* Add lookahead to ip regexes for `AnyUrl` hosts. This allows urls with DNS labels + looking like IPs to validate as they are perfectly valid host names, [#2512](https://github.com/pydantic/pydantic/pull/2512) by [@sbv-csis](https://github.com/sbv-csis) +* Set `minItems` and `maxItems` in generated JSON schema for fixed-length tuples, [#2497](https://github.com/pydantic/pydantic/pull/2497) by [@PrettyWood](https://github.com/PrettyWood) +* Add `strict` argument to `conbytes`, [#2489](https://github.com/pydantic/pydantic/pull/2489) by [@koxudaxi](https://github.com/koxudaxi) +* Support user defined generic field types in generic models, [#2465](https://github.com/pydantic/pydantic/pull/2465) by [@daviskirk](https://github.com/daviskirk) +* Add an example and a short explanation of subclassing `GetterDict` to docs, [#2463](https://github.com/pydantic/pydantic/pull/2463) by [@nuno-andre](https://github.com/nuno-andre) +* add `KafkaDsn` type, `HttpUrl` now has default port 80 for http and 443 for https, [#2447](https://github.com/pydantic/pydantic/pull/2447) by [@MihanixA](https://github.com/MihanixA) +* Add `PastDate` and `FutureDate` types, [#2425](https://github.com/pydantic/pydantic/pull/2425) by [@Kludex](https://github.com/Kludex) +* Support generating schema for `Generic` fields with subtypes, [#2375](https://github.com/pydantic/pydantic/pull/2375) by [@maximberg](https://github.com/maximberg) +* fix(encoder): serialize `NameEmail` to str, [#2341](https://github.com/pydantic/pydantic/pull/2341) by [@alecgerona](https://github.com/alecgerona) +* add `Config.smart_union` to prevent coercion in `Union` if possible, see + [the doc](https://docs.pydantic.dev/usage/model_config/#smart-union) for more information, [#2092](https://github.com/pydantic/pydantic/pull/2092) by [@PrettyWood](https://github.com/PrettyWood) +* Add ability to use `typing.Counter` as a model field type, [#2060](https://github.com/pydantic/pydantic/pull/2060) by [@uriyyo](https://github.com/uriyyo) +* Add parameterised subclasses to `__bases__` when constructing new parameterised classes, so that `A <: B => A[int] <: B[int]`, [#2007](https://github.com/pydantic/pydantic/pull/2007) by [@diabolo-dan](https://github.com/diabolo-dan) +* Create `FileUrl` type that allows URLs that conform to [RFC 8089](https://tools.ietf.org/html/rfc8089#section-2). + Add `host_required` parameter, which is `True` by default (`AnyUrl` and subclasses), `False` in `RedisDsn`, `FileUrl`, [#1983](https://github.com/pydantic/pydantic/pull/1983) by [@vgerak](https://github.com/vgerak) +* add `confrozenset()`, analogous to `conset()` and `conlist()`, [#1897](https://github.com/pydantic/pydantic/pull/1897) by [@PrettyWood](https://github.com/PrettyWood) +* stop calling parent class `root_validator` if overridden, [#1895](https://github.com/pydantic/pydantic/pull/1895) by [@PrettyWood](https://github.com/PrettyWood) +* Add `repr` (defaults to `True`) parameter to `Field`, to hide it from the default representation of the `BaseModel`, [#1831](https://github.com/pydantic/pydantic/pull/1831) by [@fnep](https://github.com/fnep) +* Accept empty query/fragment URL parts, [#1807](https://github.com/pydantic/pydantic/pull/1807) by [@xavier](https://github.com/xavier) + +## v1.8.2 (2021-05-11) + +!!! warning + A security vulnerability, level "moderate" is fixed in v1.8.2. Please upgrade **ASAP**. + See security advisory [CVE-2021-29510](https://github.com/pydantic/pydantic/security/advisories/GHSA-5jqp-qgf6-3pvh) + +* **Security fix:** Fix `date` and `datetime` parsing so passing either `'infinity'` or `float('inf')` + (or their negative values) does not cause an infinite loop, + see security advisory [CVE-2021-29510](https://github.com/pydantic/pydantic/security/advisories/GHSA-5jqp-qgf6-3pvh) +* fix schema generation with Enum by generating a valid name, [#2575](https://github.com/pydantic/pydantic/pull/2575) by [@PrettyWood](https://github.com/PrettyWood) +* fix JSON schema generation with a `Literal` of an enum member, [#2536](https://github.com/pydantic/pydantic/pull/2536) by [@PrettyWood](https://github.com/PrettyWood) +* Fix bug with configurations declarations that are passed as + keyword arguments during class creation, [#2532](https://github.com/pydantic/pydantic/pull/2532) by [@uriyyo](https://github.com/uriyyo) +* Allow passing `json_encoders` in class kwargs, [#2521](https://github.com/pydantic/pydantic/pull/2521) by [@layday](https://github.com/layday) +* support arbitrary types with custom `__eq__`, [#2483](https://github.com/pydantic/pydantic/pull/2483) by [@PrettyWood](https://github.com/PrettyWood) +* support `Annotated` in `validate_arguments` and in generic models with Python 3.9, [#2483](https://github.com/pydantic/pydantic/pull/2483) by [@PrettyWood](https://github.com/PrettyWood) + +## v1.8.1 (2021-03-03) + +Bug fixes for regressions and new features from `v1.8` + +* allow elements of `Config.field` to update elements of a `Field`, [#2461](https://github.com/pydantic/pydantic/pull/2461) by [@samuelcolvin](https://github.com/samuelcolvin) +* fix validation with a `BaseModel` field and a custom root type, [#2449](https://github.com/pydantic/pydantic/pull/2449) by [@PrettyWood](https://github.com/PrettyWood) +* expose `Pattern` encoder to `fastapi`, [#2444](https://github.com/pydantic/pydantic/pull/2444) by [@PrettyWood](https://github.com/PrettyWood) +* enable the Hypothesis plugin to generate a constrained float when the `multiple_of` argument is specified, [#2442](https://github.com/pydantic/pydantic/pull/2442) by [@tobi-lipede-oodle](https://github.com/tobi-lipede-oodle) +* Avoid `RecursionError` when using some types like `Enum` or `Literal` with generic models, [#2436](https://github.com/pydantic/pydantic/pull/2436) by [@PrettyWood](https://github.com/PrettyWood) +* do not overwrite declared `__hash__` in subclasses of a model, [#2422](https://github.com/pydantic/pydantic/pull/2422) by [@PrettyWood](https://github.com/PrettyWood) +* fix `mypy` complaints on `Path` and `UUID` related custom types, [#2418](https://github.com/pydantic/pydantic/pull/2418) by [@PrettyWood](https://github.com/PrettyWood) +* Support properly variable length tuples of compound types, [#2416](https://github.com/pydantic/pydantic/pull/2416) by [@PrettyWood](https://github.com/PrettyWood) + +## v1.8 (2021-02-26) + +Thank you to pydantic's sponsors: +[@jorgecarleitao](https://github.com/jorgecarleitao), [@BCarley](https://github.com/BCarley), [@chdsbd](https://github.com/chdsbd), [@tiangolo](https://github.com/tiangolo), [@matin](https://github.com/matin), [@linusg](https://github.com/linusg), [@kevinalh](https://github.com/kevinalh), [@koxudaxi](https://github.com/koxudaxi), [@timdrijvers](https://github.com/timdrijvers), [@mkeen](https://github.com/mkeen), [@meadsteve](https://github.com/meadsteve), +[@ginomempin](https://github.com/ginomempin), [@primer-io](https://github.com/primer-io), [@and-semakin](https://github.com/and-semakin), [@tomthorogood](https://github.com/tomthorogood), [@AjitZK](https://github.com/AjitZK), [@westonsteimel](https://github.com/westonsteimel), [@Mazyod](https://github.com/Mazyod), [@christippett](https://github.com/christippett), [@CarlosDomingues](https://github.com/CarlosDomingues), +[@Kludex](https://github.com/Kludex), [@r-m-n](https://github.com/r-m-n) +for their kind support. + +### Highlights + +* [Hypothesis plugin](https://docs.pydantic.dev/hypothesis_plugin/) for testing, [#2097](https://github.com/pydantic/pydantic/pull/2097) by [@Zac-HD](https://github.com/Zac-HD) +* support for [`NamedTuple` and `TypedDict`](https://docs.pydantic.dev/usage/types/#annotated-types), [#2216](https://github.com/pydantic/pydantic/pull/2216) by [@PrettyWood](https://github.com/PrettyWood) +* Support [`Annotated` hints on model fields](https://docs.pydantic.dev/usage/schema/#typingannotated-fields), [#2147](https://github.com/pydantic/pydantic/pull/2147) by [@JacobHayes](https://github.com/JacobHayes) +* [`frozen` parameter on `Config`](https://docs.pydantic.dev/usage/model_config/) to allow models to be hashed, [#1880](https://github.com/pydantic/pydantic/pull/1880) by [@rhuille](https://github.com/rhuille) + +### Changes + +* **Breaking Change**, remove old deprecation aliases from v1, [#2415](https://github.com/pydantic/pydantic/pull/2415) by [@samuelcolvin](https://github.com/samuelcolvin): + * remove notes on migrating to v1 in docs + * remove `Schema` which was replaced by `Field` + * remove `Config.case_insensitive` which was replaced by `Config.case_sensitive` (default `False`) + * remove `Config.allow_population_by_alias` which was replaced by `Config.allow_population_by_field_name` + * remove `model.fields` which was replaced by `model.__fields__` + * remove `model.to_string()` which was replaced by `str(model)` + * remove `model.__values__` which was replaced by `model.__dict__` +* **Breaking Change:** always validate only first sublevel items with `each_item`. + There were indeed some edge cases with some compound types where the validated items were the last sublevel ones, [#1933](https://github.com/pydantic/pydantic/pull/1933) by [@PrettyWood](https://github.com/PrettyWood) +* Update docs extensions to fix local syntax highlighting, [#2400](https://github.com/pydantic/pydantic/pull/2400) by [@daviskirk](https://github.com/daviskirk) +* fix: allow `utils.lenient_issubclass` to handle `typing.GenericAlias` objects like `list[str]` in Python >= 3.9, [#2399](https://github.com/pydantic/pydantic/pull/2399) by [@daviskirk](https://github.com/daviskirk) +* Improve field declaration for _pydantic_ `dataclass` by allowing the usage of _pydantic_ `Field` or `'metadata'` kwarg of `dataclasses.field`, [#2384](https://github.com/pydantic/pydantic/pull/2384) by [@PrettyWood](https://github.com/PrettyWood) +* Making `typing-extensions` a required dependency, [#2368](https://github.com/pydantic/pydantic/pull/2368) by [@samuelcolvin](https://github.com/samuelcolvin) +* Make `resolve_annotations` more lenient, allowing for missing modules, [#2363](https://github.com/pydantic/pydantic/pull/2363) by [@samuelcolvin](https://github.com/samuelcolvin) +* Allow configuring models through class kwargs, [#2356](https://github.com/pydantic/pydantic/pull/2356) by [@Bobronium](https://github.com/Bobronium) +* Prevent `Mapping` subclasses from always being coerced to `dict`, [#2325](https://github.com/pydantic/pydantic/pull/2325) by [@ofek](https://github.com/ofek) +* fix: allow `None` for type `Optional[conset / conlist]`, [#2320](https://github.com/pydantic/pydantic/pull/2320) by [@PrettyWood](https://github.com/PrettyWood) +* Support empty tuple type, [#2318](https://github.com/pydantic/pydantic/pull/2318) by [@PrettyWood](https://github.com/PrettyWood) +* fix: `python_requires` metadata to require >=3.6.1, [#2306](https://github.com/pydantic/pydantic/pull/2306) by [@hukkinj1](https://github.com/hukkinj1) +* Properly encode `Decimal` with, or without any decimal places, [#2293](https://github.com/pydantic/pydantic/pull/2293) by [@hultner](https://github.com/hultner) +* fix: update `__fields_set__` in `BaseModel.copy(update=…)`, [#2290](https://github.com/pydantic/pydantic/pull/2290) by [@PrettyWood](https://github.com/PrettyWood) +* fix: keep order of fields with `BaseModel.construct()`, [#2281](https://github.com/pydantic/pydantic/pull/2281) by [@PrettyWood](https://github.com/PrettyWood) +* Support generating schema for Generic fields, [#2262](https://github.com/pydantic/pydantic/pull/2262) by [@maximberg](https://github.com/maximberg) +* Fix `validate_decorator` so `**kwargs` doesn't exclude values when the keyword + has the same name as the `*args` or `**kwargs` names, [#2251](https://github.com/pydantic/pydantic/pull/2251) by [@cybojenix](https://github.com/cybojenix) +* Prevent overriding positional arguments with keyword arguments in + `validate_arguments`, as per behaviour with native functions, [#2249](https://github.com/pydantic/pydantic/pull/2249) by [@cybojenix](https://github.com/cybojenix) +* add documentation for `con*` type functions, [#2242](https://github.com/pydantic/pydantic/pull/2242) by [@tayoogunbiyi](https://github.com/tayoogunbiyi) +* Support custom root type (aka `__root__`) when using `parse_obj()` with nested models, [#2238](https://github.com/pydantic/pydantic/pull/2238) by [@PrettyWood](https://github.com/PrettyWood) +* Support custom root type (aka `__root__`) with `from_orm()`, [#2237](https://github.com/pydantic/pydantic/pull/2237) by [@PrettyWood](https://github.com/PrettyWood) +* ensure cythonized functions are left untouched when creating models, based on [#1944](https://github.com/pydantic/pydantic/pull/1944) by [@kollmats](https://github.com/kollmats), [#2228](https://github.com/pydantic/pydantic/pull/2228) by [@samuelcolvin](https://github.com/samuelcolvin) +* Resolve forward refs for stdlib dataclasses converted into _pydantic_ ones, [#2220](https://github.com/pydantic/pydantic/pull/2220) by [@PrettyWood](https://github.com/PrettyWood) +* Add support for `NamedTuple` and `TypedDict` types. + Those two types are now handled and validated when used inside `BaseModel` or _pydantic_ `dataclass`. + Two utils are also added `create_model_from_namedtuple` and `create_model_from_typeddict`, [#2216](https://github.com/pydantic/pydantic/pull/2216) by [@PrettyWood](https://github.com/PrettyWood) +* Do not ignore annotated fields when type is `Union[Type[...], ...]`, [#2213](https://github.com/pydantic/pydantic/pull/2213) by [@PrettyWood](https://github.com/PrettyWood) +* Raise a user-friendly `TypeError` when a `root_validator` does not return a `dict` (e.g. `None`), [#2209](https://github.com/pydantic/pydantic/pull/2209) by [@masalim2](https://github.com/masalim2) +* Add a `FrozenSet[str]` type annotation to the `allowed_schemes` argument on the `strict_url` field type, [#2198](https://github.com/pydantic/pydantic/pull/2198) by [@Midnighter](https://github.com/Midnighter) +* add `allow_mutation` constraint to `Field`, [#2195](https://github.com/pydantic/pydantic/pull/2195) by [@sblack-usu](https://github.com/sblack-usu) +* Allow `Field` with a `default_factory` to be used as an argument to a function + decorated with `validate_arguments`, [#2176](https://github.com/pydantic/pydantic/pull/2176) by [@thomascobb](https://github.com/thomascobb) +* Allow non-existent secrets directory by only issuing a warning, [#2175](https://github.com/pydantic/pydantic/pull/2175) by [@davidolrik](https://github.com/davidolrik) +* fix URL regex to parse fragment without query string, [#2168](https://github.com/pydantic/pydantic/pull/2168) by [@andrewmwhite](https://github.com/andrewmwhite) +* fix: ensure to always return one of the values in `Literal` field type, [#2166](https://github.com/pydantic/pydantic/pull/2166) by [@PrettyWood](https://github.com/PrettyWood) +* Support `typing.Annotated` hints on model fields. A `Field` may now be set in the type hint with `Annotated[..., Field(...)`; all other annotations are ignored but still visible with `get_type_hints(..., include_extras=True)`, [#2147](https://github.com/pydantic/pydantic/pull/2147) by [@JacobHayes](https://github.com/JacobHayes) +* Added `StrictBytes` type as well as `strict=False` option to `ConstrainedBytes`, [#2136](https://github.com/pydantic/pydantic/pull/2136) by [@rlizzo](https://github.com/rlizzo) +* added `Config.anystr_lower` and `to_lower` kwarg to `constr` and `conbytes`, [#2134](https://github.com/pydantic/pydantic/pull/2134) by [@tayoogunbiyi](https://github.com/tayoogunbiyi) +* Support plain `typing.Tuple` type, [#2132](https://github.com/pydantic/pydantic/pull/2132) by [@PrettyWood](https://github.com/PrettyWood) +* Add a bound method `validate` to functions decorated with `validate_arguments` + to validate parameters without actually calling the function, [#2127](https://github.com/pydantic/pydantic/pull/2127) by [@PrettyWood](https://github.com/PrettyWood) +* Add the ability to customize settings sources (add / disable / change priority order), [#2107](https://github.com/pydantic/pydantic/pull/2107) by [@kozlek](https://github.com/kozlek) +* Fix mypy complaints about most custom _pydantic_ types, [#2098](https://github.com/pydantic/pydantic/pull/2098) by [@PrettyWood](https://github.com/PrettyWood) +* Add a [Hypothesis](https://hypothesis.readthedocs.io/) plugin for easier [property-based testing](https://increment.com/testing/in-praise-of-property-based-testing/) with Pydantic's custom types - [usage details here](https://docs.pydantic.dev/hypothesis_plugin/), [#2097](https://github.com/pydantic/pydantic/pull/2097) by [@Zac-HD](https://github.com/Zac-HD) +* add validator for `None`, `NoneType` or `Literal[None]`, [#2095](https://github.com/pydantic/pydantic/pull/2095) by [@PrettyWood](https://github.com/PrettyWood) +* Handle properly fields of type `Callable` with a default value, [#2094](https://github.com/pydantic/pydantic/pull/2094) by [@PrettyWood](https://github.com/PrettyWood) +* Updated `create_model` return type annotation to return type which inherits from `__base__` argument, [#2071](https://github.com/pydantic/pydantic/pull/2071) by [@uriyyo](https://github.com/uriyyo) +* Add merged `json_encoders` inheritance, [#2064](https://github.com/pydantic/pydantic/pull/2064) by [@art049](https://github.com/art049) +* allow overwriting `ClassVar`s in sub-models without having to re-annotate them, [#2061](https://github.com/pydantic/pydantic/pull/2061) by [@layday](https://github.com/layday) +* add default encoder for `Pattern` type, [#2045](https://github.com/pydantic/pydantic/pull/2045) by [@PrettyWood](https://github.com/PrettyWood) +* Add `NonNegativeInt`, `NonPositiveInt`, `NonNegativeFloat`, `NonPositiveFloat`, [#1975](https://github.com/pydantic/pydantic/pull/1975) by [@mdavis-xyz](https://github.com/mdavis-xyz) +* Use % for percentage in string format of colors, [#1960](https://github.com/pydantic/pydantic/pull/1960) by [@EdwardBetts](https://github.com/EdwardBetts) +* Fixed issue causing `KeyError` to be raised when building schema from multiple `BaseModel` with the same names declared in separate classes, [#1912](https://github.com/pydantic/pydantic/pull/1912) by [@JSextonn](https://github.com/JSextonn) +* Add `rediss` (Redis over SSL) protocol to `RedisDsn` + Allow URLs without `user` part (e.g., `rediss://:pass@localhost`), [#1911](https://github.com/pydantic/pydantic/pull/1911) by [@TrDex](https://github.com/TrDex) +* Add a new `frozen` boolean parameter to `Config` (default: `False`). + Setting `frozen=True` does everything that `allow_mutation=False` does, and also generates a `__hash__()` method for the model. This makes instances of the model potentially hashable if all the attributes are hashable, [#1880](https://github.com/pydantic/pydantic/pull/1880) by [@rhuille](https://github.com/rhuille) +* fix schema generation with multiple Enums having the same name, [#1857](https://github.com/pydantic/pydantic/pull/1857) by [@PrettyWood](https://github.com/PrettyWood) +* Added support for 13/19 digits VISA credit cards in `PaymentCardNumber` type, [#1416](https://github.com/pydantic/pydantic/pull/1416) by [@AlexanderSov](https://github.com/AlexanderSov) +* fix: prevent `RecursionError` while using recursive `GenericModel`s, [#1370](https://github.com/pydantic/pydantic/pull/1370) by [@xppt](https://github.com/xppt) +* use `enum` for `typing.Literal` in JSON schema, [#1350](https://github.com/pydantic/pydantic/pull/1350) by [@PrettyWood](https://github.com/PrettyWood) +* Fix: some recursive models did not require `update_forward_refs` and silently behaved incorrectly, [#1201](https://github.com/pydantic/pydantic/pull/1201) by [@PrettyWood](https://github.com/PrettyWood) +* Fix bug where generic models with fields where the typevar is nested in another type `a: List[T]` are considered to be concrete. This allows these models to be subclassed and composed as expected, [#947](https://github.com/pydantic/pydantic/pull/947) by [@daviskirk](https://github.com/daviskirk) +* Add `Config.copy_on_model_validation` flag. When set to `False`, _pydantic_ will keep models used as fields + untouched on validation instead of reconstructing (copying) them, [#265](https://github.com/pydantic/pydantic/pull/265) by [@PrettyWood](https://github.com/PrettyWood) + +## v1.7.4 (2021-05-11) + +* **Security fix:** Fix `date` and `datetime` parsing so passing either `'infinity'` or `float('inf')` + (or their negative values) does not cause an infinite loop, + See security advisory [CVE-2021-29510](https://github.com/pydantic/pydantic/security/advisories/GHSA-5jqp-qgf6-3pvh) + +## v1.7.3 (2020-11-30) + +Thank you to pydantic's sponsors: +[@timdrijvers](https://github.com/timdrijvers), [@BCarley](https://github.com/BCarley), [@chdsbd](https://github.com/chdsbd), [@tiangolo](https://github.com/tiangolo), [@matin](https://github.com/matin), [@linusg](https://github.com/linusg), [@kevinalh](https://github.com/kevinalh), [@jorgecarleitao](https://github.com/jorgecarleitao), [@koxudaxi](https://github.com/koxudaxi), [@primer-api](https://github.com/primer-api), +[@mkeen](https://github.com/mkeen), [@meadsteve](https://github.com/meadsteve) for their kind support. + +* fix: set right default value for required (optional) fields, [#2142](https://github.com/pydantic/pydantic/pull/2142) by [@PrettyWood](https://github.com/PrettyWood) +* fix: support `underscore_attrs_are_private` with generic models, [#2138](https://github.com/pydantic/pydantic/pull/2138) by [@PrettyWood](https://github.com/PrettyWood) +* fix: update all modified field values in `root_validator` when `validate_assignment` is on, [#2116](https://github.com/pydantic/pydantic/pull/2116) by [@PrettyWood](https://github.com/PrettyWood) +* Allow pickling of `pydantic.dataclasses.dataclass` dynamically created from a built-in `dataclasses.dataclass`, [#2111](https://github.com/pydantic/pydantic/pull/2111) by [@aimestereo](https://github.com/aimestereo) +* Fix a regression where Enum fields would not propagate keyword arguments to the schema, [#2109](https://github.com/pydantic/pydantic/pull/2109) by [@bm424](https://github.com/bm424) +* Ignore `__doc__` as private attribute when `Config.underscore_attrs_are_private` is set, [#2090](https://github.com/pydantic/pydantic/pull/2090) by [@PrettyWood](https://github.com/PrettyWood) + +## v1.7.2 (2020-11-01) + +* fix slow `GenericModel` concrete model creation, allow `GenericModel` concrete name reusing in module, [#2078](https://github.com/pydantic/pydantic/pull/2078) by [@Bobronium](https://github.com/Bobronium) +* keep the order of the fields when `validate_assignment` is set, [#2073](https://github.com/pydantic/pydantic/pull/2073) by [@PrettyWood](https://github.com/PrettyWood) +* forward all the params of the stdlib `dataclass` when converted into _pydantic_ `dataclass`, [#2065](https://github.com/pydantic/pydantic/pull/2065) by [@PrettyWood](https://github.com/PrettyWood) + +## v1.7.1 (2020-10-28) + +Thank you to pydantic's sponsors: +[@timdrijvers](https://github.com/timdrijvers), [@BCarley](https://github.com/BCarley), [@chdsbd](https://github.com/chdsbd), [@tiangolo](https://github.com/tiangolo), [@matin](https://github.com/matin), [@linusg](https://github.com/linusg), [@kevinalh](https://github.com/kevinalh), [@jorgecarleitao](https://github.com/jorgecarleitao), [@koxudaxi](https://github.com/koxudaxi), [@primer-api](https://github.com/primer-api), [@mkeen](https://github.com/mkeen) +for their kind support. + +* fix annotation of `validate_arguments` when passing configuration as argument, [#2055](https://github.com/pydantic/pydantic/pull/2055) by [@layday](https://github.com/layday) +* Fix mypy assignment error when using `PrivateAttr`, [#2048](https://github.com/pydantic/pydantic/pull/2048) by [@aphedges](https://github.com/aphedges) +* fix `underscore_attrs_are_private` causing `TypeError` when overriding `__init__`, [#2047](https://github.com/pydantic/pydantic/pull/2047) by [@samuelcolvin](https://github.com/samuelcolvin) +* Fixed regression introduced in v1.7 involving exception handling in field validators when `validate_assignment=True`, [#2044](https://github.com/pydantic/pydantic/pull/2044) by [@johnsabath](https://github.com/johnsabath) +* fix: _pydantic_ `dataclass` can inherit from stdlib `dataclass` + and `Config.arbitrary_types_allowed` is supported, [#2042](https://github.com/pydantic/pydantic/pull/2042) by [@PrettyWood](https://github.com/PrettyWood) + +## v1.7 (2020-10-26) + +Thank you to pydantic's sponsors: +[@timdrijvers](https://github.com/timdrijvers), [@BCarley](https://github.com/BCarley), [@chdsbd](https://github.com/chdsbd), [@tiangolo](https://github.com/tiangolo), [@matin](https://github.com/matin), [@linusg](https://github.com/linusg), [@kevinalh](https://github.com/kevinalh), [@jorgecarleitao](https://github.com/jorgecarleitao), [@koxudaxi](https://github.com/koxudaxi), [@primer-api](https://github.com/primer-api) +for their kind support. + +### Highlights + +* Python 3.9 support, thanks [@PrettyWood](https://github.com/PrettyWood) +* [Private model attributes](https://docs.pydantic.dev/usage/models/#private-model-attributes), thanks [@Bobronium](https://github.com/Bobronium) +* ["secrets files" support in `BaseSettings`](https://docs.pydantic.dev/usage/settings/#secret-support), thanks [@mdgilene](https://github.com/mdgilene) +* [convert stdlib dataclasses to pydantic dataclasses and use stdlib dataclasses in models](https://docs.pydantic.dev/usage/dataclasses/#stdlib-dataclasses-and-pydantic-dataclasses), thanks [@PrettyWood](https://github.com/PrettyWood) + +### Changes + +* **Breaking Change:** remove `__field_defaults__`, add `default_factory` support with `BaseModel.construct`. + Use `.get_default()` method on fields in `__fields__` attribute instead, [#1732](https://github.com/pydantic/pydantic/pull/1732) by [@PrettyWood](https://github.com/PrettyWood) +* Rearrange CI to run linting as a separate job, split install recipes for different tasks, [#2020](https://github.com/pydantic/pydantic/pull/2020) by [@samuelcolvin](https://github.com/samuelcolvin) +* Allows subclasses of generic models to make some, or all, of the superclass's type parameters concrete, while + also defining new type parameters in the subclass, [#2005](https://github.com/pydantic/pydantic/pull/2005) by [@choogeboom](https://github.com/choogeboom) +* Call validator with the correct `values` parameter type in `BaseModel.__setattr__`, + when `validate_assignment = True` in model config, [#1999](https://github.com/pydantic/pydantic/pull/1999) by [@me-ransh](https://github.com/me-ransh) +* Force `fields.Undefined` to be a singleton object, fixing inherited generic model schemas, [#1981](https://github.com/pydantic/pydantic/pull/1981) by [@daviskirk](https://github.com/daviskirk) +* Include tests in source distributions, [#1976](https://github.com/pydantic/pydantic/pull/1976) by [@sbraz](https://github.com/sbraz) +* Add ability to use `min_length/max_length` constraints with secret types, [#1974](https://github.com/pydantic/pydantic/pull/1974) by [@uriyyo](https://github.com/uriyyo) +* Also check `root_validators` when `validate_assignment` is on, [#1971](https://github.com/pydantic/pydantic/pull/1971) by [@PrettyWood](https://github.com/PrettyWood) +* Fix const validators not running when custom validators are present, [#1957](https://github.com/pydantic/pydantic/pull/1957) by [@hmvp](https://github.com/hmvp) +* add `deque` to field types, [#1935](https://github.com/pydantic/pydantic/pull/1935) by [@wozniakty](https://github.com/wozniakty) +* add basic support for Python 3.9, [#1832](https://github.com/pydantic/pydantic/pull/1832) by [@PrettyWood](https://github.com/PrettyWood) +* Fix typo in the anchor of exporting_models.md#modelcopy and incorrect description, [#1821](https://github.com/pydantic/pydantic/pull/1821) by [@KimMachineGun](https://github.com/KimMachineGun) +* Added ability for `BaseSettings` to read "secret files", [#1820](https://github.com/pydantic/pydantic/pull/1820) by [@mdgilene](https://github.com/mdgilene) +* add `parse_raw_as` utility function, [#1812](https://github.com/pydantic/pydantic/pull/1812) by [@PrettyWood](https://github.com/PrettyWood) +* Support home directory relative paths for `dotenv` files (e.g. `~/.env`), [#1803](https://github.com/pydantic/pydantic/pull/1803) by [@PrettyWood](https://github.com/PrettyWood) +* Clarify documentation for `parse_file` to show that the argument + should be a file *path* not a file-like object, [#1794](https://github.com/pydantic/pydantic/pull/1794) by [@mdavis-xyz](https://github.com/mdavis-xyz) +* Fix false positive from mypy plugin when a class nested within a `BaseModel` is named `Model`, [#1770](https://github.com/pydantic/pydantic/pull/1770) by [@selimb](https://github.com/selimb) +* add basic support of Pattern type in schema generation, [#1767](https://github.com/pydantic/pydantic/pull/1767) by [@PrettyWood](https://github.com/PrettyWood) +* Support custom title, description and default in schema of enums, [#1748](https://github.com/pydantic/pydantic/pull/1748) by [@PrettyWood](https://github.com/PrettyWood) +* Properly represent `Literal` Enums when `use_enum_values` is True, [#1747](https://github.com/pydantic/pydantic/pull/1747) by [@noelevans](https://github.com/noelevans) +* Allows timezone information to be added to strings to be formatted as time objects. Permitted formats are `Z` for UTC + or an offset for absolute positive or negative time shifts. Or the timezone data can be omitted, [#1744](https://github.com/pydantic/pydantic/pull/1744) by [@noelevans](https://github.com/noelevans) +* Add stub `__init__` with Python 3.6 signature for `ForwardRef`, [#1738](https://github.com/pydantic/pydantic/pull/1738) by [@sirtelemak](https://github.com/sirtelemak) +* Fix behaviour with forward refs and optional fields in nested models, [#1736](https://github.com/pydantic/pydantic/pull/1736) by [@PrettyWood](https://github.com/PrettyWood) +* add `Enum` and `IntEnum` as valid types for fields, [#1735](https://github.com/pydantic/pydantic/pull/1735) by [@PrettyWood](https://github.com/PrettyWood) +* Change default value of `__module__` argument of `create_model` from `None` to `'pydantic.main'`. + Set reference of created concrete model to it's module to allow pickling (not applied to models created in + functions), [#1686](https://github.com/pydantic/pydantic/pull/1686) by [@Bobronium](https://github.com/Bobronium) +* Add private attributes support, [#1679](https://github.com/pydantic/pydantic/pull/1679) by [@Bobronium](https://github.com/Bobronium) +* add `config` to `@validate_arguments`, [#1663](https://github.com/pydantic/pydantic/pull/1663) by [@samuelcolvin](https://github.com/samuelcolvin) +* Allow descendant Settings models to override env variable names for the fields defined in parent Settings models with + `env` in their `Config`. Previously only `env_prefix` configuration option was applicable, [#1561](https://github.com/pydantic/pydantic/pull/1561) by [@ojomio](https://github.com/ojomio) +* Support `ref_template` when creating schema `$ref`s, [#1479](https://github.com/pydantic/pydantic/pull/1479) by [@kilo59](https://github.com/kilo59) +* Add a `__call__` stub to `PyObject` so that mypy will know that it is callable, [#1352](https://github.com/pydantic/pydantic/pull/1352) by [@brianmaissy](https://github.com/brianmaissy) +* `pydantic.dataclasses.dataclass` decorator now supports built-in `dataclasses.dataclass`. + It is hence possible to convert an existing `dataclass` easily to add Pydantic validation. + Moreover nested dataclasses are also supported, [#744](https://github.com/pydantic/pydantic/pull/744) by [@PrettyWood](https://github.com/PrettyWood) + +## v1.6.2 (2021-05-11) + +* **Security fix:** Fix `date` and `datetime` parsing so passing either `'infinity'` or `float('inf')` + (or their negative values) does not cause an infinite loop, + See security advisory [CVE-2021-29510](https://github.com/pydantic/pydantic/security/advisories/GHSA-5jqp-qgf6-3pvh) + +## v1.6.1 (2020-07-15) + +* fix validation and parsing of nested models with `default_factory`, [#1710](https://github.com/pydantic/pydantic/pull/1710) by [@PrettyWood](https://github.com/PrettyWood) + +## v1.6 (2020-07-11) + +Thank you to pydantic's sponsors: [@matin](https://github.com/matin), [@tiangolo](https://github.com/tiangolo), [@chdsbd](https://github.com/chdsbd), [@jorgecarleitao](https://github.com/jorgecarleitao), and 1 anonymous sponsor for their kind support. + +* Modify validators for `conlist` and `conset` to not have `always=True`, [#1682](https://github.com/pydantic/pydantic/pull/1682) by [@samuelcolvin](https://github.com/samuelcolvin) +* add port check to `AnyUrl` (can't exceed 65536) ports are 16 insigned bits: `0 <= port <= 2**16-1` src: [rfc793 header format](https://tools.ietf.org/html/rfc793#section-3.1), [#1654](https://github.com/pydantic/pydantic/pull/1654) by [@flapili](https://github.com/flapili) +* Document default `regex` anchoring semantics, [#1648](https://github.com/pydantic/pydantic/pull/1648) by [@yurikhan](https://github.com/yurikhan) +* Use `chain.from_iterable` in class_validators.py. This is a faster and more idiomatic way of using `itertools.chain`. + Instead of computing all the items in the iterable and storing them in memory, they are computed one-by-one and never + stored as a huge list. This can save on both runtime and memory space, [#1642](https://github.com/pydantic/pydantic/pull/1642) by [@cool-RR](https://github.com/cool-RR) +* Add `conset()`, analogous to `conlist()`, [#1623](https://github.com/pydantic/pydantic/pull/1623) by [@patrickkwang](https://github.com/patrickkwang) +* make Pydantic errors (un)pickable, [#1616](https://github.com/pydantic/pydantic/pull/1616) by [@PrettyWood](https://github.com/PrettyWood) +* Allow custom encoding for `dotenv` files, [#1615](https://github.com/pydantic/pydantic/pull/1615) by [@PrettyWood](https://github.com/PrettyWood) +* Ensure `SchemaExtraCallable` is always defined to get type hints on BaseConfig, [#1614](https://github.com/pydantic/pydantic/pull/1614) by [@PrettyWood](https://github.com/PrettyWood) +* Update datetime parser to support negative timestamps, [#1600](https://github.com/pydantic/pydantic/pull/1600) by [@mlbiche](https://github.com/mlbiche) +* Update mypy, remove `AnyType` alias for `Type[Any]`, [#1598](https://github.com/pydantic/pydantic/pull/1598) by [@samuelcolvin](https://github.com/samuelcolvin) +* Adjust handling of root validators so that errors are aggregated from _all_ failing root validators, instead of reporting on only the first root validator to fail, [#1586](https://github.com/pydantic/pydantic/pull/1586) by [@beezee](https://github.com/beezee) +* Make `__modify_schema__` on Enums apply to the enum schema rather than fields that use the enum, [#1581](https://github.com/pydantic/pydantic/pull/1581) by [@therefromhere](https://github.com/therefromhere) +* Fix behavior of `__all__` key when used in conjunction with index keys in advanced include/exclude of fields that are sequences, [#1579](https://github.com/pydantic/pydantic/pull/1579) by [@xspirus](https://github.com/xspirus) +* Subclass validators do not run when referencing a `List` field defined in a parent class when `each_item=True`. Added an example to the docs illustrating this, [#1566](https://github.com/pydantic/pydantic/pull/1566) by [@samueldeklund](https://github.com/samueldeklund) +* change `schema.field_class_to_schema` to support `frozenset` in schema, [#1557](https://github.com/pydantic/pydantic/pull/1557) by [@wangpeibao](https://github.com/wangpeibao) +* Call `__modify_schema__` only for the field schema, [#1552](https://github.com/pydantic/pydantic/pull/1552) by [@PrettyWood](https://github.com/PrettyWood) +* Move the assignment of `field.validate_always` in `fields.py` so the `always` parameter of validators work on inheritance, [#1545](https://github.com/pydantic/pydantic/pull/1545) by [@dcHHH](https://github.com/dcHHH) +* Added support for UUID instantiation through 16 byte strings such as `b'\x12\x34\x56\x78' * 4`. This was done to support `BINARY(16)` columns in sqlalchemy, [#1541](https://github.com/pydantic/pydantic/pull/1541) by [@shawnwall](https://github.com/shawnwall) +* Add a test assertion that `default_factory` can return a singleton, [#1523](https://github.com/pydantic/pydantic/pull/1523) by [@therefromhere](https://github.com/therefromhere) +* Add `NameEmail.__eq__` so duplicate `NameEmail` instances are evaluated as equal, [#1514](https://github.com/pydantic/pydantic/pull/1514) by [@stephen-bunn](https://github.com/stephen-bunn) +* Add datamodel-code-generator link in pydantic document site, [#1500](https://github.com/pydantic/pydantic/pull/1500) by [@koxudaxi](https://github.com/koxudaxi) +* Added a "Discussion of Pydantic" section to the documentation, with a link to "Pydantic Introduction" video by Alexander Hultnér, [#1499](https://github.com/pydantic/pydantic/pull/1499) by [@hultner](https://github.com/hultner) +* Avoid some side effects of `default_factory` by calling it only once + if possible and by not setting a default value in the schema, [#1491](https://github.com/pydantic/pydantic/pull/1491) by [@PrettyWood](https://github.com/PrettyWood) +* Added docs about dumping dataclasses to JSON, [#1487](https://github.com/pydantic/pydantic/pull/1487) by [@mikegrima](https://github.com/mikegrima) +* Make `BaseModel.__signature__` class-only, so getting `__signature__` from model instance will raise `AttributeError`, [#1466](https://github.com/pydantic/pydantic/pull/1466) by [@Bobronium](https://github.com/Bobronium) +* include `'format': 'password'` in the schema for secret types, [#1424](https://github.com/pydantic/pydantic/pull/1424) by [@atheuz](https://github.com/atheuz) +* Modify schema constraints on `ConstrainedFloat` so that `exclusiveMinimum` and + minimum are not included in the schema if they are equal to `-math.inf` and + `exclusiveMaximum` and `maximum` are not included if they are equal to `math.inf`, [#1417](https://github.com/pydantic/pydantic/pull/1417) by [@vdwees](https://github.com/vdwees) +* Squash internal `__root__` dicts in `.dict()` (and, by extension, in `.json()`), [#1414](https://github.com/pydantic/pydantic/pull/1414) by [@patrickkwang](https://github.com/patrickkwang) +* Move `const` validator to post-validators so it validates the parsed value, [#1410](https://github.com/pydantic/pydantic/pull/1410) by [@selimb](https://github.com/selimb) +* Fix model validation to handle nested literals, e.g. `Literal['foo', Literal['bar']]`, [#1364](https://github.com/pydantic/pydantic/pull/1364) by [@DBCerigo](https://github.com/DBCerigo) +* Remove `user_required = True` from `RedisDsn`, neither user nor password are required, [#1275](https://github.com/pydantic/pydantic/pull/1275) by [@samuelcolvin](https://github.com/samuelcolvin) +* Remove extra `allOf` from schema for fields with `Union` and custom `Field`, [#1209](https://github.com/pydantic/pydantic/pull/1209) by [@mostaphaRoudsari](https://github.com/mostaphaRoudsari) +* Updates OpenAPI schema generation to output all enums as separate models. + Instead of inlining the enum values in the model schema, models now use a `$ref` + property to point to the enum definition, [#1173](https://github.com/pydantic/pydantic/pull/1173) by [@calvinwyoung](https://github.com/calvinwyoung) + +## v1.5.1 (2020-04-23) + +* Signature generation with `extra: allow` never uses a field name, [#1418](https://github.com/pydantic/pydantic/pull/1418) by [@prettywood](https://github.com/prettywood) +* Avoid mutating `Field` default value, [#1412](https://github.com/pydantic/pydantic/pull/1412) by [@prettywood](https://github.com/prettywood) + +## v1.5 (2020-04-18) + +* Make includes/excludes arguments for `.dict()`, `._iter()`, ..., immutable, [#1404](https://github.com/pydantic/pydantic/pull/1404) by [@AlexECX](https://github.com/AlexECX) +* Always use a field's real name with includes/excludes in `model._iter()`, regardless of `by_alias`, [#1397](https://github.com/pydantic/pydantic/pull/1397) by [@AlexECX](https://github.com/AlexECX) +* Update constr regex example to include start and end lines, [#1396](https://github.com/pydantic/pydantic/pull/1396) by [@lmcnearney](https://github.com/lmcnearney) +* Confirm that shallow `model.copy()` does make a shallow copy of attributes, [#1383](https://github.com/pydantic/pydantic/pull/1383) by [@samuelcolvin](https://github.com/samuelcolvin) +* Renaming `model_name` argument of `main.create_model()` to `__model_name` to allow using `model_name` as a field name, [#1367](https://github.com/pydantic/pydantic/pull/1367) by [@kittipatv](https://github.com/kittipatv) +* Replace raising of exception to silent passing for non-Var attributes in mypy plugin, [#1345](https://github.com/pydantic/pydantic/pull/1345) by [@b0g3r](https://github.com/b0g3r) +* Remove `typing_extensions` dependency for Python 3.8, [#1342](https://github.com/pydantic/pydantic/pull/1342) by [@prettywood](https://github.com/prettywood) +* Make `SecretStr` and `SecretBytes` initialization idempotent, [#1330](https://github.com/pydantic/pydantic/pull/1330) by [@atheuz](https://github.com/atheuz) +* document making secret types dumpable using the json method, [#1328](https://github.com/pydantic/pydantic/pull/1328) by [@atheuz](https://github.com/atheuz) +* Move all testing and build to github actions, add windows and macos binaries, + thank you [@StephenBrown2](https://github.com/StephenBrown2) for much help, [#1326](https://github.com/pydantic/pydantic/pull/1326) by [@samuelcolvin](https://github.com/samuelcolvin) +* fix card number length check in `PaymentCardNumber`, `PaymentCardBrand` now inherits from `str`, [#1317](https://github.com/pydantic/pydantic/pull/1317) by [@samuelcolvin](https://github.com/samuelcolvin) +* Have `BaseModel` inherit from `Representation` to make mypy happy when overriding `__str__`, [#1310](https://github.com/pydantic/pydantic/pull/1310) by [@FuegoFro](https://github.com/FuegoFro) +* Allow `None` as input to all optional list fields, [#1307](https://github.com/pydantic/pydantic/pull/1307) by [@prettywood](https://github.com/prettywood) +* Add `datetime` field to `default_factory` example, [#1301](https://github.com/pydantic/pydantic/pull/1301) by [@StephenBrown2](https://github.com/StephenBrown2) +* Allow subclasses of known types to be encoded with superclass encoder, [#1291](https://github.com/pydantic/pydantic/pull/1291) by [@StephenBrown2](https://github.com/StephenBrown2) +* Exclude exported fields from all elements of a list/tuple of submodels/dicts with `'__all__'`, [#1286](https://github.com/pydantic/pydantic/pull/1286) by [@masalim2](https://github.com/masalim2) +* Add pydantic.color.Color objects as available input for Color fields, [#1258](https://github.com/pydantic/pydantic/pull/1258) by [@leosussan](https://github.com/leosussan) +* In examples, type nullable fields as `Optional`, so that these are valid mypy annotations, [#1248](https://github.com/pydantic/pydantic/pull/1248) by [@kokes](https://github.com/kokes) +* Make `pattern_validator()` accept pre-compiled `Pattern` objects. Fix `str_validator()` return type to `str`, [#1237](https://github.com/pydantic/pydantic/pull/1237) by [@adamgreg](https://github.com/adamgreg) +* Document how to manage Generics and inheritance, [#1229](https://github.com/pydantic/pydantic/pull/1229) by [@esadruhn](https://github.com/esadruhn) +* `update_forward_refs()` method of BaseModel now copies `__dict__` of class module instead of modyfying it, [#1228](https://github.com/pydantic/pydantic/pull/1228) by [@paul-ilyin](https://github.com/paul-ilyin) +* Support instance methods and class methods with `@validate_arguments`, [#1222](https://github.com/pydantic/pydantic/pull/1222) by [@samuelcolvin](https://github.com/samuelcolvin) +* Add `default_factory` argument to `Field` to create a dynamic default value by passing a zero-argument callable, [#1210](https://github.com/pydantic/pydantic/pull/1210) by [@prettywood](https://github.com/prettywood) +* add support for `NewType` of `List`, `Optional`, etc, [#1207](https://github.com/pydantic/pydantic/pull/1207) by [@Kazy](https://github.com/Kazy) +* fix mypy signature for `root_validator`, [#1192](https://github.com/pydantic/pydantic/pull/1192) by [@samuelcolvin](https://github.com/samuelcolvin) +* Fixed parsing of nested 'custom root type' models, [#1190](https://github.com/pydantic/pydantic/pull/1190) by [@Shados](https://github.com/Shados) +* Add `validate_arguments` function decorator which checks the arguments to a function matches type annotations, [#1179](https://github.com/pydantic/pydantic/pull/1179) by [@samuelcolvin](https://github.com/samuelcolvin) +* Add `__signature__` to models, [#1034](https://github.com/pydantic/pydantic/pull/1034) by [@Bobronium](https://github.com/Bobronium) +* Refactor `._iter()` method, 10x speed boost for `dict(model)`, [#1017](https://github.com/pydantic/pydantic/pull/1017) by [@Bobronium](https://github.com/Bobronium) + +## v1.4 (2020-01-24) + +* **Breaking Change:** alias precedence logic changed so aliases on a field always take priority over + an alias from `alias_generator` to avoid buggy/unexpected behaviour, + see [here](https://docs.pydantic.dev/usage/model_config/#alias-precedence) for details, [#1178](https://github.com/pydantic/pydantic/pull/1178) by [@samuelcolvin](https://github.com/samuelcolvin) +* Add support for unicode and punycode in TLDs, [#1182](https://github.com/pydantic/pydantic/pull/1182) by [@jamescurtin](https://github.com/jamescurtin) +* Fix `cls` argument in validators during assignment, [#1172](https://github.com/pydantic/pydantic/pull/1172) by [@samuelcolvin](https://github.com/samuelcolvin) +* completing Luhn algorithm for `PaymentCardNumber`, [#1166](https://github.com/pydantic/pydantic/pull/1166) by [@cuencandres](https://github.com/cuencandres) +* add support for generics that implement `__get_validators__` like a custom data type, [#1159](https://github.com/pydantic/pydantic/pull/1159) by [@tiangolo](https://github.com/tiangolo) +* add support for infinite generators with `Iterable`, [#1152](https://github.com/pydantic/pydantic/pull/1152) by [@tiangolo](https://github.com/tiangolo) +* fix `url_regex` to accept schemas with `+`, `-` and `.` after the first character, [#1142](https://github.com/pydantic/pydantic/pull/1142) by [@samuelcolvin](https://github.com/samuelcolvin) +* move `version_info()` to `version.py`, suggest its use in issues, [#1138](https://github.com/pydantic/pydantic/pull/1138) by [@samuelcolvin](https://github.com/samuelcolvin) +* Improve pydantic import time by roughly 50% by deferring some module loading and regex compilation, [#1127](https://github.com/pydantic/pydantic/pull/1127) by [@samuelcolvin](https://github.com/samuelcolvin) +* Fix `EmailStr` and `NameEmail` to accept instances of themselves in cython, [#1126](https://github.com/pydantic/pydantic/pull/1126) by [@koxudaxi](https://github.com/koxudaxi) +* Pass model class to the `Config.schema_extra` callable, [#1125](https://github.com/pydantic/pydantic/pull/1125) by [@therefromhere](https://github.com/therefromhere) +* Fix regex for username and password in URLs, [#1115](https://github.com/pydantic/pydantic/pull/1115) by [@samuelcolvin](https://github.com/samuelcolvin) +* Add support for nested generic models, [#1104](https://github.com/pydantic/pydantic/pull/1104) by [@dmontagu](https://github.com/dmontagu) +* add `__all__` to `__init__.py` to prevent "implicit reexport" errors from mypy, [#1072](https://github.com/pydantic/pydantic/pull/1072) by [@samuelcolvin](https://github.com/samuelcolvin) +* Add support for using "dotenv" files with `BaseSettings`, [#1011](https://github.com/pydantic/pydantic/pull/1011) by [@acnebs](https://github.com/acnebs) + +## v1.3 (2019-12-21) + +* Change `schema` and `schema_model` to handle dataclasses by using their `__pydantic_model__` feature, [#792](https://github.com/pydantic/pydantic/pull/792) by [@aviramha](https://github.com/aviramha) +* Added option for `root_validator` to be skipped if values validation fails using keyword `skip_on_failure=True`, [#1049](https://github.com/pydantic/pydantic/pull/1049) by [@aviramha](https://github.com/aviramha) +* Allow `Config.schema_extra` to be a callable so that the generated schema can be post-processed, [#1054](https://github.com/pydantic/pydantic/pull/1054) by [@selimb](https://github.com/selimb) +* Update mypy to version 0.750, [#1057](https://github.com/pydantic/pydantic/pull/1057) by [@dmontagu](https://github.com/dmontagu) +* Trick Cython into allowing str subclassing, [#1061](https://github.com/pydantic/pydantic/pull/1061) by [@skewty](https://github.com/skewty) +* Prevent type attributes being added to schema unless the attribute `__schema_attributes__` is `True`, [#1064](https://github.com/pydantic/pydantic/pull/1064) by [@samuelcolvin](https://github.com/samuelcolvin) +* Change `BaseModel.parse_file` to use `Config.json_loads`, [#1067](https://github.com/pydantic/pydantic/pull/1067) by [@kierandarcy](https://github.com/kierandarcy) +* Fix for optional `Json` fields, [#1073](https://github.com/pydantic/pydantic/pull/1073) by [@volker48](https://github.com/volker48) +* Change the default number of threads used when compiling with cython to one, + allow override via the `CYTHON_NTHREADS` environment variable, [#1074](https://github.com/pydantic/pydantic/pull/1074) by [@samuelcolvin](https://github.com/samuelcolvin) +* Run FastAPI tests during Pydantic's CI tests, [#1075](https://github.com/pydantic/pydantic/pull/1075) by [@tiangolo](https://github.com/tiangolo) +* My mypy strictness constraints, and associated tweaks to type annotations, [#1077](https://github.com/pydantic/pydantic/pull/1077) by [@samuelcolvin](https://github.com/samuelcolvin) +* Add `__eq__` to SecretStr and SecretBytes to allow "value equals", [#1079](https://github.com/pydantic/pydantic/pull/1079) by [@sbv-trueenergy](https://github.com/sbv-trueenergy) +* Fix schema generation for nested None case, [#1088](https://github.com/pydantic/pydantic/pull/1088) by [@lutostag](https://github.com/lutostag) +* Consistent checks for sequence like objects, [#1090](https://github.com/pydantic/pydantic/pull/1090) by [@samuelcolvin](https://github.com/samuelcolvin) +* Fix `Config` inheritance on `BaseSettings` when used with `env_prefix`, [#1091](https://github.com/pydantic/pydantic/pull/1091) by [@samuelcolvin](https://github.com/samuelcolvin) +* Fix for `__modify_schema__` when it conflicted with `field_class_to_schema*`, [#1102](https://github.com/pydantic/pydantic/pull/1102) by [@samuelcolvin](https://github.com/samuelcolvin) +* docs: Fix explanation of case sensitive environment variable names when populating `BaseSettings` subclass attributes, [#1105](https://github.com/pydantic/pydantic/pull/1105) by [@tribals](https://github.com/tribals) +* Rename django-rest-framework benchmark in documentation, [#1119](https://github.com/pydantic/pydantic/pull/1119) by [@frankie567](https://github.com/frankie567) + +## v1.2 (2019-11-28) + +* **Possible Breaking Change:** Add support for required `Optional` with `name: Optional[AnyType] = Field(...)` + and refactor `ModelField` creation to preserve `required` parameter value, [#1031](https://github.com/pydantic/pydantic/pull/1031) by [@tiangolo](https://github.com/tiangolo); + see [here](https://docs.pydantic.dev/usage/models/#required-optional-fields) for details +* Add benchmarks for `cattrs`, [#513](https://github.com/pydantic/pydantic/pull/513) by [@sebastianmika](https://github.com/sebastianmika) +* Add `exclude_none` option to `dict()` and friends, [#587](https://github.com/pydantic/pydantic/pull/587) by [@niknetniko](https://github.com/niknetniko) +* Add benchmarks for `valideer`, [#670](https://github.com/pydantic/pydantic/pull/670) by [@gsakkis](https://github.com/gsakkis) +* Add `parse_obj_as` and `parse_file_as` functions for ad-hoc parsing of data into arbitrary pydantic-compatible types, [#934](https://github.com/pydantic/pydantic/pull/934) by [@dmontagu](https://github.com/dmontagu) +* Add `allow_reuse` argument to validators, thus allowing validator reuse, [#940](https://github.com/pydantic/pydantic/pull/940) by [@dmontagu](https://github.com/dmontagu) +* Add support for mapping types for custom root models, [#958](https://github.com/pydantic/pydantic/pull/958) by [@dmontagu](https://github.com/dmontagu) +* Mypy plugin support for dataclasses, [#966](https://github.com/pydantic/pydantic/pull/966) by [@koxudaxi](https://github.com/koxudaxi) +* Add support for dataclasses default factory, [#968](https://github.com/pydantic/pydantic/pull/968) by [@ahirner](https://github.com/ahirner) +* Add a `ByteSize` type for converting byte string (`1GB`) to plain bytes, [#977](https://github.com/pydantic/pydantic/pull/977) by [@dgasmith](https://github.com/dgasmith) +* Fix mypy complaint about `@root_validator(pre=True)`, [#984](https://github.com/pydantic/pydantic/pull/984) by [@samuelcolvin](https://github.com/samuelcolvin) +* Add manylinux binaries for Python 3.8 to pypi, also support manylinux2010, [#994](https://github.com/pydantic/pydantic/pull/994) by [@samuelcolvin](https://github.com/samuelcolvin) +* Adds ByteSize conversion to another unit, [#995](https://github.com/pydantic/pydantic/pull/995) by [@dgasmith](https://github.com/dgasmith) +* Fix `__str__` and `__repr__` inheritance for models, [#1022](https://github.com/pydantic/pydantic/pull/1022) by [@samuelcolvin](https://github.com/samuelcolvin) +* add testimonials section to docs, [#1025](https://github.com/pydantic/pydantic/pull/1025) by [@sullivancolin](https://github.com/sullivancolin) +* Add support for `typing.Literal` for Python 3.8, [#1026](https://github.com/pydantic/pydantic/pull/1026) by [@dmontagu](https://github.com/dmontagu) + +## v1.1.1 (2019-11-20) + +* Fix bug where use of complex fields on sub-models could cause fields to be incorrectly configured, [#1015](https://github.com/pydantic/pydantic/pull/1015) by [@samuelcolvin](https://github.com/samuelcolvin) + +## v1.1 (2019-11-07) + +* Add a mypy plugin for type checking `BaseModel.__init__` and more, [#722](https://github.com/pydantic/pydantic/pull/722) by [@dmontagu](https://github.com/dmontagu) +* Change return type typehint for `GenericModel.__class_getitem__` to prevent PyCharm warnings, [#936](https://github.com/pydantic/pydantic/pull/936) by [@dmontagu](https://github.com/dmontagu) +* Fix usage of `Any` to allow `None`, also support `TypeVar` thus allowing use of un-parameterised collection types + e.g. `Dict` and `List`, [#962](https://github.com/pydantic/pydantic/pull/962) by [@samuelcolvin](https://github.com/samuelcolvin) +* Set `FieldInfo` on subfields to fix schema generation for complex nested types, [#965](https://github.com/pydantic/pydantic/pull/965) by [@samuelcolvin](https://github.com/samuelcolvin) + +## v1.0 (2019-10-23) + +* **Breaking Change:** deprecate the `Model.fields` property, use `Model.__fields__` instead, [#883](https://github.com/pydantic/pydantic/pull/883) by [@samuelcolvin](https://github.com/samuelcolvin) +* **Breaking Change:** Change the precedence of aliases so child model aliases override parent aliases, + including using `alias_generator`, [#904](https://github.com/pydantic/pydantic/pull/904) by [@samuelcolvin](https://github.com/samuelcolvin) +* **Breaking change:** Rename `skip_defaults` to `exclude_unset`, and add ability to exclude actual defaults, [#915](https://github.com/pydantic/pydantic/pull/915) by [@dmontagu](https://github.com/dmontagu) +* Add `**kwargs` to `pydantic.main.ModelMetaclass.__new__` so `__init_subclass__` can take custom parameters on extended + `BaseModel` classes, [#867](https://github.com/pydantic/pydantic/pull/867) by [@retnikt](https://github.com/retnikt) +* Fix field of a type that has a default value, [#880](https://github.com/pydantic/pydantic/pull/880) by [@koxudaxi](https://github.com/koxudaxi) +* Use `FutureWarning` instead of `DeprecationWarning` when `alias` instead of `env` is used for settings models, [#881](https://github.com/pydantic/pydantic/pull/881) by [@samuelcolvin](https://github.com/samuelcolvin) +* Fix issue with `BaseSettings` inheritance and `alias` getting set to `None`, [#882](https://github.com/pydantic/pydantic/pull/882) by [@samuelcolvin](https://github.com/samuelcolvin) +* Modify `__repr__` and `__str__` methods to be consistent across all public classes, add `__pretty__` to support + python-devtools, [#884](https://github.com/pydantic/pydantic/pull/884) by [@samuelcolvin](https://github.com/samuelcolvin) +* deprecation warning for `case_insensitive` on `BaseSettings` config, [#885](https://github.com/pydantic/pydantic/pull/885) by [@samuelcolvin](https://github.com/samuelcolvin) +* For `BaseSettings` merge environment variables and in-code values recursively, as long as they create a valid object + when merged together, to allow splitting init arguments, [#888](https://github.com/pydantic/pydantic/pull/888) by [@idmitrievsky](https://github.com/idmitrievsky) +* change secret types example, [#890](https://github.com/pydantic/pydantic/pull/890) by [@ashears](https://github.com/ashears) +* Change the signature of `Model.construct()` to be more user-friendly, document `construct()` usage, [#898](https://github.com/pydantic/pydantic/pull/898) by [@samuelcolvin](https://github.com/samuelcolvin) +* Add example for the `construct()` method, [#907](https://github.com/pydantic/pydantic/pull/907) by [@ashears](https://github.com/ashears) +* Improve use of `Field` constraints on complex types, raise an error if constraints are not enforceable, + also support tuples with an ellipsis `Tuple[X, ...]`, `Sequence` and `FrozenSet` in schema, [#909](https://github.com/pydantic/pydantic/pull/909) by [@samuelcolvin](https://github.com/samuelcolvin) +* update docs for bool missing valid value, [#911](https://github.com/pydantic/pydantic/pull/911) by [@trim21](https://github.com/trim21) +* Better `str`/`repr` logic for `ModelField`, [#912](https://github.com/pydantic/pydantic/pull/912) by [@samuelcolvin](https://github.com/samuelcolvin) +* Fix `ConstrainedList`, update schema generation to reflect `min_items` and `max_items` `Field()` arguments, [#917](https://github.com/pydantic/pydantic/pull/917) by [@samuelcolvin](https://github.com/samuelcolvin) +* Allow abstracts sets (eg. dict keys) in the `include` and `exclude` arguments of `dict()`, [#921](https://github.com/pydantic/pydantic/pull/921) by [@samuelcolvin](https://github.com/samuelcolvin) +* Fix JSON serialization errors on `ValidationError.json()` by using `pydantic_encoder`, [#922](https://github.com/pydantic/pydantic/pull/922) by [@samuelcolvin](https://github.com/samuelcolvin) +* Clarify usage of `remove_untouched`, improve error message for types with no validators, [#926](https://github.com/pydantic/pydantic/pull/926) by [@retnikt](https://github.com/retnikt) + +## v1.0b2 (2019-10-07) + +* Mark `StrictBool` typecheck as `bool` to allow for default values without mypy errors, [#690](https://github.com/pydantic/pydantic/pull/690) by [@dmontagu](https://github.com/dmontagu) +* Transfer the documentation build from sphinx to mkdocs, re-write much of the documentation, [#856](https://github.com/pydantic/pydantic/pull/856) by [@samuelcolvin](https://github.com/samuelcolvin) +* Add support for custom naming schemes for `GenericModel` subclasses, [#859](https://github.com/pydantic/pydantic/pull/859) by [@dmontagu](https://github.com/dmontagu) +* Add `if TYPE_CHECKING:` to the excluded lines for test coverage, [#874](https://github.com/pydantic/pydantic/pull/874) by [@dmontagu](https://github.com/dmontagu) +* Rename `allow_population_by_alias` to `allow_population_by_field_name`, remove unnecessary warning about it, [#875](https://github.com/pydantic/pydantic/pull/875) by [@samuelcolvin](https://github.com/samuelcolvin) + +## v1.0b1 (2019-10-01) + +* **Breaking Change:** rename `Schema` to `Field`, make it a function to placate mypy, [#577](https://github.com/pydantic/pydantic/pull/577) by [@samuelcolvin](https://github.com/samuelcolvin) +* **Breaking Change:** modify parsing behavior for `bool`, [#617](https://github.com/pydantic/pydantic/pull/617) by [@dmontagu](https://github.com/dmontagu) +* **Breaking Change:** `get_validators` is no longer recognised, use `__get_validators__`. + `Config.ignore_extra` and `Config.allow_extra` are no longer recognised, use `Config.extra`, [#720](https://github.com/pydantic/pydantic/pull/720) by [@samuelcolvin](https://github.com/samuelcolvin) +* **Breaking Change:** modify default config settings for `BaseSettings`; `case_insensitive` renamed to `case_sensitive`, + default changed to `case_sensitive = False`, `env_prefix` default changed to `''` - e.g. no prefix, [#721](https://github.com/pydantic/pydantic/pull/721) by [@dmontagu](https://github.com/dmontagu) +* **Breaking change:** Implement `root_validator` and rename root errors from `__obj__` to `__root__`, [#729](https://github.com/pydantic/pydantic/pull/729) by [@samuelcolvin](https://github.com/samuelcolvin) +* **Breaking Change:** alter the behaviour of `dict(model)` so that sub-models are nolonger + converted to dictionaries, [#733](https://github.com/pydantic/pydantic/pull/733) by [@samuelcolvin](https://github.com/samuelcolvin) +* **Breaking change:** Added `initvars` support to `post_init_post_parse`, [#748](https://github.com/pydantic/pydantic/pull/748) by [@Raphael-C-Almeida](https://github.com/Raphael-C-Almeida) +* **Breaking Change:** Make `BaseModel.json()` only serialize the `__root__` key for models with custom root, [#752](https://github.com/pydantic/pydantic/pull/752) by [@dmontagu](https://github.com/dmontagu) +* **Breaking Change:** complete rewrite of `URL` parsing logic, [#755](https://github.com/pydantic/pydantic/pull/755) by [@samuelcolvin](https://github.com/samuelcolvin) +* **Breaking Change:** preserve superclass annotations for field-determination when not provided in subclass, [#757](https://github.com/pydantic/pydantic/pull/757) by [@dmontagu](https://github.com/dmontagu) +* **Breaking Change:** `BaseSettings` now uses the special `env` settings to define which environment variables to + read, not aliases, [#847](https://github.com/pydantic/pydantic/pull/847) by [@samuelcolvin](https://github.com/samuelcolvin) +* add support for `assert` statements inside validators, [#653](https://github.com/pydantic/pydantic/pull/653) by [@abdusco](https://github.com/abdusco) +* Update documentation to specify the use of `pydantic.dataclasses.dataclass` and subclassing `pydantic.BaseModel`, [#710](https://github.com/pydantic/pydantic/pull/710) by [@maddosaurus](https://github.com/maddosaurus) +* Allow custom JSON decoding and encoding via `json_loads` and `json_dumps` `Config` properties, [#714](https://github.com/pydantic/pydantic/pull/714) by [@samuelcolvin](https://github.com/samuelcolvin) +* make all annotated fields occur in the order declared, [#715](https://github.com/pydantic/pydantic/pull/715) by [@dmontagu](https://github.com/dmontagu) +* use pytest to test `mypy` integration, [#735](https://github.com/pydantic/pydantic/pull/735) by [@dmontagu](https://github.com/dmontagu) +* add `__repr__` method to `ErrorWrapper`, [#738](https://github.com/pydantic/pydantic/pull/738) by [@samuelcolvin](https://github.com/samuelcolvin) +* Added support for `FrozenSet` members in dataclasses, and a better error when attempting to use types from the `typing` module that are not supported by Pydantic, [#745](https://github.com/pydantic/pydantic/pull/745) by [@djpetti](https://github.com/djpetti) +* add documentation for Pycharm Plugin, [#750](https://github.com/pydantic/pydantic/pull/750) by [@koxudaxi](https://github.com/koxudaxi) +* fix broken examples in the docs, [#753](https://github.com/pydantic/pydantic/pull/753) by [@dmontagu](https://github.com/dmontagu) +* moving typing related objects into `pydantic.typing`, [#761](https://github.com/pydantic/pydantic/pull/761) by [@samuelcolvin](https://github.com/samuelcolvin) +* Minor performance improvements to `ErrorWrapper`, `ValidationError` and datetime parsing, [#763](https://github.com/pydantic/pydantic/pull/763) by [@samuelcolvin](https://github.com/samuelcolvin) +* Improvements to `datetime`/`date`/`time`/`timedelta` types: more descriptive errors, + change errors to `value_error` not `type_error`, support bytes, [#766](https://github.com/pydantic/pydantic/pull/766) by [@samuelcolvin](https://github.com/samuelcolvin) +* fix error messages for `Literal` types with multiple allowed values, [#770](https://github.com/pydantic/pydantic/pull/770) by [@dmontagu](https://github.com/dmontagu) +* Improved auto-generated `title` field in JSON schema by converting underscore to space, [#772](https://github.com/pydantic/pydantic/pull/772) by [@skewty](https://github.com/skewty) +* support `mypy --no-implicit-reexport` for dataclasses, also respect `--no-implicit-reexport` in pydantic itself, [#783](https://github.com/pydantic/pydantic/pull/783) by [@samuelcolvin](https://github.com/samuelcolvin) +* add the `PaymentCardNumber` type, [#790](https://github.com/pydantic/pydantic/pull/790) by [@matin](https://github.com/matin) +* Fix const validations for lists, [#794](https://github.com/pydantic/pydantic/pull/794) by [@hmvp](https://github.com/hmvp) +* Set `additionalProperties` to false in schema for models with extra fields disallowed, [#796](https://github.com/pydantic/pydantic/pull/796) by [@Code0x58](https://github.com/Code0x58) +* `EmailStr` validation method now returns local part case-sensitive per RFC 5321, [#798](https://github.com/pydantic/pydantic/pull/798) by [@henriklindgren](https://github.com/henriklindgren) +* Added ability to validate strictness to `ConstrainedFloat`, `ConstrainedInt` and `ConstrainedStr` and added + `StrictFloat` and `StrictInt` classes, [#799](https://github.com/pydantic/pydantic/pull/799) by [@DerRidda](https://github.com/DerRidda) +* Improve handling of `None` and `Optional`, replace `whole` with `each_item` (inverse meaning, default `False`) + on validators, [#803](https://github.com/pydantic/pydantic/pull/803) by [@samuelcolvin](https://github.com/samuelcolvin) +* add support for `Type[T]` type hints, [#807](https://github.com/pydantic/pydantic/pull/807) by [@timonbimon](https://github.com/timonbimon) +* Performance improvements from removing `change_exceptions`, change how pydantic error are constructed, [#819](https://github.com/pydantic/pydantic/pull/819) by [@samuelcolvin](https://github.com/samuelcolvin) +* Fix the error message arising when a `BaseModel`-type model field causes a `ValidationError` during parsing, [#820](https://github.com/pydantic/pydantic/pull/820) by [@dmontagu](https://github.com/dmontagu) +* allow `getter_dict` on `Config`, modify `GetterDict` to be more like a `Mapping` object and thus easier to work with, [#821](https://github.com/pydantic/pydantic/pull/821) by [@samuelcolvin](https://github.com/samuelcolvin) +* Only check `TypeVar` param on base `GenericModel` class, [#842](https://github.com/pydantic/pydantic/pull/842) by [@zpencerq](https://github.com/zpencerq) +* rename `Model._schema_cache` -> `Model.__schema_cache__`, `Model._json_encoder` -> `Model.__json_encoder__`, + `Model._custom_root_type` -> `Model.__custom_root_type__`, [#851](https://github.com/pydantic/pydantic/pull/851) by [@samuelcolvin](https://github.com/samuelcolvin) + + +... see [here](https://docs.pydantic.dev/changelog/#v0322-2019-08-17) for earlier changes. diff --git a/Backend/venv/lib/python3.12/site-packages/pydantic-2.5.0.dist-info/RECORD b/Backend/venv/lib/python3.12/site-packages/pydantic-2.5.0.dist-info/RECORD new file mode 100644 index 00000000..79559575 --- /dev/null +++ b/Backend/venv/lib/python3.12/site-packages/pydantic-2.5.0.dist-info/RECORD @@ -0,0 +1,196 @@ +pydantic-2.5.0.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 +pydantic-2.5.0.dist-info/METADATA,sha256=ue6gfzl4oP6G5Qi-Ymny4KNpXWNhAjzZIoQxTiM326k,174564 +pydantic-2.5.0.dist-info/RECORD,, +pydantic-2.5.0.dist-info/REQUESTED,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +pydantic-2.5.0.dist-info/WHEEL,sha256=9QBuHhg6FNW7lppboF2vKVbCGTVzsFykgRQjjlajrhA,87 +pydantic-2.5.0.dist-info/licenses/LICENSE,sha256=qeGG88oWte74QxjnpwFyE1GgDLe4rjpDlLZ7SeNSnvM,1129 +pydantic/__init__.py,sha256=0jUaDGNpcQr0AHpu-gdgH6_gK7i5raGe4btfuiKbs2w,12401 +pydantic/__pycache__/__init__.cpython-312.pyc,, +pydantic/__pycache__/_migration.cpython-312.pyc,, +pydantic/__pycache__/alias_generators.cpython-312.pyc,, +pydantic/__pycache__/annotated_handlers.cpython-312.pyc,, +pydantic/__pycache__/class_validators.cpython-312.pyc,, +pydantic/__pycache__/color.cpython-312.pyc,, +pydantic/__pycache__/config.cpython-312.pyc,, +pydantic/__pycache__/dataclasses.cpython-312.pyc,, +pydantic/__pycache__/datetime_parse.cpython-312.pyc,, +pydantic/__pycache__/decorator.cpython-312.pyc,, +pydantic/__pycache__/env_settings.cpython-312.pyc,, +pydantic/__pycache__/error_wrappers.cpython-312.pyc,, +pydantic/__pycache__/errors.cpython-312.pyc,, +pydantic/__pycache__/fields.cpython-312.pyc,, +pydantic/__pycache__/functional_serializers.cpython-312.pyc,, +pydantic/__pycache__/functional_validators.cpython-312.pyc,, +pydantic/__pycache__/generics.cpython-312.pyc,, +pydantic/__pycache__/json.cpython-312.pyc,, +pydantic/__pycache__/json_schema.cpython-312.pyc,, +pydantic/__pycache__/main.cpython-312.pyc,, +pydantic/__pycache__/mypy.cpython-312.pyc,, +pydantic/__pycache__/networks.cpython-312.pyc,, +pydantic/__pycache__/parse.cpython-312.pyc,, +pydantic/__pycache__/root_model.cpython-312.pyc,, +pydantic/__pycache__/schema.cpython-312.pyc,, +pydantic/__pycache__/tools.cpython-312.pyc,, +pydantic/__pycache__/type_adapter.cpython-312.pyc,, +pydantic/__pycache__/types.cpython-312.pyc,, +pydantic/__pycache__/typing.cpython-312.pyc,, +pydantic/__pycache__/utils.cpython-312.pyc,, +pydantic/__pycache__/validate_call_decorator.cpython-312.pyc,, +pydantic/__pycache__/validators.cpython-312.pyc,, +pydantic/__pycache__/version.cpython-312.pyc,, +pydantic/__pycache__/warnings.cpython-312.pyc,, +pydantic/_internal/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +pydantic/_internal/__pycache__/__init__.cpython-312.pyc,, +pydantic/_internal/__pycache__/_config.cpython-312.pyc,, +pydantic/_internal/__pycache__/_core_metadata.cpython-312.pyc,, +pydantic/_internal/__pycache__/_core_utils.cpython-312.pyc,, +pydantic/_internal/__pycache__/_dataclasses.cpython-312.pyc,, +pydantic/_internal/__pycache__/_decorators.cpython-312.pyc,, +pydantic/_internal/__pycache__/_decorators_v1.cpython-312.pyc,, +pydantic/_internal/__pycache__/_discriminated_union.cpython-312.pyc,, +pydantic/_internal/__pycache__/_fields.cpython-312.pyc,, +pydantic/_internal/__pycache__/_forward_ref.cpython-312.pyc,, +pydantic/_internal/__pycache__/_generate_schema.cpython-312.pyc,, +pydantic/_internal/__pycache__/_generics.cpython-312.pyc,, +pydantic/_internal/__pycache__/_internal_dataclass.cpython-312.pyc,, +pydantic/_internal/__pycache__/_known_annotated_metadata.cpython-312.pyc,, +pydantic/_internal/__pycache__/_mock_val_ser.cpython-312.pyc,, +pydantic/_internal/__pycache__/_model_construction.cpython-312.pyc,, +pydantic/_internal/__pycache__/_repr.cpython-312.pyc,, +pydantic/_internal/__pycache__/_schema_generation_shared.cpython-312.pyc,, +pydantic/_internal/__pycache__/_std_types_schema.cpython-312.pyc,, +pydantic/_internal/__pycache__/_typing_extra.cpython-312.pyc,, +pydantic/_internal/__pycache__/_utils.cpython-312.pyc,, +pydantic/_internal/__pycache__/_validate_call.cpython-312.pyc,, +pydantic/_internal/__pycache__/_validators.cpython-312.pyc,, +pydantic/_internal/_config.py,sha256=fHqmP2A3BJeBZkryRUQrt0t9tGdRg3cUbOb-r0Q4-vw,11408 +pydantic/_internal/_core_metadata.py,sha256=Da-e0-DXK__dJvog0e8CZLQ4r_k9RpldG6KQTGrYlHg,3521 +pydantic/_internal/_core_utils.py,sha256=OAkGU1PxigjfUDdbdXm0xIdLTDzUR7g0U_CY_tgS6Lc,25009 +pydantic/_internal/_dataclasses.py,sha256=v8WjfAlFdyu767lk50iyxBtpdCfERngdippr4v0XVnM,10636 +pydantic/_internal/_decorators.py,sha256=Sy6HuCGgme69ttWkS2EqRtT9VZTjAK2_33L2l9JOTNE,30856 +pydantic/_internal/_decorators_v1.py,sha256=_m9TskhZh9yPUn7Jmy3KbKa3UDREQWyMm5NXyOJM3R8,6266 +pydantic/_internal/_discriminated_union.py,sha256=QRh8P2_i0oKk6j4lW4Y9z8EV8AXFhWOT8mAszsOsrZ0,26598 +pydantic/_internal/_fields.py,sha256=sPwEKQnGXpTwkXLqwwPy-YrBvjr35Maux1xBtP_AQDw,12638 +pydantic/_internal/_forward_ref.py,sha256=5n3Y7-3AKLn8_FS3Yc7KutLiPUhyXmAtkEZOaFnonwM,611 +pydantic/_internal/_generate_schema.py,sha256=VQ5S73Dhh_MRW9z43rBdzMIH1rnlfh4aAgcIDGech3Y,96517 +pydantic/_internal/_generics.py,sha256=i9voXYIspptcC1-qXCNynhq0ijpQ1AwgkOXL6bDs3SM,22344 +pydantic/_internal/_internal_dataclass.py,sha256=NswLpapJY_61NFHBAXYpgFdxMmIX_yE9ttx_pQt_Vp8,207 +pydantic/_internal/_known_annotated_metadata.py,sha256=DokRRZNcFgyUoeAOzgB3Jp1nD5b39HxwdnE9druaKgc,16415 +pydantic/_internal/_mock_val_ser.py,sha256=5DqrtofFw4wUmZWNky6zaFwyCAbjTTD9XQc8FK2JzKc,5180 +pydantic/_internal/_model_construction.py,sha256=iWmIyLKRsVs6cUWw-FMlitbgZroBgU3ZYwyvfg67bG4,27169 +pydantic/_internal/_repr.py,sha256=APDlOwrPu07hTWTf1PgvWU2jelo80BHM8oAciS1VmP4,4485 +pydantic/_internal/_schema_generation_shared.py,sha256=eRwZ85Gj0FfabYlvM97I5997vhY4Mk3AYQJljK5B3to,4855 +pydantic/_internal/_std_types_schema.py,sha256=6Q5kGGe_7GL3aDUh5PkwH1JAaNWetAEzuWZ2MktQSfw,29085 +pydantic/_internal/_typing_extra.py,sha256=WkD7d6o_arCYzNjYsDQi8F-mwv2R-XHL2QPmzuTITxo,16863 +pydantic/_internal/_utils.py,sha256=afJfxw4kZmpnN62DbmtQYiY7nUy07W-KhVa4i4u5ugw,11714 +pydantic/_internal/_validate_call.py,sha256=2Gaum1PDs36T_CdnfT-2tGyq6x8usRAjojo1Fb3dywc,5755 +pydantic/_internal/_validators.py,sha256=GbyE9vUkMafP89hRj8Zdm2TXSpA6ynMZz8qPKqUhdlI,10054 +pydantic/_migration.py,sha256=j6TbRpJofjAX8lr-k2nVnQcBR9RD2B91I7Ulcw_ZzEo,11913 +pydantic/alias_generators.py,sha256=95F9x9P1bzzL7Z3y5F2BvEF9SMUEiT-r69SWlJao_3E,1141 +pydantic/annotated_handlers.py,sha256=iyOdMvz2-G-pe6HJ1a1EpRYn3EnktNyppmlI0YeM-Ss,4346 +pydantic/class_validators.py,sha256=iQz1Tw8FBliqEapmzB7iLkbwkJAeAx5314Vksb_Kj0g,147 +pydantic/color.py,sha256=Pq4DAe1HgmbhKlrZ5kbal23npquKd9c0RPwPPCS_OYM,21493 +pydantic/config.py,sha256=pvcDw99rpfZTcN7cKU7-hIxHUmXjhEAwxNvGzbbux1w,27545 +pydantic/dataclasses.py,sha256=WXSTlIxUPtTJjQK--WFnHcpsubeQ8G6N-I-z_FgCCII,12469 +pydantic/datetime_parse.py,sha256=5lJpo3-iBTAA9YmMuDLglP-5f2k8etayAXjEi6rfEN0,149 +pydantic/decorator.py,sha256=Qqx1UU19tpRVp05a2NIK5OdpLXN_a84HZPMjt_5BxdE,144 +pydantic/deprecated/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +pydantic/deprecated/__pycache__/__init__.cpython-312.pyc,, +pydantic/deprecated/__pycache__/class_validators.cpython-312.pyc,, +pydantic/deprecated/__pycache__/config.cpython-312.pyc,, +pydantic/deprecated/__pycache__/copy_internals.cpython-312.pyc,, +pydantic/deprecated/__pycache__/decorator.cpython-312.pyc,, +pydantic/deprecated/__pycache__/json.cpython-312.pyc,, +pydantic/deprecated/__pycache__/parse.cpython-312.pyc,, +pydantic/deprecated/__pycache__/tools.cpython-312.pyc,, +pydantic/deprecated/class_validators.py,sha256=PWpcCzfDJsdgeFY2Xx3fg0OPpVnktEIL6I1C9fZXamM,9878 +pydantic/deprecated/config.py,sha256=zgaFWxmg5k6cWUs7ir_OGYS26MQJxRiblp6HPmCy0u4,2612 +pydantic/deprecated/copy_internals.py,sha256=SoUj1MevXt3fnloqNg5wivSUHSDPnuSj_YydzkEMzu0,7595 +pydantic/deprecated/decorator.py,sha256=rYviEY5ZM77OrpdBPaaitrnoFjh4ENCT_oBzvQASWjs,10903 +pydantic/deprecated/json.py,sha256=1hcwvq33cxrwIvUA6vm_rpb0qMdzxMQGiroo0jJHYtU,4465 +pydantic/deprecated/parse.py,sha256=GYT-CVRam_p13rH1bROnUlSKZf4NanvXt_KhTwkawPM,2513 +pydantic/deprecated/tools.py,sha256=2VRvcQIaJbFywkRvhFITjdkeujfunmMHgjjlioUNJp0,3278 +pydantic/env_settings.py,sha256=quxt8c9TioRg-u74gTW-GrK6r5mFXmn-J5H8FAC9Prc,147 +pydantic/error_wrappers.py,sha256=u9Dz8RgawIw8-rx7G7WGZoRtGptHXyXhHxiN9PbQ58g,149 +pydantic/errors.py,sha256=nRcIyey2FItANFNWCk6X1SyMElBw0izXYIZKL8r-d3A,4632 +pydantic/fields.py,sha256=KltRUjerVOA_f_I7MbixGfkhvuiLebgTU9D871dyx-o,46237 +pydantic/functional_serializers.py,sha256=ubcOeapLyEmvq4ZyZe0pWfHNji39Wm1BRXWXJTr177c,10780 +pydantic/functional_validators.py,sha256=XeaZmbfwF1QLNKTATNzMJGf63zkVosY1Ez2LvsMt9M4,22285 +pydantic/generics.py,sha256=T1UIBvpgur_28EIcR9Dc_Wo2r9yntzqdcR-NbnOLXB8,143 +pydantic/json.py,sha256=qk9fHVGWKNrvE-v2WxWLEm66t81JKttbySd9zjy0dnc,139 +pydantic/json_schema.py,sha256=yq80n7ybR3mkmCyyUh56FPxyu0kcHqWxg5oliHYYUL4,100969 +pydantic/main.py,sha256=GEyRlK-_mM2ANImQNpyIDUnqTe4FsSO5QJXqQqsFoHU,63149 +pydantic/mypy.py,sha256=SkQKSoJziHwuuOAAst6cKX50I92rlyknXbrB5ty0ya8,51836 +pydantic/networks.py,sha256=Qd_XZ1_9J1Svtc_Yqb_EOmzwEywNcULq9qI41udU4UA,20543 +pydantic/parse.py,sha256=BNo_W_gp1xR7kohYdHjF2m_5UNYFQxUt487-NR0RiK8,140 +pydantic/plugin/__init__.py,sha256=ig-mCaKrXm_5Dg8W-nbqIg9Agk-OH6DYAmxo3RFvl_8,6115 +pydantic/plugin/__pycache__/__init__.cpython-312.pyc,, +pydantic/plugin/__pycache__/_loader.cpython-312.pyc,, +pydantic/plugin/__pycache__/_schema_validator.cpython-312.pyc,, +pydantic/plugin/_loader.py,sha256=wW8GWTi1m14yNKg4XG9lf_BktsoBTyjO3w-andi7Hig,1972 +pydantic/plugin/_schema_validator.py,sha256=3eVp5-4IsIHEQrsCsh34oPf2bNyMJTVh3nGAH7IRC1M,5228 +pydantic/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +pydantic/root_model.py,sha256=lDuFoQw_FERrwb-Ezsi6MSWXfPV9KRTnDbdbtvJfWk8,4949 +pydantic/schema.py,sha256=EkbomWuaAdv7C3V8h6xxoT4uJKy3Mwvkg064tOUbvxg,141 +pydantic/tools.py,sha256=YB4vzOx4g7reKUM_s5oTXIGxC5LGBnGsXdVICSRuh7g,140 +pydantic/type_adapter.py,sha256=VYxlODzVNkVshWwmsTu-2H3vTvMH0Bk0T-BEhDvBWkI,17788 +pydantic/types.py,sha256=vxRwhnSTxMAjk9wYYt7fE0Eewmvf6YsP7FgEdfabgPM,86235 +pydantic/typing.py,sha256=sPkx0hi_RX7qSV3BB0zzHd8ZuAKbRRI37XJI4av_HzQ,137 +pydantic/utils.py,sha256=twRV5SqiguiCrOA9GvrKvOG-TThfWYb7mEXDVXFZp2s,140 +pydantic/v1/__init__.py,sha256=iTu8CwWWvn6zM_zYJtqhie24PImW25zokitz_06kDYw,2771 +pydantic/v1/__pycache__/__init__.cpython-312.pyc,, +pydantic/v1/__pycache__/_hypothesis_plugin.cpython-312.pyc,, +pydantic/v1/__pycache__/annotated_types.cpython-312.pyc,, +pydantic/v1/__pycache__/class_validators.cpython-312.pyc,, +pydantic/v1/__pycache__/color.cpython-312.pyc,, +pydantic/v1/__pycache__/config.cpython-312.pyc,, +pydantic/v1/__pycache__/dataclasses.cpython-312.pyc,, +pydantic/v1/__pycache__/datetime_parse.cpython-312.pyc,, +pydantic/v1/__pycache__/decorator.cpython-312.pyc,, +pydantic/v1/__pycache__/env_settings.cpython-312.pyc,, +pydantic/v1/__pycache__/error_wrappers.cpython-312.pyc,, +pydantic/v1/__pycache__/errors.cpython-312.pyc,, +pydantic/v1/__pycache__/fields.cpython-312.pyc,, +pydantic/v1/__pycache__/generics.cpython-312.pyc,, +pydantic/v1/__pycache__/json.cpython-312.pyc,, +pydantic/v1/__pycache__/main.cpython-312.pyc,, +pydantic/v1/__pycache__/mypy.cpython-312.pyc,, +pydantic/v1/__pycache__/networks.cpython-312.pyc,, +pydantic/v1/__pycache__/parse.cpython-312.pyc,, +pydantic/v1/__pycache__/schema.cpython-312.pyc,, +pydantic/v1/__pycache__/tools.cpython-312.pyc,, +pydantic/v1/__pycache__/types.cpython-312.pyc,, +pydantic/v1/__pycache__/typing.cpython-312.pyc,, +pydantic/v1/__pycache__/utils.cpython-312.pyc,, +pydantic/v1/__pycache__/validators.cpython-312.pyc,, +pydantic/v1/__pycache__/version.cpython-312.pyc,, +pydantic/v1/_hypothesis_plugin.py,sha256=gILcyAEfZ3u9YfKxtDxkReLpakjMou1VWC3FEcXmJgQ,14844 +pydantic/v1/annotated_types.py,sha256=dJTDUyPj4QJj4rDcNkt9xDUMGEkAnuWzDeGE2q7Wxrc,3124 +pydantic/v1/class_validators.py,sha256=0BZx0Ft19cREVHEOaA6wf_E3A0bTL4wQIGzeOinVatg,14595 +pydantic/v1/color.py,sha256=cGzck7kSD5beBkOMhda4bfTICput6dMx8GGpEU5SK5Y,16811 +pydantic/v1/config.py,sha256=h5ceeZ9HzDjUv0IZNYQoza0aNGFVo22iszY-6s0a3eM,6477 +pydantic/v1/dataclasses.py,sha256=roiVI64yCN68aMRxHEw615qgrcdEwpHAHfTEz_HlAtQ,17515 +pydantic/v1/datetime_parse.py,sha256=DhGfkbG4Vs5Oyxq3u8jM-7gFrbuUKsn-4aG2DJDJbHw,7714 +pydantic/v1/decorator.py,sha256=wzuIuKKHVjaiE97YBctCU0Vho0VRlUO-aVu1IUEczFE,10263 +pydantic/v1/env_settings.py,sha256=4PWxPYeK5jt59JJ4QGb90qU8pfC7qgGX44UESTmXdpE,14039 +pydantic/v1/error_wrappers.py,sha256=NvfemFFYx9EFLXBGeJ07MKT2MJQAJFFlx_bIoVpqgVI,5142 +pydantic/v1/errors.py,sha256=f93z30S4s5bJEl8JXh-zFCAtLDCko9ze2hKTkOimaa8,17693 +pydantic/v1/fields.py,sha256=fxTn7A17AXAHuDdz8HzFSjb8qfWhRoruwc2VOzRpUdM,50488 +pydantic/v1/generics.py,sha256=n5TTgh3EHkG1Xw3eY9A143bUN11_4m57Db5u49hkGJ8,17805 +pydantic/v1/json.py,sha256=B0gJ2WmPqw-6fsvPmgu-rwhhOy4E0JpbbYjC8HR01Ho,3346 +pydantic/v1/main.py,sha256=kC5_bcJc4zoLhRUVvNq67ACmGmRtQFvyRHDub6cw5ik,44378 +pydantic/v1/mypy.py,sha256=G8yQLLt6CodoTvGl84MP3ZpdInBtc0QoaLJ7iArHXNU,38745 +pydantic/v1/networks.py,sha256=TeV9FvCYg4ALk8j7dU1q6Ntze7yaUrCHQFEDJDnq1NI,22059 +pydantic/v1/parse.py,sha256=rrVhaWLK8t03rT3oxvC6uRLuTF5iZ2NKGvGqs4iQEM0,1810 +pydantic/v1/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +pydantic/v1/schema.py,sha256=ZqIQQpjxohG0hP7Zz5W401fpm4mYNu_Crmvr5HlgvMA,47615 +pydantic/v1/tools.py,sha256=ELC66w6UaU_HzAGfJBSIP47Aq9ZGkGiWPMLkkTs6VrI,2826 +pydantic/v1/types.py,sha256=S1doibLP6gg6TVZU9TwNfL2E10mFhZwCzd9WZK8Kilo,35380 +pydantic/v1/typing.py,sha256=5_C_fiUvWiAzW3MBJaHeuy2s3Hi52rFMxTfNPHv9_os,18996 +pydantic/v1/utils.py,sha256=5w7Q3N_Fqg5H9__JQDaumw9N3EFdlc7galEsCGxEDN0,25809 +pydantic/v1/validators.py,sha256=T-t9y9L_68El9p4PYkEVGEjpetNV6luav8Iwu9iTLkM,21887 +pydantic/v1/version.py,sha256=yUT25-EekWoBCsQwsA0kQTvIKOBUST7feqZT-TrbyX4,1039 +pydantic/validate_call_decorator.py,sha256=G9qjiaBNCZ5VsSWKIE2r0lZc3u1X3Q7K3MvYOCUUyyY,1780 +pydantic/validators.py,sha256=3oPhHojp9UD3PdEZpMYMkxeLGUAabRm__zera8_T92w,145 +pydantic/version.py,sha256=8Ec2ESNIInfUUuEbHJ6ht4UNTtQYrlD7Wd_9SHZiVvY,2333 +pydantic/warnings.py,sha256=EMmscArzAer1q2XWdD5u4z3yNmzr9LehqpDTqP9CSVE,2004 diff --git a/Backend/venv/lib/python3.12/site-packages/pytest-9.0.1.dist-info/REQUESTED b/Backend/venv/lib/python3.12/site-packages/pydantic-2.5.0.dist-info/REQUESTED similarity index 100% rename from Backend/venv/lib/python3.12/site-packages/pytest-9.0.1.dist-info/REQUESTED rename to Backend/venv/lib/python3.12/site-packages/pydantic-2.5.0.dist-info/REQUESTED diff --git a/Backend/venv/lib/python3.12/site-packages/pydantic-2.12.5.dist-info/WHEEL b/Backend/venv/lib/python3.12/site-packages/pydantic-2.5.0.dist-info/WHEEL similarity index 67% rename from Backend/venv/lib/python3.12/site-packages/pydantic-2.12.5.dist-info/WHEEL rename to Backend/venv/lib/python3.12/site-packages/pydantic-2.5.0.dist-info/WHEEL index 12228d41..ba1a8af2 100644 --- a/Backend/venv/lib/python3.12/site-packages/pydantic-2.12.5.dist-info/WHEEL +++ b/Backend/venv/lib/python3.12/site-packages/pydantic-2.5.0.dist-info/WHEEL @@ -1,4 +1,4 @@ Wheel-Version: 1.0 -Generator: hatchling 1.27.0 +Generator: hatchling 1.18.0 Root-Is-Purelib: true Tag: py3-none-any diff --git a/Backend/venv/lib/python3.12/site-packages/pydantic-2.12.5.dist-info/licenses/LICENSE b/Backend/venv/lib/python3.12/site-packages/pydantic-2.5.0.dist-info/licenses/LICENSE similarity index 100% rename from Backend/venv/lib/python3.12/site-packages/pydantic-2.12.5.dist-info/licenses/LICENSE rename to Backend/venv/lib/python3.12/site-packages/pydantic-2.5.0.dist-info/licenses/LICENSE diff --git a/Backend/venv/lib/python3.12/site-packages/pydantic/__init__.py b/Backend/venv/lib/python3.12/site-packages/pydantic/__init__.py index 01212849..4d5fef38 100644 --- a/Backend/venv/lib/python3.12/site-packages/pydantic/__init__.py +++ b/Backend/venv/lib/python3.12/site-packages/pydantic/__init__.py @@ -1,14 +1,9 @@ -from importlib import import_module -from typing import TYPE_CHECKING -from warnings import warn +import typing from ._migration import getattr_migration -from .version import VERSION, _ensure_pydantic_core_version +from .version import VERSION -_ensure_pydantic_core_version() -del _ensure_pydantic_core_version - -if TYPE_CHECKING: +if typing.TYPE_CHECKING: # import of virtually everything is supported via `__getattr__` below, # but we need them here for type checking and IDE support import pydantic_core @@ -21,11 +16,11 @@ if TYPE_CHECKING: ) from . import dataclasses - from .aliases import AliasChoices, AliasGenerator, AliasPath + from ._internal._generate_schema import GenerateSchema as GenerateSchema from .annotated_handlers import GetCoreSchemaHandler, GetJsonSchemaHandler - from .config import ConfigDict, with_config + from .config import ConfigDict from .errors import * - from .fields import Field, PrivateAttr, computed_field + from .fields import AliasChoices, AliasPath, Field, PrivateAttr, computed_field from .functional_serializers import ( PlainSerializer, SerializeAsAny, @@ -37,10 +32,8 @@ if TYPE_CHECKING: AfterValidator, BeforeValidator, InstanceOf, - ModelWrapValidatorHandler, PlainValidator, SkipValidation, - ValidateAs, WrapValidator, field_validator, model_validator, @@ -51,16 +44,7 @@ if TYPE_CHECKING: from .type_adapter import TypeAdapter from .types import * from .validate_call_decorator import validate_call - from .warnings import ( - PydanticDeprecatedSince20, - PydanticDeprecatedSince26, - PydanticDeprecatedSince29, - PydanticDeprecatedSince210, - PydanticDeprecatedSince211, - PydanticDeprecatedSince212, - PydanticDeprecationWarning, - PydanticExperimentalWarning, - ) + from .warnings import PydanticDeprecatedSince20, PydanticDeprecationWarning # this encourages pycharm to import `ValidationError` from here, not pydantic_core ValidationError = pydantic_core.ValidationError @@ -81,9 +65,7 @@ __all__ = ( 'PlainValidator', 'WrapValidator', 'SkipValidation', - 'ValidateAs', 'InstanceOf', - 'ModelWrapValidatorHandler', # JSON Schema 'WithJsonSchema', # deprecated V1 functional validators, these are imported via `__getattr__` below @@ -97,7 +79,6 @@ __all__ = ( 'WrapSerializer', # config 'ConfigDict', - 'with_config', # deprecated V1 config, these are imported via `__getattr__` below 'BaseConfig', 'Extra', @@ -110,15 +91,12 @@ __all__ = ( 'PydanticImportError', 'PydanticUndefinedAnnotation', 'PydanticInvalidForJsonSchema', - 'PydanticForbiddenQualifier', # fields + 'AliasPath', + 'AliasChoices', 'Field', 'computed_field', 'PrivateAttr', - # alias - 'AliasChoices', - 'AliasGenerator', - 'AliasPath', # main 'BaseModel', 'create_model', @@ -127,9 +105,6 @@ __all__ = ( 'AnyHttpUrl', 'FileUrl', 'HttpUrl', - 'FtpUrl', - 'WebsocketUrl', - 'AnyWebsocketUrl', 'UrlConstraints', 'EmailStr', 'NameEmail', @@ -142,11 +117,8 @@ __all__ = ( 'RedisDsn', 'MongoDsn', 'KafkaDsn', - 'NatsDsn', 'MySQLDsn', 'MariaDBDsn', - 'ClickHouseDsn', - 'SnowflakeDsn', 'validate_email', # root_model 'RootModel', @@ -181,17 +153,12 @@ __all__ = ( 'UUID3', 'UUID4', 'UUID5', - 'UUID6', - 'UUID7', - 'UUID8', 'FilePath', 'DirectoryPath', 'NewPath', 'Json', - 'Secret', 'SecretStr', 'SecretBytes', - 'SocketPath', 'StrictBool', 'StrictBytes', 'StrictInt', @@ -217,7 +184,6 @@ __all__ = ( 'Tag', 'Discriminator', 'JsonValue', - 'FailFast', # type_adapter 'TypeAdapter', # version @@ -225,16 +191,12 @@ __all__ = ( 'VERSION', # warnings 'PydanticDeprecatedSince20', - 'PydanticDeprecatedSince26', - 'PydanticDeprecatedSince29', - 'PydanticDeprecatedSince210', - 'PydanticDeprecatedSince211', - 'PydanticDeprecatedSince212', 'PydanticDeprecationWarning', - 'PydanticExperimentalWarning', # annotated handlers 'GetCoreSchemaHandler', 'GetJsonSchemaHandler', + # generate schema from ._internal + 'GenerateSchema', # pydantic_core 'ValidationError', 'ValidationInfo', @@ -242,162 +204,138 @@ __all__ = ( 'ValidatorFunctionWrapHandler', 'FieldSerializationInfo', 'SerializerFunctionWrapHandler', - 'OnErrorOmit', ) # A mapping of {: (package, )} defining dynamic imports _dynamic_imports: 'dict[str, tuple[str, str]]' = { - 'dataclasses': (__spec__.parent, '__module__'), + 'dataclasses': (__package__, '__module__'), # functional validators - 'field_validator': (__spec__.parent, '.functional_validators'), - 'model_validator': (__spec__.parent, '.functional_validators'), - 'AfterValidator': (__spec__.parent, '.functional_validators'), - 'BeforeValidator': (__spec__.parent, '.functional_validators'), - 'PlainValidator': (__spec__.parent, '.functional_validators'), - 'WrapValidator': (__spec__.parent, '.functional_validators'), - 'SkipValidation': (__spec__.parent, '.functional_validators'), - 'InstanceOf': (__spec__.parent, '.functional_validators'), - 'ValidateAs': (__spec__.parent, '.functional_validators'), - 'ModelWrapValidatorHandler': (__spec__.parent, '.functional_validators'), + 'field_validator': (__package__, '.functional_validators'), + 'model_validator': (__package__, '.functional_validators'), + 'AfterValidator': (__package__, '.functional_validators'), + 'BeforeValidator': (__package__, '.functional_validators'), + 'PlainValidator': (__package__, '.functional_validators'), + 'WrapValidator': (__package__, '.functional_validators'), + 'SkipValidation': (__package__, '.functional_validators'), + 'InstanceOf': (__package__, '.functional_validators'), # JSON Schema - 'WithJsonSchema': (__spec__.parent, '.json_schema'), + 'WithJsonSchema': (__package__, '.json_schema'), # functional serializers - 'field_serializer': (__spec__.parent, '.functional_serializers'), - 'model_serializer': (__spec__.parent, '.functional_serializers'), - 'PlainSerializer': (__spec__.parent, '.functional_serializers'), - 'SerializeAsAny': (__spec__.parent, '.functional_serializers'), - 'WrapSerializer': (__spec__.parent, '.functional_serializers'), + 'field_serializer': (__package__, '.functional_serializers'), + 'model_serializer': (__package__, '.functional_serializers'), + 'PlainSerializer': (__package__, '.functional_serializers'), + 'SerializeAsAny': (__package__, '.functional_serializers'), + 'WrapSerializer': (__package__, '.functional_serializers'), # config - 'ConfigDict': (__spec__.parent, '.config'), - 'with_config': (__spec__.parent, '.config'), + 'ConfigDict': (__package__, '.config'), # validate call - 'validate_call': (__spec__.parent, '.validate_call_decorator'), + 'validate_call': (__package__, '.validate_call_decorator'), # errors - 'PydanticErrorCodes': (__spec__.parent, '.errors'), - 'PydanticUserError': (__spec__.parent, '.errors'), - 'PydanticSchemaGenerationError': (__spec__.parent, '.errors'), - 'PydanticImportError': (__spec__.parent, '.errors'), - 'PydanticUndefinedAnnotation': (__spec__.parent, '.errors'), - 'PydanticInvalidForJsonSchema': (__spec__.parent, '.errors'), - 'PydanticForbiddenQualifier': (__spec__.parent, '.errors'), + 'PydanticErrorCodes': (__package__, '.errors'), + 'PydanticUserError': (__package__, '.errors'), + 'PydanticSchemaGenerationError': (__package__, '.errors'), + 'PydanticImportError': (__package__, '.errors'), + 'PydanticUndefinedAnnotation': (__package__, '.errors'), + 'PydanticInvalidForJsonSchema': (__package__, '.errors'), # fields - 'Field': (__spec__.parent, '.fields'), - 'computed_field': (__spec__.parent, '.fields'), - 'PrivateAttr': (__spec__.parent, '.fields'), - # alias - 'AliasChoices': (__spec__.parent, '.aliases'), - 'AliasGenerator': (__spec__.parent, '.aliases'), - 'AliasPath': (__spec__.parent, '.aliases'), + 'AliasPath': (__package__, '.fields'), + 'AliasChoices': (__package__, '.fields'), + 'Field': (__package__, '.fields'), + 'computed_field': (__package__, '.fields'), + 'PrivateAttr': (__package__, '.fields'), # main - 'BaseModel': (__spec__.parent, '.main'), - 'create_model': (__spec__.parent, '.main'), + 'BaseModel': (__package__, '.main'), + 'create_model': (__package__, '.main'), # network - 'AnyUrl': (__spec__.parent, '.networks'), - 'AnyHttpUrl': (__spec__.parent, '.networks'), - 'FileUrl': (__spec__.parent, '.networks'), - 'HttpUrl': (__spec__.parent, '.networks'), - 'FtpUrl': (__spec__.parent, '.networks'), - 'WebsocketUrl': (__spec__.parent, '.networks'), - 'AnyWebsocketUrl': (__spec__.parent, '.networks'), - 'UrlConstraints': (__spec__.parent, '.networks'), - 'EmailStr': (__spec__.parent, '.networks'), - 'NameEmail': (__spec__.parent, '.networks'), - 'IPvAnyAddress': (__spec__.parent, '.networks'), - 'IPvAnyInterface': (__spec__.parent, '.networks'), - 'IPvAnyNetwork': (__spec__.parent, '.networks'), - 'PostgresDsn': (__spec__.parent, '.networks'), - 'CockroachDsn': (__spec__.parent, '.networks'), - 'AmqpDsn': (__spec__.parent, '.networks'), - 'RedisDsn': (__spec__.parent, '.networks'), - 'MongoDsn': (__spec__.parent, '.networks'), - 'KafkaDsn': (__spec__.parent, '.networks'), - 'NatsDsn': (__spec__.parent, '.networks'), - 'MySQLDsn': (__spec__.parent, '.networks'), - 'MariaDBDsn': (__spec__.parent, '.networks'), - 'ClickHouseDsn': (__spec__.parent, '.networks'), - 'SnowflakeDsn': (__spec__.parent, '.networks'), - 'validate_email': (__spec__.parent, '.networks'), + 'AnyUrl': (__package__, '.networks'), + 'AnyHttpUrl': (__package__, '.networks'), + 'FileUrl': (__package__, '.networks'), + 'HttpUrl': (__package__, '.networks'), + 'UrlConstraints': (__package__, '.networks'), + 'EmailStr': (__package__, '.networks'), + 'NameEmail': (__package__, '.networks'), + 'IPvAnyAddress': (__package__, '.networks'), + 'IPvAnyInterface': (__package__, '.networks'), + 'IPvAnyNetwork': (__package__, '.networks'), + 'PostgresDsn': (__package__, '.networks'), + 'CockroachDsn': (__package__, '.networks'), + 'AmqpDsn': (__package__, '.networks'), + 'RedisDsn': (__package__, '.networks'), + 'MongoDsn': (__package__, '.networks'), + 'KafkaDsn': (__package__, '.networks'), + 'MySQLDsn': (__package__, '.networks'), + 'MariaDBDsn': (__package__, '.networks'), + 'validate_email': (__package__, '.networks'), # root_model - 'RootModel': (__spec__.parent, '.root_model'), + 'RootModel': (__package__, '.root_model'), # types - 'Strict': (__spec__.parent, '.types'), - 'StrictStr': (__spec__.parent, '.types'), - 'conbytes': (__spec__.parent, '.types'), - 'conlist': (__spec__.parent, '.types'), - 'conset': (__spec__.parent, '.types'), - 'confrozenset': (__spec__.parent, '.types'), - 'constr': (__spec__.parent, '.types'), - 'StringConstraints': (__spec__.parent, '.types'), - 'ImportString': (__spec__.parent, '.types'), - 'conint': (__spec__.parent, '.types'), - 'PositiveInt': (__spec__.parent, '.types'), - 'NegativeInt': (__spec__.parent, '.types'), - 'NonNegativeInt': (__spec__.parent, '.types'), - 'NonPositiveInt': (__spec__.parent, '.types'), - 'confloat': (__spec__.parent, '.types'), - 'PositiveFloat': (__spec__.parent, '.types'), - 'NegativeFloat': (__spec__.parent, '.types'), - 'NonNegativeFloat': (__spec__.parent, '.types'), - 'NonPositiveFloat': (__spec__.parent, '.types'), - 'FiniteFloat': (__spec__.parent, '.types'), - 'condecimal': (__spec__.parent, '.types'), - 'condate': (__spec__.parent, '.types'), - 'UUID1': (__spec__.parent, '.types'), - 'UUID3': (__spec__.parent, '.types'), - 'UUID4': (__spec__.parent, '.types'), - 'UUID5': (__spec__.parent, '.types'), - 'UUID6': (__spec__.parent, '.types'), - 'UUID7': (__spec__.parent, '.types'), - 'UUID8': (__spec__.parent, '.types'), - 'FilePath': (__spec__.parent, '.types'), - 'DirectoryPath': (__spec__.parent, '.types'), - 'NewPath': (__spec__.parent, '.types'), - 'Json': (__spec__.parent, '.types'), - 'Secret': (__spec__.parent, '.types'), - 'SecretStr': (__spec__.parent, '.types'), - 'SecretBytes': (__spec__.parent, '.types'), - 'StrictBool': (__spec__.parent, '.types'), - 'StrictBytes': (__spec__.parent, '.types'), - 'StrictInt': (__spec__.parent, '.types'), - 'StrictFloat': (__spec__.parent, '.types'), - 'PaymentCardNumber': (__spec__.parent, '.types'), - 'ByteSize': (__spec__.parent, '.types'), - 'PastDate': (__spec__.parent, '.types'), - 'SocketPath': (__spec__.parent, '.types'), - 'FutureDate': (__spec__.parent, '.types'), - 'PastDatetime': (__spec__.parent, '.types'), - 'FutureDatetime': (__spec__.parent, '.types'), - 'AwareDatetime': (__spec__.parent, '.types'), - 'NaiveDatetime': (__spec__.parent, '.types'), - 'AllowInfNan': (__spec__.parent, '.types'), - 'EncoderProtocol': (__spec__.parent, '.types'), - 'EncodedBytes': (__spec__.parent, '.types'), - 'EncodedStr': (__spec__.parent, '.types'), - 'Base64Encoder': (__spec__.parent, '.types'), - 'Base64Bytes': (__spec__.parent, '.types'), - 'Base64Str': (__spec__.parent, '.types'), - 'Base64UrlBytes': (__spec__.parent, '.types'), - 'Base64UrlStr': (__spec__.parent, '.types'), - 'GetPydanticSchema': (__spec__.parent, '.types'), - 'Tag': (__spec__.parent, '.types'), - 'Discriminator': (__spec__.parent, '.types'), - 'JsonValue': (__spec__.parent, '.types'), - 'OnErrorOmit': (__spec__.parent, '.types'), - 'FailFast': (__spec__.parent, '.types'), + 'Strict': (__package__, '.types'), + 'StrictStr': (__package__, '.types'), + 'conbytes': (__package__, '.types'), + 'conlist': (__package__, '.types'), + 'conset': (__package__, '.types'), + 'confrozenset': (__package__, '.types'), + 'constr': (__package__, '.types'), + 'StringConstraints': (__package__, '.types'), + 'ImportString': (__package__, '.types'), + 'conint': (__package__, '.types'), + 'PositiveInt': (__package__, '.types'), + 'NegativeInt': (__package__, '.types'), + 'NonNegativeInt': (__package__, '.types'), + 'NonPositiveInt': (__package__, '.types'), + 'confloat': (__package__, '.types'), + 'PositiveFloat': (__package__, '.types'), + 'NegativeFloat': (__package__, '.types'), + 'NonNegativeFloat': (__package__, '.types'), + 'NonPositiveFloat': (__package__, '.types'), + 'FiniteFloat': (__package__, '.types'), + 'condecimal': (__package__, '.types'), + 'condate': (__package__, '.types'), + 'UUID1': (__package__, '.types'), + 'UUID3': (__package__, '.types'), + 'UUID4': (__package__, '.types'), + 'UUID5': (__package__, '.types'), + 'FilePath': (__package__, '.types'), + 'DirectoryPath': (__package__, '.types'), + 'NewPath': (__package__, '.types'), + 'Json': (__package__, '.types'), + 'SecretStr': (__package__, '.types'), + 'SecretBytes': (__package__, '.types'), + 'StrictBool': (__package__, '.types'), + 'StrictBytes': (__package__, '.types'), + 'StrictInt': (__package__, '.types'), + 'StrictFloat': (__package__, '.types'), + 'PaymentCardNumber': (__package__, '.types'), + 'ByteSize': (__package__, '.types'), + 'PastDate': (__package__, '.types'), + 'FutureDate': (__package__, '.types'), + 'PastDatetime': (__package__, '.types'), + 'FutureDatetime': (__package__, '.types'), + 'AwareDatetime': (__package__, '.types'), + 'NaiveDatetime': (__package__, '.types'), + 'AllowInfNan': (__package__, '.types'), + 'EncoderProtocol': (__package__, '.types'), + 'EncodedBytes': (__package__, '.types'), + 'EncodedStr': (__package__, '.types'), + 'Base64Encoder': (__package__, '.types'), + 'Base64Bytes': (__package__, '.types'), + 'Base64Str': (__package__, '.types'), + 'Base64UrlBytes': (__package__, '.types'), + 'Base64UrlStr': (__package__, '.types'), + 'GetPydanticSchema': (__package__, '.types'), + 'Tag': (__package__, '.types'), + 'Discriminator': (__package__, '.types'), + 'JsonValue': (__package__, '.types'), # type_adapter - 'TypeAdapter': (__spec__.parent, '.type_adapter'), + 'TypeAdapter': (__package__, '.type_adapter'), # warnings - 'PydanticDeprecatedSince20': (__spec__.parent, '.warnings'), - 'PydanticDeprecatedSince26': (__spec__.parent, '.warnings'), - 'PydanticDeprecatedSince29': (__spec__.parent, '.warnings'), - 'PydanticDeprecatedSince210': (__spec__.parent, '.warnings'), - 'PydanticDeprecatedSince211': (__spec__.parent, '.warnings'), - 'PydanticDeprecatedSince212': (__spec__.parent, '.warnings'), - 'PydanticDeprecationWarning': (__spec__.parent, '.warnings'), - 'PydanticExperimentalWarning': (__spec__.parent, '.warnings'), + 'PydanticDeprecatedSince20': (__package__, '.warnings'), + 'PydanticDeprecationWarning': (__package__, '.warnings'), # annotated handlers - 'GetCoreSchemaHandler': (__spec__.parent, '.annotated_handlers'), - 'GetJsonSchemaHandler': (__spec__.parent, '.annotated_handlers'), + 'GetCoreSchemaHandler': (__package__, '.annotated_handlers'), + 'GetJsonSchemaHandler': (__package__, '.annotated_handlers'), + # generate schema from ._internal + 'GenerateSchema': (__package__, '._internal._generate_schema'), # pydantic_core stuff 'ValidationError': ('pydantic_core', '.'), 'ValidationInfo': ('pydantic_core', '.core_schema'), @@ -406,51 +344,34 @@ _dynamic_imports: 'dict[str, tuple[str, str]]' = { 'FieldSerializationInfo': ('pydantic_core', '.core_schema'), 'SerializerFunctionWrapHandler': ('pydantic_core', '.core_schema'), # deprecated, mostly not included in __all__ - 'root_validator': (__spec__.parent, '.deprecated.class_validators'), - 'validator': (__spec__.parent, '.deprecated.class_validators'), - 'BaseConfig': (__spec__.parent, '.deprecated.config'), - 'Extra': (__spec__.parent, '.deprecated.config'), - 'parse_obj_as': (__spec__.parent, '.deprecated.tools'), - 'schema_of': (__spec__.parent, '.deprecated.tools'), - 'schema_json_of': (__spec__.parent, '.deprecated.tools'), - # deprecated dynamic imports + 'root_validator': (__package__, '.deprecated.class_validators'), + 'validator': (__package__, '.deprecated.class_validators'), + 'BaseConfig': (__package__, '.deprecated.config'), + 'Extra': (__package__, '.deprecated.config'), + 'parse_obj_as': (__package__, '.deprecated.tools'), + 'schema_of': (__package__, '.deprecated.tools'), + 'schema_json_of': (__package__, '.deprecated.tools'), 'FieldValidationInfo': ('pydantic_core', '.core_schema'), - 'GenerateSchema': (__spec__.parent, '._internal._generate_schema'), } -_deprecated_dynamic_imports = {'FieldValidationInfo', 'GenerateSchema'} _getattr_migration = getattr_migration(__name__) def __getattr__(attr_name: str) -> object: - if attr_name in _deprecated_dynamic_imports: - from pydantic.warnings import PydanticDeprecatedSince20 - - warn( - f'Importing {attr_name} from `pydantic` is deprecated. This feature is either no longer supported, or is not public.', - PydanticDeprecatedSince20, - stacklevel=2, - ) - dynamic_attr = _dynamic_imports.get(attr_name) if dynamic_attr is None: return _getattr_migration(attr_name) package, module_name = dynamic_attr + from importlib import import_module + if module_name == '__module__': - result = import_module(f'.{attr_name}', package=package) - globals()[attr_name] = result - return result + return import_module(f'.{attr_name}', package=package) else: module = import_module(module_name, package=package) - result = getattr(module, attr_name) - g = globals() - for k, (_, v_module_name) in _dynamic_imports.items(): - if v_module_name == module_name and k not in _deprecated_dynamic_imports: - g[k] = getattr(module, k) - return result + return getattr(module, attr_name) -def __dir__() -> list[str]: +def __dir__() -> 'list[str]': return list(__all__) diff --git a/Backend/venv/lib/python3.12/site-packages/pydantic/__pycache__/__init__.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/pydantic/__pycache__/__init__.cpython-312.pyc index f59e3682a4be7f794f809e9c7f5235d045a051c1..0d7bb614910b790b3e887fae99e809fa01b807fe 100644 GIT binary patch literal 8954 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 literal 14436 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 WWgN6vYUax4V)tr(&q0yALH;-5Yp}rp diff --git a/Backend/venv/lib/python3.12/site-packages/pydantic/__pycache__/_migration.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/pydantic/__pycache__/_migration.cpython-312.pyc index e450128603fff1c17d57e4efa1c291de5b0b97bb..ef7a3fa3d21b4c6a3bcd1cbfb8cb65eac1207ee4 100644 GIT binary patch delta 832 zcmYk4O-vI(6vyA}Y(HqX+m<30R4Bz1O2Ck)F;SxsxQZW%99B?E-%<)~G1~=$DME~i zX<}l`Xlw!`8ZRVVh`kt29z2kk7*H>+2V+e9I9UWt@Z?Of(b??(|90j#^WN^;hy8ah zs;@jA7w~bk=WsHA=)M}9S>aEQ00Bt~G~rT;q$N#CQ;nu&O(uX8<&-UL*X%sDp&cFQ z#43Kd&^_qZakn<-JKx1G%VHeGKXbsxGihS6p2fu%wLCS<9G2s zeNk%B?#z_s?1`mPv7wZ1$-T+ASqzicjii@tgl1`{>13gBhuf8t=K$Rcwk5(=nxX+! z93aLd7+wi-lBu%QrWVfo1Rqe!yhrf69068p3eBK8)(T+MNRYRq*9`0~0xbOvcoN?N zt!%nQa@4G;Fg%q~-dB~Qob&(BnY9&aG+2rLdEOyD#b`aS&9I*}G#?|?#s20lQY;?K z5Tdeh#g~7G9(=U|gH&-vL)t`H(oPQq(u_LXQ z99xun)D0(l()x0y#LqV@E?LUuYN*Tj!QJvFbTej}#+7t3VZ_Yjc*fY~^E(2Jh+r1B zYr)oDlG|-($b)zZgwGHEDtl>wfD)MPGd4IH^%$aSmff7Xmdqp!k;jmQ*Z_2}9Fw|{ z6$u<-?z50DLcR+5CS+5HNFOB@9UmIaiq>?N3;pdpnI6Z9lzz$(wTXqS_{mF@5b^IpM1zsn&$0N&habh{Xcw;?sd`ryi{G70RtEDWj2%h=6gYq8*q{@B( delta 962 zcmZ8fT}V@57=FL=v(33bH~+R-ZvCi(ED^$pilm4jT7lTbv7)v2sME7e&W_4rp+pcu z|EDNWA?PNs3qj~EhzNq}!n}$VbYsD)i)AML5cGbVlJp(U^SnRL_ws)4_g(6~eZuw9 z>9hl_(}C8+_>LQ{`mv|v-2nt-8Yr9vjU@#|NQ#QcxG!o_QdVTLC6qNw(yCa=wxAVl zSb=u>D$y}zRcz=)7rN1dRp><@VKvrZE!JWEltZaN|3SD0aUntfsY-zJfPoxLj={8m zK{AL<;j&Yr^m$P1{eTVknNo=xR0nQUMb**ARH0Y!Q@gzqHeQqzXO_hUR??3`Bvjz% zibjOI*qO@aZ3kkS7CWn{5tjEK&tfcPB;p6vAzh8f3>CW)skqwSR$y~7d)3I!m%I*c06OGz64YlGZ?W@R% zr1P!U8TD(bfxw#ek0-2ri~|i|E^Io?s^@~6_p=QJfnqd18y`?#TF>U~86y@S)YK7G zo9o$bARWsTgYkA}KT|aVt?|f+ItTuc4N&CF# z&^v$on_xrH3eLbXNKV&RJ5-0w=gmFd#d4;il#wapFe5F`eBY?Lo+rqN1ZP6~^`)DU zy0IVR{N~Xnf}i8?y%ywcMX6mr%5KGrz3dR=1r>_CQJ zP@BF)_{+8@nZ{vF-KYN{mnSlh35p_P>@C>eL+Ar^n6D!fZJmty?o#iZ@Ac1$4~A#s b56-=A+Pz!~{ahNhxV=J#kNc6QvqAa`FqP<< diff --git a/Backend/venv/lib/python3.12/site-packages/pydantic/__pycache__/alias_generators.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/pydantic/__pycache__/alias_generators.cpython-312.pyc index 531a738e419fa0844cf34477004df15445afdc6b..289d2c5c776f74da77f100e2031f9d43ec351163 100644 GIT binary patch delta 403 zcmaDLxmTF)G%qg~0}z-x8)ufXY~*{%#3(rV2U8#;`(!U>cM%Vu)O3atMvxK^s9{*m zI9Zd?da@16^vR!CRx-*>p2Moj!Cb@)lq?dNe1lb4Km^DvRss?Y3}1v8c*Q2`uvs%T zF-*>6OPQ?8E;iYhl}kyJwQ9L@eqLE>QHesLLO^11a$=5iVsWZMevv|QVs2`V^W+8W zU7Ug%(TTcMj=E8k4{+sAUdrKSsRcCmvm)5=4T;;+H>U4M+?=%`=78Vr delta 871 zcmdlh{6LcLG%qg~0}#YX>1O(HY~*{%#3(lT2U8#;&txxVcg7`?_p++;)iA7P0x4o( zD3T~)oV=b{)|d$)Rt#hZGnBAHR4_0AWf&psTE-G6i-94FWAZ;%C6-_YP1ecxnP6SR>f*ZJL*OO83wwRv05rs>@g`|;mKtzs~9yVE3&GJvlfW}O}oXKn^=;Zaf_`u zHL)l;qlkI3AFHyVBv7W<8AvoRd=X>d;A*dEthgYcwu1EvyWW&`&d&Ze`1wqXH8*iVW?r8{DM`JnLUMLvIv`sPzq-X7tFu4 zj5Ul|?2`|$$mnZwS8Z|5&nrtUDp5#O2uLhWPRwymEKb!?NKVX6g);Mt6tYv35|eb3 zC#SG=35#feycesj386t=oBWS$ovkUz-HKp$?-1NCzEk{w;BKiMJO>;PBpy#cn0_Mh zaMppC3uZwL3`IgfRaJZ%;81}W12iFnt4JOwUc>_=CckHqnq0vlZfg$Ye1;gh!En3z zM)Mtpo2@qJ>_|Moc%1zp`w7OwTsvwm82BI=3JP_+hKgE(tWgFLNDi6&oh=`W3$(3K z6#rt>Em8oAXtID~ut*fhzQtaYT9A{NoH}_WhkCs>P^7pJNC2Zxgn^g8->uW_g0R*_ zouCULk(YU*8eE_7@IeGsE~@#QNWIJxLcG`m9>IR!PTv{IGm0%bJ}@&fGTvkee$2r6fJ?uD{R1Btqc7ux;13KSdPeYP mF#SP_pV5_Zg7XIk5Iw{BGnoFMBFrcW5(H8+oWFo5uq^;Ae(?nW diff --git a/Backend/venv/lib/python3.12/site-packages/pydantic/__pycache__/aliases.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/pydantic/__pycache__/aliases.cpython-312.pyc deleted file mode 100644 index ed2f6f102237fb77a4ab10e0f3b81579f3195397..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6578 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 delta 41 ucmeyt^n;1_G%qg~0}#YX>1IyZ$Q#Kh^prvKA)ovLj>~+Sjod|?Ksf;KB?^)N diff --git a/Backend/venv/lib/python3.12/site-packages/pydantic/__pycache__/color.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/pydantic/__pycache__/color.cpython-312.pyc index 57cd9af4419b04202a177520d407bbb7fa41ab15..b447c3dc00e1061ce23fd9293505d533b5b9207a 100644 GIT binary patch delta 6497 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 literal 7508 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 I;A-iA0PhglNB{r; literal 17349 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 diff --git a/Backend/venv/lib/python3.12/site-packages/pydantic/__pycache__/datetime_parse.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/pydantic/__pycache__/datetime_parse.cpython-312.pyc index 93c7436b623b9f76ddb00ec2f45d2261ec1f23d5..5eeb30b6601935b65ea3ff7b224ea0c2c8568109 100644 GIT binary patch delta 41 ucmeyt^n;1_G%qg~0}z-x8)r`4$Q#KhbeBQ%A)ovLj>~+Sjod|?Ksf;KAPSKH delta 41 ucmeyt^n;1_G%qg~0}#YX>1Iyb$Q#Kh^prvKA)ovLj>~+Sjod|?Ksf;KRSJ{< diff --git a/Backend/venv/lib/python3.12/site-packages/pydantic/__pycache__/decorator.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/pydantic/__pycache__/decorator.cpython-312.pyc index 3f49258479d311ebc1687e4655f2aba0f26cac17..5a441f4a1606a23af09978ca8abd92a89a3eaedf 100644 GIT binary patch delta 41 ucmaFI^p1)5G%qg~0}z-x8)r_~$m`E2beBQ%A)ovLj>~+Sjod|?Ksf;FwhC?l delta 41 ucmaFI^p1)5G%qg~0}#YX>1Iyc$m`E2^prvKA)ovLj>~+Sjod|?Ksf;F>k4rI diff --git a/Backend/venv/lib/python3.12/site-packages/pydantic/__pycache__/env_settings.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/pydantic/__pycache__/env_settings.cpython-312.pyc index d2deb79cb652b091e9d0efe7ccda099108b71b48..2c016d2d81a2707764d0de05b2dabbe4c2394c8c 100644 GIT binary patch delta 41 ucmeyu^o5D{G%qg~0}z-x8)r`5$Q#NibeBQ%A)ovLj>~+Sjod|?Ksf;ITnd8# delta 41 ucmeyu^o5D{G%qg~0}#YX>1IyZ$Q#Ni^prvKA)ovLj>~+Sjod|?Ksf;IkqU+Y diff --git a/Backend/venv/lib/python3.12/site-packages/pydantic/__pycache__/error_wrappers.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/pydantic/__pycache__/error_wrappers.cpython-312.pyc index 6a1231f14d31dc2a0f91e07b545d0fdec42b64d8..baa2834c68658b86d2f9adc224f8f214ad84045d 100644 GIT binary patch delta 41 ucmeyt^n;1_G%qg~0}z-x8)r`4$Q#KhbeBQ%A)ovLj>~+Sjod|?Ksf;KAPSKH delta 41 ucmeyt^n;1_G%qg~0}#YX>1Iyb$Q#Kh^prvKA)ovLj>~+Sjod|?Ksf;KRSJ{< diff --git a/Backend/venv/lib/python3.12/site-packages/pydantic/__pycache__/errors.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/pydantic/__pycache__/errors.cpython-312.pyc index 233e55fee708c526d3e43fa473f26178197e5f3c..cd1c71d07a9267f33bdb28e48ad445cdb0e9ec54 100644 GIT binary patch delta 1659 zcmah}-A^1<6u)kLn8;OJvdrnTDC>ilh-N0zGKUc@dmTbAKRMfo6*THhAqUANVR`Ow6 z6_BHCfggK5Mt10WARlpLTg$M0UKh}F$PRBHJF+Ek3Cg!|PG?-3)8<6C#1ZRyt0>>j4RK~@XNJUqLz43e#wVTFR-hFo#n}{N(|=*pEKSuhws1?8Sqqp3eGLys z1wS}f@*Gkq`{IIAUZUUO0W8zs@jLWWVGJMM{$4nT>A3hs#wZe};5mbpn(dSai?!-f zX?gHc!FA}ac#b|R-AVYVQuRuqT(Ye~wOaF-*tY11JhJ_6@G6!Kb~ee-uzC$YPp_-D z2cSd*SU)~9yJ*eM&tI6gW-d%GSTD`bnV1}6CKoc!k`DSw=op@(Ux%jKyBKrcl$)Lb z*CQ-whc+blGM@C%i`t2)PFQ9cG!Owf=>SMRf=RY;;|w;?z931;&$=LGeo;he2{+|Q z`jz$+R_U+Wsj0)@bp+rjKtI4SfIkDPumxCPKUZR~fqe0FQ=!t8@FEUve-rM;xhN>p z49tKpRtpu!m)zAAhY-lv6#13O0Ei44(+!#D-ARXZ6I=8Z{V49*Ue~|G2^r)U7cv#{xI#eMzE&(3T({zQmuof|1twxyoGUuzvSl?eInG$t%65b%o4tTnjR3q% ze~RT~Uds@xRECbmb6BI7;&;cPL(CV(q#=+&@PP9gfo7TbJn_KIo31w_gXGOlIxMu; zk6Tu$TJkLGEylUf{)g-6o)URKcuO%pO5b?7x5T;C&lm}rfjqM`_&B4$Pt{bM6#7=JvT+aYZ06fE>)x$?OqjoZf z-=o)(-6k*CBtXj!))WnytS25b=h*>@SLh!s#RSAUqJ$c=7+3GX_*u}Mw1{A z!7B~{5mETgvI;O%q#HbR0BEeQzPPs18e0B3j)4UR%-7CVR%*oK1AUqIhF6BC%Dd}p zmbL7#&y`15+`qruzbWJFd$(G4Cddmc7<5mdgqtY-;36$_Eyng!s4aU#xviU5HD1p@0Fl*H8~^|S delta 3241 zcmai0U5p$@5$@jq|GnMY`~RCe+h;GnJ^v**#E#)O$B7|a@Xr~sQ8F5D_xT29XV*Qm zwr{YsjxZ!aSi+2uQ4&iQAfdzXfbInzfQT0!0BKJavOOdM6fC4Xon@m~JW@(O$|=c5jdV3r&Hx`{aU)ypDfdV|VdSd$avu0(xtFB^gy(OfeR$p?EPXv#F7O!3 z48geE7a-3Omc2|^&&_~TA?1FFHFE&wc|RYx8EOj#rJxt^0^mbkd|2XrfcFDF(#1z5 zJ^=V2AG{fCTN#t+5TL{VgN{pd1kh0*9Y*!?1bE-Wm7BCZd2%IK9CK&rp8Y{DIA^YS zv3WzYtW%osqA%z+7n)I|Ug!ijmf#&f*3b-nN#_CvVO8+DaI18NM%_2*H%ErQyuvio z)+)tP+9hVgd=?2}zE-AH+u@QZVEu6T4~JJ(zfUZU@SXNIr#RCz2T?n$qBm9huR}Ria{@gN8^R9Mx6_xAQlq1L9rW& z+)G?lWm2fBg_lxMluN$j3XGhs?y<~BVpdf#WmNU7dm}YXC)fUv`aLaRg((I$O+j>a zyVo-c-RAx_GoHaEEWDv$5<>YwW{x)8nQWse*WLyK>41=&4C8h*7!sd>mlt0E&z}{d zCWMqlQ5F-Ai7JdH@Yy|D^63{_pFVlSX@vb}_S&fj4M0D(kz_x0@b zk0t}*JWR9hYR}#M10aHVm>jDCu?Mvk?J!Pw7Rg6f$2A0!tL{W$%nwzM3{}p3t?=&l z0?I#e(QV%kj5fQ;^kba!Jd#gXJcl|+-bUtVcLqWg_;(*n5_sqX-1%$d8eEt%WuzQf zgr-*xvH%ORW{8DZghg5G?MOMq;yla}2SJ^sUMEYGB`>GSk=MxuT8^F|#k9zS$a!JT zRNw;Dgd#NE;!M$(6ir#`)OZC;vvRi67!=(CS;GW16V#-zU8$iCH)owJKv2_WkMpw) zU2x{)+rUE2?qZut8hg<+R=Tt1+uh0O?Uq(<%^rpO2`$S>wM`w-P3T(@FDBZHcq!-= z(65^QnqFLRjj1)T?8W^80A=2b$$O4mcnK{yPy=6n+3Qui`cE)b*pYu_6r53Ia@ydJED7i)Su(8^F%X=2BYu+gZ4#Ajvy}Bio_NeiC!d_%U=8>q>JC`WT!uX z5^PIe@@TbQ6Sgmt4M5gmSr29CupN3yRXxMuGtd@byZ!0V1QVD}|A`%h@34l!4+#!K z3V-W&KsJJu(z|5h9@+aoiT{lh*GcgnnR<^rd5>(pM~d%}sf|!98MqYP7$$>H{PIg{ zFShm_erLYb_k4@w@AQps1a^gY+z;;Q55V}tW!giR=zW6p;WVWO-A@l38GqQ{OB1ch Wy$=bz@6V8|awB#tQ+zckQ|!NKVLdAV diff --git a/Backend/venv/lib/python3.12/site-packages/pydantic/__pycache__/fields.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/pydantic/__pycache__/fields.cpython-312.pyc index 6d7073bf5ac0111a1af77d15c04482b2065e45e5..9fc64881a24fe46485a5421925243f35ef18a61f 100644 GIT binary patch literal 50481 zcmdVDd30M>dMEfEb`l`LeP13ok)TLWqNt75V(r#0Tk=L(1|dF>0u2)M11O0ss3KR~ zZ7So$awXHI6X#e?s*mN^=_uVf9j7~UV%Jm>XOigv0v)1Iszh~CebVXElZGv2l5+ns z^ZV|78%R)cxhgZAXZhmedv{;H`)&8Te_B#fEa2I^Z&UbJe@77hn*Pw9Rt|{w1cxBJ zAv`I_!iXS?vLzx;Sw^fP!Pbav#KwN@BX;)d7;&&)=ZF)(wuo!WHR57%?Gf8l(MYi< z6j4e?#69I1@vtw>h;yoRq;$$V;$?rkB4tzMBjsud6(bca$I6jP{1!#3rm9D(*|*|I z*b12pIo^E5iPp{e;dEw5`RHt`8Of|=Jzf9%lm4Ck)fX; z#}?$+x+=%btTYMV+6woI-kL2adn?skZkIcLQItDnE5a@ou47?03wv1TV_`1~*R!yX zh5an_vv7cg8(6qe9z<@N7(B$n%`Du)!mTXa#=`9^9A@DoEZo7uoh;nN!rd%S+8o7^;?!zU4A%ycQ&%mXE#c(AVDnHS#_q zAAi|q#FC$sPrPg!IRJe6l&Msd|7FXi`p8eqC((=h=d2wjk{G3yRaPebUEcR4Tp+uL0$~1n< zPtD1}>3DeT$!VEN4#|k^JQj|Jlwc(5cyf9sIQGKd(oCch;&U^hn9rGY2jtLLR0+nT zN-XOP@Tz8u0u!O>kP;q?Wh(>WX=E`Sj0EIhJUB)LXYBzcG^1oo0>}m}41_Mnm0;Ep zn2m=cF=X#L5{pjn50Az3>Jyylpy_n*`*+@Jv9vs8eo%^CV7FV>K?7>Jl82h3a6IXjx%3fg|g`-M1 zKKDfzkG_W@o(jed^8%-%5a7*k40wX&=;QZNHnO|*fJ5%S|&nS zO9a1^`4pNPM)E*(JnKO9vAVLwQ{m}ABs4t{zW_LRS%aN3!8k42YzaCrdI?K-JTM)c z=5gfkL^vMHmSW+Dr?9MNB0)5HzDGqBXS-ulK_%YZCv`_c4^#V5CqgG$`$}Z<+b=e0r~%(sjk5L)qfK){FR^?Q_#_a+T$>7N z$OhACJ~W-xhA0F?#->EpM!lQ0F%0Db295_V29>Pyg-e0xbY$+td-kj=fZmu21p?XP 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 M-D&;P9U{X27ko4h#sB~S literal 72950 zcmd?Sd30M>dM5}F0Ko;^_x*8^NKhoGeWA6O)-FqwZAo4r$soiBQlJ5X^#DpD10}M{ z>Bu!sET^hla!MJ?iK{KOohhfgCQ&9e9akmOsFWR$4c&zvH zT^7rA%PEU&@mgf7oENf&^Sm}I`E4P)*UrBVuY-T{z4`p>^g8it4;6$9y@lZ-ZxP3L zgo?w(-eUIWhwNdOw}k!9P-(c#TgLu^Pg_ z;d*aD z9$FvX;N1}3=-n9JfIXN=H13|Dni@CJG?u>gWf@YuM9mF-s#;L z-sRmD-tFDZVO60$;m5s?v%fkt6n?_{M0l@vFTdA>_J#L*_p`qiZ9U*UV6_A)6c_4J z7djX|O+UaN4!ViZ}2`Dki19b#=tSTX(xs-;GDRr4XN=fH@|eoVo@5nzZ$)b zfyRj=##hZ3STpOiSiHyO7Ub4SxlK9)Ys~L?mV*|#?Ny5`1v=&S4?5nri?rUS_)90g zbOoNu`tme?S%WWYk*52D9zD%7fqMSt#<$+UmWh9?)x-FG-zNO;t3lqAoMIhP^aVP# zuijHZi`*}JzHXHVWE~3IpBfFc}-OTP5cDJ&-jot0+?qGM2-N)G7$?h(8ceC3q z+xXv}oAz&6z0U?MfoH#kb@7mYkKZgs%;)kffm(U!eXD4Q_xV6W;OH;@Pk!QNN1^4H z?Vo&B-uG(0K4z{jqpkA(o9(}B?JTs&FUkkLcuQr^7aQ?k(oyxv2fuh*zhFy$IY)Iw zKJ;a`G;s8nbX5KF;r~ChRX!&l$!e!GX8mGw^ii?oCvSHC@*+V z$8TDVUXx|{Dbwiqa>NM8Pp=+B9+RKR`ijxTp4={pG2Sd&>!}RkF<6e zzw&wP>6<6MZ-i*Rcdfr=2qs6#FM9BQbw07@3R?yYn&yd;Ou1|6C}LaUSze zO(88J*+(N&Gx&8JplskN8}*N#56HeLB{CIIVl(c-Ov%X?p4#u*duadOCl3!F%oGlZ zd;@aEHZ(bdd_(?d^jW`>aUKoE0*XJBah{x+3Q&lB)E|vy9H=Tn3nCW+N+{x|V(b_F z$|Ne~Ja+iR3CgwNsTtWn84He{nv|(&0om=y*iQsPW0^wAZ73AQmCls-)Y=9v#T0)g-!~l#hN9?| z@`ItsIe#cR><N2OA%_h&I~*DV2y*9z)64>YvZ zYm@T=cG*VMlx&C3!M=R>oa`%ruaJF3@D=M{UAnJ?eWmzXriYcYuL5C}?5l#Wnte6! z)v~V+zIygGz}LvWCit4!*8(5Ycyb$j5{FSP?d+pkb?ClM_H`j_jUI2U{}{&j+ItuL&t|DHx4KrD!A+2+c^bh~$@LiI$m!88`Y8gSv1{y06)f~BT{fu8qst0jG+uMVMaU;$|><_K&Z1)TpEr{1~Ns)LVhr)LBrFh&-O`b zEF(><$tTH$%)fz_iO zHF66*B)6kRZsb7+ z0v>=|0{Aq0^bT-NiNH(=_Tb1x>B9oz+OwDK{fF0X6IUPP1P@>casA;Bf%pVM4 z6-HyjcO01lANn*L@cA-DKI)8VjGQmy^7+1k-Ch0S^!en-D1ys;rfogy^WCxBr)}fG znSt|>aA073^3uS*K=h?pWNP40Bo+wuKM{!#5E^&_NJn5&9=H&gyf6?7o*S5&iJgy3 zZt`r{I1mN?(@$85e>@Py2Z7NH@QRCire>5~D1x1h@I?PToL{$mVh=3kTPoU9b}3zR zJY_$gF0M)0Ytq%NDSK~-n##+1ELbxSyY73U+uMY-kMQ}*rYs!b{TrgXU{W%s1( z_NMH6)f{S3+xB!(=~s`Wi@36-4Jms=T2!QIZOXnjUDh~fZ&ZFoYw!W={*D;%(NOLk zx)~8y-=Syhz~st(I!sgdj~Bk={lkZaiK*us@d$*&sZP>iB}VO-C5KxSC*QAW&KY>3 z#KEV*99=9afAy${Mlo_Xw+~;kn;QT^LffTmgU`-B2YmVDn{m1e%*`K)5-!JeRQBNe zgF+o(X9~iBn4eJ12c_AY7`8uPR>5=#GF2ytuU{KzK|vUd0c8b)CP4I^Kd9#0@-YY`^UupX}?kUvo> zdcy1m3MMMe@4}DJ>YSm3?=E`~w|-d=UJ=@uGqgEpXzR*Q*=_to-K88cdT*9_D`W$m zJS6vn)UFIv1*$>lAC^6@I&|{72BEbRo*cOh+_cI^^u`H!w>ezigOrco%#%;bL$Bt0 z*T|>jC(zGpxMeR`;&yMZd>ZUxyLa7;+kHma zfFx+(=o{}SPh<{A_iP1$r%w( zVlqBR_@tx+#{G&6>=As5G3ny@0I+z0%AXeb^teaPp4RqDkGfwnv_H$GjZIIEa!x2J zaA_(O90krh!=V_rh^K%pnp036PZF)5?-?U1p@A&I0k9f~#z0GZzHLLCg;#805_P$aF}a?2bw2s2B>41&LQ7$w6=}(1<>15*dc4 z!Kn$zYGbJKhsUIu$h0&WKwQ*R2IhYufXYk;E~@n)Y6txt;m!p91-~r$m4I|H7zz=+ zL_|~wxM)@<=ymJUtF8pbXgDGuuFyHBWn~|5=7PUs2lyMZoMLj`XYfMnhrcXfku=KN<-49%JHJM zF-Hb{%w=We=iyrEaYy}=QXnX1sQ;yav>tsrJ{=BB#-e(YXn=Y!H!hwJj-E#`G>2le z4k#B4m>&x$>ZY0Em!cSo5C%uhL>i4u#{7bJN6q$!lz?BJp{5bBM>7MPx6uzw`H5a& zuSA&aDqX-4bUITc(x}d?B;8Sz3o_LxW;v}X5*wi+epV(%;v8hDNT2oLp;<6JDiX1G zm6CXpEGJ&Ghx$AyxEKZwO;jNf_ZTe>B@mldCZm!lfxuNTX0*aY0gH;50#>Pxwjc(j zqo9~6k`}UR0;ZP-rROvtNI;0gj71>v%BIP|EL|z97mfNFMD@xJkONrvApFn^I=D4T z(mF<-RtQdHs zD2QoSQwcg7ks77(c4-pMqast;gJg`}gr4n|b4AN6Rl1M&zhJ?g*_l!u~;3Jpv~ zkxh22bD-6T`C!08TG_m8i7dr7;UPdga#EQNjG$!N)QIzwt6~gx3Cst=L2v+M>UiuP zqu2%r1Q^3>G^l)Eal;A$c>?!S}NkK{HdvZXN>{ zC8E$~PLqiqm5uR`5;1N3(o2DvixEZcCzgk?U;Ips(}+I-z_d4s$U~0=ZanQg1p7l` zM6uJr1ArNf5{?3N2;)M_9~+oJP_l3bgMjQqpHt^!Vh;+0P_$H%dZm-#yY`dh1QL}| zbx=@jEDA>CG`36RJu)8SB|2ho(?+Boj3G8s!eB6xkQLD)!sORm!Hi-;s(ouxwpX}yT89$kETWJnWh0TmTc!=neC)hm&eJCJ~Y zXWS#59-YRJhXvP7I*(}(0+)(WCbVQUFcpgq5a1(BsnZ|r_fO)#CY%#!0@YH~iY5?H z!^rq#a26eKZbrvH)wU_SfweQ;FE{{K==E`OhRAt>oW11iBWFK32go@{&LMIRlS7JT z%9G?ACFdA9!{i(%=P7cYCg&M)#>g2b=R7&Y6jXxbOpx;uIU#bwq-~)kYz5jpZ6Z0i*oiKk@qrI>G?z6m+_l9lM7PO4!os}$>GkF%v<-E(bxGe^s zc&4pU>+5Clytrk;u7w%D7wBs%zS_Q?_j-rjGHSbQyNtL#n-=G1r~!0e^%@{YQynZy zO^jN`&ji}H{E6qiueNj2%5~|sTP|C9}L^2uE@NHn!Hh^_YvO3lGe zGHN(&Rq7BY2XpD=;utM7eq@K%N3U2{>6!ej@<~F=&nmHiXs`B^1)X;y4~^jC>pmKD3^5qXzq#nxxdDtT9A#jblq-j!Lg zb;jl@c~`|Y>G@gYDx_86jA<3<^I?@ds^uC}>?S?G+$*d$tA6^dS|#tgtk^A&$h$r( zwmvsk$s5{Arh2zMBJakm*wQ0nH)X}vR~S|dZPd%2xEXeKY9C{SW$>e|Cd_d_bn(bF zcw4Kz8ITB}-8n;hv{1PjaopP5jBPZ}s_rruv1=KAcZfB@9E7lsJAK6z-%^0y(mKb`5hG zNJYq_$>%&fLlKb2(cK}32^BSB?sc)a) z7(7dy%V@?n9*FTsWNcHBDTTmtreHtVwNuexRJlUwhA516-dF)^S+{3w;IIp%p4OKM zfzQ!^j1$EX;wun#YRSVJlBobD3=Srg-ZY$&k@k!YIJ5FKO8-BQ^PA+nPR?(^ap!03 zQPR}Q7iu{f>q{By1#V5o#e7CzFiKc=lu#duA0B2B*$av5Y~{*P{xKp){~gBaie;(N zvT^$#H~(StKWm+Do4!+hyW;lHM;re2f$#50JokKJM4lgsB}ZcSo{QbG-rDevJ=HdS z)jn6yoIZBqFVFn&%)feZzT(XHPJZz5A79 z<>QHpGgtGI6=%|o(%Zdn_1-#@YTS6${(2c?^HmMkd*AH6@xolsj#TB~RcE@m@*C%q z#jOiXeOLFrel+bWpLa<~mo)F{O1ipkz3`#^N3Jc4O&#=cv2D%Uvv18NdLO%cGS&73 zS8K7j?2VnT?VM{{pDbSg;mP?ehm%_lC$^kgsBB6!A4^pZCtSmeHBHyOZ+dSzZ&#;k zJg7)fT3Y*F(K|(nb-V7yQqn%ksU_X%esA!d!Gve;M<-LAM<`5MsB6TOzq|R*2LEL6 zquBhxGs%Nz5-*;cfAK={#S4kSi*t>aQgxTEx;{C4>c-gH6K_o<+&k`WPPIOMuXX?T zh7zZJluJ{3W%+B?z2|+$n^=GF?b`2Bfu*kbs{J>Me|mr1YLPBjfBJ7L&M?sWM)|Sc{BM=Q`Hln5 z_iB2Ntgeyh0nYB|Fvg;T#)6O$@Um6zIS&bEwPIkzJ~@kd@6JGlEm5(S%B>jnBQPG6Lj$@Rrb3z8NqmZ0_i2;Q#a#D}p=Vs7K4-1Wl@?g+hWvX z{KRd!_#<(PM(Ml)%KEbHSAjxav|O^iV7X{@7x@1HI$MA=TE}L1rb)YnNX-x777%A+ z-kFv-uRaZxr|HNl4Vv=4P)XKTqqztc)~(1HEccb`a^;#_bv^!!Yf)c^Qm3@Dzuzcb zUv#tp^_S<+385&|14c(9(^$P4cxFj9Lj-yS(rvCa7WC|%~NQtKuQK45US}BoEK039eK=>NP zM#8G|q#6}1L5aWYeZZ z`KGImbd@w; zQ$Je39Z)K0Tf|0JV!~Wu;^G6H!SxCbC7Lz~OFU1uf8fwJQ3xm|^eslu*b>vXL*7L7 zEfAY%&iI!dvJ+o)My!z&Hqm^1(b=fRm&;B$|8jv`5O-iBEsW=5BQ1;<%0)X7CGLzy zVRVEpO))B%USdS3tx&ayJDT%_jpmfIPTK=9UL7DXT0cy6FEI&Eobi%zDtLEK6G2cejg(YQiJDASb)R@T17bdaHq z!<3L|7t<&y6@_C3y{Lv05iv@KaI#ew{$5}cg3#J5t%~H)W|RwmPpX>ROB)s0%t`cPQ| zJhx2BRkK%^n;^8i&P@kHqyr=AJH1M1Xy}`ys~vcxW28+QCGI{c_R0~`xH<19rCwcU znl%*(&xA_KxS;l-pp)Grp4q19$pBT04s-X@SCcl$9X`_yZDE4s$_H>(pjbjHgE`o& znsEh@+zkp5ead=rvJo)l+Z6U8IXdR0{2{$El2jCgcAHRl7U-7)=ogMUy@nW>{OKvu zX;rS%ixV7R>W)mYu9X#tietbvKE|E&a6zpr|09+1Psw4{Gvjd;0*|{wp?ApnXXJc` zod1~|#wWRE^r?wX8>Ad-Y~) z4+~2l=-Cc^GGw8BS#b#edmP{n_}_MmtM=w|$>OftjUQf2x_2*Bb}r>vD^6P%Yc>KC ztSViy*h@;6T&rP;^*?3v+EqL6TAOsOop<#oUH!Kw=Ulte^=s$r`;zs2sd^7^$CBPR z?boc=HY@;NExI*y>nlGhcLQ}S>0PX9Nw`{mTwHT){N~JDu{+(=@%FB_c71ct)uZXQ zb@OeTlWm(5uI6;t+N($BT(}pa0aBS6h^RVVr-j z79mZ?z(dgQu=NY#-`^}f*lGDeXW=2I?FW6ehw^M6=Q-fl@o!9G;vK7MK$vycE#sEU zQ1XG&iglmmn)U2HU{nqhlgeQ*Xf)jEnpGhzTW8czrs9b^aep9#MArqw+;h(*I7P=iksF_<&&AJ@eg!8qW4k(tlhOgKbyD+R zF4FcPl@-N&`qkL;V=GWMaGN%``vk7iV>;ZhtD9bMz&sS&W#&d@VQwQ@yGEd$it|D& zyD_&{3WNfDN=8$BFthf+U<}ha8?gAae2Cr0_F_n3ftV};b)qxwBo^W`?xybPC-DuH zrxwH9LUk-~d`#EEkb1T)C6l%=6r*wI9BSgw+c0V%jf9}jEQ(`=a@L&I zx)1u&QK*d=lTp`>KyUQ%=>beub1MwAWQC9)N!&Q;K=neu5f@nN9cqtOB<3OxxgY|c zrjXGAx~z*>y@LHp8EC7*Xmr1{Kcr=98bD&yfwcx@c_D&R&r0b93Y=Uh)+1jsBLnk5 z-0?#c7(BIW4w64^%gv^D9%_8nGsuHLL zXzq)(r!Kt}1*_*rWWBA%$WYCCd$T#6gVKIJXrkk^=n^_5U>vDIC~(PMmdR z{Tt<7?}Id#5HEM-d6 z09B{QPRk_Y!tqnzL{zovQ9e4YD43c?NQJgb8bNlNMVSgUH-@)l|0EJ6lvEp3{4!a^ z)Sg*NYw+^_EzwNB0f%X(wLMqM(mlObOBSn}?_0JO_Fvt%0KC5I-NGN0^`^_)=F8Ut zX}=YF@A5mB=gPM%uHSskmG11G@7$5>+>t1k(p8;_s)5AjgCFloZhn5TXG>!1;bhN| zMD?15y7olJrth4bs~cQsT9a72^}Em_+qINu>uXJSY+AD6cd=vRk^{eQ9sRt((z+IL z=32HbG)qf)dF^2YEXKla;?rK{WLt9z2wJ#$Yz`&aJgKDOWP`i}Fi{jQu^zc<;t_n!N? zA5}lUs71P6J@4L?bnlw0-o04WcCTt(ddL22#}XY|Qq@}*D%$2N`jZv?x8=EtO=-`@ zYb7^Asq%G;M&JBZdEZjlioRQ#vRVpj=L?#X1=Ls?350@(!n-VT5_zt&&>&PKu=tc}eMMbtUvMlk{P#|a-0YwP{r0wQ@mOJe^%CLKMp^(APbDp!GgGNCe|qnzS9 zxx{v%hvoWq;WxVzRL-);U^@flwod3wR3jQl6rG)_A^LnOLl=6mfJ2YN-}E;K5g^ux z=lS%qQHrjcZj_?c-NgL2gDljw0dT6r4s=~@waWa@J7EDKnU6nb+=7$~4{3W20!J(J zazP=8ww!IZYyD5+l?k08ZPZ&fVn7&j1;kK1UyvOp5~(PrlR8=tDqBq73v+xg1c^}u zLb4ElT8=vLV+d1}_LwegksUEftC>~~h{3thk4YKe7g zImj6Ecs>(gc_v|nbE031Vf<>Ntd)tms1w0)%piyoI<(jjCD^Q%7c8%TP1o>n&iR{(TamD{Ykl@o>0 zQESj#fKH6X=wUjdXdqpRgw`rVu?w9g+U#flIm8ZD{)`+FASrK=!)VYC$oDZhG(D6Ja54o?24;jN z^s5xMg&g8WXY7Q)XYvJu-tEd1n{bOvp*D_DX82~xH8!snZejt~ufR=w0_hPPZdL;j zMlDE*nbFToqY2SjZtTo@DN1nJgxjbZ0s;v#?~t=i`ZV#Z*gm&mf<*5##`Afz#Z`9o zS5n1IH@jY;exCeX*_Q?aOanzWu`7_QR>RBg76Z zYkPNlvTWT#=Vroz%G&0-@wz>|X3Mprx$=(1`u4ZW-YQGgyC2QEUEH(8@o>UuI!-k$E? zKi_{i*?%~3PKmLknOMw{HJ#*Id;e6IKRP?69>l z-MSsP7(9!u13<>$Nz|`TY}l8q-w&j$UP?$C=ISH#Skw$&Em~;pxV8PgJ@4#E zbwb;E3u#(3X_^*Img;8e@|sV|tBE~c^MI{wegCnc-3PYk{fq5|2knj@*sO4MJwr?| z3+))#jji|pCrlDLazSup`9nuA40dj=GnZw%VEv%Mc1M}KuD0p13@TpW=+ztk470!A(aPHJ@Fm@;O z{l>^2_}m!)lP1(ChhoReWx2!S4#5gF)DNI}Y31{F+#K8UsqbNlh z^vb#4(f$In$1oN!6`5oKXs(^voXaCMvq=c5ifzq#sXQ?`f^+{wwZkM8Ob8HyZ!|^g z4-wbcWuXzg10(Sh(gNZ`K5m=Xe}*Vvk{sT+N<`>K6u?qYKE%V3c*|kwC9Dq~-hXtT zZ|IqWzTu%``%mCZ%uF=nQb`picrrE^mt=`1=Z-buT|5 zqkIqXX4{NSBB!8~RQjWTj+h{g8!c5$^OYUR$_{Z*<)!&rcM|`L-3ztNR}U^0SIrl9 zCW|}Y{gwId!6g0{4=%KJy>@)Db?toX)@19}tH&Xj8rU}P*^~6_nfL5ZdiJM02j`pp z@5s0Ow<|v0F!$8Ry(dR*Jblah*2zS(AEaTj*}qU+I$zwB#Qt>gUh&%7+rPc@&d$WT zz3G8%-;UpjL)3R8oOJaqlvO9nA~&A_zo48R2dp@v5p4fFHClH6?2E^3SPOD)`A}4y@q!Mx}m0#L-Cj99gbqJyqD?S+2vv zau4vN2rx49Pp`Vxgb|Gga7>G4zy`7M3zQ57OW>o7SiV88pOEvf$?1fXY0&s~s=4Hl zzFOV+eA+;uiRJ3KQvGYjh7%|6#@Yej6p2k-!zK`QM?n{Z9}JYrEFc z)(&*5sRe@jg~rw!7v7G)760b1rWzq?FD~5l+L5b!uhjrODrsPu_{L`GwN&lZtJpL5iIoC7kvbw8ffBSizin}y?QeIEEOTzS{ihMK z?tx8yOqdi3#5}{yH@@Q#>|-XF!l(o`A~0B;YEE~o$~y>*VzFCPvZKmWAZ90<(VA^B z_LLl-{}{9G{2|7F<^%jOUHl81bF<EQ0RgYl{}PGlkSj#iOVvep+#p( zu!v38`HVwdD`8yLxM@0SdbVI*f`l}{&@fPvA+%UPnijTO2h-PTVSHtT4?;mUKdAg? zL^O|Umqyd7mGSN6MxK%lcm7yaCS`1WZT}($>poNnY#AzT9Eaki_#Rh5u0}*QPy@Km^h`p@61Hc-& z!e~t{z-i=4X*EKRSE$23g049T-W?$m+PdUj)U?{3V`~RwycH6*2wz*kqBxvDLNXjS z1udhSIm^DT0hT+*u<+Rc9kc+jz9}Y)`iQ=mDbnxvcP6#2YUIDFz6SKXf33Zp`572Hm-IrL!3W=i=Q2!Or76f4+XL7?(q$RSO(OwqG+(3%;g zFz)^ih3haUV?*`X1_lkG5VSr7ge3`t{RVOX>;&IY-vYW9sv732dXiN=x2wP1e5W~8 zwKd_|`bkN9x~yuxZ2P^k?F+SyiKd-*<@w#uBzHfPsy%Vdmab|~RJj)#yO#1S4TtmY z+wz)fmn?ZTwV&o&>YHxtPSy2-_xEE;==sn-zkXkG{k~M~{%f{R>Kea3ea*F4Rkspb zAlS)p^8h@n!A*lpd`jL(~We=prMLl_qg?id~RBDtkHRd4|%bc@Ym=#^Mygo=Ma7q(6AZrR;#MyRZEfV5z1&tT1 z^&#>tM-Pf2`Pb@h-mFZ)|2K_v7ZUSkUtax2{IxjDQY6aO-z$4svrO^v$;6hY69rGN z90m-57={=;s|`bxaAz8@We>Iq+Wz>-9b=q0ky;ef@9$avAfG6544T#7gRG(W5D3G_ zB7qzwz)JZ%gqkTo>=7Ed%bNsQ^Z``Y2vvZ0)$Wd2&~wFxWR1V)4*)GKRV~q46Hx>=n z%&V9;;sikv`IfJlN_F~}E{Blbtb>qi{p1E_&?QjU z8o1wt|MHUy`4ikLO`6Xjve zRD!zx`Tishpdxi0#UM;7!x$^p8J(JxK(;M@+~ zfh7*f(-zFrfQ%G~FEk4XsA(O`W2_gb_0Pk5@W3#zt1hgLOi5O80yuQ@hnO8fX`Lz1#v|iY`;fEB6skQPke4(6GLe%CAL$4pG6D z`MlRs3khXkvPNaN+zq8_o`jfD>YtY$OG=O3J@Rou;+Ypxk~dk7KrCm)$A5y6;D>HA@aldBe&bo`57nBodUYw!`P%y^Y-+@;j^P=mNY-FpH2hQJQIuo_v*}O#2pdKZ~5}dK7puBNu<n=|B^n@c|7nkn7EjO-^>$%W@(hVZ?@dnE=9;%nzSS(!4_FHTZpF5$(zVdA8*l_Eej3X=)q9w2A@eoV1_8vr5qi6SMgf9+!&O?5 zDQG=r3TagNYCB~KpO?{bq;4}?X7oAu0#h?vsLS`^%N5J#MV89iYx36{ujZ#44t{2_ z6?(27{&98FjRUt1r>Z^k)ti#ln^M(VuI^uORb4x9-J-Y;U47v>&it09BSg{_#r(nv0Q06`wY!qSFvEKit`WL8z-vMlhbv5~ZR$d%yN zvWE}6;gl$wrnKSUnf3KT9L2Z41S(r8K^k4B(ntv1f+oaqa2(PL&<#r%apZjHQCMFe zKs=`&k4~d5d*lL+w-@mWIbI|3%b}fs&>UI`oWlD0IixPqQ`asl0k4B{VVjHXm)qGvKBv?!ly!j=Fea&%aq~L6ktCyFh4KQ4lc?G zXa+O&zGx^C!)=vD=EC;=LCSD1Ifux(LJmzH!9HTJt+LpyQ2|5%AS~FG1V6n5IihTm zG$8ZYIukT8e|UnR%Co2m+gMGPHs0L-_VKrlf3SbPZz$O}^ikIj2EI3t>U$>Dd?HbL z;$FdtbZPyKuKC8^WMgltu`f~Dcdwvtv7+XB>zl3jEvcwTa(u1COcYpR}aQ>*;;$x0`NNzt`|i!)+Odekri5{MweWV4`~My|T5pH_xwoJh|@ikM{lG$oG!iTQ{tIbl)p;-vj!FNVyND8=G#Ny3zBE;ZJv=GkzK+An?lm+Wj8u|JGPQZdVapYzM!G53}{+ z!t>M1Z^1m9$rq?h#!eDLAg5OlU0e;p37hqVE3aTatF&S~S*a2UX{tS7Q%HQzfH+@I z3(pj*K+JuKk{Jcvp-9VO=8IYSRr>Tt)aSqA=Rv8KmYH*E2XX|Fxwr#^L_JC;brM&KzpE7?nXOhq5k5TZE>KDk zdA9kOK=V$Y1iALCU%h`?s|#3|mf5<4%Pxo4zLxP24Ni)yqXiq;>mP@B{$ z@p!2I%@p3Z{CZGAu*4mqO~^xO$7?44gt!yAOlRN-iY=3OFowTCChsVIkK*F(W9m)H z$6+J*Sa9+vZUW9f=D$S01qWcn`T)+b39HHfm@;+`cEmO0=PIRMAMy5LSX(MDb4rDd7GjYfR9C2C(S5-OJV*HN(KwW>G!mXv?> z=$CN4@6UB1FJIQWWN)p=zjBzARIBQ*_r2MdE^V1Fm6D~>!#s6s=j%2k>o%lo*UZ=U zC2RW(PgPyIp(S10m~O-^#f|CqHR+nh>o30f;-_uphpqWnjwfpN-?x-I^6z);bTlu; zt(N>soS(XHX>e@5Z^O${9(+q%DR}tB`QdZP;d7r`b~qZoM_eU|2(83g^iBw zi?ukihF@&BRlQ42@)cMr-TV!Beo^WDVuan_Ug9Xa-&*Xb{k*Zm(J7`lP3%$p=?_)_ zJtzjQai6bj_1cK_hby=DgBw5dBp+v<^)YizoLFb2d8k0(YBewh!JxvWY-A9J`PocD zVicNsIVTDC^F(z+#Q+=ewu{LEKz zgdixI$RDpD%p)+Sz3>Vn>x@}3QgxWZo+RfeIm6^UMb0zijFUq`2|gZR+=zr-gK)rQ z2IJkO;#MR-eL73dNphYg=Xr8S3r5@>bdG$~{fbP^i{$voQQ&0qd?(!<0`uEXfxl>V zb5&McTEw-aGJlS$1}IsS>g(X~(`on)gwca-(0ZTn{%pOFJ6!_B`0|G1@3?)+c1$o9 zsA(LZhy9Ap!-;0I&hR%eG4B`P4SbSetEIS<=cc>;OB&uB)9_0i*)KYz%HS{1Lw}AQ zQXWGF+%x}8iu^xKgL2YpDN?y17$tr>)!)@8@DO5rNh27dtp09?@fVuFwOGNX;ZeJW zI7R%d(nreUzrc*xO-1h3XM|SdBjAd=^Y7b;P#-=Fl&Ig9L6jhRC#ph}qXtCj{IWN> zzvD@%FLde!Y7Wn&Ni+@;iLPAiTN%bqWGJ4`YSv^tmg?ggYl!H6&e!1S%6J@K`(k+*R&zUDzTrOLsW|gLV zd*i)XHLF@)Gv$D(RNUB=>$HVj`zpsFu6S_YpFYyylCCujf8mSH_ciVWjOpCmG2N_jwAgfttX``V=A^^OTLxDW^Qh94 ze~$YHQLj9b-mgeU;r3NVpusc(>*DKPt~B*=<7$0koSDyMJS=V@v$8U{gv(JK#$3e7Nm#C)|#B0o=}bA>6Kb5!^NLVz_JLF1X$C61Y9_Qn>DT z8Qk7@4cv9{a=3l*3b_68O1PeQ72JV%HQe>_I=CC+wQx7a>)~#SH^AK-Z-l!g-UN4R zyczDcxCD25ydCb2cnjRYcq`n;;%#tu#yjBdig$jU&+oZ+`(MHNu=e(L&?R74KsiS0 zI7OFIOZy_DtfS3B$c`cnRG(&+)v}vl$4Ie^u7Y(7wM}tzfutD+A~Cmi4u)$~4; z7si6)pq6m4Fc)x&ZY}{0rRw95RVKv`%7|=j31O(9p45z?t^+e

    rPmNJh$Pq}n~w z2*ZIJSgyIGsd$oRfOLZFQfUh4!a6KVrNvo$6h1i}K1X?So1~r*Nb^a$I2MZd*|QJV z0Ehh{vSS7FJZ$DFJA)B)h7c=xkerqKstU#x-J+_p+%Gz5_<@pJgSJgqUU{u^^44t~kaa2K@JEVI< zmroNJPeYMgXV?&cvz%Ip*4Zd7nnKDf+T7Iz-9lL!qfN&%D056??LK>Yg*89U%E*}- z!Ym2YJ2D0pIYYZ7MrL9)c^=Z;zQ4LYFUsWa7wAIn~{8<|=Gy=6Ftrw%-S{q?)fa4BIN9l?YU7~+(n#|CV zzLlD}k)V$!uGTFK8;pFjg1=zaS!qP>MrlUYtYa`J9hwf~#%rj*%VJgrVI=jVa2Mr$^AFv2HTlx1t)RZ$^z(vy9NGQm<&z z)F;Hm!=P|=%?bDp`YeU|z@_DP-m9kZbeJ1}q8IL)Ts9JFI$w}XH=0&4H6NEf($z?l zP!7{34VHvflD2oKx?Wks1B2kSQQ)ju5E`-=rfE~>L)bW~1d*?wJN*FbJagw_3hpz1 z!&RTY1=DgzTW~>71YAeIuqh=puTiqDysZ^ws+hjh zsHgG-sKJ#vI6Xq$cf{_+D5EOC7^+5OfpQL*#ItY zc}_drf_~?c2}+2M!a^aWS!k3=8+sJxCCQE<67a~=G%$BJ?@tOH&Zl5pbP`dFV$~%b z(2iR14QhJVv2Lfa>Q#j!y+cKDbRq_fUYvswSDLBUnHd9altu$(QjMks2k{Jk06a!X zUCSTEX=S0!tnH|3o0jd7F=d)hfDnA3{Zea(37C?&o5n_+6qtXI{)r95w7i0o%NH^x zI?qB?VD7`boQ_RRn?MfTXPIlH4BLrnt~w5Zod!72^e9%KwpWlUH*?IhyQk+k!*@+V zH6rQpFk6iK*7!q=N7Rn{`%CYl z(MUjnf~mk>p=c5DVF*lBB*_GCRveLl0ss@4s2CY$gjY2$iIvRwE6#3Vo)Kb;Swxr@ z>P;W8@<$lY##s=W-}H#!thFS9w0TOUVO?`>fTt*frra_}LphOV?dcO-ibNOmo$c{> z2GCWb0i1;x5SjW2%O_exz;7HAz?H#9WyUdA5AvcUnm~n)z%Tn$a1q8zqFFL-ii3za zkpL^Uglia0Mm^Q;G-V&i&Yr*^4p2eam#k?%svIq{=z=d=W(Z9>3K0F!_CU#6MEDsR z6GCJ3j33z&qlBNY8DUjq?u!5$c$P2G)CL2G0o9KJUVPD>!8Y%Mg|6|~`9TR%_+WTC zEQxm&aSA9jc}>$J?7w8B@L&1@DW+)mQLtA%B|MxnO+`Yid;9?78>(*l}7MRBxS$)i%%mtXCKp?SfsLadPE~T&z_bA0qRjh&aRxK z)JQov4(tfsqBc?`YiZGQCB%1gV~k0zmf&M@G-n=a3~^KdE1R;!%BC%D#gbw4iC3+l ze$aPhu9Bstf^xQ*brYuS8R>|| zB2$Eo2-t>;0afgS(};6#KxIJcn-Vg9VsHS|tE$aJ5;ca2JM~Dg$~)0uDQ_+SRBU&g zDP%r2(nFTyfLTm~{{dUv1pa6m3Cs$wrYXuymO-g!AE}*_AyGiq{mgh_0L?%preluF zH&+v)XVONeN)uB_#e2a4(DKe2Akj9AFV|s2GZ&7nLPK83mNB?OQckPKKr%pqsl^I? zWz$u;;xgOQCS~%or}Z-$qG^U9fwRJ7vY@@tRoMKPl%Z`4N8M&d!06HB^FVufRuVCb z@y==y(GJ?(HMAZC6NxnMfmIf&*uyu4`n0bii89x-xa)#;Tza5Ce-rV+S=!RB9c){|E1?NXHP8BT9p1|JD z6jrX;p&hd(o*d9c1E^+CY?TF~kNuY^+w@cKt}1nBWtfL6?-<%T=P0XDa%6IJjTmSG z{SF1JC#RB}jpS^Hld(@kf|D6L%`0IZ^>66YI&%8Sxk(ObXDPSgKxgv``G?5aOU~a1 zjUZMyQ1+1oe?K_~$vH&MVRDX;17#Rtl7@D`FZwJKg1SxPG3IQ-h- zYvVU!DOcB({b{Ew;jCXMZA(Z`CZ0JrS2~&~7+ox{xnB5Y;f-~-VyW`JD~Hq0@`ST_ zp}>`Pomz0MN!Qi?jS~lypgrfRh2i=98?DLW?sP-P)g!+^O6X?pcyq^%7jK_TRc*X- zH0`WPINMOMCA+m^%nI$j%8t*A^UH8HDj!9cTWXuGzwqV@iM9b;TUE35%5d6QlW?|k zC7)eZ$;KO}k}%;^({S~`qO0Q3?f(x>7xID9VM)tkOZ(d|y!8UW!`)MV=KT}zpPrdp zdnDCzB+>lj#~YSl0d<&+*_W)PJ}E}UJ}tGBw7i=|a>1YZl@D7>{fRoZjqVA@%la5i!W z_)Q%EtFNvaVaq68Q1+Q^jVu2@)ORmA@Qa$2RWCWo2g9*zmkP;OWNGYODkh)H(z1T3 zgnXqGuZ(=P2_8) zuom*QTAKQn+Q=v2pw&`4`8p_VC;7Ul25ZQ-)>2xz)J?t~^0~>^OQo$NUmvCDC!dFE zH9)@gl-~yOZM3*bmo|}aGx@fVZ!7t>kq>vzl`icd-ypT)G4k!C`t2g$Zu0FRA5?Tu z{UIy)pRiK!UiM?%qQmyHABx2YKgfP8;Hu`O!{lGGta0QEeJ#Kw{lRji$9n$=+-x0E zInQekIL2_%yKKLSV@|T;Ri`&U;EdYkVmbd+ySD)MraJM98&Kr}{1(Zjav^?;XKe1W zOgXVaLXf^(0CqlvqjUZQ;0LjuiPb$tTsGz{iU=kH;l#8NYN|xt5SN6JRTE~eBd;&u zP6E~3ADAG5wMW-Eg8Je+;)y*xvb-K*iy~$wVO*ddU|In}LV=SJ?xSaK*ga4&Z&PbP z`}Qz}1H3H?&OH&+#D?PC{xDy>ask{K@je2sAm>W`AP$on@>N~pc+#K~Rkn|M$P^^J zNJT~-h{L6_txb&7hlw9``x-39)+CWcBI$H#R(X2+3C2I7Y~VguFmrgf8-~rhA-w1p z-eJ6PN0@qY`B`|NCuEJ`S3J<-s4|Shz`6m&<%g{J8W)MpAl1XZ3WUrq44ad7hfyUQ z>U<|FAWCQ;nkBX+I^{6iuzZ5(H#q$UVQ77b0~=z+mESm@EN)$B>cf%kqu2nXfvff( z6*Mo|EX|!1ly38IfLLRCQ;-_Dh{M~29#9v^Rw$D68At7KSkD|EvFI@lWGl6XLdc`y zp0F5)x=r^0>*sKD9mV`6Oftr;-^}}6lPxi~ZT8Q2e(SR*7^Z25MMDY-pfk?}LlCfn z#*UqrK(@ppVbj{itv$G^jkL;X4PqGw#sz759y|bqXU{RZ%1T@WFN8ZeXQm(1o`H#Z zPJ)YLD%D_q(A3>cW1VsOAkK{WeB=QS0iGfsBq<>X@^HqkLDgqqgDsO0Q`WE=?1a%l zn*U-x(eb@ZslI~Q#FMy>bsAr=5NM`Bl^r&4%v3<8m@7c}puFZBlMU4qU*DwpM!M`k zjtXGJBvJQRvg|P!{JXLF?VWG!yj?w4<)Qm8H@~;@ot;25nzklz!Azy}?!MdAzkg)D zYg@8wTcUF?F?b?z^7+Jx(~0&osmikn*I6+qsXMespOb_=uVzqyuP@POCLNcBAy7)m zPuwQw$yQD2&TQtyFtw``!LA&e<<`^yt+4(G`;WHSV^5L200sB%j);LFaiyhNvBZ;lgynbQ6tSed8b?fANXWluJD#JCylZofg%s(GWJ|9XwPZ<8ny~>V^F!!wY ziKCHa$$^Z3>97DF)kj;`uDnZvBW81|f;)?=-?W7EO*6Bcc=|1Qd>lh}+Y zf)jHE@7$vrAa<~|wk$}T@ACz|LI;-sNajpM*^PHr&arc+R0HqqRMAO?aFDI63l2Y4zA`a1i2K6KKZi0Qz~T*9Ly`3 z{KXWLlZN4QyK){RQWM}42QUNVTXu%)844rk5_Q-PqI5=LO_3 zf}C`o9kS<#XCqC^>@!Ik;z?=DgRE>t06TY4IoPu2g@KcG%TA1FQ+bu_@8pT)xq9~h z9N8;D>WN=L8Kd~)=MmLb#u33}JlLr2Ur=AF)h*CY9Vss%y51#JXMKUvJf)4ngil*x zH^cgJv0+{X+p}7qSIiqXP|FW=y?lUqoBuO(0})tXRG(HQgjhlql60JCnTBmx&~K1d zshAtft3v&R?FcGJC5sLVwGXnmMM_qXROnHNGfbwb_`Xpy!3aW)`NRa?>GD=md{p(W za8V?5T}=|Jfh3j6Wy-72^gZB0Ehsc%-aC7vI(*y;0k>lB8Pz>AcO@& zBnW36$o`O^)&_h6_OabkP)2yKv-|e(MBl*$VkI6@iauyIuFRd8Qn9a>0GNi|D-G?F8dgHoJeU(A?^lZc`ZXgn6)N(tx$3#*$z~_ zq0Yo6Rf(V`0$Gy=vJg;JThyR}4q(k}CI|~jy_8MKkkXxCvOz(OtsO!ogj7LrjjUDx z)Fng;)|HwZ?~}ThRk+(&z84iD>}5bMVa-8kO{k&h0ntuXT~do=Bp0|p+pRDea#Q(V ztE2{8Q%MGfGe&06>GeYd$Uu<1LOq9X8DL8j1oprpWJsM$Rd-oVCS`KU60n(7%e7p& zG?K&v&S^T|n(`uzA=g0Vx&i(n78Puip=xKJWX!CS~a}5Fn+8 zd6xez6uS4R99_~W`4a1INd8%SSCtM^A?n>34F3N+(O6zp;r&bO(7z+C=wDEWSCgV= zY4FaLErT?(C3|tfdK9L3$TZN|OsNi>7@R4av1et;G#SMcrL`U`^dMS z95N~Kz@s5Kr-kvM6~G+C8WpV(Yfn;2HbHTod~9>#82Q*D1zDgGCMbyf;)A(58jk=2 zjsI)Btjgc{@9g3o4jB8aV>QSD`$=ea;A zLOP(a2wQC7SxoakQ^p&War7rs>tj7fp=M%)gTe3)#V-|w`^1`4m?4oVTXudZ+el`n z$~Vo;5x3`w404Tnj%f85_2?NC3_fdP>wM$pWFriep1E5(zx_;d`x)FqU)-3$jdz>B zJ$Pp@v2NEV4Y(ZvmP{KqLpXCJUEDBVOqcH^inpY3lY*-|>FT~+I^T03*>m7y`;T15 zh!4B^y-ZhEE*oKbmGfR|M6Fjbynp34W!o9dUb-L?*Lwp~6c0pXXsdX% znWofY#t?gE*<;-HV&pVgW!(E>TxqTpVD^%=RdvQryRoXa$DKTMMRtJSqZ3f z0}F{(?RSw6$irF-U10*{oK{+=UGu%WlD)e=s<_wt#7FWECcZb3IPiSBZ)eiwzPkU~ zhD5FV$6&z@e6V}2Y%slk&;0tQlIx#JJbfy){@G-C|24<8uOu7$7b*~CuA=vo`tIBI zR6T;pR&MotSx2(0BT?2%CMJiHo}rJPzUMiRUfX@mK3CppigL?;udI8arE|VzYqEvz zME-bxs^yt$_J3Fea8TZ})M+_reZk65VOVKL%fZdPMEykk_FODje5ZZ{Ow)P1gfr-v z!w`*#K4o&|P?VEXJ4L0=P^pCJ2vd2p* zt{qF+x1?)ZQ})($MRm$voi46P*=y3(93uQphg0^$>58V5y(wMpN!dN=QvO=EH)Y?O zE-L-%kwr(z3e#%$%kv%3K`L)?oDki{)yTqp2+jfOS?~WRc&>xCzicvD40fiz^XjnA zWat9$Mu&|^u0C0ENGlXT&~))2zXHv#=T~QfwK+`_XXgjVTcYJ*{2KReLGn?__(ZN) z`lX{T$S&ND+1<}*_l)3-AVDs`tqZu-N+ypWPC+25?7u#VSxlyTXEGKsJAM@{gwZh{ zOyJV$5|e@j)b=qfapnJO@5+MXI<9L!U}k_>fWbc42n-ftFxWS4AV7iUCTd2l|63}u6OL_%Tj37(&hS<^@oxD1 zoyhjUsm*~?Kl5!3oZsjEItVrS0Pe*S*GG2{`WBoU&{lQx4JE_TZUmgeUZfb4r_? z9g_&nS9;}v4$s+JGqq+Qh8k^!xw3p!Y|^@l7;d@v0Nb)tNo}T+g+zN-gbe;PW9MH& z2bOC~^IRq8@!j&0qCR*VPIa|y{bXti-evS-5N$=qf5)H~ho=qpPRHeBT`r-(lRc-^ z^m}L>|3&z(VQ=x(xlXru(lh$KK0nJ{W>`RRl_F>78S~uCiM$6mL^|QLyjv2Mc{b5> zCzs@t@!li6x%WU`XdC5Z&0Z=H?}EJw&H(z+`l*m6*RFSZwU>h9!#(y+xbdN6pLF7- z+2w`TI+J==ZQGIfcN0=FF&anNguWxb4B-o_1-Sn$sVo{;Kk2lnhd4_{_Ha7xOgf0j z4NRGA66ERyU74obcgBJX9OftTsZBdBIQM})PaZeD3Ey*48UQE^R4mRGLwNX64w_ri&Y7eQFEl@-65@zcjo=w0>n zQ{WVe3t>7?uil^|p*wNJG3&W3o>kZl3llQS!J3r)et16o9~T!EWO>b|Ov(Xg3smd* z8}P#TmJS5q#nUB1 zP3%IPj&n~T&C=OJCfDqimR}>+Fh)Vv7A4Z7?5LCb$WEDf+u-p2p_e-ypQ4-%Hsr{D zmUVX3uq<}%k>#bUu=~-8>*FcqlbDR~^hw>T^7t$xBHQ{z&UAG_vJBaS6U$9d%Jjk1g6*~L4RWf4I4pCoBZmLn^e9e$L;NL? zl8gzTD<-q#9NX)jVYcE_(&d&Mm&dwwXQ$>|X-M=`TwBo(gB z>+(}M!hgzb9eF^OPXJ!&OYjG9Z=d51kX?W60ic~Tpt$GOo|0X>04_rPUzm39CPTzm z?F8_7YmGCVHA{Af@?=C~#>HlcH>H>Y;sVftG-P0TTg z(`y|xMekEwzKm&fRsrw6dg!)&mvq1rc%Rw>I`8gC9=%L^b&-lYUP149+C?}m3M*qz z;uYsLXWjPYOUOGrQHU@Z<{n0fFA#y8XU$2nt24-si+rz0-UMb5S{r5;sjxY%Iqg(i zLVYmqD;kO-u?N+hpLtd5^X4*~#Go%=@WFhO8@K3{gE!KCxX{oq&tt!*c_XLRcHmfh zxPDRF!97LjDBJc8$8_R_$91S)w|CA`0uAn!Fpxf^!T&E{|MU$1yDi{*HqW<=wW5{o z-524_W^V)C@41Tyc#{3M`&IuyD=q%sE?Nt$)MhWh!Ux-4(l8^qHloXAr*8+c>Rp=s zi^f^?R%^Z=1lIg;VelES_Fgk))!Y8H@Ji`*9+@P6Z>oQExA8@A*ygo@wJ?s{L_0aZ zuSM2;YyP#8wcr|RyH>mw!m==}%lN}VoA#S1wcELeILFUjw1wr^_gtowyXl-jIdJCr zOWY-Cn16!XB*SJazGY&|*EmMIs|t=(H@UfqVJL)#GQ~3t3<=q8zJ!a-KSPpnYeTpf>H|OeVbWjv7hL_HE9%3l=IyEj zn^gyXVr*57rh+@+nvHPNJBPO0M&4~3`Jlc0fJmG8kKtu9T4;I{j2q^}Rnn`m?H3=}tJB z8vCGW^rtV}Z9274e`@W-PE~E{#D|sb=}1XB62sP&bfjL=7WrC}j#Q;1dyw-m7O4uQ ziXY)H^@i=}&}MY#&fuL_x1!H%6zdby;Ro{P>m3r zC9+5y8le4WyBxbKC39RU=|q|T{;w7Fs|kM`XDt1PVrpR@d~syu&2+RP75aI!VtwRK zZy+>*ETtsRh(mLxm=@L7mgbjq?Y_a<%aYG=qEk#xGI^GX{3>-9B;;|1KM2W4p3u#C z=5gbu`8<;snY_T{6((1h2&KJBB=j{;^!rTYimNWVMzp|$Uf259*Ie`mE}ABqVj`hW zmmuDB6)J=k)S#J z`bmp(3SUB^oxuu{><)BAKkX|g)T3P>|QC0*1? zvi`r-Mdn|#&P!}b>0Wk%`8P~tcNp2%<_+@zbDz34Z)dH(R&CC9Mw=f+)88ESJVm_S zfL>niVVHJ_r>~E`wtOLdH0bpQdf?I|eSp2J$GQjwp1K~oS?vgFStD@0n7@8}_3TsE z_FC?Kty)?}jdP+=>5-azVoor5>c$Tl^}c?sZ=WwMWA-8&UdBlo(`9@K=<%h@6I5Du zX}vP9urEJXI=DE$gRfxV+O4G4`h7C#yIG%StcI|3XKzwHYPXm@$P^*PJ4!B5vSwHE z$r0uSOy#-6qFoLHup7Zbts@D9 zco_-Fw01O@0hFla*S7I18>pDWDk=jCe2J%Seq6g1e?Gmh^dVu zb6WXJ8dzo}FNigBuG*j=E?$e=VUYkas`{nBh`)(##s*9zHWHA9Q+TG0RVbaU| zfZiKn_Q@CV&{#72`SSpC!dX^UbCB7LR+%Z!dZvAYVdh7(@@We(N0^IvNLZ%@eH`Qs zZZP?GCWo1fGx$n-xq4#g+MV=(hB zU!6N*{u6o$|I|_vL}C>hhLKV6U#g*BsEYSh>H8}9z6#w}z4ui0J=K3t?Y*yNw$;pg zYUZA*`-Q4`U)A1MBlp$0_td$2s^`9X<307pFIDAzHNUOqH`V-ob>_Yr+f-xsRO5Yh z^qv~ReSTh8cF#9(&zD3ru<(SjQiRWFd?k=7+)~Xug@NtD%FV*c_1E7mY(?zm5bErYq$aH*;$r2mUZ1ss#3AL6-SSys;)wDi29;GpT&l}Q ziOZC~@z$hOPF$hRts^fu1_0ryDEXfS#bm0n$!uBhQT=}7T!Ps>NmD85qqphE>pQj85t(G_<7q_oerbr3VkBPo7KH$J6ay>GBxMG`8~Bo*`x?`w85C z@eW?Qr_D|QMn>`V!D*wzC{34CTZQ;UXGChOBBEkd-E0MkLMk?9g^41nzTGMzLO_)o zD@s(R8oyy!<%AWgqS2}(s#4KrtD2}rmDX7?B7|n?wd#oKRn>^qK-7qEE!G~QCRKaf zu$l?uFe_RuM6D{;YPAuyt8moXOVpvlHCBSCQ$_2oBvBV1(oNK(O1rFHqCVcGpJ+fe zCagiCAr+>vK=7mU#N?ZhRlpJma{JkO zf9H#Kec4mm_3gjy`h3O*R}SpYVg1AxVEyNfq*0PCiCTsDv{|1>vp$h#eIm{JM4I)9 zY}O~#tWTs_pGdPlQ4?9enJ7-yZy`c}+kUH!s9jipFJT9nHbK;>VtcJ5Q5RXio2ZAZ z-%Hd-*6$}8AnOkj4UzSSiAH#reMI}o`Ui+Ka}$k{%?}fe5secaA$o=g%njZ@%9bH> zgZqyOc9@&_U~UM2Q<4wn2GgGw4CV$tD;UfT0dQV0SQ-LATHCrH0^kM7e-Q$p_@j%& zwgBMWC%<9=uv7i4<)`F%>SX_K1;Aq?|KkFnZ{+ij{X&vE)h8`K2~YPw(NiJ-dj3BP zfWTLz{~=Jffpywygg_S=0LfNFR7|ZeNQ4mR?FfMmgxKjd2!Re%Dq3HZu#8$?IZ*|* zzDlAhO66)I#6a&w40IsGKp#O2bf9{Q{sy8(5&e4zn<%uKiQ?4yT8LUH`rC-0|J5J} zI#35ie}V`>(CZKc9SHhg7lNPz_3$peM12(f{X_#4?t?^H|0B}+ACcDohz?TnA0is1 z+&@e-Mu|R7bc8bh86pf3$V3oyU`PKW<`6N&An3ptA|UdmZK?l3=R**5b;g48*1VUZtx0(gU zg+N*ax3X{B1h$hz_6o#&AZjH9c9KYv0=q~h-2yQssIz(n_K{Bd1rG3Lg93+0DZ>Ia zSqRj0AyDfM0=4oWaE#hyx??P85g?uO`WH}1Ao%ck`SRe|B2^XJh;^>Nz8&k_jCJ0w-iq~a$3{0}qg$1S zH&j_#m2Ioori$Gvx~t-k0*8&z`to+Hdo$MkNa2e$QJ^OpjV%v~e6}8lPY__Z&SDNk z0MwHpkWH%0v*)JvMLX4dE&p$LQ9$7$e<6fTs1}h*LG}UiLJ^RCf98dR6Iz842KV7; zhX+A?5en6rHGNhQ5kgefS^N!`pjpC1XuE>gO2f8Mv&nx4H|lz}>ke$U6C0K`df)izLM-3R992X+|Onsm3#g6()?3HA;v|N$pXhGV(|{ zQH79wC1DlmyPBv*Ra9Gi21IF~ z^(;k^N9Bk>2UB^${&A2Fxd8s*A5!EWM*hSB0z|mWj|+kTyQTrI2R7{B5CjJV$jTJp zgOVSq>YkaMr6`HMI0po{mDp3$(_LNNU0wBcb^mj1ZJ5CC*`a;uO*;wsHNMzCzaXTQ zzxNVyle|VWk|3I-d2}h`Nq8iry}CEyg{Q2`8DGN3^L)BL6G#Ly!9*|-1Ug>cdcTH&hLQp2H+fhg!2{}U}tHBDl~}y#=ULOCf&+u52t-Jh)?k)(WN!g zZmsDcmWt4Z$&;3dt_STJ=QR`Cd5M=?pDfZT(F6SoYt3}~hb^{biC&(!k@mRqVzfqU z<^S4#?hTQ({%Je4_UnFU#CATt26EAMX&t{qtv+p&yOy?@)@hxZSKIP)c`ezXoqkQZ z?oaIGecMVyS}Tk-A0<~WcY(}tt?Rn%^rDaVq7!=Fy}IApfVRygLm#xUTidL4f+UZW zG|ggEUI}wN`7^;Goqhn%*xtG0 z=O)sIlF4b)I#p7+Y+g-g4TVu%%~MTD>8fE+Ls7GuGCrM6<?1vc_^2m`H7qs^P9Ej-aK*TZS~Y%ygA9^&Ji^YZ2JJ#?k)%d}yPD52 z!)#2Zv%n{->Pbz_t9(#^MbinI9|8$Rxd10&jC9IO|2WId(d@Yt4vGB(JBdGO$Y^Db+rvz5gLuJj&SFbPO*JOC};hW}91hfFW1^HV<3tg8J!P#)E#;iZ1!#s^z za{yiZTj&G4@5KS7n;bbe|&ujIy^Dq=3fVFi9i^LdsY zo6b{XkiTOdYQUg!4(i&oPnp9#?i6D*Kh3hqJPf%gEix3$;JSmY+u9UYPK_(MOgfM1 zmd-0PX{0a@b=K&)*yr>Ohv8z+bXKQ^ z(Vxv_DSU*CNh6m<3fGBv>#r&k2g%0OX&st^NwE2fF3feh)Hq(5(_w49nKF(QL#Jy- zTw`ncg?JAST3UYI=G&)KNeHi8KI>T}*#$G?3}4F9QfP>f0Q|wbwDQ-WSvSFp&U@yi zyOxEz2KGL0(S%G|o{`tHl6f*IyWa&3xfXVCf1CGAhTQLhw(ZniOR8(~yqs^a%S{vJ z(WGnx)NQo$D$jY@k<_1Ww(}=jY^w5HTTWNsS}SF3YVA6j$F{KZekjpym##cN^xn0` zWZtXExTfd5qokYUInu&%+X(Bp=F8XGbtdaV z>-*wbhVUXRVI!|*Q`FVutK2lKY84I2+M;4h_!}{OQ)uw+$Y#(s9A*$qL@ueaOJ=RL zDnt+2CKxQU)?W48sKx476mwfI(R|Y8kaR63hV#r2Q<+UkEQHp^NM_XxHKx=QHA5pn z9%n4a*aj?Bk9LWFPlBC-+z8LTM6+Ox^R`#wKFQq1g-_ZNQC1NF@+=2tZi4ZeqN#k+ zvT;;%)!?1F6EJ0i>f>g_HBn~3nhVo!^`G}bqO1!fGH@O9F;tX?`oKgkLkBKpuMWIG zjm!Dm)WFGHp6dO_a=FW3{RWPysmnC04P2qwD+79ZY+z~@{C0L*j z5;fq1aK;1nV1jR~^v{S-&6=B%d?4+TNtcyNCg=KAd9e7CN-NltUqZ4#?l+NW+pUhJ z4ciy}Wsfg(Qu@4o`*Qo?V*BAzL(|RBd!bv;EO+cGcI>+S#&Z9uV*jb7{?jX7Pe2jEC?fZ1#NKrZRGx^@7<>3p(;R}Vg(@VpXi?yG3^)Gk5TI_nY)ZBLS&G+8?yjfXp zK2&Tz^s)92>Ay?=YU5J#*;0E?sipm9_Py+bkgq$u=wJMCF}S5%LmFBZYk&Kokun>M*u4Zg6w0VcDKuXviOi*N=pz0ejNPa@@%K=}o93_$1 zlH6O`*t>B0-A1HFUSBv>s6V|Vzy3gO^|i1=cHI;Z&d)OH-x(mPdxNP{qZK?f3O)(5 zT+Sa+ZHlI^P;MKUIs*m@01!BTJ!gA<)i!JnK7qn&UQwr}^fW*Mw5n*-G?i%%Yi?mU zLeO)U(kX!gQfk%>wiq?Q`y;~O-~tc`fM^O5AymR_fIh0=57<`KziV`cume!f3=GK> z03R+bngy2$`~y}Kc3XuTozyuxBA3zoi0{{KL23h|p zw#|H7tH2%uw-dO=06IJtdf`?J4G7;qxM*+rhTL)Uj?zEJVe&VTJ>q*miu~feE?_)`JNmBi4%v?$FI{WaI)1 zYk?sKAxE)Z*e;;lC`NcBbWwA=su$oBA;f89^ZS4hXNz5D9|Iv;mYUCe7Z8H&gU*bw zXCP(Y!vyyd!qIYf{XD*6asd7ucO3+G-9#e&OLE`S+%;!V50%Zfcz0ty#524`g%LY}GW!J|!v`;1f4Rz-4LsYWcnqVUS@`4XwLr=Z z#24hl=!jtL*Q!Ner=SiO0^r(Gq4?t9sM`;G^4RyG`jv~lxX0=fKy6Tg2xTAVHK+`ue%c_DGd=}v z#4d6)wRXkq)%>7hSE02QQW21FT`3LdGD%ylvrSc${Q2u z)P$JTUKo0GZX(jFR03@&2=0P!gdnj4I&rmB#}RoC5HGuf1-NctRQcxlA~04V^o&i| zTTUldXf=WH2C70+!p%aI7$a`g>ZS;Y?ucTwfi7u1P4Ms_AbW^9OlN2oe0@&IO<@Qe zdO540AShxLduZYbqEtqu3W~pCF|`2t+Obnmo&THIDUPz?Y^I!X<{;9mF$Pq%A4P512^TRH{$A5%B4q+C^S8{;2 zcE>Bahx*1cPXFYyq{jSV0zLqEJL07h}HrDCOZ0A+g z5H@Bz2;sZAU#&PZ=TPZepUFAxRQW?R{32s*SNOj;M&u3t?w$s{1@|-;f%vKSsh-Az zz6QJut}OU{doN=d0SCl8zU5`~oHl}68lN`i7lWVIw?ENWL?87P-0HJ8Q9#_(g2Znj z&4qQ$9+yr?TruU2L0f_f2JU$tE|72bdeCAANieeTqf&izG5oLf(RcU#>D9%0VZQ_5 zJGl9V^3Kn4>Z^m(nhd5+PE_4>(R`W*@?`3pta0i)M8XeuEc|AjGbu+6XfI{)=fxc3 ziUAT(9;fcSl($rbkh@l{xD7HY+)2#C@Su=UNZ`hTH>De<42Lus1NmEa-rSH(avzIl zG58UVUMl+$E)IlER+W&!dK-9biW9r(*0~Q3FLm!LY~ELFe5O$I3?I0ZBO4UMCBPlT zJs=)EE1vh_*{vp_#%i9+&{5VoFHhRre8{zbc0YM}e(ULxn$n+jR>ozmGiFV`PFy9> zN{R*okIu`27&t`3*uh=J$F3*={KZ~gEu&n<{eKU{}F ziAAVRHsw@qYL}M$^+H#LQ}`j# z+^%mSd;mqA0p4(k=O-&-v3@Py7PACljwm`_rB%s{l)J6 zOWlKo1_fR}I$7*K1Z3Gq8oRB6OVI;>SN9xT-kmJ&PJY&~^}}7uJC7819$DIX?19&_ zrw-WON)~JS%YbUz7hmRjI|4X$0=tWPA&d>DFqRezu;(y$KPHHXSsD`zHJbk1*d(0I z;yK%dYD~bH8R`pXDex4oLcSE?`Xe!L2(ObBSqeQ{_D4ePr7c}$FFyN^^5<8z-77wL zFSmneH=lp+`5Pke#5oAdS0h48UbvVd0PGcPfm?kpF}H^NSOK>K4csk_jpJpLPmcrm)gc*7XY64Wa|%{4f8P6VjA@L0(hPPrKAt3W-8X}!ag zgP8U3oIC95B}P>og{;IHv6GMc6svI!F81tUt0RQy8Qhv#w=@r%D$?MlMC@ch<=(dxs{29Isdsfr>uMH#T5d3#-7*`n?sof z*dRRc40(JSV`QM`Xy?Eb+V|e5VTL#`26ZzSdN0!t))I~|8M*5KS1Dvw9rgk?H;l^=lISf^>gLPA!vD|4#OQL7x4R94L|l|3+e8lIOl4&w!2e zY+UGAmRgGV|9GLTZ@KNcBK((*-;+O)j(_9XA+?kVBr9Ix8J5cY{Z+VM{gi4wSPc@p z8j$zTNkraI+O_+mj*mz0b>A~SzEIqA`d4oi5*G@|u|i_3_;RX1S;4qcq%(y*GsRt3 z3-ab$vrF>TQdiIIn&sXT#oiNzQ)7kRv0_)MAa5yc-SPhXa?gv!o)-%*(LxU`ZXGYk zou4T^h2EjU>G4mMOTgi?EjtQ5M+>J?pKj3#@+Rza7_eb$M``42N$I{H2}r?GZ9~}$ z&#&O=gC`Vq{6(32$D6}1XhGyIW|!bq}2pwwyd*>_VqUL!Xr(zlO6qVQUo_T zO3JqTk$$P34-P!P3U`%#@U#X8DQj?$6oZ2l3{Lw>El~F_N~EUo-NE;Na69$UzS|SU z?azH0*}s5;;0b^2k({mp1*~B7{A5QATi)1yKjeo|!xrHQ`8WvyB*m~H6(;^|Uq^tl z1_<+-$c~+5uOhV~tA5U^_kIN4OCj*ZB0thy4j^R-k7O9<0*hI~19g8`B9Z93v8C{) zg#bVoP~GOvTQj%4x8{q@eG4OHj|@j^FiRZ^=a+r$Mf`uTuzC0L<^x6e?>qR7XM?Z1 QOdtXI{Dyqws$o+FrqLp>3#3v2fA}LG5gZi$Dd2w9Kv2LyKe`(l;CAZN3W6ZbS67yR1Zsfx zoO5SpXO~M!cHQ=)8Burd+}Anx+;h)8k30WZTU*7!^JZIL{6Eid+^_J(dVDOyKRoT> zxI5hIoWw;qiI-dopKwK7Jm%esJK~04kK##qBi@8B;-hk}QjzdS{E5m)Wuhulm8gzX zCu$-!iP}hQVn<{Lwecx+iTX%=q9M{i?-fd8qAAjpXpS@|S|Tk}=2u!1J0m+GUnx~7 zyAr!2yD49-v?baj?TL;^2ff!QdlH?IPM&jdvU}mAHHE^jbRy2l9Sf%mC06doyi_ag zi1R<@f55xA7dff!HYe48=wkIBn$05nzJZY&VC2RvBX`Mubx3N8bW6?heyQaIK$Kb| z2k31lzEyJ4uE;@p-)+9PMFRBR&fWpHTB$=m@Y6lk=#d^O>y!^V%7XF^X)pZ~-gj5R zxaI#zBhtRxK6~c9cCWos*ZZFGeXvwIDRn#hN&Dq`>44-ZTTC(rACvY=2Y}*R+S1ybm5$x6h#V&TUigp)^x=sd z0m}R3O8JPi*QEFJ%Wi1%mG_XjcZPw(k6S!w&lkoFj<1YQ&Brw%k&@DiEW}btU5qC+ zL6sFzmn9*lh?*vAf|!(q*>p0d$5T){n^FZ$R^y@)UlFk={9D93$Q#vSGMUn;Oq&S0 zjEY53)uEkHYi1I%KA)0;6-MpUm5bxiv6sfjUO7MUqER`@I?9sa9!)MA{xMNe#2H04 zDqfB2vI;{~Of4_Umqpd^r*6oqk`g5V&~R~C5|es7_Igs1XX8oeUmZ)Sa#V}W%Ly^) zHX0_Kn4VA0ri?vSk*uCGC-sIZF1`e_RAdDU@x41e`(!K?v zi8{~$5UP$!G9V!8DOEF?qVXgkpA?m-BB`eIraQnPj!#spPW z0zAY|z*4l}v9uzp%CayoD~q#fMOXsL3d^aqump>S!^YB@o=U`5WE#1Msff)?egan1 zVIj0IffxfOj7zc#Y$?Q(CN9%TT+^pR03sfn7nb6RBFxA(hA;puMG7XREs8O@Pm+~* z0vJmYG+m7+=fVv6>FMdkW#G^x!GQ%yAY7;y;)%tSstY!ovi8(s(PTlZ%^6XXFQfoM zNGPE;>oi7lp43%gq%hu9f`|mfd2H#~qlk$aNfd4l3jrYzUP#50JvW0P*rbwa4eMlCpO!;7WTD(vxL!N!Yq*H}kDvS@>hxUB;L3+)EC&=o%PYQ1Z%pn6XHyl&2 z2NbN)ZV|SyIt;Z@9TsgStpnEfG*CPZ1NS-BT(vov@eNYfK`_>u6%cz7$03JXqAo0) zpA~>Tb!3#dZgW*UIV-Cwlrav09=HI&j+XE%z(bCY!gi8|g|jlqf&|DYjqL*+C9lQu zz|GoxDy>M!wb(u^jK*T}q7K5>>KN4y z+8REFp4xyll{OV(ra*&Ij;nzG@XkN{H;}D&;N)I)t@0n5r{FF3Dz`w*iWA+`0XZ(s ztF`6Z-0~!cD>>b3^;|HuX6qe)p(kQp@~pZRs!NLC)jBg5YPQz>l($aSTb@;q13ON2 zNv>o)jM%cZ*Q&>!r%&H$)i3O_a)saWcsl0RR%mPG%J-4n7N)B{XwhM{F8uz~^C27u z_^i6wQL^fukIu+MOt;Ga+$JjL|>roh-G@__uo2l(s-5kYw zIv}G-F(K0tXZQ#o&8VD!qH$GCscJK}u0x?k?V=#WQmRomCnrI}(k-P)#nm?U(i@M-Q6Zy$Zvl$;zxz?N~db!dxE1XVL*@Z1A#r5Pmfj z3`ABzc&zl#rxJ4iT=HiBSy{WTrxyEPO6juFcP5p(4kvT}88LQUPD=eZP2!+~{QuDWisx;Tjyq5Z?>)XomcXn%Gy`? zM}BT^?`G$jZ0DI=^R7GR-#ee{=-%u&mhCvU(J{Q)F`DfdedKlTZG5*nzk}Ns`mFzS zRyh45&nI)6=dNYXUCX=~-#E9hUi*1h-)7fq*{;`eExYerdGE^SEy8BYNVa9)B8DW$It~kGvae9zR6sb?=3-TJC4Hm1BeMpS8A*h1@?2c_BY>&!--O zYC0d(A7rPV>+@R+R;->WqIQO2QBqbeE&wE?V?Xw;~QM!%DWJq8R7Zxzv~ zl!`&7E^4tKnkUgH+c~s{aC@moA-Tsrgp^aC#{@+tB`CeL9!S2=J@B-9{rO?8I=JEK z$?fb}d*$6G%(Zo`onODX;puwh5xlJ`_+wbt7-a0nJk`E2HGK!#Ba^1#0(VmkqsKh~uKoN`*P!d&8gq?O0 z=@d$8E*@igLkv`HSO&`kP-PAD1=Nd49RZyMY(m*ou1H-5AZ&av%0%TUHp4kEDCL`C zVo{MpU@NF{fV7^NoD|h~3MOW1^`fv;Oawt!#iRzX696opkXJzIfm}*>eQHeT?S+~3 z_6lh|4u+~ZUHK-cs)*q!G})&a z5XF4J`Y^qI9ORvT)|^9G#U55x)rSQOK|%|qDhNwQDHVh5jK)9M)o_laqG>(WLkl~M zn8K2P9hArzF)+43HD?Tyo*~*46amxg07oYBE0{7SHf(n0 zd~9g(S(+f3DZjj#IaaH453i(phdu{~7BJdpJ&K@fh z1|l;Xi1lYFbP=wHgc~@uV&ubclqIyD;x5cC!mbuxfX0n&!I6RU&*ZOmcZ#YM0fZW1nJQF)KO8pQJ>fkOj_4)+ZV z!r#=u(cyss`0E=u1}T`R!2XT~LsN&a7XF?acpe+jP>jlijs=ThU5w#~q_dXH%%#dQ zMs6U$MlCQ+pm-dxd<%8BngN;z6kD_iTbaUCu^m1**N`yC{*Hu%0gyy1xKT%}K4B-% z*`&h0!D8bv0JQmvK!*S>fd8668UL~rsYJ+?CuS7QSj%l-Q?#p?kX^%XbrI>hhPxa* zFnEM5ailBM1ygiZ4owXnwkmHG5JBR6eRl(%Kw!q>VYLXByiIb4=Ke?L19MP3(fQEj z)DMfr%sJC>OBN8*FG=Cs13DQw9mx3jqq~8rsQ<6s4gbzU929vFz~zSCHQb?KG;iyK zK<_qc$EH4E@8G9+BqpEgjX*2MbaYtC$g_AKEE63PGPwpI=QQJ)-GzqO z%5%jV`H434`#8-1u?>AG+jVIh8@hF)<>EJCL#xMNo)hW|kgCTq8O4N5O|nLwvczEpzwy z30k~+KEq4x4G);ja$zv_ThP+*v9UDtOVgeeXoDE_RPNYj>Sbv0Pw-!>gk+7&H*%-> zF`jrM=uxMjuw?8fiX+;ix4D5I9Qy1#4}XXZUdjQ|-e3c*xrR51cv3nt@G=yS+B(3uDRu1^-gj@xA+I>bk>TMGGh_!eF*t# zma#{~C^q>_S$RH5(s@Q!QcDHT0YofuiAZ*1JZ4&xb#U?)BtArP;&WhK2vQmxATbuU z6h?*VQnDBIvK%AKOa-M{MBj!8zGxNWLKv^x-d$jM5-oRu9f1omWF2emwC;;SZgw9> z)DC@M!x$I>`y}wP2(cdfjIslIFnzSqO$!Y9>~!fwd+gvFMo!I8)d(|u3#KNz2W%>U zPm}_N5ZjKXRN(C%bnk}XU^3%~7FY+i2-~z!8P&i_q}D+;>8HdR-+FSa@s`sF+Zt;u zvK%nr*oDLcBLK+;7J-RM*YMRYJMsv{X6zAi7?kX~#*72oD43LG;VP;KX$_pq0(c_R z39w#?r>^yc!~I|fQ~a*qq8wwlgw$;nK%_lLCV2wSbTrw}Ux4>17*);zjRY+|mlPq$ z3)@0O)girzfoO;)vNnCfv`K%b!v@D1W)gDJ>DD`s{+nsyl=2;uH^F0Mbt!v2f;ml| zVeqZ^SmV+hOHgsPes(0vjYzXA*3*dVA;SFz-3_3(9w0rg9y|RUu~!VUz^=wcK(56H zCAb-FauSou9m*Rv1*%fqWEutr&m@7cq78QV*aU&mCs}0T3NV39hCx_+qY;&uH?r7D z2N+ABj6Dko<^=}7n>t6_iE3|Z5m}79aEJ(^XwMX<0M8RpDNv=znEjSHsI|)}9*)i| zq_IT+V4eS&a5@6fY;Ub%#D0{Ahlo?o`Hq%2J)ajYz$M$uK03dmQ(+!rRP?>By)&1%2hH z#^(4Y)RSHXN5%9sQ|tVTH*=AizgcHHOhA7hctq4h( zxr0h?3kqW4cA_LC;DUn;;Vw8aQ%e{>#B*gkU;J{`5L2nr0S51G8Q%3OQ9knf6WDKx8@@2d&bCc{MPG z_XN)cuGw0Lsr$iAK{hm=&!6j1DILd#40E+cqcVCiqioIv z9}%|D5>XlfN&Yps8;j{tF-2qNnz#|1i7Fj*G(MWE-bcUL6!Jge_u~zmQwOZ`` zjg$hTCBT;N8DKo4*L`avh&4>%A16ez%#Eej{LUXW1 zP;pYPVN&eXBsED8EE_>Z{d#2&NqvX&tjI?A5vn5?!1%qxM);&TGx=s_LHn#pU-y4r z*Y-riU>5N}!$6HB4KAMT!aoov7qhSde;?1WG{4n4BGx_mkafLKj*JpTh7%r zu2=oCuJPT$zqqkp%e4LqaLiAE<1z*v?8mg&_=jhqsPF{{egEN=T<~Q_(Z^qsPjW+< zSN1K~mv-&3xJbpa2duLl_EL;$0CVLZ%+DIYFJMQ<5~6w?R3Kt$P&DSn8>sb2>Dcu? zD8qd5E}N0DNlJA%L`XV*efJo^=tD`+=K$*Pmq{{wtE8Bpgy61^ISpl7+r%graK250 zRbDswyKt|YePuPtks=>-sc4O>8YJ*Rk2|JlhKDZS;P|F$Z8Suqqygb|QLKd9p#{Gg zQ56DPB`y9IxdH8J&B>^n8Gn`n=%TEj^evAt+2LRwou8(WobNA{-OK|;MZtsCiO-HV= z>x1XBjlDlf{Jimau6t;+`&hR7*hcqore1*8k6y}lk3cr><(j(9h8vB?ANjb!6Pp7U zvI7@Bl{W^aV4%CvY)v0{B-Ss`l1@OJ<_1m*?r@qig>o3}3;NX)SUQ5qNlZ>*vV;lx zI1FEEW&y5O<9*n9QJaUmt)p0X1``SmB9{`Y{teCz>2@1JgYL?jhgE##k-V?6vMsl_ zEAPhNzES$UU)%lA3-9?>uDR{bsrOF3<7WfXSU7%ghdK#Ah8v;>%&GBb2xbbB$91+I zPsjN+7Ji}`kx;}>1IXj^xOyg)QotUcfJ>PqOIMDKf%$|Xo~u{OhTX1(g!1JkLMov_ zPOAb!^)^CGJ>4E7_0JJElco!VW{J_8|}0d}OOqI6eLIW&CiC|5Cl%T7I7 zX7m)PRhU#`f?qws7rf@z6ZB04yJAl_Lv|NcgdGuowGMmNV}eq_XkgHy@=aZaFF5g_ zpbH1=#)(mBe=SSSXSEgkG!{NAG4Jkb>>GkgdvZpVrlfQ&s;g<4UF|=MAYa1dG$!XU zc^MP(_r8j`2}~|yGL4Cd$qXhjOe9QXOh^%=T{4faq}hE3bGEQ72;;~86AAiM;iURk z(1eHo+6WLEzLem3gL~!IT-UF-#xJ&f;;*P z?r`46xpuC#Z}P2K{2R~g4sGr}nuR}p{1ea5`SIVm&hUI|9{g;4>q9r^I>+Z($;+;% z_KZuEpX!naF7LX?FbIC7C6XS;2>*(gDikM z%_F?=0z4>g;|})S--#cH~NhcVp&$Raf4N82|*6sibTbPNtf&H8>gS zlCS5X;ll7CwMAiR3&J_Xl72 zcA7yKBRjFmZ-sQ#h!{P^1F0Q)q-QY%5$65s_n6RT- zI`1z1#C>-)+Y(xv$h+KdWvhnswXa>>^tNU3??h(Lz~-LgS@`pw_?@fS+nwhi0Ze@( K5Ac=5%YOmJe0323 diff --git a/Backend/venv/lib/python3.12/site-packages/pydantic/__pycache__/functional_validators.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/pydantic/__pycache__/functional_validators.cpython-312.pyc index 2b5d710ab5c789a9e1e24ab38df6f5d4cc486bb6..4c377cea22bcaa02ddd56ecb40bb3f4d93b064a2 100644 GIT binary patch delta 9986 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 ZoSQBLvvQTCQ3e3;Rc*a31B|A}{{bnPjn)7F literal 34748 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 diff --git a/Backend/venv/lib/python3.12/site-packages/pydantic/__pycache__/generics.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/pydantic/__pycache__/generics.cpython-312.pyc index 6376508ca8e4bd83f6a56d27b62f5ec0feb40a41..e4f759a01581c988c51374f90abca4d6d5bd0553 100644 GIT binary patch delta 41 ucmaFE^oEJ|G%qg~0}z-x8)x=!1IyY$m`1}^prvKA)ovLj>~+Sjod|?Ksf;F2?}Ze diff --git a/Backend/venv/lib/python3.12/site-packages/pydantic/__pycache__/json.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/pydantic/__pycache__/json.cpython-312.pyc index 281b2fd738c01610cedd605815289c3d9667c52d..779a9125c9a55ef341529c8c14a590dac2210fc3 100644 GIT binary patch delta 41 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 ILGkVUA3q4ZvH$=8 diff --git a/Backend/venv/lib/python3.12/site-packages/pydantic/__pycache__/mypy.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/pydantic/__pycache__/mypy.cpython-312.pyc index f1018bda3393ed2e30360d44e4101d96ae2387a8..1d30292541757f48a8fd666bc8e5f51f4dc57fc5 100644 GIT binary patch delta 21803 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 delta 25113 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 diff --git a/Backend/venv/lib/python3.12/site-packages/pydantic/__pycache__/networks.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/pydantic/__pycache__/networks.cpython-312.pyc index 3d276b570d96f36842338b1c68fc6032c277c842..cdab3004fb92d47ac359dad0b0de66314c6f6167 100644 GIT binary patch delta 6879 zcmb_geQ;CPmA~)l`^%CnTe2kE$lnNK8;l{wm=9wUZ~(&sA&Gz$!tdD@=)+veB=#h= zNy!u%SPVB!fB@yQg@rV?GTZG=Co6(?$gqE8&v}xJ z4NNjSQ~hyt-nqYb?z#8=&bjx#k^PDf4{+8$m`r*Czxl26f=kyE@&!9=%jbWfI5M+( zP!rbrv|*i37uNgqVS~>QHu{WVlh4EvffH1roUqwv4qJQ{`B@#ZhI4(nVVlnu&hzDk z^L_cUT@$j09X?06z*hjzT0s|bhFv~a*zI$N3w?#MO&=->7yF83-4L1)_V_#;83eE~ zR1z-rm2yNhQzLY$2$coO1e32^$Pp_9b2CI9;RQvYteXgybDXbIRPF4*@l5~mWF--- z`-qS$x^}`SAO2lYq%Bu64L+}!=Np`*BcemhMLKmqv8)PEdT+QxNtH z#&Lz8hM7GDQ_#&l;-f}x&y{;|!Z2LtxT|jTF^Fz59o0^8f}p}IXbPro3Z_UXeoVM? zrXXero^Dfquapvvjz}2j))!B*6ggx&8 z27;b_juUDg@zXF3Q~Lljb^P;nL|7u!?Nj;|028#ZEKdk?GMzL=^z!=7h4rn^2I*^* zZS%m^Ai8(b^!TRAY^c5_895)23nt%Q1h#ENcmj-#lg4HlxDaejleWdeQehEus%FPSzyw|<4cb=8X2)$JWC zB}Gf5->a02Yx_d+;HqdW{xl6qw)Oo&AQBIDw)Vy1(eMgNqf}C0i=i`0MSrZbM+^tN zyrgT1M56IPTofeTrv6^BB@_(A{*1KsDkP1+D=3D9n56Pkv6o6te~cBWpJ6{#H`%NJ zkqjMT{P`%|g>QOoETJw|X;#JKz09RK!QRtUux~YXF2d~E9$SuJg0UI;d9Rrk!@Gg2 z+{kaVzu@?e0rtLrGdIBOhWU=pOv1=BuLTL2#@+o_w!N}~oiv+otN zWltd1Lu&y_>p)1VcwcWwq;t?P7ezgadF-I^HT4QmV_R6IX1G6w&GQ zccF#Abf~Eq@1qe(5sbvWMmCUJy9HfKX1_m>o~U3n67&1zz8>iWkaQ7<%Yz{j~1|!SM8Qn@ZuW;$jk{OL;{4J zdUdf*(Lu4w4YaZ^UY(cQo8jgbpkOexZM&Cee|NChDYf#oydE*uN$mKIAwPF8^rG_C!~ALfienDFs^Z$1L!|%SsLTk*-8B zY%ElqRFx=dk&SHcAyGX8S_5R{FNbDx?5ij3?B4>mkrjtqIn#V-@Tw^GOU>*j!%I|> zqB9g@At;=!sVL>m$}0Ng0Q9kknmK z8VrMs!`pAK+Ny(K@b~%~C{!0)PBFX8@jbj?G`OJIp#RA zI85xpvO_x$f-xWuoFmlLU)0PDM7%1GW3bC!>5W_qS3_vj$`IG>)bg1otdK# zsDw-w=x>;Qco+NUH;Y;2$$a)dZ`#=Bm$Yp2NjI~dL|w-Yoz$_@Cj%9b4yKq$gFwZB zKpcuGkRhFJ;E!%Wv6Zk5rz(`&Kxd~H+4Jb%f;Mfk=?)03dhic8t4Nd~GGQdT8Mm~a z+h*68c~R25XxwN%y!OD_+eXKju{>!kzillXv(_c8b=MT5)`oX>jV)M{T(D+zK}W)} zZoG8fc*Tkdjnb4ep(pOjF;`R4)immAo-k{1f6(gE^|=$1EBjLtw)D7$Tf=tNyS0>m zk=sb(3ik5p*=wl0nmk2XrgJu(_>#jvxkS^F_Q5hgv;r^_|9#rA;Wm!52E0MO8uEw3 zXExq4c*kv?gwgY*Yv!e*QP&d(R_|{cuK2`eAC4b;del~yFqX-zpSGXk^2+;Z)6wN_ z<(p8V+1y$7K~VTp%8fwqjsf1&e4kq)^PM&VJX?-Ih0}l^(ioU#og4-bTsD1)5f;f2 zj_2Cn@E-9FyN@kD7XRtM@quHZOC<^O?1Xl9y0}11kW&aN0p`&lp>k1B(wER;K!K$~ zQtpUGLo|lZyFtKvKZd^n^JMRy7d?}8#e)cbN{ul-w#Min;7~MO8AAI| zm5YsBcDCZOl>~>l~YTc2j$fO8>dll~TcfN=3cKh~9i-ccT3ZOX-R==zj0ifH>PzbweB+o*Xj~l_bu)6akCo~sMXO+2ekWe zB9zp8^m1j9%#{6Lcx;Voy;%IS3932quP>j^0bPYW_n(~|RS_O)~po`=WF`o|?9J&efLQ9Lg3+OR>+xf=Nt zgK0rg{3iz-!r8~Y-VNvHCStV>wcmyFv&f|i*y^)$+ccSsg#S!NqL$7`&@$PFwp=+Q zIaR4_gL8taG~H_nCL>qMKEC4R+Stbz&noE82s?4LZBT`gFci4)$r(Xk18v&O(H?;2tEez~kt4b5r#=}^N2ehmHCwqLmd&tk|=0|3`h z@tx)N|6Oe-X*R9oM$#VwzK>+Skvc;c1V>L`^jJ{8mp#6bQoL*#BKX>L1~oszplpH6 ze3$r6{`~eGcgYLr^qd?Eh{y4#`kZSzf373?0e^1bHN|7t_Ib2eN#E4{B+w!b`#oCtkHU2d#I#zC4MNRD7yY()-flBEc zWk)m)M}(k|J|e`~SMQeVF!v-bOkZH`_dE;njwGpi12i6^&ww7os)+{;{G|_6=ubW( zAHq3uK!Jy&eBMa>y}8^|>BF3)?1)Ch%*k%ROvT#ufjCsO$QC&IZOi7ne3ryR1!+eVkOviFzx{|QMaz&T(NoOl3`~o8p(XAlW)^hUL~1&t?cca4!>l{e&$;%#shG*52U{~xv)1k ziXs$+D9TY(pr}Mqg<>WOJe<&K6!?`TeHoMIa|T=XLEfMTjkx{FwNNHBMMlw&Q2YxD zc@>v}CK>$xZipm~*Mx`a>3wZ;I4bmo#3l4U018V@Vt)^-4qF$;No4h>r2Y$1`bVPs zjC75WuFputpUB!#Vq5zess9sMmL$tQCEia-!>42>vwY|r%ro#qnp7>}bH+GFl5Xaf!rMaW9nE4??s&pX$_i)7G z99L?xNF^dQh}0rdZ{dfGDZ2`g#>xI}IuecTgSVVdCGwt1>Q`f*X@D_5?di)9nY7k(5@EZ>^g)qAUKcOrjx(m(;i ztD(yrV$2`jc)a#T)eUFjZvYa#6yoO79Sq_nzb{PzP~uJy(S)2=?vo ZX5?3LjyoGTV)mTTj^=px8sshi{{Vr5;K~31 literal 50227 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 diff --git a/Backend/venv/lib/python3.12/site-packages/pydantic/__pycache__/parse.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/pydantic/__pycache__/parse.cpython-312.pyc index 23a6c33a83cf1b0fb4ad079c5e17117bf2b69b1b..a0ce78436f040c8318263b0f58498a1e672e86d0 100644 GIT binary patch delta 41 ucmaFH^o)u3G%qg~0}z-x8)x=x1OtB5ibfPt7g2Aq(KLvWfbkkxX##ux4F zUS`*Ttx9&QM52wVg64r#Axa+d(1^CGg7VNl<*`yxoF{C#kvOL*#;su~G|n%i6nB-65* zz*HRM=2uL^@$0n($Fvsfj%EG>R(ov3v&bwVE>SU^iwy0K9(Q1-c)IRe#IS?d^R8*x z1ggQzv5W4qW72n{PbPVN5W)}sL+?i49)5jqxThZ?*=5RRl>IV~ei1W!D?xuI?4`dK z#9F6WzJ?YtOFGStsn5*6DQMl-&{eDzUqWg>>0r@}>uk#lo^i=iOtowc(JYDzTSQSNCr^RRumnoJMT%o(9)2RoLRgD*vu1MeEIK7gX>dfi-_si>^ zWiRSFDbPP9PQ@pgw>L}0_T%h+; zg(;|RkmWnpSpuF5pq$Jw)NqSz6`b7AB_Xjlz5^cBfd;Cl#w$BF^t3-G8s zpb!Q;%A*1trVF`AY|&rkUU@=ch9KTt@t0iZgqmQ%Sz!aQ?$qpMAl6k*XjlI5Q%M5y z)O}KK2GSLSICbZeSKGc|D8VAZ69v`6>Nn8}RwKp`zVmT@2Y!x~{?StskF zHke$w&Vx+V_2(K*+iF;jZ<#?l)Wc%kvP~~Y8jj=ohF^Cb!sQazb?XgX->yawbNwZY zgc4y1A|~TdAuqCz)s8c+>pu@SVub#o7>~cjjNTdg=VJMY(#k3ybholYo7wSJcKnaa zo0D^`$+^GmZB4$oIeEUt{<7!qW-otkEVhiLmf>zRmp?NuZ%CI}KHWXf%BLY89Ln?n zZS+jwU(yeIRGufvvB4ltEPt6eflzfFOT|@H;>uo4`72H99N*T3a6Y(mt*>T1%Rk31 z!Ug503QQvlFqDC{BAh?WnDv@}jC6&U6!;EYRwGp+~DKoo>Cz67Mm zHgyK9JS4Zm_;zBe8J$>7GLk&Q@Hn~TsXg?ck=^u0?`x?t%!&i3^kJ{MHVkweU;2yzy@$iiKNV?SiUQk+evir=vH|E z{`z-q?RsKs&%Ujld$$I5Z}soIU(6>u+Hq7EYm2}n)Lm*PfF*&YfTdBf+?Ii5P@mGy z0_$L_wsXMps65av0P94h{&p9z?)@-@hwed{fd?gK{B|fByMq6f#4&{^->0MYlJoS_ zzQOq#Sa>Ib#uUhp8hXto7C-3#5ebG8dYxTM;uto8M#B1#QFr+N#jvrN5GhS}^cUA; z7#GhnaldR3uGv7;bpy^gyb$6^iz&KZ<44OoO}I5^=?|qN?BXxm)-lp#pHK|XW6+Lb zjK4tp@1e23Bl#;da1Z#vm#FV6H2ifmu^BDijTXNYdhb;Q_3L!+wG+Rt{-XNM1zd5$CZ>m*3@+|@z H-_?Hs#*RM1 delta 3596 zcmZ`+U2GiH6~41O`~Pcucm1>WdK?qX#*U3Kkdl~Sli(1Vm=sI`6NTBy%yqmlKg*rj z1iMw2htN`?N^M6KrRoE3fWkwi2&rn-hpI1?s!D57WHTxXNJXesA2u~D6)IBCxwA1C z(OJ)#bI(2ZoO93p?zz`ncfWjp_K%rNlECxy(82oa13%6VwB`juULiV>i7x0NLoh>f zSU^5(h^8ouW<-wgwrE7nm>e_Xa@|y_`^^D)Kp-^6W??|e7&M3EGFM0gKP-<3Bt&Rl z&(Ja*Sq;6Fy%xer5RjfAdhROG^R)2Hd?5QWy%r8y*SbP^)JpHwJbp`E9@Tqf3EZUg z-fNH(eB?3ipbs1rXg^KRu|bg1(YK1%B3yyU`_@ay~et6MZ_hTohMOj_*W2fpaWvb!FR@NKztjel_-*aYNS1q@$ zJz?o|wQf-z?LJP8RliSHT~#ww$5C9STF$D?%)eoze3*Al=qZK#KEWvnaUPi-2mpI=2y#c5Ej4lHxD zV6Fk}rbgIFL;Dp%i7WtkLhAyU>Qf%GZTB<=aGG{wU9N`xxT1J}DoL?7$qpLv=A#jUAsC3-cnkKbe6;rq`DRrOowcR<^B-PTTV@=1kO$ntEuA_6|j_K(c$iJ4Q z4cD3B>)}kBy7&FCBvh}z9==Zy#=H;3&qX!@$+!{e7joXGk%OcAAsj!UD8U*ljtFh= z`T`pTh8^%;i%P=X-tVHPQano8BLF=#Ju0w;Ezql;ysHq^ig! zLC$ah`v#JOK)w>?ecnHk72#nol^Pc+-b`vEbp({&6xbYmyth-c!js;|sr}HGft`3i zTES4O0_($1h|PK5OV0~Wd%sW52$kzQX;C)vZg8pLd{Ms78H*DypNX*1Fc+g#bJ|($pbw@HO1g%R~>V_e$sh6pwN{qTqW=WW2$zGMd zz&gSk(OsL8pa3;ZhzpFU?$@bEb*JmMg>EIuf~}!SwFgy)^5RgFoaRN2@@eVh*LndH z|7QfoP9efI+6{Kk6nWr$LPq^rYP8m+i&U!VbL-TPi^93<74pR7A|IBQf(qf7#kpIx@ylV-!9SUsr@r-IVx9%{F$jN&I%3sAvp zYfx>Xib9`Llxnbh{fG^-WI=@qgVo(KScAq!9^mLz3z?_~E$5s!Unnn5Z0083h;HU) zwsMCzbBBLLw~n6MJbG?B-Fq_}dLa36vhafgHzT2Z@t-7=pZV)x<<O_Xxd_WE;{Jh>tTqU z^2(+CExyjUNWo%r4p+QuVi*0lVniTpq%PXFaZ7@z@I{ma*tmqoI6yeZQNlS670w}E zHYRXL3#@dnGv_BP2ytRcn!o~vUsy<+OO0Octp_j+ghtF8NxeE`XWNKPPm1W6Rh zQ%Gt^G$4Mad+=)1FaU=_fITd<3&8;_p(+x5oiXV7&x_<{C>4o!hREo6TP$yvN894S z_TWfcEPaqHd-;J>{GKJ@6B3Usd*cIht(yfBFLsjTp8G)+{|?S>-*(6LzKQMq2e!v< z-=3P?9=&aQ;W#vJj+7JmPL%ZB)rlb&C#Ato0=Xn|Ddf_mG}*}@mnHrCIyvO>WLWC- zAlC~)b^4Gikn(7!SWY~Z@07^x2Ri*I93X=uok8S=NdM7J8M$E`!W~ygwr6J)WdAxG ziOhVO6(Uk_HN(lnEiwTWFSv{@SI61fPX@}R>^?hTgTMiFUHe&Nb7hJGX@SZsr&;03Mq zS$rPOl%_$CvhPA0k>mUjNGB`^!h2-$BXZZrWb_7Ec$X}EL?&;LLmy#t_6C{yFr0s1 zoO@q<;AWCU2j3{RA6#jlwc3mJpCgUGh)eCt>{exAv$F7xxU>@{(dUHs#HA004sH$2 zZw}43#r_YH120U*J}i{m!!z#`?rf8uPom!z1nEbKpB-wC-@RGBr@grHZ-OEo@c#ga Co3wZU diff --git a/Backend/venv/lib/python3.12/site-packages/pydantic/__pycache__/schema.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/pydantic/__pycache__/schema.cpython-312.pyc index 87ee2f05d41e1387b77bff69ef7b6d9926e0ae2d..350505bcec80d836f9768522a2885c6b9e719368 100644 GIT binary patch delta 41 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%0AH9oAr}5VcTd*#ZN2L2a0686S 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 delta 35540 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 literal 5454 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 diff --git a/Backend/venv/lib/python3.12/site-packages/pydantic/__pycache__/validators.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/pydantic/__pycache__/validators.cpython-312.pyc index a2c3d52b8612c9729881bc1dac29590d05b84daf..3cb44f61c9146ba5f5705d9f6d0ed7ecbcb83376 100644 GIT binary patch delta 41 ucmeys^nr=@G%qg~0}z-x8)r`3$Q#HgbeBQ%A)ovLj>~+Sjod|?Ksf;Gm1Iya$Q#Hg^prvKA)ovLj>~+Sjod|?Ksf;G%?fw` diff --git a/Backend/venv/lib/python3.12/site-packages/pydantic/__pycache__/version.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/pydantic/__pycache__/version.cpython-312.pyc index cbd912eae12086567787ccf0701135a96d989c66..79d7747de2948661ec467be4639b11b78468adaa 100644 GIT binary patch delta 1424 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 G?0*5K*WK&@ diff --git a/Backend/venv/lib/python3.12/site-packages/pydantic/__pycache__/warnings.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/pydantic/__pycache__/warnings.cpython-312.pyc index dfa213cd366bb3f4161670e3cf24b6f7da1fcc39..26a327bc0db84ba265d608c194dc3c7a8bf57620 100644 GIT binary patch delta 695 zcmZ8eL2DCH5Pq{s-exzujX~Skjnz$1%vO<5DR?NNR8cRvco6jv>Y7SrP35hEB1lB> z9tONB-iimo^x#hr1Wz6`BJ|=xLGYlLo_yb1N}_xCcKBxIoB8H#o_HQiz4v`r=x=fP z_}WK%FtyiO6@%v0vim9rT8Jy9`(EU8kIs|DKPkwyMgb3;fPYwz$Q~xSvljXMrtqZ! z9pwRh4Urt>({8e=CTM;w`&8kU-K5#!W&0^nnYW4$niC~xFQDC0yAdOmS{lMo&G2KV zMRneEII5z?&BPrP?$I!k>(_2}<2%_FCD1_a+mw|Z^`#+b7dmu L#koI1|BT9C1m=6v literal 7220 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 diff --git a/Backend/venv/lib/python3.12/site-packages/pydantic/_internal/__pycache__/__init__.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/pydantic/_internal/__pycache__/__init__.cpython-312.pyc index 30045315733d634c5271fe445ea8a382fd7ceda7..0cb9b4347ed40e65e595c36813282cec8b7b7069 100644 GIT binary patch delta 19 ZcmX@fc#@I(G%qg~0}z-x8&Blk2LLb21e5>( delta 19 ZcmX@fc#@I(G%qg~0}#YX=}zR{2LLbJ1dadz diff --git a/Backend/venv/lib/python3.12/site-packages/pydantic/_internal/__pycache__/_config.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/pydantic/_internal/__pycache__/_config.cpython-312.pyc index 15eae41872e2ee453807724435bb086275ac2232..46fb790271d56c41201a3264eff00bf6d2f15c83 100644 GIT binary patch delta 5230 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 diff --git a/Backend/venv/lib/python3.12/site-packages/pydantic/_internal/__pycache__/_core_metadata.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/pydantic/_internal/__pycache__/_core_metadata.cpython-312.pyc index 04a4196adb5e3b57c4e0b6b31f8fa089d93da5bf..9937f4baeed4ce6cd0d2c02ecdc40fd0ae2341f9 100644 GIT binary patch literal 3912 zcmai1-ER}w6~FW8k2rA>0}ceT0|A0rV)M~uw<$v8gOH^(v;_)liiU~jCY~^!N$-pa zjvOglQ7J3Y0B51KyjZn_TH8kd8cHt7{RJt^GCsMhKxse`-{1xhUiO?H-2iuCO*otx#?$s|{ zzgU>U>X4SPuS?@5k+P<)YQ}_QXR(y4ib^VMOXj${Xt{5Y42LBc{kBcCvAm6~K6g&n zrV6TJ*jh%OwB+&X3t4^AIn8o)oV{>ZFi~uHjcHBSYdYOqxw@pfF3G$Jr*GiGv`JK{rr0%tVn{u;m7eNt zy*tiy>hL008@lb9v$f&NI~#0L50Scg)|$plQN(*-&y=mYuLH=S(%PQ$8ZgKguh5btfRps+oc1s4UknYRU5F zXqCp{nvu$yIh>j>Zl#8>b;CBNQX{5~_1*!~ya9oe8c;Gfu%V`IV&i5?*Tzy)1v_gR z$C5{mrofN5cM1fQ32ecJ7bq!NGi*%2zbQEb5i0v}mz*k)5Ioc+ZNOOFKz@Q=vZ4^I zw4$BwF7e09`}>#p{z?!fzq!P}x3a7E8Q)8``KN{fV}cEk)Ei?e34(P@d5B5_dQ|Q< z4~a)q11f);e*jW+qyq&Z5p-hfaWtYBs*cIbKL>C|$y<0Ma>gmnCC#Wu0DVJAvs^fV zi=^w|zUzmiX)I+FqsNvM%YqP>a`{YFQpU`@EortTWlS&;#C;Wa7qg%tqk}9}1y5Ba z+l0q}85Mx)v}R`;-NQ5_MWUDY(v4(}O=1v->nZdJ7DP5Y#Kq0DQUDFa%ui(L9eiJT zAONEVWDmocYR+`+BLL+PVpe|+%mOMhMI^f$loXjs*xNi*<^j!*FlN~zJJ(`U9q#ar zUSw3pO<~9m_({Kx{g(5!|ClMD1V8Eo{oqbCGm{c88n5wi}O5ShF<4vK1qP9iGZMA(~516JnAC=kONR z#~snL64?c3E&BS9i%6U*0yJudX3O%-&IaL>^mlvd!BHS{s2txl&)6MaLJB(#1=qoj+J= zzg&u3u5hURkc*H^)$*Vnp_=a=!32DVCf((Y7Tkr# zVc-YmagesI0GUITFxt|waN_=n=dtc5vF?x0F2z!{I5>LpPsvi`)cnxhb03{s-0>u` z_v2g3(d~-|J{fuzO*9UOax^|4bpv7)Zn&S`kTz-w))5J|^TcrDJrN|Wbc^O;(oRVX zh!c`!OE+z(5Tu9BgHyzu!o)6k2G~jk-E2&Qp6u|+USO;PKyE`e=OLR%P}{D#_gDFV zaD}O~BeCUQY)I%><$!xhIZp{a50xykzO``TFss+9dQo+{VB-zt(`ngQBc0Z2RMZMk z1|H`Q3Jz)$KrplVcVGY@{D*JZH2@WPyOs#oC8Sz1Q<)+Ufy=H>NbABL-C`_gf+rwJ z);PAvJ>>j0byg?}le89Y8h(--LU+Zxfefdi40{dI;1A(8v*K)^7?@-3go@e5Uh6zJ7A4^ed>C3r%=F9=Qb1imj2i2_LoWDn)LDWS3D zrDy^AjhqFMdx$R4R7z;UCn-t}Q$nHWFgG0LrbP=1WM_AHDLOVrZBUB_x0xdEfY>1X zTfYPXXxxT^9i>3`!?UG#&-`u6vqPiHE%DNhq0;F~rJ*aOD<70P(n~E@OTnxEh<28{ z4nFNV{MlGJaq4Me_|F67!=q&>`6?u|igP0XfjtNR(Dl2nrQJuKM+bkkWwC9s|IzpU zcIW&l_6TY6IyRiDnzmQdE^^t`^Eso6UrwWAVikbd?8^XrW!@cpmZv zbd`jIC1@?{u(TWz&<5Gom3G>^iHvVS$6?XWC8zn~2j4v{500E3{Pz2!XPoWT21Bkk z^&lf#S%qNL%}#{&0$#;+zg}F2d-;WWh-^$eYrzvR91I&$;+hF8-Qj1@W~A|^LDwr=VkMDX3I+ZH!1@BRz%cwim3!B8$|mKS3;BvqpkZYO_YnE`0ffl PP-#J8=v5RrH`V#rk literal 4621 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 AS^xk5 diff --git a/Backend/venv/lib/python3.12/site-packages/pydantic/_internal/__pycache__/_core_utils.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/pydantic/_internal/__pycache__/_core_utils.cpython-312.pyc index f4fc37fb59cf6cc3e4c2ca7ab7ece632ff2ea1cb..5f208af7e53ba1b5404c4de8be78b5ed931cb6ce 100644 GIT binary patch literal 27174 zcmdUY3v?UTdFBi-c#r@I@ckyiH!1NUih5XYQKTqQ56Tj0Iijq<5C@b%fdoAOC6Og# zZq}_q+pX!kspykrO*d&oHR*=lWH;(=PuEGhUGMHWJ%AvG(5$kR+w|;ax4VZn-8feF z_5F8d01yNvJ8iOOVe8J!o%@=5|NFo0|Ns0C85!vue%m|SJ#V`>?yu-U`x%rQe)X)L z<8E*wC-PoygdgB}y4QJi13FywUj2wLAh0~aYZx&O7)MM4rV;aic_eKhZ6tjleZ(?g zVebuI>qy2x#z^KsCVMvG**0Kj_a<-FNcKSXNX|gcNbW%HNZvpm^37tJH-DsHpn%<{ zdkaU328wvjo$k&Y-lh#Sensw%_>*>r+$XgA_!YUk<4@Y%kWhr%f%1Qd9)|R+tqRuG zL9K`Q6(cwlf70%d+oj#dugL9=KWTUBXlqyx#aeFs>aH2mu`$$M=0wZa_<=fHt+>|X znt^MBm^siW+6FeIaiV=-Gt#VqrZi6bPplEMUl0bGW6!l>4xU?L&vjxho?Bzj^3NmsE+EJEHku~{s}b-Rvpr->!s~Nd# z)hWJ8EWM;l{YL%Tog3A3?|e+nCv@BqPAq$Y6U)D;Q^&Cjz2(&UH;4L&eT6K=059^WW!UVs4EMD zE`Oj=C#QG%BzNE7W%r0nwhZFl>1PjUI`^u}>k(Z6w=*$ckTa;M4zI`MryDtq(j((8 zNtDf(+ySRcy5yJB>CPv4E_p_OO6!E?3{J^CCgH~J@jEZMN8OTV(1{*g{`~?JdSBV*$Mx2QhbFb>zC*X8%C8TJ5r1wi1lm7M)RKHS5Mq4Ci{nw;iq zl56Z?X6(^56mUxqZL#Nz?jd}v(sO2De9Y@^zUq=ZY_9ZvcR&`r9)Cbi8&tjX*{Texz>ja{I08U?J-=Frn;YB|5HM}#I0Rnh z`?y=WURj_?yT!|e&dyV34mI^+TPN( zwbkzlxSPjNz;(&(#|vfpTAkV)wJLx$9`JbmEn^dMCIBM=)T9OsVIThabCJw&D@M+m zJy$oo|8C{3kY!g$*tLp$?lVpW*T+efs3uiYQj0|SRH+`fa_-t8I2klboAIiXN+u7a zYA>Q@zfod-{($dwP2hpV5|wEzG)smSLb8Fgve# z0+%tX*i!25m0B>Ko|GfrAF}KZ3H$$^Bd&6u=;`Z6ay$k`%Eu7f-iBeHN*H>&w(4aELY4y|;eax973-oP$C>btZGab$dxHzaHpdjF zQHkrkU&mu>OzQ$Dsr=$^B}+i%VmOr1>Wmtuc%`1mPwNBJ3;SV%=|ufE)pn+ZDM8Af z5=6!ksQu`sb;vQ$HdJ%;Yg*8WM$r^&!4ODOo93o;0mf<3vqo8@@+rfY!Q)KnhOJt; z_!V!`0ygb=N~ewf%iLED)5g)-G%jJ}Ix$_eOzBX^`qlUsnAG-7k8bM{H*KEMcX1b< z=D6v!gfXWDvbFwWW6qjNLu;7{BTGvdnSMHbv^tQd)f&#%?&8;}gz{^?Fd_e|XlKei zOw*k7n@ZPuFEyq`l9b@Ctn9uKa_=X&Vk{e9J=p_du9~jKwxa9X-Wy5ky?oo`Ab#d*odo*5H zCDRT@n*9#KGrsYFgJ>JIh0kH_x*aYIcNF&lw}VmX7S`A;PA+pgV;`mw{SkM-MfBY1 z?3IlQlOPKU+u(Gft8uT}>72Cf?e#h0&-)+pEf4wKveoH)ZrtS^b&XJ=Y^6{OJ7HI_|aSzLjDB&U1)o>70mg*lNj z>5bXxRJxOO9#Kv^e0|V8M$}){qe&@;ir7Hn$Golyr_1l81(l7U{Gf}nFzoY;Hdy^_B%8HwmCa}iJk^k2*5gh#X^$4PN6@1F z6vAdDhD>WjI*lUO#GL;spmc`&$jW6F&Kn{b<##gb7iwp^e^TDEIDWT$`zue(9e(A& z?UQ%*o_hDpOxOK_^7-*l-Qjlvk%AK;A@`oCAevRV&=Ahrd?#!B;?)PKBzsEp>eN z;_dwJ3@<$s$~iP^UJ>+ZCwS`a>cSU7yNPsgGa#$6jZVLM;CT4 zp8l4!RQJuvMQ7_4AJ^ID65D9G~zRJC8*Q zj=ywtMNgRz{e&`qke1a|$Ngzte%As0pYG?8u3;jGFJ^SD4mZTu4aX=OGSr{Qi#iSK z_Hm8+NzV~?Ack?kzmBj61(P^DLk>^CaT%z>H|kb)DZ?u6>!8ej$MCp6pr9tgN?>gV ziOZvne$6LcA)Exv5%5kZHDx`(uNO?C9?%6ohW97(QnaB6J|%**Y5emOz6T#?=Byd7 zZlB#gmp3m&EM*~~Y&|y;`}A$7^CJJE?gr=KUebxWARp8X=|uho>q~qhp`YcoN#MCz z9Zf{F!=q%U|>tm%&-k9J%h)|)%)B|*%fmtaJxgY^uqfCymowXQ&z3*;T&TDyVrveW zo7uG9GO}?#%qN1PGFdI1xbI_vo^&3~$)+=mAOLRxhmT96k`uXDSo<}X_evsD-l&(T ze>QyS0`C08200EMRM1RLiVu=Rlz4%PRv`IghKp9!%yj)s5DYCqJchivv!SxqyTXC#~NRobWyilB7n$}P0rGv!YyebUp zE^&jp3mERS5GVMln`gvMBc-HE4CG1)4ftDaMOl0Eu>)Irno6X9K0sbFOPrI z!Zm{6{zjbwR%VT6Hk#OU%EA@*1jKC7Gc=@-Z;9HLEu+}h>LSaIqaA&aCC+x7=;>0W zi9YAa!~Gpy9sM27OyJyYpQI#<~Ivoyo@bfB25+>i8JM&YuxI&7_8 z)Zg9tbm-iL(2mdl$m(1%p-9lO!r=l4w3jT~n!~o{#i6Au5!<1V`B2ni`{Y9#-m*>m z-I|UzAvIo(BPWpua?-2FN%vUfB=mNt#!kKXbiz&|@Xl3ED%6B|$SruI{HAnx11>(E zLk#ds!W3lN^%$#B*DDR-Jr&?XW#MU{z(LfC{Zz8Tul`qL-Qe8Z055V-a`P{61A4JU)In({ zh^3+)R|BpBu0~u9xSGT=(TJ;AEEi3xn zuv)YtFEc4G19>*6U^8*Gi?yN+*DSG4wBwpB){9xV=0Md-D%xBqTuC*X2ZbxCWb>hL zB~@$zl&tx<7DA^+ir6BkDoGJr3{@p5UrQ#68@I?dCrw72c&ynKG%XBKlk#CBZbd`L zQ=Bu#%S>?60IEP6S?atv?(vEmG%|iQ;Bx}`UG|A`e(HQM9)jQP9ZKXqz_Jq(f`m|* zG~^cT%@5I~9~=QNO|)*)a@~<|-H}LLPf&QzT&+-{*Z@(8Fd6%}Z{UV_k?92PBM@UW zh6TJ%`f1Ds1m~@wD1Z|P@-byXyf9NLs4YPV6(HQ|6NGGTN)HAwrW}aZ(?n3PDvW7) zWgEm@X#5%ty|U@DYgB{~@sMwpd8cerXAnr9WFCcPWX9LCpF|fhG!SJV{2V|LInSv! z;e!yX>6iSCf_=!ux z`s_OpH2ox}wt-m6^P%&$+iN&q~j)j>6V^NjzUNIAq6>UBv7Cdlex(=LAig9rd5c%XS2`c&*#2b z{6=xaRueMUJYt|<*9Mw$kW;*(4JHx+9w_ls)h~%{$r$f4&8Oy;AZVz2f^kcEn3fc9 z3^%7n&hSI`56%B1JH`MgO;N5e=o_1mo}$|v4dzf#BQGk%Dct98 zQmOQWw`+mzWxSruOP*r3HetN-pFsks%Gx`ZyPVY&&T3jbyVQN_^Wm($x6l6T^M7>y zUtM^&Ba+n%akhQe_jbR%`?fFA-WyE6XUSujVt=@9|Lw_l+ah%*gWYonz+XgddBKcF zEYauCA+fF-$Zs)CA5H5&qG?UBOi9zq??sz5tx)W5OL_(g3h*G|@N zp!{U*y2(nl>!T>@2M(jj%PYAt@Y=wFd9fyv*BVTZTJl1c%4kLPn-gzLEEX@Fj#TW# zWOx4Xxg9Pte=*T05d}1;|^{kp>rg zE(MCxP~Nm@$~a{b^=vQcai{Dm6C<9I58uLs8n%o-r9Fv_Mf*$YMk4FI?osJA$~DIk zK3jL$HtN2XDAYqzi-|>Y_V^ebtBMH)WII(zJi?LFDMw+;{Umu3Ev26#NfoL4Gv2Jm z!%sFQL)C^w|1+BP-#`M`dSZ9b7AJ}tehJvyildnxKv_uNpg4U>|AY`eI);8We_tv?^soSR`wFiJy_lK=jk3*`zy!ny7 zj*&8SCw*i66lAGWfD>~Scqc12n1Of^9!NwY!E8Me`V}nrqd%xX{h*j3fc9DS8+=xB zLDT;SAIAwsyi|n=W;X(ziBeMojCE4Zqe|ys z0{va+45u(gE<68st}N$o59e=Rx*Eya4-)_P#0NBe3|~IL%`dtLiU0w{s9sf!=7RQ< zFq&d<5~m$1(0qZEnT&5x_|@SQOO+s2Xbf4ZmJ_&&M21XNnCh9rlwoB#!+kv<;UrE$ z!D|*fk1h6-KG>$<1kdGFmzxoFT62wsBNk5~<@{CYJ9tQ9;N}1J2ANI8Hm(H&X(KUc12BNLT(*!>TwMS;11B)!ZtZame;!+0={CMk z`XeOC%d3%cGBDGYbR$xpP^ONSk!UYSd4B1Q;n#*2$|Cu#K}*z3L#`}uxgK>k596dN;uStVM#v}7+{1`3ze#NAkJ13i?4~6 z(wEREjv!iaQIO#)xLd2w$k*tjYIvtjR^0~hA2V7~HfJkM7`2ZBEgR(UyS8o7oTA{# zXh}sfCkZ&e9yS+l!1=^59SKb9q!pZ0;UETmDL)+B#8h^gkSA?|e3I&jC^eoFL}oFY zFmZw+p$x^8B#>wJeYQ5^t!W%A+HgW9O2D9yO#~?R1~2i=`pNe2ELbxoP2qPC#xgw+&aMLiibEHBRoGs&(8V@{Yl*)lE_Fm|cHHJ~SN@R@s^0gW zegA`4sclTeJ-x(#?ZA8X_LVd=htr<22EfEb*j%&$Oc*f|M*Y5y8>Y04NwBF9kR}x> zirQx|v(v(~A;DhE5D?H1`vs_N_QQIsump+IFq(ypmV(Aj8RBb;)f8xpF-7g#m4zW|+oJCmz1#M#>xUJ=PN+0i_gt(V@U7xBLCF`cZ$0(H`iuu47fk}P|uYd=9$15ENa|7^thFh!5mD9bh>*_~CryGDhw?-xo5)3X4>cgpI^H zlbbgH##Dum(fsXE=1pjr+jpRCHk8rbwMoRmT{m?xh3arp|XxN2-qC>V% z#Rm9-7MJ0RU+p|vhW$PbdgKhnfLfi`jV4l)Kv+%8Qat5fG9=f%vedqB>&&g zkQhcLL7p(O@>8^<8qH&Nt7>N&dftfUr6}7^TjS?wA6WWROIJ9nv_-qRLuN;`yynf} zH-E{s5+PHPMEH!R}B_P1ssXMEHqtZq0J;rf}}2NNyAL zu|=W5(X#S4&%SZ?%b!Ch^_y=_yfv|uwe-Z>CAVFX`h(~KM>93i%GThi`Hnl*a%z4H z)VigcvEv`XX8)4+HTE=M@>A|0_Vq?1U%#)7>b}M?M#8>kBhvP@beHzZGLqEWQo2X)WlH`dC3MOsJ$io? zYCI+E1#pZJC;XEQ8xV0aySWfev0nt98b}4bW?8fiJr16*6tM9pism0r*j&6 z7V}zUUXdCF+DJj1x-{*RKf{nfgZA$K6_S>`lKG?Iyjr3t?ZLy*vZ^-+-Wd4uGjVE? zw{-pOigzj_^<5e@v6d`bt8h5Au>U>lR-!2FpM|2N$Dkf-$3ztshM*KqMG<0f4TJ4e zFa`&#WB~?;(F`l5R`etuL=*286U{~3DaM#7`&oB1jq$T1Wf4^3k@c9%SOSbE!Yr(} z>~QH|zCAH5CPA!h!-+#8K*?E@apf9HYXxB;nFP?uN&~ql#!)5rA{)kBl4~S^=VH%( zBRWsyvb3YI zg)I%5eMEO?Pj7hJsnF>&kxhM6sE*l5Jle>IwD+G~_=b6e1|yh_G0QzcZ$I)nGT=3!o9V}0<&P<$Jh4Nknqe@9W(zJ0PRu|`+SIK!X1CK=#pHP<*& zoPgWRNK^r+CG{y< z(sXY)X`U=Ov!IhLNM?q2xX#bTTEqPsvXy`EQgk z)k-7X)l)K|B|pH8e+kJ8+=n{eaExCy8Vv=jcHU6CYBU(~S2G19R+FK4H9H$g1AAPP ztl({aH2>U+p01z2$gU64Dpn16UdcAAFX>7zab+)YUCl*_)oj)pdt@EzkZ0B-NoPqG z?&?^Qi93hIkpEFJYA{UCzGIz(3sbE=fp21F)nru7<00v%adqnt=s@py*Yh}QQHTSa zm%S4Xob$sI8a~c0M`z5ZO?8(hnA@GMDuz^7YDYsNc*d(V?uK`@JE0Boc^s2`IAZfR zk;~*YkJsx!=oNC{hN{Q|)?ZY-AgO~PM+13App_1XcEU+5u=pP>isN=X-*tt2!mr`A z2IBEyIvj0O9?qBJ@U?_ncYKWS<8%caZ~?#QCZ|kwbZ#;BiR@DwXprP^?uX+rd3ib} zeB+KWgie8HIL?rKc!@T&(KN9lUN>gbA^NV3HpV~7;n=DSrD_xg6;+OBhn{6F-`HR3 zCwblQ8KvgQo85igHG-2za&Je`eXIkYk3xI6qyX%_8~g|*qWW?)IoJc7#sg@&@!7SX zKvR$LI!GX5gJRzU$4b>_o!FGPH~Kiar#UWpeHY<1>A*mkr-EZ-JV4Q09Ps20z|)oW zaE3WICICfhV4ziu&2GX1C{qJ2hInf^jpDkDxdMZik;AwYqJMq>D5qKZ4&q*-Xi=m>Cr;%1GHR)}d^{hR8T{ib7Zd(m>g$cq-%Ct_uwPd&z=$0*Dg zg#gzn>r3V}qcF!uJZpM%zpwJD9g`gg1N>|{m~5uLBNd)#zS4!I;$N{%@vvXYh6|?- zhG;seAYj33_DdCo18$tUZ>7b@K)!gYWfG6mMeAB;WYVJMkTWtON-%dn&CO5LG1KLp z6k>#i0|~eqgVeqdUfZk)P7fny&KDO6q1!Q%v$?Zh*R3qc$Lz5!4E* zbD*N_iNEVh=}pUQ>)KRz!dN?NjVNLxf#!*HqUfESCd7}-Q~5(p>AxjtHDeBou^xcs z4T_(LVt-8=3m#tSe#X(0Lp5aEr;(``@0G+2py{3B3#)ReP~wm&j^gV0Pw1`>iL8hD zgKQ!j2vm@*nzJBzwz4i0tgSU??T=A!a*N*s{N@>&P@9kUm*D%D*xGF@l>fV^`g6!o z7HjbA?5_EYJC@pLdBs9TxV+^<&XBQnF8zLf+5B)Mzj00)Ushl>B6y^T)9yF<)%5)y`19c<`%SQ3ggPiYRAnN2_A*49831E};t-}opCb>Npv zRI&}=VAKi+yJ!s_^eDlgOU{Getj~KD+HjZ*#7fEOv0{D=0B7i@@P&VeF-*36Isnwh z^5+D8ucKld{6d8dcPtHn0zl4iB&RWCZH#8x=B%^6pgwBOo@;;EHs6Mm^OtS#)14cf zJuvUO!y;$cH!rq_;i}tq2liRbZ6SN@!eH3GDVmcTJo>;47rcnMVX-4@ZpQVV**0gH z?+n`=3!Cnmo1;muqc(fcyq?~H)^Y8G5^2L9=Xj<{xd2NVG6NPlLW{r4-{67BECM&d z|DhgHc64l6dX;6-$-0&;GC!C|fFGvqC5z?jW77V~=1((wvEqM8lb4I3{1=+OJDFYc zmBHucI)3wNIJ4^$W`*%ZTNXcA!FVaKQ!dBF@k^Bs@INlFKTxgtB(Q1$hH=(0!a4Mv z0W?mY-hf%A>=b#TJQ6>ln@y?iBvp`x&Z!iXlH?&ycLKZ1#%^N@MYxz6Kscb5CL~VY z;-F_{o}18N=8TOv<|TWvZfOpw;u@}(^I}nYhU0<7{Bk@h5whc<2V#TG5B zTZ>{gmJsyLC-qDH=nNVZhLCC3u#S~urvF8c{~Jk6!>EEiPJvyc&WmpB6t8F0ElzIz zG;6rF&QE9|FQRd_3lyL}eaBKB%_)pp9Lts(D6ba!7HjWXwy>bVGYUzKuag$2vSFg3QR<7 ziMP)hQprb&^gjuyCZIMEI&lDp8SOLHW=gM|o-h=xkJJ8XAn{Z*IGOGPQQ{1xiWce< zN>(W$C}Kba`m7)Gjjh9s(%(`EBUV5`eHLXM2_yQI1qY0RS#~($m@W;aClNaE@uW7P zv5#qye;sWlqq=Bz&fJODT7#V*z~8qV1Tp8Xt@c5F$Ziq zu)XGW8~lQEs~241ocieIrbTCX^S-&xc^jzZJ&@bZg%TLL&G9TkfkG`eM+#a(_Llb< zO1%=v*%Y#FVsOAvlO`B2PqNQreCiIEtW6X=;@ZbE8V955FW5!_R!}savTzad6e55S zC6@k_l0hU0|K#<`M#bEjaYfPWfsi%^Zt1w<1o*{jK}{ zcrdc{P)MlwnUHPR@=*hqSw26s;EiOo&vbt**bP}9a7aF?QSyf)8EptiWyu8M4OQ%3 zuILC?bVMpT?`C%0wRDAqOQG&d5u_GGl*uyWeq5Jr*u26a(Hg!I$=Ev6{h+L2xvVu@ z)*2~m`%zZ!Jij#X4*yQ=_s!w$J#hBje)6{~Ls`8u$B?{l%DSIbx}4P-&T3t{`tI(# zS!bEA<;+Pkn$JGP`zh4Q4;t;ACBhGO3rN?5L7>F}G2>UU!4bI#p*#??Xb2}-8wUl! z?n;VQM0SsiN(`Z?FQJh~D@$k_r#hNKY^a#CD@8w4gbGp5gp9v=Edt%a)Wh_suY$yw%RF9S zPNp7LqlF9LBUnwWW%6(BSjk^z^yUU@nJ_w@8~q*hpz+B>N?zIEn@nO%G8WUuIf?9( zQ;j3RaBYK@(m!QO36U2?%Vj>5EWSYxR!-!v5Y9Kv(&B2an`?jUe zy}f6-y(`?_6>0BYEk+~uV<#we zh2u^48}3le_N73id~fj7JzIHn@9`hipIExMsQb3*mgx`E?$n={<3riiAnwuPM%bul zHP0Q2=H}n%eyw|c_d?*k+@=ro$V6*d**6TY8AAE>i@ERFTcR16!K<_9=IifdR6elT zUmc$vN5sLdh^=w)sjzJ;eKktYjod}U>g#6~wnc0Wi-*IuHtn_dt{uJ(1;L4BTXoo0 zz0h&<@LPu$8 zgj9qsZ*hRFqsZ*g^!psoc0)JqepYE&VGR*2hJ9wEUKZ%Hq%urBn|~;{NC-xt^rY@t zk+tqug=1{SoUEzDKz)(}&9&1?mZL2!WIksodEZiUKg+QIpF()fyl+8_nV0v4ghFLO zQ9kyIE$BgHQ8Y4=R+Zl{+D!gI)BqKSB9RoE>=%!sjD>}7MeUR4x;lFMdpezc$9tZ1 zvY2!o{XM-$5<`*qVJ>t&zidJgf_R|Qh+d~n&70y3am2F`czHf3OUNup8h#MfJI--B%A%4uD zAgN}Oxxob`x{*;jO2bGCU|P=OX#RrKL(iqm-RyiUx5?4c(sBVU_TuPCK|@_Ahk0Y7 zKiLE*^OjBpP!8lro7DKrN@gK~S50fo4iXn4(K5tKBQb-Ro=24nO8aY0zT*|uk*(`e zN~ab58)c{j7>dmaO}%1iqJWEnQ&}!8O(Wk81k8%Fm8zgdSW8qy7U&xr56bCIXiN}S z6CsNw+FDXI%F*9jV9`I}i0o%FoovK30((icjU*!_#HLClB}+uunb$hGh$x}-*?w0> zL?Vf@4{E9DETtg?S_F3Vvko$;gpCp$dw>r_B6CXg;tYxmjDD%Om*Gv_Z=ZsGEFG(nmwm2lP3}qwN(2O)wvW2>@aCRN;?&kV79}f`3{pZOIHMs9{U=!$JT&hG zi;9@i`=z}ohyOW$Com>_@p%5nT-9H3X+P$wKh~Le-Nzgy*&M(1$J~*>;7&xi6MxO+ z{FvMPAh#$g*p`K+u+YSAn!`dfyV)ETHpgDU4A0Q=f!>g(3vpRcj#bvhUahYMcFxfJ zfnKOY;j$Gg2hALHQ5+VE=hcXBw=K(0oC!a1Ce-g-?jH&FkA#Gg5A?bm-3)1L@`~p- zFBfkK7jIc=4Hb8Ua}S}{zbqLHafNctK!~f9Yx_c6)q|@2A+F*<>%|b)w4&4V0_+3} z_lCIK6`c+bMy}>Sh;t|p>3V*5)LOQp$Mpg1D-5`Iq)p%U3fkynUrKhqp(qRV#YB?mon> z4-8eS20X7eW$-y4I5>kf*!ho7%uvueOU~SJ#oJ>MW{K@f=a;u14{tvn$~hiRKQUv9 znrw3=%USi|top@*kiBgQ%y>_@y(eVv37d}12p?O|>G}K*IF?>Fav7x&YnfuSJCn9* z%;f7=tDHQaz1pQO<+rUI;<@tb6@#5GV&8)6gZyIljG-9QS53(Is7}u}GK%_t0nC4V A0RR91 delta 4340 zcmZ`6ZA=`;b@q1e_P)3eIN-p1EZ`8I!QhmVRTpg8TE()hII8-q*Ens}N>%%2 zjyoVt=5%jo-n_4w_vX!;pB9>)xbS_a%K4=hpmsAQ{ku$siqjv>H8>4C&!ySdSzl6vt~(y*613eXs1(>hxGL zM*DuPUT;V?Fi7FC2jmB|Mm?U4!`P<;XTL#gfwsT=p%BpD+%nwg0`|$T#D4pArfHyc zo3t%-UoXr)!8AS5M)`)eFl?$j^i^2<5>w9xXGcM)yNfW}=l!v~(v@~K0eN!g43dLy zGs(x`TLa&2_=e#7xDSg-ht1mu zd*yaH2ADmvAa}?Ofa#O-F4-m5%Z+cc6}HW<+$qOj@g)0|{^Z_8SEB1LWK{{q35bS~ zu|!MF80J{QV6eaq;%=A#CH-zRj&Pg(0-p$O6>Y!9 zcXjsw&EQu`87c&Z3f$0_r3AdYw@VrJ_H^}u1QO%_Z_B|#;9!9}h`a5p-X`~JE`+Yz ztF`s^Z@urhX8rbqwmSRDX`lUF-}Rb05I|ebXT|JJ|6ri8f|-p|%B+7kvxD|-`&*b+ z(!2eszr^ef;~F5vQ38Sh9DZ5>=UW(u$S49E2(D5@O%+YjvHufnuJx;?YM7P?u>cMN z+KAm+v)@C`EFQ2YYf`Or_k$pca;LD8#?Qj+F#OFW+o{O}>p$kZ*ZA(63q`)~_H!XG zQx}Sk_MqSQG#ugBKd=lyiLs-@G5b>ZM|p@17No(4F}FIHSWBf(faGZ+y&eGg)Qf^O zR|hW-uGZh+J`A)LxK`?p2?_SG+IZ+elrfL~1Tk|RStN33%OR^u_b&9v&LI4Tik4kD zWUmdy?1JF!97X4r5jqR=%j`0jV`XLzLJObGF*pgN?i^PkwO>sJj(e8*oJV#oAV_y? z&Mk8XKWcrl4}}Cu5)478Sd*;UvpiFazM4rjiVf#Gs(r!(FK&?myQh!SxePaYf(sN4T&Tp z!O93&(K8E*pkl0O%0jo;;BPVz%$LwZKDyfV#)Tr^zFr$! z;n!pN#_Pwg9k-wP9M$?JnaiUq!z(YXha;=sc{Tsm(0Y5vYVdyd<3F2zYx-^VbHqin z%(b!Aqc@JOH?|f!Cf6D#*PlFmBY5-No%q1R{*xc13yN9nw*YhIPQ16|BMe^zQ7nEV z_;Eb37EgQ_@ApS<}%nz-exZj#s;r`|n3<3k?Hn(SctLuSen! zTlc>|{DDzyJy)JBJw{9{?Lv{pmCz@?y48_4<3(TRd;4xlzaA*|99&PH`zSnFIDMuV z>3ip;-?V)cIduod-pTvn+7q2nox6tL#EV-1v)RvJ|P3Sq4^Hlh85a{DyB8DN*L$uA5 zCxC(7%qq)7C71K&n4If9&%0!~&=|DHC%obbNIj=$%r19iHfnsK-%Kdn1(~_;V zV5*$L$)ks6&4kZkA&57Pqltl9)L$_KNU6pUP4$Yrk?c)!J(HcM4ezvnD7NKa2HX$e zZ%P0zp}+4$?yi4&kbCc4Zr?+1_-goa_y$|_w)~{|osnBj#g6@JhfWvHyih!pTn|M* z4((nG?OtI&A^CgtVv+9x#Um3djty}6x+#y=uBskm! z>YV7vQF@GsbPx?`Zm>< zCHluQh9cxhv?iDd5GPi}(F>BB%49T3N_8asc%e!_VrnV0@qPdqL=?`GAY1ao^;^LZ zIrt(0#59K^WQivne=3#E!tN-k6lTdRCbMBFqiGOWrXa{)q1YARZCJJGTPs4Zylf{t>@jc|lYB9${}NGUH{ zkYq`L?gZ&k*~neE*8ZzgPAMN^4eN%~2mV(IRe^f)UhZ)4Te~+bW`XAC9Y&QS^ diff --git a/Backend/venv/lib/python3.12/site-packages/pydantic/_internal/__pycache__/_dataclasses.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/pydantic/_internal/__pycache__/_dataclasses.cpython-312.pyc index f0195d18d3c4d27b43329ee4007096aacea7586c..0795046b63d752485cbd8502cf9911196f721dd9 100644 GIT binary patch literal 11631 zcmb7Kdu$xXd7r)alXu6bc%-P6D2Y6YJW`S++p;a2CPm7zEy$H%Hj&2@6L2HI-%^% z@5}6CbfdCA-;?Rd_hx$8?7OJz~Z6|V3zbCOulpi~kyF{_BGDy!*V;VL?-nF^GFOl#J$^1bCFjL+GKGP1^U!h3D0vTl z!X%4S4`+*17F5Ouvkab}n~}##B9(sWGUna!RJTL+i(rG%oUBN16ef%Cqm3E*sL7SU_#TDf1 z8Wo|V=rH5D0E;#wQz+PxEh>tf)dYLhg-M(fE@{Jrcd2t5DX;Pum86#iJUR9yE6F26vn7ukCYs0XX#z?224~0#y zDW@6>A>J3sz&>G5UcTVy;-PxDP!RTVLoc} zBiCjo5L_{@0@F^L$r8>>>2$h}KV2-y&~sD}W{RpNQ${cGjOV?$x8q0#o|>E zk%8A?7vzF8a7`{;8&GnW2WIB9sbb+s`q1G4HK)n_Gr%BTkyWTLPU-+m4$fOaR0f$%=pjMK7p0PdbVLyTq$Db4O-vB#6o(+t0qhRPrGuEIG23fp`+!i} zA^R4obsbv?9IJI5TnQYkwLP~Ic%rPAZKeI9~@>$e`{FJEjmu0!Yn`%RrcqkEhOXE1|I2{UsAh9%L z_kG+h!wQgDQ#MR>BnZdtp8C}pISVH^i?ak(RRYxl`kV*NfCfNi=0Ka0>qj((GxANH z=Vuhq_1OJ|DH$43rxky>lv5;Jf}9FN8Jtod55^`p$s;ekJ^ZU$PEq)hrSEy;_@O3k(!JZLww%&{%c9M;k1IO^N7CZZOt z-)J1d;R2GGFW6-^xUF-aIfA9O>UtM17fTvzZdCsNJ5_C~x&2}pYvR1Wy=+n`Kf~t= zXh*Urx@^as&3)!u*yi#NjpyuvwM%9*`HvcMzS+^)OoY(@jq6RDBojp&)O&-?dbwCs z#`Ts>OqTf0^EO+ZE0K0g;kdqIQ^PtLoZoA=t+V;*5zG9eTcM8YZFTJ(F@YI&+07lR zHfs4JV1epi%aW1#q}^!i4sIT)e*fp&w=}Z1VO(#mn_b-&o=$lw+HiUlvty8fha*VE zEa>p(v1p49e-Xs_p7u3G~BtzX8oP8{4?)T#ql;DF?#hu|>zLHQ61wU}MIvf`D*F^Gu&sFvd zVXLGJoI=F@#Z4zI+Ia#;gY~QIgJ1R=XuIulBKah@J?lV_lmqmj3-U72x-BjZ{VSHr z-s$}o?K~y_rvYoF%3dk>X~^o)DqRQ`nxJiu)5fC8q`vh+u*^-P)3_zo?NAuz=$%GI zu_cv*_Mr}HsA^c6e!-%grxb<$Oqp6BK14 z%<%IQzfpFbgOTjD|Ffue(&B}&!q$v{$6k5p56{|`M2~83T17CIw=CLuS}P$nE=4Cf zDRv|BiCMW2DMzNyIGh$GfvT&UfxXLf@ou8^T3mYxJ-iSqyD0Zfq8+qK**c-~za>fG za%dVo^(_hHIs83a>Ns){V!MUVH$roM<2lRClI!k^WR~m3y+(7gCBZzB+#fT8h$V?Q z%ADWoH`OHG1_2lahg+R;+)mMU4D0;V%oX?v+o6L<%cgr%mZ4xHK;J4vd$Uub1{Owy0gEL=-CG7GZO3kD z44z~K9d-z8OIh^E)0W$8)uEZOM)>1Qk>TSD#>}Z{t(eoqn`O4k<=C%!)$VxqV5V3F zZ|M9j2JAd7Sq2P^&KAqGtqC-3>Q`AnS!Y%!SYH?=*dfGrdx>#{TFQcZs!o;^2(7Hu zf*@mJR8&-Xf-hp6F$;#u8Vik9-B4$@!c7h?bew-IIoc2c0}}vz0MjYVzjv-QGgG7*3%Mr1?bw!WqAob3MHIk3783x-qqCHeFwm;#OHF7%r+Kmhd1fhR;3JY~=HmSc!Nr@?S9Fu&K@dItbWzpNDDV5=u=oa0YnOcfOv;2fR&a-h8y z>007yfnYVjR|0%BFjxr;{vi2aqkklDkcAx~FYF8H&tg_{NShog)-33=rULvNsAe z4SNVk3|JeA?mu%KkpSM3tOv~|;0B@>2OG0!c$^8VFG&F36LFAvh|tZD%bvfp zPfxM`3v{QpK=!*u@;K5`jif4()V<#OV-GI;G;-4PL<96RaIm1m5S;-2WOx;$4&zUB zFj4_}5ouP6XF+#^qNSIx>;udk&R*RQcnr>14*-0JIF71&kkT71=oi%U1*3|#V`ptB z6X29H#I?@(XD+tkzjq>Er;Xm)OW?q_%)4iC7L#iPwpkpDks&>f%>j?J!Cp8Iei#+! zNqMNGxc+*~9>73CXd_mE1|Tey(>)l1n2@>Ay&lObvRE(ybUkhcMKU1bY)^C_h#{T+{>)jzNnh~J9djMgI3>g4q&ZdWk09w33XWq;RN zvZtDSwUT`Gp?f7cvK0Hmv*S+Fo#Lt|{Y6us6;&m6)dH=xKwB-)yy5pW`WC+eL07ov zu6l2{+BaP38-Dn~O6dIJ@P^OreV+YoM}gV7Y7XesH<-_~NNmPy6Ghj>X{{ zZ`Hc`s$DNsx?WfuUiEa;c0l2(r)8~m=bh|w_t3-VR$5Ojo>_Ory)B=Glb^Nht;L(x z;(cq)9e2J`?L1cLJhpuP;%alI*4$Owx$lYJlW5%V`db@rj;=S7R=(OYP-z*s?_PfA zz2%mHm6i)jqw5W%X?L};uhNJw)Ocv|&2^8*+fqw(R1>|GMDM-UmBiqZ4__&9>)_3U z%dG?Vn^r3N~~LwITGplHG#>07H+FW z5^I5uJHvOI{;~7#I`1d$ANtp0|9tFz?}Od<7FGkVti_stza9kE->)~5NNY8`zY^a6 zYnWb3U907RldFNz&tlE%Ua0s|MTh!7UL7K10rH=T#3>*7Q6PBA?fy}sckG1wM<={M z|Jb+x)PVcPX%6yDHXDx%=yh)6cc8s*W8eY>ThjvP1khzp!^6*#WufUKXlIAeRxKe5 zuChzwuJ*#o@M)+GS%OlsT{sQi0yk|3rxrK#;(>BJR9n)5x9nZ)s+*Zdi(4%A%o^$f zYL6A(Pzbpf+=ZQWZN1yHjn=jG+HGBBFPo_~RNZsISN3Uk$X+7!6`1)pf%zt$4sD0k z#dhKNH0ts#X~9>BYY5b^G|iht-2-Mqrn~D3OtS0(xWNbhlxfS)!H%B;k81wkhD)ke z%;UuZy159Z&oZwQ!De=ag*UAhl7zk}0=3{X@S_%jXxtWT4i;ETzW1zkRhu&0bGt*M z%~O84&2NSgo8|^Si_;#pEHkul8y0drVw!^&*8L{%m1?A4$KRnGyqMuHQgB`foyUxs zX~yq`8(2}*zwX~ZsD#&qZqO4UO7Lb&FNv= z?8+)!37#4{CybmN9eVez^TO!R@cA=ey{P-CJfnc$neyvi_D*_~JpkTih@CM(oEu%h z>>HTjtEf1TX<-cO(rWIUu&D!;ej6D79b5blWQzpUZA@L)mVK3$eM@LzBCU5?eiH6lYwuk83aGVs%dPpF^Glvud}lS@U5R%ud21cL)s7b{ z9WO2icGSWh%i-=%L-&vVuzR)l#Om;S%NO2X9UiYW?YKFz7HwPJ(feulYBariWORA# z!s?N))tb7OMxfs&zS`JRY3y0@*TRjftv!`+Pc7D2jrCPxeXD~*mDtc)a(6X(u#!Aj zO&+Qw4}I(h-Q2Oinmk@f9{?j$<=XP$#KQ(y zYDhhc(x1Ad+U&fT=i^ynHiICZI$h`S{>bw1owqPCVUO;?D`+|j%Rwn*daDsi8k)h7 zFH{B)av}U>T(P2<2gPD|@9nn@^?unx0dz`u%aBKSK=u#L57{MP$7-@m*6LD%ZU zHE?tyhDA2^u|BE@LL;`1DAD!%xa}_5X#I7Ljsfh0wvHtL4{dNbLZJ2qsKpay)=t~D z$|?ge&YZ_I29#Tp)3zQ4mRvbv=~=6_^+cU3o`6>|H-|?c0&xfn7s6m4E-WRum#^C^ z1OpC01bzT2t*FqcHl^(XMCVg-_9}$#qQ)ekpP#^hfx!x*!@s#sD#Gm>M)$b_DE=Hk z1rS@}IL5xC)-@pvrw6{*fF}TJni8+!9W!DJ){U^KMvD|~HB!$Q%xG4C+iLqW8NjU= zj0KPfPREf{<8ZK!(wJ;SA-^;!wz$#N3ja}e#X*tdJT<=L4i?P}4Z@sQ!<3FW`9P|yl zH`aPvx!)FL!}T*FKm_eme)>&#=n?pS$bJVZV38YMk?unZ?7#KS^a?iObPpa370g+g6N9|6N};a|mY9@N$e5^OfWoV(2{0rb#=BDWTAyW?4g4@u(BFGrsL zH3V!T_eCW3k*69@RpP0Y$bo9)XeDy=2iYI?Jlwl{>f-XH@s;BrtQ-?oA`|O=kJraE zo`I0~m@fU&z-6BLq-LB2tY5Y`7rFT15npB>6V>4hA)}WdLwAscY4rIP^J@*bcgCpS z{5p(9!ny~quZ?*4&*5c_&b|v&%0s_}1!zo-QltRv7{P*%F+-a%-|S4v_6?13X%d+j z`hnUOI=qDie_@r*?>P@1CHtQ45}WbU?>(M+g$@BfegiaF!cYF-g4m4(k@_!xm@v>q z>^P6v1Y~+}vQz+nt*EFBzhF>-@isUc!w*CYL-DQ;JTXg;Vc5@bMCSb&fCI)O6mQ1# z1k4oNW&Gk!E~wx$suaTz-DiN;1}MUeDY~5c4g=$APA)s+6E7baRGyT z*t!9ZVH`bnJFCY5?=wEuGkc;KC@_nx2aUR1R%LJyKsosN9S#Ms2xSP3-fm66>;|1( zbqYR{kr=|G`-BpFE~C=jIHBnIi)T*?!>3LTzxl@LG2Lf4A#@Mc1a^SZfALsfF!K{IBy}uxXk4V=ea^evg{G1%BkVB8io=2qrbMgk1 zJR<2wWcU&3dF&2W-EBW{w>|Q7Kk@jyi94fzd*-jsJRv|ni8pzVFL(CeyY^2Xe*eSY z5cst|NRmgEJ*`iCA#UIL9+K?(RdABy;%MqJkO4^=VNcfh8N18?A^l|`r!WngeWnf literal 13433 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 fE52)yRdN{C9QiTqaJ_K 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 MWn+!_dNl$3KNjxG;s5{u delta 11557 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 diff --git a/Backend/venv/lib/python3.12/site-packages/pydantic/_internal/__pycache__/_decorators_v1.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/pydantic/_internal/__pycache__/_decorators_v1.cpython-312.pyc index 41f18bf68d143bd7481fc310bc675cb227af9d29..dff87daf81ed0655a2d25b51643658f306c224ee 100644 GIT binary patch delta 2580 zcma)7TWlLe6y1q;H+I%`{fOU=V>gLYha{vaee;N$Ms1<=1!}3&cI$dK#lep-c4%X0 z9Yloq06{wvs;YiOf05DNBN8*Ii#&FtQ+Ie4KRv>ol=`&TatK zWnu%sP79hFXpe~wa%V5F-6l4qE4p6~=s`U+BZhFQuol;ROJXLXB{V;LqqQ`>P;>O+Vi1Q9$fa6+Sk;x7re#e)rzNcN_ihn2+d z9Np-LV^bFDXYX2l?1(J06H-v&VK8(p#?rEneJnZaVf4mH4y9x|fE^hj3Gl$FLDJKe zDjkl)8cx$_+uVb#b@}xnhk*S3R(_{U`JpifZ~N&G*rJ$Z6Y>qunykUW=woTg&tB-1 z)i5&cRnbB0K6xoa=z@T5 zZK?C7rJ&Kg6n076$$qlRj94rG*?}!`Q+f7{weK`4yEeZuWO#m?+pQ<(H;R4;s3_fp z!0Tib3SbAT*_KUmiqsEwBgy6b#AZvF<)k=cMFap%TcWZ;*KmCVgPLTt(yhp>lkxv1 zyamT1pl)qJXH9~lF-HKJ5A!Lrq?;`&Q(@H3aOScl^_;H0p)Xu0Q;qHhavQs=JVhca zid_;(lDS7mf#xY$`Cx?4Ed{y-90q`_St}geZI2Gn&R!DV|xn9RbBQ zl;i1R>Pu56PaHnBm%5PY)byF`d;#tVy*O80pk3(8x7WjNdJgnYVgCTaUWEMsTu0nD zd?qGf2`TS@bOJ29R$lQ2h=esU%H9;Wvd_C0O;yS@6jo)y*1T`=#?;x(U@SKS7E@y9vHQ5h@W!AB@4;Ky2!L03YE`sI_FJ)S zs}}rDWcc?tTcROBzj?BAE6;^alYX;^Nesq|?I=dG0L0^1$lr$3{qlf+6U*Z0|b^vf(tS3#D+1Z}&XR&Z#aeM}@JRiJPd9YJ(qkOUJ?3}~j z0Q}H!GQ%=QbvldgH2{9$oP}9o(vM>O5^mFn?5o(*<2W(?1$UtI3Vu#j-YE(4VItfEDk@%I^TH z7DC8vVc#8L{10K%U1983VeFnTa7Req6Owm?p@u9H`?Vbn0X_{Uw)bOuu-RGOwBGQL le~t62PUc8V_2a15A2}{tAGT%SFE#}Dta?~25fyRM{smC@=7|6R delta 2513 zcma)7O>7fK6yAw<9S8r!Kk;u8$HvZ&fuxX@pQ@BPrGcPEP@*bL9bjX;6Kb-y!`KO! z(k4i$dTXI`aZ%OgUX@FFYY#;|_5vzWVO3NPLA_Oxh}4Qx-%IFIh@=rs(d`9C#v#U5-C1yDTrh6dYBv|c*% zY>9wS`#{~+FgZwDXdCs@01ZydVGI@0Vw!(R&V;qN7JzSrw$l!3n{E=;P8y{)E%;RG z5^IKF%`kQGcZfguEM8pLI>6QmwkzZdtHrPk6{{=preBHQ3!xr20bG?H14_qJGV^nX zJiIpu67wNoKo&r7Z$K*y$~J%{>ApO=D(^NYx%r*u5q?{)I&od$owBet{*BEKS}VVx zgsftrApczHn+f40T>W^;$`UA85t0B;Tv|R?nJib>t{9L#%_4PkJC3#xi=z&~4{x2= zsa1KzBo+r^2ly%LSH4ZeV6u@=`7PPcW6drf1}@`P$6_(_hl6~mIYpzOVw=dOP*W$% zx>0;F!(N<%fb{DO^Q-dPCc|D}clm1O|P(MFO$y4=gJw?r2PR5h2?byeK~x<;-x zHi()nDf_>yccU)?Ca})>{Hpw($r?>LB1yc*et~#-%|0B#GBaGcY*9T+)frm7SYjGG z0LnrBw|yrGuOu9bOp-k1UIBdIPLTj__N0l*M?9S*%%?qriN;!a1J@&}Abt zG6%vd{A+I@=7OQotkLQ0oL(^$T9~a=8J<8<_RP)idXFXFMEMB95W+A(8Ji*Q6+Y=S zFdp)CEAN7G-^z?HNEAGO1KbnX%YSTJY&afGtPLziOyyVoK|bwwZrUOpV(s zvk9E+8!MG6<5@kgWh*5HgE?9@&&B)b@Vt{djs}Da@Yc8Xe-E?42qehT8gCjH1b=~ubO`;XyBD{5CJ67d6lh`B> z3-j-SOIwH?3XN}M>PDz1w20mcz@qdp(IZ^3+nwb`D4NTGzJZH|;`6vnp#k9|c+1-X zui`!>38Iv67SE&P2H#$JNY!ho$^`WQcGc zZ4ZhIh+lIDR!+2!5Mt-Gj#sV1Bgud3I1vzjc5oI&B>?>ob`Fs*`Ny3B4z)(!pLrCK|#PyU<~ahua8)8J1Z_**Tmkc0-2I6vP!x+K3jiGgO`5qn@Kh%JMmt z{}gRisxaphemDBkAhN-GZ9n>>t0+lBK3gj38v*R&d+K!yCvb09zaImO%4C;tBx)+c zFLoUyUHtp5(FMafTh+3~3IxoRfL;sCGCY;)Y`%C-rI#wSSk9Mez><6Kw!bt0CisXjtGz6m@JYD3!TcotpU*r$|)n z6nf#mZ@D6$*bWv-+MG@gu}{GY%~C4=1+Zozgxr^oK9UCil=}XV5_hD;BdPm=)bmK{ zc_4MKTPZ~Gd9rLnX&xkn^wut|OYm89^UvZPq6Ys3WV7q| diff --git a/Backend/venv/lib/python3.12/site-packages/pydantic/_internal/__pycache__/_discriminated_union.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/pydantic/_internal/__pycache__/_discriminated_union.cpython-312.pyc index abf6779d24fe8b8c04cea906a26e1c3bf926b26c..3ae7ea0028a8063199ee7a0db03780ccfb2a3ce1 100644 GIT binary patch delta 6397 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 M*+M=N_zz$6f4Xjr@Bjb+ diff --git a/Backend/venv/lib/python3.12/site-packages/pydantic/_internal/__pycache__/_docs_extraction.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/pydantic/_internal/__pycache__/_docs_extraction.cpython-312.pyc deleted file mode 100644 index 6dbeb6b2dd75367413a7611096bc92a82ec32a88..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5314 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 diff --git a/Backend/venv/lib/python3.12/site-packages/pydantic/_internal/__pycache__/_fields.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/pydantic/_internal/__pycache__/_fields.cpython-312.pyc index eb64b126c5fd874c930dd3238c0aac739f215ef0..9d98a33f5bee2bd1ff36e8e62cc9178b56681d0c 100644 GIT binary patch literal 11960 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 diff --git a/Backend/venv/lib/python3.12/site-packages/pydantic/_internal/__pycache__/_forward_ref.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/pydantic/_internal/__pycache__/_forward_ref.cpython-312.pyc index 1f0d8e8fb2aa276bd37dd71425f4d46b4f4ea0e0..745a6e26747b5c020603b4627fb04c95f31a20a5 100644 GIT binary patch delta 20 acmbQoHIIw?G%qg~0}z-x8*k(mW(5E)a0AK! delta 20 acmbQoHIIw?G%qg~0}#YX>2Bl}W(5E)djrG( diff --git a/Backend/venv/lib/python3.12/site-packages/pydantic/_internal/__pycache__/_generate_schema.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/pydantic/_internal/__pycache__/_generate_schema.cpython-312.pyc index 6eab4f997572d02ff4857b8a219b6e605f5a07c4..5c87a95a62886cb5ed122cc8d18c37713f836d65 100644 GIT binary patch literal 102251 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%0D=|_8UjG-EMyxmQ82w`0YPe< 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 diff --git a/Backend/venv/lib/python3.12/site-packages/pydantic/_internal/__pycache__/_generics.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/pydantic/_internal/__pycache__/_generics.cpython-312.pyc index c9ab287118a957c9ad21fdf0333674774958a01a..c7b73ea58003bb570a7247df9c5159e57bc517fd 100644 GIT binary patch delta 9361 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
    h90f{k{STv zeG72tjB0@au2zkq~5FevbeZG5yD*hV1# z0hQh1<$ZfLXrC9D{aoxnY%ITns5F~~Hz0szYUL4=diT736%x6J(TQk3fp^cyN8j_-`b@m5bx1ex8Xm02R?;D$!{rXB50y6M^*73*B#(j4!?E+N(>hb9bmy z;CNs~LCTJBcH13taO#*ZI+ejUfco~h+~#^c)rvn!CXAZG>f;B;Uvk<9QGhMC z&Xbk#vE?WhD`U3$2IPgZn5g9@1C21Q`$37aWx^=N8Bc@GIDq=yzhj~!56S#CR!Ovx zjm6JVKRUaT+RuAnbK?KRg9DlV-*E`?I@#U0{Tq47)T>QR^DIp3V|Yu@80T5)nvZN= zFoHd4ALrQ^(AGrKa|_YawuSyK%^A1=fs=~a_hLWpBkPhrvwKG2%o`ekW{qcF(ZqjC z(}J0IWQ9tAX2Z6{oe3)hAU^>PrX%K;%t# zzKVjGlbnv3#m*aM_Hi}@v@qNGI9@xv#D9b~H2khCv<$y3(2~ZO%VW%!JaaU!r)B(o z7B%hV$YEa=5*If|GL z++=WCkRrH!1h07MHZIz6`PbufX@&mv*kg|I{{m0=BL9ztu(FZBJf-Tw;Q{v99u|O>t!jbqG&z0@iMo!3{>3i*_3I z%v=D9k%qf7N=gJ_rLJ%^QfK9GZUd|Y>>m3Ec+au0qNd>{THUC|epr`e=#Z z+YiwNPjoUjGAikTkC|YXR^;DE>EZH!D$+zG1MV*}hF)nMj69BOUKZzKc6cC9r^xx7 z^6lvbj)f~A5OEZ(*x3wXx6pY!rp(9e!ds{*g4NU2r|5$uU=jxJ9MoH#mUh6j-Th+XXYvAn(#ctZJ8n_ag-LcFIZK!Np!h;dT*%}3%J+C&$B7K%TXLCoN+!})KxgJ|K_>f5+M90lCWHi-T&F^Jco8q;#8 z)D?%X2aI;1V*IIkn2OC|+CS0kaj@OGr;c%$7Cju_`^;a|FkManJ($+@o+QImV^HES z-I!3)+K?(KU7+~bHE8H`v(eQYriKZ{kI}_H4`F;P!=z2+EB>^G>CUg?hG_{L-EG74 z;};mFcTkPoqD#NPA|LLFJ`6J(zS#?uc+b?RrR@tHE61+)3^^> z3WUKpY5whKKG&8KAc_7GjHCLd#&_?cN^QgGg(TEP2kZg!ET4z2d{JD##MgRzVh+p@QVY1Cy8*0~Iy)hMwAoL15!cuRw}rcd)g} zhYyd>=*LR-IwQ@eAJ?hJ5&E%0J$A!mxVJ?JuSXqCS*=s;R;ixXkCp22F8!#Byg@%! zsJF%XaXua?c17=J7%L3JSwR(N zQV5c=QB@sDiQmGZm|1MM-#s9di)+tpk}PXIB$)>2oA$)y4>maPpui9-A4W?6Lui2h z)s0A~0s8P|lJFyy@Uhs0)0t2M^h;I3r&Yp|*o1?TFnk-}k4IIi$tu-lv8mcK)fKA6 z-0&JB)*-?U(D!A82I$#MqmU7Hfc|_&*a7;}5kW{>AQYT8dk|L#TNp@ zR>rl;yJ!}mM>n3zEIN5c=T!o$y_iqrjk-*36~mEqUk3=3JzuLP-9eV ztcS54$FZdO#zWPyzK@EqX(8^YtmC;M7*K=o-fP|&Ho38xY;)`AmiEdjtmg_^8aao=(9G- z0irGYEjcrHgUFfx4-lCE(Wy|0jvXKhP0_ik4G{Ie(bRK;?aqJb7?txA?u}Q@Cw`|? zY7G!QeW=x6{@?&N9%L}^yi|5bqK;%=rqE%|Q&q80=H-vNl)Umu+xO#pXR z37{qehzkeiZgdoFDTON@}P}vI9gfOfVZ;)x3xUh^|a1cF|X= zfqxSq%GhPii;sDT*H>YQbYC1m)MgdtMJzycQJa4jAi8~&NsnN=e)k<=@R9*U`FF(+ z-Xoh8Z8Sji(c~n9H=}#v;O+Crm(*LAlnfyHsnl$ARf8A@5Y0{~e(xsL(7y=~b>CqP zV*1*+L5u^4MyllaW!I|;I-T$TPy#|O{PD(ONm7c_5Do!Zr z1zl1yfau~9v(eQYrX4fl8`@nL|2F}mXTsJnUA-o5nBoAUCCe~OM*@h}-5A}NzoEkg z*yPU9VQ!-*=`i=v!*n=iW8Ng%pmnRIK^8zXj_K9Lysrwf#EVpr1)i#c+?b~#7zYsD z3@s%oKs4uCjH3dGcD#rxs|OH`pTV)S0HV*H#mK~JDaQg3eLi0RqD))?q5+}}t90*= z86a}s$EN&q08v@U;*or_QU417(bbq7e+wX*dqb2Dy*f-j9HqnLnqnO$+vMtS3?Bvz ztJCh4dL%SJRKWC#4_m4rORT4YEO6KLl7M{pxde{{5Ir@Tt+fE6a{X9|{WkIs*N^Me zW08KWP>*NeF$qBQADxQZf0Qv(KUS*8(fUyrd8vM^P;bxHkMr^PKMD|?1-}#x5N%to z3H-kV5FL6Sl1u|c`#NFr2OE6u6@cj3nP^EAAi8Hc5^8|xLzVDFm2gsQ!t0n&14K`% zgmLiy1rA=oTBB!&r~eHa4~~W6w8El-M|c=wLbC9dAUiV(E_Q)_gog0Ytu1zQOsG znD2v51jK>+*FFAE-Eg)R*SuJlp~FU}(dG^Yh)}V!75c!Xu&_=JhbS<z5C zlIkNl60LLX&Nc6LD zXbgda-))XW*P*d4co))>h{w|SLDNK6q7Te`4lh44P^B4nIb4abwS}Rz%~htt8*EqC zcZ^#4?n&{=?`0n;E&UbcN;GvG202y-3#MIkaiW$!FQKGVUDEI*u0(UJ9bh%J^lk~o zKf6{nG!4Z^4Scj0!tPSRr54T3tr&L@Ev!g0P#uR6K1D4# zgo#c?e*l``(8H-HPmejgiX?HOThXUhV&B^$J4&3fens!Wg64vbO~)dUkN9w%b}t%B z=gOOG?nMn@Fi&(Z8YAvSU%LDsiJ%eLBf_H)k|T0~DSTt#qpRRwbO_&JhO^LiepzBA z{(oKory?`~?nTm&W-$&%eR~;Ox+UO8AB)lRf6&3m<;T32TXe;}sL_$!i->oECpc+- z?H`>qpHDl+N%PKa@sp$Eh8S_MTwjNEu-E zsvV8wTW?i48ZC#Tks{1_{Y=6H+chjZ#!);lA$}CESfwROI@%UY^WKnT6ffzJIEpVO zlvG!j^iC2-qsOi_8(q!OEKVr?g_WwIgZ`eQQ7yQw=rz3Jttv*dQ>?>L*6SF}yT##1 z-N5b&P|0!lj;A9*vm-eiEr-LA8m{s_X3vA|hE6%g;p%#8{BS+9LQ!Foaya^8bduqk z)jn~!{wR$vX`n9Yyd(}sJFhkyUCrToETQ<{m#c<;1_kg~CZBdV>H`lFJzR|zRWV$_ zSjVH$3ou;YqPkeeqe{#1XyR4T{rn&uF2KIFK!>^ecIt38!s$93v!8zlULLw(6BkOu z9Nsgek7-#?C^dQsmXx!x(PlYS3 zpaVelaHSIjy0vhnJMISq#OgH1f-6mWTyUlL;DVuXrQ6@sy+2;0+A%mD?Vie}09Q&e z9gns{a}md*^TqK9t|J}2@~I5mXr9dZNWDaF?EXimv2C+ZQY7=cH+0)Rkfr$V_#Yic zLDlj2M4`p1slPweh;{H9r`G^p#An_;G~_vcwlukOkhWg5<{%30n9Py=%Cyp<4{@ zDjyaaBF;$cNogM>Z`YsAvcRTh`mvHU$VfZXPrcR1&?fy@q24aWWBBqYS-g#vJ5q<( zGEayt^Y_>?zlkmLJ^lDUjyApfxkc{Vc&3&|XY#mb`RCk`OuDm3vNOhDSm--kYhZIt zn*0)EokpH+I}73=*kIszL7vXO6|IUQPfcG#!qqG#nBPk!Y^xI1j7=D(^wh}HnJQtr zO1QZ+ro^R4D9BR{mFmZvrQX+LQ$5O5cI0X8i-@qhCcVuFJM#2ABkai297foYrx}Q_ z0ZaqNo5<4;^wRd?621`RsVMfv8GIqgQ|s6l4fx_&kjZEgeW9_Q8u70j$aKTaZkY};~4hw~vjH-b`9fye;13)zd zB;_caiI1cMfa>GC$>CioQw10z4@T8#XrWK$@im;0S1);bbX%5%K)sBG<{vpDK|a8HmPLTHZmtDS?TTB0ZA$rvYYS-;0EW;AT&x$7EuMuLg_I zNDpT>fF4dss=f_G0ANnm#THC-`sL8G#Zmnb_AD;{A5b-(>8bRiUI@?B;R1xm=rA>& zUOG&b=K_R7eUZI-$GAq>k8ypXaTXFZp6`M-oMl$mDC3O*lvt&kPBKrAD@MgL-hxGn zU3#VqiDakOpH+iY|-X}ffId_%K!@%2#rvCx*#M(AAZXQPLWT6VYX`Ok(>G57p0bwNkf zp1;Q3AVl@{{AUPgYVG-Fl%wgfYt+&A{G7e&!nm3D$ew=i61n{&GJ_C9pAN_yCpEeq0-|dH< zMCNMk&WB?v(fNay#i`wSbnQvu+M{>pI383At`Gf3)sB_oDNl4|nXbbHh`(Nkxw2fQ z!`TR*r^C_Rd5qp>oN(DeTqSOM%Xy zkk@pwN|oz={iw?<(T}>!zWPy@d7*xsi@X$|yYb6^q!YuOjB+Zf5)UL+FCJH#%Lkl_ zl0tH3J1gW_U%DQ9OC9rMaB#6q@I2s(?%V``iMRtOL%z^&0BW$;AASPlN3cQBHL^Kx zHUjfD3JOG?#9n_IQX^qUmGC5$aL08q2{$5P_$s8zRH+VLEyb;hO*NmX+9B1h=2Gc8 zmFmgZRCh6z-p$KlrNxg}J7=}OF&=88cG~Cm;T!YHDjY=8@B0r{dtZmVw_n%-|BHUS z3kf$R{~o9bM}(UGn!IQy^L+9wuPZv6szmgg)g$puxp7!(k*q5q0ho$@v;AGmF5DgaAJso$O!(K@YtCt@-dT0=Ki@tb$AUR zDXy-<+YqpCV{7j{xZHQ8V_{hts>J$Hf~|k)Fi()E4$5fPq&zFd7&5j6w2|GemD8CD z*LLpq1Quo>=;^o+x^GJ935@bDcL!wzl0Jb^c>K`h~6 zxi{?Hr_oShVqYN|#?KF=Cuy2(ATMRp9)PbclT~*hi==7Q8c26}{$KMuLh^c_$9hU) zuD%;I59EgsD<9D52CkHm-uAer=^Ug~%s6Ncn6ZD)qcG$2GW20RyjzZ?57Ut8h|K5? zWM+y@Y(r^h4E}q^;hHxNzA@uT5ZS*}u6d&XEYIH#6BT+m4DELNzchXha586piCEm3 z>F{2Mc$>H+=GEjWYoK^FXf+1v$*Jh%_8X3^laC_PkvqwIf&aqQExEioZZPkT3q91c zIVhR$ewBL-%)p+Hsd4d*()X&JF+(@L1mCKGxL22R;u2$Z7o8>Mqh&6`5n}_V`Sm4d z&(gle3H=iKj`j1$eH4tq5ew3B9E34}GdrY=a64{V!#@=x9AlQe1tO+|A9njQr@|yg zayoo3qd}n;@W;3X9R)s&n>91JIA-3`+PwCx`5d+WZ8OGB*Uc{FooiP{o6}4+r?iWL z{yF1}J7;6@z8@j!9KMr{ThYSQJJ=mFhmr1$@*?qYkv zx?>IN?qin%zHVx)eArszAvKL|lhyj(vzXDwbMjW*FK({i9zQ;I`#X5FqnPj%hi|P5 z4#!3|#d!8{P%4JQ8zUV!{BgV`ho_?b$o;37!ocCr#B=yTqsG~$P9PWRDV+d&lXPkW z>T6Pke%z|7l>xObWBuwwg`(tDbEuXHhjH;02b*4Q+~zd^m$TKz&4}f{rIvc8<&C@g zmXcBz?&8}dt;-yVRw@1%%i9V0S%XzwQXyq{TYLDf#Un~fO3zPsEGkHCH~zYml)9@O zUiG1GD2k#wVq4sWY6jFu0MTiSXm$6esyh?Oh1RCY9fYFEWNJm1cUaM}68~&0D3fj7 z-o@6o?$w7h*Ymyv_NV|hC+z8Dg-4+=H~XCjO;L7o>%rayZ{o{4nGcC2Y(ptE#f#H1 zR`7+ydGSX;!F)>4%RtOL(clbTbY-)GAGEd!pN9c?U5=*OdT{j zwK50sG#LjrR_>w9rD8|L1f$X=J=B_#0TUn{6y~Lq%{hoYyEjkaT2#6mLLzlBse@aJ z*Z8}qA`33wJ1+FQ)2c^Dp5&mgHhY4x^p~V!8b*jZ-gG^m2Hw z5(a_YogAP95T$E+h##uPNIihHQ*n4ta(J=gaH@y6|B;{bV5PlSzFR6qAXfs|&44*q zMKZsBQ1jwntRK9HXmUH+H4gJCt+e&xo30*xE2hc9Ua94KudDl^!^hX*% zNG;!e9jA_qO~O1tUVhy@n3mq3Q^)HpW68m^Ct=>KdiG3Yt|YVPmdU(}6Z){cS97El zz7U1`Pq3XaMxV`o(55H_SsR`_;wH&wnrb+zs`$Wqn){BAGky*Yy!p!APFHBYxRx+BYxRvc)+f%cEWzqfA2|0?vvG znI3-V`Q6i%_HO5_V1D0*vaCJY(ww!OWvBl36xizEfpa@4SlUa-dph+jmd{tmLVJ=G%G zbd!I|F=t4$gf!J8@-#ham&HD}? zFZ`5Ud1A|KLwGz}cFj>*7B_@Vq-9kPA-`gyE-5Z^c$dYDDfH{*xakcm8mW30W-3_o zb;N)*OSz(Ts4sJ)>~wQ(oN*7iy4c??C^y6%GFr|@7XxWi@Cb#&tuIMlX5^z)oFdzd zD<)Y)pxnm1?|{`%&-;VC77mQ$dm687D&Ua2pd)uEUuFW+iF+~QCnwY$ zJ`bX4mJu(SZtJB)(-LabtD$n@|5V%n%ku(g>LDW+Dzw{wl2b!AY(g+UO;zu`OsfBB zjIH`?RBy?bCIyf$IYy^hwz$Y8qMhbgaqO+}JbXYXdKS2t)Tk$KO+3TqUs1k&fUNO< zatGB=7&HH;=Vi|**KXe)X{GmLhwca0$6mYr4iaLq|CW1TsM~#~kZJPgsqENx07po` z8hBqe*2i@B+oTBol_6`}HIdA15Nsv_F;Ypw<$lPz4+^+1U15`T1W5o!yvN*-bvtjy zMCmYuTQU3xV#iVB`Dy66o?G5`r!lpcgDEA4MVigDShjI~(+>K3zTy zk}fMn#A=tOmvAu7_|GMz%W@lCoS@5a5Aa2H2ZZ@z90-#=n1rcx;WL_Lhz4aUP1)t? z_=en0UYccQGBzNKErkT}xpe&FLg0ybHL4UbMqw&P#Yt-E`CJsz`Pl`4A;$F+!R0W0 zrh^QH!d2LEiHemaQ@0>A39+8Qt+)aFuUZb@Ag*ua;2(!~EP_1(Q?doMxQ6k8Zdz!i zI(*z3@%lsTVxiHnVNiZv-lC?wd{8T!OD9{ABYbA;!uW8~=ZJdaUR5OKZnwWEJ=6$o zQ0;wtLbSatrM>bY9hw-SITfg_Cx&wT9a->q+%KQz+5)v&zD0ABWB|k%qV)%z%7Jq3 z@XoVJ@6?$puA)Y3#-cg0Bf;IAMNrFZO}bP1mw!EOOx4DO&8Q~yCH_EK)_>WOmaFg5 zT9Uva!3Jqt<3-WV?ny;af!Y<4F`u~|z1FoC`%BX)lM19s<;w?HNChBdfBt$H%XEWs z;W-dG2Y=9@+h4L8)ZT1RCAuI0TiVSS7kpqO1>c;O4La-0MV-aL{N89BzM^7&s1r1G zc<)1*@+~UobWAk={?Ih~C~!{-7RbO!zlqJ=HCDG>6F$ie#I3;i={6aR&_E_TwAtNZ zwcF8kiQC@;QeBZ10tiM*YUqZgN)3BH+aW1hn5lb;$PZAr~ z%G+5s`8;j=uR>0I?EDR7Q(4$KE9OIComYGOe>xT}3A+En?djti^RramMaYD!^&LJJ z%(`55nh!l5%MSF?{IOmLkLx>9c&xGs4~;y3fQ*zK{~iO`u@w$4@Vs)ZoKc2Yh>l;i ze(34ANQ5eo=U;7#(QITgg^MJmcmvDX+f0!_h< z(3{XseD?tC6v_ON*F#at2yuP$!1)9}@og|=+bo;tf%Y}(QiqpvxWK!^;kyL^^R+uL zDqFs%dmVBqIsfrxBP--cSbVjVHJ{9=_!=X36I?<2Tnd^7Rfx-7p2yh@D`wt z4jd6NM}CfEzJ`}%NA4STB0EU=t+;vKW44)gxt1Bu_?4XkaE!7DF$6 z1R5%uX55e8w!mVq#T=2g<)GoZYh(ifqvcpI1qyUZaPlvUu|}mB1L`RmpNl2zbM^?- z&yy9efL34IxX6OIK%#Wd zs#Llpq=dZq14Fv&IORYA+jLq>9Ug{oT^;U)@Q(T_4L_rmwhj-X>Y%ww^+G{tF$Ex7 zMiKaVYkEyXqa-*>he?8l zI!qGmZKO$n@J1buAwXy|j6163U2RR_7kX?>k;6pA{x&zjCSsmbJBNBu8>I);!WL8S z8Y>_+WU4-1p9MGg^Q(A0=;zK!^dRM+pm$}vjEAu)Fo)a&9!r-GA(M8BA2LFd1bdz2 z%!_1}qDl&`CTMi|udw*?pKi*K&VLlpSIfC)NJe1s;#{f+IqM_QiDur zu_~*6w5-*bn&>w@NGMzIZ3}VbZSd#jg#Npdqh+gVVq7t!I#Vch&ImmW+F~W3FUxKz zaVI_Ju&h$@L9-EgVN~Gk1{NE}K^^~w>jN@y?crKk$zQz^b1h{-Sabs_(=0q8)5FL_ znK*}uF&XE|uR0Ro4jeDWJf5_32PUMuJM4B$U&)6K`yA8XW5AmI*l-l!A$KtI$4sm{ zTHzyPe_$g3`hWSPMgQ5n6pkZTAxzj{{ib+Yy zM^)6Oz{Gwj9c|1tK84l_(^+1A9)9#E;E_G&nXD8nh*+d^@eRb9_`Vo`{ybwn)MdmK zL^6lo(J{sQwZoUiwxd1s+3WHp*&^LYS&=qysn-OBFw2Inlmp!-?Rb0&4pWB|YKIBWPvi0}Q?Umow_$s_4v%oA9)R5wu2>&HA;k8PNPNXJ3a<|Y zULeBDHwCI9f^EV1m3Vs;q7USLG?=-pqn+sA8?VDYoP_9uFhq*zzucyXJ_5XCBRcky z`l}(WD7}-Bd~(0mHj+b9*hwC~Dvspbd1W|qKt7^U*n??ui&ybHbTv>*{D5i+NoY&< ze03d2$S9NC4(~KcGay%p+&3AKFT2tra&ri_>J#|@ z5!+zqkc(o8d>IV+Nr-$1TW&>U-$X^^kyyTMM9w`rkw5bsfymPbR+Grs38aKv=xP!o zw_RgQk?)%+uItMU3R;a-U@Yb%DZDM7!lz1_0eM20EOpAzy@6THp}Qx3=!Q$00R=L2JkXpVf!g-dLs!y<`ih&hIYY!BlrCzQ z(APwVEP@KDaGj6~M?&=&uRQt~zj}*|aaQ}-F;0iGK$2Os09vvd<4bU6k?X@0FtTkH z6&!txYoBt2F)rv|%`v7!cL*6KUtpdKDqY6N!9xh2 z(vz53WS(aB*LCq=u2rEg@Ez)8Jco&o@2UP_@?7azT2vHb`jOviDt;@yK-kJCy4Flt zl5bOf!9nR-_cu8x!UM~JI?DW3r-y&CFc+%}ZN)2SIeXy3r8VMLZq-`OT)c-y9R4(3 z%b8s(sg@b`VaxaH&bG|7`NBLvDrqlVgtFjk>v+FC`*uI>D+|#SZH&GO+73UkY7Awl z4MTkq0=5;*Z@7nLWcE!rQMBK0A?jsA(e4_Dg1Dct#odZH$zH0O&`&kt%-AMmunBZ8 zu;uK;(q53>=I5!*%~j@KI>fa9Gu&`y`U*Q#!rkqpqf25FzJP?`t87(l9*c-e(YH-I zgg%Q^w!31p-NJ0NC%vXp-LFy&k4@D>?pc!)y4qBnYi#aop7I?Uy%SD<+cvmuAHHWC zh7n)v%DKi%Ow9fo=SkwwBM65FSnu!V`@8tQvAhpY(XTR$CFkQ69YU?dLyF;7YeH`Zmy92%e7JSD8WwNz(xFLcjp z@ngm}*el(GPw$G+5>L2VOF>3-OX87_8u@YKY076{Z+@$fW&#qc$rA zV~Nemlt(PnvCvnBJf`EWt?H%yP<4Z2tol7+d7zF%0cqC+D;&VBu{8HP!g8 zGXQaH8Oab>`>!B4O61s$UrN@wd`A3pI^N)KF#oJ{%dr3QEg(1sn>5cno`agu zRhwDx%f9I9>79>4Wy>tM3CV@9+7%e~Loo{`A+Z}@t|U_l(z;F>wL%)z4qZEPqdK!u zL05Gf)uqZtwKi>)9{=_bHAj9&j3l+yPj7RJ32c;kuMZlLUhPJ_kL1ZH6JsznJmv3A zM0F{SdrpJ`;tABoD9s#AT_genMQw*~Fv74zL^AvFZmsg)VWsGUs8Br(2xS=U2C4Nh zBc-GnJw7!KCNLJw0pZ?Q=+f`A7P=LfZ9?~xGRZ0pYOaZ2=)$>4p&u5eoJB<*3`MoR z9S-l8Xg)Y@XFZs9GZ2nscDy;taZfjmA+9;OY;?Wu3ea`_CDk3=5lEhluE{u#dM|); zPNz#sEhrgKunZD~gri5zXiCANnjp35er1#~Z$)gunmnN4Z`B7+MZe^)?%hvlX z_7@LXL^~R|gC?*9oE_q&5^tfO*AOm}SqoZ@BLoW^cDA0!n~lxblCeAENK(*otfHgF zRD@ff0=5%|gXX(J7h~jLjVza;29-|WL=!#1NT^SaM5o5RKcR>P_3$>uePJ)K#9h6WSJXhnFrkpuoR_V_-n9{mGWCQc_@nRYTr{EUWy~>hv&u(*qIlKeW3##T? z6ww$BeIU+^^O%tQ$QSKpO^y|peap`5Cd4rDCrTH=>Peya) z3?h05yD(@V6@;!d)vO1(mHAnD*<*W_g;qhXrX5&9@eEXw8@QZ!Q%#1^6&SosJPwa+ zrf(%9SE{F2Q%&e{LC_%;jR@9A?(vB$oJ$b}+|<5uR3Lw7B-x%q)L3Urepn`hHM*g; z7?R?S?Y=ZDT$WxWH7zV7)%v#gfzY)8-E ztcX`89?wZymXZl^hJjFjSYwQ)6XY1V6_;#=_`w!P`9~3BI7*O6 z7MLQ$%0kU`L&ztja{IBy4oeTEqDabcZzsvE6ly31$}W?$N$fIYF{}cAAZ;-KHfn^l z%gp637e1tiJ?8f>kr+=%xf&_ig^8SNWlV+zu0np5B_=GWthU5_#|K(szF@$b+`#Cv z@sL4F42EbpJOebdpEg1bk#7~$Jhh)@6Ak|`?8FV+#EazZm^=fqk<7i<=@H#5Y~A48 z58_85>&)tp0@s5I%y+H_Z{atz1Pk2}A=V5dcNkbVnECG(dH6BSGv6D2*padI0K>wi z!Zgoh8RuOs@LP5yv*Kz6zg-}FtuGKPUqX?fOa&qna6aBN&nRlc?lBWRr;%oSJq5#M z2whPOq$TYsG7%PciG|_dMh7F!IQ+faS%#z{FHsrnG`SoJ+G#-Audu4G3Fw7Xz9YfWSI<>{ELiHiW_;aKIy}gsNPN)He zaI+7n;X1Yf)%W=FesDdYE3eU0>n2dcHnq+fjHwkwn=LJZlvKM1Wixtd8wjG7OyBup z*%CSY7z(5u=6OGDGh&w=-akbIXq(a9$;Re{ORTYZ0>ZocW3z;NzF_8A*|B4D0!~yV znQqIVbE~oGjT@_ocGu*L1|PDa;4g4()G&9XvHAD8M;M#pf@2#S8jvvAZiF+K9-Ffu z4YzovAORmjLja9JjvL=)YRnX=)gRTQPm4%DoW$P%#R{2jp z(!750u?-9t6$}jT2iF7hFU)Bfm<}k~HZZ?kiGdlwHY*F&0;(WbK!vYN3)O7o@pL%o zm@cNFgw>B0D%3V2T3ZXVwl%S}1z6iJ7`!BGpe$E)w?;W(mb68t=wYxuIpLCcPEZ>a zZMpI?L%jHe4T8fDaOHgJ7CGD;Pe+SI@IzsS@e2C3+TZYza+{lc+@OTNnsFAQA4ie4 zyQupGGY6a$%Q)`xq>QuYN|SM>4pfX26!WRYIMB7LH=_$`9f5If?{sX8Lt_?(@)2yV zHRB8zte4Lw(!Tgxc>gz+&sDB0jt4x!h*8@;!FYHhf>$wiv?D7eAIZN(wu3^UWX0IY}`u6S=Jc)BP@ia?UfGpKsPgGNmtwE z%A7Q@zMcKh9#vU6 zrKnTyeFj9$bVAuJeUQ3yYzdz-?wr`TcMvD0ySF!pb?lK7@@PFAa|${Xy{V_~K;+zy zR@mAzjipsefAc4+%tKV>b7M1SG4moTvox=enV(jf3smOQROY=W$JG2a#VRcy9;$fjmP zueF!}%RnQec5ISu&5@U9HjN$VfTMnB4GC$M>|x1GS@NgqZJNE_7nzs-9L56mmZlOb zZv*Dt#47JkQu0{l{hV)0<*m*(&N$dgmPD0v^-yFwD%lirV{ zf_Fp<*M`Ve9g&L$KYQ|~jC>A}$_DMn!5X^K8;>qJ5DAs5#K!lKGV);bjn>DWY`h3f zjvmf*A<5 zmLL|u0x8?vo6`?`fD6`yarHf@cOvV>Mmw#qaR%?U2rZzR2*_iAasE;oKIP=YZX_b@ z%J>VzC;W2fB4|{$RMt<%V=Fa^Op9$VH~rMWR`VCnlxKWir=K|nVY`Ce&rO3{Y1EO z=EBZClKCE5=mu4|gieHjVSSE;Gs@6>n}z5DJfdsu&SkT1cUHGqxm7gF?WY+)nnjc7 zFRVB4jG}We|Ms4sP-$(RnztL~Pg4ifIZxS?XWFAFyISyox}gt}BIH)LL%Gd^q;7qX zbRJUMUNfOsjA<8jn+HjE8JBcHGA#ZBXpO;zggkV^<++H5Ze%0Im&Ji`IPr*6gRc^~ zliSiFnS~~M4~E7-s|y&S3{BOxnD=^<6BM0W0q`mIk8uuzNGay&oL-l65Hy2vBsx)V z^&2+d0QUY`-5d0N-i7G>p3|$@`{$54S?^7Ubhp2$oeCW~lba$&Tl~^2Qv+=m2Dt~o zhVI&Ybj>u&)ZuL%*ne?;!1GsGX7+ES0w$No@k3dnQYppTy81z1*csYISOebKKjd3k zxY?m~FM5Pr85hKx2#4MO8pAU#x4Ob(DX$%IGDi}A8A59egXI( zlwI8k`2>?b?qAs4PpqiKM#`?zYbHwxlxBjh3bWe1Qlu-jQm=KDl68~=Q!BCka-w0 zEB&cR1zG%AD#+3uDkz2T`#R1Vc@tJINVjWQJ_HTam29*83K)AJ-3ALSu?w~?q3hZp zsdOU=T(Z(p!2Z?|^iucw@LL$d)=VL69XcBubz-IIk<3k)_>^9E$bY!tRIyP>xP7~`W%8;5T$KWF$e#GBgof0QTSYe~9}M_^68H|AaFNH~|@niV`3|P*6~jTN4hMfk99_ zP*I{Hf`UX00)iSg6J&N6MMc+xl_;pJvWjwuiWo!=Z`K1)6!3z6j2tU+sL1@k-|BvE z-b^M5{(k%0KOfDT_xi4`uBxu8t}d6ANZ4@k1^NILBHpESyWp`Trx>4!W6$Dz62vK7 z2OKx?WvD@YMMIex^M2E}yLO_{cU?$?yj9t<^jU=%_zL2}Jb(+@KZ&NjzwKc#GQEw- zuq}JodO<#Elc<;^X2WX$e-R=~hzS-N1IPg6#->;2RtMy(eFklJnK>P7+w@?$6Pq4m zbfGHjb}pk`Zy2M=r7-E0q5mj4bZuT?JuJ;hc;#}F2hb5w^Na;=b(Zxwjx!L}BO!?s zg@(d>N0wCsGHkBMuy+FL7#v~Cgh1#!^=l4v$duele*&X`HaQ(MO>_!XP1HO{ioT%p@XakusQRnqB6LmXKmg+f#GF&BQyJB>Q!G2Ru(|g%83Ylqw1cw(1 zh`3XAYklm~WGr>V!3oXEXxh)Lj3!X|yH-XJ!FjCh=wqB?0&G~Y^hF}(su~{x0Gepc zm$fN0?w5-+jbr>`G1OraJi#Jlz!Y?lDUj3riBoWAOM43FmU*mGkPXQeQxK|^I0cgt zqoCpxw8VVrDR`xqnSv2wU({0oPNG+3DdhEIo?g2%CTN#IKv ze8)8f>4+|5U5h@Zm;xB&{_?&9{~XMn;W0(1j67y_0{nlW1QagpBJkf{aS0r3Zo}U~ zqJjT7=BsK6ltGCL_#am@5&pl9P6hvY*aK+zcg#2NKUvU5!(WVWRWE_VmWxs)EP>7~ zj~)J`@Syg?;QV3We=?S&z`rpnb-{ny1%UrI1g*BaU5V-OL1YI@GRMM(pnx0;>yIB5 z*pRWg(Qm}G^m1?0QfXpKP1w>MXeq@^Yn$66>z&E&EZvaBb|32FWK*FZUu<=e0h664 zliilN6BpZY*?O{dsCGn{gmq1XX<7;T_kn^WP$1K0&w1d;%{uZk1O(d5EI`*~Gvg|W8_Wi_JsR-z`WXk$Jk!gO(ckrB z&vaTKTu2D^0LE4U-CM)e>Q^9s(aEkRk3%^IYwMYz3t2~{t8cgqJX5bsg4@zzfDH z3DpKu1?qU|bXZZY=0u(6F46==G>Tul2!**&)rsy52N8|cI-YeNL8nnC6$>$hUPnq_vPAiS4wO~0~H`D^1MyXSJP_N3urS z8bePpJGA96f*YP^`nmNF)cP|&|IpK(mWb)WtH{WTZ*eL{$|C0VWn<(k@XKBAx%~J% zK1Rnmqiu$7Q7}L_Pih?=E&@?6%sCK?7P*TaX6W2;>Uwtoxq(lw|?sLpEOZS z5p$g=zSEFfV&v+`!>%a4PF!IIQ90!d?%(&SMtIUZ@Ld-(vUkNiAQrZAj7(JUIslis zQO1Pd`f{aVK!~0%(oLKR*|AcRk8L!9)L;Blpm?jhk zgbN>kIyl}URHDOwm0T7N|JCPl+w4#Z$qlpW8gog{p~#7fb1~tB*LS&qTey91UEUL% zgPl)u_^)zy(!rdj$%PAK0|H;XcTrc1f&J0k8Q7*o2w5k{ zI%(e$)Ut%t>t-i9_QcVmKPKJUsp_=HvWs}f?dyz(eNtwx8je5(6!sFe=*OL9 zYa#x2miF_#7qjj!S*P{qY$UEfFOwEr`tvI{xik>epYzzM=+B?dJa!F)(Vwp!;>>$V zM+3!^QR)9?n_etEPST&pA&pebWYS5PA{ccD?bET^85V63GnsV*m3lc|YYYre)GGB` zH8&ujnZSeK&jByBO8q40_>Ar-#>7g4NMVi#pDDBU`kwf#(f08V9FM9vYeTTD*Se!` z+v!=mAL1xxE#V9d7Dh0qOnT*-v#G}=X>y%8+kL{Z&zVuCH-ZO)S*xF5VUhlo_Qt4P zYqj$kSgU7X{U+!#bg*HqOkcXh<`bn~h*nzkd(WdjF447Gzvl_QfHc5e>(P1f1{bai z?q^}eX}D9;G;klpd{x1Hb6bIX{_aG$cZBh{BHXt?4AyWTeWp21LGo6zPBiFTERF`f z0^Hv|LQ3E=VmNT0(BRnNZZzmmz&FLf{YtD`f%^v-wF~ZV=K}7pqI+O1w=#Psx)<~2 zn(V<(3F=6Lo9;^{P#5n_O`s@hIiydML#q@vC#r=rY#MAWfxZ+1!atV9MU;s7O&Q{L z^P57%<>t3Y5nb?7!5+SNkTcA}_J$-}j((%CkA<~8yuJR(>Ko~wto_hZ$sm<)!Ed*S z!jnnG07pgB8peq4NHD@BU9yE!P2vyh5k$vIfyb~&?0dyQVhCR#7=py#VR;gXCu^mg zC-@^K2}rDs5gSlv5)zNbI@U=1B@zu1k6^y4koZJOz7g-#U5Q9M27wAHBJoL(;x!V_ z&(%nrgB1%TPB;scnt0s)FBieb(ux!OMaLgI5)%`Fm0!St!XWWOSWbe(JPhSR;@?^U ziFX5@er<-hh#TtgL>-uJ0P>0T_|=SNo~kFb#$Xe7nVY74}P zi=4?l7dk5u@%hgb_1XaGQ)$ z?|_Mn6&Qa52)V$5J5?eUj2x5-3o={VSnyP9jRn1cn!tiQ_radjSTOdJ%CO*tjAO?F zV|e&vfP)1y+nP1LMS%Q2*UlFMJjrXDVgLA#VchUr?B;lC%foIcxyADEBXT&F2Y+}_ zJlb9Sl+G&TkyAR9fn8E;g3;kH+$aokFU2w=atFQtPL&@QjrKA~H4sC9MGiLuQ=C&&WzH}*$e#czScZ+-Dis_ZjY^z*HD ziVpwau5Lg|V{Z7iHOlcEhpVmztcx-|v^>Y@qPuoT(Kp>ipJUN4(YUK?pJwCR8t0pI zZ6&|aEP?9YcuIQmq^@p^ySgh`-Cv!ef+Zy=nqZa~&kr<9+^#FSR9Do}T@mA}iCJQx z&U2Q|6SG{y-UU*dV3s(U6}!z68TjCsAhzrfv&0Xm+4;7P-}R2lTOWNavo@1@(z*^}_sm_nrYI;x$8Cmg)jdsNm9m_&Jfs-xK8)Zx;?+kvq#2Mve zzSeYSxS3x%s133@O+q=_y_gA2)NAep>1QV-u=$?Syn0kJc$(#<#qSTF_7ijBQdrNj zIz3=DkXw*KpTmv-@A1+L!~tFI-KsYmT40DvY3g1oLld3PuR+E%PmuT9aqsp`BW@r& zU8IY9f(P(DE@Cha5AOIL0ogf10a`RLsJIwK>4Q72W!y?|n4OFC4B+UU>W3(&&^{-H zF?5AHyR!~dzpH+3fj(3b#?T3{Hxb!W#}abgyLCuqVlaLZaVXJ)EvWpRfllfEV`q?w z7j&`qg2^Pu(A$zPW)o0cWai4JBLEo#TjVmB_9U_dx$Ny~7Py6;7r0(D!+HaSX7o;9 zTQkji)s)XruQVVlflQrNbOD`mDb}ME(M{wGviJsYYJ+q~3bTYi2Kj>k+ zo;{_1g^*^=z#p)aVZ9x8axzMRofO>(R&w=S$*iRJcPUhh2yW~0f6XNHrev5antErh zt(lI4z{Dm;w~T{aJs*BjxXV|s+T5l1bgpz4_4k}=6FCA*6=U5IX=i*UX0UICr&MMC zT2EMoF3ZUi@^_MQ7sF(5e@Q>bG;!b^?0aycOd{MCiO zM)4P-y!Xt*p30nYT1{w~lP%Xn5ySMaYy$CvRs%z~L4>M9QO$aq zy9Thq!sBgO3^5$XB$zdbtP;bq4_ru$n3WDvBVyJxmX9>JU}EyxXtOQF+L$T!x%{^P ze6$MxUo2Z()aMC`MH*2kI}?dfy?>8IVtI$6&kdukv#la+7? zoJLDTn)^;oZfS#QxC>0t&5Ov9iL{dBB@{wK0mGiYu|p{~hO9m{aVO+*~4 z^vRcE8JnDZfwGXM`33kQCtogOc&cyJ#h~WYDDu0l7Zp<;w?SHUBX^wD#1nW60k7G=>d`KRnl$T^O+8U${ z@Puhi9h?H61%%Czv)6^HAKg|wYEe@|PNNM>(oi+#LoM_9R0}$#fV!UXu~63%$*iWz zBTi%!&d(;(*H7+CO<(Ve{z>|}eUU?7Z)_T;uQzD=I`kyakRcycLqq;@v`L!!XxFh~ zN(r*3!jx+0>r`~_*y-z@KhUSH$K0pA$eyZCRnXTSUcjdFhtVA-b*!+txzc_( z2U*?p^%+B75qVI1gfm8NCG_=`J&^?e z83Nmr8-*?yR04s$FEg3IK5}OQf!*<|5ZFOYDiYXw>udtM3Ykb?-&-#PwuNL?r^;hw z;(f=saDCcO+c9>3=tE!VGhBP@55>aic7PVFf1LY)^|pbpWJ*Tb1f1LHof##|Pz%pu z97n(mCSD#u-6v=cXNwbo1fex#L04f}^6>3Ts2@gw-`=2ELL2e$y2ZRM(y1%VYngui zyLlzsN9KFXYcXD_jo*ML|6xN>uQL`lv&FpY8=HlF3p(S;^v;k{5X(K8r;U-{JnNI$ zYOwqs!NWi8&y(L{cp9iv7JggAbc7aO(g>l2!`UK0wL^98B~=Aj9)We-4VJ^QTmY6M z4Q;UWs-?j~y$FW(`MVEF}(6b3A>U`B-A zjh7a^At|N7GFE7b)ZL$iH&=t7iA`ugtU{~i1qcm`(tY2AuQmtT)M!u z^`TNbO%3PwlhjZ?+zPhmk?g65-5M%XZ|viOHBO~tKf}WAtnNH9o&ic<_2~Ema<1&? zyIjhq;52u^^H4BvX?nE1>SmYamgB7hsIQ4?ZGVfhFcan@q2q3@;IH06$>8n@5QGn5 ze~7zWaDeR*X-Ms9#D1uq@~9ZkWK;&`CG-)uys)JF?hAW=gs}}ueB8ASP(^x1uZOCJ zP6_JslK}M4JL0fcBUA%n0$xYfv?3^}H>u9pDxmNJT^RAQC-9<>@58cRKVzP~U*B+o zCU@R@k&zdD0cuJRtL?AsAH+jPpxBp&I&B=k2eMryPHNN6AAimhWtS~F+hv#;waL=s!& z@4C)YQoFWPl67%7=djR^Fc8^IKQP8W>Op)u{7x!Q!drcjH&G+E?rnYnlN`Uj1$t4r zUn#`#%>zS6IlmDK`?%j6#r)ydGVyz$Xwe3FIFQZ0FctTJAcJv~Fj=%p2a8|C&umX{ z0ma_1x4GErKAjL)37ZM^3`6c{o2Ke{lPB`<8Jx(IIgz);ny}e-|(tgA2Q?~>oo_XPW)wl~T_2v}P=+k`kH_2Wb&1)%Pjr0$lC8&@u@HUXJ7O8Jke)O%{-PISlYoD+ACwVj4W#-KoQy1U9tCd&0BR$Wv>|zcf}<4~0Av zYO4$!g!aP^_OP#Hb*7mzJ$N!Cd&<1GgO+dt1h@4?;vYXC)5I^BrWXKksfV5M+ww^*NjiFgEtz9yaQg-y~N2$HE24 z0N{G#G~0_=01*DUu>jyPj@v*?0Kr^PDd~2wCSL$McsmPK#Jo2jCu@@NV=_HK`#cap zQ^poTy}5RDISjU@gJZaWM5CL!;&aG6#4O^IMx+eY9H*H5>n;*%=nq|o0N1r&`m8h7 z{6$&Nq{%A>biPDnkj-<_PzDj!Uy*NJOBa zda8VP6X!4+3AFOmgxJ;%m|3^a*?^R{&8MByR!Yj{b>c=-5+LkfRm5_zJRnvC*!|9E`Xq4iAB{J-N%j=DvH%(=6!M^<|t z)sv`B8&UJ0*S|7U6B}I6Ta}TT%J5~B^x>_;- zwd7M|YOHo=m{GBbJhgH)*XcHOr&LV)U4nitgW)O=7od<5VFq@Q5DEj~p8H^{f>KtD zcURqNON8&h>JMSXjvQ4NBH>zO#A>(}h)N+e8*(#>zoLs{Z<#^)$-e3jv`=nUxthpm z3?eUMCR|pDNYB65fPD4X>r_v@Ys_`|OVb%@Ef;*al==NYN<1*%o!;IBIqUdMR7Pyi z2Rkap=XCt`1C=uI+uwbOMEaPJWfxK_P{fr(e$LeOi7_B31%Xm0vL`2?C%%&9lTcUM zy#uW0@Zdy}I;l&428qL3;Y(W49c0>E&6Hr5^Vt?OxGzNZNYC}@sA~1{cvbfl_``KE zo*CR?%cW9vJ*Cg!x2R*%Yj)QW)p%Cax(CukAk=dh>@)&PPbouZTQA`cAS3mUV*NL| z>c6+lzL}>sbY`B?x|B%5opPx_>)z>PJmhAc4E#_pTBOvS>N71|`#=*)>OHW`YyXCy z_RTyi@!M0n6^JG=Tz26HPIMIwvVlP{2Wu8vJs^|XT<hSO)qF4UP$2bgrqWMS?$sB=3Cp%vv;O>meeYf?W^Cx}{k?A;OT}vXBp3^Wn}! z#%Hn7@tno^g5UmZLv%C(YX3UyVC=W2v=3tWTKV|HiOmHyFca%(SQoaidzf5@kO^(f1X1n@^7!V{J3g(H zpl?J6b>ptaLW_z~fGZ7KUL%5_u55e0flRV+)w^>K#ENZVcC~w^FLKr^6h>fp+T{ST z9&CXqE3K%WFAV>JnD_iYx(Pg5!)gS$;65Dr5K~@!u%shui=O5@2w><^+<{WEg zCe1jAV^I1g2N>zO@iMF%u%|TDA1YVMn)XU4={X#Ev2N&q#dY(KeX?%)>l!B9jnYG> zh$>?4L$)fS@6mlY{el&%20&K}de@Z7weFo7-~mPjq1QSpf^g5zpg>d?HTbtgt13N- zr&TnOphDtS#<-AiPkWcl)1{CA;;)BY-|41d6I`vi54l(CwaKd$Ak7echpw9Vv;#qb z1%5yNPJqVL7xDpg=5u_Y85Le3!HHa18t`x7vvsq)$5(YndzRIX*IYgDl-?y74LSlH zGIZ$0XwAMIf52R1U>u}h*8!4ahS>A)4)mXi^RNx(5~C4nwO8igV|-yrs)IhCEOT(` zgZ3P(I)XX46yzMBdKMW|f$EQ0u8#65;Y7lg0#t9lXF&DFZyHoD;DfaR?9ol&+Bl%t zvdq=Ogr}$oA{7)PK(t23axRB#UucMr(+-_z?=G0~CdeTH9)vuGh5!|?PYeynh93(Y zl5XvgH{;g9)=uCz2EJvI47|lGd*JJTr&y=ejbvx)%ES8*AKUfeB7UGCJ6D(8@qk@+ zCd%60e^T~TW;M!5`EWcwz`ENG0wPi8$+69_ez3UIw>)D1f-Dk=i(HJK>O*{to+^1` zY8>)fGjtA?9qyEUmf3DMLM#cQ8nPa>S*#+2wWM7Of#amrsx#9*V%k_qv!008S!ju zl1)ZvdA*sGRFfo4>&p`4>s$a%%rl34Aa~f7*U#}R%WvMJ#)MitU*GXloYsEi9S$ED zw^bEPg@XZjRkl7^f1xauIXT6A;xj}GDE#4AlJi#UG~bQ2ruov>iy(va*!Dp9Mi5}{ z5s(MUNkcCnKU)iw>VK#k?q7U~DoeKq93$qAh)1L>+6Gbj?GMPNDvuZ342c6n2c%xg zxR`GgGxzBZq^e6ffrEJ_UT)P3-~wWiGav)ZLRWz>*r%E>c8}o$Vpd}Kn&07fE`M`V zNuAtwWTx<-@Z>-8_kHGh7|;BbtPZOd%oCMhEla_La$jZia%_wRZUOpdQ9cdTzz(+; zp8d0+Q|A06knm5`FzgT9`X_7jU(|DqFokmgw==DqAdHv|sfP0pRgycmSO(*-*%zT;e} z43Z;Q)K-r`G6)zT(B2{0V0mM? z_c`HQu>WR3^e`=LK%~bHzEwMG1=0__F-!W4Q-#vgOMmSKZU4K(m@?^^86{eiQR2>! z;I9zpeUTC=2xt%r;WJDADDVW|M-QRCtM$fAR2qQv%|U=hVx8iK%Vk(ovCklVWlK6& zFsxg9VxK{}JO`}pZIlME_9C0ie-6Umf^eqhF?P4KoEyhXG+cBU z2fctFv288GbHZr^FSDtoCsJu=%GlW=_3!kBny!ZcxITjo@&^x60marv2WonR4n2J` zI^@IWnD;unLsO(f@HovgCG&Ja071HiC0B+L7<1Z6^bMWYT{AFVkuw=0B(I%~L&JjY0L8?5n0P@G zJq>HE=eUMYJsj6}VtlKxbv5I=hy5U?-PZ+eVKbWT3uPGhS;W1-=%f{lj-5yt9ed}D zj!E2!aFno51LrxK!TbtwsgM$J9$qL{7l`tW1w5HEb28;QJ11M7b8mAU`l|D+&PZ{3z~;$@T!E2yZ${Hy zs&0A$BC@=Nwh-SQxrOJ*MdxwugH>U3pGwD_)Nm0Se*4`j#~g3?&gvWHbWIXKKr0=Y zozn#~;|uiyGN*eQ)*wHJ)(zSwe5RyX;AtDoNi#3mo?IY`CzmLbE66h^XCEiE?d+WG z@|>BoL7re4oCZ+zER+>BF42NaPW73wFsB1vfVo5q&^@Y^5h*HkF?Wz6qz(V5hA@)Ev166LU|!II0lJ2 ziF=tmq15Ly(yrXM>c?8XNMl4>gVj#Dk4>*U5miZ^Vh{u;;Y(>bnN6BWUygYvpWlq9 zCwLFW6^Oh>`b{x|h5Llt7eQ!MQeV62DU_*d<&iyJby_0NhnbNFljNRO5W5lP^~ct#D;DpM^$(9}If+`bu@{F|w48xl(5V((7>JC`h&FQS^Ovm2^2a_Y zYU2;zeHb1&MSJ`ucY_)1jCrly-O{4lgxtm9+rMN*%VN|8-VYTPI}6XbtfJ$@nfo=A z=;c|~r)431B0TpEg0Rp7WaKhDtzP&e768gI0!|=C0cx<>yr#rFb#7^HW)tb)qUiFeL^EDFhLq9hYB1eN<=w&t8(TZjFF8JJ6T>t3mUz? zQ(a#?5E~de0{#IOs!m-9{4>}&L3Xe9*!>tVj{Gp>7n|^`d5pCoPW9OZ~f7o7@ukB&q>v5#| z){kQ_tA46W=>ygdtc5u;Rn)&jla^j|N+9ww+w;dhR9iO4{x!NouP=&}#O*XKbP?TS z-fdAbAgH}LTcre6Q3LfVMeooy>uQ{@=JQfK1K}yy1Y}}ngbNOVbS3g=&%UTZJE$J{>@WlrEz~kXwkO!7CA$Eo#ik&|j*_R5716~>e22$e>CemvVzZre1v0&o z=S-oor09qF4!LbRdc+E4JYWElpJK69KNAW1!UGCNO+_TW5vxoD`_XM!PH%alw{x*7 zsR>kEp0myFLCf=j^lwSFIH0ml~YSvuyOj8li$Ny(Z) zRoUFUy2N{8B^eociEL1sn{mtnNf30~2ia4`vQBe1105&vq6_<=J(-s!KyEe_F!idYT2h}^I{BYBplHVcnuR*W#IFX%Hq7gpzTJgg`2CyD>rl_dDBITH8cxX3>oW#g28!bhO|<*!#s`8}m4 z#mlHWP{R5h-IfkG_$EY^z{8Xq`5$vcCd6ra;!J`y`Qj$G{Qn{4|El{D7sK}=w=kU~ z`QOEUs)9q(7T|Way<&NlFo?H(NA+$0H@5&}0$EsMiCcgf*n#3B5SsV`N+{T4b^t4K z$bLPg|1diMA+w>Q>dV^j0}A3Jhe+P1*>bVKCz8t^o{Uyn5Ij~?LWx~ot z{-zN5zo*C#1!83)|7@cKbEJM|O(VjAjb*T-!C4qe1!@26eClgT2OiM&7WG3b1Sg?0VR z6P(97BJH;Lv6Yc5vDNB&_;U;j7qy#2XXjCa!YkU@LVq`Z69!n0r%%iK7;DVC4kda+-fvgAyl;jH4Cq2wCW}Yh{Qn038mlIy z{t)z^UtoeaF+|a{)!YIk%Kz9n2v3Au-~QDfApd{SCs_%$BlblFo&dR@A_h$iAJzeH zF#7-+vm@9(VB1MOUq_fA2ZsKjTO;-XCzg>hEEMGObzdmBIw6|^3GtLUI@aV)Rf`AA zNv`jU^w>>k`O^1NN&r>{(rrNjoHpj|@goR)3_(~;&3H<=(k&@=0cY7j;4Xkzwuifb z`b2ahk6s_fP@A*`@P)pB17ck?g(124v9IJ0$p5~`T+08x*hgv$9MU0_y5)ajyOIC7 z03iQwBUjQ3k%CY;%L*QxqF#jjojk49N!SZi_?Rvmgfj<*mu^O_xPvRhGyOJ*Vgthy zvId67W?MH=E(_O!jUq1>qG5xQ!!?WG(t(pXdAN@{LV*odid#Skxa%=i3K(CZ`GS_+ z(^l)RW8PWcqr2cyi#Q=9`yaI8YFVKLS)6~~ip|L4N4ObD4$eC=?nM3FT9D)Ri%E_v zccR8-WV35CvK3{V&4}$cO=(`bBG>qd|1|d!+W|!G8a!8)<48eWa{U?XaKbhu58DuZ zbEOd0a^xTBhyT?`Pht5U{(5&g>tH6P$qocsVJagyb)?D^aO3hA5qPMiK(+9l+P#{< z3~GIR$>G|b;PY8r>kG|3MC+_&U+@kRSX#twaMw(!WtWKJ7d1-Iv=_C77+y46id}*5 zyljEW80&se$3%Wj{YItAnm{C{T&p!2x2c?RCn{^WT@%U*^1VnvW0UU(+2LemjgW6S z%OC+qK)OkF;_!0QA7V7=k7%0PpR+v${Q-i;zJQGQPxy5hdHfdS6D)kT1$>s{8hA_@ zi4swPq!Gfu{LZs~8ws6_MKGnHIMiRT2#Hnj37+r(&ntpuvfuqscjJZnj9qFpl2{5P z>f$G<%+QEWqqyD`!VOLp9mS3Z)3P1Sa!K#QGkW|;=ub5!+4~$Dvl6rz6EP&S)nPdt zR!Bv>3@k;3LE`laiI<0TBr6WzO7s^S{j2sse}TJS^=!KIRYygC@%$__?2mn{PA#YY zVrM1vix?2|Hrv9TCAEsOC?Mx@QBZRQLpt>*n2TAQ3m1BCMh=9A6!gB?lZf8e0lj_U zVbFVBAUOWgX~+xdMih>vTi{qPg)uv@BC+1kSL)nr;#RBa2h(=h`>=Mz0UBy#ynbjm0tOI}QHc7p8Jfn>!#_IQR}^p7S>%vpAhi zd(4H*;!v?2qardt|9c8#hPZ?Md-eE?3tpc`SCjD>jDRRcvZLX1t{FdkR0%0hX*vi6 z4mD!3HZUU=jy#hXu|E{YWnc{0UV2gEK*Yh{Yu+;WOU;{$^K!;w-kUa)cx*{VT~F{l z3e7;8cGw13ZSW!|hV~-XBs)^Z3559xCa3%?F%Zqd7i&)=^4&FAG4I%~4U1&Y$s!k! zOvC?m6IkP8_q+XHOJF5wQ(8VSq$U*FZmiJNt$rKq@q~rd`@Wt`6E;u!bIqlxH&M
    !pB$B6OJ8vr=N_kJm6}z)z&n{ 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

    XSU*NAY`W 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

    0jeby@W7<*wpi_pMW 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�`Zs8o?W9DcXCib2P) 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

    `nNhwd%v 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

    U_VV~yIP$AYw$)d6IMb_HeV>pj{{Ogp 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 z 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

    LcMOJ?g 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'vcx{%!iPgM98G|{3AqSe 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 @Yh3FHRGyvLXulfe-0daN?zVrN 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

    Mt!?mR?($tzv9* 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%0DvgYZ3GGf_BfM5Su-15CTYW13>Xi0uCS*| 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 literal 4883472 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

    w$FoPJVzcJB6- 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≺8LCcqnKlDK_w0_0-sxWj?&hRyUw1s}c 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
    n3Y`a8b*P7tNqlps44y_^>iNUu@TF-D^{ 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

    7I0;upV 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

    m1(lNrqW@u@*F&0xRrdOgbPHLYTz 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 }Ioot9rG@NZnx_(Pn=vTar^VI>Dd>z8-R(Ae~s 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�OtO&fZ?WGR^5^Wkf=gj2Pi+C(-BBWX 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

    C84ibU9mch&2t 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

    gx!2pT27Qu~284_Io`|6<&FzUAtwL5W= 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�D767y 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

    #v@JLDU7n%@Dbx)&&{P9 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 z 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

    Keq`e+E~AmQ7_&!`jW*5CfiSePxl@UHiq|E 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

    )DAj(1J5TYDv4kt=S(}^gZO(s#YOjn|GGu?@j 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

    AIa-t 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

    8b8@bZY*DRjoX#pa-fz`J`R29 zB?O}Yp!Nkw5;>_Y1<~{hUfH`q!Q#oQ>dP{|0Qm31PuimN)z_PTY018uojYb$LiG(9 zc*BECarYl6FV}Y{m-tGHHf7M!a)onL*63u^C+v&pj&l+H%iPxu#ZcZyBARiI=E<3g z&#`QsLC#L1L4CxKvdO3>f|%O#hvnRKJCXBJ`I9y!yRD>zb}eewKGa;Qt(S|G|8Nu+ z6{Wh#_EauHPL|*h(GhJ#JF3}EE^snl{_Kk^tY*1fnW`0Z7fHmhg``ZW^oor#pTZg7 zMhtRhswC(i-2-r{lQ@r)lc?Vx`UJzNCt>RvBU%|%4*O1`a((C`E9I6{E3lbU^Mdgdj7p6WgJ8nVNp4VTqqI_wyfWR3qG&@BJj6RL4nO;=hZYt!Q%I}(*xniZ>)#C6acZ{tE?+Mr! z?mp_i9fSjWG(wI5mqs|{7xv0NF11r%;J(OlCHfW4t} za4o(FMS2mylAG)$f`M^lMLUz$oVpj9f1(o{;ta(ZXTpMb zTBP*lN3O=(jH^M>Wvls+=<2iX+KT4vbu;$XxV?39<+OdxcRFV}_QpH*#`YbY?s)ux zp5)p-&;nv|nXA`wz`?^X2F3G63lL}!90Z^|-L$73xlF$V0F*KEHo?jCGNdWfUA4Rz ze--nJ>gbmdwVWv+raIJ>S=s(1{T%u?fJ5S| z4gCt@pb-IDHFS=`$sqJ77OlW2RFBH;W;^(}P-6;%3&Q*~ZJ2tf3sD!8G+OXX4LUP` z2oP5fy{vq`x#d6}6{T?Cv?wqk_Mq-&%t#o;fEX0P*aj(2VxS8lp>E)hG9Lke$_}bSA`O2@Qu#cX|Z%v3v;HBmZOTzBPDlV_)jH;rZ8%eGIr zV#RB&cEpR<#Ix7NOlv<>UTUd#%o|9iJ!Y+$%PE;y^-9xBbw|9qV>)O3oULNwnOAqs zH1@>+V@fCOW1q^>f*IAkwjQJErq?PG|4DSLeKPFqTt&ud40?CM~5+ z5A+}m_ld4LD`u^DkfUU_mgW>+c6_DrON}u{`&52M%-W%}wT_nCri~S|+xq{_zWe6! z%jH+jOqzaCye?+nJ(dYT`Dv@8;rAbAlj6rX$pB0KQD=VNDxD7{DfQu=Fg^Prr~FTC zNmSr)(?>KiRH|P@lRD}nT0a@l$>DVOqX%Bb078!<=BpuO-aVqe4rN*&JrZe8jgj_4vL^n{*20op6A!v!NKRm~^W z$S`1xXcrN0Qi)gI$+ks-YV*TX|0!x=RVe}{btIzOM{0KQL;0M`EIIMXFEDe8R7F&6{4@L8c~$kc^Q;+WY{v;l{=5lrjHM&*hntQ$we9@=a8zYbnlOF< zc(q<#ZN0}6^!h^{kBd=T-`T-?ee#euz_&E=;@LrnJmGfAJUHc&%(wpegz?9sxbj9^ zS0nEW2f_0^`$wn^!_F_>!v7z&ZHuT~ndb4)qep?@C~R*9 zA@2=&1L5Q0AqiwCDaroR;7{^LRfXj8fG6!cmELLz7~}T_lEQp6J(i12!4wHNujT=N zAaL4S7#I?Vi}r(@E?JrKxpfs>FDTza*As9&)7C~cS{n=2MFe7YsoUi&M?`qf8k*V4Zw`=#@s`{6v?>D`^Vybpeyk;P2 zgE$(v;X-5r9@eF@IBZ+Aduds7T2;3YHG0CJMnNfRVKsExL!%J1q3CK+=9%Lv>1hP0 zkue^aJ2j1s-{8e7Ew)uMCl*lDSZQGKZsm(02n3nE|OO;liM24ZJk^n&)qb-eJ;On zd|25yx^uSPIlA*+cENLJN4L&ZHe79=ly9A#u6*o6V$(;L$4#YU=JB<&7Tbg=ZsF(h zN@EqPCVi6!ZaRP1{f6%KZMQn!I2Cgb#10*gm7SQ%^T(|IyO#X%vvEu1oXvi@=!$d7 z);QKPuhC`J&Q{dSRIG?steC238Ml03A~~fG45YqovS+5PC*Ia`D>7BLf8088;C4>U z-JG&lv{BgH*kN(HW?+gRi02H9TjvTZW7TVK=HJxcJoH29jked%-8vQ9BgO`3Oq620 zJXJUp%Ne@2Xy)1KhOwO!1-Gr0^G=(7`Fta>+GDz+j~t(7`J&{F#Z}0 zpB58(Fbzc+BG3D<{eZHuv##u?h-Jp;x9S$5eWc0+bt>mOt1_mc;Cs9 zWqeZ&ULuAOO++(Vsg!qADz`W0E4w=~bQ~Bf%G10}Bb#she6zc#5NWv|J-5KM0CkTE4O+p zm+2$=^VtjbR)nA(3f8FhdeUA6F6k9rAI&o)xq~c9Ao!W`sXkYmfzDy!4gyt9F!vUK zgn_Y5U^aA0MzFpNSYvkwK=IIfQ2sfxM}!Qp$Mg_;?wU$trkZ>Jv6~#v_*6@m*K)0-CC;W&cUC;ZTrh;|ALPSadcJs zpih#&n0pfe>IV7_062>a-2N8UE@k<{tfs$090YG6lb?kQFxi%3ax^J~e}cpSsl*U)4KR))zNz{iQMU zQtj-nz0i1h_toCXEjL|LW!r9>w$E!xe$nV@+MsOPo})ZdW!An1?)hL@b#~r@{{)YA zMEPoiO?jh=hZCxFz417bk7^h=}w?+x%k!!ChjTn2|;Ff+j6r!PUxaQ&nDJi@@xf_Eojgg}ko z*mg}Gm@aT$T{ctD9JlRC+7ksu9D9QR@n8{!Yk;o?AuyuCo=I8gn?A>y&qFgjdEseH zU5VJ?{S^2uiUB_OfEbhzQ{K4im1WaL$6U4zro0)Nw(XkA-W4mL)e);bf}*3ji2xC(m3gRFgRFYFW`)f3|J*- z2sM(xq!~em=0^M8dt4L4Ui>b?x`3aCN=5C1a?ganP}#A+u2+B}7&`Exz(ju|w&Gg@ z-H!mT5jD34bJz;(D8)oapTw%w2-Yay-d`ELfY~fo1~8nPdJ0dy7#)E=OK})>GGxD~ zXE8n>qSFlJ8L|Tt+66^l@GqHwq6~Dl!~vc9N0envpym$)OOK@P7d9Sl#lj-#UK}q&y?-8R|3h=A zeKh_3VC1rUYoQ<8t#5&Gt!|RKnK%X8%;7>cVhfy9pY4+DT=eX#Q&moS`_!#j%#Wq? zCv1HWzZt@lXcS(@9!34qzVtV^_Fah#k7r;Ao~A{37(^MRlL(F?cntwYb`lm}I1m7b z5_~R+>aZqzQH{%c%tukRQnZ{B8!~+Aqh`Q=jAAqhyR%nLG|{OEYs}1r3y0xV%FN1O z@KA^c1SI9k;}ucWEkFk$VLT&xPf>Az=0Qn)5lg+e`9tW;AyMk>QK@=-@IM+-^)B#S zX*g9oZ;|c%nETvmFgd1Qz}*K`eOc_J?R062tB- zWTX0!&))DiU~wEl6#`~dbYZR^!Q%+_Ab1*q2SCDb+6!K$#Gdrkm&s9(AoYPzjn67r z`~m`WkC+Rh+K$s$M9YwwWX$kTwIjP5*~P?en$3vPfWQghW7B$wcMJu@P6}25{v%Qc z+-UP!j^o}U)$fuG*>94JH;MI4l6i;lZdRJH9jCvoaae_Bj#8i>)ai4?2g+W zi;-OAH;3x0I=6DMtxv^H1g19xW5gCKY@Z^*2L>%yJK=voAW>S}$MUkd_4jL^;<&o| zo3*W+{ezR7^7roYXc^Z!Yb~AEVp`M6(!2VG5A{&KuO*tCc@5?|^<2sQoC0naH{YDe z<*^=^HZ{*{F>T+brhAUE^sc`2z8>o59i*;dwx)jGV&nF4tQThP+G^(Yn3*?hBrv&= rPV}cr* diff --git a/Backend/venv/lib/python3.12/site-packages/pydantic/_internal/__pycache__/_git.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/pydantic/_internal/__pycache__/_git.cpython-312.pyc deleted file mode 100644 index d17fa102af9538df688394b587c9b821a895942c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1516 zcmah}&2Jk;6rcUDy~(5vBsCuaktIdNE7e}5y`U(f-!yQ5Na>|6Vzu6x*z2r!Rx`6s zZ1oT!E}S?9aYCG^g2b7>flEv(g|32xR5IJY_r0|7V zFOmsTgtbH_NeNb~XE?auz8gwAm0=Xhkc!K;Pgo);vDZ24*qvU|dso=a(-6DTk}?rX zt_$W?+NcGr<0d`XVzI06ZX;q1x8n;*`OpBkTGDfB&(zZ$EyI2sGwI8a#o}Ywo2$NT z1)B1X1cF8|#z8(r?bF^7h-kYbYg^&Z$nI#rh8(?r^+RFH7KK2%G`2~|X&@Qz*aH7wjS*Q_Yl~N05lUK30N^*N00;4783wKw z#=u_eN3J&{FTf-KPZ2JOQ-TX=mge#0?GIM?F&($F6^E zn`q0pk2W=@(0}WeAKRPM=4m|2jI`+%4N~bhB6=+|AlQDfT5ZuNx%Yu%W|JaqB%B3Q zh-@lo(O|=4sZ3It&D`=;=2nN!JDf9~l|EU^l}CtA!8^F>r_5^kU8-2*7hroHhPV#X zHhOLr3*|#==D?aCSo7bOzqj`6#mCl_U#DmPKE&k%Tp8fX3#1jwPo^&%;+e7f+yK+D zcnJ>q{M9-1&Fqr#qqSuGq%9f$Dd!W~V?gfw59v*y{X6X;`a$0vrKDYe&&~)j#%XDn z&bVNEs`$-*?Jku$$7?G$s*5&T&o?V~ZroP7pLe$^E2u^2iJD__MNNN#(=L=I7qnlh zRz-_(nVIS<=vX7zB>h4v*Q@UVd>Y_fk&qP$4H%(WK}a4Z+ydLMONI%U8dh*OR87ZK z@xHDQmtopQe<-3C26*9@iy!T+u06*04)B8kez5mxu#d?BZVzyKA4hv;l&2K#RV~03 zw^@->nesR@8;nJc&fid;H(@%B%B`6JPje=+lIIZ?cwRQ?dFv^BOg)dQ-$))!R#N>A zy_z4N_gh{w`J4Hyf}NDrv9;V`B#r3%{B3Zkh7wAF;?T4wDESjDJVh`6hF&`=>Y8&j PX=&xZUeUFVmLKsC^@C|B diff --git a/Backend/venv/lib/python3.12/site-packages/pydantic/_internal/__pycache__/_import_utils.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/pydantic/_internal/__pycache__/_import_utils.cpython-312.pyc deleted file mode 100644 index 25ab6fd89243274713bdeedfc8e56622ad19dabf..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 829 zcmbVKJCD;q5Z?7GaUO7>1Mz515siz)f@={)j)OZPA|$TC1(wg=Bv#hD)_QXy0wfB4 z0S)c7Cw>YIw3Z@)5CvTz-BrwPYzaZfN;{s}Z}yv+Z~d{`Z6R3CZ}ii57@=<}sFzha z>l~c-C_xFPD8m89$~UNynSqHBF+~SrlUkV_*c!8_lQn_{U^uZ!GjXm1!`Mg~Z>$QR|c>Od=zgvT&;n5nr%7us=Q z7i};h+FnD5L=((^3DAIxAi%}CxxrY8TWCU|z>N-~1Mc75=~NhI%*7>u zw^VlBoww;uT!6!o*Dl@hoW+uJS_t(nr6U(P$S2gVC)A~l@`^*(E-gqPdTLF6hBTG# zr}qBAf2v!$>Tf$G!Giz* diff --git a/Backend/venv/lib/python3.12/site-packages/pydantic/_internal/__pycache__/_internal_dataclass.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/pydantic/_internal/__pycache__/_internal_dataclass.cpython-312.pyc index 710cf96b84c71bace7cb87b8acfd30637623f245..e9001b19ac28ef4b886053be5657d45ea280aa19 100644 GIT binary patch delta 311 zcmYk0KT88a5XEQzTp}UCkU|gyt%PfAL@czCSX*gxh|7{a!@4b4`3gBC=y$TP zuv>x(R@VuB0e2yS1M}V+_zk>wx@5DLUatdT4u<>sHTYLN{)Vl>&s7LdZ~+PwDIkkZ z3o@k{owAG($XU*FdQCS2mnVuHM~9p4>i?f9KDh+2iAq#UlWf+mh=wd^+HN9tmQv47 zOy&8h9y#Av(#cUF5yj+Q+A*fIiLIJg+9z0)4$spy&#*$@a@DOiV;cd>Bf!vEzb=F{ zrgYNj(x4E&dzV`bS!h$&i`_vWNmx7#^34b#OXz&S*5_bjj?csSL%sI~JC8?XoA(3p E3(*xx`2YX_ delta 155 zcmcb^e2*#XG%qg~0}#YX>1Iv<(vLwL7+``jK3f18(-~42QW$d>q8L&cvS2bWl|VX$ zDLaONp@=nwIfW&YF^Z{@F_QsAYO=lrsq&k+UX+db7ISfB@x)IHMR|Zij6hth1|&W( SGcq#XX5gB`YXdbw`kqj9s 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 literal 14253 zcmbt*dvqJuncoav1VMlRA0R-A4^Sc{f}%)~deeGAd`OfiQkE#&f*ufr8ImCJpl61X z$bcKJldVZdt?BGG*4Fi@9H)(ZoSZV-wBhMrPMdS;oc5dyM7cudD7)M?IotflSZ7Z z=56LO!!aBiW8!R(Whrck8REvEQ4Jeornot1R>P*4C2k2?)UY{L6t@Pg@#0{y`fZ8X z;w8b7xIJiBzl&mycxkXS?hHEPuAnPk7A#Zat%xrVRv=u=*#4SG2TXf;>LImZpbnsJ76z0U@>ab@EyzYU>Ut{mxg;|yQ(KFfRGXSs@R zvRoy8Zv3k7^L&#H*5}iM4f!x%jT(HLz8g1vZ_j@RcNB!1vSF&D8R1&AU#Ia9+{t;l z>Tv_V6KT6PrM2+hpdY{1Y&>`l?k)(o6@>R7Upsys`0eFt(9=#xfco9V)du%*bzD8y z!1=hwF*CpK+wAu(!TsF!-~j`}8~KADvf3C24{JR*d`0U^A?07td&n~Pye8(}b`!$|xbCl;g2%a2+zWW0;H_K_cl7I~ z53>b>C%Ink7*YaUA9oz@Q(QlH0`H!glm64crd)njDG4VMNhvHvlL?VNIes)e9h10d zM8c6 z#z11mZ&GYMNrAtFtnsi?abboFC!}bkXIhk!@jgLF3X1cka4gEH&1(_mQZh6lCKJ?X zXlh0pPbP@12M!HS6i;&eaSPZJpfQYM&kj~-Jc;h) zzR=Ei!58GAI4DO*;9s4N3OuJcRsMNSlPE7@q>RLZ`PK}2pctox*z;1g!+WUU9(*gN zSQL$zrD@0jxp@+$keuZcYH*BCKvATm;I}B|(O5DpDaL3*QcM^aUNK40IIk2F<@lHs zR;(0FpR*ODX;;yBn-3LH;QDo?zGryo(#XZYz|hF0(8zEoFgQ5;a$j%g67=hQ;F6ye zcB?udv}>;pdKrYhcnO_q6dG1FSm@Gn?9*QR>17fQ;3XU+a+t^=kXf5FGsSazsF-3V zLC2s^W>xN}x{dPf0YRkcRx(M6rs?S@=VxafvGCnJNnsCoSKCxfJcbq-in60f!ALR= z!QGwRNn*UJO7W`R;Wl6Po21a*-hLe-sEJ@gN(LEsAM7VwL5z^4xW8xqp7g_!m8O3el&emri%vduHa=)vbvDV?rc8-_{>(EJVK$7684){ZWPXdl zIfljPa4eh+W{#CGV%nn{>p4S;!9s9@Vdjhyl~kXUF~v^gMoN!mm=CifDwL#*eQ;pD zg8IH?c-!z#%x1K6uW3UKhFtF5DdR+LwDYxnz6Pm8PfZzhEt)fqF)3pxr$H&>x7fGg zK;65V3*9s^GloOVy&n9UzHhw4`i;H$HWE?%N&=Ja)8Gl&3ZAX?$35;?+>s;#&9NO)RAwQ%y2l!yf=9+iCA;xYat5l(2kT0onl zf)~Rjc!<;xq5Xrfjfk5Fd5M0ja27Aca2n3+X*jckcn|W5?R?gu9UfIInq9y8fs z{?!nQXlt}KFRMdiyc7ycb>cFQ_rHCu!;s5VkKQ%HN&`P72>@H+Fl`}L~VJ-K;h;EbFp z#>NeE#<+3L#4=by$w}JugmI(wNV_WJu;9dEejiWl8dZf3!WDwWFgGF;K3`yJ+8gWl?EY(D3r zo7$bTEqXZXZH(%on=77dp;478^zw`79cQC_`XW!?w9ibj5d#aiY|)dlp>!2Wm#C#n zP@i25SyIKw?V#KVGldu36uuW)bf=0?=1eiXOZ^|WW5K=P88vXFU$@Vdq^uL9V4EI^ z6j6O9NG~@%sgiY8gp0TbG(H*dV)dHQm5fB!IZg zl_u;3ac;y_Ak!p*|_2Hol{5VXsrUe$TPc+Z}rD{G0Pcb7MW{ zOgXpAqL)l}gQeJ*i?nN0dd1lk=)t;QFFGdXAJ68snk7OYA)n zGN@MNQkyE~YNi>%`{lh)nF{-d8va7srE|nVzu#fF+C>j&-MeO;zt>n3ld`}y{s+uK zM)K?V7jqjE^s!9Zt;g$g5V7UZjZ3NWlscksKzFv1)uLN(X|5twG5_UrGq2xYKDHIm zP}(f2&my#1*XC$$dUA!J>aBB3&~A9s^NxXQc-H_8_q|c|k8_!8!OAr+Fbh?%7mctNm5HL<_jdaJNA#p} zgLM9Z#kK-kU=_Bd*fBO`odu6`)`B{^H!+RRlvN*BY)@HuFgwFfVA2CqQ&^;R7XZuh zO4sOZE@@?|)!9K(j6ZkMU-QV;SAxpU~--$}&g#-DAjBi_Z?0iXmO!fA{7~g`;=EZ5CnQ>ml zExT#l!Udjh)=`CM;VQ>y6rg8eax5bll!!hi=HV>p8p2ZxqPOR4hDU<)TtNf)rKV2xV1ED@B?$5ft{WVz>>rKHs2HqDfgp zE@-aO3~AQuEx0+GKJjYXvy0=bj316p1UPt$k!?MGwDNH``Q zZ~uR&>Q`Vx{4%`@v3ds*Gjy$uh{@02bD*1e3kddd2`&peEG*QboFtZv=Tci4%jeDS^dWlOs8P}+0oY5lHDefLWDN}Jptl&{{DgJC&*d!1qKvONa8?y$Y| z>NWJytFGVh%xGw+S!WE@HQ1SKt6Mtr_v>yn@LZ&`!LL~z%s(v-*o@!m2$+pOHk%Pt zk>%M^I*A}?S3`!B68g@`PzO{i)4KoPc6`vW(zx1sRIc3h^KI=<>pL^G?V0+PhxKyH;T4Nqd*Yed zNLpcpR#=%@Xoa@dER@gLq&7qOGM*oRYlX4sc(Leked%Iza-Zl-C8t$i!e^ykZBg8)P6%mY=22R!b=MM zS=8cXECgp%Cr3~$nm?o#`9RkRt%9%VRr%{Rh@vEfp`_D57(3w_rCujOW1v(;lCc;c zk+OKIZi5sv5aPHf(6B2uaFSg=mCCJjMzJ6k#|erdA}S4uq-xwkv~J~FR#lEhL$Trf zB|F)b^1;5L(<5g>1qV|KoH?xmb*0;)2Ej^P8G)RrM+=I*&|}aRjUeSHLJojWf^d$$ zigWWyF+vf@!eibbHHB1RnzGm<<2V?~^5*xdvq=b3GEM%x=oCkG1<*{5QmVQ%IgDBH z7S>a+5{OFqh7?iar$lw=Hys^@MIoUw6iwj#PZw5M;g`DlC}psB`IRX&$i`PdKQzdK(~xJ{F&wkt%?}cEf6TBIHxx1q!3~xgs&2bgNTGh+@z&%^Knvi{C=Zp~5g=GDck-?%>C|Fo%lWDbv<2o2u68TA$SIP1o&Rt?PQmTx88jHf^n5ur2jvO5Bg@ zUPza`@U*;EZs=O>UT%}?POO%nll zv|-=!*^ewA-A$jou-fqALjTg?w7oV{QT@hwtZH`8{f=~rKjW;vf9;Xe|8R2Uf z91TzG&1rk{Q&;&DS6ABAm8m@Olk)#k_v5;BfR`^`lW#=i7deEn#Fmx+Z==akx^81i zz4EqwX~#Zr^SG`f?d-@jG%wjRRofpNOjota?OeKw%k1b_wx)L+SsGk7GM*iJ%A+c7 zt!eLaRl4c0>}t$ZG(EIDs%XztHp~7ak1CI>#6CWjK7K_G-b^14%lzb{%&{Cp3a3cnZ1X9WdDI(K6Y_+?FLw<7&#ds$h+)O5f=Jtdyx} zkQt$FG!d-JP{UzHm=SDjt5wQH@UZ2tV`mwZ~>U;)@? zL)cVpeWE_cL~)7>AXq!KeX5??=5`z@qePyJ`sj|7PzyM(NRQ3Gw?2{8cN_pcJM!>! z{wx;YmMMP{ukULRYo`57%A7LM-e%4sIrWxsl5Ej=!5+$T6bbjP=bbBc($6LY0I^Vs_n?-M0BgQCT{_8ba=)DLad(lJ=aMO7MG@FCy1@@jd zRg|*+x#3=|iHR8JtaG`&8YK7M0GW{(Ha&Tskms)fE3tntZzTo1S?Ae%#o5*!CTPPP zam=O+qu7%Y^se!9XG7R;2wS04m$3bl3PC6l$WsD4Lv63G`!*_~qXPhWG)g~H`ywPo z{G$%ewJRuuGe~ePfbjU}+={%=Etm@X=s21ZznH!M-vf3PV@u?Z!T;z3_N^Vqe8t-N z`qsH{vM#lBW>41lcOgL6b2c8Yw|r&Sn6#_g*V*RVl|NWV#Qv_iHs960SS&gvM#by- zGkN`-U139hhkCNDdVT^O3n`YYuVxK}Xaqu`yrU@mIc31{yEuI-5(|r>V!9oMtGu8_ z<3wJNMB2j(-#~=FSUY+*;?z(n761T76Y#S%U-3O;5WY=>d?kgQRJUp(os;F9B+WH? zoiY&_p)CY1vNH3`XFHjS)`z=S%MZ?D)2FX;&W@%FCACHpdV z=bL92&o0es2kxKPcmJ}n`N70$W2ao&xsZH3JiaaY%EniM0R3sz30=bM?K- z2W1ZeAD8{C_NTS-OIJP_2;OJ!cmAbm)pPX|`?WQ@`-#04&eQ$iC-#>0ZQy!+J5%TT zR|9`J@Xom>wj*!#E(Mleec1WIv4zfs@Zx^ic4WRMZ99@FDP1aFI4+y2fB($Mc(1X) ze`aS&x>XnRKOL;@-DdyKE;Hy)Ot#)e%TJtU&`54!fD~auw8e!y&9~_e03^Ek(G6pP zdCnQVS(xcLW6CIW6u?$6JHY92^11aA0|RS{7{w(kpH6UYxna85Iv*pX# zG6JwSf}xZNDvQ0327sOiI!MJ6J~4coE*HdbKR`XPj{q9P9XSHgsa6r^x50(dzG_Nmx1VbOr;#a!K4bY8m;Q6SkQszp&sRnR%N2^D^bmV#s{b0x2H?n=1>2;sPt*6CsTTCWpX9-@u`ocpUwPqMvjU9{fZ=yjmy_>$k)Q@ z;H^hjq}AbRdFZxmzXLbaX#?h0Y{UM->iqrxxFV^n{Kyt?mJbPkhSsvzlb$;O+^N^h zuHxGAb>VAB68=4<8`SWulPvL78a&)m#SK;9AOv7(Fh-a{G_SS1Wd%nvDIc8zWm{2e z)beESd#bgfzBb%+o4MYmE~+XA*Kuis@WR>Bjah^rP-LE4;zjr?YMPukwQj|vHrcD# zLO?QbJq}=@wh-VBwThr%Gc5|_peoLSnD+3kh(IHy!7at=wlZJsY5!vQt+^ z`YvsVat#h#8rcw2HgfsGAnvf|?;fL~zKwZYz2I*{7We7Cp}vdiAxmM&%1hw5Z>VQu zeP#WF!-0+ED|-8S2F?ctH&p7x&F2jfu2aLq8?(4BUmob)kjIUqp1#n?!1;}Bx+$i& zZ*U~AA-C&u8LI~auY_<`qz%Hx%zcphhM0<;;q#EzD;pxqE)NY14{eBYUcR`I@3N7; zS4OfoxkL1y1}-V?oUF79-r49%eWVLxHAAGrea?`6wU<;HYJQ4z1!}HeoEDWL4gV4q zHX{5RQpD3l=q{mpZAk-u$h%RkknnX1ogvZ>^4xkhR)ZzDE#qmDtGXV{g2+rorpyPNV&1WCvQ`)}X3x42?=^GDx*2acJBTTw zkd-kz*NZ7+qfiNj?2Nf|-9e#J#$1crQx%4J=XyEg-X~YJ$dz3W4}!={*;>Uh*}Y4y zIQDQS$np^onQ>(*kE_{^Q?}#F10cwoDF<}EQ!YRHunJ_^4>Iq}RCKBpbW#QAh%4hg zDA%;f-h&TsgUF0K<2fu>@0LA>A4WlBrgE*aN3QbAl|2v7gRJy}Q0<-_0Gs8iv-05q zqUe8l08qVL9(cG1WCbk;sJ&`xM5SxqLvqa?*?VZ&0zyrFE~27KcDKkC)L#Tquy(u5 zRA(!xszobn?#87dwEwB0NSBe?+3JP|o`=oL+g2uJ?+tnIdK#2Ea{)d0+k=6RcB~%k zmzjFmw{MjpgvjESt9HqzmW;XTzD+jm$e7(rGqR~M|6M5q>N4%lC)C^@Qor>Al}qEY zsUc&ok!$;8Q$L1Uc8mdaA-dx*(HDk^zIdHzXfzFK8sE@BhiuxLZ$Re&Tz1K(efb3M z{WjUOD`VE)>wb4XYmgbVd+HhEW)17@Ox>YR83Ws$HhJgIEqS1?pE9hudx6bZcRqME zZS_B~?oC_wE_*()9{G(CDeFe$er7YWj%W5}wr>3b%NR;NHI%cKXGVn9)lh5Hz?MII R#oWr)d=_L~tWBL<{}=h#R6+m% diff --git a/Backend/venv/lib/python3.12/site-packages/pydantic/_internal/__pycache__/_mock_val_ser.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/pydantic/_internal/__pycache__/_mock_val_ser.cpython-312.pyc index d072035991e1438a51f92d7c5d3c7383169fd0b5..6e12c14982e6e42d7d7a791b1890e70344fed0a6 100644 GIT binary patch literal 5716 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 V9xgcV=a2CB7lH6v0OWjC{{f~oz()W8 literal 11111 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 literal 35125 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 diff --git a/Backend/venv/lib/python3.12/site-packages/pydantic/_internal/__pycache__/_namespace_utils.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/pydantic/_internal/__pycache__/_namespace_utils.cpython-312.pyc deleted file mode 100644 index b6c138af3eeeaafcc58d649f0e8fb869d116d09d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12312 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 ON)WFwx`iHgCeJ^faTv7# delta 3492 zcmbUjTTEQn@tobe?0tP5K zLCuLmT@g%j%A5azW6WtFjg;yhTlPuh{i-osIP;)?QqZg&(Re&M6qhx7M=Bndht*grso8quq|BmfifPtf6;_}S7Bttu z*%!M8JC1jCoapWA(TwfMtD3z##jZq|)Gv={!f;ek!&I{kT)ix}$74|i{ zl#D=4l1mbRnkBbn0&0;wk{PH~@=6w!W&SixqPw^ zsM&di$xmJUu`R?;nd-VK2ssB%uNkii6T%dI*EV6C5N?n$$_x`i(hC-zoUctfA>7+I z(uiTk@NU)ojOi||3xEP-%W_eMo2e{p)C^6{8dVscP{BeI#VHozQOomm7yq&4Ij@yD zfXhsXf`E9&QdC(73r)BrUsW{U;2?u&0U91-3IuC#Fl=Hae9cl%LwuXHSwv;!3ZQ>X zku^67mfmi=Gkoj$xz3;W-R)Zn9OOgR9bE%wS3H+K?p$nNd?S7SLgxJFbisQCv(>k@ z&9u*Tt~7RJ8ao!+mm0f2@%AivE~TxP{s~0E^7^RMe#~V4sJ8T&iT~RA-GXx9v0~g4 z?=Qk-Ua>V#?m>nR&=mR1zfetnoJ-aW!;wGeLGrJQs z7uM0O7NCdlK9LM6hDwJ`-S;PnWc-ooGzkmi`}<{ej3pIOeO(q6mBBj_F@jic*>V$8 zBVrVIdO*J=i`iG!H10msp9`{>N{Zt)@k&g6U5rVG*Xa>Rr2wx|W_W+i5R<|NJ*k=* z&5Pib;(0}g2N2c_XuN{IVF?`BlDPfARq6pvk*8+j6YmJKFaN~3BDQA4)^z#a`?22{ z7WV$u{^7*puC(W5+Io_e@jJFBl?~{!1(6=+Y#D9r)ClbHCftet#$HU1@CWv;?XAGf zozFU&iX{gj5cvc0gN`P8n2$OdXxaP^9Xn_P)^{H}3V5A1GQ7xN{spj3!{7x^&2*1g zcYk$a-T7S&^yvH%*C|@7ON@Ff80J&6kHqA-q*v`m#bc4oyPN4r{%7}0K_~kAj{^F( zr<$JO_dI2^j4yf;JGwz*-OwnqURdN#@Ly)=rj)@cpe9b`rL%7EK}3|w#Fn%OsiFLfotj4Is@Y-kt%l5|x>YYV)vlSTsgq`1qNA_xwLcU1YC%)e zW`iBwm;%5e4oUGZ{(@M zmjCnEO=cT`95r)W(as=#>UGFp0`u35`3tD7oN$8V`)@11QdCY``OTuLn%y~hHDOJZ zs71N|U#q{JKPvhKeVOyXE|^AsAE@Zj{Kv*(aW$6g9!u)u5>7kWH=;FeR>9v6`uVNk_Pu(qmeCWUbMRA^;j0GUQ9H5vrmJq7R*D-k#SI^Htu%IJ z8oScL?qy34|2$YPKD7C#J8p-TZPg#RSL%B*^*xKm<@y&MdVJF@-+S{N54RVGeSzg* z{YtPU6KuKPu@v0DY&pPB6dx-tS#eZn9M#J;dsk}OGd1lCRZBJ9%Z?uY)8cN!8Or}w z9DVH!edrHND}4WozbfOen(duqOa9#}{}ir34xExqG~%ULD=eo56N-dOVt=Z9FODLORF1hgV_pIwHKhqaqeMJ%aY&W^>|e3oydXp`R*OR8)#l~=<|vIrtCIx?wa zm*aA_J!7lTJcEPLWHOcgfGaQ)VVliPvw8vPNyG=g**Dj%hY~4iEG{2mDhMF2M41Hy z5u;QiN53GGyPpu}r=)9%bbU(pEs=dsNbw_5_lPt;A_u=9rH_r?&q9^6t#kf4^=|0? z>ACVu)qzZ?ZR+?tu_dAHfmjccvHPd*j%UILKI~ekT2L11e|ahsKCvjL2VO~^J(s=^ xO%FsfeM6b>P(~b{>YMIe5{B2zW?C|BTq`3$zw))wPWmN5yf#in+MjLI{{}KL25kTU diff --git a/Backend/venv/lib/python3.12/site-packages/pydantic/_internal/__pycache__/_schema_gather.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/pydantic/_internal/__pycache__/_schema_gather.cpython-312.pyc deleted file mode 100644 index 33225beb27922bed608711fac6b9999c36d9548b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7701 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 A_W%F@ delta 1568 zcmY*ZOKclO7~Wa$uGijOukE$7UN=tNJd~{SZXqcp1i2L$_2B?*QE?wuav_)Ym%@&g(_C6AMVx3Z3VMPavgOmPtYBQO{?F0#FE4I{J^avyAMxftg3fQ-RMFPI_pc!oC1>Pe!3`ot zuFHLbYbrr*$tm;}`B(1hrVa`;Hah8`*@uZXnm}A*mY7*Y9xEDoTan3+YE-t+**>_= zo+WmcCzq5+U=2|g1Kl)nm7%o@O|9Ewz$bJz5WUE$?fp;pGcWeOp5xsObX@ zeYB>JHuNJk{Ydrb@w$GZ8a&a|jO9c3G`*pvYFg^+vAVXiD(`eNTX-5RxP&B;>*}kJ zM8$Ng)Bs0n8ms^dJXm-a$ZP~Pr?!MX-FeC zgb?{I+<`pnaqSb7Zb^{h;#{#(oS!S>*Fn?dH*YurbW4L$JbhC689eXgF%+x^PTcM^ zIUFa|NPI`j|AG|`j*~Dpo0fL*hr^^QC&)=(I5Pv=@@D`SnMW~3ZeM+~CUsSN$8SsH z&2Z=E6SeRN)W=9PjG>w_)G&6{j9m>QQ!_F*J$2*Y^8Ti3RMj1%6z%3ZsL{1(e~{)m z3omvLtfq)#=@ zj+981FcMW=aUe&oReIpqE9YLYQpsUaD=Ltx-d2P|l~ZTd-fUFm(y{zMzVDlVW;FlU zzeb}WAmeuCq`b)kyrGFZxL&|)M_7O-a04We7zL_KiD78WDr|{$JlFTAghg1El~1GGJ6my5&8O*-FaG+~_g0KfXUo)L|SZ7F9;v3Z8eED2_UO*2CS% zVPZJu@S`s3`93q|A#UU_Nt|?Me&C{>?=#0d#Ets9{m{)l-)ByEh#NVpv6Z}=d%p7j z)cc);oS`%#@%Vt`J3|Tw|MQUolK(qY$~4$q@Nc?sj0vrnP!p}PO(=rt z?;!x5ZVGOV0(?!hEBuNt2rM+2rmxBG&W0ve3A*zk<9A!+tkr+>Ubx0{O74>iH!@-u5YGJuU_5q zr(XE8uVe96;B9*JY2tD79r*a{!*GjlnKsJ@voGW6b+nE*;}fk(I{?w-4>J#E))U{) z*-;|2;}D2+{UaU!$Z!74RxH(u{29xx-`I?ezX*)~^F9Ib>^oqBiI-6c^tm~??K<=Ow5`;T-0$@SV=@X%EP*Jc`+OT4KlDs%ywtS?S$R#?nt*CoJ z0$tMSC*4PD@Kf|IEM9UPqL*Qz8ESd6UQ-Bj-Eo{j`ZGK^Pwq-An?;gv)CBM7+A>xt z89eWV6b%&n7i`6@)=hC3qwE$6J(yXWX&>(<$2-Y!ntG=K}oyu!PbQBr*Q!I@PjLBSK28%Nb?Zzq1GpMn8p#x(V9o> zD9s0e53~mD7>(nE>!RTf8eZq@1VxfmeR=J2o3jULo&tWL)v$+XJnX1b9h7RzcA6q1 zR6Vyg*S>Bapn1koWI8CbK4l-INY+7|-5d5Hii`mtr*pdKa0eZJ%Gu)-o!CXw9h6=_ sU>_mq3m9zQ-iASjwNDH&6I=d}%~3yew&%~69simSyypq7)4!vC0SfW-djJ3c diff --git a/Backend/venv/lib/python3.12/site-packages/pydantic/_internal/__pycache__/_signature.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/pydantic/_internal/__pycache__/_signature.cpython-312.pyc deleted file mode 100644 index 79d7e90a1a40bc50400d16d56c33c796eb6fe7a3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6770 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 sF9RV&}^htxM2Bs)Ih2z=|uQC4dI9iUZHR{#J2 diff --git a/Backend/venv/lib/python3.12/site-packages/pydantic/_internal/__pycache__/_std_types_schema.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/pydantic/_internal/__pycache__/_std_types_schema.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c5fd197f063a833c14c0f4e8fe0e76a16af95de7 GIT binary patch literal 34175 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 literal 28253 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 y>x%R1CfkUKHOEr-3TszvEQMT1+j$xyJK#fQM diff --git a/Backend/venv/lib/python3.12/site-packages/pydantic/_internal/__pycache__/_utils.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/pydantic/_internal/__pycache__/_utils.cpython-312.pyc index 1544965ce803c8a5611ab5fb462e7409123d963c..3591ad45f37cb4ffa1c28507a94704970564a9d6 100644 GIT binary patch delta 4852 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 delta 9518 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 j<{Uq@dkv*@!*4lgVA}p)l?JPM diff --git a/Backend/venv/lib/python3.12/site-packages/pydantic/_internal/__pycache__/_validate_call.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/pydantic/_internal/__pycache__/_validate_call.cpython-312.pyc index 501e4c6628c459b6ad973a4967f09f29d8ad54cf..cb736e120ecbd30f8e8ae3149944cbf4dc3bc939 100644 GIT binary patch literal 6871 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 diff --git a/Backend/venv/lib/python3.12/site-packages/pydantic/_internal/_config.py b/Backend/venv/lib/python3.12/site-packages/pydantic/_internal/_config.py index 43c85685..95b5f07e 100644 --- a/Backend/venv/lib/python3.12/site-packages/pydantic/_internal/_config.py +++ b/Backend/venv/lib/python3.12/site-packages/pydantic/_internal/_config.py @@ -2,26 +2,30 @@ from __future__ import annotations as _annotations import warnings from contextlib import contextmanager -from re import Pattern from typing import ( TYPE_CHECKING, Any, Callable, - Literal, cast, ) from pydantic_core import core_schema -from typing_extensions import Self +from typing_extensions import ( + Literal, + Self, +) -from ..aliases import AliasGenerator from ..config import ConfigDict, ExtraValues, JsonDict, JsonEncoder, JsonSchemaExtraCallable from ..errors import PydanticUserError -from ..warnings import PydanticDeprecatedSince20, PydanticDeprecatedSince210 +from ..warnings import PydanticDeprecatedSince20 + +if not TYPE_CHECKING: + # See PyCharm issues https://youtrack.jetbrains.com/issue/PY-21915 + # and https://youtrack.jetbrains.com/issue/PY-51428 + DeprecationWarning = PydanticDeprecatedSince20 if TYPE_CHECKING: from .._internal._schema_generation_shared import GenerateSchema - from ..fields import ComputedFieldInfo, FieldInfo DEPRECATION_MESSAGE = 'Support for class-based `config` is deprecated, use ConfigDict instead.' @@ -51,9 +55,7 @@ class ConfigWrapper: # whether to use the actual key provided in the data (e.g. alias or first alias for "field required" errors) instead of field_names # to construct error `loc`s, default `True` loc_by_alias: bool - alias_generator: Callable[[str], str] | AliasGenerator | None - model_title_generator: Callable[[type], str] | None - field_title_generator: Callable[[str, FieldInfo | ComputedFieldInfo], str] | None + alias_generator: Callable[[str], str] | None ignored_types: tuple[type, ...] allow_inf_nan: bool json_schema_extra: JsonDict | JsonSchemaExtraCallable | None @@ -64,15 +66,11 @@ class ConfigWrapper: # whether instances of models and dataclasses (including subclass instances) should re-validate, default 'never' revalidate_instances: Literal['always', 'never', 'subclass-instances'] ser_json_timedelta: Literal['iso8601', 'float'] - ser_json_temporal: Literal['iso8601', 'seconds', 'milliseconds'] - val_temporal_unit: Literal['seconds', 'milliseconds', 'infer'] - ser_json_bytes: Literal['utf8', 'base64', 'hex'] - val_json_bytes: Literal['utf8', 'base64', 'hex'] - ser_json_inf_nan: Literal['null', 'constants', 'strings'] + ser_json_bytes: Literal['utf8', 'base64'] # whether to validate default values during validation, default False validate_default: bool validate_return: bool - protected_namespaces: tuple[str | Pattern[str], ...] + protected_namespaces: tuple[str, ...] hide_input_in_errors: bool defer_build: bool plugin_settings: dict[str, object] | None @@ -82,12 +80,6 @@ class ConfigWrapper: coerce_numbers_to_str: bool regex_engine: Literal['rust-regex', 'python-re'] validation_error_cause: bool - use_attribute_docstrings: bool - cache_strings: bool | Literal['all', 'keys', 'none'] - validate_by_alias: bool - validate_by_name: bool - serialize_by_alias: bool - url_preserve_empty_path: bool def __init__(self, config: ConfigDict | dict[str, Any] | type[Any] | None, *, check: bool = True): if check: @@ -96,13 +88,7 @@ class ConfigWrapper: self.config_dict = cast(ConfigDict, config) @classmethod - def for_model( - cls, - bases: tuple[type[Any], ...], - namespace: dict[str, Any], - raw_annotations: dict[str, Any], - kwargs: dict[str, Any], - ) -> Self: + def for_model(cls, bases: tuple[type[Any], ...], namespace: dict[str, Any], kwargs: dict[str, Any]) -> Self: """Build a new `ConfigWrapper` instance for a `BaseModel`. The config wrapper built based on (in descending order of priority): @@ -113,7 +99,6 @@ class ConfigWrapper: Args: bases: A tuple of base classes. namespace: The namespace of the class being created. - raw_annotations: The (non-evaluated) annotations of the model. kwargs: The kwargs passed to the class being created. Returns: @@ -128,12 +113,6 @@ class ConfigWrapper: config_class_from_namespace = namespace.get('Config') config_dict_from_namespace = namespace.get('model_config') - if raw_annotations.get('model_config') and config_dict_from_namespace is None: - raise PydanticUserError( - '`model_config` cannot be used as a model field name. Use `model_config` for model configuration.', - code='model-config-invalid-field-name', - ) - if config_class_from_namespace and config_dict_from_namespace: raise PydanticUserError('"Config" and "model_config" cannot be used together', code='config-both') @@ -159,80 +138,48 @@ class ConfigWrapper: except KeyError: raise AttributeError(f'Config has no attribute {name!r}') from None - def core_config(self, title: str | None) -> core_schema.CoreConfig: - """Create a pydantic-core config. + def core_config(self, obj: Any) -> core_schema.CoreConfig: + """Create a pydantic-core config, `obj` is just used to populate `title` if not set in config. + + Pass `obj=None` if you do not want to attempt to infer the `title`. We don't use getattr here since we don't want to populate with defaults. Args: - title: The title to use if not set in config. + obj: An object used to populate `title` if not set in config. Returns: A `CoreConfig` object created from config. """ - config = self.config_dict - if config.get('schema_generator') is not None: - warnings.warn( - 'The `schema_generator` setting has been deprecated since v2.10. This setting no longer has any effect.', - PydanticDeprecatedSince210, - stacklevel=2, + def dict_not_none(**kwargs: Any) -> Any: + return {k: v for k, v in kwargs.items() if v is not None} + + core_config = core_schema.CoreConfig( + **dict_not_none( + title=self.config_dict.get('title') or (obj and obj.__name__), + extra_fields_behavior=self.config_dict.get('extra'), + allow_inf_nan=self.config_dict.get('allow_inf_nan'), + populate_by_name=self.config_dict.get('populate_by_name'), + str_strip_whitespace=self.config_dict.get('str_strip_whitespace'), + str_to_lower=self.config_dict.get('str_to_lower'), + str_to_upper=self.config_dict.get('str_to_upper'), + strict=self.config_dict.get('strict'), + ser_json_timedelta=self.config_dict.get('ser_json_timedelta'), + ser_json_bytes=self.config_dict.get('ser_json_bytes'), + from_attributes=self.config_dict.get('from_attributes'), + loc_by_alias=self.config_dict.get('loc_by_alias'), + revalidate_instances=self.config_dict.get('revalidate_instances'), + validate_default=self.config_dict.get('validate_default'), + str_max_length=self.config_dict.get('str_max_length'), + str_min_length=self.config_dict.get('str_min_length'), + hide_input_in_errors=self.config_dict.get('hide_input_in_errors'), + coerce_numbers_to_str=self.config_dict.get('coerce_numbers_to_str'), + regex_engine=self.config_dict.get('regex_engine'), + validation_error_cause=self.config_dict.get('validation_error_cause'), ) - - if (populate_by_name := config.get('populate_by_name')) is not None: - # We include this patch for backwards compatibility purposes, but this config setting will be deprecated in v3.0, and likely removed in v4.0. - # Thus, the above warning and this patch can be removed then as well. - if config.get('validate_by_name') is None: - config['validate_by_alias'] = True - config['validate_by_name'] = populate_by_name - - # We dynamically patch validate_by_name to be True if validate_by_alias is set to False - # and validate_by_name is not explicitly set. - if config.get('validate_by_alias') is False and config.get('validate_by_name') is None: - config['validate_by_name'] = True - - if (not config.get('validate_by_alias', True)) and (not config.get('validate_by_name', False)): - raise PydanticUserError( - 'At least one of `validate_by_alias` or `validate_by_name` must be set to True.', - code='validate-by-alias-and-name-false', - ) - - return core_schema.CoreConfig( - **{ # pyright: ignore[reportArgumentType] - k: v - for k, v in ( - ('title', config.get('title') or title or None), - ('extra_fields_behavior', config.get('extra')), - ('allow_inf_nan', config.get('allow_inf_nan')), - ('str_strip_whitespace', config.get('str_strip_whitespace')), - ('str_to_lower', config.get('str_to_lower')), - ('str_to_upper', config.get('str_to_upper')), - ('strict', config.get('strict')), - ('ser_json_timedelta', config.get('ser_json_timedelta')), - ('ser_json_temporal', config.get('ser_json_temporal')), - ('val_temporal_unit', config.get('val_temporal_unit')), - ('ser_json_bytes', config.get('ser_json_bytes')), - ('val_json_bytes', config.get('val_json_bytes')), - ('ser_json_inf_nan', config.get('ser_json_inf_nan')), - ('from_attributes', config.get('from_attributes')), - ('loc_by_alias', config.get('loc_by_alias')), - ('revalidate_instances', config.get('revalidate_instances')), - ('validate_default', config.get('validate_default')), - ('str_max_length', config.get('str_max_length')), - ('str_min_length', config.get('str_min_length')), - ('hide_input_in_errors', config.get('hide_input_in_errors')), - ('coerce_numbers_to_str', config.get('coerce_numbers_to_str')), - ('regex_engine', config.get('regex_engine')), - ('validation_error_cause', config.get('validation_error_cause')), - ('cache_strings', config.get('cache_strings')), - ('validate_by_alias', config.get('validate_by_alias')), - ('validate_by_name', config.get('validate_by_name')), - ('serialize_by_alias', config.get('serialize_by_alias')), - ('url_preserve_empty_path', config.get('url_preserve_empty_path')), - ) - if v is not None - } ) + return core_config def __repr__(self): c = ', '.join(f'{k}={v!r}' for k, v in self.config_dict.items()) @@ -282,38 +229,26 @@ config_defaults = ConfigDict( from_attributes=False, loc_by_alias=True, alias_generator=None, - model_title_generator=None, - field_title_generator=None, ignored_types=(), allow_inf_nan=True, json_schema_extra=None, strict=False, revalidate_instances='never', ser_json_timedelta='iso8601', - ser_json_temporal='iso8601', - val_temporal_unit='infer', ser_json_bytes='utf8', - val_json_bytes='utf8', - ser_json_inf_nan='null', validate_default=False, validate_return=False, - protected_namespaces=('model_validate', 'model_dump'), + protected_namespaces=('model_',), hide_input_in_errors=False, json_encoders=None, defer_build=False, - schema_generator=None, plugin_settings=None, + schema_generator=None, json_schema_serialization_defaults_required=False, json_schema_mode_override=None, coerce_numbers_to_str=False, regex_engine='rust-regex', validation_error_cause=False, - use_attribute_docstrings=False, - cache_strings=True, - validate_by_alias=True, - validate_by_name=False, - serialize_by_alias=False, - url_preserve_empty_path=False, ) @@ -330,7 +265,7 @@ def prepare_config(config: ConfigDict | dict[str, Any] | type[Any] | None) -> Co return ConfigDict() if not isinstance(config, dict): - warnings.warn(DEPRECATION_MESSAGE, PydanticDeprecatedSince20, stacklevel=4) + warnings.warn(DEPRECATION_MESSAGE, DeprecationWarning) config = {k: getattr(config, k) for k in dir(config) if not k.startswith('__')} config_dict = cast(ConfigDict, config) @@ -354,7 +289,7 @@ V2_REMOVED_KEYS = { 'post_init_call', } V2_RENAMED_KEYS = { - 'allow_population_by_field_name': 'validate_by_name', + 'allow_population_by_field_name': 'populate_by_name', 'anystr_lower': 'str_to_lower', 'anystr_strip_whitespace': 'str_strip_whitespace', 'anystr_upper': 'str_to_upper', diff --git a/Backend/venv/lib/python3.12/site-packages/pydantic/_internal/_core_metadata.py b/Backend/venv/lib/python3.12/site-packages/pydantic/_internal/_core_metadata.py index 9f2510c0..296d49f5 100644 --- a/Backend/venv/lib/python3.12/site-packages/pydantic/_internal/_core_metadata.py +++ b/Backend/venv/lib/python3.12/site-packages/pydantic/_internal/_core_metadata.py @@ -1,97 +1,92 @@ from __future__ import annotations as _annotations -from typing import TYPE_CHECKING, Any, TypedDict, cast -from warnings import warn +import typing +from typing import Any -if TYPE_CHECKING: - from ..config import JsonDict, JsonSchemaExtraCallable +import typing_extensions + +if typing.TYPE_CHECKING: + from ._schema_generation_shared import ( + CoreSchemaOrField as CoreSchemaOrField, + ) from ._schema_generation_shared import ( GetJsonSchemaFunction, ) -class CoreMetadata(TypedDict, total=False): +class CoreMetadata(typing_extensions.TypedDict, total=False): """A `TypedDict` for holding the metadata dict of the schema. Attributes: - pydantic_js_functions: List of JSON schema functions that resolve refs during application. - pydantic_js_annotation_functions: List of JSON schema functions that don't resolve refs during application. + pydantic_js_functions: List of JSON schema functions. pydantic_js_prefer_positional_arguments: Whether JSON schema generator will prefer positional over keyword arguments for an 'arguments' schema. - custom validation function. Only applies to before, plain, and wrap validators. - pydantic_js_updates: key / value pair updates to apply to the JSON schema for a type. - pydantic_js_extra: WIP, either key/value pair updates to apply to the JSON schema, or a custom callable. - pydantic_internal_union_tag_key: Used internally by the `Tag` metadata to specify the tag used for a discriminated union. - pydantic_internal_union_discriminator: Used internally to specify the discriminator value for a discriminated union - when the discriminator was applied to a `'definition-ref'` schema, and that reference was missing at the time - of the annotation application. - - TODO: Perhaps we should move this structure to pydantic-core. At the moment, though, - it's easier to iterate on if we leave it in pydantic until we feel there is a semi-stable API. - - TODO: It's unfortunate how functionally oriented JSON schema generation is, especially that which occurs during - the core schema generation process. It's inevitable that we need to store some json schema related information - on core schemas, given that we generate JSON schemas directly from core schemas. That being said, debugging related - issues is quite difficult when JSON schema information is disguised via dynamically defined functions. """ pydantic_js_functions: list[GetJsonSchemaFunction] pydantic_js_annotation_functions: list[GetJsonSchemaFunction] - pydantic_js_prefer_positional_arguments: bool - pydantic_js_updates: JsonDict - pydantic_js_extra: JsonDict | JsonSchemaExtraCallable - pydantic_internal_union_tag_key: str - pydantic_internal_union_discriminator: str + + # If `pydantic_js_prefer_positional_arguments` is True, the JSON schema generator will + # prefer positional over keyword arguments for an 'arguments' schema. + pydantic_js_prefer_positional_arguments: bool | None + + pydantic_typed_dict_cls: type[Any] | None # TODO: Consider moving this into the pydantic-core TypedDictSchema -def update_core_metadata( - core_metadata: Any, - /, - *, - pydantic_js_functions: list[GetJsonSchemaFunction] | None = None, - pydantic_js_annotation_functions: list[GetJsonSchemaFunction] | None = None, - pydantic_js_updates: JsonDict | None = None, - pydantic_js_extra: JsonDict | JsonSchemaExtraCallable | None = None, -) -> None: - from ..json_schema import PydanticJsonSchemaWarning +class CoreMetadataHandler: + """Because the metadata field in pydantic_core is of type `Any`, we can't assume much about its contents. - """Update CoreMetadata instance in place. When we make modifications in this function, they - take effect on the `core_metadata` reference passed in as the first (and only) positional argument. - - First, cast to `CoreMetadata`, then finish with a cast to `dict[str, Any]` for core schema compatibility. - We do this here, instead of before / after each call to this function so that this typing hack - can be easily removed if/when we move `CoreMetadata` to `pydantic-core`. - - For parameter descriptions, see `CoreMetadata` above. + This class is used to interact with the metadata field on a CoreSchema object in a consistent + way throughout pydantic. """ - core_metadata = cast(CoreMetadata, core_metadata) - if pydantic_js_functions: - core_metadata.setdefault('pydantic_js_functions', []).extend(pydantic_js_functions) + __slots__ = ('_schema',) - if pydantic_js_annotation_functions: - core_metadata.setdefault('pydantic_js_annotation_functions', []).extend(pydantic_js_annotation_functions) + def __init__(self, schema: CoreSchemaOrField): + self._schema = schema - if pydantic_js_updates: - if (existing_updates := core_metadata.get('pydantic_js_updates')) is not None: - core_metadata['pydantic_js_updates'] = {**existing_updates, **pydantic_js_updates} - else: - core_metadata['pydantic_js_updates'] = pydantic_js_updates + metadata = schema.get('metadata') + if metadata is None: + schema['metadata'] = CoreMetadata() + elif not isinstance(metadata, dict): + raise TypeError(f'CoreSchema metadata should be a dict; got {metadata!r}.') - if pydantic_js_extra is not None: - existing_pydantic_js_extra = core_metadata.get('pydantic_js_extra') - if existing_pydantic_js_extra is None: - core_metadata['pydantic_js_extra'] = pydantic_js_extra - if isinstance(existing_pydantic_js_extra, dict): - if isinstance(pydantic_js_extra, dict): - core_metadata['pydantic_js_extra'] = {**existing_pydantic_js_extra, **pydantic_js_extra} - if callable(pydantic_js_extra): - warn( - 'Composing `dict` and `callable` type `json_schema_extra` is not supported.' - 'The `callable` type is being ignored.' - "If you'd like support for this behavior, please open an issue on pydantic.", - PydanticJsonSchemaWarning, - ) - if callable(existing_pydantic_js_extra): - # if ever there's a case of a callable, we'll just keep the last json schema extra spec - core_metadata['pydantic_js_extra'] = pydantic_js_extra + @property + def metadata(self) -> CoreMetadata: + """Retrieves the metadata dict from the schema, initializing it to a dict if it is None + and raises an error if it is not a dict. + """ + metadata = self._schema.get('metadata') + if metadata is None: + self._schema['metadata'] = metadata = CoreMetadata() + if not isinstance(metadata, dict): + raise TypeError(f'CoreSchema metadata should be a dict; got {metadata!r}.') + return metadata + + +def build_metadata_dict( + *, # force keyword arguments to make it easier to modify this signature in a backwards-compatible way + js_functions: list[GetJsonSchemaFunction] | None = None, + js_annotation_functions: list[GetJsonSchemaFunction] | None = None, + js_prefer_positional_arguments: bool | None = None, + typed_dict_cls: type[Any] | None = None, + initial_metadata: Any | None = None, +) -> Any: + """Builds a dict to use as the metadata field of a CoreSchema object in a manner that is consistent + with the CoreMetadataHandler class. + """ + if initial_metadata is not None and not isinstance(initial_metadata, dict): + raise TypeError(f'CoreSchema metadata should be a dict; got {initial_metadata!r}.') + + metadata = CoreMetadata( + pydantic_js_functions=js_functions or [], + pydantic_js_annotation_functions=js_annotation_functions or [], + pydantic_js_prefer_positional_arguments=js_prefer_positional_arguments, + pydantic_typed_dict_cls=typed_dict_cls, + ) + metadata = {k: v for k, v in metadata.items() if v is not None} + + if initial_metadata is not None: + metadata = {**initial_metadata, **metadata} + + return metadata diff --git a/Backend/venv/lib/python3.12/site-packages/pydantic/_internal/_core_utils.py b/Backend/venv/lib/python3.12/site-packages/pydantic/_internal/_core_utils.py index caa51e8c..551dafec 100644 --- a/Backend/venv/lib/python3.12/site-packages/pydantic/_internal/_core_utils.py +++ b/Backend/venv/lib/python3.12/site-packages/pydantic/_internal/_core_utils.py @@ -1,19 +1,23 @@ from __future__ import annotations -import inspect -from collections.abc import Mapping, Sequence -from typing import TYPE_CHECKING, Any, Union +import os +from collections import defaultdict +from typing import ( + Any, + Callable, + Hashable, + TypeVar, + Union, + cast, +) from pydantic_core import CoreSchema, core_schema -from typing_extensions import TypeGuard, get_args, get_origin -from typing_inspection import typing_objects +from pydantic_core import validate_core_schema as _validate_core_schema +from typing_extensions import TypeAliasType, TypeGuard, get_args, get_origin from . import _repr from ._typing_extra import is_generic_alias -if TYPE_CHECKING: - from rich.console import Console - AnyFunctionSchema = Union[ core_schema.AfterValidatorFunctionSchema, core_schema.BeforeValidatorFunctionSchema, @@ -35,7 +39,23 @@ CoreSchemaOrField = Union[core_schema.CoreSchema, CoreSchemaField] _CORE_SCHEMA_FIELD_TYPES = {'typed-dict-field', 'dataclass-field', 'model-field', 'computed-field'} _FUNCTION_WITH_INNER_SCHEMA_TYPES = {'function-before', 'function-after', 'function-wrap'} -_LIST_LIKE_SCHEMA_WITH_ITEMS_TYPES = {'list', 'set', 'frozenset'} +_LIST_LIKE_SCHEMA_WITH_ITEMS_TYPES = {'list', 'tuple-variable', 'set', 'frozenset'} + +_DEFINITIONS_CACHE_METADATA_KEY = 'pydantic.definitions_cache' + +NEEDS_APPLY_DISCRIMINATED_UNION_METADATA_KEY = 'pydantic.internal.needs_apply_discriminated_union' +"""Used to mark a schema that has a discriminated union that needs to be checked for validity at the end of +schema building because one of it's members refers to a definition that was not yet defined when the union +was first encountered. +""" +TAGGED_UNION_TAG_KEY = 'pydantic.internal.tagged_union_tag' +""" +Used in a `Tag` schema to specify the tag used for a discriminated union. +""" +HAS_INVALID_SCHEMAS_METADATA_KEY = 'pydantic.internal.invalid' +"""Used to mark a schema that is invalid because it refers to a definition that was not yet defined when the +schema was first encountered. +""" def is_core_schema( @@ -58,11 +78,13 @@ def is_function_with_inner_schema( def is_list_like_schema_with_items_schema( schema: CoreSchema, -) -> TypeGuard[core_schema.ListSchema | core_schema.SetSchema | core_schema.FrozenSetSchema]: +) -> TypeGuard[ + core_schema.ListSchema | core_schema.TupleVariableSchema | core_schema.SetSchema | core_schema.FrozenSetSchema +]: return schema['type'] in _LIST_LIKE_SCHEMA_WITH_ITEMS_TYPES -def get_type_ref(type_: Any, args_override: tuple[type[Any], ...] | None = None) -> str: +def get_type_ref(type_: type[Any], args_override: tuple[type[Any], ...] | None = None) -> str: """Produces the ref to be used for this type by pydantic_core's core schemas. This `args_override` argument was added for the purpose of creating valid recursive references @@ -77,7 +99,7 @@ def get_type_ref(type_: Any, args_override: tuple[type[Any], ...] | None = None) args = generic_metadata['args'] or args module_name = getattr(origin, '__module__', '') - if typing_objects.is_typealiastype(origin): + if isinstance(origin, TypeAliasType): type_ref = f'{module_name}.{origin.__name__}:{id(origin)}' else: try: @@ -107,68 +129,457 @@ def get_ref(s: core_schema.CoreSchema) -> None | str: return s.get('ref', None) -def _clean_schema_for_pretty_print(obj: Any, strip_metadata: bool = True) -> Any: # pragma: no cover - """A utility function to remove irrelevant information from a core schema.""" - if isinstance(obj, Mapping): - new_dct = {} - for k, v in obj.items(): - if k == 'metadata' and strip_metadata: - new_metadata = {} +def collect_definitions(schema: core_schema.CoreSchema) -> dict[str, core_schema.CoreSchema]: + defs: dict[str, CoreSchema] = {} - for meta_k, meta_v in v.items(): - if meta_k in ('pydantic_js_functions', 'pydantic_js_annotation_functions'): - new_metadata['js_metadata'] = '' - else: - new_metadata[meta_k] = _clean_schema_for_pretty_print(meta_v, strip_metadata=strip_metadata) + def _record_valid_refs(s: core_schema.CoreSchema, recurse: Recurse) -> core_schema.CoreSchema: + ref = get_ref(s) + if ref: + defs[ref] = s + return recurse(s, _record_valid_refs) - if list(new_metadata.keys()) == ['js_metadata']: - new_metadata = {''} + walk_core_schema(schema, _record_valid_refs) - new_dct[k] = new_metadata - # Remove some defaults: - elif k in ('custom_init', 'root_model') and not v: - continue + return defs + + +def define_expected_missing_refs( + schema: core_schema.CoreSchema, allowed_missing_refs: set[str] +) -> core_schema.CoreSchema | None: + if not allowed_missing_refs: + # in this case, there are no missing refs to potentially substitute, so there's no need to walk the schema + # this is a common case (will be hit for all non-generic models), so it's worth optimizing for + return None + + refs = collect_definitions(schema).keys() + + expected_missing_refs = allowed_missing_refs.difference(refs) + if expected_missing_refs: + definitions: list[core_schema.CoreSchema] = [ + # TODO: Replace this with a (new) CoreSchema that, if present at any level, makes validation fail + # Issue: https://github.com/pydantic/pydantic-core/issues/619 + core_schema.none_schema(ref=ref, metadata={HAS_INVALID_SCHEMAS_METADATA_KEY: True}) + for ref in expected_missing_refs + ] + return core_schema.definitions_schema(schema, definitions) + return None + + +def collect_invalid_schemas(schema: core_schema.CoreSchema) -> bool: + invalid = False + + def _is_schema_valid(s: core_schema.CoreSchema, recurse: Recurse) -> core_schema.CoreSchema: + nonlocal invalid + if 'metadata' in s: + metadata = s['metadata'] + if HAS_INVALID_SCHEMAS_METADATA_KEY in metadata: + invalid = metadata[HAS_INVALID_SCHEMAS_METADATA_KEY] + return s + return recurse(s, _is_schema_valid) + + walk_core_schema(schema, _is_schema_valid) + return invalid + + +T = TypeVar('T') + + +Recurse = Callable[[core_schema.CoreSchema, 'Walk'], core_schema.CoreSchema] +Walk = Callable[[core_schema.CoreSchema, Recurse], core_schema.CoreSchema] + +# TODO: Should we move _WalkCoreSchema into pydantic_core proper? +# Issue: https://github.com/pydantic/pydantic-core/issues/615 + + +class _WalkCoreSchema: + def __init__(self): + self._schema_type_to_method = self._build_schema_type_to_method() + + def _build_schema_type_to_method(self) -> dict[core_schema.CoreSchemaType, Recurse]: + mapping: dict[core_schema.CoreSchemaType, Recurse] = {} + key: core_schema.CoreSchemaType + for key in get_args(core_schema.CoreSchemaType): + method_name = f"handle_{key.replace('-', '_')}_schema" + mapping[key] = getattr(self, method_name, self._handle_other_schemas) + return mapping + + def walk(self, schema: core_schema.CoreSchema, f: Walk) -> core_schema.CoreSchema: + return f(schema, self._walk) + + def _walk(self, schema: core_schema.CoreSchema, f: Walk) -> core_schema.CoreSchema: + schema = self._schema_type_to_method[schema['type']](schema.copy(), f) + ser_schema: core_schema.SerSchema | None = schema.get('serialization') # type: ignore + if ser_schema: + schema['serialization'] = self._handle_ser_schemas(ser_schema, f) + return schema + + def _handle_other_schemas(self, schema: core_schema.CoreSchema, f: Walk) -> core_schema.CoreSchema: + sub_schema = schema.get('schema', None) + if sub_schema is not None: + schema['schema'] = self.walk(sub_schema, f) # type: ignore + return schema + + def _handle_ser_schemas(self, ser_schema: core_schema.SerSchema, f: Walk) -> core_schema.SerSchema: + schema: core_schema.CoreSchema | None = ser_schema.get('schema', None) + if schema is not None: + ser_schema['schema'] = self.walk(schema, f) # type: ignore + return_schema: core_schema.CoreSchema | None = ser_schema.get('return_schema', None) + if return_schema is not None: + ser_schema['return_schema'] = self.walk(return_schema, f) # type: ignore + return ser_schema + + def handle_definitions_schema(self, schema: core_schema.DefinitionsSchema, f: Walk) -> core_schema.CoreSchema: + new_definitions: list[core_schema.CoreSchema] = [] + for definition in schema['definitions']: + updated_definition = self.walk(definition, f) + if 'ref' in updated_definition: + # If the updated definition schema doesn't have a 'ref', it shouldn't go in the definitions + # This is most likely to happen due to replacing something with a definition reference, in + # which case it should certainly not go in the definitions list + new_definitions.append(updated_definition) + new_inner_schema = self.walk(schema['schema'], f) + + if not new_definitions and len(schema) == 3: + # This means we'd be returning a "trivial" definitions schema that just wrapped the inner schema + return new_inner_schema + + new_schema = schema.copy() + new_schema['schema'] = new_inner_schema + new_schema['definitions'] = new_definitions + return new_schema + + def handle_list_schema(self, schema: core_schema.ListSchema, f: Walk) -> core_schema.CoreSchema: + items_schema = schema.get('items_schema') + if items_schema is not None: + schema['items_schema'] = self.walk(items_schema, f) + return schema + + def handle_set_schema(self, schema: core_schema.SetSchema, f: Walk) -> core_schema.CoreSchema: + items_schema = schema.get('items_schema') + if items_schema is not None: + schema['items_schema'] = self.walk(items_schema, f) + return schema + + def handle_frozenset_schema(self, schema: core_schema.FrozenSetSchema, f: Walk) -> core_schema.CoreSchema: + items_schema = schema.get('items_schema') + if items_schema is not None: + schema['items_schema'] = self.walk(items_schema, f) + return schema + + def handle_generator_schema(self, schema: core_schema.GeneratorSchema, f: Walk) -> core_schema.CoreSchema: + items_schema = schema.get('items_schema') + if items_schema is not None: + schema['items_schema'] = self.walk(items_schema, f) + return schema + + def handle_tuple_variable_schema( + self, schema: core_schema.TupleVariableSchema | core_schema.TuplePositionalSchema, f: Walk + ) -> core_schema.CoreSchema: + schema = cast(core_schema.TupleVariableSchema, schema) + items_schema = schema.get('items_schema') + if items_schema is not None: + schema['items_schema'] = self.walk(items_schema, f) + return schema + + def handle_tuple_positional_schema( + self, schema: core_schema.TupleVariableSchema | core_schema.TuplePositionalSchema, f: Walk + ) -> core_schema.CoreSchema: + schema = cast(core_schema.TuplePositionalSchema, schema) + schema['items_schema'] = [self.walk(v, f) for v in schema['items_schema']] + extras_schema = schema.get('extras_schema') + if extras_schema is not None: + schema['extras_schema'] = self.walk(extras_schema, f) + return schema + + def handle_dict_schema(self, schema: core_schema.DictSchema, f: Walk) -> core_schema.CoreSchema: + keys_schema = schema.get('keys_schema') + if keys_schema is not None: + schema['keys_schema'] = self.walk(keys_schema, f) + values_schema = schema.get('values_schema') + if values_schema: + schema['values_schema'] = self.walk(values_schema, f) + return schema + + def handle_function_schema(self, schema: AnyFunctionSchema, f: Walk) -> core_schema.CoreSchema: + if not is_function_with_inner_schema(schema): + return schema + schema['schema'] = self.walk(schema['schema'], f) + return schema + + def handle_union_schema(self, schema: core_schema.UnionSchema, f: Walk) -> core_schema.CoreSchema: + new_choices: list[CoreSchema | tuple[CoreSchema, str]] = [] + for v in schema['choices']: + if isinstance(v, tuple): + new_choices.append((self.walk(v[0], f), v[1])) else: - new_dct[k] = _clean_schema_for_pretty_print(v, strip_metadata=strip_metadata) + new_choices.append(self.walk(v, f)) + schema['choices'] = new_choices + return schema - return new_dct - elif isinstance(obj, Sequence) and not isinstance(obj, str): - return [_clean_schema_for_pretty_print(v, strip_metadata=strip_metadata) for v in obj] - else: - return obj + def handle_tagged_union_schema(self, schema: core_schema.TaggedUnionSchema, f: Walk) -> core_schema.CoreSchema: + new_choices: dict[Hashable, core_schema.CoreSchema] = {} + for k, v in schema['choices'].items(): + new_choices[k] = v if isinstance(v, (str, int)) else self.walk(v, f) + schema['choices'] = new_choices + return schema + + def handle_chain_schema(self, schema: core_schema.ChainSchema, f: Walk) -> core_schema.CoreSchema: + schema['steps'] = [self.walk(v, f) for v in schema['steps']] + return schema + + def handle_lax_or_strict_schema(self, schema: core_schema.LaxOrStrictSchema, f: Walk) -> core_schema.CoreSchema: + schema['lax_schema'] = self.walk(schema['lax_schema'], f) + schema['strict_schema'] = self.walk(schema['strict_schema'], f) + return schema + + def handle_json_or_python_schema(self, schema: core_schema.JsonOrPythonSchema, f: Walk) -> core_schema.CoreSchema: + schema['json_schema'] = self.walk(schema['json_schema'], f) + schema['python_schema'] = self.walk(schema['python_schema'], f) + return schema + + def handle_model_fields_schema(self, schema: core_schema.ModelFieldsSchema, f: Walk) -> core_schema.CoreSchema: + extras_schema = schema.get('extras_schema') + if extras_schema is not None: + schema['extras_schema'] = self.walk(extras_schema, f) + replaced_fields: dict[str, core_schema.ModelField] = {} + replaced_computed_fields: list[core_schema.ComputedField] = [] + for computed_field in schema.get('computed_fields', ()): + replaced_field = computed_field.copy() + replaced_field['return_schema'] = self.walk(computed_field['return_schema'], f) + replaced_computed_fields.append(replaced_field) + if replaced_computed_fields: + schema['computed_fields'] = replaced_computed_fields + for k, v in schema['fields'].items(): + replaced_field = v.copy() + replaced_field['schema'] = self.walk(v['schema'], f) + replaced_fields[k] = replaced_field + schema['fields'] = replaced_fields + return schema + + def handle_typed_dict_schema(self, schema: core_schema.TypedDictSchema, f: Walk) -> core_schema.CoreSchema: + extras_schema = schema.get('extras_schema') + if extras_schema is not None: + schema['extras_schema'] = self.walk(extras_schema, f) + replaced_computed_fields: list[core_schema.ComputedField] = [] + for computed_field in schema.get('computed_fields', ()): + replaced_field = computed_field.copy() + replaced_field['return_schema'] = self.walk(computed_field['return_schema'], f) + replaced_computed_fields.append(replaced_field) + if replaced_computed_fields: + schema['computed_fields'] = replaced_computed_fields + replaced_fields: dict[str, core_schema.TypedDictField] = {} + for k, v in schema['fields'].items(): + replaced_field = v.copy() + replaced_field['schema'] = self.walk(v['schema'], f) + replaced_fields[k] = replaced_field + schema['fields'] = replaced_fields + return schema + + def handle_dataclass_args_schema(self, schema: core_schema.DataclassArgsSchema, f: Walk) -> core_schema.CoreSchema: + replaced_fields: list[core_schema.DataclassField] = [] + replaced_computed_fields: list[core_schema.ComputedField] = [] + for computed_field in schema.get('computed_fields', ()): + replaced_field = computed_field.copy() + replaced_field['return_schema'] = self.walk(computed_field['return_schema'], f) + replaced_computed_fields.append(replaced_field) + if replaced_computed_fields: + schema['computed_fields'] = replaced_computed_fields + for field in schema['fields']: + replaced_field = field.copy() + replaced_field['schema'] = self.walk(field['schema'], f) + replaced_fields.append(replaced_field) + schema['fields'] = replaced_fields + return schema + + def handle_arguments_schema(self, schema: core_schema.ArgumentsSchema, f: Walk) -> core_schema.CoreSchema: + replaced_arguments_schema: list[core_schema.ArgumentsParameter] = [] + for param in schema['arguments_schema']: + replaced_param = param.copy() + replaced_param['schema'] = self.walk(param['schema'], f) + replaced_arguments_schema.append(replaced_param) + schema['arguments_schema'] = replaced_arguments_schema + if 'var_args_schema' in schema: + schema['var_args_schema'] = self.walk(schema['var_args_schema'], f) + if 'var_kwargs_schema' in schema: + schema['var_kwargs_schema'] = self.walk(schema['var_kwargs_schema'], f) + return schema + + def handle_call_schema(self, schema: core_schema.CallSchema, f: Walk) -> core_schema.CoreSchema: + schema['arguments_schema'] = self.walk(schema['arguments_schema'], f) + if 'return_schema' in schema: + schema['return_schema'] = self.walk(schema['return_schema'], f) + return schema + + +_dispatch = _WalkCoreSchema().walk + + +def walk_core_schema(schema: core_schema.CoreSchema, f: Walk) -> core_schema.CoreSchema: + """Recursively traverse a CoreSchema. + + Args: + schema (core_schema.CoreSchema): The CoreSchema to process, it will not be modified. + f (Walk): A function to apply. This function takes two arguments: + 1. The current CoreSchema that is being processed + (not the same one you passed into this function, one level down). + 2. The "next" `f` to call. This lets you for example use `f=functools.partial(some_method, some_context)` + to pass data down the recursive calls without using globals or other mutable state. + + Returns: + core_schema.CoreSchema: A processed CoreSchema. + """ + return f(schema.copy(), _dispatch) + + +def simplify_schema_references(schema: core_schema.CoreSchema) -> core_schema.CoreSchema: # noqa: C901 + definitions: dict[str, core_schema.CoreSchema] = {} + ref_counts: dict[str, int] = defaultdict(int) + involved_in_recursion: dict[str, bool] = {} + current_recursion_ref_count: dict[str, int] = defaultdict(int) + + def collect_refs(s: core_schema.CoreSchema, recurse: Recurse) -> core_schema.CoreSchema: + if s['type'] == 'definitions': + for definition in s['definitions']: + ref = get_ref(definition) + assert ref is not None + if ref not in definitions: + definitions[ref] = definition + recurse(definition, collect_refs) + return recurse(s['schema'], collect_refs) + else: + ref = get_ref(s) + if ref is not None: + new = recurse(s, collect_refs) + new_ref = get_ref(new) + if new_ref: + definitions[new_ref] = new + return core_schema.definition_reference_schema(schema_ref=ref) + else: + return recurse(s, collect_refs) + + schema = walk_core_schema(schema, collect_refs) + + def count_refs(s: core_schema.CoreSchema, recurse: Recurse) -> core_schema.CoreSchema: + if s['type'] != 'definition-ref': + return recurse(s, count_refs) + ref = s['schema_ref'] + ref_counts[ref] += 1 + + if ref_counts[ref] >= 2: + # If this model is involved in a recursion this should be detected + # on its second encounter, we can safely stop the walk here. + if current_recursion_ref_count[ref] != 0: + involved_in_recursion[ref] = True + return s + + current_recursion_ref_count[ref] += 1 + recurse(definitions[ref], count_refs) + current_recursion_ref_count[ref] -= 1 + return s + + schema = walk_core_schema(schema, count_refs) + + assert all(c == 0 for c in current_recursion_ref_count.values()), 'this is a bug! please report it' + + def can_be_inlined(s: core_schema.DefinitionReferenceSchema, ref: str) -> bool: + if ref_counts[ref] > 1: + return False + if involved_in_recursion.get(ref, False): + return False + if 'serialization' in s: + return False + if 'metadata' in s: + metadata = s['metadata'] + for k in ( + 'pydantic_js_functions', + 'pydantic_js_annotation_functions', + 'pydantic.internal.union_discriminator', + ): + if k in metadata: + # we need to keep this as a ref + return False + return True + + def inline_refs(s: core_schema.CoreSchema, recurse: Recurse) -> core_schema.CoreSchema: + if s['type'] == 'definition-ref': + ref = s['schema_ref'] + # Check if the reference is only used once, not involved in recursion and does not have + # any extra keys (like 'serialization') + if can_be_inlined(s, ref): + # Inline the reference by replacing the reference with the actual schema + new = definitions.pop(ref) + ref_counts[ref] -= 1 # because we just replaced it! + # put all other keys that were on the def-ref schema into the inlined version + # in particular this is needed for `serialization` + if 'serialization' in s: + new['serialization'] = s['serialization'] + s = recurse(new, inline_refs) + return s + else: + return recurse(s, inline_refs) + else: + return recurse(s, inline_refs) + + schema = walk_core_schema(schema, inline_refs) + + def_values = [v for v in definitions.values() if ref_counts[v['ref']] > 0] # type: ignore + + if def_values: + schema = core_schema.definitions_schema(schema=schema, definitions=def_values) + return schema + + +def _strip_metadata(schema: CoreSchema) -> CoreSchema: + def strip_metadata(s: CoreSchema, recurse: Recurse) -> CoreSchema: + s = s.copy() + s.pop('metadata', None) + if s['type'] == 'model-fields': + s = s.copy() + s['fields'] = {k: v.copy() for k, v in s['fields'].items()} + for field_name, field_schema in s['fields'].items(): + field_schema.pop('metadata', None) + s['fields'][field_name] = field_schema + computed_fields = s.get('computed_fields', None) + if computed_fields: + s['computed_fields'] = [cf.copy() for cf in computed_fields] + for cf in computed_fields: + cf.pop('metadata', None) + else: + s.pop('computed_fields', None) + elif s['type'] == 'model': + # remove some defaults + if s.get('custom_init', True) is False: + s.pop('custom_init') + if s.get('root_model', True) is False: + s.pop('root_model') + if {'title'}.issuperset(s.get('config', {}).keys()): + s.pop('config', None) + + return recurse(s, strip_metadata) + + return walk_core_schema(schema, strip_metadata) def pretty_print_core_schema( - val: Any, - *, - console: Console | None = None, - max_depth: int | None = None, - strip_metadata: bool = True, -) -> None: # pragma: no cover - """Pretty-print a core schema using the `rich` library. + schema: CoreSchema, + include_metadata: bool = False, +) -> None: + """Pretty print a CoreSchema using rich. + This is intended for debugging purposes. Args: - val: The core schema to print, or a Pydantic model/dataclass/type adapter - (in which case the cached core schema is fetched and printed). - console: A rich console to use when printing. Defaults to the global rich console instance. - max_depth: The number of nesting levels which may be printed. - strip_metadata: Whether to strip metadata in the output. If `True` any known core metadata - attributes will be stripped (but custom attributes are kept). Defaults to `True`. + schema: The CoreSchema to print. + include_metadata: Whether to include metadata in the output. Defaults to `False`. """ - # lazy import: - from rich.pretty import pprint + from rich import print # type: ignore # install it manually in your dev env - # circ. imports: - from pydantic import BaseModel, TypeAdapter - from pydantic.dataclasses import is_pydantic_dataclass + if not include_metadata: + schema = _strip_metadata(schema) - if (inspect.isclass(val) and issubclass(val, BaseModel)) or is_pydantic_dataclass(val): - val = val.__pydantic_core_schema__ - if isinstance(val, TypeAdapter): - val = val.core_schema - cleaned_schema = _clean_schema_for_pretty_print(val, strip_metadata=strip_metadata) - - pprint(cleaned_schema, console=console, max_depth=max_depth) + return print(schema) -pps = pretty_print_core_schema +def validate_core_schema(schema: CoreSchema) -> CoreSchema: + if 'PYDANTIC_SKIP_VALIDATING_CORE_SCHEMAS' in os.environ: + return schema + return _validate_core_schema(schema) diff --git a/Backend/venv/lib/python3.12/site-packages/pydantic/_internal/_dataclasses.py b/Backend/venv/lib/python3.12/site-packages/pydantic/_internal/_dataclasses.py index 869286b2..2bc43e96 100644 --- a/Backend/venv/lib/python3.12/site-packages/pydantic/_internal/_dataclasses.py +++ b/Backend/venv/lib/python3.12/site-packages/pydantic/_internal/_dataclasses.py @@ -1,43 +1,48 @@ """Private logic for creating pydantic dataclasses.""" - from __future__ import annotations as _annotations -import copy import dataclasses -import sys +import inspect +import typing import warnings -from collections.abc import Generator -from contextlib import contextmanager -from functools import partial -from typing import TYPE_CHECKING, Any, ClassVar, Protocol, cast +from functools import partial, wraps +from inspect import Parameter, Signature +from typing import Any, Callable, ClassVar from pydantic_core import ( ArgsKwargs, + PydanticUndefined, SchemaSerializer, SchemaValidator, core_schema, ) -from typing_extensions import TypeAlias, TypeIs +from typing_extensions import TypeGuard from ..errors import PydanticUndefinedAnnotation from ..fields import FieldInfo -from ..plugin._schema_validator import PluggableSchemaValidator, create_schema_validator +from ..plugin._schema_validator import create_schema_validator from ..warnings import PydanticDeprecatedSince20 -from . import _config, _decorators +from . import _config, _decorators, _typing_extra +from ._config import ConfigWrapper from ._fields import collect_dataclass_fields -from ._generate_schema import GenerateSchema, InvalidSchemaError +from ._generate_schema import GenerateSchema, generate_pydantic_signature from ._generics import get_standard_typevars_map from ._mock_val_ser import set_dataclass_mocks -from ._namespace_utils import NsResolver -from ._signature import generate_pydantic_signature -from ._utils import LazyClassAttribute - -if TYPE_CHECKING: - from _typeshed import DataclassInstance as StandardDataclass +from ._schema_generation_shared import CallbackGetCoreSchemaHandler +from ._utils import is_valid_identifier +if typing.TYPE_CHECKING: from ..config import ConfigDict - class PydanticDataclass(StandardDataclass, Protocol): + class StandardDataclass(typing.Protocol): + __dataclass_fields__: ClassVar[dict[str, Any]] + __dataclass_params__: ClassVar[Any] # in reality `dataclasses._DataclassParams` + __post_init__: ClassVar[Callable[..., None]] + + def __init__(self, *args: object, **kwargs: object) -> None: + pass + + class PydanticDataclass(StandardDataclass, typing.Protocol): """A protocol containing attributes only available once a class has been decorated as a Pydantic dataclass. Attributes: @@ -56,28 +61,23 @@ if TYPE_CHECKING: __pydantic_decorators__: ClassVar[_decorators.DecoratorInfos] __pydantic_fields__: ClassVar[dict[str, FieldInfo]] __pydantic_serializer__: ClassVar[SchemaSerializer] - __pydantic_validator__: ClassVar[SchemaValidator | PluggableSchemaValidator] + __pydantic_validator__: ClassVar[SchemaValidator] - @classmethod - def __pydantic_fields_complete__(cls) -> bool: ... +else: + # See PyCharm issues https://youtrack.jetbrains.com/issue/PY-21915 + # and https://youtrack.jetbrains.com/issue/PY-51428 + DeprecationWarning = PydanticDeprecatedSince20 -def set_dataclass_fields( - cls: type[StandardDataclass], - config_wrapper: _config.ConfigWrapper, - ns_resolver: NsResolver | None = None, -) -> None: +def set_dataclass_fields(cls: type[StandardDataclass], types_namespace: dict[str, Any] | None = None) -> None: """Collect and set `cls.__pydantic_fields__`. Args: cls: The class. - config_wrapper: The config wrapper instance. - ns_resolver: Namespace resolver to use when getting dataclass annotations. + types_namespace: The types namespace, defaults to `None`. """ typevars_map = get_standard_typevars_map(cls) - fields = collect_dataclass_fields( - cls, ns_resolver=ns_resolver, typevars_map=typevars_map, config_wrapper=config_wrapper - ) + fields = collect_dataclass_fields(cls, types_namespace, typevars_map=typevars_map) cls.__pydantic_fields__ = fields # type: ignore @@ -87,8 +87,7 @@ def complete_dataclass( config_wrapper: _config.ConfigWrapper, *, raise_errors: bool = True, - ns_resolver: NsResolver | None = None, - _force_build: bool = False, + types_namespace: dict[str, Any] | None, ) -> bool: """Finish building a pydantic dataclass. @@ -100,10 +99,7 @@ def complete_dataclass( cls: The class. config_wrapper: The config wrapper instance. raise_errors: Whether to raise errors, defaults to `True`. - ns_resolver: The namespace resolver instance to use when collecting dataclass fields - and during schema building. - _force_build: Whether to force building the dataclass, no matter if - [`defer_build`][pydantic.config.ConfigDict.defer_build] is set. + types_namespace: The types namespace. Returns: `True` if building a pydantic dataclass is successfully completed, `False` otherwise. @@ -111,10 +107,27 @@ def complete_dataclass( Raises: PydanticUndefinedAnnotation: If `raise_error` is `True` and there is an undefined annotations. """ - original_init = cls.__init__ + if hasattr(cls, '__post_init_post_parse__'): + warnings.warn( + 'Support for `__post_init_post_parse__` has been dropped, the method will not be called', DeprecationWarning + ) - # dataclass.__init__ must be defined here so its `__qualname__` can be changed since functions can't be copied, - # and so that the mock validator is used if building was deferred: + if types_namespace is None: + types_namespace = _typing_extra.get_cls_types_namespace(cls) + + set_dataclass_fields(cls, types_namespace) + + typevars_map = get_standard_typevars_map(cls) + gen_schema = GenerateSchema( + config_wrapper, + types_namespace, + typevars_map, + ) + + # This needs to be called before we change the __init__ + sig = generate_dataclass_signature(cls, cls.__pydantic_fields__, config_wrapper) # type: ignore + + # dataclass.__init__ must be defined here so its `__qualname__` can be changed since functions can't be copied. def __init__(__dataclass_self__: PydanticDataclass, *args: Any, **kwargs: Any) -> None: __tracebackhide__ = True s = __dataclass_self__ @@ -124,77 +137,136 @@ def complete_dataclass( cls.__init__ = __init__ # type: ignore cls.__pydantic_config__ = config_wrapper.config_dict # type: ignore - - set_dataclass_fields(cls, config_wrapper=config_wrapper, ns_resolver=ns_resolver) - - if not _force_build and config_wrapper.defer_build: - set_dataclass_mocks(cls) - return False - - if hasattr(cls, '__post_init_post_parse__'): - warnings.warn( - 'Support for `__post_init_post_parse__` has been dropped, the method will not be called', - PydanticDeprecatedSince20, - ) - - typevars_map = get_standard_typevars_map(cls) - gen_schema = GenerateSchema( - config_wrapper, - ns_resolver=ns_resolver, - typevars_map=typevars_map, - ) - - # set __signature__ attr only for the class, but not for its instances - # (because instances can define `__call__`, and `inspect.signature` shouldn't - # use the `__signature__` attribute and instead generate from `__call__`). - cls.__signature__ = LazyClassAttribute( - '__signature__', - partial( - generate_pydantic_signature, - # It's important that we reference the `original_init` here, - # as it is the one synthesized by the stdlib `dataclass` module: - init=original_init, - fields=cls.__pydantic_fields__, # type: ignore - validate_by_name=config_wrapper.validate_by_name, - extra=config_wrapper.extra, - is_dataclass=True, - ), - ) - + cls.__signature__ = sig # type: ignore + get_core_schema = getattr(cls, '__get_pydantic_core_schema__', None) try: - schema = gen_schema.generate_schema(cls) + if get_core_schema: + schema = get_core_schema( + cls, + CallbackGetCoreSchemaHandler( + partial(gen_schema.generate_schema, from_dunder_get_core_schema=False), + gen_schema, + ref_mode='unpack', + ), + ) + else: + schema = gen_schema.generate_schema(cls, from_dunder_get_core_schema=False) except PydanticUndefinedAnnotation as e: if raise_errors: raise - set_dataclass_mocks(cls, f'`{e.name}`') + set_dataclass_mocks(cls, cls.__name__, f'`{e.name}`') return False - core_config = config_wrapper.core_config(title=cls.__name__) + core_config = config_wrapper.core_config(cls) try: schema = gen_schema.clean_schema(schema) - except InvalidSchemaError: - set_dataclass_mocks(cls) + except gen_schema.CollectedInvalid: + set_dataclass_mocks(cls, cls.__name__, 'all referenced types') return False # We are about to set all the remaining required properties expected for this cast; # __pydantic_decorators__ and __pydantic_fields__ should already be set - cls = cast('type[PydanticDataclass]', cls) + cls = typing.cast('type[PydanticDataclass]', cls) + # debug(schema) cls.__pydantic_core_schema__ = schema - cls.__pydantic_validator__ = create_schema_validator( + cls.__pydantic_validator__ = validator = create_schema_validator( schema, cls, cls.__module__, cls.__qualname__, 'dataclass', core_config, config_wrapper.plugin_settings ) cls.__pydantic_serializer__ = SchemaSerializer(schema, core_config) - cls.__pydantic_complete__ = True + + if config_wrapper.validate_assignment: + + @wraps(cls.__setattr__) + def validated_setattr(instance: Any, __field: str, __value: str) -> None: + validator.validate_assignment(instance, __field, __value) + + cls.__setattr__ = validated_setattr.__get__(None, cls) # type: ignore + return True -def is_stdlib_dataclass(cls: type[Any], /) -> TypeIs[type[StandardDataclass]]: - """Returns `True` if the class is a stdlib dataclass and *not* a Pydantic dataclass. +def process_param_defaults(param: Parameter) -> Parameter: + """Custom processing where the parameter default is of type FieldInfo - Unlike the stdlib `dataclasses.is_dataclass()` function, this does *not* include subclasses - of a dataclass that are themselves not dataclasses. + Args: + param (Parameter): The parameter + + Returns: + Parameter: The custom processed parameter + """ + param_default = param.default + if isinstance(param_default, FieldInfo): + annotation = param.annotation + # Replace the annotation if appropriate + # inspect does "clever" things to show annotations as strings because we have + # `from __future__ import annotations` in main, we don't want that + if annotation == 'Any': + annotation = Any + + # Replace the field name with the alias if present + name = param.name + alias = param_default.alias + validation_alias = param_default.validation_alias + if validation_alias is None and isinstance(alias, str) and is_valid_identifier(alias): + name = alias + elif isinstance(validation_alias, str) and is_valid_identifier(validation_alias): + name = validation_alias + + # Replace the field default + default = param_default.default + if default is PydanticUndefined: + if param_default.default_factory is PydanticUndefined: + default = inspect.Signature.empty + else: + # this is used by dataclasses to indicate a factory exists: + default = dataclasses._HAS_DEFAULT_FACTORY # type: ignore + return param.replace(annotation=annotation, name=name, default=default) + return param + + +def generate_dataclass_signature( + cls: type[StandardDataclass], fields: dict[str, FieldInfo], config_wrapper: ConfigWrapper +) -> Signature: + """Generate signature for a pydantic dataclass. + + Args: + cls: The dataclass. + fields: The model fields. + config_wrapper: The config wrapper instance. + + Returns: + The dataclass signature. + """ + return generate_pydantic_signature( + init=cls.__init__, fields=fields, config_wrapper=config_wrapper, post_process_parameter=process_param_defaults + ) + + +def is_builtin_dataclass(_cls: type[Any]) -> TypeGuard[type[StandardDataclass]]: + """Returns True if a class is a stdlib dataclass and *not* a pydantic dataclass. + + We check that + - `_cls` is a dataclass + - `_cls` does not inherit from a processed pydantic dataclass (and thus have a `__pydantic_validator__`) + - `_cls` does not have any annotations that are not dataclass fields + e.g. + ```py + import dataclasses + + import pydantic.dataclasses + + @dataclasses.dataclass + class A: + x: int + + @pydantic.dataclasses.dataclass + class B(A): + y: int + ``` + In this case, when we first check `B`, we make an extra check and look at the annotations ('y'), + which won't be a superset of all the dataclass fields (only the stdlib fields i.e. 'x') Args: cls: The class. @@ -202,114 +274,8 @@ def is_stdlib_dataclass(cls: type[Any], /) -> TypeIs[type[StandardDataclass]]: Returns: `True` if the class is a stdlib dataclass, `False` otherwise. """ - return '__dataclass_fields__' in cls.__dict__ and not hasattr(cls, '__pydantic_validator__') - - -def as_dataclass_field(pydantic_field: FieldInfo) -> dataclasses.Field[Any]: - field_args: dict[str, Any] = {'default': pydantic_field} - - # Needed because if `doc` is set, the dataclass slots will be a dict (field name -> doc) instead of a tuple: - if sys.version_info >= (3, 14) and pydantic_field.description is not None: - field_args['doc'] = pydantic_field.description - - # Needed as the stdlib dataclass module processes kw_only in a specific way during class construction: - if sys.version_info >= (3, 10) and pydantic_field.kw_only: - field_args['kw_only'] = True - - # Needed as the stdlib dataclass modules generates `__repr__()` during class construction: - if pydantic_field.repr is not True: - field_args['repr'] = pydantic_field.repr - - return dataclasses.field(**field_args) - - -DcFields: TypeAlias = dict[str, dataclasses.Field[Any]] - - -@contextmanager -def patch_base_fields(cls: type[Any]) -> Generator[None]: - """Temporarily patch the stdlib dataclasses bases of `cls` if the Pydantic `Field()` function is used. - - When creating a Pydantic dataclass, it is possible to inherit from stdlib dataclasses, where - the Pydantic `Field()` function is used. To create this Pydantic dataclass, we first apply - the stdlib `@dataclass` decorator on it. During the construction of the stdlib dataclass, - the `kw_only` and `repr` field arguments need to be understood by the stdlib *during* the - dataclass construction. To do so, we temporarily patch the fields dictionary of the affected - bases. - - For instance, with the following example: - - ```python {test="skip" lint="skip"} - import dataclasses as stdlib_dc - - import pydantic - import pydantic.dataclasses as pydantic_dc - - @stdlib_dc.dataclass - class A: - a: int = pydantic.Field(repr=False) - - # Notice that the `repr` attribute of the dataclass field is `True`: - A.__dataclass_fields__['a'] - #> dataclass.Field(default=FieldInfo(repr=False), repr=True, ...) - - @pydantic_dc.dataclass - class B(A): - b: int = pydantic.Field(repr=False) - ``` - - When passing `B` to the stdlib `@dataclass` decorator, it will look for fields in the parent classes - and reuse them directly. When this context manager is active, `A` will be temporarily patched to be - equivalent to: - - ```python {test="skip" lint="skip"} - @stdlib_dc.dataclass - class A: - a: int = stdlib_dc.field(default=Field(repr=False), repr=False) - ``` - - !!! note - This is only applied to the bases of `cls`, and not `cls` itself. The reason is that the Pydantic - dataclass decorator "owns" `cls` (in the previous example, `B`). As such, we instead modify the fields - directly (in the previous example, we simply do `setattr(B, 'b', as_dataclass_field(pydantic_field))`). - - !!! note - This approach is far from ideal, and can probably be the source of unwanted side effects/race conditions. - The previous implemented approach was mutating the `__annotations__` dict of `cls`, which is no longer a - safe operation in Python 3.14+, and resulted in unexpected behavior with field ordering anyway. - """ - # A list of two-tuples, the first element being a reference to the - # dataclass fields dictionary, the second element being a mapping between - # the field names that were modified, and their original `Field`: - original_fields_list: list[tuple[DcFields, DcFields]] = [] - - for base in cls.__mro__[1:]: - dc_fields: dict[str, dataclasses.Field[Any]] = base.__dict__.get('__dataclass_fields__', {}) - dc_fields_with_pydantic_field_defaults = { - field_name: field - for field_name, field in dc_fields.items() - if isinstance(field.default, FieldInfo) - # Only do the patching if one of the affected attributes is set: - and (field.default.description is not None or field.default.kw_only or field.default.repr is not True) - } - if dc_fields_with_pydantic_field_defaults: - original_fields_list.append((dc_fields, dc_fields_with_pydantic_field_defaults)) - for field_name, field in dc_fields_with_pydantic_field_defaults.items(): - default = cast(FieldInfo, field.default) - # `dataclasses.Field` isn't documented as working with `copy.copy()`. - # It is a class with `__slots__`, so should work (and we hope for the best): - new_dc_field = copy.copy(field) - # For base fields, no need to set `doc` from `FieldInfo.description`, this is only relevant - # for the class under construction and handled in `as_dataclass_field()`. - if sys.version_info >= (3, 10) and default.kw_only: - new_dc_field.kw_only = True - if default.repr is not True: - new_dc_field.repr = default.repr - dc_fields[field_name] = new_dc_field - - try: - yield - finally: - for fields, original_fields in original_fields_list: - for field_name, original_field in original_fields.items(): - fields[field_name] = original_field + return ( + dataclasses.is_dataclass(_cls) + and not hasattr(_cls, '__pydantic_validator__') + and set(_cls.__dataclass_fields__).issuperset(set(getattr(_cls, '__annotations__', {}))) + ) diff --git a/Backend/venv/lib/python3.12/site-packages/pydantic/_internal/_decorators.py b/Backend/venv/lib/python3.12/site-packages/pydantic/_internal/_decorators.py index 2a43bbb6..2f811a22 100644 --- a/Backend/venv/lib/python3.12/site-packages/pydantic/_internal/_decorators.py +++ b/Backend/venv/lib/python3.12/site-packages/pydantic/_internal/_decorators.py @@ -1,31 +1,30 @@ """Logic related to validators applied to models etc. via the `@field_validator` and `@model_validator` decorators.""" - from __future__ import annotations as _annotations -import sys -import types from collections import deque -from collections.abc import Iterable from dataclasses import dataclass, field -from functools import cached_property, partial, partialmethod +from functools import partial, partialmethod from inspect import Parameter, Signature, isdatadescriptor, ismethoddescriptor, signature from itertools import islice -from typing import TYPE_CHECKING, Any, Callable, ClassVar, Generic, Literal, TypeVar, Union +from typing import TYPE_CHECKING, Any, Callable, ClassVar, Generic, Iterable, TypeVar, Union -from pydantic_core import PydanticUndefined, PydanticUndefinedType, core_schema -from typing_extensions import TypeAlias, is_typeddict +from pydantic_core import PydanticUndefined, core_schema +from typing_extensions import Literal, TypeAlias, is_typeddict from ..errors import PydanticUserError from ._core_utils import get_type_ref from ._internal_dataclass import slots_true -from ._namespace_utils import GlobalsNamespace, MappingNamespace from ._typing_extra import get_function_type_hints -from ._utils import can_be_positional if TYPE_CHECKING: from ..fields import ComputedFieldInfo from ..functional_validators import FieldValidatorModes - from ._config import ConfigWrapper + +try: + from functools import cached_property # type: ignore +except ImportError: + # python 3.7 + cached_property = None @dataclass(**slots_true) @@ -62,9 +61,6 @@ class FieldValidatorDecoratorInfo: fields: A tuple of field names the validator should be called on. mode: The proposed validator mode. check_fields: Whether to check that the fields actually exist on the model. - json_schema_input_type: The input type of the function. This is only used to generate - the appropriate JSON Schema (in validation mode) and can only specified - when `mode` is either `'before'`, `'plain'` or `'wrap'`. """ decorator_repr: ClassVar[str] = '@field_validator' @@ -72,7 +68,6 @@ class FieldValidatorDecoratorInfo: fields: tuple[str, ...] mode: FieldValidatorModes check_fields: bool | None - json_schema_input_type: Any @dataclass(**slots_true) @@ -137,7 +132,7 @@ class ModelValidatorDecoratorInfo: while building the pydantic-core schema. Attributes: - decorator_repr: A class variable representing the decorator string, '@model_validator'. + decorator_repr: A class variable representing the decorator string, '@model_serializer'. mode: The proposed serializer mode. """ @@ -188,28 +183,22 @@ class PydanticDescriptorProxy(Generic[ReturnType]): def _call_wrapped_attr(self, func: Callable[[Any], None], *, name: str) -> PydanticDescriptorProxy[ReturnType]: self.wrapped = getattr(self.wrapped, name)(func) - if isinstance(self.wrapped, property): - # update ComputedFieldInfo.wrapped_property - from ..fields import ComputedFieldInfo - - if isinstance(self.decorator_info, ComputedFieldInfo): - self.decorator_info.wrapped_property = self.wrapped return self def __get__(self, obj: object | None, obj_type: type[object] | None = None) -> PydanticDescriptorProxy[ReturnType]: try: - return self.wrapped.__get__(obj, obj_type) # pyright: ignore[reportReturnType] + return self.wrapped.__get__(obj, obj_type) except AttributeError: # not a descriptor, e.g. a partial object return self.wrapped # type: ignore[return-value] def __set_name__(self, instance: Any, name: str) -> None: if hasattr(self.wrapped, '__set_name__'): - self.wrapped.__set_name__(instance, name) # pyright: ignore[reportFunctionMemberAccess] + self.wrapped.__set_name__(instance, name) - def __getattr__(self, name: str, /) -> Any: + def __getattr__(self, __name: str) -> Any: """Forward checks for __isabstractmethod__ and such.""" - return getattr(self.wrapped, name) + return getattr(self.wrapped, __name) DecoratorInfoType = TypeVar('DecoratorInfoType', bound=DecoratorInfo) @@ -511,20 +500,13 @@ class DecoratorInfos: # so then we don't need to re-process the type, which means we can discard our descriptor wrappers # and replace them with the thing they are wrapping (see the other setattr call below) # which allows validator class methods to also function as regular class methods - model_dc.__pydantic_decorators__ = res + setattr(model_dc, '__pydantic_decorators__', res) for name, value in to_replace: setattr(model_dc, name, value) return res - def update_from_config(self, config_wrapper: ConfigWrapper) -> None: - """Update the decorator infos from the configuration of the class they are attached to.""" - for name, computed_field_dec in self.computed_fields.items(): - computed_field_dec.info._update_from_config(config_wrapper, name) - -def inspect_validator( - validator: Callable[..., Any], *, mode: FieldValidatorModes, type: Literal['field', 'model'] -) -> bool: +def inspect_validator(validator: Callable[..., Any], mode: FieldValidatorModes) -> bool: """Look at a field or model validator function and determine whether it takes an info argument. An error is raised if the function has an invalid signature. @@ -532,18 +514,18 @@ def inspect_validator( Args: validator: The validator function to inspect. mode: The proposed validator mode. - type: The type of validator, either 'field' or 'model'. Returns: Whether the validator takes an info argument. """ try: - sig = _signature_no_eval(validator) - except (ValueError, TypeError): - # `inspect.signature` might not be able to infer a signature, e.g. with C objects. - # In this case, we assume no info argument is present: + sig = signature(validator) + except ValueError: + # builtins and some C extensions don't have signatures + # assume that they don't take an info argument and only take a single argument + # e.g. `str.strip` or `datetime.datetime` return False - n_positional = count_positional_required_params(sig) + n_positional = count_positional_params(sig) if mode == 'wrap': if n_positional == 3: return True @@ -557,12 +539,14 @@ def inspect_validator( return False raise PydanticUserError( - f'Unrecognized {type} validator function signature for {validator} with `mode={mode}`: {sig}', + f'Unrecognized field_validator function signature for {validator} with `mode={mode}`:{sig}', code='validator-signature', ) -def inspect_field_serializer(serializer: Callable[..., Any], mode: Literal['plain', 'wrap']) -> tuple[bool, bool]: +def inspect_field_serializer( + serializer: Callable[..., Any], mode: Literal['plain', 'wrap'], computed_field: bool = False +) -> tuple[bool, bool]: """Look at a field serializer function and determine if it is a field serializer, and whether it takes an info argument. @@ -571,21 +555,18 @@ def inspect_field_serializer(serializer: Callable[..., Any], mode: Literal['plai Args: serializer: The serializer function to inspect. mode: The serializer mode, either 'plain' or 'wrap'. + computed_field: When serializer is applied on computed_field. It doesn't require + info signature. Returns: Tuple of (is_field_serializer, info_arg). """ - try: - sig = _signature_no_eval(serializer) - except (ValueError, TypeError): - # `inspect.signature` might not be able to infer a signature, e.g. with C objects. - # In this case, we assume no info argument is present and this is not a method: - return (False, False) + sig = signature(serializer) first = next(iter(sig.parameters.values()), None) is_field_serializer = first is not None and first.name == 'self' - n_positional = count_positional_required_params(sig) + n_positional = count_positional_params(sig) if is_field_serializer: # -1 to correct for self parameter info_arg = _serializer_info_arg(mode, n_positional - 1) @@ -597,8 +578,13 @@ def inspect_field_serializer(serializer: Callable[..., Any], mode: Literal['plai f'Unrecognized field_serializer function signature for {serializer} with `mode={mode}`:{sig}', code='field-serializer-signature', ) + if info_arg and computed_field: + raise PydanticUserError( + 'field_serializer on computed_field does not use info signature', code='field-serializer-signature' + ) - return is_field_serializer, info_arg + else: + return is_field_serializer, info_arg def inspect_annotated_serializer(serializer: Callable[..., Any], mode: Literal['plain', 'wrap']) -> bool: @@ -613,13 +599,8 @@ def inspect_annotated_serializer(serializer: Callable[..., Any], mode: Literal[' Returns: info_arg """ - try: - sig = _signature_no_eval(serializer) - except (ValueError, TypeError): - # `inspect.signature` might not be able to infer a signature, e.g. with C objects. - # In this case, we assume no info argument is present: - return False - info_arg = _serializer_info_arg(mode, count_positional_required_params(sig)) + sig = signature(serializer) + info_arg = _serializer_info_arg(mode, count_positional_params(sig)) if info_arg is None: raise PydanticUserError( f'Unrecognized field_serializer function signature for {serializer} with `mode={mode}`:{sig}', @@ -646,8 +627,8 @@ def inspect_model_serializer(serializer: Callable[..., Any], mode: Literal['plai '`@model_serializer` must be applied to instance methods', code='model-serializer-instance-method' ) - sig = _signature_no_eval(serializer) - info_arg = _serializer_info_arg(mode, count_positional_required_params(sig)) + sig = signature(serializer) + info_arg = _serializer_info_arg(mode, count_positional_params(sig)) if info_arg is None: raise PydanticUserError( f'Unrecognized model_serializer function signature for {serializer} with `mode={mode}`:{sig}', @@ -660,18 +641,18 @@ def inspect_model_serializer(serializer: Callable[..., Any], mode: Literal['plai def _serializer_info_arg(mode: Literal['plain', 'wrap'], n_positional: int) -> bool | None: if mode == 'plain': if n_positional == 1: - # (input_value: Any, /) -> Any + # (__input_value: Any) -> Any return False elif n_positional == 2: - # (model: Any, input_value: Any, /) -> Any + # (__model: Any, __input_value: Any) -> Any return True else: assert mode == 'wrap', f"invalid mode: {mode!r}, expected 'plain' or 'wrap'" if n_positional == 2: - # (input_value: Any, serializer: SerializerFunctionWrapHandler, /) -> Any + # (__input_value: Any, __serializer: SerializerFunctionWrapHandler) -> Any return False elif n_positional == 3: - # (input_value: Any, serializer: SerializerFunctionWrapHandler, info: SerializationInfo, /) -> Any + # (__input_value: Any, __serializer: SerializerFunctionWrapHandler, __info: SerializationInfo) -> Any return True return None @@ -694,7 +675,7 @@ def is_instance_method_from_sig(function: AnyDecoratorCallable) -> bool: Returns: `True` if the function is an instance method, `False` otherwise. """ - sig = _signature_no_eval(unwrap_wrapped_function(function)) + sig = signature(unwrap_wrapped_function(function)) first = next(iter(sig.parameters.values()), None) if first and first.name == 'self': return True @@ -718,7 +699,7 @@ def ensure_classmethod_based_on_signature(function: AnyDecoratorCallable) -> Any def _is_classmethod_from_sig(function: AnyDecoratorCallable) -> bool: - sig = _signature_no_eval(unwrap_wrapped_function(function)) + sig = signature(unwrap_wrapped_function(function)) first = next(iter(sig.parameters.values()), None) if first and first.name == 'cls': return True @@ -732,25 +713,34 @@ def unwrap_wrapped_function( unwrap_class_static_method: bool = True, ) -> Any: """Recursively unwraps a wrapped function until the underlying function is reached. - This handles property, functools.partial, functools.partialmethod, staticmethod, and classmethod. + This handles property, functools.partial, functools.partialmethod, staticmethod and classmethod. Args: func: The function to unwrap. - unwrap_partial: If True (default), unwrap partial and partialmethod decorators. + unwrap_partial: If True (default), unwrap partial and partialmethod decorators, otherwise don't. + decorators. unwrap_class_static_method: If True (default), also unwrap classmethod and staticmethod decorators. If False, only unwrap partial and partialmethod decorators. Returns: The underlying function of the wrapped function. """ - # Define the types we want to check against as a single tuple. - unwrap_types = ( - (property, cached_property) - + ((partial, partialmethod) if unwrap_partial else ()) - + ((staticmethod, classmethod) if unwrap_class_static_method else ()) - ) + all: set[Any] = {property} - while isinstance(func, unwrap_types): + if unwrap_partial: + all.update({partial, partialmethod}) + + try: + from functools import cached_property # type: ignore + except ImportError: + cached_property = type('', (), {}) + else: + all.add(cached_property) + + if unwrap_class_static_method: + all.update({staticmethod, classmethod}) + + while isinstance(func, tuple(all)): if unwrap_class_static_method and isinstance(func, (classmethod, staticmethod)): func = func.__func__ elif isinstance(func, (partial, partialmethod)): @@ -765,72 +755,38 @@ def unwrap_wrapped_function( return func -_function_like = ( - partial, - partialmethod, - types.FunctionType, - types.BuiltinFunctionType, - types.MethodType, - types.WrapperDescriptorType, - types.MethodWrapperType, - types.MemberDescriptorType, -) +def get_function_return_type( + func: Any, explicit_return_type: Any, types_namespace: dict[str, Any] | None = None +) -> Any: + """Get the function return type. - -def get_callable_return_type( - callable_obj: Any, - globalns: GlobalsNamespace | None = None, - localns: MappingNamespace | None = None, -) -> Any | PydanticUndefinedType: - """Get the callable return type. + It gets the return type from the type annotation if `explicit_return_type` is `None`. + Otherwise, it returns `explicit_return_type`. Args: - callable_obj: The callable to analyze. - globalns: The globals namespace to use during type annotation evaluation. - localns: The locals namespace to use during type annotation evaluation. + func: The function to get its return type. + explicit_return_type: The explicit return type. + types_namespace: The types namespace, defaults to `None`. Returns: The function return type. """ - if isinstance(callable_obj, type): - # types are callables, and we assume the return type - # is the type itself (e.g. `int()` results in an instance of `int`). - return callable_obj - - if not isinstance(callable_obj, _function_like): - call_func = getattr(type(callable_obj), '__call__', None) # noqa: B004 - if call_func is not None: - callable_obj = call_func - - hints = get_function_type_hints( - unwrap_wrapped_function(callable_obj), - include_keys={'return'}, - globalns=globalns, - localns=localns, - ) - return hints.get('return', PydanticUndefined) + if explicit_return_type is PydanticUndefined: + # try to get it from the type annotation + hints = get_function_type_hints( + unwrap_wrapped_function(func), include_keys={'return'}, types_namespace=types_namespace + ) + return hints.get('return', PydanticUndefined) + else: + return explicit_return_type -def count_positional_required_params(sig: Signature) -> int: - """Get the number of positional (required) arguments of a signature. +def count_positional_params(sig: Signature) -> int: + return sum(1 for param in sig.parameters.values() if can_be_positional(param)) - This function should only be used to inspect signatures of validation and serialization functions. - The first argument (the value being serialized or validated) is counted as a required argument - even if a default value exists. - Returns: - The number of positional arguments of a signature. - """ - parameters = list(sig.parameters.values()) - return sum( - 1 - for param in parameters - if can_be_positional(param) - # First argument is the value being validated/serialized, and can have a default value - # (e.g. `float`, which has signature `(x=0, /)`). We assume other parameters (the info arg - # for instance) should be required, and thus without any default value. - and (param.default is Parameter.empty or param is parameters[0]) - ) +def can_be_positional(param: Parameter) -> bool: + return param.kind in (Parameter.POSITIONAL_ONLY, Parameter.POSITIONAL_OR_KEYWORD) def ensure_property(f: Any) -> Any: @@ -846,13 +802,3 @@ def ensure_property(f: Any) -> Any: return f else: return property(f) - - -def _signature_no_eval(f: Callable[..., Any]) -> Signature: - """Get the signature of a callable without evaluating any annotations.""" - if sys.version_info >= (3, 14): - from annotationlib import Format - - return signature(f, annotation_format=Format.FORWARDREF) - else: - return signature(f) diff --git a/Backend/venv/lib/python3.12/site-packages/pydantic/_internal/_decorators_v1.py b/Backend/venv/lib/python3.12/site-packages/pydantic/_internal/_decorators_v1.py index 34273779..4f81e6d4 100644 --- a/Backend/venv/lib/python3.12/site-packages/pydantic/_internal/_decorators_v1.py +++ b/Backend/venv/lib/python3.12/site-packages/pydantic/_internal/_decorators_v1.py @@ -1,45 +1,49 @@ """Logic for V1 validators, e.g. `@validator` and `@root_validator`.""" - from __future__ import annotations as _annotations from inspect import Parameter, signature -from typing import Any, Union, cast +from typing import Any, Dict, Tuple, Union, cast from pydantic_core import core_schema from typing_extensions import Protocol from ..errors import PydanticUserError -from ._utils import can_be_positional +from ._decorators import can_be_positional class V1OnlyValueValidator(Protocol): """A simple validator, supported for V1 validators and V2 validators.""" - def __call__(self, __value: Any) -> Any: ... + def __call__(self, __value: Any) -> Any: + ... class V1ValidatorWithValues(Protocol): """A validator with `values` argument, supported for V1 validators and V2 validators.""" - def __call__(self, __value: Any, values: dict[str, Any]) -> Any: ... + def __call__(self, __value: Any, values: dict[str, Any]) -> Any: + ... class V1ValidatorWithValuesKwOnly(Protocol): """A validator with keyword only `values` argument, supported for V1 validators and V2 validators.""" - def __call__(self, __value: Any, *, values: dict[str, Any]) -> Any: ... + def __call__(self, __value: Any, *, values: dict[str, Any]) -> Any: + ... class V1ValidatorWithKwargs(Protocol): """A validator with `kwargs` argument, supported for V1 validators and V2 validators.""" - def __call__(self, __value: Any, **kwargs: Any) -> Any: ... + def __call__(self, __value: Any, **kwargs: Any) -> Any: + ... class V1ValidatorWithValuesAndKwargs(Protocol): """A validator with `values` and `kwargs` arguments, supported for V1 validators and V2 validators.""" - def __call__(self, __value: Any, values: dict[str, Any], **kwargs: Any) -> Any: ... + def __call__(self, __value: Any, values: dict[str, Any], **kwargs: Any) -> Any: + ... V1Validator = Union[ @@ -105,21 +109,23 @@ def make_generic_v1_field_validator(validator: V1Validator) -> core_schema.WithI return wrapper2 -RootValidatorValues = dict[str, Any] +RootValidatorValues = Dict[str, Any] # technically tuple[model_dict, model_extra, fields_set] | tuple[dataclass_dict, init_vars] -RootValidatorFieldsTuple = tuple[Any, ...] +RootValidatorFieldsTuple = Tuple[Any, ...] class V1RootValidatorFunction(Protocol): """A simple root validator, supported for V1 validators and V2 validators.""" - def __call__(self, __values: RootValidatorValues) -> RootValidatorValues: ... + def __call__(self, __values: RootValidatorValues) -> RootValidatorValues: + ... class V2CoreBeforeRootValidator(Protocol): """V2 validator with mode='before'.""" - def __call__(self, __values: RootValidatorValues, __info: core_schema.ValidationInfo) -> RootValidatorValues: ... + def __call__(self, __values: RootValidatorValues, __info: core_schema.ValidationInfo) -> RootValidatorValues: + ... class V2CoreAfterRootValidator(Protocol): @@ -127,7 +133,8 @@ class V2CoreAfterRootValidator(Protocol): def __call__( self, __fields_tuple: RootValidatorFieldsTuple, __info: core_schema.ValidationInfo - ) -> RootValidatorFieldsTuple: ... + ) -> RootValidatorFieldsTuple: + ... def make_v1_generic_root_validator( diff --git a/Backend/venv/lib/python3.12/site-packages/pydantic/_internal/_discriminated_union.py b/Backend/venv/lib/python3.12/site-packages/pydantic/_internal/_discriminated_union.py index 5dd6fdaf..e3806b8f 100644 --- a/Backend/venv/lib/python3.12/site-packages/pydantic/_internal/_discriminated_union.py +++ b/Backend/venv/lib/python3.12/site-packages/pydantic/_internal/_discriminated_union.py @@ -1,19 +1,22 @@ from __future__ import annotations as _annotations -from collections.abc import Hashable, Sequence -from typing import TYPE_CHECKING, Any, cast +from typing import TYPE_CHECKING, Any, Hashable, Sequence from pydantic_core import CoreSchema, core_schema from ..errors import PydanticUserError from . import _core_utils from ._core_utils import ( + NEEDS_APPLY_DISCRIMINATED_UNION_METADATA_KEY, CoreSchemaField, + collect_definitions, + simplify_schema_references, ) if TYPE_CHECKING: from ..types import Discriminator - from ._core_metadata import CoreMetadata + +CORE_SCHEMA_METADATA_DISCRIMINATOR_PLACEHOLDER_KEY = 'pydantic.internal.union_discriminator' class MissingDefinitionForUnionRef(Exception): @@ -26,9 +29,35 @@ class MissingDefinitionForUnionRef(Exception): super().__init__(f'Missing definition for ref {self.ref!r}') -def set_discriminator_in_metadata(schema: CoreSchema, discriminator: Any) -> None: - metadata = cast('CoreMetadata', schema.setdefault('metadata', {})) - metadata['pydantic_internal_union_discriminator'] = discriminator +def set_discriminator(schema: CoreSchema, discriminator: Any) -> None: + schema.setdefault('metadata', {}) + metadata = schema.get('metadata') + assert metadata is not None + metadata[CORE_SCHEMA_METADATA_DISCRIMINATOR_PLACEHOLDER_KEY] = discriminator + + +def apply_discriminators(schema: core_schema.CoreSchema) -> core_schema.CoreSchema: + definitions: dict[str, CoreSchema] | None = None + + def inner(s: core_schema.CoreSchema, recurse: _core_utils.Recurse) -> core_schema.CoreSchema: + nonlocal definitions + if 'metadata' in s: + if s['metadata'].get(NEEDS_APPLY_DISCRIMINATED_UNION_METADATA_KEY, True) is False: + return s + + s = recurse(s, inner) + if s['type'] == 'tagged-union': + return s + + metadata = s.get('metadata', {}) + discriminator = metadata.get(CORE_SCHEMA_METADATA_DISCRIMINATOR_PLACEHOLDER_KEY, None) + if discriminator is not None: + if definitions is None: + definitions = collect_definitions(schema) + s = apply_discriminator(s, discriminator, definitions) + return s + + return simplify_schema_references(_core_utils.walk_core_schema(schema, inner)) def apply_discriminator( @@ -134,7 +163,7 @@ class _ApplyInferredDiscriminator: # in the output TaggedUnionSchema that will replace the union from the input schema self._tagged_union_choices: dict[Hashable, core_schema.CoreSchema] = {} - # `_used` is changed to True after applying the discriminator to prevent accidental reuse + # `_used` is changed to True after applying the discriminator to prevent accidental re-use self._used = False def apply(self, schema: core_schema.CoreSchema) -> core_schema.CoreSchema: @@ -160,11 +189,16 @@ class _ApplyInferredDiscriminator: - If discriminator fields have different aliases. - If discriminator field not of type `Literal`. """ + self.definitions.update(collect_definitions(schema)) assert not self._used schema = self._apply_to_root(schema) if self._should_be_nullable and not self._is_nullable: schema = core_schema.nullable_schema(schema) self._used = True + new_defs = collect_definitions(schema) + missing_defs = self.definitions.keys() - new_defs.keys() + if missing_defs: + schema = core_schema.definitions_schema(schema, [self.definitions[ref] for ref in missing_defs]) return schema def _apply_to_root(self, schema: core_schema.CoreSchema) -> core_schema.CoreSchema: @@ -234,10 +268,6 @@ class _ApplyInferredDiscriminator: * Validating that each allowed discriminator value maps to a unique choice * Updating the _tagged_union_choices mapping that will ultimately be used to build the TaggedUnionSchema. """ - if choice['type'] == 'definition-ref': - if choice['schema_ref'] not in self.definitions: - raise MissingDefinitionForUnionRef(choice['schema_ref']) - if choice['type'] == 'none': self._should_be_nullable = True elif choice['type'] == 'definitions': @@ -249,6 +279,10 @@ class _ApplyInferredDiscriminator: # Reverse the choices list before extending the stack so that they get handled in the order they occur choices_schemas = [v[0] if isinstance(v, tuple) else v for v in choice['choices'][::-1]] self._choices_to_handle.extend(choices_schemas) + elif choice['type'] == 'definition-ref': + if choice['schema_ref'] not in self.definitions: + raise MissingDefinitionForUnionRef(choice['schema_ref']) + self._handle_choice(self.definitions[choice['schema_ref']]) elif choice['type'] not in { 'model', 'typed-dict', @@ -256,16 +290,12 @@ class _ApplyInferredDiscriminator: 'lax-or-strict', 'dataclass', 'dataclass-args', - 'definition-ref', } and not _core_utils.is_function_with_inner_schema(choice): # We should eventually handle 'definition-ref' as well - err_str = f'The core schema type {choice["type"]!r} is not a valid discriminated union variant.' - if choice['type'] == 'list': - err_str += ( - ' If you are making use of a list of union types, make sure the discriminator is applied to the ' - 'union type and not the list (e.g. `list[Annotated[ | , Field(discriminator=...)]]`).' - ) - raise TypeError(err_str) + raise TypeError( + f'{choice["type"]!r} is not a valid discriminated union variant;' + ' should be a `BaseModel` or `dataclass`' + ) else: if choice['type'] == 'tagged-union' and self._is_discriminator_shared(choice): # In this case, this inner tagged-union is compatible with the outer tagged-union, @@ -299,10 +329,13 @@ class _ApplyInferredDiscriminator: """ if choice['type'] == 'definitions': return self._infer_discriminator_values_for_choice(choice['schema'], source_name=source_name) - + elif choice['type'] == 'function-plain': + raise TypeError( + f'{choice["type"]!r} is not a valid discriminated union variant;' + ' should be a `BaseModel` or `dataclass`' + ) elif _core_utils.is_function_with_inner_schema(choice): return self._infer_discriminator_values_for_choice(choice['schema'], source_name=source_name) - elif choice['type'] == 'lax-or-strict': return sorted( set( @@ -353,13 +386,10 @@ class _ApplyInferredDiscriminator: raise MissingDefinitionForUnionRef(schema_ref) return self._infer_discriminator_values_for_choice(self.definitions[schema_ref], source_name=source_name) else: - err_str = f'The core schema type {choice["type"]!r} is not a valid discriminated union variant.' - if choice['type'] == 'list': - err_str += ( - ' If you are making use of a list of union types, make sure the discriminator is applied to the ' - 'union type and not the list (e.g. `list[Annotated[ | , Field(discriminator=...)]]`).' - ) - raise TypeError(err_str) + raise TypeError( + f'{choice["type"]!r} is not a valid discriminated union variant;' + ' should be a `BaseModel` or `dataclass`' + ) def _infer_discriminator_values_for_typed_dict_choice( self, choice: core_schema.TypedDictSchema, source_name: str | None = None diff --git a/Backend/venv/lib/python3.12/site-packages/pydantic/_internal/_docs_extraction.py b/Backend/venv/lib/python3.12/site-packages/pydantic/_internal/_docs_extraction.py deleted file mode 100644 index 6df77bf6..00000000 --- a/Backend/venv/lib/python3.12/site-packages/pydantic/_internal/_docs_extraction.py +++ /dev/null @@ -1,113 +0,0 @@ -"""Utilities related to attribute docstring extraction.""" - -from __future__ import annotations - -import ast -import inspect -import sys -import textwrap -from typing import Any - - -class DocstringVisitor(ast.NodeVisitor): - def __init__(self) -> None: - super().__init__() - - self.target: str | None = None - self.attrs: dict[str, str] = {} - self.previous_node_type: type[ast.AST] | None = None - - def visit(self, node: ast.AST) -> Any: - node_result = super().visit(node) - self.previous_node_type = type(node) - return node_result - - def visit_AnnAssign(self, node: ast.AnnAssign) -> Any: - if isinstance(node.target, ast.Name): - self.target = node.target.id - - def visit_Expr(self, node: ast.Expr) -> Any: - if ( - isinstance(node.value, ast.Constant) - and isinstance(node.value.value, str) - and self.previous_node_type is ast.AnnAssign - ): - docstring = inspect.cleandoc(node.value.value) - if self.target: - self.attrs[self.target] = docstring - self.target = None - - -def _dedent_source_lines(source: list[str]) -> str: - # Required for nested class definitions, e.g. in a function block - dedent_source = textwrap.dedent(''.join(source)) - if dedent_source.startswith((' ', '\t')): - # We are in the case where there's a dedented (usually multiline) string - # at a lower indentation level than the class itself. We wrap our class - # in a function as a workaround. - dedent_source = f'def dedent_workaround():\n{dedent_source}' - return dedent_source - - -def _extract_source_from_frame(cls: type[Any]) -> list[str] | None: - frame = inspect.currentframe() - - while frame: - if inspect.getmodule(frame) is inspect.getmodule(cls): - lnum = frame.f_lineno - try: - lines, _ = inspect.findsource(frame) - except OSError: # pragma: no cover - # Source can't be retrieved (maybe because running in an interactive terminal), - # we don't want to error here. - pass - else: - block_lines = inspect.getblock(lines[lnum - 1 :]) - dedent_source = _dedent_source_lines(block_lines) - try: - block_tree = ast.parse(dedent_source) - except SyntaxError: - pass - else: - stmt = block_tree.body[0] - if isinstance(stmt, ast.FunctionDef) and stmt.name == 'dedent_workaround': - # `_dedent_source_lines` wrapped the class around the workaround function - stmt = stmt.body[0] - if isinstance(stmt, ast.ClassDef) and stmt.name == cls.__name__: - return block_lines - - frame = frame.f_back - - -def extract_docstrings_from_cls(cls: type[Any], use_inspect: bool = False) -> dict[str, str]: - """Map model attributes and their corresponding docstring. - - Args: - cls: The class of the Pydantic model to inspect. - use_inspect: Whether to skip usage of frames to find the object and use - the `inspect` module instead. - - Returns: - A mapping containing attribute names and their corresponding docstring. - """ - if use_inspect or sys.version_info >= (3, 13): - # On Python < 3.13, `inspect.getsourcelines()` might not work as expected - # if two classes have the same name in the same source file. - # On Python 3.13+, it will use the new `__firstlineno__` class attribute, - # making it way more robust. - try: - source, _ = inspect.getsourcelines(cls) - except OSError: # pragma: no cover - return {} - else: - # TODO remove this implementation when we drop support for Python 3.12: - source = _extract_source_from_frame(cls) - - if not source: - return {} - - dedent_source = _dedent_source_lines(source) - - visitor = DocstringVisitor() - visitor.visit(ast.parse(dedent_source)) - return visitor.attrs diff --git a/Backend/venv/lib/python3.12/site-packages/pydantic/_internal/_fields.py b/Backend/venv/lib/python3.12/site-packages/pydantic/_internal/_fields.py index aad2ac94..7a3410e3 100644 --- a/Backend/venv/lib/python3.12/site-packages/pydantic/_internal/_fields.py +++ b/Backend/venv/lib/python3.12/site-packages/pydantic/_internal/_fields.py @@ -1,40 +1,58 @@ """Private logic related to fields (the `Field()` function and `FieldInfo` class), and arguments to `Annotated`.""" - from __future__ import annotations as _annotations import dataclasses +import sys import warnings -from collections.abc import Mapping -from functools import cache -from inspect import Parameter, ismethoddescriptor, signature -from re import Pattern -from typing import TYPE_CHECKING, Any, Callable, TypeVar +from copy import copy +from functools import lru_cache +from typing import TYPE_CHECKING, Any from pydantic_core import PydanticUndefined -from typing_extensions import TypeIs -from typing_inspection.introspection import AnnotationSource -from pydantic import PydanticDeprecatedSince211 -from pydantic.errors import PydanticUserError - -from ..aliases import AliasGenerator -from . import _generics, _typing_extra +from . import _typing_extra from ._config import ConfigWrapper -from ._docs_extraction import extract_docstrings_from_cls -from ._import_utils import import_cached_base_model, import_cached_field_info -from ._namespace_utils import NsResolver from ._repr import Representation -from ._utils import can_be_positional, get_first_not_none +from ._typing_extra import get_cls_type_hints_lenient, get_type_hints, is_classvar, is_finalvar if TYPE_CHECKING: from annotated_types import BaseMetadata from ..fields import FieldInfo from ..main import BaseModel - from ._dataclasses import PydanticDataclass, StandardDataclass + from ._dataclasses import StandardDataclass from ._decorators import DecoratorInfos +def get_type_hints_infer_globalns( + obj: Any, + localns: dict[str, Any] | None = None, + include_extras: bool = False, +) -> dict[str, Any]: + """Gets type hints for an object by inferring the global namespace. + + It uses the `typing.get_type_hints`, The only thing that we do here is fetching + global namespace from `obj.__module__` if it is not `None`. + + Args: + obj: The object to get its type hints. + localns: The local namespaces. + include_extras: Whether to recursively include annotation metadata. + + Returns: + The object type hints. + """ + module_name = getattr(obj, '__module__', None) + globalns: dict[str, Any] | None = None + if module_name: + try: + globalns = sys.modules[module_name].__dict__ + except KeyError: + # happens occasionally, see https://github.com/pydantic/pydantic/issues/2363 + pass + return get_type_hints(obj, globalns=globalns, localns=localns, include_extras=include_extras) + + class PydanticMetadata(Representation): """Base class for annotation markers like `Strict`.""" @@ -53,7 +71,7 @@ def pydantic_general_metadata(**metadata: Any) -> BaseMetadata: return _general_metadata_cls()(metadata) # type: ignore -@cache +@lru_cache(maxsize=None) def _general_metadata_cls() -> type[BaseMetadata]: """Do it this way to avoid importing `annotated_types` at import time.""" from annotated_types import BaseMetadata @@ -67,176 +85,29 @@ def _general_metadata_cls() -> type[BaseMetadata]: return _PydanticGeneralMetadata # type: ignore -def _check_protected_namespaces( - protected_namespaces: tuple[str | Pattern[str], ...], - ann_name: str, - bases: tuple[type[Any], ...], - cls_name: str, -) -> None: - BaseModel = import_cached_base_model() - - for protected_namespace in protected_namespaces: - ns_violation = False - if isinstance(protected_namespace, Pattern): - ns_violation = protected_namespace.match(ann_name) is not None - elif isinstance(protected_namespace, str): - ns_violation = ann_name.startswith(protected_namespace) - - if ns_violation: - for b in bases: - if hasattr(b, ann_name): - if not (issubclass(b, BaseModel) and ann_name in getattr(b, '__pydantic_fields__', {})): - raise ValueError( - f'Field {ann_name!r} conflicts with member {getattr(b, ann_name)}' - f' of protected namespace {protected_namespace!r}.' - ) - else: - valid_namespaces: list[str] = [] - for pn in protected_namespaces: - if isinstance(pn, Pattern): - if not pn.match(ann_name): - valid_namespaces.append(f're.compile({pn.pattern!r})') - else: - if not ann_name.startswith(pn): - valid_namespaces.append(f"'{pn}'") - - valid_namespaces_str = f'({", ".join(valid_namespaces)}{",)" if len(valid_namespaces) == 1 else ")"}' - - warnings.warn( - f'Field {ann_name!r} in {cls_name!r} conflicts with protected namespace {protected_namespace!r}.\n\n' - f"You may be able to solve this by setting the 'protected_namespaces' configuration to {valid_namespaces_str}.", - UserWarning, - stacklevel=5, - ) - - -def _update_fields_from_docstrings(cls: type[Any], fields: dict[str, FieldInfo], use_inspect: bool = False) -> None: - fields_docs = extract_docstrings_from_cls(cls, use_inspect=use_inspect) - for ann_name, field_info in fields.items(): - if field_info.description is None and ann_name in fields_docs: - field_info.description = fields_docs[ann_name] - - -def _apply_field_title_generator_to_field_info( - title_generator: Callable[[str, FieldInfo], str], - field_name: str, - field_info: FieldInfo, -): - if field_info.title is None: - title = title_generator(field_name, field_info) - if not isinstance(title, str): - raise TypeError(f'field_title_generator {title_generator} must return str, not {title.__class__}') - - field_info.title = title - - -def _apply_alias_generator_to_field_info( - alias_generator: Callable[[str], str] | AliasGenerator, field_name: str, field_info: FieldInfo -): - """Apply an alias generator to aliases on a `FieldInfo` instance if appropriate. - - Args: - alias_generator: A callable that takes a string and returns a string, or an `AliasGenerator` instance. - field_name: The name of the field from which to generate the alias. - field_info: The `FieldInfo` instance to which the alias generator is (maybe) applied. - """ - # Apply an alias_generator if - # 1. An alias is not specified - # 2. An alias is specified, but the priority is <= 1 - if ( - field_info.alias_priority is None - or field_info.alias_priority <= 1 - or field_info.alias is None - or field_info.validation_alias is None - or field_info.serialization_alias is None - ): - alias, validation_alias, serialization_alias = None, None, None - - if isinstance(alias_generator, AliasGenerator): - alias, validation_alias, serialization_alias = alias_generator.generate_aliases(field_name) - elif callable(alias_generator): - alias = alias_generator(field_name) - if not isinstance(alias, str): - raise TypeError(f'alias_generator {alias_generator} must return str, not {alias.__class__}') - - # if priority is not set, we set to 1 - # which supports the case where the alias_generator from a child class is used - # to generate an alias for a field in a parent class - if field_info.alias_priority is None or field_info.alias_priority <= 1: - field_info.alias_priority = 1 - - # if the priority is 1, then we set the aliases to the generated alias - if field_info.alias_priority == 1: - field_info.serialization_alias = get_first_not_none(serialization_alias, alias) - field_info.validation_alias = get_first_not_none(validation_alias, alias) - field_info.alias = alias - - # if any of the aliases are not set, then we set them to the corresponding generated alias - if field_info.alias is None: - field_info.alias = alias - if field_info.serialization_alias is None: - field_info.serialization_alias = get_first_not_none(serialization_alias, alias) - if field_info.validation_alias is None: - field_info.validation_alias = get_first_not_none(validation_alias, alias) - - -def update_field_from_config(config_wrapper: ConfigWrapper, field_name: str, field_info: FieldInfo) -> None: - """Update the `FieldInfo` instance from the configuration set on the model it belongs to. - - This will apply the title and alias generators from the configuration. - - Args: - config_wrapper: The configuration from the model. - field_name: The field name the `FieldInfo` instance is attached to. - field_info: The `FieldInfo` instance to update. - """ - field_title_generator = field_info.field_title_generator or config_wrapper.field_title_generator - if field_title_generator is not None: - _apply_field_title_generator_to_field_info(field_title_generator, field_name, field_info) - if config_wrapper.alias_generator is not None: - _apply_alias_generator_to_field_info(config_wrapper.alias_generator, field_name, field_info) - - -_deprecated_method_names = {'dict', 'json', 'copy', '_iter', '_copy_and_set_values', '_calculate_keys'} - -_deprecated_classmethod_names = { - 'parse_obj', - 'parse_raw', - 'parse_file', - 'from_orm', - 'construct', - 'schema', - 'schema_json', - 'validate', - 'update_forward_refs', - '_get_value', -} - - def collect_model_fields( # noqa: C901 cls: type[BaseModel], + bases: tuple[type[Any], ...], config_wrapper: ConfigWrapper, - ns_resolver: NsResolver | None, + types_namespace: dict[str, Any] | None, *, - typevars_map: Mapping[TypeVar, Any] | None = None, + typevars_map: dict[Any, Any] | None = None, ) -> tuple[dict[str, FieldInfo], set[str]]: - """Collect the fields and class variables names of a nascent Pydantic model. + """Collect the fields of a nascent pydantic model. - The fields collection process is *lenient*, meaning it won't error if string annotations - fail to evaluate. If this happens, the original annotation (and assigned value, if any) - is stored on the created `FieldInfo` instance. + Also collect the names of any ClassVars present in the type hints. - The `rebuild_model_fields()` should be called at a later point (e.g. when rebuilding the model), - and will make use of these stored attributes. + The returned value is a tuple of two items: the fields dict, and the set of ClassVar names. Args: cls: BaseModel or dataclass. + bases: Parents of the class, generally `cls.__bases__`. config_wrapper: The config wrapper instance. - ns_resolver: Namespace resolver to use when getting model annotations. + types_namespace: Optional extra namespace to look for types in. typevars_map: A dictionary mapping type variables to their concrete types. Returns: - A two-tuple containing model fields and class variables names. + A tuple contains fields and class variables. Raises: NameError: @@ -244,58 +115,49 @@ def collect_model_fields( # noqa: C901 - If there is a field other than `root` in `RootModel`. - If a field shadows an attribute in the parent model. """ - FieldInfo_ = import_cached_field_info() - BaseModel_ = import_cached_base_model() + from ..fields import FieldInfo - bases = cls.__bases__ - parent_fields_lookup: dict[str, FieldInfo] = {} - for base in reversed(bases): - if model_fields := getattr(base, '__pydantic_fields__', None): - parent_fields_lookup.update(model_fields) - - type_hints = _typing_extra.get_model_type_hints(cls, ns_resolver=ns_resolver) + type_hints = get_cls_type_hints_lenient(cls, types_namespace) # https://docs.python.org/3/howto/annotations.html#accessing-the-annotations-dict-of-an-object-in-python-3-9-and-older # annotations is only used for finding fields in parent classes - annotations = _typing_extra.safe_get_annotations(cls) - + annotations = cls.__dict__.get('__annotations__', {}) fields: dict[str, FieldInfo] = {} class_vars: set[str] = set() - for ann_name, (ann_type, evaluated) in type_hints.items(): + for ann_name, ann_type in type_hints.items(): if ann_name == 'model_config': # We never want to treat `model_config` as a field # Note: we may need to change this logic if/when we introduce a `BareModel` class with no # protected namespaces (where `model_config` might be allowed as a field name) continue + for protected_namespace in config_wrapper.protected_namespaces: + if ann_name.startswith(protected_namespace): + for b in bases: + if hasattr(b, ann_name): + from ..main import BaseModel - _check_protected_namespaces( - protected_namespaces=config_wrapper.protected_namespaces, - ann_name=ann_name, - bases=bases, - cls_name=cls.__name__, - ) - - if _typing_extra.is_classvar_annotation(ann_type): + if not (issubclass(b, BaseModel) and ann_name in b.model_fields): + raise NameError( + f'Field "{ann_name}" conflicts with member {getattr(b, ann_name)}' + f' of protected namespace "{protected_namespace}".' + ) + else: + valid_namespaces = tuple( + x for x in config_wrapper.protected_namespaces if not ann_name.startswith(x) + ) + warnings.warn( + f'Field "{ann_name}" has conflict with protected namespace "{protected_namespace}".' + '\n\nYou may be able to resolve this warning by setting' + f" `model_config['protected_namespaces'] = {valid_namespaces}`.", + UserWarning, + ) + if is_classvar(ann_type): + class_vars.add(ann_name) + continue + if _is_finalvar_with_default_val(ann_type, getattr(cls, ann_name, PydanticUndefined)): class_vars.add(ann_name) continue - - assigned_value = getattr(cls, ann_name, PydanticUndefined) - if assigned_value is not PydanticUndefined and ( - # One of the deprecated instance methods was used as a field name (e.g. `dict()`): - any(getattr(BaseModel_, depr_name, None) is assigned_value for depr_name in _deprecated_method_names) - # One of the deprecated class methods was used as a field name (e.g. `schema()`): - or ( - hasattr(assigned_value, '__func__') - and any( - getattr(getattr(BaseModel_, depr_name, None), '__func__', None) is assigned_value.__func__ # pyright: ignore[reportAttributeAccessIssue] - for depr_name in _deprecated_classmethod_names - ) - ) - ): - # Then `assigned_value` would be the method, even though no default was specified: - assigned_value = PydanticUndefined - if not is_valid_field_name(ann_name): continue if cls.__pydantic_root_model__ and ann_name != 'root': @@ -304,7 +166,7 @@ def collect_model_fields( # noqa: C901 ) # when building a generic model with `MyModel[int]`, the generic_origin check makes sure we don't get - # "... shadows an attribute" warnings + # "... shadows an attribute" errors generic_origin = getattr(cls, '__pydantic_generic_metadata__', {}).get('origin') for base in bases: dataclass_fields = { @@ -312,74 +174,42 @@ def collect_model_fields( # noqa: C901 } if hasattr(base, ann_name): if base is generic_origin: - # Don't warn when "shadowing" of attributes in parametrized generics + # Don't error when "shadowing" of attributes in parametrized generics continue if ann_name in dataclass_fields: - # Don't warn when inheriting stdlib dataclasses whose fields are "shadowed" by defaults being set + # Don't error when inheriting stdlib dataclasses whose fields are "shadowed" by defaults being set # on the class instance. continue - - if ann_name not in annotations: - # Don't warn when a field exists in a parent class but has not been defined in the current class - continue - warnings.warn( - f'Field name "{ann_name}" in "{cls.__qualname__}" shadows an attribute in parent ' - f'"{base.__qualname__}"', + f'Field name "{ann_name}" shadows an attribute in parent "{base.__qualname__}"; ', UserWarning, - stacklevel=4, ) - if assigned_value is PydanticUndefined: # no assignment, just a plain annotation - if ann_name in annotations or ann_name not in parent_fields_lookup: - # field is either: - # - present in the current model's annotations (and *not* from parent classes) - # - not found on any base classes; this seems to be caused by fields bot getting - # generated due to models not being fully defined while initializing recursive models. - # Nothing stops us from just creating a `FieldInfo` for this type hint, so we do this. - field_info = FieldInfo_.from_annotation(ann_type, _source=AnnotationSource.CLASS) - if not evaluated: - field_info._complete = False - # Store the original annotation that should be used to rebuild - # the field info later: - field_info._original_annotation = ann_type + try: + default = getattr(cls, ann_name, PydanticUndefined) + if default is PydanticUndefined: + raise AttributeError + except AttributeError: + if ann_name in annotations: + field_info = FieldInfo.from_annotation(ann_type) else: - # The field was present on one of the (possibly multiple) base classes - # copy the field to make sure typevar substitutions don't cause issues with the base classes - field_info = parent_fields_lookup[ann_name]._copy() - - else: # An assigned value is present (either the default value, or a `Field()` function) - if isinstance(assigned_value, FieldInfo_) and ismethoddescriptor(assigned_value.default): - # `assigned_value` was fetched using `getattr`, which triggers a call to `__get__` - # for descriptors, so we do the same if the `= field(default=...)` form is used. - # Note that we only do this for method descriptors for now, we might want to - # extend this to any descriptor in the future (by simply checking for - # `hasattr(assigned_value.default, '__get__')`). - default = assigned_value.default.__get__(None, cls) - assigned_value.default = default - assigned_value._attributes_set['default'] = default - - field_info = FieldInfo_.from_annotated_attribute(ann_type, assigned_value, _source=AnnotationSource.CLASS) - # Store the original annotation and assignment value that should be used to rebuild the field info later. - # Note that the assignment is always stored as the annotation might contain a type var that is later - # parameterized with an unknown forward reference (and we'll need it to rebuild the field info): - field_info._original_assignment = assigned_value - if not evaluated: - field_info._complete = False - field_info._original_annotation = ann_type - elif 'final' in field_info._qualifiers and not field_info.is_required(): - warnings.warn( - f'Annotation {ann_name!r} is marked as final and has a default value. Pydantic treats {ann_name!r} as a ' - 'class variable, but it will be considered as a normal field in V3 to be aligned with dataclasses. If you ' - f'still want {ann_name!r} to be considered as a class variable, annotate it as: `ClassVar[] = .`', - category=PydanticDeprecatedSince211, - # Incorrect when `create_model` is used, but the chance that final with a default is used is low in that case: - stacklevel=4, - ) - class_vars.add(ann_name) - continue - + # if field has no default value and is not in __annotations__ this means that it is + # defined in a base class and we can take it from there + model_fields_lookup: dict[str, FieldInfo] = {} + for x in cls.__bases__[::-1]: + model_fields_lookup.update(getattr(x, 'model_fields', {})) + if ann_name in model_fields_lookup: + # The field was present on one of the (possibly multiple) base classes + # copy the field to make sure typevar substitutions don't cause issues with the base classes + field_info = copy(model_fields_lookup[ann_name]) + else: + # The field was not found on any base classes; this seems to be caused by fields not getting + # generated thanks to models not being fully defined while initializing recursive models. + # Nothing stops us from just creating a new FieldInfo for this type hint, so we do this. + field_info = FieldInfo.from_annotation(ann_type) + else: + field_info = FieldInfo.from_annotated_attribute(ann_type, default) # attributes which are fields are removed from the class namespace: # 1. To match the behaviour of annotation-only fields # 2. To avoid false positives in the NameError check above @@ -392,244 +222,85 @@ def collect_model_fields( # noqa: C901 # to make sure the decorators have already been built for this exact class decorators: DecoratorInfos = cls.__dict__['__pydantic_decorators__'] if ann_name in decorators.computed_fields: - raise TypeError( - f'Field {ann_name!r} of class {cls.__name__!r} overrides symbol of same name in a parent class. ' - 'This override with a computed_field is incompatible.' - ) + raise ValueError("you can't override a field with a computed field") fields[ann_name] = field_info - if field_info._complete: - # If not complete, this will be called in `rebuild_model_fields()`: - update_field_from_config(config_wrapper, ann_name, field_info) - if typevars_map: for field in fields.values(): - if field._complete: - field.apply_typevars_map(typevars_map) + field.apply_typevars_map(typevars_map, types_namespace) - if config_wrapper.use_attribute_docstrings: - _update_fields_from_docstrings(cls, fields) return fields, class_vars -def rebuild_model_fields( - cls: type[BaseModel], - *, - config_wrapper: ConfigWrapper, - ns_resolver: NsResolver, - typevars_map: Mapping[TypeVar, Any], -) -> dict[str, FieldInfo]: - """Rebuild the (already present) model fields by trying to reevaluate annotations. +def _is_finalvar_with_default_val(type_: type[Any], val: Any) -> bool: + from ..fields import FieldInfo - This function should be called whenever a model with incomplete fields is encountered. - - Raises: - NameError: If one of the annotations failed to evaluate. - - Note: - This function *doesn't* mutate the model fields in place, as it can be called during - schema generation, where you don't want to mutate other model's fields. - """ - FieldInfo_ = import_cached_field_info() - - rebuilt_fields: dict[str, FieldInfo] = {} - with ns_resolver.push(cls): - for f_name, field_info in cls.__pydantic_fields__.items(): - if field_info._complete: - rebuilt_fields[f_name] = field_info - else: - existing_desc = field_info.description - ann = _typing_extra.eval_type( - field_info._original_annotation, - *ns_resolver.types_namespace, - ) - ann = _generics.replace_types(ann, typevars_map) - - if (assign := field_info._original_assignment) is PydanticUndefined: - new_field = FieldInfo_.from_annotation(ann, _source=AnnotationSource.CLASS) - else: - new_field = FieldInfo_.from_annotated_attribute(ann, assign, _source=AnnotationSource.CLASS) - # The description might come from the docstring if `use_attribute_docstrings` was `True`: - new_field.description = new_field.description if new_field.description is not None else existing_desc - update_field_from_config(config_wrapper, f_name, new_field) - rebuilt_fields[f_name] = new_field - - return rebuilt_fields + if not is_finalvar(type_): + return False + elif val is PydanticUndefined: + return False + elif isinstance(val, FieldInfo) and (val.default is PydanticUndefined and val.default_factory is None): + return False + else: + return True def collect_dataclass_fields( - cls: type[StandardDataclass], - *, - config_wrapper: ConfigWrapper, - ns_resolver: NsResolver | None = None, - typevars_map: dict[Any, Any] | None = None, + cls: type[StandardDataclass], types_namespace: dict[str, Any] | None, *, typevars_map: dict[Any, Any] | None = None ) -> dict[str, FieldInfo]: """Collect the fields of a dataclass. Args: cls: dataclass. - config_wrapper: The config wrapper instance. - ns_resolver: Namespace resolver to use when getting dataclass annotations. - Defaults to an empty instance. + types_namespace: Optional extra namespace to look for types in. typevars_map: A dictionary mapping type variables to their concrete types. Returns: The dataclass fields. """ - FieldInfo_ = import_cached_field_info() + from ..fields import FieldInfo fields: dict[str, FieldInfo] = {} - ns_resolver = ns_resolver or NsResolver() - dataclass_fields = cls.__dataclass_fields__ + dataclass_fields: dict[str, dataclasses.Field] = cls.__dataclass_fields__ + cls_localns = dict(vars(cls)) # this matches get_cls_type_hints_lenient, but all tests pass with `= None` instead - # The logic here is similar to `_typing_extra.get_cls_type_hints`, - # although we do it manually as stdlib dataclasses already have annotations - # collected in each class: - for base in reversed(cls.__mro__): - if not dataclasses.is_dataclass(base): + for ann_name, dataclass_field in dataclass_fields.items(): + ann_type = _typing_extra.eval_type_lenient(dataclass_field.type, types_namespace, cls_localns) + if is_classvar(ann_type): continue - with ns_resolver.push(base): - for ann_name, dataclass_field in dataclass_fields.items(): - base_anns = _typing_extra.safe_get_annotations(base) + if ( + not dataclass_field.init + and dataclass_field.default == dataclasses.MISSING + and dataclass_field.default_factory == dataclasses.MISSING + ): + # TODO: We should probably do something with this so that validate_assignment behaves properly + # Issue: https://github.com/pydantic/pydantic/issues/5470 + continue - if ann_name not in base_anns: - # `__dataclass_fields__`contains every field, even the ones from base classes. - # Only collect the ones defined on `base`. - continue + if isinstance(dataclass_field.default, FieldInfo): + if dataclass_field.default.init_var: + # TODO: same note as above + continue + field_info = FieldInfo.from_annotated_attribute(ann_type, dataclass_field.default) + else: + field_info = FieldInfo.from_annotated_attribute(ann_type, dataclass_field) + fields[ann_name] = field_info - globalns, localns = ns_resolver.types_namespace - ann_type, evaluated = _typing_extra.try_eval_type(dataclass_field.type, globalns, localns) - - if _typing_extra.is_classvar_annotation(ann_type): - continue - - if ( - not dataclass_field.init - and dataclass_field.default is dataclasses.MISSING - and dataclass_field.default_factory is dataclasses.MISSING - ): - # TODO: We should probably do something with this so that validate_assignment behaves properly - # Issue: https://github.com/pydantic/pydantic/issues/5470 - continue - - if isinstance(dataclass_field.default, FieldInfo_): - if dataclass_field.default.init_var: - if dataclass_field.default.init is False: - raise PydanticUserError( - f'Dataclass field {ann_name} has init=False and init_var=True, but these are mutually exclusive.', - code='clashing-init-and-init-var', - ) - - # TODO: same note as above re validate_assignment - continue - field_info = FieldInfo_.from_annotated_attribute( - ann_type, dataclass_field.default, _source=AnnotationSource.DATACLASS - ) - field_info._original_assignment = dataclass_field.default - else: - field_info = FieldInfo_.from_annotated_attribute( - ann_type, dataclass_field, _source=AnnotationSource.DATACLASS - ) - field_info._original_assignment = dataclass_field - - if not evaluated: - field_info._complete = False - field_info._original_annotation = ann_type - - fields[ann_name] = field_info - update_field_from_config(config_wrapper, ann_name, field_info) - - if field_info.default is not PydanticUndefined and isinstance( - getattr(cls, ann_name, field_info), FieldInfo_ - ): - # We need this to fix the default when the "default" from __dataclass_fields__ is a pydantic.FieldInfo - setattr(cls, ann_name, field_info.default) + if field_info.default is not PydanticUndefined and isinstance(getattr(cls, ann_name, field_info), FieldInfo): + # We need this to fix the default when the "default" from __dataclass_fields__ is a pydantic.FieldInfo + setattr(cls, ann_name, field_info.default) if typevars_map: for field in fields.values(): - # We don't pass any ns, as `field.annotation` - # was already evaluated. TODO: is this method relevant? - # Can't we juste use `_generics.replace_types`? - field.apply_typevars_map(typevars_map) - - if config_wrapper.use_attribute_docstrings: - _update_fields_from_docstrings( - cls, - fields, - # We can't rely on the (more reliable) frame inspection method - # for stdlib dataclasses: - use_inspect=not hasattr(cls, '__is_pydantic_dataclass__'), - ) + field.apply_typevars_map(typevars_map, types_namespace) return fields -def rebuild_dataclass_fields( - cls: type[PydanticDataclass], - *, - config_wrapper: ConfigWrapper, - ns_resolver: NsResolver, - typevars_map: Mapping[TypeVar, Any], -) -> dict[str, FieldInfo]: - """Rebuild the (already present) dataclass fields by trying to reevaluate annotations. - - This function should be called whenever a dataclass with incomplete fields is encountered. - - Raises: - NameError: If one of the annotations failed to evaluate. - - Note: - This function *doesn't* mutate the dataclass fields in place, as it can be called during - schema generation, where you don't want to mutate other dataclass's fields. - """ - FieldInfo_ = import_cached_field_info() - - rebuilt_fields: dict[str, FieldInfo] = {} - with ns_resolver.push(cls): - for f_name, field_info in cls.__pydantic_fields__.items(): - if field_info._complete: - rebuilt_fields[f_name] = field_info - else: - existing_desc = field_info.description - ann = _typing_extra.eval_type( - field_info._original_annotation, - *ns_resolver.types_namespace, - ) - ann = _generics.replace_types(ann, typevars_map) - new_field = FieldInfo_.from_annotated_attribute( - ann, - field_info._original_assignment, - _source=AnnotationSource.DATACLASS, - ) - - # The description might come from the docstring if `use_attribute_docstrings` was `True`: - new_field.description = new_field.description if new_field.description is not None else existing_desc - update_field_from_config(config_wrapper, f_name, new_field) - rebuilt_fields[f_name] = new_field - - return rebuilt_fields - - def is_valid_field_name(name: str) -> bool: return not name.startswith('_') def is_valid_privateattr_name(name: str) -> bool: return name.startswith('_') and not name.startswith('__') - - -def takes_validated_data_argument( - default_factory: Callable[[], Any] | Callable[[dict[str, Any]], Any], -) -> TypeIs[Callable[[dict[str, Any]], Any]]: - """Whether the provided default factory callable has a validated data parameter.""" - try: - sig = signature(default_factory) - except (ValueError, TypeError): - # `inspect.signature` might not be able to infer a signature, e.g. with C objects. - # In this case, we assume no data argument is present: - return False - - parameters = list(sig.parameters.values()) - - return len(parameters) == 1 and can_be_positional(parameters[0]) and parameters[0].default is Parameter.empty diff --git a/Backend/venv/lib/python3.12/site-packages/pydantic/_internal/_generate_schema.py b/Backend/venv/lib/python3.12/site-packages/pydantic/_internal/_generate_schema.py index 839764ce..e87e256f 100644 --- a/Backend/venv/lib/python3.12/site-packages/pydantic/_internal/_generate_schema.py +++ b/Backend/venv/lib/python3.12/site-packages/pydantic/_internal/_generate_schema.py @@ -1,80 +1,60 @@ """Convert python types to pydantic-core schema.""" - from __future__ import annotations as _annotations import collections.abc import dataclasses -import datetime import inspect -import os -import pathlib import re import sys import typing import warnings -from collections.abc import Generator, Iterable, Iterator, Mapping from contextlib import contextmanager -from copy import copy -from decimal import Decimal +from copy import copy, deepcopy from enum import Enum -from fractions import Fraction from functools import partial from inspect import Parameter, _ParameterKind, signature -from ipaddress import IPv4Address, IPv4Interface, IPv4Network, IPv6Address, IPv6Interface, IPv6Network from itertools import chain from operator import attrgetter -from types import FunctionType, GenericAlias, LambdaType, MethodType +from types import FunctionType, LambdaType, MethodType from typing import ( TYPE_CHECKING, Any, Callable, - Final, + Dict, ForwardRef, - Literal, + Iterable, + Iterator, + Mapping, + Type, TypeVar, Union, cast, overload, ) -from uuid import UUID -from zoneinfo import ZoneInfo +from warnings import warn -import typing_extensions -from pydantic_core import ( - MISSING, - CoreSchema, - MultiHostUrl, - PydanticCustomError, - PydanticSerializationUnexpectedValue, - PydanticUndefined, - Url, - core_schema, - to_jsonable_python, -) -from typing_extensions import TypeAlias, TypeAliasType, get_args, get_origin, is_typeddict -from typing_inspection import typing_objects -from typing_inspection.introspection import AnnotationSource, get_literal_values, is_union_origin +from pydantic_core import CoreSchema, PydanticUndefined, core_schema, to_jsonable_python +from typing_extensions import Annotated, Final, Literal, TypeAliasType, TypedDict, get_args, get_origin, is_typeddict -from ..aliases import AliasChoices, AliasPath from ..annotated_handlers import GetCoreSchemaHandler, GetJsonSchemaHandler -from ..config import ConfigDict, JsonDict, JsonEncoder, JsonSchemaExtraCallable +from ..config import ConfigDict, JsonDict, JsonEncoder from ..errors import PydanticSchemaGenerationError, PydanticUndefinedAnnotation, PydanticUserError -from ..functional_validators import AfterValidator, BeforeValidator, FieldValidatorModes, PlainValidator, WrapValidator from ..json_schema import JsonSchemaValue from ..version import version_short -from ..warnings import ( - ArbitraryTypeWarning, - PydanticDeprecatedSince20, - TypedDictExtraConfigWarning, - UnsupportedFieldAttributeWarning, -) -from . import _decorators, _discriminated_union, _known_annotated_metadata, _repr, _typing_extra +from ..warnings import PydanticDeprecatedSince20 +from . import _core_utils, _decorators, _discriminated_union, _known_annotated_metadata, _typing_extra from ._config import ConfigWrapper, ConfigWrapperStack -from ._core_metadata import CoreMetadata, update_core_metadata +from ._core_metadata import CoreMetadataHandler, build_metadata_dict from ._core_utils import ( + NEEDS_APPLY_DISCRIMINATED_UNION_METADATA_KEY, + CoreSchemaOrField, + collect_invalid_schemas, + define_expected_missing_refs, get_ref, get_type_ref, is_list_like_schema_with_items_schema, + simplify_schema_references, + validate_core_schema, ) from ._decorators import ( Decorator, @@ -90,31 +70,25 @@ from ._decorators import ( inspect_model_serializer, inspect_validator, ) -from ._docs_extraction import extract_docstrings_from_cls -from ._fields import ( - collect_dataclass_fields, - rebuild_dataclass_fields, - rebuild_model_fields, - takes_validated_data_argument, - update_field_from_config, -) +from ._fields import collect_dataclass_fields, get_type_hints_infer_globalns from ._forward_ref import PydanticRecursiveRef -from ._generics import get_standard_typevars_map, replace_types -from ._import_utils import import_cached_base_model, import_cached_field_info -from ._mock_val_ser import MockCoreSchema -from ._namespace_utils import NamespacesTuple, NsResolver -from ._schema_gather import MissingDefinitionError, gather_schemas_for_cleaning -from ._schema_generation_shared import CallbackGetCoreSchemaHandler -from ._utils import lenient_issubclass, smart_deepcopy +from ._generics import get_standard_typevars_map, has_instance_in_type, recursively_defined_type_refs, replace_types +from ._schema_generation_shared import ( + CallbackGetCoreSchemaHandler, +) +from ._typing_extra import is_finalvar +from ._utils import is_valid_identifier, lenient_issubclass if TYPE_CHECKING: from ..fields import ComputedFieldInfo, FieldInfo from ..main import BaseModel from ..types import Discriminator + from ..validators import FieldValidatorModes from ._dataclasses import StandardDataclass from ._schema_generation_shared import GetJsonSchemaFunction _SUPPORTS_TYPEDDICT = sys.version_info >= (3, 12) +_AnnotatedType = type(Annotated[int, 123]) FieldDecoratorInfo = Union[ValidatorDecoratorInfo, FieldValidatorDecoratorInfo, FieldSerializerDecoratorInfo] FieldDecoratorInfoType = TypeVar('FieldDecoratorInfoType', bound=FieldDecoratorInfo) @@ -124,73 +98,15 @@ AnyFieldDecorator = Union[ Decorator[FieldSerializerDecoratorInfo], ] -ModifyCoreSchemaWrapHandler: TypeAlias = GetCoreSchemaHandler -GetCoreSchemaFunction: TypeAlias = Callable[[Any, ModifyCoreSchemaWrapHandler], core_schema.CoreSchema] -ParametersCallback: TypeAlias = "Callable[[int, str, Any], Literal['skip'] | None]" +ModifyCoreSchemaWrapHandler = GetCoreSchemaHandler +GetCoreSchemaFunction = Callable[[Any, ModifyCoreSchemaWrapHandler], core_schema.CoreSchema] -TUPLE_TYPES: list[type] = [typing.Tuple, tuple] # noqa: UP006 -LIST_TYPES: list[type] = [typing.List, list, collections.abc.MutableSequence] # noqa: UP006 -SET_TYPES: list[type] = [typing.Set, set, collections.abc.MutableSet] # noqa: UP006 -FROZEN_SET_TYPES: list[type] = [typing.FrozenSet, frozenset, collections.abc.Set] # noqa: UP006 -DICT_TYPES: list[type] = [typing.Dict, dict] # noqa: UP006 -IP_TYPES: list[type] = [IPv4Address, IPv4Interface, IPv4Network, IPv6Address, IPv6Interface, IPv6Network] -SEQUENCE_TYPES: list[type] = [typing.Sequence, collections.abc.Sequence] -ITERABLE_TYPES: list[type] = [typing.Iterable, collections.abc.Iterable, typing.Generator, collections.abc.Generator] -TYPE_TYPES: list[type] = [typing.Type, type] # noqa: UP006 -PATTERN_TYPES: list[type] = [typing.Pattern, re.Pattern] -PATH_TYPES: list[type] = [ - os.PathLike, - pathlib.Path, - pathlib.PurePath, - pathlib.PosixPath, - pathlib.PurePosixPath, - pathlib.PureWindowsPath, -] -MAPPING_TYPES = [ - typing.Mapping, - typing.MutableMapping, - collections.abc.Mapping, - collections.abc.MutableMapping, - collections.OrderedDict, - typing_extensions.OrderedDict, - typing.DefaultDict, # noqa: UP006 - collections.defaultdict, -] -COUNTER_TYPES = [collections.Counter, typing.Counter] -DEQUE_TYPES: list[type] = [collections.deque, typing.Deque] # noqa: UP006 -# Note: This does not play very well with type checkers. For example, -# `a: LambdaType = lambda x: x` will raise a type error by Pyright. -ValidateCallSupportedTypes = Union[ - LambdaType, - FunctionType, - MethodType, - partial, -] - -VALIDATE_CALL_SUPPORTED_TYPES = get_args(ValidateCallSupportedTypes) -UNSUPPORTED_STANDALONE_FIELDINFO_ATTRIBUTES: list[tuple[str, Any]] = [ - ('alias', None), - ('validation_alias', None), - ('serialization_alias', None), - # will be set if any alias is set, so disable it to avoid double warnings: - # 'alias_priority', - ('default', PydanticUndefined), - ('default_factory', None), - ('exclude', None), - ('deprecated', None), - ('repr', True), - ('validate_default', None), - ('frozen', None), - ('init', None), - ('init_var', None), - ('kw_only', None), -] -"""`FieldInfo` attributes (and their default value) that can't be used outside of a model (e.g. in a type adapter or a PEP 695 type alias).""" - -_mode_to_validator: dict[ - FieldValidatorModes, type[BeforeValidator | AfterValidator | PlainValidator | WrapValidator] -] = {'before': BeforeValidator, 'after': AfterValidator, 'plain': PlainValidator, 'wrap': WrapValidator} +TUPLE_TYPES: list[type] = [tuple, typing.Tuple] +LIST_TYPES: list[type] = [list, typing.List, collections.abc.MutableSequence] +SET_TYPES: list[type] = [set, typing.Set, collections.abc.MutableSet] +FROZEN_SET_TYPES: list[type] = [frozenset, typing.FrozenSet, collections.abc.Set] +DICT_TYPES: list[type] = [dict, typing.Dict, collections.abc.MutableMapping, collections.abc.Mapping] def check_validator_fields_against_field_name( @@ -206,8 +122,13 @@ def check_validator_fields_against_field_name( Returns: `True` if field name is in validator fields, `False` otherwise. """ - fields = info.fields - return '*' in fields or field in fields + if isinstance(info, (ValidatorDecoratorInfo, FieldValidatorDecoratorInfo)): + if '*' in info.fields: + return True + for v_field_name in info.fields: + if v_field_name == field: + return True + return False def check_decorator_fields_exist(decorators: Iterable[AnyFieldDecorator], fields: Iterable[str]) -> None: @@ -224,7 +145,7 @@ def check_decorator_fields_exist(decorators: Iterable[AnyFieldDecorator], fields """ fields = set(fields) for dec in decorators: - if '*' in dec.info.fields: + if isinstance(dec.info, (ValidatorDecoratorInfo, FieldValidatorDecoratorInfo)) and '*' in dec.info.fields: continue if dec.info.check_fields is False: continue @@ -246,52 +167,64 @@ def filter_field_decorator_info_by_field( def apply_each_item_validators( schema: core_schema.CoreSchema, each_item_validators: list[Decorator[ValidatorDecoratorInfo]], + field_name: str | None, ) -> core_schema.CoreSchema: # This V1 compatibility shim should eventually be removed - # fail early if each_item_validators is empty - if not each_item_validators: - return schema - # push down any `each_item=True` validators # note that this won't work for any Annotated types that get wrapped by a function validator # but that's okay because that didn't exist in V1 if schema['type'] == 'nullable': - schema['schema'] = apply_each_item_validators(schema['schema'], each_item_validators) + schema['schema'] = apply_each_item_validators(schema['schema'], each_item_validators, field_name) return schema - elif schema['type'] == 'tuple': - if (variadic_item_index := schema.get('variadic_item_index')) is not None: - schema['items_schema'][variadic_item_index] = apply_validators( - schema['items_schema'][variadic_item_index], - each_item_validators, - ) elif is_list_like_schema_with_items_schema(schema): - inner_schema = schema.get('items_schema', core_schema.any_schema()) - schema['items_schema'] = apply_validators(inner_schema, each_item_validators) + inner_schema = schema.get('items_schema', None) + if inner_schema is None: + inner_schema = core_schema.any_schema() + schema['items_schema'] = apply_validators(inner_schema, each_item_validators, field_name) elif schema['type'] == 'dict': - inner_schema = schema.get('values_schema', core_schema.any_schema()) - schema['values_schema'] = apply_validators(inner_schema, each_item_validators) - else: + # push down any `each_item=True` validators onto dict _values_ + # this is super arbitrary but it's the V1 behavior + inner_schema = schema.get('values_schema', None) + if inner_schema is None: + inner_schema = core_schema.any_schema() + schema['values_schema'] = apply_validators(inner_schema, each_item_validators, field_name) + elif each_item_validators: raise TypeError( - f'`@validator(..., each_item=True)` cannot be applied to fields with a schema of {schema["type"]}' + f"`@validator(..., each_item=True)` cannot be applied to fields with a schema of {schema['type']}" ) return schema -def _extract_json_schema_info_from_field_info( - info: FieldInfo | ComputedFieldInfo, -) -> tuple[JsonDict | None, JsonDict | JsonSchemaExtraCallable | None]: - json_schema_updates = { - 'title': info.title, - 'description': info.description, - 'deprecated': bool(info.deprecated) or info.deprecated == '' or None, - 'examples': to_jsonable_python(info.examples), - } - json_schema_updates = {k: v for k, v in json_schema_updates.items() if v is not None} - return (json_schema_updates or None, info.json_schema_extra) +def modify_model_json_schema( + schema_or_field: CoreSchemaOrField, handler: GetJsonSchemaHandler, *, cls: Any +) -> JsonSchemaValue: + """Add title and description for model-like classes' JSON schema. + + Args: + schema_or_field: The schema data to generate a JSON schema from. + handler: The `GetCoreSchemaHandler` instance. + cls: The model-like class. + + Returns: + JsonSchemaValue: The updated JSON schema. + """ + json_schema = handler(schema_or_field) + original_schema = handler.resolve_ref_schema(json_schema) + # Preserve the fact that definitions schemas should never have sibling keys: + if '$ref' in original_schema: + ref = original_schema['$ref'] + original_schema.clear() + original_schema['allOf'] = [{'$ref': ref}] + if 'title' not in original_schema: + original_schema['title'] = cls.__name__ + docstring = cls.__doc__ + if docstring and 'description' not in original_schema: + original_schema['description'] = inspect.cleandoc(docstring) + return json_schema -JsonEncoders = dict[type[Any], JsonEncoder] +JsonEncoders = Dict[Type[Any], JsonEncoder] def _add_custom_serialization_from_json_encoders( @@ -328,329 +261,103 @@ def _add_custom_serialization_from_json_encoders( return schema -class InvalidSchemaError(Exception): - """The core schema is invalid.""" - - class GenerateSchema: """Generate core schema for a Pydantic model, dataclass and types like `str`, `datetime`, ... .""" __slots__ = ( '_config_wrapper_stack', - '_ns_resolver', + '_types_namespace', '_typevars_map', + '_needs_apply_discriminated_union', + '_has_invalid_schema', 'field_name_stack', - 'model_type_stack', 'defs', ) def __init__( self, config_wrapper: ConfigWrapper, - ns_resolver: NsResolver | None = None, - typevars_map: Mapping[TypeVar, Any] | None = None, + types_namespace: dict[str, Any] | None, + typevars_map: dict[Any, Any] | None = None, ) -> None: - # we need a stack for recursing into nested models + # we need a stack for recursing into child models self._config_wrapper_stack = ConfigWrapperStack(config_wrapper) - self._ns_resolver = ns_resolver or NsResolver() + self._types_namespace = types_namespace self._typevars_map = typevars_map + self._needs_apply_discriminated_union = False + self._has_invalid_schema = False self.field_name_stack = _FieldNameStack() - self.model_type_stack = _ModelTypeStack() self.defs = _Definitions() - def __init_subclass__(cls) -> None: - super().__init_subclass__() - warnings.warn( - 'Subclassing `GenerateSchema` is not supported. The API is highly subject to change in minor versions.', - UserWarning, - stacklevel=2, - ) + @classmethod + def __from_parent( + cls, + config_wrapper_stack: ConfigWrapperStack, + types_namespace: dict[str, Any] | None, + typevars_map: dict[Any, Any] | None, + defs: _Definitions, + ) -> GenerateSchema: + obj = cls.__new__(cls) + obj._config_wrapper_stack = config_wrapper_stack + obj._types_namespace = types_namespace + obj._typevars_map = typevars_map + obj._needs_apply_discriminated_union = False + obj._has_invalid_schema = False + obj.field_name_stack = _FieldNameStack() + obj.defs = defs + return obj @property def _config_wrapper(self) -> ConfigWrapper: return self._config_wrapper_stack.tail @property - def _types_namespace(self) -> NamespacesTuple: - return self._ns_resolver.types_namespace + def _current_generate_schema(self) -> GenerateSchema: + cls = self._config_wrapper.schema_generator or GenerateSchema + return cls.__from_parent( + self._config_wrapper_stack, + self._types_namespace, + self._typevars_map, + self.defs, + ) @property def _arbitrary_types(self) -> bool: return self._config_wrapper.arbitrary_types_allowed + def str_schema(self) -> CoreSchema: + """Generate a CoreSchema for `str`""" + return core_schema.str_schema() + # the following methods can be overridden but should be considered # unstable / private APIs - def _list_schema(self, items_type: Any) -> CoreSchema: + def _list_schema(self, tp: Any, items_type: Any) -> CoreSchema: return core_schema.list_schema(self.generate_schema(items_type)) - def _dict_schema(self, keys_type: Any, values_type: Any) -> CoreSchema: + def _dict_schema(self, tp: Any, keys_type: Any, values_type: Any) -> CoreSchema: return core_schema.dict_schema(self.generate_schema(keys_type), self.generate_schema(values_type)) - def _set_schema(self, items_type: Any) -> CoreSchema: + def _set_schema(self, tp: Any, items_type: Any) -> CoreSchema: return core_schema.set_schema(self.generate_schema(items_type)) - def _frozenset_schema(self, items_type: Any) -> CoreSchema: + def _frozenset_schema(self, tp: Any, items_type: Any) -> CoreSchema: return core_schema.frozenset_schema(self.generate_schema(items_type)) - def _enum_schema(self, enum_type: type[Enum]) -> CoreSchema: - cases: list[Any] = list(enum_type.__members__.values()) + def _tuple_variable_schema(self, tp: Any, items_type: Any) -> CoreSchema: + return core_schema.tuple_variable_schema(self.generate_schema(items_type)) - enum_ref = get_type_ref(enum_type) - description = None if not enum_type.__doc__ else inspect.cleandoc(enum_type.__doc__) - if ( - description == 'An enumeration.' - ): # This is the default value provided by enum.EnumMeta.__new__; don't use it - description = None - js_updates = {'title': enum_type.__name__, 'description': description} - js_updates = {k: v for k, v in js_updates.items() if v is not None} - - sub_type: Literal['str', 'int', 'float'] | None = None - if issubclass(enum_type, int): - sub_type = 'int' - value_ser_type: core_schema.SerSchema = core_schema.simple_ser_schema('int') - elif issubclass(enum_type, str): - # this handles `StrEnum` (3.11 only), and also `Foobar(str, Enum)` - sub_type = 'str' - value_ser_type = core_schema.simple_ser_schema('str') - elif issubclass(enum_type, float): - sub_type = 'float' - value_ser_type = core_schema.simple_ser_schema('float') - else: - # TODO this is an ugly hack, how do we trigger an Any schema for serialization? - value_ser_type = core_schema.plain_serializer_function_ser_schema(lambda x: x) - - if cases: - - def get_json_schema(schema: CoreSchema, handler: GetJsonSchemaHandler) -> JsonSchemaValue: - json_schema = handler(schema) - original_schema = handler.resolve_ref_schema(json_schema) - original_schema.update(js_updates) - return json_schema - - # we don't want to add the missing to the schema if it's the default one - default_missing = getattr(enum_type._missing_, '__func__', None) is Enum._missing_.__func__ # pyright: ignore[reportFunctionMemberAccess] - enum_schema = core_schema.enum_schema( - enum_type, - cases, - sub_type=sub_type, - missing=None if default_missing else enum_type._missing_, - ref=enum_ref, - metadata={'pydantic_js_functions': [get_json_schema]}, - ) - - if self._config_wrapper.use_enum_values: - enum_schema = core_schema.no_info_after_validator_function( - attrgetter('value'), enum_schema, serialization=value_ser_type - ) - - return enum_schema - - else: - - def get_json_schema_no_cases(_, handler: GetJsonSchemaHandler) -> JsonSchemaValue: - json_schema = handler(core_schema.enum_schema(enum_type, cases, sub_type=sub_type, ref=enum_ref)) - original_schema = handler.resolve_ref_schema(json_schema) - original_schema.update(js_updates) - return json_schema - - # Use an isinstance check for enums with no cases. - # The most important use case for this is creating TypeVar bounds for generics that should - # be restricted to enums. This is more consistent than it might seem at first, since you can only - # subclass enum.Enum (or subclasses of enum.Enum) if all parent classes have no cases. - # We use the get_json_schema function when an Enum subclass has been declared with no cases - # so that we can still generate a valid json schema. - return core_schema.is_instance_schema( - enum_type, - metadata={'pydantic_js_functions': [get_json_schema_no_cases]}, - ) - - def _ip_schema(self, tp: Any) -> CoreSchema: - from ._validators import IP_VALIDATOR_LOOKUP, IpType - - ip_type_json_schema_format: dict[type[IpType], str] = { - IPv4Address: 'ipv4', - IPv4Network: 'ipv4network', - IPv4Interface: 'ipv4interface', - IPv6Address: 'ipv6', - IPv6Network: 'ipv6network', - IPv6Interface: 'ipv6interface', - } - - def ser_ip(ip: Any, info: core_schema.SerializationInfo) -> str | IpType: - if not isinstance(ip, (tp, str)): - raise PydanticSerializationUnexpectedValue( - f"Expected `{tp}` but got `{type(ip)}` with value `'{ip}'` - serialized value may not be as expected." - ) - if info.mode == 'python': - return ip - return str(ip) - - return core_schema.lax_or_strict_schema( - lax_schema=core_schema.no_info_plain_validator_function(IP_VALIDATOR_LOOKUP[tp]), - strict_schema=core_schema.json_or_python_schema( - json_schema=core_schema.no_info_after_validator_function(tp, core_schema.str_schema()), - python_schema=core_schema.is_instance_schema(tp), - ), - serialization=core_schema.plain_serializer_function_ser_schema(ser_ip, info_arg=True, when_used='always'), - metadata={ - 'pydantic_js_functions': [lambda _1, _2: {'type': 'string', 'format': ip_type_json_schema_format[tp]}] - }, - ) - - def _path_schema(self, tp: Any, path_type: Any) -> CoreSchema: - if tp is os.PathLike and (path_type not in {str, bytes} and not typing_objects.is_any(path_type)): - raise PydanticUserError( - '`os.PathLike` can only be used with `str`, `bytes` or `Any`', code='schema-for-unknown-type' - ) - - path_constructor = pathlib.PurePath if tp is os.PathLike else tp - strict_inner_schema = ( - core_schema.bytes_schema(strict=True) if (path_type is bytes) else core_schema.str_schema(strict=True) - ) - lax_inner_schema = core_schema.bytes_schema() if (path_type is bytes) else core_schema.str_schema() - - def path_validator(input_value: str | bytes) -> os.PathLike[Any]: # type: ignore - try: - if path_type is bytes: - if isinstance(input_value, bytes): - try: - input_value = input_value.decode() - except UnicodeDecodeError as e: - raise PydanticCustomError('bytes_type', 'Input must be valid bytes') from e - else: - raise PydanticCustomError('bytes_type', 'Input must be bytes') - elif not isinstance(input_value, str): - raise PydanticCustomError('path_type', 'Input is not a valid path') - - return path_constructor(input_value) # type: ignore - except TypeError as e: - raise PydanticCustomError('path_type', 'Input is not a valid path') from e - - def ser_path(path: Any, info: core_schema.SerializationInfo) -> str | os.PathLike[Any]: - if not isinstance(path, (tp, str)): - raise PydanticSerializationUnexpectedValue( - f"Expected `{tp}` but got `{type(path)}` with value `'{path}'` - serialized value may not be as expected." - ) - if info.mode == 'python': - return path - return str(path) - - instance_schema = core_schema.json_or_python_schema( - json_schema=core_schema.no_info_after_validator_function(path_validator, lax_inner_schema), - python_schema=core_schema.is_instance_schema(tp), - ) - - schema = core_schema.lax_or_strict_schema( - lax_schema=core_schema.union_schema( - [ - instance_schema, - core_schema.no_info_after_validator_function(path_validator, strict_inner_schema), - ], - custom_error_type='path_type', - custom_error_message=f'Input is not a valid path for {tp}', - ), - strict_schema=instance_schema, - serialization=core_schema.plain_serializer_function_ser_schema(ser_path, info_arg=True, when_used='always'), - metadata={'pydantic_js_functions': [lambda source, handler: {**handler(source), 'format': 'path'}]}, - ) - return schema - - def _deque_schema(self, items_type: Any) -> CoreSchema: - from ._serializers import serialize_sequence_via_list - from ._validators import deque_validator - - item_type_schema = self.generate_schema(items_type) - - # we have to use a lax list schema here, because we need to validate the deque's - # items via a list schema, but it's ok if the deque itself is not a list - list_schema = core_schema.list_schema(item_type_schema, strict=False) - - check_instance = core_schema.json_or_python_schema( - json_schema=list_schema, - python_schema=core_schema.is_instance_schema(collections.deque, cls_repr='Deque'), - ) - - lax_schema = core_schema.no_info_wrap_validator_function(deque_validator, list_schema) - - return core_schema.lax_or_strict_schema( - lax_schema=lax_schema, - strict_schema=core_schema.chain_schema([check_instance, lax_schema]), - serialization=core_schema.wrap_serializer_function_ser_schema( - serialize_sequence_via_list, schema=item_type_schema, info_arg=True - ), - ) - - def _mapping_schema(self, tp: Any, keys_type: Any, values_type: Any) -> CoreSchema: - from ._validators import MAPPING_ORIGIN_MAP, defaultdict_validator, get_defaultdict_default_default_factory - - mapped_origin = MAPPING_ORIGIN_MAP[tp] - keys_schema = self.generate_schema(keys_type) - with warnings.catch_warnings(): - # We kind of abused `Field()` default factories to be able to specify - # the `defaultdict`'s `default_factory`. As a consequence, we get warnings - # as normally `FieldInfo.default_factory` is unsupported in the context where - # `Field()` is used and our only solution is to ignore them (note that this might - # wrongfully ignore valid warnings, e.g. if the `value_type` is a PEP 695 type alias - # with unsupported metadata). - warnings.simplefilter('ignore', category=UnsupportedFieldAttributeWarning) - values_schema = self.generate_schema(values_type) - dict_schema = core_schema.dict_schema(keys_schema, values_schema, strict=False) - - if mapped_origin is dict: - schema = dict_schema - else: - check_instance = core_schema.json_or_python_schema( - json_schema=dict_schema, - python_schema=core_schema.is_instance_schema(mapped_origin), - ) - - if tp is collections.defaultdict: - default_default_factory = get_defaultdict_default_default_factory(values_type) - coerce_instance_wrap = partial( - core_schema.no_info_wrap_validator_function, - partial(defaultdict_validator, default_default_factory=default_default_factory), - ) - else: - coerce_instance_wrap = partial(core_schema.no_info_after_validator_function, mapped_origin) - - lax_schema = coerce_instance_wrap(dict_schema) - strict_schema = core_schema.chain_schema([check_instance, lax_schema]) - - schema = core_schema.lax_or_strict_schema( - lax_schema=lax_schema, - strict_schema=strict_schema, - serialization=core_schema.wrap_serializer_function_ser_schema( - lambda v, h: h(v), schema=dict_schema, info_arg=False - ), - ) - - return schema - - def _fraction_schema(self) -> CoreSchema: - """Support for [`fractions.Fraction`][fractions.Fraction].""" - from ._validators import fraction_validator - - # TODO: note, this is a fairly common pattern, re lax / strict for attempted type coercion, - # can we use a helper function to reduce boilerplate? - return core_schema.lax_or_strict_schema( - lax_schema=core_schema.no_info_plain_validator_function(fraction_validator), - strict_schema=core_schema.json_or_python_schema( - json_schema=core_schema.no_info_plain_validator_function(fraction_validator), - python_schema=core_schema.is_instance_schema(Fraction), - ), - # use str serialization to guarantee round trip behavior - serialization=core_schema.to_string_ser_schema(when_used='always'), - metadata={'pydantic_js_functions': [lambda _1, _2: {'type': 'string', 'format': 'fraction'}]}, - ) + def _tuple_positional_schema(self, tp: Any, items_types: list[Any]) -> CoreSchema: + items_schemas = [self.generate_schema(items_type) for items_type in items_types] + return core_schema.tuple_positional_schema(items_schemas) def _arbitrary_type_schema(self, tp: Any) -> CoreSchema: if not isinstance(tp, type): - warnings.warn( + warn( f'{tp!r} is not a Python type (it may be an instance of an object),' ' Pydantic will allow any object with no validation since we cannot even' ' enforce that the input is an instance of the given type.' ' To get rid of this error wrap the type with `pydantic.SkipValidation`.', - ArbitraryTypeWarning, + UserWarning, ) return core_schema.any_schema() return core_schema.is_instance_schema(tp) @@ -675,38 +382,65 @@ class GenerateSchema: return _discriminated_union.apply_discriminator( schema, discriminator, - self.defs._definitions, ) except _discriminated_union.MissingDefinitionForUnionRef: # defer until defs are resolved - _discriminated_union.set_discriminator_in_metadata( + _discriminated_union.set_discriminator( schema, discriminator, ) + if 'metadata' in schema: + schema['metadata'][NEEDS_APPLY_DISCRIMINATED_UNION_METADATA_KEY] = True + else: + schema['metadata'] = {NEEDS_APPLY_DISCRIMINATED_UNION_METADATA_KEY: True} + self._needs_apply_discriminated_union = True return schema + class CollectedInvalid(Exception): + pass + def clean_schema(self, schema: CoreSchema) -> CoreSchema: - return self.defs.finalize_schema(schema) + schema = self.collect_definitions(schema) + schema = simplify_schema_references(schema) + schema = _discriminated_union.apply_discriminators(schema) + if collect_invalid_schemas(schema): + raise self.CollectedInvalid() + schema = validate_core_schema(schema) + return schema + + def collect_definitions(self, schema: CoreSchema) -> CoreSchema: + ref = cast('str | None', schema.get('ref', None)) + if ref: + self.defs.definitions[ref] = schema + if 'ref' in schema: + schema = core_schema.definition_reference_schema(schema['ref']) + return core_schema.definitions_schema( + schema, + list(self.defs.definitions.values()), + ) def _add_js_function(self, metadata_schema: CoreSchema, js_function: Callable[..., Any]) -> None: - metadata = metadata_schema.get('metadata', {}) + metadata = CoreMetadataHandler(metadata_schema).metadata pydantic_js_functions = metadata.setdefault('pydantic_js_functions', []) # because of how we generate core schemas for nested generic models # we can end up adding `BaseModel.__get_pydantic_json_schema__` multiple times # this check may fail to catch duplicates if the function is a `functools.partial` - # or something like that, but if it does it'll fail by inserting the duplicate + # or something like that + # but if it does it'll fail by inserting the duplicate if js_function not in pydantic_js_functions: pydantic_js_functions.append(js_function) - metadata_schema['metadata'] = metadata def generate_schema( self, obj: Any, + from_dunder_get_core_schema: bool = True, ) -> core_schema.CoreSchema: """Generate core schema. Args: obj: The object to generate core schema for. + from_dunder_get_core_schema: Whether to generate schema from either the + `__get_pydantic_core_schema__` function or `__pydantic_core_schema__` property. Returns: The generated core schema. @@ -717,139 +451,90 @@ class GenerateSchema: PydanticSchemaGenerationError: If it is not possible to generate pydantic-core schema. TypeError: - - If `alias_generator` returns a disallowed type (must be str, AliasPath or AliasChoices). + - If `alias_generator` returns a non-string value. - If V1 style validator with `each_item=True` applied on a wrong field. PydanticUserError: - If `typing.TypedDict` is used instead of `typing_extensions.TypedDict` on Python < 3.12. - If `__modify_schema__` method is used instead of `__get_pydantic_json_schema__`. """ - schema = self._generate_schema_from_get_schema_method(obj, obj) + schema: CoreSchema | None = None + + if from_dunder_get_core_schema: + from_property = self._generate_schema_from_property(obj, obj) + if from_property is not None: + schema = from_property if schema is None: - schema = self._generate_schema_inner(obj) + schema = self._generate_schema(obj) - metadata_js_function = _extract_get_pydantic_json_schema(obj) + metadata_js_function = _extract_get_pydantic_json_schema(obj, schema) if metadata_js_function is not None: - metadata_schema = resolve_original_schema(schema, self.defs) + metadata_schema = resolve_original_schema(schema, self.defs.definitions) if metadata_schema: self._add_js_function(metadata_schema, metadata_js_function) schema = _add_custom_serialization_from_json_encoders(self._config_wrapper.json_encoders, obj, schema) + schema = self._post_process_generated_schema(schema) + return schema def _model_schema(self, cls: type[BaseModel]) -> core_schema.CoreSchema: """Generate schema for a Pydantic model.""" - BaseModel_ = import_cached_base_model() - with self.defs.get_schema_or_ref(cls) as (model_ref, maybe_schema): if maybe_schema is not None: return maybe_schema - schema = cls.__dict__.get('__pydantic_core_schema__') - if schema is not None and not isinstance(schema, MockCoreSchema): - if schema['type'] == 'definitions': - schema = self.defs.unpack_definitions(schema) - ref = get_ref(schema) - if ref: - return self.defs.create_definition_reference_schema(schema) - else: - return schema - + fields = cls.model_fields + decorators = cls.__pydantic_decorators__ + computed_fields = decorators.computed_fields + check_decorator_fields_exist( + chain( + decorators.field_validators.values(), + decorators.field_serializers.values(), + decorators.validators.values(), + ), + {*fields.keys(), *computed_fields.keys()}, + ) config_wrapper = ConfigWrapper(cls.model_config, check=False) + core_config = config_wrapper.core_config(cls) + metadata = build_metadata_dict(js_functions=[partial(modify_model_json_schema, cls=cls)]) - with self._config_wrapper_stack.push(config_wrapper), self._ns_resolver.push(cls): - core_config = self._config_wrapper.core_config(title=cls.__name__) + model_validators = decorators.model_validators.values() - if cls.__pydantic_fields_complete__ or cls is BaseModel_: - fields = getattr(cls, '__pydantic_fields__', {}) - else: - if '__pydantic_fields__' not in cls.__dict__: - # This happens when we have a loop in the schema generation: - # class Base[T](BaseModel): - # t: T - # - # class Other(BaseModel): - # b: 'Base[Other]' - # When we build fields for `Other`, we evaluate the forward annotation. - # At this point, `Other` doesn't have the model fields set. We create - # `Base[Other]`; model fields are successfully built, and we try to generate - # a schema for `t: Other`. As `Other.__pydantic_fields__` aren't set, we abort. - raise PydanticUndefinedAnnotation( - name=cls.__name__, - message=f'Class {cls.__name__!r} is not defined', - ) - try: - fields = rebuild_model_fields( - cls, - config_wrapper=self._config_wrapper, - ns_resolver=self._ns_resolver, - typevars_map=self._typevars_map or {}, - ) - except NameError as e: - raise PydanticUndefinedAnnotation.from_name_error(e) from e - - decorators = cls.__pydantic_decorators__ - computed_fields = decorators.computed_fields - check_decorator_fields_exist( - chain( - decorators.field_validators.values(), - decorators.field_serializers.values(), - decorators.validators.values(), - ), - {*fields.keys(), *computed_fields.keys()}, - ) - - model_validators = decorators.model_validators.values() - - extras_schema = None - extras_keys_schema = None - if core_config.get('extra_fields_behavior') == 'allow': - assert cls.__mro__[0] is cls - assert cls.__mro__[-1] is object - for candidate_cls in cls.__mro__[:-1]: - extras_annotation = getattr(candidate_cls, '__annotations__', {}).get( - '__pydantic_extra__', None - ) - if extras_annotation is not None: - if isinstance(extras_annotation, str): - extras_annotation = _typing_extra.eval_type_backport( - _typing_extra._make_forward_ref( - extras_annotation, is_argument=False, is_class=True - ), - *self._types_namespace, - ) - tp = get_origin(extras_annotation) - if tp not in DICT_TYPES: - raise PydanticSchemaGenerationError( - 'The type annotation for `__pydantic_extra__` must be `dict[str, ...]`' - ) - extra_keys_type, extra_items_type = self._get_args_resolving_forward_refs( - extras_annotation, - required=True, + extras_schema = None + if core_config.get('extra_fields_behavior') == 'allow': + for tp in (cls, *cls.__mro__): + extras_annotation = cls.__annotations__.get('__pydantic_extra__', None) + if extras_annotation is not None: + tp = get_origin(extras_annotation) + if tp not in (Dict, dict): + raise PydanticSchemaGenerationError( + 'The type annotation for `__pydantic_extra__` must be `Dict[str, ...]`' ) - if extra_keys_type is not str: - extras_keys_schema = self.generate_schema(extra_keys_type) - if not typing_objects.is_any(extra_items_type): - extras_schema = self.generate_schema(extra_items_type) - if extras_keys_schema is not None or extras_schema is not None: - break - - generic_origin: type[BaseModel] | None = getattr(cls, '__pydantic_generic_metadata__', {}).get('origin') + extra_items_type = self._get_args_resolving_forward_refs( + cls.__annotations__['__pydantic_extra__'], + required=True, + )[1] + if extra_items_type is not Any: + extras_schema = self.generate_schema(extra_items_type) + break + with self._config_wrapper_stack.push(config_wrapper): + self = self._current_generate_schema if cls.__pydantic_root_model__: - # FIXME: should the common field metadata be used here? - inner_schema, _ = self._common_field_schema('root', fields['root'], decorators) + root_field = self._common_field_schema('root', fields['root'], decorators) + inner_schema = root_field['schema'] inner_schema = apply_model_validators(inner_schema, model_validators, 'inner') model_schema = core_schema.model_schema( cls, inner_schema, - generic_origin=generic_origin, custom_init=getattr(cls, '__pydantic_custom_init__', None), root_model=True, post_init=getattr(cls, '__pydantic_post_init__', None), config=core_config, ref=model_ref, + metadata=metadata, ) else: fields_schema: core_schema.CoreSchema = core_schema.model_fields_schema( @@ -859,91 +544,89 @@ class GenerateSchema: for d in computed_fields.values() ], extras_schema=extras_schema, - extras_keys_schema=extras_keys_schema, model_name=cls.__name__, ) - inner_schema = apply_validators(fields_schema, decorators.root_validators.values()) + inner_schema = apply_validators(fields_schema, decorators.root_validators.values(), None) + new_inner_schema = define_expected_missing_refs(inner_schema, recursively_defined_type_refs()) + if new_inner_schema is not None: + inner_schema = new_inner_schema inner_schema = apply_model_validators(inner_schema, model_validators, 'inner') model_schema = core_schema.model_schema( cls, inner_schema, - generic_origin=generic_origin, custom_init=getattr(cls, '__pydantic_custom_init__', None), root_model=False, post_init=getattr(cls, '__pydantic_post_init__', None), config=core_config, ref=model_ref, + metadata=metadata, ) schema = self._apply_model_serializers(model_schema, decorators.model_serializers.values()) schema = apply_model_validators(schema, model_validators, 'outer') - return self.defs.create_definition_reference_schema(schema) + self.defs.definitions[model_ref] = self._post_process_generated_schema(schema) + return core_schema.definition_reference_schema(model_ref) - def _resolve_self_type(self, obj: Any) -> Any: - obj = self.model_type_stack.get() - if obj is None: - raise PydanticUserError('`typing.Self` is invalid in this context', code='invalid-self-type') - return obj + def _unpack_refs_defs(self, schema: CoreSchema) -> CoreSchema: + """Unpack all 'definitions' schemas into `GenerateSchema.defs.definitions` + and return the inner schema. + """ - def _generate_schema_from_get_schema_method(self, obj: Any, source: Any) -> core_schema.CoreSchema | None: - BaseModel_ = import_cached_base_model() + def get_ref(s: CoreSchema) -> str: + return s['ref'] # type: ignore + if schema['type'] == 'definitions': + self.defs.definitions.update({get_ref(s): s for s in schema['definitions']}) + schema = schema['schema'] + return schema + + def _generate_schema_from_property(self, obj: Any, source: Any) -> core_schema.CoreSchema | None: + """Try to generate schema from either the `__get_pydantic_core_schema__` function or + `__pydantic_core_schema__` property. + + Note: `__get_pydantic_core_schema__` takes priority so it can + decide whether to use a `__pydantic_core_schema__` attribute, or generate a fresh schema. + """ + # avoid calling `__get_pydantic_core_schema__` if we've already visited this object + with self.defs.get_schema_or_ref(obj) as (_, maybe_schema): + if maybe_schema is not None: + return maybe_schema + if obj is source: + ref_mode = 'unpack' + else: + ref_mode = 'to-def' + + schema: CoreSchema get_schema = getattr(obj, '__get_pydantic_core_schema__', None) - is_base_model_get_schema = ( - getattr(get_schema, '__func__', None) is BaseModel_.__get_pydantic_core_schema__.__func__ # pyright: ignore[reportFunctionMemberAccess] - ) - - if ( - get_schema is not None - # BaseModel.__get_pydantic_core_schema__ is defined for backwards compatibility, - # to allow existing code to call `super().__get_pydantic_core_schema__` in Pydantic - # model that overrides `__get_pydantic_core_schema__`. However, it raises a deprecation - # warning stating that the method will be removed, and during the core schema gen we actually - # don't call the method: - and not is_base_model_get_schema - ): - # Some referenceable types might have a `__get_pydantic_core_schema__` method - # defined on it by users (e.g. on a dataclass). This generally doesn't play well - # as these types are already recognized by the `GenerateSchema` class and isn't ideal - # as we might end up calling `get_schema_or_ref` (expensive) on types that are actually - # not referenceable: - with self.defs.get_schema_or_ref(obj) as (_, maybe_schema): - if maybe_schema is not None: - return maybe_schema - - if obj is source: - ref_mode = 'unpack' - else: - ref_mode = 'to-def' - schema = get_schema( - source, CallbackGetCoreSchemaHandler(self._generate_schema_inner, self, ref_mode=ref_mode) + if get_schema is None: + validators = getattr(obj, '__get_validators__', None) + if validators is None: + return None + warn( + '`__get_validators__` is deprecated and will be removed, use `__get_pydantic_core_schema__` instead.', + PydanticDeprecatedSince20, ) - if schema['type'] == 'definitions': - schema = self.defs.unpack_definitions(schema) - - ref = get_ref(schema) - if ref: - return self.defs.create_definition_reference_schema(schema) - - # Note: if schema is of type `'definition-ref'`, we might want to copy it as a - # safety measure (because these are inlined in place -- i.e. mutated directly) - return schema - - if get_schema is None and (validators := getattr(obj, '__get_validators__', None)) is not None: - from pydantic.v1 import BaseModel as BaseModelV1 - - if issubclass(obj, BaseModelV1): - warnings.warn( - f'Mixing V1 models and V2 models (or constructs, like `TypeAdapter`) is not supported. Please upgrade `{obj.__name__}` to V2.', - UserWarning, - ) + schema = core_schema.chain_schema([core_schema.with_info_plain_validator_function(v) for v in validators()]) + else: + if len(inspect.signature(get_schema).parameters) == 1: + # (source) -> CoreSchema + schema = get_schema(source) else: - warnings.warn( - '`__get_validators__` is deprecated and will be removed, use `__get_pydantic_core_schema__` instead.', - PydanticDeprecatedSince20, + schema = get_schema( + source, CallbackGetCoreSchemaHandler(self._generate_schema, self, ref_mode=ref_mode) ) - return core_schema.chain_schema([core_schema.with_info_plain_validator_function(v) for v in validators()]) + + schema = self._unpack_refs_defs(schema) + + ref = get_ref(schema) + if ref: + self.defs.definitions[ref] = self._post_process_generated_schema(schema) + return core_schema.definition_reference_schema(ref) + + schema = self._post_process_generated_schema(schema) + + return schema def _resolve_forward_ref(self, obj: Any) -> Any: # we assume that types_namespace has the target of forward references in its scope, @@ -954,7 +637,7 @@ class GenerateSchema: # class Model(BaseModel): # x: SomeImportedTypeAliasWithAForwardReference try: - obj = _typing_extra.eval_type_backport(obj, *self._types_namespace) + obj = _typing_extra.evaluate_fwd_ref(obj, globalns=self._types_namespace) except NameError as e: raise PydanticUndefinedAnnotation.from_name_error(e) from e @@ -968,18 +651,17 @@ class GenerateSchema: return obj @overload - def _get_args_resolving_forward_refs(self, obj: Any, required: Literal[True]) -> tuple[Any, ...]: ... + def _get_args_resolving_forward_refs(self, obj: Any, required: Literal[True]) -> tuple[Any, ...]: + ... @overload - def _get_args_resolving_forward_refs(self, obj: Any) -> tuple[Any, ...] | None: ... + def _get_args_resolving_forward_refs(self, obj: Any) -> tuple[Any, ...] | None: + ... def _get_args_resolving_forward_refs(self, obj: Any, required: bool = False) -> tuple[Any, ...] | None: args = get_args(obj) if args: - if isinstance(obj, GenericAlias): - # PEP 585 generic aliases don't convert args to ForwardRefs, unlike `typing.List/Dict` etc. - args = (_typing_extra._make_forward_ref(a) if isinstance(a, str) else a for a in args) - args = tuple(self._resolve_forward_ref(a) if isinstance(a, ForwardRef) else a for a in args) + args = tuple([self._resolve_forward_ref(a) if isinstance(a, ForwardRef) else a for a in args]) elif required: # pragma: no cover raise TypeError(f'Expected {obj} to have generic parameters but it had none') return args @@ -999,11 +681,29 @@ class GenerateSchema: raise TypeError(f'Expected two type arguments for {origin}, got 1') return args[0], args[1] - def _generate_schema_inner(self, obj: Any) -> core_schema.CoreSchema: - if typing_objects.is_self(obj): - obj = self._resolve_self_type(obj) + def _post_process_generated_schema(self, schema: core_schema.CoreSchema) -> core_schema.CoreSchema: + if 'metadata' in schema: + metadata = schema['metadata'] + metadata[NEEDS_APPLY_DISCRIMINATED_UNION_METADATA_KEY] = self._needs_apply_discriminated_union + else: + schema['metadata'] = { + NEEDS_APPLY_DISCRIMINATED_UNION_METADATA_KEY: self._needs_apply_discriminated_union, + } + return schema - if typing_objects.is_annotated(get_origin(obj)): + def _generate_schema(self, obj: Any) -> core_schema.CoreSchema: + """Recursively generate a pydantic-core schema for any supported python type.""" + has_invalid_schema = self._has_invalid_schema + self._has_invalid_schema = False + needs_apply_discriminated_union = self._needs_apply_discriminated_union + self._needs_apply_discriminated_union = False + schema = self._post_process_generated_schema(self._generate_schema_inner(obj)) + self._has_invalid_schema = self._has_invalid_schema or has_invalid_schema + self._needs_apply_discriminated_union = self._needs_apply_discriminated_union or needs_apply_discriminated_union + return schema + + def _generate_schema_inner(self, obj: Any) -> core_schema.CoreSchema: + if isinstance(obj, _AnnotatedType): return self._annotated_schema(obj) if isinstance(obj, dict): @@ -1016,11 +716,10 @@ class GenerateSchema: if isinstance(obj, ForwardRef): return self.generate_schema(self._resolve_forward_ref(obj)) - BaseModel = import_cached_base_model() + from ..main import BaseModel if lenient_issubclass(obj, BaseModel): - with self.model_type_stack.push(obj): - return self._model_schema(obj) + return self._model_schema(obj) if isinstance(obj, PydanticRecursiveRef): return core_schema.definition_reference_schema(schema_ref=obj.type_ref) @@ -1041,7 +740,7 @@ class GenerateSchema: as they get requested and we figure out what the right API for them is. """ if obj is str: - return core_schema.str_schema() + return self.str_schema() elif obj is bytes: return core_schema.bytes_schema() elif obj is int: @@ -1050,94 +749,61 @@ class GenerateSchema: return core_schema.float_schema() elif obj is bool: return core_schema.bool_schema() - elif obj is complex: - return core_schema.complex_schema() - elif typing_objects.is_any(obj) or obj is object: + elif obj is Any or obj is object: return core_schema.any_schema() - elif obj is datetime.date: - return core_schema.date_schema() - elif obj is datetime.datetime: - return core_schema.datetime_schema() - elif obj is datetime.time: - return core_schema.time_schema() - elif obj is datetime.timedelta: - return core_schema.timedelta_schema() - elif obj is Decimal: - return core_schema.decimal_schema() - elif obj is UUID: - return core_schema.uuid_schema() - elif obj is Url: - return core_schema.url_schema() - elif obj is Fraction: - return self._fraction_schema() - elif obj is MultiHostUrl: - return core_schema.multi_host_url_schema() elif obj is None or obj is _typing_extra.NoneType: return core_schema.none_schema() - if obj is MISSING: - return core_schema.missing_sentinel_schema() - elif obj in IP_TYPES: - return self._ip_schema(obj) elif obj in TUPLE_TYPES: return self._tuple_schema(obj) elif obj in LIST_TYPES: - return self._list_schema(Any) + return self._list_schema(obj, self._get_first_arg_or_any(obj)) elif obj in SET_TYPES: - return self._set_schema(Any) + return self._set_schema(obj, self._get_first_arg_or_any(obj)) elif obj in FROZEN_SET_TYPES: - return self._frozenset_schema(Any) - elif obj in SEQUENCE_TYPES: - return self._sequence_schema(Any) - elif obj in ITERABLE_TYPES: - return self._iterable_schema(obj) + return self._frozenset_schema(obj, self._get_first_arg_or_any(obj)) elif obj in DICT_TYPES: - return self._dict_schema(Any, Any) - elif obj in PATH_TYPES: - return self._path_schema(obj, Any) - elif obj in DEQUE_TYPES: - return self._deque_schema(Any) - elif obj in MAPPING_TYPES: - return self._mapping_schema(obj, Any, Any) - elif obj in COUNTER_TYPES: - return self._mapping_schema(obj, Any, int) - elif typing_objects.is_typealiastype(obj): + return self._dict_schema(obj, *self._get_first_two_args_or_any(obj)) + elif isinstance(obj, TypeAliasType): return self._type_alias_type_schema(obj) - elif obj is type: + elif obj == type: return self._type_schema() - elif _typing_extra.is_callable(obj): + elif _typing_extra.is_callable_type(obj): return core_schema.callable_schema() - elif typing_objects.is_literal(get_origin(obj)): + elif _typing_extra.is_literal_type(obj): return self._literal_schema(obj) elif is_typeddict(obj): return self._typed_dict_schema(obj, None) elif _typing_extra.is_namedtuple(obj): return self._namedtuple_schema(obj, None) - elif typing_objects.is_newtype(obj): - # NewType, can't use isinstance because it fails <3.10 + elif _typing_extra.is_new_type(obj): + # NewType, can't use isinstance because it fails <3.7 return self.generate_schema(obj.__supertype__) - elif obj in PATTERN_TYPES: + elif obj == re.Pattern: return self._pattern_schema(obj) - elif _typing_extra.is_hashable(obj): + elif obj is collections.abc.Hashable or obj is typing.Hashable: return self._hashable_schema() elif isinstance(obj, typing.TypeVar): return self._unsubstituted_typevar_schema(obj) - elif _typing_extra.is_finalvar(obj): + elif is_finalvar(obj): if obj is Final: return core_schema.any_schema() return self.generate_schema( self._get_first_arg_or_any(obj), ) - elif isinstance(obj, VALIDATE_CALL_SUPPORTED_TYPES): - return self._call_schema(obj) + elif isinstance(obj, (FunctionType, LambdaType, MethodType, partial)): + return self._callable_schema(obj) elif inspect.isclass(obj) and issubclass(obj, Enum): - return self._enum_schema(obj) - elif obj is ZoneInfo: - return self._zoneinfo_schema() + from ._std_types_schema import get_enum_core_schema - # dataclasses.is_dataclass coerces dc instances to types, but we only handle - # the case of a dc type here - if dataclasses.is_dataclass(obj): - return self._dataclass_schema(obj, None) # pyright: ignore[reportArgumentType] + return get_enum_core_schema(obj, self._config_wrapper.config_dict) + + if _typing_extra.is_dataclass(obj): + return self._dataclass_schema(obj, None) + + res = self._get_prepare_pydantic_annotations_for_known_type(obj, ()) + if res is not None: + source_type, annotations = res + return self._apply_annotations(source_type, annotations) origin = get_origin(obj) if origin is not None: @@ -1148,50 +814,43 @@ class GenerateSchema: return self._unknown_type_schema(obj) def _match_generic_type(self, obj: Any, origin: Any) -> CoreSchema: # noqa: C901 + if isinstance(origin, TypeAliasType): + return self._type_alias_type_schema(obj) + # Need to handle generic dataclasses before looking for the schema properties because attribute accesses # on _GenericAlias delegate to the origin type, so lose the information about the concrete parametrization # As a result, currently, there is no way to cache the schema for generic dataclasses. This may be possible # to resolve by modifying the value returned by `Generic.__class_getitem__`, but that is a dangerous game. - if dataclasses.is_dataclass(origin): - return self._dataclass_schema(obj, origin) # pyright: ignore[reportArgumentType] + if _typing_extra.is_dataclass(origin): + return self._dataclass_schema(obj, origin) if _typing_extra.is_namedtuple(origin): return self._namedtuple_schema(obj, origin) - schema = self._generate_schema_from_get_schema_method(origin, obj) - if schema is not None: - return schema + from_property = self._generate_schema_from_property(origin, obj) + if from_property is not None: + return from_property - if typing_objects.is_typealiastype(origin): - return self._type_alias_type_schema(obj) - elif is_union_origin(origin): + if _typing_extra.origin_is_union(origin): return self._union_schema(obj) elif origin in TUPLE_TYPES: return self._tuple_schema(obj) elif origin in LIST_TYPES: - return self._list_schema(self._get_first_arg_or_any(obj)) + return self._list_schema(obj, self._get_first_arg_or_any(obj)) elif origin in SET_TYPES: - return self._set_schema(self._get_first_arg_or_any(obj)) + return self._set_schema(obj, self._get_first_arg_or_any(obj)) elif origin in FROZEN_SET_TYPES: - return self._frozenset_schema(self._get_first_arg_or_any(obj)) + return self._frozenset_schema(obj, self._get_first_arg_or_any(obj)) elif origin in DICT_TYPES: - return self._dict_schema(*self._get_first_two_args_or_any(obj)) - elif origin in PATH_TYPES: - return self._path_schema(origin, self._get_first_arg_or_any(obj)) - elif origin in DEQUE_TYPES: - return self._deque_schema(self._get_first_arg_or_any(obj)) - elif origin in MAPPING_TYPES: - return self._mapping_schema(origin, *self._get_first_two_args_or_any(obj)) - elif origin in COUNTER_TYPES: - return self._mapping_schema(origin, self._get_first_arg_or_any(obj), int) + return self._dict_schema(obj, *self._get_first_two_args_or_any(obj)) elif is_typeddict(origin): return self._typed_dict_schema(obj, origin) - elif origin in TYPE_TYPES: + elif origin in (typing.Type, type): return self._subclass_schema(obj) - elif origin in SEQUENCE_TYPES: - return self._sequence_schema(self._get_first_arg_or_any(obj)) - elif origin in ITERABLE_TYPES: + elif origin in {typing.Sequence, collections.abc.Sequence}: + return self._sequence_schema(obj) + elif origin in {typing.Iterable, collections.abc.Iterable, typing.Generator, collections.abc.Generator}: return self._iterable_schema(obj) - elif origin in PATTERN_TYPES: + elif origin in (re.Pattern, typing.Pattern): return self._pattern_schema(obj) if self._arbitrary_types: @@ -1207,15 +866,14 @@ class GenerateSchema: required: bool = True, ) -> core_schema.TypedDictField: """Prepare a TypedDictField to represent a model or typeddict field.""" - schema, metadata = self._common_field_schema(name, field_info, decorators) + common_field = self._common_field_schema(name, field_info, decorators) return core_schema.typed_dict_field( - schema, + common_field['schema'], required=False if not field_info.is_required() else required, - serialization_exclude=field_info.exclude, - validation_alias=_convert_to_aliases(field_info.validation_alias), - serialization_alias=field_info.serialization_alias, - serialization_exclude_if=field_info.exclude_if, - metadata=metadata, + serialization_exclude=common_field['serialization_exclude'], + validation_alias=common_field['validation_alias'], + serialization_alias=common_field['serialization_alias'], + metadata=common_field['metadata'], ) def _generate_md_field_schema( @@ -1225,15 +883,14 @@ class GenerateSchema: decorators: DecoratorInfos, ) -> core_schema.ModelField: """Prepare a ModelField to represent a model field.""" - schema, metadata = self._common_field_schema(name, field_info, decorators) + common_field = self._common_field_schema(name, field_info, decorators) return core_schema.model_field( - schema, - serialization_exclude=field_info.exclude, - validation_alias=_convert_to_aliases(field_info.validation_alias), - serialization_alias=field_info.serialization_alias, - serialization_exclude_if=field_info.exclude_if, - frozen=field_info.frozen, - metadata=metadata, + common_field['schema'], + serialization_exclude=common_field['serialization_exclude'], + validation_alias=common_field['validation_alias'], + serialization_alias=common_field['serialization_alias'], + frozen=common_field['frozen'], + metadata=common_field['metadata'], ) def _generate_dc_field_schema( @@ -1243,45 +900,57 @@ class GenerateSchema: decorators: DecoratorInfos, ) -> core_schema.DataclassField: """Prepare a DataclassField to represent the parameter/field, of a dataclass.""" - schema, metadata = self._common_field_schema(name, field_info, decorators) + common_field = self._common_field_schema(name, field_info, decorators) return core_schema.dataclass_field( name, - schema, - init=field_info.init, + common_field['schema'], init_only=field_info.init_var or None, kw_only=None if field_info.kw_only else False, - serialization_exclude=field_info.exclude, - validation_alias=_convert_to_aliases(field_info.validation_alias), - serialization_alias=field_info.serialization_alias, - serialization_exclude_if=field_info.exclude_if, - frozen=field_info.frozen, - metadata=metadata, + serialization_exclude=common_field['serialization_exclude'], + validation_alias=common_field['validation_alias'], + serialization_alias=common_field['serialization_alias'], + frozen=common_field['frozen'], + metadata=common_field['metadata'], ) - def _common_field_schema( # C901 + def _common_field_schema( # noqa C901 self, name: str, field_info: FieldInfo, decorators: DecoratorInfos - ) -> tuple[CoreSchema, dict[str, Any]]: + ) -> _CommonField: + # Update FieldInfo annotation if appropriate: + from ..fields import AliasChoices, AliasPath, FieldInfo + + if has_instance_in_type(field_info.annotation, (ForwardRef, str)): + types_namespace = self._types_namespace + if self._typevars_map: + types_namespace = (types_namespace or {}).copy() + # Ensure that typevars get mapped to their concrete types: + types_namespace.update({k.__name__: v for k, v in self._typevars_map.items()}) + + evaluated = _typing_extra.eval_type_lenient(field_info.annotation, types_namespace, None) + if evaluated is not field_info.annotation and not has_instance_in_type(evaluated, PydanticRecursiveRef): + field_info.annotation = evaluated + + # Handle any field info attributes that may have been obtained from now-resolved annotations + new_field_info = FieldInfo.from_annotation(evaluated) + for k, v in new_field_info._attributes_set.items(): + # If an attribute is already set, it means it was set by assigning to a call to Field (or just a + # default value), and that should take the highest priority. So don't overwrite existing attributes. + if k not in field_info._attributes_set: + setattr(field_info, k, v) + source_type, annotations = field_info.annotation, field_info.metadata def set_discriminator(schema: CoreSchema) -> CoreSchema: schema = self._apply_discriminator_to_union(schema, field_info.discriminator) return schema - # Convert `@field_validator` decorators to `Before/After/Plain/WrapValidator` instances: - validators_from_decorators = [ - _mode_to_validator[decorator.info.mode]._from_decorator(decorator) - for decorator in filter_field_decorator_info_by_field(decorators.field_validators.values(), name) - ] - with self.field_name_stack.push(name): if field_info.discriminator is not None: - schema = self._apply_annotations( - source_type, annotations + validators_from_decorators, transform_inner_schema=set_discriminator - ) + schema = self._apply_annotations(source_type, annotations, transform_inner_schema=set_discriminator) else: schema = self._apply_annotations( source_type, - annotations + validators_from_decorators, + annotations, ) # This V1 compatibility shim should eventually be removed @@ -1293,9 +962,12 @@ class GenerateSchema: field_info.validate_default = True each_item_validators = [v for v in this_field_validators if v.info.each_item is True] this_field_validators = [v for v in this_field_validators if v not in each_item_validators] - schema = apply_each_item_validators(schema, each_item_validators) + schema = apply_each_item_validators(schema, each_item_validators, name) - schema = apply_validators(schema, this_field_validators) + schema = apply_validators(schema, filter_field_decorator_info_by_field(this_field_validators, name), name) + schema = apply_validators( + schema, filter_field_decorator_info_by_field(decorators.field_validators.values(), name), name + ) # the default validator needs to go outside of any other validators # so that it is the topmost validator for the field validator @@ -1306,14 +978,51 @@ class GenerateSchema: schema = self._apply_field_serializers( schema, filter_field_decorator_info_by_field(decorators.field_serializers.values(), name) ) + json_schema_updates = { + 'title': field_info.title, + 'description': field_info.description, + 'examples': to_jsonable_python(field_info.examples), + } + json_schema_updates = {k: v for k, v in json_schema_updates.items() if v is not None} - pydantic_js_updates, pydantic_js_extra = _extract_json_schema_info_from_field_info(field_info) - core_metadata: dict[str, Any] = {} - update_core_metadata( - core_metadata, pydantic_js_updates=pydantic_js_updates, pydantic_js_extra=pydantic_js_extra + json_schema_extra = field_info.json_schema_extra + + metadata = build_metadata_dict( + js_annotation_functions=[get_json_schema_update_func(json_schema_updates, json_schema_extra)] ) - return schema, core_metadata + # apply alias generator + alias_generator = self._config_wrapper.alias_generator + if alias_generator and ( + field_info.alias_priority is None or field_info.alias_priority <= 1 or field_info.alias is None + ): + alias = alias_generator(name) + if not isinstance(alias, str): + raise TypeError(f'alias_generator {alias_generator} must return str, not {alias.__class__}') + if field_info.alias is None: + if field_info.serialization_alias is None: + field_info.serialization_alias = alias + if field_info.validation_alias is None: + field_info.validation_alias = alias + else: + field_info.serialization_alias = alias + field_info.validation_alias = alias + field_info.alias_priority = 1 + field_info.alias = alias + + if isinstance(field_info.validation_alias, (AliasChoices, AliasPath)): + validation_alias = field_info.validation_alias.convert_to_aliases() + else: + validation_alias = field_info.validation_alias + + return _common_field( + schema, + serialization_exclude=True if field_info.exclude else None, + validation_alias=validation_alias, + serialization_alias=field_info.serialization_alias, + frozen=field_info.frozen, + metadata=metadata, + ) def _union_schema(self, union_type: Any) -> core_schema.CoreSchema: """Generate schema for a Union.""" @@ -1331,68 +1040,70 @@ class GenerateSchema: else: choices_with_tags: list[CoreSchema | tuple[CoreSchema, str]] = [] for choice in choices: - tag = cast(CoreMetadata, choice.get('metadata', {})).get('pydantic_internal_union_tag_key') - if tag is not None: - choices_with_tags.append((choice, tag)) - else: - choices_with_tags.append(choice) + metadata = choice.get('metadata') + if isinstance(metadata, dict): + tag = metadata.get(_core_utils.TAGGED_UNION_TAG_KEY) + if tag is not None: + choices_with_tags.append((choice, tag)) + else: + choices_with_tags.append(choice) s = core_schema.union_schema(choices_with_tags) if nullable: s = core_schema.nullable_schema(s) return s - def _type_alias_type_schema(self, obj: TypeAliasType) -> CoreSchema: + def _type_alias_type_schema( + self, + obj: Any, # TypeAliasType + ) -> CoreSchema: with self.defs.get_schema_or_ref(obj) as (ref, maybe_schema): if maybe_schema is not None: return maybe_schema - origin: TypeAliasType = get_origin(obj) or obj + origin = get_origin(obj) or obj + + namespace = (self._types_namespace or {}).copy() + new_namespace = {**_typing_extra.get_cls_types_namespace(origin), **namespace} + annotation = origin.__value__ + + self._types_namespace = new_namespace typevars_map = get_standard_typevars_map(obj) - with self._ns_resolver.push(origin): - try: - annotation = _typing_extra.eval_type(origin.__value__, *self._types_namespace) - except NameError as e: - raise PydanticUndefinedAnnotation.from_name_error(e) from e - annotation = replace_types(annotation, typevars_map) - schema = self.generate_schema(annotation) - assert schema['type'] != 'definitions' - schema['ref'] = ref # type: ignore - return self.defs.create_definition_reference_schema(schema) + annotation = _typing_extra.eval_type_lenient(annotation, self._types_namespace, None) + annotation = replace_types(annotation, typevars_map) + schema = self.generate_schema(annotation) + assert schema['type'] != 'definitions' + schema['ref'] = ref # type: ignore + self._types_namespace = namespace or None + self.defs.definitions[ref] = schema + return core_schema.definition_reference_schema(ref) def _literal_schema(self, literal_type: Any) -> CoreSchema: """Generate schema for a Literal.""" - expected = list(get_literal_values(literal_type, type_check=False, unpack_type_aliases='eager')) + expected = _typing_extra.all_literal_values(literal_type) assert expected, f'literal "expected" cannot be empty, obj={literal_type}' - schema = core_schema.literal_schema(expected) - - if self._config_wrapper.use_enum_values and any(isinstance(v, Enum) for v in expected): - schema = core_schema.no_info_after_validator_function( - lambda v: v.value if isinstance(v, Enum) else v, schema - ) - - return schema + return core_schema.literal_schema(expected) def _typed_dict_schema(self, typed_dict_cls: Any, origin: Any) -> core_schema.CoreSchema: - """Generate a core schema for a `TypedDict` class. + """Generate schema for a TypedDict. - To be able to build a `DecoratorInfos` instance for the `TypedDict` class (which will include - validators, serializers, etc.), we need to have access to the original bases of the class - (see https://docs.python.org/3/library/types.html#types.get_original_bases). - However, the `__orig_bases__` attribute was only added in 3.12 (https://github.com/python/cpython/pull/103698). + It is not possible to track required/optional keys in TypedDict without __required_keys__ + since TypedDict.__new__ erases the base classes (it replaces them with just `dict`) + and thus we can track usage of total=True/False + __required_keys__ was added in Python 3.9 + (https://github.com/miss-islington/cpython/blob/1e9939657dd1f8eb9f596f77c1084d2d351172fc/Doc/library/typing.rst?plain=1#L1546-L1548) + however it is buggy + (https://github.com/python/typing_extensions/blob/ac52ac5f2cb0e00e7988bae1e2a1b8257ac88d6d/src/typing_extensions.py#L657-L666). - For this reason, we require Python 3.12 (or using the `typing_extensions` backport). + On 3.11 but < 3.12 TypedDict does not preserve inheritance information. + + Hence to avoid creating validators that do not do what users expect we only + support typing.TypedDict on Python >= 3.12 or typing_extension.TypedDict on all versions """ - FieldInfo = import_cached_field_info() + from ..fields import FieldInfo - with ( - self.model_type_stack.push(typed_dict_cls), - self.defs.get_schema_or_ref(typed_dict_cls) as ( - typed_dict_ref, - maybe_schema, - ), - ): + with self.defs.get_schema_or_ref(typed_dict_cls) as (typed_dict_ref, maybe_schema): if maybe_schema is not None: return maybe_schema @@ -1407,134 +1118,80 @@ class GenerateSchema: ) try: - # if a typed dictionary class doesn't have config, we use the parent's config, hence a default of `None` - # see https://github.com/pydantic/pydantic/issues/10917 config: ConfigDict | None = get_attribute_from_bases(typed_dict_cls, '__pydantic_config__') except AttributeError: config = None with self._config_wrapper_stack.push(config): - core_config = self._config_wrapper.core_config(title=typed_dict_cls.__name__) + core_config = self._config_wrapper.core_config(typed_dict_cls) + + self = self._current_generate_schema required_keys: frozenset[str] = typed_dict_cls.__required_keys__ fields: dict[str, core_schema.TypedDictField] = {} decorators = DecoratorInfos.build(typed_dict_cls) - decorators.update_from_config(self._config_wrapper) - if self._config_wrapper.use_attribute_docstrings: - field_docstrings = extract_docstrings_from_cls(typed_dict_cls, use_inspect=True) - else: - field_docstrings = None + for field_name, annotation in get_type_hints_infer_globalns( + typed_dict_cls, localns=self._types_namespace, include_extras=True + ).items(): + annotation = replace_types(annotation, typevars_map) + required = field_name in required_keys - try: - annotations = _typing_extra.get_cls_type_hints(typed_dict_cls, ns_resolver=self._ns_resolver) - except NameError as e: - raise PydanticUndefinedAnnotation.from_name_error(e) from e - - readonly_fields: list[str] = [] - - for field_name, annotation in annotations.items(): - field_info = FieldInfo.from_annotation(annotation, _source=AnnotationSource.TYPED_DICT) - field_info.annotation = replace_types(field_info.annotation, typevars_map) - - required = ( - field_name in required_keys or 'required' in field_info._qualifiers - ) and 'not_required' not in field_info._qualifiers - if 'read_only' in field_info._qualifiers: - readonly_fields.append(field_name) - - if ( - field_docstrings is not None - and field_info.description is None - and field_name in field_docstrings - ): - field_info.description = field_docstrings[field_name] - update_field_from_config(self._config_wrapper, field_name, field_info) + if get_origin(annotation) == _typing_extra.Required: + required = True + annotation = self._get_args_resolving_forward_refs( + annotation, + required=True, + )[0] + elif get_origin(annotation) == _typing_extra.NotRequired: + required = False + annotation = self._get_args_resolving_forward_refs( + annotation, + required=True, + )[0] + field_info = FieldInfo.from_annotation(annotation) fields[field_name] = self._generate_td_field_schema( field_name, field_info, decorators, required=required ) - if readonly_fields: - fields_repr = ', '.join(repr(f) for f in readonly_fields) - plural = len(readonly_fields) >= 2 - warnings.warn( - f'Item{"s" if plural else ""} {fields_repr} on TypedDict class {typed_dict_cls.__name__!r} ' - f'{"are" if plural else "is"} using the `ReadOnly` qualifier. Pydantic will not protect items ' - 'from any mutation on dictionary instances.', - UserWarning, - ) - - extra_behavior: core_schema.ExtraBehavior = 'ignore' - extras_schema: CoreSchema | None = None # For 'allow', equivalent to `Any` - no validation performed. - - # `__closed__` is `None` when not specified (equivalent to `False`): - is_closed = bool(getattr(typed_dict_cls, '__closed__', False)) - extra_items = getattr(typed_dict_cls, '__extra_items__', typing_extensions.NoExtraItems) - if is_closed: - extra_behavior = 'forbid' - extras_schema = None - elif not typing_objects.is_noextraitems(extra_items): - extra_behavior = 'allow' - extras_schema = self.generate_schema(replace_types(extra_items, typevars_map)) - - if (config_extra := self._config_wrapper.extra) in ('allow', 'forbid'): - if is_closed and config_extra == 'allow': - warnings.warn( - f"TypedDict class {typed_dict_cls.__qualname__!r} is closed, but 'extra' configuration " - "is set to `'allow'`. The 'extra' configuration value will be ignored.", - category=TypedDictExtraConfigWarning, - ) - elif not typing_objects.is_noextraitems(extra_items) and config_extra == 'forbid': - warnings.warn( - f"TypedDict class {typed_dict_cls.__qualname__!r} allows extra items, but 'extra' configuration " - "is set to `'forbid'`. The 'extra' configuration value will be ignored.", - category=TypedDictExtraConfigWarning, - ) - else: - extra_behavior = config_extra + metadata = build_metadata_dict( + js_functions=[partial(modify_model_json_schema, cls=typed_dict_cls)], typed_dict_cls=typed_dict_cls + ) td_schema = core_schema.typed_dict_schema( fields, - cls=typed_dict_cls, computed_fields=[ self._computed_field_schema(d, decorators.field_serializers) for d in decorators.computed_fields.values() ], - extra_behavior=extra_behavior, - extras_schema=extras_schema, ref=typed_dict_ref, + metadata=metadata, config=core_config, ) schema = self._apply_model_serializers(td_schema, decorators.model_serializers.values()) schema = apply_model_validators(schema, decorators.model_validators.values(), 'all') - return self.defs.create_definition_reference_schema(schema) + self.defs.definitions[typed_dict_ref] = self._post_process_generated_schema(schema) + return core_schema.definition_reference_schema(typed_dict_ref) def _namedtuple_schema(self, namedtuple_cls: Any, origin: Any) -> core_schema.CoreSchema: """Generate schema for a NamedTuple.""" - with ( - self.model_type_stack.push(namedtuple_cls), - self.defs.get_schema_or_ref(namedtuple_cls) as ( - namedtuple_ref, - maybe_schema, - ), - ): + with self.defs.get_schema_or_ref(namedtuple_cls) as (namedtuple_ref, maybe_schema): if maybe_schema is not None: return maybe_schema typevars_map = get_standard_typevars_map(namedtuple_cls) if origin is not None: namedtuple_cls = origin - try: - annotations = _typing_extra.get_cls_type_hints(namedtuple_cls, ns_resolver=self._ns_resolver) - except NameError as e: - raise PydanticUndefinedAnnotation.from_name_error(e) from e + annotations: dict[str, Any] = get_type_hints_infer_globalns( + namedtuple_cls, include_extras=True, localns=self._types_namespace + ) if not annotations: # annotations is empty, happens if namedtuple_cls defined via collections.namedtuple(...) - annotations: dict[str, Any] = dict.fromkeys(namedtuple_cls._fields, Any) + annotations = {k: Any for k in namedtuple_cls._fields} if typevars_map: annotations = { @@ -1545,111 +1202,45 @@ class GenerateSchema: arguments_schema = core_schema.arguments_schema( [ self._generate_parameter_schema( - field_name, - annotation, - source=AnnotationSource.NAMED_TUPLE, - default=namedtuple_cls._field_defaults.get(field_name, Parameter.empty), + field_name, annotation, default=namedtuple_cls._field_defaults.get(field_name, Parameter.empty) ) for field_name, annotation in annotations.items() ], - metadata={'pydantic_js_prefer_positional_arguments': True}, + metadata=build_metadata_dict(js_prefer_positional_arguments=True), ) - schema = core_schema.call_schema(arguments_schema, namedtuple_cls, ref=namedtuple_ref) - return self.defs.create_definition_reference_schema(schema) + return core_schema.call_schema(arguments_schema, namedtuple_cls, ref=namedtuple_ref) def _generate_parameter_schema( self, name: str, annotation: type[Any], - source: AnnotationSource, default: Any = Parameter.empty, mode: Literal['positional_only', 'positional_or_keyword', 'keyword_only'] | None = None, ) -> core_schema.ArgumentsParameter: - """Generate the definition of a field in a namedtuple or a parameter in a function signature. - - This definition is meant to be used for the `'arguments'` core schema, which will be replaced - in V3 by the `'arguments-v3`'. - """ - FieldInfo = import_cached_field_info() + """Prepare a ArgumentsParameter to represent a field in a namedtuple or function signature.""" + from ..fields import FieldInfo if default is Parameter.empty: - field = FieldInfo.from_annotation(annotation, _source=source) + field = FieldInfo.from_annotation(annotation) else: - field = FieldInfo.from_annotated_attribute(annotation, default, _source=source) - + field = FieldInfo.from_annotated_attribute(annotation, default) assert field.annotation is not None, 'field.annotation should not be None when generating a schema' - update_field_from_config(self._config_wrapper, name, field) - + source_type, annotations = field.annotation, field.metadata with self.field_name_stack.push(name): - schema = self._apply_annotations( - field.annotation, - [field], - # Because we pass `field` as metadata above (required for attributes relevant for - # JSON Scheme generation), we need to ignore the potential warnings about `FieldInfo` - # attributes that will not be used: - check_unsupported_field_info_attributes=False, - ) + schema = self._apply_annotations(source_type, annotations) if not field.is_required(): schema = wrap_default(field, schema) - parameter_schema = core_schema.arguments_parameter( - name, - schema, - mode=mode, - alias=_convert_to_aliases(field.validation_alias), - ) - - return parameter_schema - - def _generate_parameter_v3_schema( - self, - name: str, - annotation: Any, - source: AnnotationSource, - mode: Literal[ - 'positional_only', - 'positional_or_keyword', - 'keyword_only', - 'var_args', - 'var_kwargs_uniform', - 'var_kwargs_unpacked_typed_dict', - ], - default: Any = Parameter.empty, - ) -> core_schema.ArgumentsV3Parameter: - """Generate the definition of a parameter in a function signature. - - This definition is meant to be used for the `'arguments-v3'` core schema, which will replace - the `'arguments`' schema in V3. - """ - FieldInfo = import_cached_field_info() - - if default is Parameter.empty: - field = FieldInfo.from_annotation(annotation, _source=source) + parameter_schema = core_schema.arguments_parameter(name, schema) + if mode is not None: + parameter_schema['mode'] = mode + if field.alias is not None: + parameter_schema['alias'] = field.alias else: - field = FieldInfo.from_annotated_attribute(annotation, default, _source=source) - update_field_from_config(self._config_wrapper, name, field) - - with self.field_name_stack.push(name): - schema = self._apply_annotations( - field.annotation, - [field], - # Because we pass `field` as metadata above (required for attributes relevant for - # JSON Scheme generation), we need to ignore the potential warnings about `FieldInfo` - # attributes that will not be used: - check_unsupported_field_info_attributes=False, - ) - - if not field.is_required(): - schema = wrap_default(field, schema) - - parameter_schema = core_schema.arguments_v3_parameter( - name=name, - schema=schema, - mode=mode, - alias=_convert_to_aliases(field.validation_alias), - ) - + alias_generator = self._config_wrapper.alias_generator + if alias_generator: + parameter_schema['alias'] = alias_generator(name) return parameter_schema def _tuple_schema(self, tuple_type: Any) -> core_schema.CoreSchema: @@ -1665,22 +1256,22 @@ class GenerateSchema: # This is only true for <3.11, on Python 3.11+ `typing.Tuple[()]` gives `params=()` if not params: if tuple_type in TUPLE_TYPES: - return core_schema.tuple_schema([core_schema.any_schema()], variadic_item_index=0) + return core_schema.tuple_variable_schema() else: # special case for `tuple[()]` which means `tuple[]` - an empty tuple - return core_schema.tuple_schema([]) + return core_schema.tuple_positional_schema([]) elif params[-1] is Ellipsis: if len(params) == 2: - return core_schema.tuple_schema([self.generate_schema(params[0])], variadic_item_index=0) + return self._tuple_variable_schema(tuple_type, params[0]) else: # TODO: something like https://github.com/pydantic/pydantic/issues/5952 raise ValueError('Variable tuples can only have one type') elif len(params) == 1 and params[0] == (): - # special case for `tuple[()]` which means `tuple[]` - an empty tuple + # special case for `Tuple[()]` which means `Tuple[]` - an empty tuple # NOTE: This conditional can be removed when we drop support for Python 3.10. - return core_schema.tuple_schema([]) + return self._tuple_positional_schema(tuple_type, []) else: - return core_schema.tuple_schema([self.generate_schema(param) for param in params]) + return self._tuple_positional_schema(tuple_type, list(params)) def _type_schema(self) -> core_schema.CoreSchema: return core_schema.custom_error_schema( @@ -1689,83 +1280,45 @@ class GenerateSchema: custom_error_message='Input should be a type', ) - def _zoneinfo_schema(self) -> core_schema.CoreSchema: - """Generate schema for a zone_info.ZoneInfo object""" - from ._validators import validate_str_is_valid_iana_tz - - metadata = {'pydantic_js_functions': [lambda _1, _2: {'type': 'string', 'format': 'zoneinfo'}]} - return core_schema.no_info_plain_validator_function( - validate_str_is_valid_iana_tz, - serialization=core_schema.to_string_ser_schema(), - metadata=metadata, - ) - def _union_is_subclass_schema(self, union_type: Any) -> core_schema.CoreSchema: - """Generate schema for `type[Union[X, ...]]`.""" + """Generate schema for `Type[Union[X, ...]]`.""" args = self._get_args_resolving_forward_refs(union_type, required=True) - return core_schema.union_schema([self.generate_schema(type[args]) for args in args]) + return core_schema.union_schema([self.generate_schema(typing.Type[args]) for args in args]) def _subclass_schema(self, type_: Any) -> core_schema.CoreSchema: - """Generate schema for a type, e.g. `type[int]`.""" + """Generate schema for a Type, e.g. `Type[int]`.""" type_param = self._get_first_arg_or_any(type_) - - # Assume `type[Annotated[, ...]]` is equivalent to `type[]`: - type_param = _typing_extra.annotated_type(type_param) or type_param - - if typing_objects.is_any(type_param): + if type_param == Any: return self._type_schema() - elif typing_objects.is_typealiastype(type_param): - return self.generate_schema(type[type_param.__value__]) - elif typing_objects.is_typevar(type_param): + elif isinstance(type_param, typing.TypeVar): if type_param.__bound__: - if is_union_origin(get_origin(type_param.__bound__)): + if _typing_extra.origin_is_union(get_origin(type_param.__bound__)): return self._union_is_subclass_schema(type_param.__bound__) return core_schema.is_subclass_schema(type_param.__bound__) elif type_param.__constraints__: - return core_schema.union_schema([self.generate_schema(type[c]) for c in type_param.__constraints__]) + return core_schema.union_schema( + [self.generate_schema(typing.Type[c]) for c in type_param.__constraints__] + ) else: return self._type_schema() - elif is_union_origin(get_origin(type_param)): + elif _typing_extra.origin_is_union(get_origin(type_param)): return self._union_is_subclass_schema(type_param) else: - if typing_objects.is_self(type_param): - type_param = self._resolve_self_type(type_param) - if _typing_extra.is_generic_alias(type_param): - raise PydanticUserError( - 'Subscripting `type[]` with an already parametrized type is not supported. ' - f'Instead of using type[{type_param!r}], use type[{_repr.display_as_type(get_origin(type_param))}].', - code=None, - ) - if not inspect.isclass(type_param): - # when using type[None], this doesn't type convert to type[NoneType], and None isn't a class - # so we handle it manually here - if type_param is None: - return core_schema.is_subclass_schema(_typing_extra.NoneType) - raise TypeError(f'Expected a class, got {type_param!r}') return core_schema.is_subclass_schema(type_param) - def _sequence_schema(self, items_type: Any) -> core_schema.CoreSchema: + def _sequence_schema(self, sequence_type: Any) -> core_schema.CoreSchema: """Generate schema for a Sequence, e.g. `Sequence[int]`.""" - from ._serializers import serialize_sequence_via_list + item_type = self._get_first_arg_or_any(sequence_type) - item_type_schema = self.generate_schema(items_type) - list_schema = core_schema.list_schema(item_type_schema) - - json_schema = smart_deepcopy(list_schema) + list_schema = core_schema.list_schema(self.generate_schema(item_type)) python_schema = core_schema.is_instance_schema(typing.Sequence, cls_repr='Sequence') - if not typing_objects.is_any(items_type): + if item_type != Any: from ._validators import sequence_validator python_schema = core_schema.chain_schema( [python_schema, core_schema.no_info_wrap_validator_function(sequence_validator, list_schema)], ) - - serialization = core_schema.wrap_serializer_function_ser_schema( - serialize_sequence_via_list, schema=item_type_schema, info_arg=True - ) - return core_schema.json_or_python_schema( - json_schema=json_schema, python_schema=python_schema, serialization=serialization - ) + return core_schema.json_or_python_schema(json_schema=list_schema, python_schema=python_schema) def _iterable_schema(self, type_: Any) -> core_schema.GeneratorSchema: """Generate a schema for an `Iterable`.""" @@ -1776,11 +1329,11 @@ class GenerateSchema: def _pattern_schema(self, pattern_type: Any) -> core_schema.CoreSchema: from . import _validators - metadata = {'pydantic_js_functions': [lambda _1, _2: {'type': 'string', 'format': 'regex'}]} + metadata = build_metadata_dict(js_functions=[lambda _1, _2: {'type': 'string', 'format': 'regex'}]) ser = core_schema.plain_serializer_function_ser_schema( attrgetter('pattern'), when_used='json', return_schema=core_schema.str_schema() ) - if pattern_type is typing.Pattern or pattern_type is re.Pattern: + if pattern_type == typing.Pattern or pattern_type == re.Pattern: # bare type return core_schema.no_info_plain_validator_function( _validators.pattern_either_validator, serialization=ser, metadata=metadata @@ -1790,11 +1343,11 @@ class GenerateSchema: pattern_type, required=True, )[0] - if param is str: + if param == str: return core_schema.no_info_plain_validator_function( _validators.pattern_str_validator, serialization=ser, metadata=metadata ) - elif param is bytes: + elif param == bytes: return core_schema.no_info_plain_validator_function( _validators.pattern_bytes_validator, serialization=ser, metadata=metadata ) @@ -1803,12 +1356,7 @@ class GenerateSchema: def _hashable_schema(self) -> core_schema.CoreSchema: return core_schema.custom_error_schema( - schema=core_schema.json_or_python_schema( - json_schema=core_schema.chain_schema( - [core_schema.any_schema(), core_schema.is_instance_schema(collections.abc.Hashable)] - ), - python_schema=core_schema.is_instance_schema(collections.abc.Hashable), - ), + core_schema.is_instance_schema(collections.abc.Hashable), custom_error_type='is_hashable', custom_error_message='Input should be hashable', ) @@ -1817,81 +1365,34 @@ class GenerateSchema: self, dataclass: type[StandardDataclass], origin: type[StandardDataclass] | None ) -> core_schema.CoreSchema: """Generate schema for a dataclass.""" - with ( - self.model_type_stack.push(dataclass), - self.defs.get_schema_or_ref(dataclass) as ( - dataclass_ref, - maybe_schema, - ), - ): + with self.defs.get_schema_or_ref(dataclass) as (dataclass_ref, maybe_schema): if maybe_schema is not None: return maybe_schema - schema = dataclass.__dict__.get('__pydantic_core_schema__') - if schema is not None and not isinstance(schema, MockCoreSchema): - if schema['type'] == 'definitions': - schema = self.defs.unpack_definitions(schema) - ref = get_ref(schema) - if ref: - return self.defs.create_definition_reference_schema(schema) - else: - return schema - typevars_map = get_standard_typevars_map(dataclass) if origin is not None: dataclass = origin - # if (plain) dataclass doesn't have config, we use the parent's config, hence a default of `None` - # (Pydantic dataclasses have an empty dict config by default). - # see https://github.com/pydantic/pydantic/issues/10917 config = getattr(dataclass, '__pydantic_config__', None) + with self._config_wrapper_stack.push(config): + core_config = self._config_wrapper.core_config(dataclass) - from ..dataclasses import is_pydantic_dataclass + self = self._current_generate_schema + + from ..dataclasses import is_pydantic_dataclass - with self._ns_resolver.push(dataclass), self._config_wrapper_stack.push(config): if is_pydantic_dataclass(dataclass): - if dataclass.__pydantic_fields_complete__(): - # Copy the field info instances to avoid mutating the `FieldInfo` instances - # of the generic dataclass generic origin (e.g. `apply_typevars_map` below). - # Note that we don't apply `deepcopy` on `__pydantic_fields__` because we - # don't want to copy the `FieldInfo` attributes: - fields = { - f_name: copy(field_info) for f_name, field_info in dataclass.__pydantic_fields__.items() - } - if typevars_map: - for field in fields.values(): - field.apply_typevars_map(typevars_map, *self._types_namespace) - else: - try: - fields = rebuild_dataclass_fields( - dataclass, - config_wrapper=self._config_wrapper, - ns_resolver=self._ns_resolver, - typevars_map=typevars_map or {}, - ) - except NameError as e: - raise PydanticUndefinedAnnotation.from_name_error(e) from e + fields = deepcopy(dataclass.__pydantic_fields__) + if typevars_map: + for field in fields.values(): + field.apply_typevars_map(typevars_map, self._types_namespace) else: fields = collect_dataclass_fields( dataclass, + self._types_namespace, typevars_map=typevars_map, - config_wrapper=self._config_wrapper, ) - - if self._config_wrapper.extra == 'allow': - # disallow combination of init=False on a dataclass field and extra='allow' on a dataclass - for field_name, field in fields.items(): - if field.init is False: - raise PydanticUserError( - f'Field {field_name} has `init=False` and dataclass has config setting `extra="allow"`. ' - f'This combination is not allowed.', - code='dataclass-init-false-extra-allow', - ) - - decorators = dataclass.__dict__.get('__pydantic_decorators__') - if decorators is None: - decorators = DecoratorInfos.build(dataclass) - decorators.update_from_config(self._config_wrapper) + decorators = dataclass.__dict__.get('__pydantic_decorators__') or DecoratorInfos.build(dataclass) # Move kw_only=False args to the start of the list, as this is how vanilla dataclasses work. # Note that when kw_only is missing or None, it is treated as equivalent to kw_only=True args = sorted( @@ -1911,237 +1412,116 @@ class GenerateSchema: collect_init_only=has_post_init, ) - inner_schema = apply_validators(args_schema, decorators.root_validators.values()) + inner_schema = apply_validators(args_schema, decorators.root_validators.values(), None) model_validators = decorators.model_validators.values() inner_schema = apply_model_validators(inner_schema, model_validators, 'inner') - core_config = self._config_wrapper.core_config(title=dataclass.__name__) - dc_schema = core_schema.dataclass_schema( dataclass, inner_schema, - generic_origin=origin, post_init=has_post_init, ref=dataclass_ref, fields=[field.name for field in dataclasses.fields(dataclass)], slots=has_slots, config=core_config, - # we don't use a custom __setattr__ for dataclasses, so we must - # pass along the frozen config setting to the pydantic-core schema - frozen=self._config_wrapper_stack.tail.frozen, ) schema = self._apply_model_serializers(dc_schema, decorators.model_serializers.values()) schema = apply_model_validators(schema, model_validators, 'outer') - return self.defs.create_definition_reference_schema(schema) + self.defs.definitions[dataclass_ref] = self._post_process_generated_schema(schema) + return core_schema.definition_reference_schema(dataclass_ref) - def _call_schema(self, function: ValidateCallSupportedTypes) -> core_schema.CallSchema: + def _callable_schema(self, function: Callable[..., Any]) -> core_schema.CallSchema: """Generate schema for a Callable. TODO support functional validators once we support them in Config """ - arguments_schema = self._arguments_schema(function) + sig = signature(function) - return_schema: core_schema.CoreSchema | None = None - config_wrapper = self._config_wrapper - if config_wrapper.validate_return: - sig = signature(function) - return_hint = sig.return_annotation - if return_hint is not sig.empty: - globalns, localns = self._types_namespace - type_hints = _typing_extra.get_function_type_hints( - function, globalns=globalns, localns=localns, include_keys={'return'} - ) - return_schema = self.generate_schema(type_hints['return']) + type_hints = _typing_extra.get_function_type_hints(function) - return core_schema.call_schema( - arguments_schema, - function, - return_schema=return_schema, - ) - - def _arguments_schema( - self, function: ValidateCallSupportedTypes, parameters_callback: ParametersCallback | None = None - ) -> core_schema.ArgumentsSchema: - """Generate schema for a Signature.""" mode_lookup: dict[_ParameterKind, Literal['positional_only', 'positional_or_keyword', 'keyword_only']] = { Parameter.POSITIONAL_ONLY: 'positional_only', Parameter.POSITIONAL_OR_KEYWORD: 'positional_or_keyword', Parameter.KEYWORD_ONLY: 'keyword_only', } - sig = signature(function) - globalns, localns = self._types_namespace - type_hints = _typing_extra.get_function_type_hints(function, globalns=globalns, localns=localns) - arguments_list: list[core_schema.ArgumentsParameter] = [] var_args_schema: core_schema.CoreSchema | None = None var_kwargs_schema: core_schema.CoreSchema | None = None - var_kwargs_mode: core_schema.VarKwargsMode | None = None - for i, (name, p) in enumerate(sig.parameters.items()): + for name, p in sig.parameters.items(): if p.annotation is sig.empty: - annotation = typing.cast(Any, Any) + annotation = Any else: annotation = type_hints[name] - if parameters_callback is not None: - result = parameters_callback(i, name, annotation) - if result == 'skip': - continue - parameter_mode = mode_lookup.get(p.kind) if parameter_mode is not None: - arg_schema = self._generate_parameter_schema( - name, annotation, AnnotationSource.FUNCTION, p.default, parameter_mode - ) + arg_schema = self._generate_parameter_schema(name, annotation, p.default, parameter_mode) arguments_list.append(arg_schema) elif p.kind == Parameter.VAR_POSITIONAL: var_args_schema = self.generate_schema(annotation) else: assert p.kind == Parameter.VAR_KEYWORD, p.kind + var_kwargs_schema = self.generate_schema(annotation) - unpack_type = _typing_extra.unpack_type(annotation) - if unpack_type is not None: - origin = get_origin(unpack_type) or unpack_type - if not is_typeddict(origin): - raise PydanticUserError( - f'Expected a `TypedDict` class inside `Unpack[...]`, got {unpack_type!r}', - code='unpack-typed-dict', - ) - non_pos_only_param_names = { - name for name, p in sig.parameters.items() if p.kind != Parameter.POSITIONAL_ONLY - } - overlapping_params = non_pos_only_param_names.intersection(origin.__annotations__) - if overlapping_params: - raise PydanticUserError( - f'Typed dictionary {origin.__name__!r} overlaps with parameter' - f'{"s" if len(overlapping_params) >= 2 else ""} ' - f'{", ".join(repr(p) for p in sorted(overlapping_params))}', - code='overlapping-unpack-typed-dict', - ) + return_schema: core_schema.CoreSchema | None = None + config_wrapper = self._config_wrapper + if config_wrapper.validate_return: + return_hint = type_hints.get('return') + if return_hint is not None: + return_schema = self.generate_schema(return_hint) - var_kwargs_mode = 'unpacked-typed-dict' - var_kwargs_schema = self._typed_dict_schema(unpack_type, get_origin(unpack_type)) - else: - var_kwargs_mode = 'uniform' - var_kwargs_schema = self.generate_schema(annotation) - - return core_schema.arguments_schema( - arguments_list, - var_args_schema=var_args_schema, - var_kwargs_mode=var_kwargs_mode, - var_kwargs_schema=var_kwargs_schema, - validate_by_name=self._config_wrapper.validate_by_name, - ) - - def _arguments_v3_schema( - self, function: ValidateCallSupportedTypes, parameters_callback: ParametersCallback | None = None - ) -> core_schema.ArgumentsV3Schema: - mode_lookup: dict[ - _ParameterKind, Literal['positional_only', 'positional_or_keyword', 'var_args', 'keyword_only'] - ] = { - Parameter.POSITIONAL_ONLY: 'positional_only', - Parameter.POSITIONAL_OR_KEYWORD: 'positional_or_keyword', - Parameter.VAR_POSITIONAL: 'var_args', - Parameter.KEYWORD_ONLY: 'keyword_only', - } - - sig = signature(function) - globalns, localns = self._types_namespace - type_hints = _typing_extra.get_function_type_hints(function, globalns=globalns, localns=localns) - - parameters_list: list[core_schema.ArgumentsV3Parameter] = [] - - for i, (name, p) in enumerate(sig.parameters.items()): - if parameters_callback is not None: - result = parameters_callback(i, name, p.annotation) - if result == 'skip': - continue - - if p.annotation is Parameter.empty: - annotation = typing.cast(Any, Any) - else: - annotation = type_hints[name] - - parameter_mode = mode_lookup.get(p.kind) - if parameter_mode is None: - assert p.kind == Parameter.VAR_KEYWORD, p.kind - - unpack_type = _typing_extra.unpack_type(annotation) - if unpack_type is not None: - origin = get_origin(unpack_type) or unpack_type - if not is_typeddict(origin): - raise PydanticUserError( - f'Expected a `TypedDict` class inside `Unpack[...]`, got {unpack_type!r}', - code='unpack-typed-dict', - ) - non_pos_only_param_names = { - name for name, p in sig.parameters.items() if p.kind != Parameter.POSITIONAL_ONLY - } - overlapping_params = non_pos_only_param_names.intersection(origin.__annotations__) - if overlapping_params: - raise PydanticUserError( - f'Typed dictionary {origin.__name__!r} overlaps with parameter' - f'{"s" if len(overlapping_params) >= 2 else ""} ' - f'{", ".join(repr(p) for p in sorted(overlapping_params))}', - code='overlapping-unpack-typed-dict', - ) - parameter_mode = 'var_kwargs_unpacked_typed_dict' - annotation = unpack_type - else: - parameter_mode = 'var_kwargs_uniform' - - parameters_list.append( - self._generate_parameter_v3_schema( - name, annotation, AnnotationSource.FUNCTION, parameter_mode, default=p.default - ) - ) - - return core_schema.arguments_v3_schema( - parameters_list, - validate_by_name=self._config_wrapper.validate_by_name, + return core_schema.call_schema( + core_schema.arguments_schema( + arguments_list, + var_args_schema=var_args_schema, + var_kwargs_schema=var_kwargs_schema, + populate_by_name=config_wrapper.populate_by_name, + ), + function, + return_schema=return_schema, ) def _unsubstituted_typevar_schema(self, typevar: typing.TypeVar) -> core_schema.CoreSchema: - try: - has_default = typevar.has_default() # pyright: ignore[reportAttributeAccessIssue] - except AttributeError: - # Happens if using `typing.TypeVar` (and not `typing_extensions`) on Python < 3.13 - pass - else: - if has_default: - return self.generate_schema(typevar.__default__) # pyright: ignore[reportAttributeAccessIssue] + assert isinstance(typevar, typing.TypeVar) - if constraints := typevar.__constraints__: - return self._union_schema(typing.Union[constraints]) + bound = typevar.__bound__ + constraints = typevar.__constraints__ + default = getattr(typevar, '__default__', None) - if bound := typevar.__bound__: + if (bound is not None) + (len(constraints) != 0) + (default is not None) > 1: + raise NotImplementedError( + 'Pydantic does not support mixing more than one of TypeVar bounds, constraints and defaults' + ) + + if default is not None: + return self.generate_schema(default) + elif constraints: + return self._union_schema(typing.Union[constraints]) # type: ignore + elif bound: schema = self.generate_schema(bound) - schema['serialization'] = core_schema.simple_ser_schema('any') + schema['serialization'] = core_schema.wrap_serializer_function_ser_schema( + lambda x, h: h(x), schema=core_schema.any_schema() + ) return schema - - return core_schema.any_schema() + else: + return core_schema.any_schema() def _computed_field_schema( self, d: Decorator[ComputedFieldInfo], field_serializers: dict[str, Decorator[FieldSerializerDecoratorInfo]], ) -> core_schema.ComputedField: - if d.info.return_type is not PydanticUndefined: - return_type = d.info.return_type - else: - try: - # Do not pass in globals as the function could be defined in a different module. - # Instead, let `get_callable_return_type` infer the globals to use, but still pass - # in locals that may contain a parent/rebuild namespace: - return_type = _decorators.get_callable_return_type(d.func, localns=self._types_namespace.locals) - except NameError as e: - raise PydanticUndefinedAnnotation.from_name_error(e) from e + try: + return_type = _decorators.get_function_return_type(d.func, d.info.return_type, self._types_namespace) + except NameError as e: + raise PydanticUndefinedAnnotation.from_name_error(e) from e if return_type is PydanticUndefined: raise PydanticUserError( 'Computed field is missing return type annotation or specifying `return_type`' - ' to the `@computed_field` decorator (e.g. `@computed_field(return_type=int | str)`)', + ' to the `@computed_field` decorator (e.g. `@computed_field(return_type=int|str)`)', code='model-field-missing-annotation', ) @@ -2154,22 +1534,51 @@ class GenerateSchema: return_type_schema = self._apply_field_serializers( return_type_schema, filter_field_decorator_info_by_field(field_serializers.values(), d.cls_var_name), + computed_field=True, ) + # Handle alias_generator using similar logic to that from + # pydantic._internal._generate_schema.GenerateSchema._common_field_schema, + # with field_info -> d.info and name -> d.cls_var_name + alias_generator = self._config_wrapper.alias_generator + if alias_generator and (d.info.alias_priority is None or d.info.alias_priority <= 1): + alias = alias_generator(d.cls_var_name) + if not isinstance(alias, str): + raise TypeError(f'alias_generator {alias_generator} must return str, not {alias.__class__}') + d.info.alias = alias + d.info.alias_priority = 1 - pydantic_js_updates, pydantic_js_extra = _extract_json_schema_info_from_field_info(d.info) - core_metadata: dict[str, Any] = {} - update_core_metadata( - core_metadata, - pydantic_js_updates={'readOnly': True, **(pydantic_js_updates if pydantic_js_updates else {})}, - pydantic_js_extra=pydantic_js_extra, - ) + def set_computed_field_metadata(schema: CoreSchemaOrField, handler: GetJsonSchemaHandler) -> JsonSchemaValue: + json_schema = handler(schema) + + json_schema['readOnly'] = True + + title = d.info.title + if title is not None: + json_schema['title'] = title + + description = d.info.description + if description is not None: + json_schema['description'] = description + + examples = d.info.examples + if examples is not None: + json_schema['examples'] = to_jsonable_python(examples) + + json_schema_extra = d.info.json_schema_extra + if json_schema_extra is not None: + add_json_schema_extra(json_schema, json_schema_extra) + + return json_schema + + metadata = build_metadata_dict(js_annotation_functions=[set_computed_field_metadata]) return core_schema.computed_field( - d.cls_var_name, return_schema=return_type_schema, alias=d.info.alias, metadata=core_metadata + d.cls_var_name, return_schema=return_type_schema, alias=d.info.alias, metadata=metadata ) def _annotated_schema(self, annotated_type: Any) -> core_schema.CoreSchema: """Generate schema for an Annotated type, e.g. `Annotated[int, Field(...)]` or `Annotated[int, Gt(0)]`.""" - FieldInfo = import_cached_field_info() + from ..fields import FieldInfo + source_type, *annotations = self._get_args_resolving_forward_refs( annotated_type, required=True, @@ -2182,12 +1591,30 @@ class GenerateSchema: schema = wrap_default(annotation, schema) return schema + def _get_prepare_pydantic_annotations_for_known_type( + self, obj: Any, annotations: tuple[Any, ...] + ) -> tuple[Any, list[Any]] | None: + from ._std_types_schema import PREPARE_METHODS + + # This check for hashability is only necessary for python 3.7 + try: + hash(obj) + except TypeError: + # obj is definitely not a known type if this fails + return None + + for gen in PREPARE_METHODS: + res = gen(obj, annotations, self._config_wrapper.config_dict) + if res is not None: + return res + + return None + def _apply_annotations( self, source_type: Any, annotations: list[Any], transform_inner_schema: Callable[[CoreSchema], CoreSchema] = lambda x: x, - check_unsupported_field_info_attributes: bool = True, ) -> CoreSchema: """Apply arguments from `Annotated` or from `FieldInfo` to a schema. @@ -2196,18 +1623,21 @@ class GenerateSchema: (in other words, `GenerateSchema._annotated_schema` just unpacks `Annotated`, this process it). """ annotations = list(_known_annotated_metadata.expand_grouped_metadata(annotations)) + res = self._get_prepare_pydantic_annotations_for_known_type(source_type, tuple(annotations)) + if res is not None: + source_type, annotations = res pydantic_js_annotation_functions: list[GetJsonSchemaFunction] = [] def inner_handler(obj: Any) -> CoreSchema: - schema = self._generate_schema_from_get_schema_method(obj, source_type) - - if schema is None: - schema = self._generate_schema_inner(obj) - - metadata_js_function = _extract_get_pydantic_json_schema(obj) + from_property = self._generate_schema_from_property(obj, obj) + if from_property is None: + schema = self._generate_schema(obj) + else: + schema = from_property + metadata_js_function = _extract_get_pydantic_json_schema(obj, schema) if metadata_js_function is not None: - metadata_schema = resolve_original_schema(schema, self.defs) + metadata_schema = resolve_original_schema(schema, self.defs.definitions) if metadata_schema is not None: self._add_js_function(metadata_schema, metadata_js_function) return transform_inner_schema(schema) @@ -2218,54 +1648,19 @@ class GenerateSchema: if annotation is None: continue get_inner_schema = self._get_wrapped_inner_schema( - get_inner_schema, - annotation, - pydantic_js_annotation_functions, - check_unsupported_field_info_attributes=check_unsupported_field_info_attributes, + get_inner_schema, annotation, pydantic_js_annotation_functions ) schema = get_inner_schema(source_type) if pydantic_js_annotation_functions: - core_metadata = schema.setdefault('metadata', {}) - update_core_metadata(core_metadata, pydantic_js_annotation_functions=pydantic_js_annotation_functions) + metadata = CoreMetadataHandler(schema).metadata + metadata.setdefault('pydantic_js_annotation_functions', []).extend(pydantic_js_annotation_functions) return _add_custom_serialization_from_json_encoders(self._config_wrapper.json_encoders, source_type, schema) - def _apply_single_annotation( - self, - schema: core_schema.CoreSchema, - metadata: Any, - check_unsupported_field_info_attributes: bool = True, - ) -> core_schema.CoreSchema: - FieldInfo = import_cached_field_info() + def _apply_single_annotation(self, schema: core_schema.CoreSchema, metadata: Any) -> core_schema.CoreSchema: + from ..fields import FieldInfo if isinstance(metadata, FieldInfo): - if ( - check_unsupported_field_info_attributes - # HACK: we don't want to emit the warning for `FieldInfo` subclasses, because FastAPI does weird manipulations - # with its subclasses and their annotations: - and type(metadata) is FieldInfo - ): - for attr, value in (unsupported_attributes := self._get_unsupported_field_info_attributes(metadata)): - warnings.warn( - f'The {attr!r} attribute with value {value!r} was provided to the `Field()` function, ' - f'which has no effect in the context it was used. {attr!r} is field-specific metadata, ' - 'and can only be attached to a model field using `Annotated` metadata or by assignment. ' - 'This may have happened because an `Annotated` type alias using the `type` statement was ' - 'used, or if the `Field()` function was attached to a single member of a union type.', - category=UnsupportedFieldAttributeWarning, - ) - - if ( - metadata.default_factory_takes_validated_data - and self.model_type_stack.get() is None - and 'defaut_factory' not in unsupported_attributes - ): - warnings.warn( - "A 'default_factory' taking validated data as an argument was provided to the `Field()` function, " - 'but no validated data is available in the context it was used.', - category=UnsupportedFieldAttributeWarning, - ) - for field_metadata in metadata.metadata: schema = self._apply_single_annotation(schema, field_metadata) @@ -2282,23 +1677,23 @@ class GenerateSchema: return schema original_schema = schema - ref = schema.get('ref') + ref = schema.get('ref', None) if ref is not None: schema = schema.copy() new_ref = ref + f'_{repr(metadata)}' - if (existing := self.defs.get_schema_from_ref(new_ref)) is not None: - return existing - schema['ref'] = new_ref # pyright: ignore[reportGeneralTypeIssues] + if new_ref in self.defs.definitions: + return self.defs.definitions[new_ref] + schema['ref'] = new_ref # type: ignore elif schema['type'] == 'definition-ref': ref = schema['schema_ref'] - if (referenced_schema := self.defs.get_schema_from_ref(ref)) is not None: - schema = referenced_schema.copy() + if ref in self.defs.definitions: + schema = self.defs.definitions[ref].copy() new_ref = ref + f'_{repr(metadata)}' - if (existing := self.defs.get_schema_from_ref(new_ref)) is not None: - return existing - schema['ref'] = new_ref # pyright: ignore[reportGeneralTypeIssues] + if new_ref in self.defs.definitions: + return self.defs.definitions[new_ref] + schema['ref'] = new_ref # type: ignore - maybe_updated_schema = _known_annotated_metadata.apply_known_metadata(metadata, schema) + maybe_updated_schema = _known_annotated_metadata.apply_known_metadata(metadata, schema.copy()) if maybe_updated_schema is not None: return maybe_updated_schema @@ -2307,63 +1702,42 @@ class GenerateSchema: def _apply_single_annotation_json_schema( self, schema: core_schema.CoreSchema, metadata: Any ) -> core_schema.CoreSchema: - FieldInfo = import_cached_field_info() + from ..fields import FieldInfo if isinstance(metadata, FieldInfo): for field_metadata in metadata.metadata: schema = self._apply_single_annotation_json_schema(schema, field_metadata) + json_schema_update: JsonSchemaValue = {} + if metadata.title: + json_schema_update['title'] = metadata.title + if metadata.description: + json_schema_update['description'] = metadata.description + if metadata.examples: + json_schema_update['examples'] = to_jsonable_python(metadata.examples) - pydantic_js_updates, pydantic_js_extra = _extract_json_schema_info_from_field_info(metadata) - core_metadata = schema.setdefault('metadata', {}) - update_core_metadata( - core_metadata, pydantic_js_updates=pydantic_js_updates, pydantic_js_extra=pydantic_js_extra - ) + json_schema_extra = metadata.json_schema_extra + if json_schema_update or json_schema_extra: + CoreMetadataHandler(schema).metadata.setdefault('pydantic_js_annotation_functions', []).append( + get_json_schema_update_func(json_schema_update, json_schema_extra) + ) return schema - def _get_unsupported_field_info_attributes(self, field_info: FieldInfo) -> list[tuple[str, Any]]: - """Get the list of unsupported `FieldInfo` attributes when not directly used in `Annotated` for field annotations.""" - unused_metadata: list[tuple[str, Any]] = [] - for unused_metadata_name, unset_value in UNSUPPORTED_STANDALONE_FIELDINFO_ATTRIBUTES: - if ( - (unused_metadata_value := getattr(field_info, unused_metadata_name)) is not unset_value - # `default` and `default_factory` can still be used with a type adapter, so only include them - # if used with a model-like class: - and ( - unused_metadata_name not in ('default', 'default_factory') - or self.model_type_stack.get() is not None - ) - # Setting `alias` will set `validation/serialization_alias` as well, so we want to avoid duplicate warnings: - and ( - unused_metadata_name not in ('validation_alias', 'serialization_alias') - or 'alias' not in field_info._attributes_set - ) - ): - unused_metadata.append((unused_metadata_name, unused_metadata_value)) - - return unused_metadata - def _get_wrapped_inner_schema( self, get_inner_schema: GetCoreSchemaHandler, annotation: Any, pydantic_js_annotation_functions: list[GetJsonSchemaFunction], - check_unsupported_field_info_attributes: bool = False, ) -> CallbackGetCoreSchemaHandler: - annotation_get_schema: GetCoreSchemaFunction | None = getattr(annotation, '__get_pydantic_core_schema__', None) + metadata_get_schema: GetCoreSchemaFunction = getattr(annotation, '__get_pydantic_core_schema__', None) or ( + lambda source, handler: handler(source) + ) def new_handler(source: Any) -> core_schema.CoreSchema: - if annotation_get_schema is not None: - schema = annotation_get_schema(source, get_inner_schema) - else: - schema = get_inner_schema(source) - schema = self._apply_single_annotation( - schema, - annotation, - check_unsupported_field_info_attributes=check_unsupported_field_info_attributes, - ) - schema = self._apply_single_annotation_json_schema(schema, annotation) + schema = metadata_get_schema(source, get_inner_schema) + schema = self._apply_single_annotation(schema, annotation) + schema = self._apply_single_annotation_json_schema(schema, annotation) - metadata_js_function = _extract_get_pydantic_json_schema(annotation) + metadata_js_function = _extract_get_pydantic_json_schema(annotation, schema) if metadata_js_function is not None: pydantic_js_annotation_functions.append(metadata_js_function) return schema @@ -2374,6 +1748,7 @@ class GenerateSchema: self, schema: core_schema.CoreSchema, serializers: list[Decorator[FieldSerializerDecoratorInfo]], + computed_field: bool = False, ) -> core_schema.CoreSchema: """Apply field serializers to a schema.""" if serializers: @@ -2382,25 +1757,23 @@ class GenerateSchema: inner_schema = schema['schema'] schema['schema'] = self._apply_field_serializers(inner_schema, serializers) return schema - elif 'ref' in schema: - schema = self.defs.create_definition_reference_schema(schema) + else: + ref = typing.cast('str|None', schema.get('ref', None)) + if ref is not None: + schema = core_schema.definition_reference_schema(ref) # use the last serializer to make it easy to override a serializer set on a parent model serializer = serializers[-1] - is_field_serializer, info_arg = inspect_field_serializer(serializer.func, serializer.info.mode) + is_field_serializer, info_arg = inspect_field_serializer( + serializer.func, serializer.info.mode, computed_field=computed_field + ) - if serializer.info.return_type is not PydanticUndefined: - return_type = serializer.info.return_type - else: - try: - # Do not pass in globals as the function could be defined in a different module. - # Instead, let `get_callable_return_type` infer the globals to use, but still pass - # in locals that may contain a parent/rebuild namespace: - return_type = _decorators.get_callable_return_type( - serializer.func, localns=self._types_namespace.locals - ) - except NameError as e: - raise PydanticUndefinedAnnotation.from_name_error(e) from e + try: + return_type = _decorators.get_function_return_type( + serializer.func, serializer.info.return_type, self._types_namespace + ) + except NameError as e: + raise PydanticUndefinedAnnotation.from_name_error(e) from e if return_type is PydanticUndefined: return_schema = None @@ -2435,19 +1808,12 @@ class GenerateSchema: serializer = list(serializers)[-1] info_arg = inspect_model_serializer(serializer.func, serializer.info.mode) - if serializer.info.return_type is not PydanticUndefined: - return_type = serializer.info.return_type - else: - try: - # Do not pass in globals as the function could be defined in a different module. - # Instead, let `get_callable_return_type` infer the globals to use, but still pass - # in locals that may contain a parent/rebuild namespace: - return_type = _decorators.get_callable_return_type( - serializer.func, localns=self._types_namespace.locals - ) - except NameError as e: - raise PydanticUndefinedAnnotation.from_name_error(e) from e - + try: + return_type = _decorators.get_function_return_type( + serializer.func, serializer.info.return_type, self._types_namespace + ) + except NameError as e: + raise PydanticUndefinedAnnotation.from_name_error(e) from e if return_type is PydanticUndefined: return_schema = None else: @@ -2476,26 +1842,33 @@ class GenerateSchema: _VALIDATOR_F_MATCH: Mapping[ tuple[FieldValidatorModes, Literal['no-info', 'with-info']], - Callable[[Callable[..., Any], core_schema.CoreSchema], core_schema.CoreSchema], + Callable[[Callable[..., Any], core_schema.CoreSchema, str | None], core_schema.CoreSchema], ] = { - ('before', 'no-info'): lambda f, schema: core_schema.no_info_before_validator_function(f, schema), - ('after', 'no-info'): lambda f, schema: core_schema.no_info_after_validator_function(f, schema), - ('plain', 'no-info'): lambda f, _: core_schema.no_info_plain_validator_function(f), - ('wrap', 'no-info'): lambda f, schema: core_schema.no_info_wrap_validator_function(f, schema), - ('before', 'with-info'): lambda f, schema: core_schema.with_info_before_validator_function(f, schema), - ('after', 'with-info'): lambda f, schema: core_schema.with_info_after_validator_function(f, schema), - ('plain', 'with-info'): lambda f, _: core_schema.with_info_plain_validator_function(f), - ('wrap', 'with-info'): lambda f, schema: core_schema.with_info_wrap_validator_function(f, schema), + ('before', 'no-info'): lambda f, schema, _: core_schema.no_info_before_validator_function(f, schema), + ('after', 'no-info'): lambda f, schema, _: core_schema.no_info_after_validator_function(f, schema), + ('plain', 'no-info'): lambda f, _1, _2: core_schema.no_info_plain_validator_function(f), + ('wrap', 'no-info'): lambda f, schema, _: core_schema.no_info_wrap_validator_function(f, schema), + ('before', 'with-info'): lambda f, schema, field_name: core_schema.with_info_before_validator_function( + f, schema, field_name=field_name + ), + ('after', 'with-info'): lambda f, schema, field_name: core_schema.with_info_after_validator_function( + f, schema, field_name=field_name + ), + ('plain', 'with-info'): lambda f, _, field_name: core_schema.with_info_plain_validator_function( + f, field_name=field_name + ), + ('wrap', 'with-info'): lambda f, schema, field_name: core_schema.with_info_wrap_validator_function( + f, schema, field_name=field_name + ), } -# TODO V3: this function is only used for deprecated decorators. It should -# be removed once we drop support for those. def apply_validators( schema: core_schema.CoreSchema, validators: Iterable[Decorator[RootValidatorDecoratorInfo]] | Iterable[Decorator[ValidatorDecoratorInfo]] | Iterable[Decorator[FieldValidatorDecoratorInfo]], + field_name: str | None, ) -> core_schema.CoreSchema: """Apply validators to a schema. @@ -2508,12 +1881,10 @@ def apply_validators( The updated schema. """ for validator in validators: - # Actually, type could be 'field' or 'model', but this is only used for deprecated - # decorators, so let's not worry about it. - info_arg = inspect_validator(validator.func, mode=validator.info.mode, type='field') + info_arg = inspect_validator(validator.func, validator.info.mode) val_type = 'with-info' if info_arg else 'no-info' - schema = _VALIDATOR_F_MATCH[(validator.info.mode, val_type)](validator.func, schema) + schema = _VALIDATOR_F_MATCH[(validator.info.mode, val_type)](validator.func, schema, field_name) return schema @@ -2533,15 +1904,6 @@ def _validators_require_validate_default(validators: Iterable[Decorator[Validato return False -def _convert_to_aliases( - alias: str | AliasChoices | AliasPath | None, -) -> str | list[str | int] | list[list[str | int]] | None: - if isinstance(alias, (AliasChoices, AliasPath)): - return alias.convert_to_aliases() - else: - return alias - - def apply_model_validators( schema: core_schema.CoreSchema, validators: Iterable[Decorator[ModelValidatorDecoratorInfo]], @@ -2567,7 +1929,7 @@ def apply_model_validators( continue if mode == 'outer' and validator.info.mode == 'before': continue - info_arg = inspect_validator(validator.func, mode=validator.info.mode, type='model') + info_arg = inspect_validator(validator.func, validator.info.mode) if validator.info.mode == 'wrap': if info_arg: schema = core_schema.with_info_wrap_validator_function(function=validator.func, schema=schema) @@ -2601,10 +1963,7 @@ def wrap_default(field_info: FieldInfo, schema: core_schema.CoreSchema) -> core_ """ if field_info.default_factory: return core_schema.with_default_schema( - schema, - default_factory=field_info.default_factory, - default_factory_takes_data=takes_validated_data_argument(field_info.default_factory), - validate_default=field_info.validate_default, + schema, default_factory=field_info.default_factory, validate_default=field_info.validate_default ) elif field_info.default is not PydanticUndefined: return core_schema.with_default_schema( @@ -2614,31 +1973,29 @@ def wrap_default(field_info: FieldInfo, schema: core_schema.CoreSchema) -> core_ return schema -def _extract_get_pydantic_json_schema(tp: Any) -> GetJsonSchemaFunction | None: +def _extract_get_pydantic_json_schema(tp: Any, schema: CoreSchema) -> GetJsonSchemaFunction | None: """Extract `__get_pydantic_json_schema__` from a type, handling the deprecated `__modify_schema__`.""" js_modify_function = getattr(tp, '__get_pydantic_json_schema__', None) if hasattr(tp, '__modify_schema__'): - BaseModel = import_cached_base_model() + from pydantic import BaseModel # circular reference has_custom_v2_modify_js_func = ( js_modify_function is not None - and BaseModel.__get_pydantic_json_schema__.__func__ # type: ignore + and BaseModel.__get_pydantic_json_schema__.__func__ not in (js_modify_function, getattr(js_modify_function, '__func__', None)) ) if not has_custom_v2_modify_js_func: - cls_name = getattr(tp, '__name__', None) raise PydanticUserError( - f'The `__modify_schema__` method is not supported in Pydantic v2. ' - f'Use `__get_pydantic_json_schema__` instead{f" in class `{cls_name}`" if cls_name else ""}.', + 'The `__modify_schema__` method is not supported in Pydantic v2. ' + 'Use `__get_pydantic_json_schema__` instead.', code='custom-json-schema', ) - if (origin := get_origin(tp)) is not None: - # Generic aliases proxy attribute access to the origin, *except* dunder attributes, - # such as `__get_pydantic_json_schema__`, hence the explicit check. - return _extract_get_pydantic_json_schema(origin) + # handle GenericAlias' but ignore Annotated which "lies" about its origin (in this case it would be `int`) + if hasattr(tp, '__origin__') and not isinstance(tp, type(Annotated[int, 'placeholder'])): + return _extract_get_pydantic_json_schema(tp.__origin__, schema) if js_modify_function is None: return None @@ -2646,62 +2003,65 @@ def _extract_get_pydantic_json_schema(tp: Any) -> GetJsonSchemaFunction | None: return js_modify_function -def resolve_original_schema(schema: CoreSchema, definitions: _Definitions) -> CoreSchema | None: - if schema['type'] == 'definition-ref': - return definitions.get_schema_from_ref(schema['schema_ref']) - elif schema['type'] == 'definitions': - return schema['schema'] - else: - return schema +def get_json_schema_update_func( + json_schema_update: JsonSchemaValue, json_schema_extra: JsonDict | typing.Callable[[JsonDict], None] | None +) -> GetJsonSchemaFunction: + def json_schema_update_func( + core_schema_or_field: CoreSchemaOrField, handler: GetJsonSchemaHandler + ) -> JsonSchemaValue: + json_schema = {**handler(core_schema_or_field), **json_schema_update} + add_json_schema_extra(json_schema, json_schema_extra) + return json_schema + + return json_schema_update_func -def _inlining_behavior( - def_ref: core_schema.DefinitionReferenceSchema, -) -> Literal['inline', 'keep', 'preserve_metadata']: - """Determine the inlining behavior of the `'definition-ref'` schema. +def add_json_schema_extra( + json_schema: JsonSchemaValue, json_schema_extra: JsonDict | typing.Callable[[JsonDict], None] | None +): + if isinstance(json_schema_extra, dict): + json_schema.update(to_jsonable_python(json_schema_extra)) + elif callable(json_schema_extra): + json_schema_extra(json_schema) - - If no `'serialization'` schema and no metadata is attached, the schema can safely be inlined. - - If it has metadata but only related to the deferred discriminator application, it can be inlined - provided that such metadata is kept. - - Otherwise, the schema should not be inlined. Doing so would remove the `'serialization'` schema or metadata. - """ - if 'serialization' in def_ref: - return 'keep' - metadata = def_ref.get('metadata') - if not metadata: - return 'inline' - if len(metadata) == 1 and 'pydantic_internal_union_discriminator' in metadata: - return 'preserve_metadata' - return 'keep' + +class _CommonField(TypedDict): + schema: core_schema.CoreSchema + validation_alias: str | list[str | int] | list[list[str | int]] | None + serialization_alias: str | None + serialization_exclude: bool | None + frozen: bool | None + metadata: dict[str, Any] + + +def _common_field( + schema: core_schema.CoreSchema, + *, + validation_alias: str | list[str | int] | list[list[str | int]] | None = None, + serialization_alias: str | None = None, + serialization_exclude: bool | None = None, + frozen: bool | None = None, + metadata: Any = None, +) -> _CommonField: + return { + 'schema': schema, + 'validation_alias': validation_alias, + 'serialization_alias': serialization_alias, + 'serialization_exclude': serialization_exclude, + 'frozen': frozen, + 'metadata': metadata, + } class _Definitions: """Keeps track of references and definitions.""" - _recursively_seen: set[str] - """A set of recursively seen references. - - When a referenceable type is encountered, the `get_schema_or_ref` context manager is - entered to compute the reference. If the type references itself by some way (e.g. for - a dataclass a Pydantic model, the class can be referenced as a field annotation), - entering the context manager again will yield a `'definition-ref'` schema that should - short-circuit the normal generation process, as the reference was already in this set. - """ - - _definitions: dict[str, core_schema.CoreSchema] - """A mapping of references to their corresponding schema. - - When a schema for a referenceable type is generated, it is stored in this mapping. If the - same type is encountered again, the reference is yielded by the `get_schema_or_ref` context - manager. - """ - def __init__(self) -> None: - self._recursively_seen = set() - self._definitions = {} + self.seen: set[str] = set() + self.definitions: dict[str, core_schema.CoreSchema] = {} @contextmanager - def get_schema_or_ref(self, tp: Any, /) -> Generator[tuple[str, core_schema.DefinitionReferenceSchema | None]]: + def get_schema_or_ref(self, tp: Any) -> Iterator[tuple[str, None] | tuple[str, CoreSchema]]: """Get a definition for `tp` if one exists. If a definition exists, a tuple of `(ref_string, CoreSchema)` is returned. @@ -2715,119 +2075,31 @@ class _Definitions: At present the following types can be named/recursive: - - Pydantic model - - Pydantic and stdlib dataclasses - - Typed dictionaries - - Named tuples - - `TypeAliasType` instances - - Enums + - BaseModel + - Dataclasses + - TypedDict + - TypeAliasType """ ref = get_type_ref(tp) - # return the reference if we're either (1) in a cycle or (2) it the reference was already encountered: - if ref in self._recursively_seen or ref in self._definitions: + # return the reference if we're either (1) in a cycle or (2) it was already defined + if ref in self.seen or ref in self.definitions: yield (ref, core_schema.definition_reference_schema(ref)) else: - self._recursively_seen.add(ref) + self.seen.add(ref) try: yield (ref, None) finally: - self._recursively_seen.discard(ref) + self.seen.discard(ref) - def get_schema_from_ref(self, ref: str) -> CoreSchema | None: - """Resolve the schema from the given reference.""" - return self._definitions.get(ref) - def create_definition_reference_schema(self, schema: CoreSchema) -> core_schema.DefinitionReferenceSchema: - """Store the schema as a definition and return a `'definition-reference'` schema pointing to it. - - The schema must have a reference attached to it. - """ - ref = schema['ref'] # pyright: ignore - self._definitions[ref] = schema - return core_schema.definition_reference_schema(ref) - - def unpack_definitions(self, schema: core_schema.DefinitionsSchema) -> CoreSchema: - """Store the definitions of the `'definitions'` core schema and return the inner core schema.""" - for def_schema in schema['definitions']: - self._definitions[def_schema['ref']] = def_schema # pyright: ignore +def resolve_original_schema(schema: CoreSchema, definitions: dict[str, CoreSchema]) -> CoreSchema | None: + if schema['type'] == 'definition-ref': + return definitions.get(schema['schema_ref'], None) + elif schema['type'] == 'definitions': return schema['schema'] - - def finalize_schema(self, schema: CoreSchema) -> CoreSchema: - """Finalize the core schema. - - This traverses the core schema and referenced definitions, replaces `'definition-ref'` schemas - by the referenced definition if possible, and applies deferred discriminators. - """ - definitions = self._definitions - try: - gather_result = gather_schemas_for_cleaning( - schema, - definitions=definitions, - ) - except MissingDefinitionError as e: - raise InvalidSchemaError from e - - remaining_defs: dict[str, CoreSchema] = {} - - # Note: this logic doesn't play well when core schemas with deferred discriminator metadata - # and references are encountered. See the `test_deferred_discriminated_union_and_references()` test. - for ref, inlinable_def_ref in gather_result['collected_references'].items(): - if inlinable_def_ref is not None and (inlining_behavior := _inlining_behavior(inlinable_def_ref)) != 'keep': - if inlining_behavior == 'inline': - # `ref` was encountered, and only once: - # - `inlinable_def_ref` is a `'definition-ref'` schema and is guaranteed to be - # the only one. Transform it into the definition it points to. - # - Do not store the definition in the `remaining_defs`. - inlinable_def_ref.clear() # pyright: ignore[reportAttributeAccessIssue] - inlinable_def_ref.update(self._resolve_definition(ref, definitions)) # pyright: ignore - elif inlining_behavior == 'preserve_metadata': - # `ref` was encountered, and only once, but contains discriminator metadata. - # We will do the same thing as if `inlining_behavior` was `'inline'`, but make - # sure to keep the metadata for the deferred discriminator application logic below. - meta = inlinable_def_ref.pop('metadata') - inlinable_def_ref.clear() # pyright: ignore[reportAttributeAccessIssue] - inlinable_def_ref.update(self._resolve_definition(ref, definitions)) # pyright: ignore - inlinable_def_ref['metadata'] = meta - else: - # `ref` was encountered, at least two times (or only once, but with metadata or a serialization schema): - # - Do not inline the `'definition-ref'` schemas (they are not provided in the gather result anyway). - # - Store the the definition in the `remaining_defs` - remaining_defs[ref] = self._resolve_definition(ref, definitions) - - for cs in gather_result['deferred_discriminator_schemas']: - discriminator: str | None = cs['metadata'].pop('pydantic_internal_union_discriminator', None) # pyright: ignore[reportTypedDictNotRequiredAccess] - if discriminator is None: - # This can happen in rare scenarios, when a deferred schema is present multiple times in the - # gather result (e.g. when using the `Sequence` type -- see `test_sequence_discriminated_union()`). - # In this case, a previous loop iteration applied the discriminator and so we can just skip it here. - continue - applied = _discriminated_union.apply_discriminator(cs.copy(), discriminator, remaining_defs) - # Mutate the schema directly to have the discriminator applied - cs.clear() # pyright: ignore[reportAttributeAccessIssue] - cs.update(applied) # pyright: ignore - - if remaining_defs: - schema = core_schema.definitions_schema(schema=schema, definitions=[*remaining_defs.values()]) + else: return schema - def _resolve_definition(self, ref: str, definitions: dict[str, CoreSchema]) -> CoreSchema: - definition = definitions[ref] - if definition['type'] != 'definition-ref': - return definition - - # Some `'definition-ref'` schemas might act as "intermediate" references (e.g. when using - # a PEP 695 type alias (which is referenceable) that references another PEP 695 type alias): - visited: set[str] = set() - while definition['type'] == 'definition-ref' and _inlining_behavior(definition) == 'inline': - schema_ref = definition['schema_ref'] - if schema_ref in visited: - raise PydanticUserError( - f'{ref} contains a circular reference to itself.', code='circular-reference-schema' - ) - visited.add(schema_ref) - definition = definitions[schema_ref] - return {**definition, 'ref': ref} # pyright: ignore[reportReturnType] - class _FieldNameStack: __slots__ = ('_stack',) @@ -2848,20 +2120,85 @@ class _FieldNameStack: return None -class _ModelTypeStack: - __slots__ = ('_stack',) +def generate_pydantic_signature( + init: Callable[..., None], + fields: dict[str, FieldInfo], + config_wrapper: ConfigWrapper, + post_process_parameter: Callable[[Parameter], Parameter] = lambda x: x, +) -> inspect.Signature: + """Generate signature for a pydantic class generated by inheriting from BaseModel or + using the dataclass annotation - def __init__(self) -> None: - self._stack: list[type] = [] + Args: + init: The class init. + fields: The model fields. + config_wrapper: The config wrapper instance. + post_process_parameter: Optional additional processing for parameter - @contextmanager - def push(self, type_obj: type) -> Iterator[None]: - self._stack.append(type_obj) - yield - self._stack.pop() + Returns: + The dataclass/BaseModel subclass signature. + """ + from itertools import islice - def get(self) -> type | None: - if self._stack: - return self._stack[-1] + present_params = signature(init).parameters.values() + merged_params: dict[str, Parameter] = {} + var_kw = None + use_var_kw = False + + for param in islice(present_params, 1, None): # skip self arg + # inspect does "clever" things to show annotations as strings because we have + # `from __future__ import annotations` in main, we don't want that + if param.annotation == 'Any': + param = param.replace(annotation=Any) + if param.kind is param.VAR_KEYWORD: + var_kw = param + continue + merged_params[param.name] = post_process_parameter(param) + + if var_kw: # if custom init has no var_kw, fields which are not declared in it cannot be passed through + allow_names = config_wrapper.populate_by_name + for field_name, field in fields.items(): + # when alias is a str it should be used for signature generation + if isinstance(field.alias, str): + param_name = field.alias + else: + param_name = field_name + + if field_name in merged_params or param_name in merged_params: + continue + + if not is_valid_identifier(param_name): + if allow_names and is_valid_identifier(field_name): + param_name = field_name + else: + use_var_kw = True + continue + + kwargs = {} if field.is_required() else {'default': field.get_default(call_default_factory=False)} + merged_params[param_name] = post_process_parameter( + Parameter(param_name, Parameter.KEYWORD_ONLY, annotation=field.rebuild_annotation(), **kwargs) + ) + + if config_wrapper.extra == 'allow': + use_var_kw = True + + if var_kw and use_var_kw: + # Make sure the parameter for extra kwargs + # does not have the same name as a field + default_model_signature = [ + ('__pydantic_self__', Parameter.POSITIONAL_OR_KEYWORD), + ('data', Parameter.VAR_KEYWORD), + ] + if [(p.name, p.kind) for p in present_params] == default_model_signature: + # if this is the standard model signature, use extra_data as the extra args name + var_kw_name = 'extra_data' else: - return None + # else start from var_kw + var_kw_name = var_kw.name + + # generate a name that's definitely unique + while var_kw_name in fields: + var_kw_name += '_' + merged_params[var_kw_name] = post_process_parameter(var_kw.replace(name=var_kw_name)) + + return inspect.Signature(parameters=list(merged_params.values()), return_annotation=None) diff --git a/Backend/venv/lib/python3.12/site-packages/pydantic/_internal/_generics.py b/Backend/venv/lib/python3.12/site-packages/pydantic/_internal/_generics.py index f9f88a67..e93be9f4 100644 --- a/Backend/venv/lib/python3.12/site-packages/pydantic/_internal/_generics.py +++ b/Backend/venv/lib/python3.12/site-packages/pydantic/_internal/_generics.py @@ -1,32 +1,29 @@ from __future__ import annotations -import operator import sys import types import typing from collections import ChainMap -from collections.abc import Iterator, Mapping from contextlib import contextmanager from contextvars import ContextVar -from functools import reduce -from itertools import zip_longest from types import prepare_class -from typing import TYPE_CHECKING, Annotated, Any, TypedDict, TypeVar, cast +from typing import TYPE_CHECKING, Any, Iterator, List, Mapping, MutableMapping, Tuple, TypeVar from weakref import WeakValueDictionary import typing_extensions -from typing_inspection import typing_objects -from typing_inspection.introspection import is_union_origin -from . import _typing_extra from ._core_utils import get_type_ref from ._forward_ref import PydanticRecursiveRef +from ._typing_extra import TypeVarType, typing_base from ._utils import all_identical, is_model_class +if sys.version_info >= (3, 10): + from typing import _UnionGenericAlias # type: ignore[attr-defined] + if TYPE_CHECKING: from ..main import BaseModel -GenericTypesCacheKey = tuple[Any, Any, tuple[Any, ...]] +GenericTypesCacheKey = Tuple[Any, Any, Tuple[Any, ...]] # Note: We want to remove LimitedDict, but to do this, we'd need to improve the handling of generics caching. # Right now, to handle recursive generics, we some types must remain cached for brief periods without references. @@ -37,25 +34,43 @@ GenericTypesCacheKey = tuple[Any, Any, tuple[Any, ...]] KT = TypeVar('KT') VT = TypeVar('VT') _LIMITED_DICT_SIZE = 100 +if TYPE_CHECKING: + class LimitedDict(dict, MutableMapping[KT, VT]): + def __init__(self, size_limit: int = _LIMITED_DICT_SIZE): + ... -class LimitedDict(dict[KT, VT]): - def __init__(self, size_limit: int = _LIMITED_DICT_SIZE) -> None: - self.size_limit = size_limit - super().__init__() +else: - def __setitem__(self, key: KT, value: VT, /) -> None: - super().__setitem__(key, value) - if len(self) > self.size_limit: - excess = len(self) - self.size_limit + self.size_limit // 10 - to_remove = list(self.keys())[:excess] - for k in to_remove: - del self[k] + class LimitedDict(dict): + """Limit the size/length of a dict used for caching to avoid unlimited increase in memory usage. + + Since the dict is ordered, and we always remove elements from the beginning, this is effectively a FIFO cache. + """ + + def __init__(self, size_limit: int = _LIMITED_DICT_SIZE): + self.size_limit = size_limit + super().__init__() + + def __setitem__(self, __key: Any, __value: Any) -> None: + super().__setitem__(__key, __value) + if len(self) > self.size_limit: + excess = len(self) - self.size_limit + self.size_limit // 10 + to_remove = list(self.keys())[:excess] + for key in to_remove: + del self[key] + + def __class_getitem__(cls, *args: Any) -> Any: + # to avoid errors with 3.7 + return cls # weak dictionaries allow the dynamically created parametrized versions of generic models to get collected # once they are no longer referenced by the caller. -GenericTypesCache = WeakValueDictionary[GenericTypesCacheKey, 'type[BaseModel]'] +if sys.version_info >= (3, 9): # Typing for weak dictionaries available at 3.9 + GenericTypesCache = WeakValueDictionary[GenericTypesCacheKey, 'type[BaseModel]'] +else: + GenericTypesCache = WeakValueDictionary if TYPE_CHECKING: @@ -93,13 +108,13 @@ else: # and discover later on that we need to re-add all this infrastructure... # _GENERIC_TYPES_CACHE = DeepChainMap(GenericTypesCache(), LimitedDict()) -_GENERIC_TYPES_CACHE: ContextVar[GenericTypesCache | None] = ContextVar('_GENERIC_TYPES_CACHE', default=None) +_GENERIC_TYPES_CACHE = GenericTypesCache() -class PydanticGenericMetadata(TypedDict): +class PydanticGenericMetadata(typing_extensions.TypedDict): origin: type[BaseModel] | None # analogous to typing._GenericAlias.__origin__ args: tuple[Any, ...] # analogous to typing._GenericAlias.__args__ - parameters: tuple[TypeVar, ...] # analogous to typing.Generic.__parameters__ + parameters: tuple[type[Any], ...] # analogous to typing.Generic.__parameters__ def create_generic_submodel( @@ -156,7 +171,7 @@ def _get_caller_frame_info(depth: int = 2) -> tuple[str | None, bool]: depth: The depth to get the frame. Returns: - A tuple contains `module_name` and `called_globally`. + A tuple contains `module_nam` and `called_globally`. Raises: RuntimeError: If the function is not called inside a function. @@ -174,7 +189,7 @@ def _get_caller_frame_info(depth: int = 2) -> tuple[str | None, bool]: DictValues: type[Any] = {}.values().__class__ -def iter_contained_typevars(v: Any) -> Iterator[TypeVar]: +def iter_contained_typevars(v: Any) -> Iterator[TypeVarType]: """Recursively iterate through all subtypes and type args of `v` and yield any typevars that are found. This is inspired as an alternative to directly accessing the `__parameters__` attribute of a GenericAlias, @@ -207,7 +222,7 @@ def get_origin(v: Any) -> Any: return typing_extensions.get_origin(v) -def get_standard_typevars_map(cls: Any) -> dict[TypeVar, Any] | None: +def get_standard_typevars_map(cls: type[Any]) -> dict[TypeVarType, Any] | None: """Package a generic type's typevars and parametrization (if present) into a dictionary compatible with the `replace_types` function. Specifically, this works with standard typing generics and typing._GenericAlias. """ @@ -220,11 +235,11 @@ def get_standard_typevars_map(cls: Any) -> dict[TypeVar, Any] | None: # In this case, we know that cls is a _GenericAlias, and origin is the generic type # So it is safe to access cls.__args__ and origin.__parameters__ args: tuple[Any, ...] = cls.__args__ # type: ignore - parameters: tuple[TypeVar, ...] = origin.__parameters__ + parameters: tuple[TypeVarType, ...] = origin.__parameters__ return dict(zip(parameters, args)) -def get_model_typevars_map(cls: type[BaseModel]) -> dict[TypeVar, Any]: +def get_model_typevars_map(cls: type[BaseModel]) -> dict[TypeVarType, Any] | None: """Package a generic BaseModel's typevars and concrete parametrization (if present) into a dictionary compatible with the `replace_types` function. @@ -236,13 +251,10 @@ def get_model_typevars_map(cls: type[BaseModel]) -> dict[TypeVar, Any]: generic_metadata = cls.__pydantic_generic_metadata__ origin = generic_metadata['origin'] args = generic_metadata['args'] - if not args: - # No need to go into `iter_contained_typevars`: - return {} return dict(zip(iter_contained_typevars(origin), args)) -def replace_types(type_: Any, type_map: Mapping[TypeVar, Any] | None) -> Any: +def replace_types(type_: Any, type_map: Mapping[Any, Any] | None) -> Any: """Return type with all occurrences of `type_map` keys recursively replaced with their values. Args: @@ -254,13 +266,13 @@ def replace_types(type_: Any, type_map: Mapping[TypeVar, Any] | None) -> Any: `typevar_map` keys recursively replaced. Example: - ```python - from typing import Union + ```py + from typing import List, Tuple, Union from pydantic._internal._generics import replace_types - replace_types(tuple[str, Union[list[str], float]], {str: int}) - #> tuple[int, Union[list[int], float]] + replace_types(Tuple[str, Union[List[str], float]], {str: int}) + #> Tuple[int, Union[List[int], float]] ``` """ if not type_map: @@ -269,25 +281,25 @@ def replace_types(type_: Any, type_map: Mapping[TypeVar, Any] | None) -> Any: type_args = get_args(type_) origin_type = get_origin(type_) - if typing_objects.is_annotated(origin_type): + if origin_type is typing_extensions.Annotated: annotated_type, *annotations = type_args - annotated_type = replace_types(annotated_type, type_map) - # TODO remove parentheses when we drop support for Python 3.10: - return Annotated[(annotated_type, *annotations)] + annotated = replace_types(annotated_type, type_map) + for annotation in annotations: + annotated = typing_extensions.Annotated[annotated, annotation] + return annotated - # Having type args is a good indicator that this is a typing special form - # instance or a generic alias of some sort. + # Having type args is a good indicator that this is a typing module + # class instantiation or a generic alias of some sort. if type_args: resolved_type_args = tuple(replace_types(arg, type_map) for arg in type_args) if all_identical(type_args, resolved_type_args): # If all arguments are the same, there is no need to modify the # type or create a new object at all return type_ - if ( origin_type is not None - and isinstance(type_, _typing_extra.typing_base) - and not isinstance(origin_type, _typing_extra.typing_base) + and isinstance(type_, typing_base) + and not isinstance(origin_type, typing_base) and getattr(type_, '_name', None) is not None ): # In python < 3.9 generic aliases don't exist so any of these like `list`, @@ -295,22 +307,10 @@ def replace_types(type_: Any, type_map: Mapping[TypeVar, Any] | None) -> Any: # See: https://www.python.org/dev/peps/pep-0585 origin_type = getattr(typing, type_._name) assert origin_type is not None - - if is_union_origin(origin_type): - if any(typing_objects.is_any(arg) for arg in resolved_type_args): - # `Any | T` ~ `Any`: - resolved_type_args = (Any,) - # `Never | T` ~ `T`: - resolved_type_args = tuple( - arg - for arg in resolved_type_args - if not (typing_objects.is_noreturn(arg) or typing_objects.is_never(arg)) - ) - # PEP-604 syntax (Ex.: list | str) is represented with a types.UnionType object that does not have __getitem__. # We also cannot use isinstance() since we have to compare types. if sys.version_info >= (3, 10) and origin_type is types.UnionType: - return reduce(operator.or_, resolved_type_args) + return _UnionGenericAlias(origin_type, resolved_type_args) # NotRequired[T] and Required[T] don't support tuple type resolved_type_args, hence the condition below return origin_type[resolved_type_args[0] if len(resolved_type_args) == 1 else resolved_type_args] @@ -328,8 +328,8 @@ def replace_types(type_: Any, type_map: Mapping[TypeVar, Any] | None) -> Any: # Handle special case for typehints that can have lists as arguments. # `typing.Callable[[int, str], int]` is an example for this. - if isinstance(type_, list): - resolved_list = [replace_types(element, type_map) for element in type_] + if isinstance(type_, (List, list)): + resolved_list = list(replace_types(element, type_map) for element in type_) if all_identical(type_, resolved_list): return type_ return resolved_list @@ -339,57 +339,49 @@ def replace_types(type_: Any, type_map: Mapping[TypeVar, Any] | None) -> Any: return type_map.get(type_, type_) -def map_generic_model_arguments(cls: type[BaseModel], args: tuple[Any, ...]) -> dict[TypeVar, Any]: - """Return a mapping between the parameters of a generic model and the provided arguments during parameterization. +def has_instance_in_type(type_: Any, isinstance_target: Any) -> bool: + """Checks if the type, or any of its arbitrary nested args, satisfy + `isinstance(, isinstance_target)`. + """ + if isinstance(type_, isinstance_target): + return True + + type_args = get_args(type_) + origin_type = get_origin(type_) + + if origin_type is typing_extensions.Annotated: + annotated_type, *annotations = type_args + return has_instance_in_type(annotated_type, isinstance_target) + + # Having type args is a good indicator that this is a typing module + # class instantiation or a generic alias of some sort. + if any(has_instance_in_type(a, isinstance_target) for a in type_args): + return True + + # Handle special case for typehints that can have lists as arguments. + # `typing.Callable[[int, str], int]` is an example for this. + if isinstance(type_, (List, list)) and not isinstance(type_, typing_extensions.ParamSpec): + if any(has_instance_in_type(element, isinstance_target) for element in type_): + return True + + return False + + +def check_parameters_count(cls: type[BaseModel], parameters: tuple[Any, ...]) -> None: + """Check the generic model parameters count is equal. + + Args: + cls: The generic model. + parameters: A tuple of passed parameters to the generic model. Raises: - TypeError: If the number of arguments does not match the parameters (i.e. if providing too few or too many arguments). - - Example: - ```python {test="skip" lint="skip"} - class Model[T, U, V = int](BaseModel): ... - - map_generic_model_arguments(Model, (str, bytes)) - #> {T: str, U: bytes, V: int} - - map_generic_model_arguments(Model, (str,)) - #> TypeError: Too few arguments for ; actual 1, expected at least 2 - - map_generic_model_arguments(Model, (str, bytes, int, complex)) - #> TypeError: Too many arguments for ; actual 4, expected 3 - ``` - - Note: - This function is analogous to the private `typing._check_generic_specialization` function. + TypeError: If the passed parameters count is not equal to generic model parameters count. """ - parameters = cls.__pydantic_generic_metadata__['parameters'] - expected_len = len(parameters) - typevars_map: dict[TypeVar, Any] = {} - - _missing = object() - for parameter, argument in zip_longest(parameters, args, fillvalue=_missing): - if parameter is _missing: - raise TypeError(f'Too many arguments for {cls}; actual {len(args)}, expected {expected_len}') - - if argument is _missing: - param = cast(TypeVar, parameter) - try: - has_default = param.has_default() # pyright: ignore[reportAttributeAccessIssue] - except AttributeError: - # Happens if using `typing.TypeVar` (and not `typing_extensions`) on Python < 3.13. - has_default = False - if has_default: - # The default might refer to other type parameters. For an example, see: - # https://typing.python.org/en/latest/spec/generics.html#type-parameters-as-parameters-to-generics - typevars_map[param] = replace_types(param.__default__, typevars_map) # pyright: ignore[reportAttributeAccessIssue] - else: - expected_len -= sum(hasattr(p, 'has_default') and p.has_default() for p in parameters) # pyright: ignore[reportAttributeAccessIssue] - raise TypeError(f'Too few arguments for {cls}; actual {len(args)}, expected at least {expected_len}') - else: - param = cast(TypeVar, parameter) - typevars_map[param] = argument - - return typevars_map + actual = len(parameters) + expected = len(cls.__pydantic_generic_metadata__['parameters']) + if actual != expected: + description = 'many' if actual > expected else 'few' + raise TypeError(f'Too {description} parameters for {cls}; actual {actual}, expected {expected}') _generic_recursion_cache: ContextVar[set[str] | None] = ContextVar('_generic_recursion_cache', default=None) @@ -420,8 +412,7 @@ def generic_recursion_self_type( yield self_type else: previously_seen_type_refs.add(type_ref) - yield - previously_seen_type_refs.remove(type_ref) + yield None finally: if token: _generic_recursion_cache.reset(token) @@ -452,24 +443,14 @@ def get_cached_generic_type_early(parent: type[BaseModel], typevar_values: Any) during validation, I think it is worthwhile to ensure that types that are functionally equivalent are actually equal. """ - generic_types_cache = _GENERIC_TYPES_CACHE.get() - if generic_types_cache is None: - generic_types_cache = GenericTypesCache() - _GENERIC_TYPES_CACHE.set(generic_types_cache) - return generic_types_cache.get(_early_cache_key(parent, typevar_values)) + return _GENERIC_TYPES_CACHE.get(_early_cache_key(parent, typevar_values)) def get_cached_generic_type_late( parent: type[BaseModel], typevar_values: Any, origin: type[BaseModel], args: tuple[Any, ...] ) -> type[BaseModel] | None: """See the docstring of `get_cached_generic_type_early` for more information about the two-stage cache lookup.""" - generic_types_cache = _GENERIC_TYPES_CACHE.get() - if ( - generic_types_cache is None - ): # pragma: no cover (early cache is guaranteed to run first and initialize the cache) - generic_types_cache = GenericTypesCache() - _GENERIC_TYPES_CACHE.set(generic_types_cache) - cached = generic_types_cache.get(_late_cache_key(origin, args, typevar_values)) + cached = _GENERIC_TYPES_CACHE.get(_late_cache_key(origin, args, typevar_values)) if cached is not None: set_cached_generic_type(parent, typevar_values, cached, origin, args) return cached @@ -485,17 +466,11 @@ def set_cached_generic_type( """See the docstring of `get_cached_generic_type_early` for more information about why items are cached with two different keys. """ - generic_types_cache = _GENERIC_TYPES_CACHE.get() - if ( - generic_types_cache is None - ): # pragma: no cover (cache lookup is guaranteed to run first and initialize the cache) - generic_types_cache = GenericTypesCache() - _GENERIC_TYPES_CACHE.set(generic_types_cache) - generic_types_cache[_early_cache_key(parent, typevar_values)] = type_ + _GENERIC_TYPES_CACHE[_early_cache_key(parent, typevar_values)] = type_ if len(typevar_values) == 1: - generic_types_cache[_early_cache_key(parent, typevar_values[0])] = type_ + _GENERIC_TYPES_CACHE[_early_cache_key(parent, typevar_values[0])] = type_ if origin and args: - generic_types_cache[_late_cache_key(origin, args, typevar_values)] = type_ + _GENERIC_TYPES_CACHE[_late_cache_key(origin, args, typevar_values)] = type_ def _union_orderings_key(typevar_values: Any) -> Any: @@ -512,8 +487,11 @@ def _union_orderings_key(typevar_values: Any) -> Any: (See https://github.com/python/cpython/issues/86483 for reference.) """ if isinstance(typevar_values, tuple): - return tuple(_union_orderings_key(value) for value in typevar_values) - elif typing_objects.is_union(typing_extensions.get_origin(typevar_values)): + args_data = [] + for value in typevar_values: + args_data.append(_union_orderings_key(value)) + return tuple(args_data) + elif typing_extensions.get_origin(typevar_values) is typing.Union: return get_args(typevar_values) else: return () diff --git a/Backend/venv/lib/python3.12/site-packages/pydantic/_internal/_git.py b/Backend/venv/lib/python3.12/site-packages/pydantic/_internal/_git.py deleted file mode 100644 index 96dcda28..00000000 --- a/Backend/venv/lib/python3.12/site-packages/pydantic/_internal/_git.py +++ /dev/null @@ -1,27 +0,0 @@ -"""Git utilities, adopted from mypy's git utilities (https://github.com/python/mypy/blob/master/mypy/git.py).""" - -from __future__ import annotations - -import subprocess -from pathlib import Path - - -def is_git_repo(dir: Path) -> bool: - """Is the given directory version-controlled with git?""" - return dir.joinpath('.git').exists() - - -def have_git() -> bool: # pragma: no cover - """Can we run the git executable?""" - try: - subprocess.check_output(['git', '--help']) - return True - except subprocess.CalledProcessError: - return False - except OSError: - return False - - -def git_revision(dir: Path) -> str: - """Get the SHA-1 of the HEAD of a git repository.""" - return subprocess.check_output(['git', 'rev-parse', '--short', 'HEAD'], cwd=dir).decode('utf-8').strip() diff --git a/Backend/venv/lib/python3.12/site-packages/pydantic/_internal/_import_utils.py b/Backend/venv/lib/python3.12/site-packages/pydantic/_internal/_import_utils.py deleted file mode 100644 index 638102f7..00000000 --- a/Backend/venv/lib/python3.12/site-packages/pydantic/_internal/_import_utils.py +++ /dev/null @@ -1,20 +0,0 @@ -from functools import cache -from typing import TYPE_CHECKING - -if TYPE_CHECKING: - from pydantic import BaseModel - from pydantic.fields import FieldInfo - - -@cache -def import_cached_base_model() -> type['BaseModel']: - from pydantic import BaseModel - - return BaseModel - - -@cache -def import_cached_field_info() -> type['FieldInfo']: - from pydantic.fields import FieldInfo - - return FieldInfo diff --git a/Backend/venv/lib/python3.12/site-packages/pydantic/_internal/_internal_dataclass.py b/Backend/venv/lib/python3.12/site-packages/pydantic/_internal/_internal_dataclass.py index 33e152cc..317a3d9c 100644 --- a/Backend/venv/lib/python3.12/site-packages/pydantic/_internal/_internal_dataclass.py +++ b/Backend/venv/lib/python3.12/site-packages/pydantic/_internal/_internal_dataclass.py @@ -1,4 +1,7 @@ import sys +from typing import Any, Dict + +dataclass_kwargs: Dict[str, Any] # `slots` is available on Python >= 3.10 if sys.version_info >= (3, 10): diff --git a/Backend/venv/lib/python3.12/site-packages/pydantic/_internal/_known_annotated_metadata.py b/Backend/venv/lib/python3.12/site-packages/pydantic/_internal/_known_annotated_metadata.py index 7d61f4ab..77caf705 100644 --- a/Backend/venv/lib/python3.12/site-packages/pydantic/_internal/_known_annotated_metadata.py +++ b/Backend/venv/lib/python3.12/site-packages/pydantic/_internal/_known_annotated_metadata.py @@ -1,48 +1,35 @@ from __future__ import annotations from collections import defaultdict -from collections.abc import Iterable from copy import copy -from functools import lru_cache, partial -from typing import TYPE_CHECKING, Any +from functools import partial +from typing import TYPE_CHECKING, Any, Callable, Iterable -from pydantic_core import CoreSchema, PydanticCustomError, ValidationError, to_jsonable_python +from pydantic_core import CoreSchema, PydanticCustomError, to_jsonable_python from pydantic_core import core_schema as cs from ._fields import PydanticMetadata -from ._import_utils import import_cached_field_info if TYPE_CHECKING: - pass + from ..annotated_handlers import GetJsonSchemaHandler + STRICT = {'strict'} -FAIL_FAST = {'fail_fast'} -LENGTH_CONSTRAINTS = {'min_length', 'max_length'} +SEQUENCE_CONSTRAINTS = {'min_length', 'max_length'} INEQUALITY = {'le', 'ge', 'lt', 'gt'} -NUMERIC_CONSTRAINTS = {'multiple_of', *INEQUALITY} -ALLOW_INF_NAN = {'allow_inf_nan'} +NUMERIC_CONSTRAINTS = {'multiple_of', 'allow_inf_nan', *INEQUALITY} -STR_CONSTRAINTS = { - *LENGTH_CONSTRAINTS, - *STRICT, - 'strip_whitespace', - 'to_lower', - 'to_upper', - 'pattern', - 'coerce_numbers_to_str', -} -BYTES_CONSTRAINTS = {*LENGTH_CONSTRAINTS, *STRICT} +STR_CONSTRAINTS = {*SEQUENCE_CONSTRAINTS, *STRICT, 'strip_whitespace', 'to_lower', 'to_upper', 'pattern'} +BYTES_CONSTRAINTS = {*SEQUENCE_CONSTRAINTS, *STRICT} -LIST_CONSTRAINTS = {*LENGTH_CONSTRAINTS, *STRICT, *FAIL_FAST} -TUPLE_CONSTRAINTS = {*LENGTH_CONSTRAINTS, *STRICT, *FAIL_FAST} -SET_CONSTRAINTS = {*LENGTH_CONSTRAINTS, *STRICT, *FAIL_FAST} -DICT_CONSTRAINTS = {*LENGTH_CONSTRAINTS, *STRICT} -GENERATOR_CONSTRAINTS = {*LENGTH_CONSTRAINTS, *STRICT} -SEQUENCE_CONSTRAINTS = {*LENGTH_CONSTRAINTS, *FAIL_FAST} +LIST_CONSTRAINTS = {*SEQUENCE_CONSTRAINTS, *STRICT} +TUPLE_CONSTRAINTS = {*SEQUENCE_CONSTRAINTS, *STRICT} +SET_CONSTRAINTS = {*SEQUENCE_CONSTRAINTS, *STRICT} +DICT_CONSTRAINTS = {*SEQUENCE_CONSTRAINTS, *STRICT} +GENERATOR_CONSTRAINTS = {*SEQUENCE_CONSTRAINTS, *STRICT} -FLOAT_CONSTRAINTS = {*NUMERIC_CONSTRAINTS, *ALLOW_INF_NAN, *STRICT} -DECIMAL_CONSTRAINTS = {'max_digits', 'decimal_places', *FLOAT_CONSTRAINTS} -INT_CONSTRAINTS = {*NUMERIC_CONSTRAINTS, *ALLOW_INF_NAN, *STRICT} +FLOAT_CONSTRAINTS = {*NUMERIC_CONSTRAINTS, *STRICT} +INT_CONSTRAINTS = {*NUMERIC_CONSTRAINTS, *STRICT} BOOL_CONSTRAINTS = STRICT UUID_CONSTRAINTS = STRICT @@ -50,8 +37,6 @@ DATE_TIME_CONSTRAINTS = {*NUMERIC_CONSTRAINTS, *STRICT} TIMEDELTA_CONSTRAINTS = {*NUMERIC_CONSTRAINTS, *STRICT} TIME_CONSTRAINTS = {*NUMERIC_CONSTRAINTS, *STRICT} LAX_OR_STRICT_CONSTRAINTS = STRICT -ENUM_CONSTRAINTS = STRICT -COMPLEX_CONSTRAINTS = STRICT UNION_CONSTRAINTS = {'union_mode'} URL_CONSTRAINTS = { @@ -68,33 +53,58 @@ SEQUENCE_SCHEMA_TYPES = ('list', 'tuple', 'set', 'frozenset', 'generator', *TEXT NUMERIC_SCHEMA_TYPES = ('float', 'int', 'date', 'time', 'timedelta', 'datetime') CONSTRAINTS_TO_ALLOWED_SCHEMAS: dict[str, set[str]] = defaultdict(set) +for constraint in STR_CONSTRAINTS: + CONSTRAINTS_TO_ALLOWED_SCHEMAS[constraint].update(TEXT_SCHEMA_TYPES) +for constraint in BYTES_CONSTRAINTS: + CONSTRAINTS_TO_ALLOWED_SCHEMAS[constraint].update(('bytes',)) +for constraint in LIST_CONSTRAINTS: + CONSTRAINTS_TO_ALLOWED_SCHEMAS[constraint].update(('list',)) +for constraint in TUPLE_CONSTRAINTS: + CONSTRAINTS_TO_ALLOWED_SCHEMAS[constraint].update(('tuple',)) +for constraint in SET_CONSTRAINTS: + CONSTRAINTS_TO_ALLOWED_SCHEMAS[constraint].update(('set', 'frozenset')) +for constraint in DICT_CONSTRAINTS: + CONSTRAINTS_TO_ALLOWED_SCHEMAS[constraint].update(('dict',)) +for constraint in GENERATOR_CONSTRAINTS: + CONSTRAINTS_TO_ALLOWED_SCHEMAS[constraint].update(('generator',)) +for constraint in FLOAT_CONSTRAINTS: + CONSTRAINTS_TO_ALLOWED_SCHEMAS[constraint].update(('float',)) +for constraint in INT_CONSTRAINTS: + CONSTRAINTS_TO_ALLOWED_SCHEMAS[constraint].update(('int',)) +for constraint in DATE_TIME_CONSTRAINTS: + CONSTRAINTS_TO_ALLOWED_SCHEMAS[constraint].update(('date', 'time', 'datetime')) +for constraint in TIMEDELTA_CONSTRAINTS: + CONSTRAINTS_TO_ALLOWED_SCHEMAS[constraint].update(('timedelta',)) +for constraint in TIME_CONSTRAINTS: + CONSTRAINTS_TO_ALLOWED_SCHEMAS[constraint].update(('time',)) +for schema_type in (*TEXT_SCHEMA_TYPES, *SEQUENCE_SCHEMA_TYPES, *NUMERIC_SCHEMA_TYPES, 'typed-dict', 'model'): + CONSTRAINTS_TO_ALLOWED_SCHEMAS['strict'].add(schema_type) +for constraint in UNION_CONSTRAINTS: + CONSTRAINTS_TO_ALLOWED_SCHEMAS[constraint].update(('union',)) +for constraint in URL_CONSTRAINTS: + CONSTRAINTS_TO_ALLOWED_SCHEMAS[constraint].update(('url', 'multi-host-url')) +for constraint in BOOL_CONSTRAINTS: + CONSTRAINTS_TO_ALLOWED_SCHEMAS[constraint].update(('bool',)) +for constraint in UUID_CONSTRAINTS: + CONSTRAINTS_TO_ALLOWED_SCHEMAS[constraint].update(('uuid',)) +for constraint in LAX_OR_STRICT_CONSTRAINTS: + CONSTRAINTS_TO_ALLOWED_SCHEMAS[constraint].update(('lax-or-strict',)) -constraint_schema_pairings: list[tuple[set[str], tuple[str, ...]]] = [ - (STR_CONSTRAINTS, TEXT_SCHEMA_TYPES), - (BYTES_CONSTRAINTS, ('bytes',)), - (LIST_CONSTRAINTS, ('list',)), - (TUPLE_CONSTRAINTS, ('tuple',)), - (SET_CONSTRAINTS, ('set', 'frozenset')), - (DICT_CONSTRAINTS, ('dict',)), - (GENERATOR_CONSTRAINTS, ('generator',)), - (FLOAT_CONSTRAINTS, ('float',)), - (INT_CONSTRAINTS, ('int',)), - (DATE_TIME_CONSTRAINTS, ('date', 'time', 'datetime', 'timedelta')), - # TODO: this is a bit redundant, we could probably avoid some of these - (STRICT, (*TEXT_SCHEMA_TYPES, *SEQUENCE_SCHEMA_TYPES, *NUMERIC_SCHEMA_TYPES, 'typed-dict', 'model')), - (UNION_CONSTRAINTS, ('union',)), - (URL_CONSTRAINTS, ('url', 'multi-host-url')), - (BOOL_CONSTRAINTS, ('bool',)), - (UUID_CONSTRAINTS, ('uuid',)), - (LAX_OR_STRICT_CONSTRAINTS, ('lax-or-strict',)), - (ENUM_CONSTRAINTS, ('enum',)), - (DECIMAL_CONSTRAINTS, ('decimal',)), - (COMPLEX_CONSTRAINTS, ('complex',)), -] -for constraints, schemas in constraint_schema_pairings: - for c in constraints: - CONSTRAINTS_TO_ALLOWED_SCHEMAS[c].update(schemas) +def add_js_update_schema(s: cs.CoreSchema, f: Callable[[], dict[str, Any]]) -> None: + def update_js_schema(s: cs.CoreSchema, handler: GetJsonSchemaHandler) -> dict[str, Any]: + js_schema = handler(s) + js_schema.update(f()) + return js_schema + + if 'metadata' in s: + metadata = s['metadata'] + if 'pydantic_js_functions' in s: + metadata['pydantic_js_functions'].append(update_js_schema) + else: + metadata['pydantic_js_functions'] = [update_js_schema] + else: + s['metadata'] = {'pydantic_js_functions': [update_js_schema]} def as_jsonable_value(v: Any) -> Any: @@ -113,7 +123,7 @@ def expand_grouped_metadata(annotations: Iterable[Any]) -> Iterable[Any]: An iterable of expanded annotations. Example: - ```python + ```py from annotated_types import Ge, Len from pydantic._internal._known_annotated_metadata import expand_grouped_metadata @@ -124,7 +134,7 @@ def expand_grouped_metadata(annotations: Iterable[Any]) -> Iterable[Any]: """ import annotated_types as at - FieldInfo = import_cached_field_info() + from pydantic.fields import FieldInfo # circular import for annotation in annotations: if isinstance(annotation, at.GroupedMetadata): @@ -143,28 +153,6 @@ def expand_grouped_metadata(annotations: Iterable[Any]) -> Iterable[Any]: yield annotation -@lru_cache -def _get_at_to_constraint_map() -> dict[type, str]: - """Return a mapping of annotated types to constraints. - - Normally, we would define a mapping like this in the module scope, but we can't do that - because we don't permit module level imports of `annotated_types`, in an attempt to speed up - the import time of `pydantic`. We still only want to have this dictionary defined in one place, - so we use this function to cache the result. - """ - import annotated_types as at - - return { - at.Gt: 'gt', - at.Ge: 'ge', - at.Lt: 'lt', - at.Le: 'le', - at.MultipleOf: 'multiple_of', - at.MinLen: 'min_length', - at.MaxLen: 'max_length', - } - - def apply_known_metadata(annotation: Any, schema: CoreSchema) -> CoreSchema | None: # noqa: C901 """Apply `annotation` to `schema` if it is an annotation we know about (Gt, Le, etc.). Otherwise return `None`. @@ -182,40 +170,20 @@ def apply_known_metadata(annotation: Any, schema: CoreSchema) -> CoreSchema | No An updated schema with annotation if it is an annotation we know about, `None` otherwise. Raises: - RuntimeError: If a constraint can't be applied to a specific schema type. - ValueError: If an unknown constraint is encountered. + PydanticCustomError: If `Predicate` fails. """ import annotated_types as at - from ._validators import NUMERIC_VALIDATOR_LOOKUP, forbid_inf_nan_check + from . import _validators schema = schema.copy() schema_update, other_metadata = collect_known_metadata([annotation]) schema_type = schema['type'] - - chain_schema_constraints: set[str] = { - 'pattern', - 'strip_whitespace', - 'to_lower', - 'to_upper', - 'coerce_numbers_to_str', - } - chain_schema_steps: list[CoreSchema] = [] - for constraint, value in schema_update.items(): if constraint not in CONSTRAINTS_TO_ALLOWED_SCHEMAS: raise ValueError(f'Unknown constraint {constraint}') allowed_schemas = CONSTRAINTS_TO_ALLOWED_SCHEMAS[constraint] - # if it becomes necessary to handle more than one constraint - # in this recursive case with function-after or function-wrap, we should refactor - # this is a bit challenging because we sometimes want to apply constraints to the inner schema, - # whereas other times we want to wrap the existing schema with a new one that enforces a new constraint. - if schema_type in {'function-before', 'function-wrap', 'function-after'} and constraint == 'strict': - schema['schema'] = apply_known_metadata(annotation, schema['schema']) # type: ignore # schema is function schema - return schema - - # if we're allowed to apply constraint directly to the schema, like le to int, do that if schema_type in allowed_schemas: if constraint == 'union_mode' and schema_type == 'union': schema['mode'] = value # type: ignore # schema is UnionSchema @@ -223,116 +191,145 @@ def apply_known_metadata(annotation: Any, schema: CoreSchema) -> CoreSchema | No schema[constraint] = value continue - # else, apply a function after validator to the schema to enforce the corresponding constraint - if constraint in chain_schema_constraints: - - def _apply_constraint_with_incompatibility_info( - value: Any, handler: cs.ValidatorFunctionWrapHandler - ) -> Any: - try: - x = handler(value) - except ValidationError as ve: - # if the error is about the type, it's likely that the constraint is incompatible the type of the field - # for example, the following invalid schema wouldn't be caught during schema build, but rather at this point - # with a cryptic 'string_type' error coming from the string validator, - # that we'd rather express as a constraint incompatibility error (TypeError) - # Annotated[list[int], Field(pattern='abc')] - if 'type' in ve.errors()[0]['type']: - raise TypeError( - f"Unable to apply constraint '{constraint}' to supplied value {value} for schema of type '{schema_type}'" # noqa: B023 - ) - raise ve - return x - - chain_schema_steps.append( - cs.no_info_wrap_validator_function( - _apply_constraint_with_incompatibility_info, cs.str_schema(**{constraint: value}) - ) + if constraint == 'allow_inf_nan' and value is False: + return cs.no_info_after_validator_function( + _validators.forbid_inf_nan_check, + schema, ) - elif constraint in NUMERIC_VALIDATOR_LOOKUP: - if constraint in LENGTH_CONSTRAINTS: - inner_schema = schema - while inner_schema['type'] in {'function-before', 'function-wrap', 'function-after'}: - inner_schema = inner_schema['schema'] # type: ignore - inner_schema_type = inner_schema['type'] - if inner_schema_type == 'list' or ( - inner_schema_type == 'json-or-python' and inner_schema['json_schema']['type'] == 'list' # type: ignore - ): - js_constraint_key = 'minItems' if constraint == 'min_length' else 'maxItems' - else: - js_constraint_key = 'minLength' if constraint == 'min_length' else 'maxLength' - else: - js_constraint_key = constraint - - schema = cs.no_info_after_validator_function( - partial(NUMERIC_VALIDATOR_LOOKUP[constraint], **{constraint: value}), schema + elif constraint == 'pattern': + # insert a str schema to make sure the regex engine matches + return cs.chain_schema( + [ + schema, + cs.str_schema(pattern=value), + ] ) - metadata = schema.get('metadata', {}) - if (existing_json_schema_updates := metadata.get('pydantic_js_updates')) is not None: - metadata['pydantic_js_updates'] = { - **existing_json_schema_updates, - **{js_constraint_key: as_jsonable_value(value)}, - } - else: - metadata['pydantic_js_updates'] = {js_constraint_key: as_jsonable_value(value)} - schema['metadata'] = metadata - elif constraint == 'allow_inf_nan' and value is False: - schema = cs.no_info_after_validator_function( - forbid_inf_nan_check, + elif constraint == 'gt': + s = cs.no_info_after_validator_function( + partial(_validators.greater_than_validator, gt=value), + schema, + ) + add_js_update_schema(s, lambda: {'gt': as_jsonable_value(value)}) + return s + elif constraint == 'ge': + return cs.no_info_after_validator_function( + partial(_validators.greater_than_or_equal_validator, ge=value), + schema, + ) + elif constraint == 'lt': + return cs.no_info_after_validator_function( + partial(_validators.less_than_validator, lt=value), + schema, + ) + elif constraint == 'le': + return cs.no_info_after_validator_function( + partial(_validators.less_than_or_equal_validator, le=value), + schema, + ) + elif constraint == 'multiple_of': + return cs.no_info_after_validator_function( + partial(_validators.multiple_of_validator, multiple_of=value), + schema, + ) + elif constraint == 'min_length': + s = cs.no_info_after_validator_function( + partial(_validators.min_length_validator, min_length=value), + schema, + ) + add_js_update_schema(s, lambda: {'minLength': (as_jsonable_value(value))}) + return s + elif constraint == 'max_length': + s = cs.no_info_after_validator_function( + partial(_validators.max_length_validator, max_length=value), + schema, + ) + add_js_update_schema(s, lambda: {'maxLength': (as_jsonable_value(value))}) + return s + elif constraint == 'strip_whitespace': + return cs.chain_schema( + [ + schema, + cs.str_schema(strip_whitespace=True), + ] + ) + elif constraint == 'to_lower': + return cs.chain_schema( + [ + schema, + cs.str_schema(to_lower=True), + ] + ) + elif constraint == 'to_upper': + return cs.chain_schema( + [ + schema, + cs.str_schema(to_upper=True), + ] + ) + elif constraint == 'min_length': + return cs.no_info_after_validator_function( + partial(_validators.min_length_validator, min_length=annotation.min_length), + schema, + ) + elif constraint == 'max_length': + return cs.no_info_after_validator_function( + partial(_validators.max_length_validator, max_length=annotation.max_length), schema, ) else: - # It's rare that we'd get here, but it's possible if we add a new constraint and forget to handle it - # Most constraint errors are caught at runtime during attempted application - raise RuntimeError(f"Unable to apply constraint '{constraint}' to schema of type '{schema_type}'") + raise RuntimeError(f'Unable to apply constraint {constraint} to schema {schema_type}') for annotation in other_metadata: - if (annotation_type := type(annotation)) in (at_to_constraint_map := _get_at_to_constraint_map()): - constraint = at_to_constraint_map[annotation_type] - validator = NUMERIC_VALIDATOR_LOOKUP.get(constraint) - if validator is None: - raise ValueError(f'Unknown constraint {constraint}') - schema = cs.no_info_after_validator_function( - partial(validator, {constraint: getattr(annotation, constraint)}), schema + if isinstance(annotation, at.Gt): + return cs.no_info_after_validator_function( + partial(_validators.greater_than_validator, gt=annotation.gt), + schema, ) - continue - elif isinstance(annotation, (at.Predicate, at.Not)): - predicate_name = f'{annotation.func.__qualname__!r} ' if hasattr(annotation.func, '__qualname__') else '' + elif isinstance(annotation, at.Ge): + return cs.no_info_after_validator_function( + partial(_validators.greater_than_or_equal_validator, ge=annotation.ge), + schema, + ) + elif isinstance(annotation, at.Lt): + return cs.no_info_after_validator_function( + partial(_validators.less_than_validator, lt=annotation.lt), + schema, + ) + elif isinstance(annotation, at.Le): + return cs.no_info_after_validator_function( + partial(_validators.less_than_or_equal_validator, le=annotation.le), + schema, + ) + elif isinstance(annotation, at.MultipleOf): + return cs.no_info_after_validator_function( + partial(_validators.multiple_of_validator, multiple_of=annotation.multiple_of), + schema, + ) + elif isinstance(annotation, at.MinLen): + return cs.no_info_after_validator_function( + partial(_validators.min_length_validator, min_length=annotation.min_length), + schema, + ) + elif isinstance(annotation, at.MaxLen): + return cs.no_info_after_validator_function( + partial(_validators.max_length_validator, max_length=annotation.max_length), + schema, + ) + elif isinstance(annotation, at.Predicate): + predicate_name = f'{annotation.func.__qualname__} ' if hasattr(annotation.func, '__qualname__') else '' - # Note: B023 is ignored because even though we iterate over `other_metadata`, it is guaranteed - # to be of length 1. `apply_known_metadata()` is called from `GenerateSchema`, where annotations - # were already expanded via `expand_grouped_metadata()`. Confusing, but this falls into the annotations - # refactor. - if isinstance(annotation, at.Predicate): + def val_func(v: Any) -> Any: + # annotation.func may also raise an exception, let it pass through + if not annotation.func(v): + raise PydanticCustomError( + 'predicate_failed', + f'Predicate {predicate_name}failed', # type: ignore + ) + return v - def val_func(v: Any) -> Any: - predicate_satisfied = annotation.func(v) # noqa: B023 - if not predicate_satisfied: - raise PydanticCustomError( - 'predicate_failed', - f'Predicate {predicate_name}failed', # pyright: ignore[reportArgumentType] # noqa: B023 - ) - return v - - else: - - def val_func(v: Any) -> Any: - predicate_satisfied = annotation.func(v) # noqa: B023 - if predicate_satisfied: - raise PydanticCustomError( - 'not_operation_failed', - f'Not of {predicate_name}failed', # pyright: ignore[reportArgumentType] # noqa: B023 - ) - return v - - schema = cs.no_info_after_validator_function(val_func, schema) - else: - # ignore any other unknown metadata - return None - - if chain_schema_steps: - chain_schema_steps = [schema] + chain_schema_steps - return cs.chain_schema(chain_schema_steps) + return cs.no_info_after_validator_function(val_func, schema) + # ignore any other unknown metadata + return None return schema @@ -347,7 +344,7 @@ def collect_known_metadata(annotations: Iterable[Any]) -> tuple[dict[str, Any], A tuple contains a dict of known metadata and a list of unknown annotations. Example: - ```python + ```py from annotated_types import Gt, Len from pydantic._internal._known_annotated_metadata import collect_known_metadata @@ -356,19 +353,31 @@ def collect_known_metadata(annotations: Iterable[Any]) -> tuple[dict[str, Any], #> ({'gt': 1, 'min_length': 42}, [Ellipsis]) ``` """ + import annotated_types as at + annotations = expand_grouped_metadata(annotations) res: dict[str, Any] = {} remaining: list[Any] = [] - for annotation in annotations: # isinstance(annotation, PydanticMetadata) also covers ._fields:_PydanticGeneralMetadata if isinstance(annotation, PydanticMetadata): res.update(annotation.__dict__) # we don't use dataclasses.asdict because that recursively calls asdict on the field values - elif (annotation_type := type(annotation)) in (at_to_constraint_map := _get_at_to_constraint_map()): - constraint = at_to_constraint_map[annotation_type] - res[constraint] = getattr(annotation, constraint) + elif isinstance(annotation, at.MinLen): + res.update({'min_length': annotation.min_length}) + elif isinstance(annotation, at.MaxLen): + res.update({'max_length': annotation.max_length}) + elif isinstance(annotation, at.Gt): + res.update({'gt': annotation.gt}) + elif isinstance(annotation, at.Ge): + res.update({'ge': annotation.ge}) + elif isinstance(annotation, at.Lt): + res.update({'lt': annotation.lt}) + elif isinstance(annotation, at.Le): + res.update({'le': annotation.le}) + elif isinstance(annotation, at.MultipleOf): + res.update({'multiple_of': annotation.multiple_of}) elif isinstance(annotation, type) and issubclass(annotation, PydanticMetadata): # also support PydanticMetadata classes being used without initialisation, # e.g. `Annotated[int, Strict]` as well as `Annotated[int, Strict()]` diff --git a/Backend/venv/lib/python3.12/site-packages/pydantic/_internal/_mock_val_ser.py b/Backend/venv/lib/python3.12/site-packages/pydantic/_internal/_mock_val_ser.py index 9125ab32..b303fed2 100644 --- a/Backend/venv/lib/python3.12/site-packages/pydantic/_internal/_mock_val_ser.py +++ b/Backend/venv/lib/python3.12/site-packages/pydantic/_internal/_mock_val_ser.py @@ -1,71 +1,18 @@ from __future__ import annotations -from collections.abc import Iterator, Mapping -from typing import TYPE_CHECKING, Any, Callable, Generic, Literal, TypeVar, Union +from typing import TYPE_CHECKING, Callable, Generic, TypeVar -from pydantic_core import CoreSchema, SchemaSerializer, SchemaValidator +from pydantic_core import SchemaSerializer, SchemaValidator +from typing_extensions import Literal from ..errors import PydanticErrorCodes, PydanticUserError -from ..plugin._schema_validator import PluggableSchemaValidator if TYPE_CHECKING: from ..dataclasses import PydanticDataclass from ..main import BaseModel - from ..type_adapter import TypeAdapter -ValSer = TypeVar('ValSer', bound=Union[SchemaValidator, PluggableSchemaValidator, SchemaSerializer]) -T = TypeVar('T') - - -class MockCoreSchema(Mapping[str, Any]): - """Mocker for `pydantic_core.CoreSchema` which optionally attempts to - rebuild the thing it's mocking when one of its methods is accessed and raises an error if that fails. - """ - - __slots__ = '_error_message', '_code', '_attempt_rebuild', '_built_memo' - - def __init__( - self, - error_message: str, - *, - code: PydanticErrorCodes, - attempt_rebuild: Callable[[], CoreSchema | None] | None = None, - ) -> None: - self._error_message = error_message - self._code: PydanticErrorCodes = code - self._attempt_rebuild = attempt_rebuild - self._built_memo: CoreSchema | None = None - - def __getitem__(self, key: str) -> Any: - return self._get_built().__getitem__(key) - - def __len__(self) -> int: - return self._get_built().__len__() - - def __iter__(self) -> Iterator[str]: - return self._get_built().__iter__() - - def _get_built(self) -> CoreSchema: - if self._built_memo is not None: - return self._built_memo - - if self._attempt_rebuild: - schema = self._attempt_rebuild() - if schema is not None: - self._built_memo = schema - return schema - raise PydanticUserError(self._error_message, code=self._code) - - def rebuild(self) -> CoreSchema | None: - self._built_memo = None - if self._attempt_rebuild: - schema = self._attempt_rebuild() - if schema is not None: - return schema - else: - raise PydanticUserError(self._error_message, code=self._code) - return None +ValSer = TypeVar('ValSer', SchemaValidator, SchemaSerializer) class MockValSer(Generic[ValSer]): @@ -109,120 +56,85 @@ class MockValSer(Generic[ValSer]): return None -def set_type_adapter_mocks(adapter: TypeAdapter) -> None: - """Set `core_schema`, `validator` and `serializer` to mock core types on a type adapter instance. - - Args: - adapter: The type adapter instance to set the mocks on - """ - type_repr = str(adapter._type) - undefined_type_error_message = ( - f'`TypeAdapter[{type_repr}]` is not fully defined; you should define `{type_repr}` and all referenced types,' - f' then call `.rebuild()` on the instance.' - ) - - def attempt_rebuild_fn(attr_fn: Callable[[TypeAdapter], T]) -> Callable[[], T | None]: - def handler() -> T | None: - if adapter.rebuild(raise_errors=False, _parent_namespace_depth=5) is not False: - return attr_fn(adapter) - return None - - return handler - - adapter.core_schema = MockCoreSchema( # pyright: ignore[reportAttributeAccessIssue] - undefined_type_error_message, - code='class-not-fully-defined', - attempt_rebuild=attempt_rebuild_fn(lambda ta: ta.core_schema), - ) - adapter.validator = MockValSer( # pyright: ignore[reportAttributeAccessIssue] - undefined_type_error_message, - code='class-not-fully-defined', - val_or_ser='validator', - attempt_rebuild=attempt_rebuild_fn(lambda ta: ta.validator), - ) - adapter.serializer = MockValSer( # pyright: ignore[reportAttributeAccessIssue] - undefined_type_error_message, - code='class-not-fully-defined', - val_or_ser='serializer', - attempt_rebuild=attempt_rebuild_fn(lambda ta: ta.serializer), - ) - - -def set_model_mocks(cls: type[BaseModel], undefined_name: str = 'all referenced types') -> None: - """Set `__pydantic_core_schema__`, `__pydantic_validator__` and `__pydantic_serializer__` to mock core types on a model. +def set_model_mocks(cls: type[BaseModel], cls_name: str, undefined_name: str = 'all referenced types') -> None: + """Set `__pydantic_validator__` and `__pydantic_serializer__` to `MockValSer`s on a model. Args: cls: The model class to set the mocks on + cls_name: Name of the model class, used in error messages undefined_name: Name of the undefined thing, used in error messages """ undefined_type_error_message = ( - f'`{cls.__name__}` is not fully defined; you should define {undefined_name},' - f' then call `{cls.__name__}.model_rebuild()`.' + f'`{cls_name}` is not fully defined; you should define {undefined_name},' + f' then call `{cls_name}.model_rebuild()`.' ) - def attempt_rebuild_fn(attr_fn: Callable[[type[BaseModel]], T]) -> Callable[[], T | None]: - def handler() -> T | None: - if cls.model_rebuild(raise_errors=False, _parent_namespace_depth=5) is not False: - return attr_fn(cls) + def attempt_rebuild_validator() -> SchemaValidator | None: + if cls.model_rebuild(raise_errors=False, _parent_namespace_depth=5) is not False: + return cls.__pydantic_validator__ + else: return None - return handler - - cls.__pydantic_core_schema__ = MockCoreSchema( # pyright: ignore[reportAttributeAccessIssue] - undefined_type_error_message, - code='class-not-fully-defined', - attempt_rebuild=attempt_rebuild_fn(lambda c: c.__pydantic_core_schema__), - ) - cls.__pydantic_validator__ = MockValSer( # pyright: ignore[reportAttributeAccessIssue] + cls.__pydantic_validator__ = MockValSer( # type: ignore[assignment] undefined_type_error_message, code='class-not-fully-defined', val_or_ser='validator', - attempt_rebuild=attempt_rebuild_fn(lambda c: c.__pydantic_validator__), + attempt_rebuild=attempt_rebuild_validator, ) - cls.__pydantic_serializer__ = MockValSer( # pyright: ignore[reportAttributeAccessIssue] + + def attempt_rebuild_serializer() -> SchemaSerializer | None: + if cls.model_rebuild(raise_errors=False, _parent_namespace_depth=5) is not False: + return cls.__pydantic_serializer__ + else: + return None + + cls.__pydantic_serializer__ = MockValSer( # type: ignore[assignment] undefined_type_error_message, code='class-not-fully-defined', val_or_ser='serializer', - attempt_rebuild=attempt_rebuild_fn(lambda c: c.__pydantic_serializer__), + attempt_rebuild=attempt_rebuild_serializer, ) -def set_dataclass_mocks(cls: type[PydanticDataclass], undefined_name: str = 'all referenced types') -> None: +def set_dataclass_mocks( + cls: type[PydanticDataclass], cls_name: str, undefined_name: str = 'all referenced types' +) -> None: """Set `__pydantic_validator__` and `__pydantic_serializer__` to `MockValSer`s on a dataclass. Args: cls: The model class to set the mocks on + cls_name: Name of the model class, used in error messages undefined_name: Name of the undefined thing, used in error messages """ from ..dataclasses import rebuild_dataclass undefined_type_error_message = ( - f'`{cls.__name__}` is not fully defined; you should define {undefined_name},' - f' then call `pydantic.dataclasses.rebuild_dataclass({cls.__name__})`.' + f'`{cls_name}` is not fully defined; you should define {undefined_name},' + f' then call `pydantic.dataclasses.rebuild_dataclass({cls_name})`.' ) - def attempt_rebuild_fn(attr_fn: Callable[[type[PydanticDataclass]], T]) -> Callable[[], T | None]: - def handler() -> T | None: - if rebuild_dataclass(cls, raise_errors=False, _parent_namespace_depth=5) is not False: - return attr_fn(cls) + def attempt_rebuild_validator() -> SchemaValidator | None: + if rebuild_dataclass(cls, raise_errors=False, _parent_namespace_depth=5) is not False: + return cls.__pydantic_validator__ + else: return None - return handler - - cls.__pydantic_core_schema__ = MockCoreSchema( # pyright: ignore[reportAttributeAccessIssue] - undefined_type_error_message, - code='class-not-fully-defined', - attempt_rebuild=attempt_rebuild_fn(lambda c: c.__pydantic_core_schema__), - ) - cls.__pydantic_validator__ = MockValSer( # pyright: ignore[reportAttributeAccessIssue] + cls.__pydantic_validator__ = MockValSer( # type: ignore[assignment] undefined_type_error_message, code='class-not-fully-defined', val_or_ser='validator', - attempt_rebuild=attempt_rebuild_fn(lambda c: c.__pydantic_validator__), + attempt_rebuild=attempt_rebuild_validator, ) - cls.__pydantic_serializer__ = MockValSer( # pyright: ignore[reportAttributeAccessIssue] + + def attempt_rebuild_serializer() -> SchemaSerializer | None: + if rebuild_dataclass(cls, raise_errors=False, _parent_namespace_depth=5) is not False: + return cls.__pydantic_serializer__ + else: + return None + + cls.__pydantic_serializer__ = MockValSer( # type: ignore[assignment] undefined_type_error_message, code='class-not-fully-defined', - val_or_ser='serializer', - attempt_rebuild=attempt_rebuild_fn(lambda c: c.__pydantic_serializer__), + val_or_ser='validator', + attempt_rebuild=attempt_rebuild_serializer, ) diff --git a/Backend/venv/lib/python3.12/site-packages/pydantic/_internal/_model_construction.py b/Backend/venv/lib/python3.12/site-packages/pydantic/_internal/_model_construction.py index 4fe223c9..81159ff1 100644 --- a/Backend/venv/lib/python3.12/site-packages/pydantic/_internal/_model_construction.py +++ b/Backend/venv/lib/python3.12/site-packages/pydantic/_internal/_model_construction.py @@ -1,49 +1,43 @@ """Private logic for creating models.""" - from __future__ import annotations as _annotations -import operator -import sys import typing import warnings import weakref from abc import ABCMeta -from functools import cache, partial, wraps +from functools import partial from types import FunctionType -from typing import TYPE_CHECKING, Any, Callable, Generic, Literal, NoReturn, TypeVar, cast +from typing import Any, Callable, Generic, Mapping +import typing_extensions from pydantic_core import PydanticUndefined, SchemaSerializer -from typing_extensions import TypeAliasType, dataclass_transform, deprecated, get_args, get_origin -from typing_inspection import typing_objects +from typing_extensions import dataclass_transform, deprecated from ..errors import PydanticUndefinedAnnotation, PydanticUserError from ..plugin._schema_validator import create_schema_validator from ..warnings import GenericBeforeBaseModelWarning, PydanticDeprecatedSince20 from ._config import ConfigWrapper -from ._decorators import DecoratorInfos, PydanticDescriptorProxy, get_attribute_from_bases, unwrap_wrapped_function -from ._fields import collect_model_fields, is_valid_field_name, is_valid_privateattr_name, rebuild_model_fields -from ._generate_schema import GenerateSchema, InvalidSchemaError +from ._decorators import DecoratorInfos, PydanticDescriptorProxy, get_attribute_from_bases +from ._fields import collect_model_fields, is_valid_field_name, is_valid_privateattr_name +from ._generate_schema import GenerateSchema, generate_pydantic_signature from ._generics import PydanticGenericMetadata, get_model_typevars_map -from ._import_utils import import_cached_base_model, import_cached_field_info -from ._mock_val_ser import set_model_mocks -from ._namespace_utils import NsResolver -from ._signature import generate_pydantic_signature -from ._typing_extra import ( - _make_forward_ref, - eval_type_backport, - is_classvar_annotation, - parent_frame_namespace, -) -from ._utils import LazyClassAttribute, SafeGetItemProxy +from ._mock_val_ser import MockValSer, set_model_mocks +from ._schema_generation_shared import CallbackGetCoreSchemaHandler +from ._typing_extra import get_cls_types_namespace, is_annotated, is_classvar, parent_frame_namespace +from ._utils import ClassAttribute +from ._validate_call import ValidateCallWrapper + +if typing.TYPE_CHECKING: + from inspect import Signature -if TYPE_CHECKING: from ..fields import Field as PydanticModelField from ..fields import FieldInfo, ModelPrivateAttr - from ..fields import PrivateAttr as PydanticModelPrivateAttr from ..main import BaseModel else: + # See PyCharm issues https://youtrack.jetbrains.com/issue/PY-21915 + # and https://youtrack.jetbrains.com/issue/PY-51428 + DeprecationWarning = PydanticDeprecatedSince20 PydanticModelField = object() - PydanticModelPrivateAttr = object() object_setattr = object.__setattr__ @@ -56,29 +50,12 @@ class _ModelNamespaceDict(dict): def __setitem__(self, k: str, v: object) -> None: existing: Any = self.get(k, None) if existing and v is not existing and isinstance(existing, PydanticDescriptorProxy): - warnings.warn( - f'`{k}` overrides an existing Pydantic `{existing.decorator_info.decorator_repr}` decorator', - stacklevel=2, - ) + warnings.warn(f'`{k}` overrides an existing Pydantic `{existing.decorator_info.decorator_repr}` decorator') return super().__setitem__(k, v) -def NoInitField( - *, - init: Literal[False] = False, -) -> Any: - """Only for typing purposes. Used as default value of `__pydantic_fields_set__`, - `__pydantic_extra__`, `__pydantic_private__`, so they could be ignored when - synthesizing the `__init__` signature. - """ - - -# For ModelMetaclass.register(): -_T = TypeVar('_T') - - -@dataclass_transform(kw_only_default=True, field_specifiers=(PydanticModelField, PydanticModelPrivateAttr, NoInitField)) +@dataclass_transform(kw_only_default=True, field_specifiers=(PydanticModelField,)) class ModelMetaclass(ABCMeta): def __new__( mcs, @@ -108,42 +85,24 @@ class ModelMetaclass(ABCMeta): # that `BaseModel` itself won't have any bases, but any subclass of it will, to determine whether the `__new__` # call we're in the middle of is for the `BaseModel` class. if bases: - raw_annotations: dict[str, Any] - if sys.version_info >= (3, 14): - if ( - '__annotations__' in namespace - ): # `from __future__ import annotations` was used in the model's module - raw_annotations = namespace['__annotations__'] - else: - # See https://docs.python.org/3.14/library/annotationlib.html#using-annotations-in-a-metaclass: - from annotationlib import Format, call_annotate_function, get_annotate_from_class_namespace - - if annotate := get_annotate_from_class_namespace(namespace): - raw_annotations = call_annotate_function(annotate, format=Format.FORWARDREF) - else: - raw_annotations = {} - else: - raw_annotations = namespace.get('__annotations__', {}) - base_field_names, class_vars, base_private_attributes = mcs._collect_bases_data(bases) - config_wrapper = ConfigWrapper.for_model(bases, namespace, raw_annotations, kwargs) + config_wrapper = ConfigWrapper.for_model(bases, namespace, kwargs) namespace['model_config'] = config_wrapper.config_dict private_attributes = inspect_namespace( - namespace, raw_annotations, config_wrapper.ignored_types, class_vars, base_field_names + namespace, config_wrapper.ignored_types, class_vars, base_field_names ) - if private_attributes or base_private_attributes: + if private_attributes: original_model_post_init = get_model_post_init(namespace, bases) if original_model_post_init is not None: # if there are private_attributes and a model_post_init function, we handle both - @wraps(original_model_post_init) - def wrapped_model_post_init(self: BaseModel, context: Any, /) -> None: + def wrapped_model_post_init(self: BaseModel, __context: Any) -> None: """We need to both initialize private attributes and call the user-defined model_post_init method. """ - init_private_attributes(self, context) - original_model_post_init(self, context) + init_private_attributes(self, __context) + original_model_post_init(self, __context) namespace['model_post_init'] = wrapped_model_post_init else: @@ -152,11 +111,15 @@ class ModelMetaclass(ABCMeta): namespace['__class_vars__'] = class_vars namespace['__private_attributes__'] = {**base_private_attributes, **private_attributes} - cls = cast('type[BaseModel]', super().__new__(mcs, cls_name, bases, namespace, **kwargs)) - BaseModel_ = import_cached_base_model() + if config_wrapper.frozen: + set_default_hash_func(namespace, bases) + + cls: type[BaseModel] = super().__new__(mcs, cls_name, bases, namespace, **kwargs) # type: ignore + + from ..main import BaseModel mro = cls.__mro__ - if Generic in mro and mro.index(Generic) < mro.index(BaseModel_): + if Generic in mro and mro.index(Generic) < mro.index(BaseModel): warnings.warn( GenericBeforeBaseModelWarning( 'Classes should inherit from `BaseModel` before generic classes (e.g. `typing.Generic[T]`) ' @@ -166,14 +129,9 @@ class ModelMetaclass(ABCMeta): ) cls.__pydantic_custom_init__ = not getattr(cls.__init__, '__pydantic_base_init__', False) - cls.__pydantic_post_init__ = ( - None if cls.model_post_init is BaseModel_.model_post_init else 'model_post_init' - ) - - cls.__pydantic_setattr_handlers__ = {} + cls.__pydantic_post_init__ = None if cls.model_post_init is BaseModel.model_post_init else 'model_post_init' cls.__pydantic_decorators__ = DecoratorInfos.build(cls) - cls.__pydantic_decorators__.update_from_config(config_wrapper) # Use the getattr below to grab the __parameters__ from the `typing.Generic` parent class if __pydantic_generic_metadata__: @@ -182,40 +140,22 @@ class ModelMetaclass(ABCMeta): parent_parameters = getattr(cls, '__pydantic_generic_metadata__', {}).get('parameters', ()) parameters = getattr(cls, '__parameters__', None) or parent_parameters if parameters and parent_parameters and not all(x in parameters for x in parent_parameters): - from ..root_model import RootModelRootType - - missing_parameters = tuple(x for x in parameters if x not in parent_parameters) - if RootModelRootType in parent_parameters and RootModelRootType not in parameters: - # This is a special case where the user has subclassed `RootModel`, but has not parametrized - # RootModel with the generic type identifiers being used. Ex: - # class MyModel(RootModel, Generic[T]): - # root: T - # Should instead just be: - # class MyModel(RootModel[T]): - # root: T - parameters_str = ', '.join([x.__name__ for x in missing_parameters]) - error_message = ( - f'{cls.__name__} is a subclass of `RootModel`, but does not include the generic type identifier(s) ' - f'{parameters_str} in its parameters. ' - f'You should parametrize RootModel directly, e.g., `class {cls.__name__}(RootModel[{parameters_str}]): ...`.' + combined_parameters = parent_parameters + tuple(x for x in parameters if x not in parent_parameters) + parameters_str = ', '.join([str(x) for x in combined_parameters]) + generic_type_label = f'typing.Generic[{parameters_str}]' + error_message = ( + f'All parameters must be present on typing.Generic;' + f' you should inherit from {generic_type_label}.' + ) + if Generic not in bases: # pragma: no cover + # We raise an error here not because it is desirable, but because some cases are mishandled. + # It would be nice to remove this error and still have things behave as expected, it's just + # challenging because we are using a custom `__class_getitem__` to parametrize generic models, + # and not returning a typing._GenericAlias from it. + bases_str = ', '.join([x.__name__ for x in bases] + [generic_type_label]) + error_message += ( + f' Note: `typing.Generic` must go last: `class {cls.__name__}({bases_str}): ...`)' ) - else: - combined_parameters = parent_parameters + missing_parameters - parameters_str = ', '.join([str(x) for x in combined_parameters]) - generic_type_label = f'typing.Generic[{parameters_str}]' - error_message = ( - f'All parameters must be present on typing.Generic;' - f' you should inherit from {generic_type_label}.' - ) - if Generic not in bases: # pragma: no cover - # We raise an error here not because it is desirable, but because some cases are mishandled. - # It would be nice to remove this error and still have things behave as expected, it's just - # challenging because we are using a custom `__class_getitem__` to parametrize generic models, - # and not returning a typing._GenericAlias from it. - bases_str = ', '.join([x.__name__ for x in bases] + [generic_type_label]) - error_message += ( - f' Note: `typing.Generic` must go last: `class {cls.__name__}({bases_str}): ...`)' - ) raise TypeError(error_message) cls.__pydantic_generic_metadata__ = { @@ -233,52 +173,30 @@ class ModelMetaclass(ABCMeta): if __pydantic_reset_parent_namespace__: cls.__pydantic_parent_namespace__ = build_lenient_weakvaluedict(parent_frame_namespace()) - parent_namespace: dict[str, Any] | None = getattr(cls, '__pydantic_parent_namespace__', None) + parent_namespace = getattr(cls, '__pydantic_parent_namespace__', None) if isinstance(parent_namespace, dict): parent_namespace = unpack_lenient_weakvaluedict(parent_namespace) - ns_resolver = NsResolver(parent_namespace=parent_namespace) - - set_model_fields(cls, config_wrapper=config_wrapper, ns_resolver=ns_resolver) - - # This is also set in `complete_model_class()`, after schema gen because they are recreated. - # We set them here as well for backwards compatibility: - cls.__pydantic_computed_fields__ = { - k: v.info for k, v in cls.__pydantic_decorators__.computed_fields.items() - } - - if config_wrapper.defer_build: - set_model_mocks(cls) - else: - # Any operation that requires accessing the field infos instances should be put inside - # `complete_model_class()`: - complete_model_class( - cls, - config_wrapper, - ns_resolver, - raise_errors=False, - create_model_module=_create_model_module, - ) - - if config_wrapper.frozen and '__hash__' not in namespace: - set_default_hash_func(cls, bases) - + types_namespace = get_cls_types_namespace(cls, parent_namespace) + set_model_fields(cls, bases, config_wrapper, types_namespace) + complete_model_class( + cls, + cls_name, + config_wrapper, + raise_errors=False, + types_namespace=types_namespace, + create_model_module=_create_model_module, + ) # using super(cls, cls) on the next line ensures we only call the parent class's __pydantic_init_subclass__ # I believe the `type: ignore` is only necessary because mypy doesn't realize that this code branch is # only hit for _proper_ subclasses of BaseModel super(cls, cls).__pydantic_init_subclass__(**kwargs) # type: ignore[misc] return cls else: - # These are instance variables, but have been assigned to `NoInitField` to trick the type checker. - for instance_slot in '__pydantic_fields_set__', '__pydantic_extra__', '__pydantic_private__': - namespace.pop( - instance_slot, - None, # In case the metaclass is used with a class other than `BaseModel`. - ) - namespace.get('__annotations__', {}).clear() + # this is the BaseModel class itself being created, no logic required return super().__new__(mcs, cls_name, bases, namespace, **kwargs) - if not TYPE_CHECKING: # pragma: no branch + if not typing.TYPE_CHECKING: # pragma: no branch # We put `__getattr__` in a non-TYPE_CHECKING block because otherwise, mypy allows arbitrary attribute access def __getattr__(self, item: str) -> Any: @@ -286,30 +204,30 @@ class ModelMetaclass(ABCMeta): private_attributes = self.__dict__.get('__private_attributes__') if private_attributes and item in private_attributes: return private_attributes[item] + if item == '__pydantic_core_schema__': + # This means the class didn't get a schema generated for it, likely because there was an undefined reference + maybe_mock_validator = getattr(self, '__pydantic_validator__', None) + if isinstance(maybe_mock_validator, MockValSer): + rebuilt_validator = maybe_mock_validator.rebuild() + if rebuilt_validator is not None: + # In this case, a validator was built, and so `__pydantic_core_schema__` should now be set + return getattr(self, '__pydantic_core_schema__') raise AttributeError(item) @classmethod - def __prepare__(cls, *args: Any, **kwargs: Any) -> dict[str, object]: + def __prepare__(cls, *args: Any, **kwargs: Any) -> Mapping[str, object]: return _ModelNamespaceDict() - # Due to performance and memory issues, in the ABCMeta.__subclasscheck__ implementation, we don't support - # registered virtual subclasses. See https://github.com/python/cpython/issues/92810#issuecomment-2762454345. - # This may change once the CPython gets fixed (possibly in 3.15), in which case we should conditionally - # define `register()`. - def register(self, subclass: type[_T]) -> type[_T]: - warnings.warn( - f"For performance reasons, virtual subclasses registered using '{self.__qualname__}.register()' " - "are not supported in 'isinstance()' and 'issubclass()' checks.", - stacklevel=2, - ) - return super().register(subclass) + def __instancecheck__(self, instance: Any) -> bool: + """Avoid calling ABC _abc_subclasscheck unless we're pretty sure. - __instancecheck__ = type.__instancecheck__ # pyright: ignore[reportAssignmentType] - __subclasscheck__ = type.__subclasscheck__ # pyright: ignore[reportAssignmentType] + See #3829 and python/cpython#92810 + """ + return hasattr(instance, '__pydantic_validator__') and super().__instancecheck__(instance) @staticmethod def _collect_bases_data(bases: tuple[type[Any], ...]) -> tuple[set[str], set[str], dict[str, ModelPrivateAttr]]: - BaseModel = import_cached_base_model() + from ..main import BaseModel field_names: set[str] = set() class_vars: set[str] = set() @@ -317,51 +235,28 @@ class ModelMetaclass(ABCMeta): for base in bases: if issubclass(base, BaseModel) and base is not BaseModel: # model_fields might not be defined yet in the case of generics, so we use getattr here: - field_names.update(getattr(base, '__pydantic_fields__', {}).keys()) + field_names.update(getattr(base, 'model_fields', {}).keys()) class_vars.update(base.__class_vars__) private_attributes.update(base.__private_attributes__) return field_names, class_vars, private_attributes @property @deprecated( - 'The `__fields__` attribute is deprecated, use the `model_fields` class property instead.', category=None + 'The `__fields__` attribute is deprecated, use `model_fields` instead.', category=PydanticDeprecatedSince20 ) def __fields__(self) -> dict[str, FieldInfo]: - warnings.warn( - 'The `__fields__` attribute is deprecated, use the `model_fields` class property instead.', - PydanticDeprecatedSince20, - stacklevel=2, - ) - return getattr(self, '__pydantic_fields__', {}) - - @property - def __pydantic_fields_complete__(self) -> bool: - """Whether the fields where successfully collected (i.e. type hints were successfully resolves). - - This is a private attribute, not meant to be used outside Pydantic. - """ - if '__pydantic_fields__' not in self.__dict__: - return False - - field_infos = cast('dict[str, FieldInfo]', self.__pydantic_fields__) # pyright: ignore[reportAttributeAccessIssue] - - return all(field_info._complete for field_info in field_infos.values()) - - def __dir__(self) -> list[str]: - attributes = list(super().__dir__()) - if '__fields__' in attributes: - attributes.remove('__fields__') - return attributes + warnings.warn('The `__fields__` attribute is deprecated, use `model_fields` instead.', DeprecationWarning) + return self.model_fields # type: ignore -def init_private_attributes(self: BaseModel, context: Any, /) -> None: +def init_private_attributes(self: BaseModel, __context: Any) -> None: """This function is meant to behave like a BaseModel method to initialise private attributes. It takes context as an argument since that's what pydantic-core passes when calling it. Args: self: The BaseModel instance. - context: The context. + __context: The context. """ if getattr(self, '__pydantic_private__', None) is None: pydantic_private = {} @@ -377,7 +272,7 @@ def get_model_post_init(namespace: dict[str, Any], bases: tuple[type[Any], ...]) if 'model_post_init' in namespace: return namespace['model_post_init'] - BaseModel = import_cached_base_model() + from ..main import BaseModel model_post_init = get_attribute_from_bases(bases, 'model_post_init') if model_post_init is not BaseModel.model_post_init: @@ -386,7 +281,6 @@ def get_model_post_init(namespace: dict[str, Any], bases: tuple[type[Any], ...]) def inspect_namespace( # noqa C901 namespace: dict[str, Any], - raw_annotations: dict[str, Any], ignored_types: tuple[type[Any], ...], base_class_vars: set[str], base_class_fields: set[str], @@ -397,7 +291,6 @@ def inspect_namespace( # noqa C901 Args: namespace: The attribute dictionary of the class to be created. - raw_annotations: The (non-evaluated) annotations of the model. ignored_types: A tuple of ignore types. base_class_vars: A set of base class class variables. base_class_fields: A set of base class fields. @@ -412,26 +305,24 @@ def inspect_namespace( # noqa C901 - If a field does not have a type annotation. - If a field on base class was overridden by a non-annotated attribute. """ - from ..fields import ModelPrivateAttr, PrivateAttr - - FieldInfo = import_cached_field_info() + from ..fields import FieldInfo, ModelPrivateAttr, PrivateAttr all_ignored_types = ignored_types + default_ignored_types() private_attributes: dict[str, ModelPrivateAttr] = {} + raw_annotations = namespace.get('__annotations__', {}) if '__root__' in raw_annotations or '__root__' in namespace: raise TypeError("To define root models, use `pydantic.RootModel` rather than a field called '__root__'") ignored_names: set[str] = set() for var_name, value in list(namespace.items()): - if var_name == 'model_config' or var_name == '__pydantic_extra__': + if var_name == 'model_config': continue elif ( isinstance(value, type) and value.__module__ == namespace['__module__'] - and '__qualname__' in namespace - and value.__qualname__.startswith(f'{namespace["__qualname__"]}.') + and value.__qualname__.startswith(namespace['__qualname__']) ): # `value` is a nested type defined in this namespace; don't error continue @@ -461,8 +352,8 @@ def inspect_namespace( # noqa C901 elif var_name.startswith('__'): continue elif is_valid_privateattr_name(var_name): - if var_name not in raw_annotations or not is_classvar_annotation(raw_annotations[var_name]): - private_attributes[var_name] = cast(ModelPrivateAttr, PrivateAttr(default=value)) + if var_name not in raw_annotations or not is_classvar(raw_annotations[var_name]): + private_attributes[var_name] = PrivateAttr(default=value) del namespace[var_name] elif var_name in base_class_vars: continue @@ -490,28 +381,12 @@ def inspect_namespace( # noqa C901 is_valid_privateattr_name(ann_name) and ann_name not in private_attributes and ann_name not in ignored_names - # This condition can be a false negative when `ann_type` is stringified, - # but it is handled in most cases in `set_model_fields`: - and not is_classvar_annotation(ann_type) + and not is_classvar(ann_type) and ann_type not in all_ignored_types and getattr(ann_type, '__module__', None) != 'functools' ): - if isinstance(ann_type, str): - # Walking up the frames to get the module namespace where the model is defined - # (as the model class wasn't created yet, we unfortunately can't use `cls.__module__`): - frame = sys._getframe(2) - if frame is not None: - try: - ann_type = eval_type_backport( - _make_forward_ref(ann_type, is_argument=False, is_class=True), - globalns=frame.f_globals, - localns=frame.f_locals, - ) - except (NameError, TypeError): - pass - - if typing_objects.is_annotated(get_origin(ann_type)): - _, *metadata = get_args(ann_type) + if is_annotated(ann_type): + _, *metadata = typing_extensions.get_args(ann_type) private_attr = next((v for v in metadata if isinstance(v, ModelPrivateAttr)), None) if private_attr is not None: private_attributes[ann_name] = private_attr @@ -521,51 +396,36 @@ def inspect_namespace( # noqa C901 return private_attributes -def set_default_hash_func(cls: type[BaseModel], bases: tuple[type[Any], ...]) -> None: +def set_default_hash_func(namespace: dict[str, Any], bases: tuple[type[Any], ...]) -> None: + if '__hash__' in namespace: + return + base_hash_func = get_attribute_from_bases(bases, '__hash__') - new_hash_func = make_hash_func(cls) - if base_hash_func in {None, object.__hash__} or getattr(base_hash_func, '__code__', None) == new_hash_func.__code__: - # If `__hash__` is some default, we generate a hash function. - # It will be `None` if not overridden from BaseModel. - # It may be `object.__hash__` if there is another + if base_hash_func in {None, object.__hash__}: + # If `__hash__` is None _or_ `object.__hash__`, we generate a hash function. + # It will be `None` if not overridden from BaseModel, but may be `object.__hash__` if there is another # parent class earlier in the bases which doesn't override `__hash__` (e.g. `typing.Generic`). - # It may be a value set by `set_default_hash_func` if `cls` is a subclass of another frozen model. - # In the last case we still need a new hash function to account for new `model_fields`. - cls.__hash__ = new_hash_func + def hash_func(self: Any) -> int: + return hash(self.__class__) + hash(tuple(self.__dict__.values())) - -def make_hash_func(cls: type[BaseModel]) -> Any: - getter = operator.itemgetter(*cls.__pydantic_fields__.keys()) if cls.__pydantic_fields__ else lambda _: 0 - - def hash_func(self: Any) -> int: - try: - return hash(getter(self.__dict__)) - except KeyError: - # In rare cases (such as when using the deprecated copy method), the __dict__ may not contain - # all model fields, which is how we can get here. - # getter(self.__dict__) is much faster than any 'safe' method that accounts for missing keys, - # and wrapping it in a `try` doesn't slow things down much in the common case. - return hash(getter(SafeGetItemProxy(self.__dict__))) - - return hash_func + namespace['__hash__'] = hash_func def set_model_fields( - cls: type[BaseModel], - config_wrapper: ConfigWrapper, - ns_resolver: NsResolver | None, + cls: type[BaseModel], bases: tuple[type[Any], ...], config_wrapper: ConfigWrapper, types_namespace: dict[str, Any] ) -> None: - """Collect and set `cls.__pydantic_fields__` and `cls.__class_vars__`. + """Collect and set `cls.model_fields` and `cls.__class_vars__`. Args: cls: BaseModel or dataclass. + bases: Parents of the class, generally `cls.__bases__`. config_wrapper: The config wrapper instance. - ns_resolver: Namespace resolver to use when getting model annotations. + types_namespace: Optional extra namespace to look for types in. """ typevars_map = get_model_typevars_map(cls) - fields, class_vars = collect_model_fields(cls, config_wrapper, ns_resolver, typevars_map=typevars_map) + fields, class_vars = collect_model_fields(cls, bases, config_wrapper, types_namespace, typevars_map=typevars_map) - cls.__pydantic_fields__ = fields + cls.model_fields = fields cls.__class_vars__.update(class_vars) for k in class_vars: @@ -583,11 +443,11 @@ def set_model_fields( def complete_model_class( cls: type[BaseModel], + cls_name: str, config_wrapper: ConfigWrapper, - ns_resolver: NsResolver, *, raise_errors: bool = True, - call_on_complete_hook: bool = True, + types_namespace: dict[str, Any] | None, create_model_module: str | None = None, ) -> bool: """Finish building a model class. @@ -597,10 +457,10 @@ def complete_model_class( Args: cls: BaseModel or dataclass. + cls_name: The model or dataclass name. config_wrapper: The config wrapper instance. - ns_resolver: The namespace resolver instance to use during schema building. raise_errors: Whether to raise errors. - call_on_complete_hook: Whether to call the `__pydantic_on_complete__` hook. + types_namespace: Optional extra namespace to look for types in. create_model_module: The module of the class to be created, if created by `create_model`. Returns: @@ -611,61 +471,39 @@ def complete_model_class( and `raise_errors=True`. """ typevars_map = get_model_typevars_map(cls) - - if not cls.__pydantic_fields_complete__: - # Note: when coming from `ModelMetaclass.__new__()`, this results in fields being built twice. - # We do so a second time here so that we can get the `NameError` for the specific undefined annotation. - # Alternatively, we could let `GenerateSchema()` raise the error, but there are cases where incomplete - # fields are inherited in `collect_model_fields()` and can actually have their annotation resolved in the - # generate schema process. As we want to avoid having `__pydantic_fields_complete__` set to `False` - # when `__pydantic_complete__` is `True`, we rebuild here: - try: - cls.__pydantic_fields__ = rebuild_model_fields( - cls, - config_wrapper=config_wrapper, - ns_resolver=ns_resolver, - typevars_map=typevars_map, - ) - except NameError as e: - exc = PydanticUndefinedAnnotation.from_name_error(e) - set_model_mocks(cls, f'`{exc.name}`') - if raise_errors: - raise exc from e - - if not raise_errors and not cls.__pydantic_fields_complete__: - # No need to continue with schema gen, it is guaranteed to fail - return False - - assert cls.__pydantic_fields_complete__ - gen_schema = GenerateSchema( config_wrapper, - ns_resolver, + types_namespace, typevars_map, ) + handler = CallbackGetCoreSchemaHandler( + partial(gen_schema.generate_schema, from_dunder_get_core_schema=False), + gen_schema, + ref_mode='unpack', + ) + + if config_wrapper.defer_build: + set_model_mocks(cls, cls_name) + return False + try: - schema = gen_schema.generate_schema(cls) + schema = cls.__get_pydantic_core_schema__(cls, handler) except PydanticUndefinedAnnotation as e: if raise_errors: raise - set_model_mocks(cls, f'`{e.name}`') + set_model_mocks(cls, cls_name, f'`{e.name}`') return False - core_config = config_wrapper.core_config(title=cls.__name__) + core_config = config_wrapper.core_config(cls) try: schema = gen_schema.clean_schema(schema) - except InvalidSchemaError: - set_model_mocks(cls) + except gen_schema.CollectedInvalid: + set_model_mocks(cls, cls_name) return False - # This needs to happen *after* model schema generation, as the return type - # of the properties are evaluated and the `ComputedFieldInfo` are recreated: - cls.__pydantic_computed_fields__ = {k: v.info for k, v in cls.__pydantic_decorators__.computed_fields.items()} - - set_deprecated_descriptors(cls) - + # debug(schema) cls.__pydantic_core_schema__ = schema cls.__pydantic_validator__ = create_schema_validator( @@ -678,83 +516,29 @@ def complete_model_class( config_wrapper.plugin_settings, ) cls.__pydantic_serializer__ = SchemaSerializer(schema, core_config) - - # set __signature__ attr only for model class, but not for its instances - # (because instances can define `__call__`, and `inspect.signature` shouldn't - # use the `__signature__` attribute and instead generate from `__call__`). - cls.__signature__ = LazyClassAttribute( - '__signature__', - partial( - generate_pydantic_signature, - init=cls.__init__, - fields=cls.__pydantic_fields__, - validate_by_name=config_wrapper.validate_by_name, - extra=config_wrapper.extra, - ), - ) - cls.__pydantic_complete__ = True - if call_on_complete_hook: - cls.__pydantic_on_complete__() - + # set __signature__ attr only for model class, but not for its instances + cls.__signature__ = ClassAttribute( + '__signature__', generate_model_signature(cls.__init__, cls.model_fields, config_wrapper) + ) return True -def set_deprecated_descriptors(cls: type[BaseModel]) -> None: - """Set data descriptors on the class for deprecated fields.""" - for field, field_info in cls.__pydantic_fields__.items(): - if (msg := field_info.deprecation_message) is not None: - desc = _DeprecatedFieldDescriptor(msg) - desc.__set_name__(cls, field) - setattr(cls, field, desc) +def generate_model_signature( + init: Callable[..., None], fields: dict[str, FieldInfo], config_wrapper: ConfigWrapper +) -> Signature: + """Generate signature for model based on its fields. - for field, computed_field_info in cls.__pydantic_computed_fields__.items(): - if ( - (msg := computed_field_info.deprecation_message) is not None - # Avoid having two warnings emitted: - and not hasattr(unwrap_wrapped_function(computed_field_info.wrapped_property), '__deprecated__') - ): - desc = _DeprecatedFieldDescriptor(msg, computed_field_info.wrapped_property) - desc.__set_name__(cls, field) - setattr(cls, field, desc) + Args: + init: The class init. + fields: The model fields. + config_wrapper: The config wrapper instance. - -class _DeprecatedFieldDescriptor: - """Read-only data descriptor used to emit a runtime deprecation warning before accessing a deprecated field. - - Attributes: - msg: The deprecation message to be emitted. - wrapped_property: The property instance if the deprecated field is a computed field, or `None`. - field_name: The name of the field being deprecated. + Returns: + The model signature. """ - - field_name: str - - def __init__(self, msg: str, wrapped_property: property | None = None) -> None: - self.msg = msg - self.wrapped_property = wrapped_property - - def __set_name__(self, cls: type[BaseModel], name: str) -> None: - self.field_name = name - - def __get__(self, obj: BaseModel | None, obj_type: type[BaseModel] | None = None) -> Any: - if obj is None: - if self.wrapped_property is not None: - return self.wrapped_property.__get__(None, obj_type) - raise AttributeError(self.field_name) - - warnings.warn(self.msg, DeprecationWarning, stacklevel=2) - - if self.wrapped_property is not None: - return self.wrapped_property.__get__(obj, obj_type) - return obj.__dict__[self.field_name] - - # Defined to make it a data descriptor and take precedence over the instance's dictionary. - # Note that it will not be called when setting a value on a model instance - # as `BaseModel.__setattr__` is defined and takes priority. - def __set__(self, obj: Any, value: Any) -> NoReturn: - raise AttributeError(self.field_name) + return generate_pydantic_signature(init, fields, config_wrapper) class _PydanticWeakRef: @@ -828,21 +612,15 @@ def unpack_lenient_weakvaluedict(d: dict[str, Any] | None) -> dict[str, Any] | N return result -@cache def default_ignored_types() -> tuple[type[Any], ...]: from ..fields import ComputedFieldInfo - ignored_types = [ + return ( FunctionType, property, classmethod, staticmethod, PydanticDescriptorProxy, ComputedFieldInfo, - TypeAliasType, # from `typing_extensions` - ] - - if sys.version_info >= (3, 12): - ignored_types.append(typing.TypeAliasType) - - return tuple(ignored_types) + ValidateCallWrapper, + ) diff --git a/Backend/venv/lib/python3.12/site-packages/pydantic/_internal/_namespace_utils.py b/Backend/venv/lib/python3.12/site-packages/pydantic/_internal/_namespace_utils.py deleted file mode 100644 index af0cddb0..00000000 --- a/Backend/venv/lib/python3.12/site-packages/pydantic/_internal/_namespace_utils.py +++ /dev/null @@ -1,293 +0,0 @@ -from __future__ import annotations - -import sys -from collections.abc import Generator, Iterator, Mapping -from contextlib import contextmanager -from functools import cached_property -from typing import Any, Callable, NamedTuple, TypeVar - -from typing_extensions import ParamSpec, TypeAlias, TypeAliasType, TypeVarTuple - -GlobalsNamespace: TypeAlias = 'dict[str, Any]' -"""A global namespace. - -In most cases, this is a reference to the `__dict__` attribute of a module. -This namespace type is expected as the `globals` argument during annotations evaluation. -""" - -MappingNamespace: TypeAlias = Mapping[str, Any] -"""Any kind of namespace. - -In most cases, this is a local namespace (e.g. the `__dict__` attribute of a class, -the [`f_locals`][frame.f_locals] attribute of a frame object, when dealing with types -defined inside functions). -This namespace type is expected as the `locals` argument during annotations evaluation. -""" - -_TypeVarLike: TypeAlias = 'TypeVar | ParamSpec | TypeVarTuple' - - -class NamespacesTuple(NamedTuple): - """A tuple of globals and locals to be used during annotations evaluation. - - This datastructure is defined as a named tuple so that it can easily be unpacked: - - ```python {lint="skip" test="skip"} - def eval_type(typ: type[Any], ns: NamespacesTuple) -> None: - return eval(typ, *ns) - ``` - """ - - globals: GlobalsNamespace - """The namespace to be used as the `globals` argument during annotations evaluation.""" - - locals: MappingNamespace - """The namespace to be used as the `locals` argument during annotations evaluation.""" - - -def get_module_ns_of(obj: Any) -> dict[str, Any]: - """Get the namespace of the module where the object is defined. - - Caution: this function does not return a copy of the module namespace, so the result - should not be mutated. The burden of enforcing this is on the caller. - """ - module_name = getattr(obj, '__module__', None) - if module_name: - try: - return sys.modules[module_name].__dict__ - except KeyError: - # happens occasionally, see https://github.com/pydantic/pydantic/issues/2363 - return {} - return {} - - -# Note that this class is almost identical to `collections.ChainMap`, but need to enforce -# immutable mappings here: -class LazyLocalNamespace(Mapping[str, Any]): - """A lazily evaluated mapping, to be used as the `locals` argument during annotations evaluation. - - While the [`eval`][eval] function expects a mapping as the `locals` argument, it only - performs `__getitem__` calls. The [`Mapping`][collections.abc.Mapping] abstract base class - is fully implemented only for type checking purposes. - - Args: - *namespaces: The namespaces to consider, in ascending order of priority. - - Example: - ```python {lint="skip" test="skip"} - ns = LazyLocalNamespace({'a': 1, 'b': 2}, {'a': 3}) - ns['a'] - #> 3 - ns['b'] - #> 2 - ``` - """ - - def __init__(self, *namespaces: MappingNamespace) -> None: - self._namespaces = namespaces - - @cached_property - def data(self) -> dict[str, Any]: - return {k: v for ns in self._namespaces for k, v in ns.items()} - - def __len__(self) -> int: - return len(self.data) - - def __getitem__(self, key: str) -> Any: - return self.data[key] - - def __contains__(self, key: object) -> bool: - return key in self.data - - def __iter__(self) -> Iterator[str]: - return iter(self.data) - - -def ns_for_function(obj: Callable[..., Any], parent_namespace: MappingNamespace | None = None) -> NamespacesTuple: - """Return the global and local namespaces to be used when evaluating annotations for the provided function. - - The global namespace will be the `__dict__` attribute of the module the function was defined in. - The local namespace will contain the `__type_params__` introduced by PEP 695. - - Args: - obj: The object to use when building namespaces. - parent_namespace: Optional namespace to be added with the lowest priority in the local namespace. - If the passed function is a method, the `parent_namespace` will be the namespace of the class - the method is defined in. Thus, we also fetch type `__type_params__` from there (i.e. the - class-scoped type variables). - """ - locals_list: list[MappingNamespace] = [] - if parent_namespace is not None: - locals_list.append(parent_namespace) - - # Get the `__type_params__` attribute introduced by PEP 695. - # Note that the `typing._eval_type` function expects type params to be - # passed as a separate argument. However, internally, `_eval_type` calls - # `ForwardRef._evaluate` which will merge type params with the localns, - # essentially mimicking what we do here. - type_params: tuple[_TypeVarLike, ...] = getattr(obj, '__type_params__', ()) - if parent_namespace is not None: - # We also fetch type params from the parent namespace. If present, it probably - # means the function was defined in a class. This is to support the following: - # https://github.com/python/cpython/issues/124089. - type_params += parent_namespace.get('__type_params__', ()) - - locals_list.append({t.__name__: t for t in type_params}) - - # What about short-circuiting to `obj.__globals__`? - globalns = get_module_ns_of(obj) - - return NamespacesTuple(globalns, LazyLocalNamespace(*locals_list)) - - -class NsResolver: - """A class responsible for the namespaces resolving logic for annotations evaluation. - - This class handles the namespace logic when evaluating annotations mainly for class objects. - - It holds a stack of classes that are being inspected during the core schema building, - and the `types_namespace` property exposes the globals and locals to be used for - type annotation evaluation. Additionally -- if no class is present in the stack -- a - fallback globals and locals can be provided using the `namespaces_tuple` argument - (this is useful when generating a schema for a simple annotation, e.g. when using - `TypeAdapter`). - - The namespace creation logic is unfortunately flawed in some cases, for backwards - compatibility reasons and to better support valid edge cases. See the description - for the `parent_namespace` argument and the example for more details. - - Args: - namespaces_tuple: The default globals and locals to use if no class is present - on the stack. This can be useful when using the `GenerateSchema` class - with `TypeAdapter`, where the "type" being analyzed is a simple annotation. - parent_namespace: An optional parent namespace that will be added to the locals - with the lowest priority. For a given class defined in a function, the locals - of this function are usually used as the parent namespace: - - ```python {lint="skip" test="skip"} - from pydantic import BaseModel - - def func() -> None: - SomeType = int - - class Model(BaseModel): - f: 'SomeType' - - # when collecting fields, an namespace resolver instance will be created - # this way: - # ns_resolver = NsResolver(parent_namespace={'SomeType': SomeType}) - ``` - - For backwards compatibility reasons and to support valid edge cases, this parent - namespace will be used for *every* type being pushed to the stack. In the future, - we might want to be smarter by only doing so when the type being pushed is defined - in the same module as the parent namespace. - - Example: - ```python {lint="skip" test="skip"} - ns_resolver = NsResolver( - parent_namespace={'fallback': 1}, - ) - - class Sub: - m: 'Model' - - class Model: - some_local = 1 - sub: Sub - - ns_resolver = NsResolver() - - # This is roughly what happens when we build a core schema for `Model`: - with ns_resolver.push(Model): - ns_resolver.types_namespace - #> NamespacesTuple({'Sub': Sub}, {'Model': Model, 'some_local': 1}) - # First thing to notice here, the model being pushed is added to the locals. - # Because `NsResolver` is being used during the model definition, it is not - # yet added to the globals. This is useful when resolving self-referencing annotations. - - with ns_resolver.push(Sub): - ns_resolver.types_namespace - #> NamespacesTuple({'Sub': Sub}, {'Sub': Sub, 'Model': Model}) - # Second thing to notice: `Sub` is present in both the globals and locals. - # This is not an issue, just that as described above, the model being pushed - # is added to the locals, but it happens to be present in the globals as well - # because it is already defined. - # Third thing to notice: `Model` is also added in locals. This is a backwards - # compatibility workaround that allows for `Sub` to be able to resolve `'Model'` - # correctly (as otherwise models would have to be rebuilt even though this - # doesn't look necessary). - ``` - """ - - def __init__( - self, - namespaces_tuple: NamespacesTuple | None = None, - parent_namespace: MappingNamespace | None = None, - ) -> None: - self._base_ns_tuple = namespaces_tuple or NamespacesTuple({}, {}) - self._parent_ns = parent_namespace - self._types_stack: list[type[Any] | TypeAliasType] = [] - - @cached_property - def types_namespace(self) -> NamespacesTuple: - """The current global and local namespaces to be used for annotations evaluation.""" - if not self._types_stack: - # TODO: should we merge the parent namespace here? - # This is relevant for TypeAdapter, where there are no types on the stack, and we might - # need access to the parent_ns. Right now, we sidestep this in `type_adapter.py` by passing - # locals to both parent_ns and the base_ns_tuple, but this is a bit hacky. - # we might consider something like: - # if self._parent_ns is not None: - # # Hacky workarounds, see class docstring: - # # An optional parent namespace that will be added to the locals with the lowest priority - # locals_list: list[MappingNamespace] = [self._parent_ns, self._base_ns_tuple.locals] - # return NamespacesTuple(self._base_ns_tuple.globals, LazyLocalNamespace(*locals_list)) - return self._base_ns_tuple - - typ = self._types_stack[-1] - - globalns = get_module_ns_of(typ) - - locals_list: list[MappingNamespace] = [] - # Hacky workarounds, see class docstring: - # An optional parent namespace that will be added to the locals with the lowest priority - if self._parent_ns is not None: - locals_list.append(self._parent_ns) - if len(self._types_stack) > 1: - first_type = self._types_stack[0] - locals_list.append({first_type.__name__: first_type}) - - # Adding `__type_params__` *before* `vars(typ)`, as the latter takes priority - # (see https://github.com/python/cpython/pull/120272). - # TODO `typ.__type_params__` when we drop support for Python 3.11: - type_params: tuple[_TypeVarLike, ...] = getattr(typ, '__type_params__', ()) - if type_params: - # Adding `__type_params__` is mostly useful for generic classes defined using - # PEP 695 syntax *and* using forward annotations (see the example in - # https://github.com/python/cpython/issues/114053). For TypeAliasType instances, - # it is way less common, but still required if using a string annotation in the alias - # value, e.g. `type A[T] = 'T'` (which is not necessary in most cases). - locals_list.append({t.__name__: t for t in type_params}) - - # TypeAliasType instances don't have a `__dict__` attribute, so the check - # is necessary: - if hasattr(typ, '__dict__'): - locals_list.append(vars(typ)) - - # The `len(self._types_stack) > 1` check above prevents this from being added twice: - locals_list.append({typ.__name__: typ}) - - return NamespacesTuple(globalns, LazyLocalNamespace(*locals_list)) - - @contextmanager - def push(self, typ: type[Any] | TypeAliasType, /) -> Generator[None]: - """Push a type to the stack.""" - self._types_stack.append(typ) - # Reset the cached property: - self.__dict__.pop('types_namespace', None) - try: - yield - finally: - self._types_stack.pop() - self.__dict__.pop('types_namespace', None) diff --git a/Backend/venv/lib/python3.12/site-packages/pydantic/_internal/_repr.py b/Backend/venv/lib/python3.12/site-packages/pydantic/_internal/_repr.py index 7e80a9c8..c8bb9ec9 100644 --- a/Backend/venv/lib/python3.12/site-packages/pydantic/_internal/_repr.py +++ b/Backend/venv/lib/python3.12/site-packages/pydantic/_internal/_repr.py @@ -1,22 +1,19 @@ """Tools to provide pretty/human-readable display of objects.""" - from __future__ import annotations as _annotations import types -from collections.abc import Callable, Collection, Generator, Iterable -from typing import TYPE_CHECKING, Any, ForwardRef, cast +import typing +from typing import Any import typing_extensions -from typing_extensions import TypeAlias -from typing_inspection import typing_objects -from typing_inspection.introspection import is_union_origin from . import _typing_extra -if TYPE_CHECKING: - # TODO remove type error comments when we drop support for Python 3.9 - ReprArgs: TypeAlias = Iterable[tuple[str | None, Any]] # pyright: ignore[reportGeneralTypeIssues] - RichReprResult: TypeAlias = Iterable[Any | tuple[Any] | tuple[str, Any] | tuple[str, Any, Any]] # pyright: ignore[reportGeneralTypeIssues] +if typing.TYPE_CHECKING: + ReprArgs: typing_extensions.TypeAlias = 'typing.Iterable[tuple[str | None, Any]]' + RichReprResult: typing_extensions.TypeAlias = ( + 'typing.Iterable[Any | tuple[Any] | tuple[str, Any] | tuple[str, Any, Any]]' + ) class PlainRepr(str): @@ -34,7 +31,8 @@ class Representation: # `__rich_repr__` is used by [rich](https://rich.readthedocs.io/en/stable/pretty.html). # (this is not a docstring to avoid adding a docstring to classes which inherit from Representation) - __slots__ = () + # we don't want to use a type annotation here as it can break get_type_hints + __slots__ = tuple() # type: typing.Collection[str] def __repr_args__(self) -> ReprArgs: """Returns the attributes to show in __str__, __repr__, and __pretty__ this is generally overridden. @@ -43,25 +41,20 @@ class Representation: * name - value pairs, e.g.: `[('foo_name', 'foo'), ('bar_name', ['b', 'a', 'r'])]` * or, just values, e.g.: `[(None, 'foo'), (None, ['b', 'a', 'r'])]` """ - attrs_names = cast(Collection[str], self.__slots__) + attrs_names = self.__slots__ if not attrs_names and hasattr(self, '__dict__'): attrs_names = self.__dict__.keys() attrs = ((s, getattr(self, s)) for s in attrs_names) - return [(a, v if v is not self else self.__repr_recursion__(v)) for a, v in attrs if v is not None] + return [(a, v) for a, v in attrs if v is not None] def __repr_name__(self) -> str: """Name of the instance's class, used in __repr__.""" return self.__class__.__name__ - def __repr_recursion__(self, object: Any) -> str: - """Returns the string representation of a recursive object.""" - # This is copied over from the stdlib `pprint` module: - return f'' - def __repr_str__(self, join_str: str) -> str: return join_str.join(repr(v) if a is None else f'{a}={v!r}' for a, v in self.__repr_args__()) - def __pretty__(self, fmt: Callable[[Any], Any], **kwargs: Any) -> Generator[Any]: + def __pretty__(self, fmt: typing.Callable[[Any], Any], **kwargs: Any) -> typing.Generator[Any, None, None]: """Used by devtools (https://python-devtools.helpmanual.io/) to pretty print objects.""" yield self.__repr_name__() + '(' yield 1 @@ -94,30 +87,28 @@ def display_as_type(obj: Any) -> str: Takes some logic from `typing._type_repr`. """ - if isinstance(obj, (types.FunctionType, types.BuiltinFunctionType)): + if isinstance(obj, types.FunctionType): return obj.__name__ elif obj is ...: return '...' elif isinstance(obj, Representation): return repr(obj) - elif isinstance(obj, ForwardRef) or typing_objects.is_typealiastype(obj): - return str(obj) if not isinstance(obj, (_typing_extra.typing_base, _typing_extra.WithArgsTypes, type)): obj = obj.__class__ - if is_union_origin(typing_extensions.get_origin(obj)): + if _typing_extra.origin_is_union(typing_extensions.get_origin(obj)): args = ', '.join(map(display_as_type, typing_extensions.get_args(obj))) return f'Union[{args}]' elif isinstance(obj, _typing_extra.WithArgsTypes): - if typing_objects.is_literal(typing_extensions.get_origin(obj)): + if typing_extensions.get_origin(obj) == typing_extensions.Literal: args = ', '.join(map(repr, typing_extensions.get_args(obj))) else: args = ', '.join(map(display_as_type, typing_extensions.get_args(obj))) try: return f'{obj.__qualname__}[{args}]' except AttributeError: - return str(obj).replace('typing.', '').replace('typing_extensions.', '') # handles TypeAliasType in 3.12 + return str(obj) # handles TypeAliasType in 3.12 elif isinstance(obj, type): return obj.__qualname__ else: diff --git a/Backend/venv/lib/python3.12/site-packages/pydantic/_internal/_schema_gather.py b/Backend/venv/lib/python3.12/site-packages/pydantic/_internal/_schema_gather.py deleted file mode 100644 index fc2d806e..00000000 --- a/Backend/venv/lib/python3.12/site-packages/pydantic/_internal/_schema_gather.py +++ /dev/null @@ -1,209 +0,0 @@ -# pyright: reportTypedDictNotRequiredAccess=false, reportGeneralTypeIssues=false, reportArgumentType=false, reportAttributeAccessIssue=false -from __future__ import annotations - -from dataclasses import dataclass, field -from typing import TypedDict - -from pydantic_core.core_schema import ComputedField, CoreSchema, DefinitionReferenceSchema, SerSchema -from typing_extensions import TypeAlias - -AllSchemas: TypeAlias = 'CoreSchema | SerSchema | ComputedField' - - -class GatherResult(TypedDict): - """Schema traversing result.""" - - collected_references: dict[str, DefinitionReferenceSchema | None] - """The collected definition references. - - If a definition reference schema can be inlined, it means that there is - only one in the whole core schema. As such, it is stored as the value. - Otherwise, the value is set to `None`. - """ - - deferred_discriminator_schemas: list[CoreSchema] - """The list of core schemas having the discriminator application deferred.""" - - -class MissingDefinitionError(LookupError): - """A reference was pointing to a non-existing core schema.""" - - def __init__(self, schema_reference: str, /) -> None: - self.schema_reference = schema_reference - - -@dataclass -class GatherContext: - """The current context used during core schema traversing. - - Context instances should only be used during schema traversing. - """ - - definitions: dict[str, CoreSchema] - """The available definitions.""" - - deferred_discriminator_schemas: list[CoreSchema] = field(init=False, default_factory=list) - """The list of core schemas having the discriminator application deferred. - - Internally, these core schemas have a specific key set in the core metadata dict. - """ - - collected_references: dict[str, DefinitionReferenceSchema | None] = field(init=False, default_factory=dict) - """The collected definition references. - - If a definition reference schema can be inlined, it means that there is - only one in the whole core schema. As such, it is stored as the value. - Otherwise, the value is set to `None`. - - During schema traversing, definition reference schemas can be added as candidates, or removed - (by setting the value to `None`). - """ - - -def traverse_metadata(schema: AllSchemas, ctx: GatherContext) -> None: - meta = schema.get('metadata') - if meta is not None and 'pydantic_internal_union_discriminator' in meta: - ctx.deferred_discriminator_schemas.append(schema) # pyright: ignore[reportArgumentType] - - -def traverse_definition_ref(def_ref_schema: DefinitionReferenceSchema, ctx: GatherContext) -> None: - schema_ref = def_ref_schema['schema_ref'] - - if schema_ref not in ctx.collected_references: - definition = ctx.definitions.get(schema_ref) - if definition is None: - raise MissingDefinitionError(schema_ref) - - # The `'definition-ref'` schema was only encountered once, make it - # a candidate to be inlined: - ctx.collected_references[schema_ref] = def_ref_schema - traverse_schema(definition, ctx) - if 'serialization' in def_ref_schema: - traverse_schema(def_ref_schema['serialization'], ctx) - traverse_metadata(def_ref_schema, ctx) - else: - # The `'definition-ref'` schema was already encountered, meaning - # the previously encountered schema (and this one) can't be inlined: - ctx.collected_references[schema_ref] = None - - -def traverse_schema(schema: AllSchemas, context: GatherContext) -> None: - # TODO When we drop 3.9, use a match statement to get better type checking and remove - # file-level type ignore. - # (the `'type'` could also be fetched in every `if/elif` statement, but this alters performance). - schema_type = schema['type'] - - if schema_type == 'definition-ref': - traverse_definition_ref(schema, context) - # `traverse_definition_ref` handles the possible serialization and metadata schemas: - return - elif schema_type == 'definitions': - traverse_schema(schema['schema'], context) - for definition in schema['definitions']: - traverse_schema(definition, context) - elif schema_type in {'list', 'set', 'frozenset', 'generator'}: - if 'items_schema' in schema: - traverse_schema(schema['items_schema'], context) - elif schema_type == 'tuple': - if 'items_schema' in schema: - for s in schema['items_schema']: - traverse_schema(s, context) - elif schema_type == 'dict': - if 'keys_schema' in schema: - traverse_schema(schema['keys_schema'], context) - if 'values_schema' in schema: - traverse_schema(schema['values_schema'], context) - elif schema_type == 'union': - for choice in schema['choices']: - if isinstance(choice, tuple): - traverse_schema(choice[0], context) - else: - traverse_schema(choice, context) - elif schema_type == 'tagged-union': - for v in schema['choices'].values(): - traverse_schema(v, context) - elif schema_type == 'chain': - for step in schema['steps']: - traverse_schema(step, context) - elif schema_type == 'lax-or-strict': - traverse_schema(schema['lax_schema'], context) - traverse_schema(schema['strict_schema'], context) - elif schema_type == 'json-or-python': - traverse_schema(schema['json_schema'], context) - traverse_schema(schema['python_schema'], context) - elif schema_type in {'model-fields', 'typed-dict'}: - if 'extras_schema' in schema: - traverse_schema(schema['extras_schema'], context) - if 'computed_fields' in schema: - for s in schema['computed_fields']: - traverse_schema(s, context) - for s in schema['fields'].values(): - traverse_schema(s, context) - elif schema_type == 'dataclass-args': - if 'computed_fields' in schema: - for s in schema['computed_fields']: - traverse_schema(s, context) - for s in schema['fields']: - traverse_schema(s, context) - elif schema_type == 'arguments': - for s in schema['arguments_schema']: - traverse_schema(s['schema'], context) - if 'var_args_schema' in schema: - traverse_schema(schema['var_args_schema'], context) - if 'var_kwargs_schema' in schema: - traverse_schema(schema['var_kwargs_schema'], context) - elif schema_type == 'arguments-v3': - for s in schema['arguments_schema']: - traverse_schema(s['schema'], context) - elif schema_type == 'call': - traverse_schema(schema['arguments_schema'], context) - if 'return_schema' in schema: - traverse_schema(schema['return_schema'], context) - elif schema_type == 'computed-field': - traverse_schema(schema['return_schema'], context) - elif schema_type == 'function-before': - if 'schema' in schema: - traverse_schema(schema['schema'], context) - if 'json_schema_input_schema' in schema: - traverse_schema(schema['json_schema_input_schema'], context) - elif schema_type == 'function-plain': - # TODO duplicate schema types for serializers and validators, needs to be deduplicated. - if 'return_schema' in schema: - traverse_schema(schema['return_schema'], context) - if 'json_schema_input_schema' in schema: - traverse_schema(schema['json_schema_input_schema'], context) - elif schema_type == 'function-wrap': - # TODO duplicate schema types for serializers and validators, needs to be deduplicated. - if 'return_schema' in schema: - traverse_schema(schema['return_schema'], context) - if 'schema' in schema: - traverse_schema(schema['schema'], context) - if 'json_schema_input_schema' in schema: - traverse_schema(schema['json_schema_input_schema'], context) - else: - if 'schema' in schema: - traverse_schema(schema['schema'], context) - - if 'serialization' in schema: - traverse_schema(schema['serialization'], context) - traverse_metadata(schema, context) - - -def gather_schemas_for_cleaning(schema: CoreSchema, definitions: dict[str, CoreSchema]) -> GatherResult: - """Traverse the core schema and definitions and return the necessary information for schema cleaning. - - During the core schema traversing, any `'definition-ref'` schema is: - - - Validated: the reference must point to an existing definition. If this is not the case, a - `MissingDefinitionError` exception is raised. - - Stored in the context: the actual reference is stored in the context. Depending on whether - the `'definition-ref'` schema is encountered more that once, the schema itself is also - saved in the context to be inlined (i.e. replaced by the definition it points to). - """ - context = GatherContext(definitions) - traverse_schema(schema, context) - - return { - 'collected_references': context.collected_references, - 'deferred_discriminator_schemas': context.deferred_discriminator_schemas, - } diff --git a/Backend/venv/lib/python3.12/site-packages/pydantic/_internal/_schema_generation_shared.py b/Backend/venv/lib/python3.12/site-packages/pydantic/_internal/_schema_generation_shared.py index b231a82e..1a9aa852 100644 --- a/Backend/venv/lib/python3.12/site-packages/pydantic/_internal/_schema_generation_shared.py +++ b/Backend/venv/lib/python3.12/site-packages/pydantic/_internal/_schema_generation_shared.py @@ -1,10 +1,10 @@ """Types and utility functions used by various other internal tools.""" - from __future__ import annotations -from typing import TYPE_CHECKING, Any, Callable, Literal +from typing import TYPE_CHECKING, Any, Callable from pydantic_core import core_schema +from typing_extensions import Literal from ..annotated_handlers import GetCoreSchemaHandler, GetJsonSchemaHandler @@ -12,7 +12,6 @@ if TYPE_CHECKING: from ..json_schema import GenerateJsonSchema, JsonSchemaValue from ._core_utils import CoreSchemaOrField from ._generate_schema import GenerateSchema - from ._namespace_utils import NamespacesTuple GetJsonSchemaFunction = Callable[[CoreSchemaOrField, GetJsonSchemaHandler], JsonSchemaValue] HandlerOverride = Callable[[CoreSchemaOrField], JsonSchemaValue] @@ -33,8 +32,8 @@ class GenerateJsonSchemaHandler(GetJsonSchemaHandler): self.handler = handler_override or generate_json_schema.generate_inner self.mode = generate_json_schema.mode - def __call__(self, core_schema: CoreSchemaOrField, /) -> JsonSchemaValue: - return self.handler(core_schema) + def __call__(self, __core_schema: CoreSchemaOrField) -> JsonSchemaValue: + return self.handler(__core_schema) def resolve_ref_schema(self, maybe_ref_json_schema: JsonSchemaValue) -> JsonSchemaValue: """Resolves `$ref` in the json schema. @@ -79,21 +78,22 @@ class CallbackGetCoreSchemaHandler(GetCoreSchemaHandler): self._generate_schema = generate_schema self._ref_mode = ref_mode - def __call__(self, source_type: Any, /) -> core_schema.CoreSchema: - schema = self._handler(source_type) + def __call__(self, __source_type: Any) -> core_schema.CoreSchema: + schema = self._handler(__source_type) + ref = schema.get('ref') if self._ref_mode == 'to-def': - ref = schema.get('ref') if ref is not None: - return self._generate_schema.defs.create_definition_reference_schema(schema) + self._generate_schema.defs.definitions[ref] = schema + return core_schema.definition_reference_schema(ref) return schema - else: # ref_mode = 'unpack' + else: # ref_mode = 'unpack return self.resolve_ref_schema(schema) - def _get_types_namespace(self) -> NamespacesTuple: + def _get_types_namespace(self) -> dict[str, Any] | None: return self._generate_schema._types_namespace - def generate_schema(self, source_type: Any, /) -> core_schema.CoreSchema: - return self._generate_schema.generate_schema(source_type) + def generate_schema(self, __source_type: Any) -> core_schema.CoreSchema: + return self._generate_schema.generate_schema(__source_type) @property def field_name(self) -> str | None: @@ -113,13 +113,12 @@ class CallbackGetCoreSchemaHandler(GetCoreSchemaHandler): """ if maybe_ref_schema['type'] == 'definition-ref': ref = maybe_ref_schema['schema_ref'] - definition = self._generate_schema.defs.get_schema_from_ref(ref) - if definition is None: + if ref not in self._generate_schema.defs.definitions: raise LookupError( f'Could not find a ref for {ref}.' ' Maybe you tried to call resolve_ref_schema from within a recursive model?' ) - return definition + return self._generate_schema.defs.definitions[ref] elif maybe_ref_schema['type'] == 'definitions': return self.resolve_ref_schema(maybe_ref_schema['schema']) return maybe_ref_schema diff --git a/Backend/venv/lib/python3.12/site-packages/pydantic/_internal/_serializers.py b/Backend/venv/lib/python3.12/site-packages/pydantic/_internal/_serializers.py deleted file mode 100644 index a4058e00..00000000 --- a/Backend/venv/lib/python3.12/site-packages/pydantic/_internal/_serializers.py +++ /dev/null @@ -1,53 +0,0 @@ -from __future__ import annotations - -import collections -import collections.abc -import typing -from typing import Any - -from pydantic_core import PydanticOmit, core_schema - -SEQUENCE_ORIGIN_MAP: dict[Any, Any] = { - typing.Deque: collections.deque, # noqa: UP006 - collections.deque: collections.deque, - list: list, - typing.List: list, # noqa: UP006 - tuple: tuple, - typing.Tuple: tuple, # noqa: UP006 - set: set, - typing.AbstractSet: set, - typing.Set: set, # noqa: UP006 - frozenset: frozenset, - typing.FrozenSet: frozenset, # noqa: UP006 - typing.Sequence: list, - typing.MutableSequence: list, - typing.MutableSet: set, - # this doesn't handle subclasses of these - # parametrized typing.Set creates one of these - collections.abc.MutableSet: set, - collections.abc.Set: frozenset, -} - - -def serialize_sequence_via_list( - v: Any, handler: core_schema.SerializerFunctionWrapHandler, info: core_schema.SerializationInfo -) -> Any: - items: list[Any] = [] - - mapped_origin = SEQUENCE_ORIGIN_MAP.get(type(v), None) - if mapped_origin is None: - # we shouldn't hit this branch, should probably add a serialization error or something - return v - - for index, item in enumerate(v): - try: - v = handler(item, index) - except PydanticOmit: # noqa: PERF203 - pass - else: - items.append(v) - - if info.mode_is_json(): - return items - else: - return mapped_origin(items) diff --git a/Backend/venv/lib/python3.12/site-packages/pydantic/_internal/_signature.py b/Backend/venv/lib/python3.12/site-packages/pydantic/_internal/_signature.py deleted file mode 100644 index 977e5d29..00000000 --- a/Backend/venv/lib/python3.12/site-packages/pydantic/_internal/_signature.py +++ /dev/null @@ -1,188 +0,0 @@ -from __future__ import annotations - -import dataclasses -from inspect import Parameter, Signature, signature -from typing import TYPE_CHECKING, Any, Callable - -from pydantic_core import PydanticUndefined - -from ._utils import is_valid_identifier - -if TYPE_CHECKING: - from ..config import ExtraValues - from ..fields import FieldInfo - - -# Copied over from stdlib dataclasses -class _HAS_DEFAULT_FACTORY_CLASS: - def __repr__(self): - return '' - - -_HAS_DEFAULT_FACTORY = _HAS_DEFAULT_FACTORY_CLASS() - - -def _field_name_for_signature(field_name: str, field_info: FieldInfo) -> str: - """Extract the correct name to use for the field when generating a signature. - - Assuming the field has a valid alias, this will return the alias. Otherwise, it will return the field name. - First priority is given to the alias, then the validation_alias, then the field name. - - Args: - field_name: The name of the field - field_info: The corresponding FieldInfo object. - - Returns: - The correct name to use when generating a signature. - """ - if isinstance(field_info.alias, str) and is_valid_identifier(field_info.alias): - return field_info.alias - if isinstance(field_info.validation_alias, str) and is_valid_identifier(field_info.validation_alias): - return field_info.validation_alias - - return field_name - - -def _process_param_defaults(param: Parameter) -> Parameter: - """Modify the signature for a parameter in a dataclass where the default value is a FieldInfo instance. - - Args: - param (Parameter): The parameter - - Returns: - Parameter: The custom processed parameter - """ - from ..fields import FieldInfo - - param_default = param.default - if isinstance(param_default, FieldInfo): - annotation = param.annotation - # Replace the annotation if appropriate - # inspect does "clever" things to show annotations as strings because we have - # `from __future__ import annotations` in main, we don't want that - if annotation == 'Any': - annotation = Any - - # Replace the field default - default = param_default.default - if default is PydanticUndefined: - if param_default.default_factory is PydanticUndefined: - default = Signature.empty - else: - # this is used by dataclasses to indicate a factory exists: - default = dataclasses._HAS_DEFAULT_FACTORY # type: ignore - return param.replace( - annotation=annotation, name=_field_name_for_signature(param.name, param_default), default=default - ) - return param - - -def _generate_signature_parameters( # noqa: C901 (ignore complexity, could use a refactor) - init: Callable[..., None], - fields: dict[str, FieldInfo], - validate_by_name: bool, - extra: ExtraValues | None, -) -> dict[str, Parameter]: - """Generate a mapping of parameter names to Parameter objects for a pydantic BaseModel or dataclass.""" - from itertools import islice - - present_params = signature(init).parameters.values() - merged_params: dict[str, Parameter] = {} - var_kw = None - use_var_kw = False - - for param in islice(present_params, 1, None): # skip self arg - # inspect does "clever" things to show annotations as strings because we have - # `from __future__ import annotations` in main, we don't want that - if fields.get(param.name): - # exclude params with init=False - if getattr(fields[param.name], 'init', True) is False: - continue - param = param.replace(name=_field_name_for_signature(param.name, fields[param.name])) - if param.annotation == 'Any': - param = param.replace(annotation=Any) - if param.kind is param.VAR_KEYWORD: - var_kw = param - continue - merged_params[param.name] = param - - if var_kw: # if custom init has no var_kw, fields which are not declared in it cannot be passed through - allow_names = validate_by_name - for field_name, field in fields.items(): - # when alias is a str it should be used for signature generation - param_name = _field_name_for_signature(field_name, field) - - if field_name in merged_params or param_name in merged_params: - continue - - if not is_valid_identifier(param_name): - if allow_names: - param_name = field_name - else: - use_var_kw = True - continue - - if field.is_required(): - default = Parameter.empty - elif field.default_factory is not None: - # Mimics stdlib dataclasses: - default = _HAS_DEFAULT_FACTORY - else: - default = field.default - merged_params[param_name] = Parameter( - param_name, - Parameter.KEYWORD_ONLY, - annotation=field.rebuild_annotation(), - default=default, - ) - - if extra == 'allow': - use_var_kw = True - - if var_kw and use_var_kw: - # Make sure the parameter for extra kwargs - # does not have the same name as a field - default_model_signature = [ - ('self', Parameter.POSITIONAL_ONLY), - ('data', Parameter.VAR_KEYWORD), - ] - if [(p.name, p.kind) for p in present_params] == default_model_signature: - # if this is the standard model signature, use extra_data as the extra args name - var_kw_name = 'extra_data' - else: - # else start from var_kw - var_kw_name = var_kw.name - - # generate a name that's definitely unique - while var_kw_name in fields: - var_kw_name += '_' - merged_params[var_kw_name] = var_kw.replace(name=var_kw_name) - - return merged_params - - -def generate_pydantic_signature( - init: Callable[..., None], - fields: dict[str, FieldInfo], - validate_by_name: bool, - extra: ExtraValues | None, - is_dataclass: bool = False, -) -> Signature: - """Generate signature for a pydantic BaseModel or dataclass. - - Args: - init: The class init. - fields: The model fields. - validate_by_name: The `validate_by_name` value of the config. - extra: The `extra` value of the config. - is_dataclass: Whether the model is a dataclass. - - Returns: - The dataclass/BaseModel subclass signature. - """ - merged_params = _generate_signature_parameters(init, fields, validate_by_name, extra) - - if is_dataclass: - merged_params = {k: _process_param_defaults(v) for k, v in merged_params.items()} - - return Signature(parameters=list(merged_params.values()), return_annotation=None) diff --git a/Backend/venv/lib/python3.12/site-packages/pydantic/_internal/_std_types_schema.py b/Backend/venv/lib/python3.12/site-packages/pydantic/_internal/_std_types_schema.py new file mode 100644 index 00000000..c8523bf4 --- /dev/null +++ b/Backend/venv/lib/python3.12/site-packages/pydantic/_internal/_std_types_schema.py @@ -0,0 +1,714 @@ +"""Logic for generating pydantic-core schemas for standard library types. + +Import of this module is deferred since it contains imports of many standard library modules. +""" +from __future__ import annotations as _annotations + +import collections +import collections.abc +import dataclasses +import decimal +import inspect +import os +import typing +from enum import Enum +from functools import partial +from ipaddress import IPv4Address, IPv4Interface, IPv4Network, IPv6Address, IPv6Interface, IPv6Network +from typing import Any, Callable, Iterable, TypeVar + +import typing_extensions +from pydantic_core import ( + CoreSchema, + MultiHostUrl, + PydanticCustomError, + PydanticOmit, + Url, + core_schema, +) +from typing_extensions import get_args, get_origin + +from pydantic.errors import PydanticSchemaGenerationError +from pydantic.fields import FieldInfo +from pydantic.types import Strict + +from ..config import ConfigDict +from ..json_schema import JsonSchemaValue, update_json_schema +from . import _known_annotated_metadata, _typing_extra, _validators +from ._core_utils import get_type_ref +from ._internal_dataclass import slots_true +from ._schema_generation_shared import GetCoreSchemaHandler, GetJsonSchemaHandler + +if typing.TYPE_CHECKING: + from ._generate_schema import GenerateSchema + + StdSchemaFunction = Callable[[GenerateSchema, type[Any]], core_schema.CoreSchema] + + +@dataclasses.dataclass(**slots_true) +class SchemaTransformer: + get_core_schema: Callable[[Any, GetCoreSchemaHandler], CoreSchema] + get_json_schema: Callable[[CoreSchema, GetJsonSchemaHandler], JsonSchemaValue] + + def __get_pydantic_core_schema__(self, source_type: Any, handler: GetCoreSchemaHandler) -> CoreSchema: + return self.get_core_schema(source_type, handler) + + def __get_pydantic_json_schema__(self, schema: CoreSchema, handler: GetJsonSchemaHandler) -> JsonSchemaValue: + return self.get_json_schema(schema, handler) + + +def get_enum_core_schema(enum_type: type[Enum], config: ConfigDict) -> CoreSchema: + cases: list[Any] = list(enum_type.__members__.values()) + + enum_ref = get_type_ref(enum_type) + description = None if not enum_type.__doc__ else inspect.cleandoc(enum_type.__doc__) + if description == 'An enumeration.': # This is the default value provided by enum.EnumMeta.__new__; don't use it + description = None + updates = {'title': enum_type.__name__, 'description': description} + updates = {k: v for k, v in updates.items() if v is not None} + + def get_json_schema(_, handler: GetJsonSchemaHandler) -> JsonSchemaValue: + json_schema = handler(core_schema.literal_schema([x.value for x in cases], ref=enum_ref)) + original_schema = handler.resolve_ref_schema(json_schema) + update_json_schema(original_schema, updates) + return json_schema + + if not cases: + # Use an isinstance check for enums with no cases. + # The most important use case for this is creating TypeVar bounds for generics that should + # be restricted to enums. This is more consistent than it might seem at first, since you can only + # subclass enum.Enum (or subclasses of enum.Enum) if all parent classes have no cases. + # We use the get_json_schema function when an Enum subclass has been declared with no cases + # so that we can still generate a valid json schema. + return core_schema.is_instance_schema(enum_type, metadata={'pydantic_js_functions': [get_json_schema]}) + + use_enum_values = config.get('use_enum_values', False) + + if len(cases) == 1: + expected = repr(cases[0].value) + else: + expected = ', '.join([repr(case.value) for case in cases[:-1]]) + f' or {cases[-1].value!r}' + + def to_enum(__input_value: Any) -> Enum: + try: + enum_field = enum_type(__input_value) + if use_enum_values: + return enum_field.value + return enum_field + except ValueError: + # The type: ignore on the next line is to ignore the requirement of LiteralString + raise PydanticCustomError('enum', f'Input should be {expected}', {'expected': expected}) # type: ignore + + strict_python_schema = core_schema.is_instance_schema(enum_type) + if use_enum_values: + strict_python_schema = core_schema.chain_schema( + [strict_python_schema, core_schema.no_info_plain_validator_function(lambda x: x.value)] + ) + + to_enum_validator = core_schema.no_info_plain_validator_function(to_enum) + if issubclass(enum_type, int): + # this handles `IntEnum`, and also `Foobar(int, Enum)` + updates['type'] = 'integer' + lax = core_schema.chain_schema([core_schema.int_schema(), to_enum_validator]) + # Disallow float from JSON due to strict mode + strict = core_schema.json_or_python_schema( + json_schema=core_schema.no_info_after_validator_function(to_enum, core_schema.int_schema()), + python_schema=strict_python_schema, + ) + elif issubclass(enum_type, str): + # this handles `StrEnum` (3.11 only), and also `Foobar(str, Enum)` + updates['type'] = 'string' + lax = core_schema.chain_schema([core_schema.str_schema(), to_enum_validator]) + strict = core_schema.json_or_python_schema( + json_schema=core_schema.no_info_after_validator_function(to_enum, core_schema.str_schema()), + python_schema=strict_python_schema, + ) + elif issubclass(enum_type, float): + updates['type'] = 'numeric' + lax = core_schema.chain_schema([core_schema.float_schema(), to_enum_validator]) + strict = core_schema.json_or_python_schema( + json_schema=core_schema.no_info_after_validator_function(to_enum, core_schema.float_schema()), + python_schema=strict_python_schema, + ) + else: + lax = to_enum_validator + strict = core_schema.json_or_python_schema(json_schema=to_enum_validator, python_schema=strict_python_schema) + return core_schema.lax_or_strict_schema( + lax_schema=lax, strict_schema=strict, ref=enum_ref, metadata={'pydantic_js_functions': [get_json_schema]} + ) + + +@dataclasses.dataclass(**slots_true) +class InnerSchemaValidator: + """Use a fixed CoreSchema, avoiding interference from outward annotations.""" + + core_schema: CoreSchema + js_schema: JsonSchemaValue | None = None + js_core_schema: CoreSchema | None = None + js_schema_update: JsonSchemaValue | None = None + + def __get_pydantic_json_schema__(self, _schema: CoreSchema, handler: GetJsonSchemaHandler) -> JsonSchemaValue: + if self.js_schema is not None: + return self.js_schema + js_schema = handler(self.js_core_schema or self.core_schema) + if self.js_schema_update is not None: + js_schema.update(self.js_schema_update) + return js_schema + + def __get_pydantic_core_schema__(self, _source_type: Any, _handler: GetCoreSchemaHandler) -> CoreSchema: + return self.core_schema + + +def decimal_prepare_pydantic_annotations( + source: Any, annotations: Iterable[Any], config: ConfigDict +) -> tuple[Any, list[Any]] | None: + if source is not decimal.Decimal: + return None + + metadata, remaining_annotations = _known_annotated_metadata.collect_known_metadata(annotations) + + config_allow_inf_nan = config.get('allow_inf_nan') + if config_allow_inf_nan is not None: + metadata.setdefault('allow_inf_nan', config_allow_inf_nan) + + _known_annotated_metadata.check_metadata( + metadata, {*_known_annotated_metadata.FLOAT_CONSTRAINTS, 'max_digits', 'decimal_places'}, decimal.Decimal + ) + return source, [InnerSchemaValidator(core_schema.decimal_schema(**metadata)), *remaining_annotations] + + +def datetime_prepare_pydantic_annotations( + source_type: Any, annotations: Iterable[Any], _config: ConfigDict +) -> tuple[Any, list[Any]] | None: + import datetime + + metadata, remaining_annotations = _known_annotated_metadata.collect_known_metadata(annotations) + if source_type is datetime.date: + sv = InnerSchemaValidator(core_schema.date_schema(**metadata)) + elif source_type is datetime.datetime: + sv = InnerSchemaValidator(core_schema.datetime_schema(**metadata)) + elif source_type is datetime.time: + sv = InnerSchemaValidator(core_schema.time_schema(**metadata)) + elif source_type is datetime.timedelta: + sv = InnerSchemaValidator(core_schema.timedelta_schema(**metadata)) + else: + return None + # check now that we know the source type is correct + _known_annotated_metadata.check_metadata(metadata, _known_annotated_metadata.DATE_TIME_CONSTRAINTS, source_type) + return (source_type, [sv, *remaining_annotations]) + + +def uuid_prepare_pydantic_annotations( + source_type: Any, annotations: Iterable[Any], _config: ConfigDict +) -> tuple[Any, list[Any]] | None: + # UUIDs have no constraints - they are fixed length, constructing a UUID instance checks the length + + from uuid import UUID + + if source_type is not UUID: + return None + + return (source_type, [InnerSchemaValidator(core_schema.uuid_schema()), *annotations]) + + +def path_schema_prepare_pydantic_annotations( + source_type: Any, annotations: Iterable[Any], _config: ConfigDict +) -> tuple[Any, list[Any]] | None: + import pathlib + + if source_type not in { + os.PathLike, + pathlib.Path, + pathlib.PurePath, + pathlib.PosixPath, + pathlib.PurePosixPath, + pathlib.PureWindowsPath, + }: + return None + + metadata, remaining_annotations = _known_annotated_metadata.collect_known_metadata(annotations) + _known_annotated_metadata.check_metadata(metadata, _known_annotated_metadata.STR_CONSTRAINTS, source_type) + + construct_path = pathlib.PurePath if source_type is os.PathLike else source_type + + def path_validator(input_value: str) -> os.PathLike[Any]: + try: + return construct_path(input_value) + except TypeError as e: + raise PydanticCustomError('path_type', 'Input is not a valid path') from e + + constrained_str_schema = core_schema.str_schema(**metadata) + + instance_schema = core_schema.json_or_python_schema( + json_schema=core_schema.no_info_after_validator_function(path_validator, constrained_str_schema), + python_schema=core_schema.is_instance_schema(source_type), + ) + + strict: bool | None = None + for annotation in annotations: + if isinstance(annotation, Strict): + strict = annotation.strict + + schema = core_schema.lax_or_strict_schema( + lax_schema=core_schema.union_schema( + [ + instance_schema, + core_schema.no_info_after_validator_function(path_validator, constrained_str_schema), + ], + custom_error_type='path_type', + custom_error_message='Input is not a valid path', + strict=True, + ), + strict_schema=instance_schema, + serialization=core_schema.to_string_ser_schema(), + strict=strict, + ) + + return ( + source_type, + [ + InnerSchemaValidator(schema, js_core_schema=constrained_str_schema, js_schema_update={'format': 'path'}), + *remaining_annotations, + ], + ) + + +def dequeue_validator( + input_value: Any, handler: core_schema.ValidatorFunctionWrapHandler, maxlen: None | int +) -> collections.deque[Any]: + if isinstance(input_value, collections.deque): + maxlens = [v for v in (input_value.maxlen, maxlen) if v is not None] + if maxlens: + maxlen = min(maxlens) + return collections.deque(handler(input_value), maxlen=maxlen) + else: + return collections.deque(handler(input_value), maxlen=maxlen) + + +@dataclasses.dataclass(**slots_true) +class SequenceValidator: + mapped_origin: type[Any] + item_source_type: type[Any] + min_length: int | None = None + max_length: int | None = None + strict: bool = False + + def serialize_sequence_via_list( + self, v: Any, handler: core_schema.SerializerFunctionWrapHandler, info: core_schema.SerializationInfo + ) -> Any: + items: list[Any] = [] + for index, item in enumerate(v): + try: + v = handler(item, index) + except PydanticOmit: + pass + else: + items.append(v) + + if info.mode_is_json(): + return items + else: + return self.mapped_origin(items) + + def __get_pydantic_core_schema__(self, source_type: Any, handler: GetCoreSchemaHandler) -> CoreSchema: + if self.item_source_type is Any: + items_schema = None + else: + items_schema = handler.generate_schema(self.item_source_type) + + metadata = {'min_length': self.min_length, 'max_length': self.max_length, 'strict': self.strict} + + if self.mapped_origin in (list, set, frozenset): + if self.mapped_origin is list: + constrained_schema = core_schema.list_schema(items_schema, **metadata) + elif self.mapped_origin is set: + constrained_schema = core_schema.set_schema(items_schema, **metadata) + else: + assert self.mapped_origin is frozenset # safety check in case we forget to add a case + constrained_schema = core_schema.frozenset_schema(items_schema, **metadata) + + schema = constrained_schema + else: + # safety check in case we forget to add a case + assert self.mapped_origin in (collections.deque, collections.Counter) + + if self.mapped_origin is collections.deque: + # if we have a MaxLen annotation might as well set that as the default maxlen on the deque + # this lets us re-use existing metadata annotations to let users set the maxlen on a dequeue + # that e.g. comes from JSON + coerce_instance_wrap = partial( + core_schema.no_info_wrap_validator_function, + partial(dequeue_validator, maxlen=metadata.get('max_length', None)), + ) + else: + coerce_instance_wrap = partial(core_schema.no_info_after_validator_function, self.mapped_origin) + + constrained_schema = core_schema.list_schema(items_schema, **metadata) + + check_instance = core_schema.json_or_python_schema( + json_schema=core_schema.list_schema(), + python_schema=core_schema.is_instance_schema(self.mapped_origin), + ) + + serialization = core_schema.wrap_serializer_function_ser_schema( + self.serialize_sequence_via_list, schema=items_schema or core_schema.any_schema(), info_arg=True + ) + + strict = core_schema.chain_schema([check_instance, coerce_instance_wrap(constrained_schema)]) + + if metadata.get('strict', False): + schema = strict + else: + lax = coerce_instance_wrap(constrained_schema) + schema = core_schema.lax_or_strict_schema(lax_schema=lax, strict_schema=strict) + schema['serialization'] = serialization + + return schema + + +SEQUENCE_ORIGIN_MAP: dict[Any, Any] = { + typing.Deque: collections.deque, + collections.deque: collections.deque, + list: list, + typing.List: list, + set: set, + typing.AbstractSet: set, + typing.Set: set, + frozenset: frozenset, + typing.FrozenSet: frozenset, + typing.Sequence: list, + typing.MutableSequence: list, + typing.MutableSet: set, + # this doesn't handle subclasses of these + # parametrized typing.Set creates one of these + collections.abc.MutableSet: set, + collections.abc.Set: frozenset, +} + + +def identity(s: CoreSchema) -> CoreSchema: + return s + + +def sequence_like_prepare_pydantic_annotations( + source_type: Any, annotations: Iterable[Any], _config: ConfigDict +) -> tuple[Any, list[Any]] | None: + origin: Any = get_origin(source_type) + + mapped_origin = SEQUENCE_ORIGIN_MAP.get(origin, None) if origin else SEQUENCE_ORIGIN_MAP.get(source_type, None) + if mapped_origin is None: + return None + + args = get_args(source_type) + + if not args: + args = (Any,) + elif len(args) != 1: + raise ValueError('Expected sequence to have exactly 1 generic parameter') + + item_source_type = args[0] + + metadata, remaining_annotations = _known_annotated_metadata.collect_known_metadata(annotations) + _known_annotated_metadata.check_metadata(metadata, _known_annotated_metadata.SEQUENCE_CONSTRAINTS, source_type) + + return (source_type, [SequenceValidator(mapped_origin, item_source_type, **metadata), *remaining_annotations]) + + +MAPPING_ORIGIN_MAP: dict[Any, Any] = { + typing.DefaultDict: collections.defaultdict, + collections.defaultdict: collections.defaultdict, + collections.OrderedDict: collections.OrderedDict, + typing_extensions.OrderedDict: collections.OrderedDict, + dict: dict, + typing.Dict: dict, + collections.Counter: collections.Counter, + typing.Counter: collections.Counter, + # this doesn't handle subclasses of these + typing.Mapping: dict, + typing.MutableMapping: dict, + # parametrized typing.{Mutable}Mapping creates one of these + collections.abc.MutableMapping: dict, + collections.abc.Mapping: dict, +} + + +def defaultdict_validator( + input_value: Any, handler: core_schema.ValidatorFunctionWrapHandler, default_default_factory: Callable[[], Any] +) -> collections.defaultdict[Any, Any]: + if isinstance(input_value, collections.defaultdict): + default_factory = input_value.default_factory + return collections.defaultdict(default_factory, handler(input_value)) + else: + return collections.defaultdict(default_default_factory, handler(input_value)) + + +def get_defaultdict_default_default_factory(values_source_type: Any) -> Callable[[], Any]: + def infer_default() -> Callable[[], Any]: + allowed_default_types: dict[Any, Any] = { + typing.Tuple: tuple, + tuple: tuple, + collections.abc.Sequence: tuple, + collections.abc.MutableSequence: list, + typing.List: list, + list: list, + typing.Sequence: list, + typing.Set: set, + set: set, + typing.MutableSet: set, + collections.abc.MutableSet: set, + collections.abc.Set: frozenset, + typing.MutableMapping: dict, + typing.Mapping: dict, + collections.abc.Mapping: dict, + collections.abc.MutableMapping: dict, + float: float, + int: int, + str: str, + bool: bool, + } + values_type_origin = get_origin(values_source_type) or values_source_type + instructions = 'set using `DefaultDict[..., Annotated[..., Field(default_factory=...)]]`' + if isinstance(values_type_origin, TypeVar): + + def type_var_default_factory() -> None: + raise RuntimeError( + 'Generic defaultdict cannot be used without a concrete value type or an' + ' explicit default factory, ' + instructions + ) + + return type_var_default_factory + elif values_type_origin not in allowed_default_types: + # a somewhat subjective set of types that have reasonable default values + allowed_msg = ', '.join([t.__name__ for t in set(allowed_default_types.values())]) + raise PydanticSchemaGenerationError( + f'Unable to infer a default factory for keys of type {values_source_type}.' + f' Only {allowed_msg} are supported, other types require an explicit default factory' + ' ' + instructions + ) + return allowed_default_types[values_type_origin] + + # Assume Annotated[..., Field(...)] + if _typing_extra.is_annotated(values_source_type): + field_info = next((v for v in get_args(values_source_type) if isinstance(v, FieldInfo)), None) + else: + field_info = None + if field_info and field_info.default_factory: + default_default_factory = field_info.default_factory + else: + default_default_factory = infer_default() + return default_default_factory + + +@dataclasses.dataclass(**slots_true) +class MappingValidator: + mapped_origin: type[Any] + keys_source_type: type[Any] + values_source_type: type[Any] + min_length: int | None = None + max_length: int | None = None + strict: bool = False + + def serialize_mapping_via_dict(self, v: Any, handler: core_schema.SerializerFunctionWrapHandler) -> Any: + return handler(v) + + def __get_pydantic_core_schema__(self, source_type: Any, handler: GetCoreSchemaHandler) -> CoreSchema: + if self.keys_source_type is Any: + keys_schema = None + else: + keys_schema = handler.generate_schema(self.keys_source_type) + if self.values_source_type is Any: + values_schema = None + else: + values_schema = handler.generate_schema(self.values_source_type) + + metadata = {'min_length': self.min_length, 'max_length': self.max_length, 'strict': self.strict} + + if self.mapped_origin is dict: + schema = core_schema.dict_schema(keys_schema, values_schema, **metadata) + else: + constrained_schema = core_schema.dict_schema(keys_schema, values_schema, **metadata) + check_instance = core_schema.json_or_python_schema( + json_schema=core_schema.dict_schema(), + python_schema=core_schema.is_instance_schema(self.mapped_origin), + ) + + if self.mapped_origin is collections.defaultdict: + default_default_factory = get_defaultdict_default_default_factory(self.values_source_type) + coerce_instance_wrap = partial( + core_schema.no_info_wrap_validator_function, + partial(defaultdict_validator, default_default_factory=default_default_factory), + ) + else: + coerce_instance_wrap = partial(core_schema.no_info_after_validator_function, self.mapped_origin) + + serialization = core_schema.wrap_serializer_function_ser_schema( + self.serialize_mapping_via_dict, + schema=core_schema.dict_schema( + keys_schema or core_schema.any_schema(), values_schema or core_schema.any_schema() + ), + info_arg=False, + ) + + strict = core_schema.chain_schema([check_instance, coerce_instance_wrap(constrained_schema)]) + + if metadata.get('strict', False): + schema = strict + else: + lax = coerce_instance_wrap(constrained_schema) + schema = core_schema.lax_or_strict_schema(lax_schema=lax, strict_schema=strict) + schema['serialization'] = serialization + + return schema + + +def mapping_like_prepare_pydantic_annotations( + source_type: Any, annotations: Iterable[Any], _config: ConfigDict +) -> tuple[Any, list[Any]] | None: + origin: Any = get_origin(source_type) + + mapped_origin = MAPPING_ORIGIN_MAP.get(origin, None) if origin else MAPPING_ORIGIN_MAP.get(source_type, None) + if mapped_origin is None: + return None + + args = get_args(source_type) + + if not args: + args = (Any, Any) + elif mapped_origin is collections.Counter: + # a single generic + if len(args) != 1: + raise ValueError('Expected Counter to have exactly 1 generic parameter') + args = (args[0], int) # keys are always an int + elif len(args) != 2: + raise ValueError('Expected mapping to have exactly 2 generic parameters') + + keys_source_type, values_source_type = args + + metadata, remaining_annotations = _known_annotated_metadata.collect_known_metadata(annotations) + _known_annotated_metadata.check_metadata(metadata, _known_annotated_metadata.SEQUENCE_CONSTRAINTS, source_type) + + return ( + source_type, + [ + MappingValidator(mapped_origin, keys_source_type, values_source_type, **metadata), + *remaining_annotations, + ], + ) + + +def ip_prepare_pydantic_annotations( + source_type: Any, annotations: Iterable[Any], _config: ConfigDict +) -> tuple[Any, list[Any]] | None: + def make_strict_ip_schema(tp: type[Any]) -> CoreSchema: + return core_schema.json_or_python_schema( + json_schema=core_schema.no_info_after_validator_function(tp, core_schema.str_schema()), + python_schema=core_schema.is_instance_schema(tp), + ) + + if source_type is IPv4Address: + return source_type, [ + SchemaTransformer( + lambda _1, _2: core_schema.lax_or_strict_schema( + lax_schema=core_schema.no_info_plain_validator_function(_validators.ip_v4_address_validator), + strict_schema=make_strict_ip_schema(IPv4Address), + serialization=core_schema.to_string_ser_schema(), + ), + lambda _1, _2: {'type': 'string', 'format': 'ipv4'}, + ), + *annotations, + ] + if source_type is IPv4Network: + return source_type, [ + SchemaTransformer( + lambda _1, _2: core_schema.lax_or_strict_schema( + lax_schema=core_schema.no_info_plain_validator_function(_validators.ip_v4_network_validator), + strict_schema=make_strict_ip_schema(IPv4Network), + serialization=core_schema.to_string_ser_schema(), + ), + lambda _1, _2: {'type': 'string', 'format': 'ipv4network'}, + ), + *annotations, + ] + if source_type is IPv4Interface: + return source_type, [ + SchemaTransformer( + lambda _1, _2: core_schema.lax_or_strict_schema( + lax_schema=core_schema.no_info_plain_validator_function(_validators.ip_v4_interface_validator), + strict_schema=make_strict_ip_schema(IPv4Interface), + serialization=core_schema.to_string_ser_schema(), + ), + lambda _1, _2: {'type': 'string', 'format': 'ipv4interface'}, + ), + *annotations, + ] + + if source_type is IPv6Address: + return source_type, [ + SchemaTransformer( + lambda _1, _2: core_schema.lax_or_strict_schema( + lax_schema=core_schema.no_info_plain_validator_function(_validators.ip_v6_address_validator), + strict_schema=make_strict_ip_schema(IPv6Address), + serialization=core_schema.to_string_ser_schema(), + ), + lambda _1, _2: {'type': 'string', 'format': 'ipv6'}, + ), + *annotations, + ] + if source_type is IPv6Network: + return source_type, [ + SchemaTransformer( + lambda _1, _2: core_schema.lax_or_strict_schema( + lax_schema=core_schema.no_info_plain_validator_function(_validators.ip_v6_network_validator), + strict_schema=make_strict_ip_schema(IPv6Network), + serialization=core_schema.to_string_ser_schema(), + ), + lambda _1, _2: {'type': 'string', 'format': 'ipv6network'}, + ), + *annotations, + ] + if source_type is IPv6Interface: + return source_type, [ + SchemaTransformer( + lambda _1, _2: core_schema.lax_or_strict_schema( + lax_schema=core_schema.no_info_plain_validator_function(_validators.ip_v6_interface_validator), + strict_schema=make_strict_ip_schema(IPv6Interface), + serialization=core_schema.to_string_ser_schema(), + ), + lambda _1, _2: {'type': 'string', 'format': 'ipv6interface'}, + ), + *annotations, + ] + + return None + + +def url_prepare_pydantic_annotations( + source_type: Any, annotations: Iterable[Any], _config: ConfigDict +) -> tuple[Any, list[Any]] | None: + if source_type is Url: + return source_type, [ + SchemaTransformer( + lambda _1, _2: core_schema.url_schema(), + lambda cs, handler: handler(cs), + ), + *annotations, + ] + if source_type is MultiHostUrl: + return source_type, [ + SchemaTransformer( + lambda _1, _2: core_schema.multi_host_url_schema(), + lambda cs, handler: handler(cs), + ), + *annotations, + ] + + +PREPARE_METHODS: tuple[Callable[[Any, Iterable[Any], ConfigDict], tuple[Any, list[Any]] | None], ...] = ( + decimal_prepare_pydantic_annotations, + sequence_like_prepare_pydantic_annotations, + datetime_prepare_pydantic_annotations, + uuid_prepare_pydantic_annotations, + path_schema_prepare_pydantic_annotations, + mapping_like_prepare_pydantic_annotations, + ip_prepare_pydantic_annotations, + url_prepare_pydantic_annotations, +) diff --git a/Backend/venv/lib/python3.12/site-packages/pydantic/_internal/_typing_extra.py b/Backend/venv/lib/python3.12/site-packages/pydantic/_internal/_typing_extra.py index 986ee42e..8b94d472 100644 --- a/Backend/venv/lib/python3.12/site-packages/pydantic/_internal/_typing_extra.py +++ b/Backend/venv/lib/python3.12/site-packages/pydantic/_internal/_typing_extra.py @@ -1,589 +1,244 @@ -"""Logic for interacting with type annotations, mostly extensions, shims and hacks to wrap Python's typing module.""" +"""Logic for interacting with type annotations, mostly extensions, shims and hacks to wrap python's typing module.""" +from __future__ import annotations as _annotations -from __future__ import annotations - -import collections.abc -import re +import dataclasses import sys import types import typing +from collections.abc import Callable from functools import partial -from typing import TYPE_CHECKING, Any, Callable, cast +from types import GetSetDescriptorType +from typing import TYPE_CHECKING, Any, ForwardRef -import typing_extensions -from typing_extensions import deprecated, get_args, get_origin -from typing_inspection import typing_objects -from typing_inspection.introspection import is_union_origin +from typing_extensions import Annotated, Final, Literal, TypeAliasType, TypeGuard, get_args, get_origin -from pydantic.version import version_short +if TYPE_CHECKING: + from ._dataclasses import StandardDataclass + +try: + from typing import _TypingBase # type: ignore[attr-defined] +except ImportError: + from typing import _Final as _TypingBase # type: ignore[attr-defined] + +typing_base = _TypingBase + + +if sys.version_info < (3, 9): + # python < 3.9 does not have GenericAlias (list[int], tuple[str, ...] and so on) + TypingGenericAlias = () +else: + from typing import GenericAlias as TypingGenericAlias # type: ignore + + +if sys.version_info < (3, 11): + from typing_extensions import NotRequired, Required +else: + from typing import NotRequired, Required # noqa: F401 + + +if sys.version_info < (3, 10): + + def origin_is_union(tp: type[Any] | None) -> bool: + return tp is typing.Union + + WithArgsTypes = (TypingGenericAlias,) + +else: + + def origin_is_union(tp: type[Any] | None) -> bool: + return tp is typing.Union or tp is types.UnionType + + WithArgsTypes = typing._GenericAlias, types.GenericAlias, types.UnionType # type: ignore[attr-defined] -from ._namespace_utils import GlobalsNamespace, MappingNamespace, NsResolver, get_module_ns_of if sys.version_info < (3, 10): NoneType = type(None) EllipsisType = type(Ellipsis) else: - from types import EllipsisType as EllipsisType from types import NoneType as NoneType -if sys.version_info >= (3, 14): - import annotationlib -if TYPE_CHECKING: - from pydantic import BaseModel +LITERAL_TYPES: set[Any] = {Literal} +if hasattr(typing, 'Literal'): + LITERAL_TYPES.add(typing.Literal) # type: ignore -# As per https://typing-extensions.readthedocs.io/en/latest/#runtime-use-of-types, -# always check for both `typing` and `typing_extensions` variants of a typing construct. -# (this is implemented differently than the suggested approach in the `typing_extensions` -# docs for performance). +NONE_TYPES: tuple[Any, ...] = (None, NoneType, *(tp[None] for tp in LITERAL_TYPES)) -_t_annotated = typing.Annotated -_te_annotated = typing_extensions.Annotated +TypeVarType = Any # since mypy doesn't allow the use of TypeVar as a type -def is_annotated(tp: Any, /) -> bool: - """Return whether the provided argument is a `Annotated` special form. +def is_none_type(type_: Any) -> bool: + return type_ in NONE_TYPES - ```python {test="skip" lint="skip"} - is_annotated(Annotated[int, ...]) - #> True - ``` + +def is_callable_type(type_: type[Any]) -> bool: + return type_ is Callable or get_origin(type_) is Callable + + +def is_literal_type(type_: type[Any]) -> bool: + return Literal is not None and get_origin(type_) in LITERAL_TYPES + + +def literal_values(type_: type[Any]) -> tuple[Any, ...]: + return get_args(type_) + + +def all_literal_values(type_: type[Any]) -> list[Any]: + """This method is used to retrieve all Literal values as + Literal can be used recursively (see https://www.python.org/dev/peps/pep-0586) + e.g. `Literal[Literal[Literal[1, 2, 3], "foo"], 5, None]`. """ - origin = get_origin(tp) - return origin is _t_annotated or origin is _te_annotated + if not is_literal_type(type_): + return [type_] + + values = literal_values(type_) + return list(x for value in values for x in all_literal_values(value)) -def annotated_type(tp: Any, /) -> Any | None: - """Return the type of the `Annotated` special form, or `None`.""" - return tp.__origin__ if typing_objects.is_annotated(get_origin(tp)) else None +def is_annotated(ann_type: Any) -> bool: + from ._utils import lenient_issubclass + + origin = get_origin(ann_type) + return origin is not None and lenient_issubclass(origin, Annotated) -def unpack_type(tp: Any, /) -> Any | None: - """Return the type wrapped by the `Unpack` special form, or `None`.""" - return get_args(tp)[0] if typing_objects.is_unpack(get_origin(tp)) else None - - -def is_hashable(tp: Any, /) -> bool: - """Return whether the provided argument is the `Hashable` class. - - ```python {test="skip" lint="skip"} - is_hashable(Hashable) - #> True - ``` +def is_namedtuple(type_: type[Any]) -> bool: + """Check if a given class is a named tuple. + It can be either a `typing.NamedTuple` or `collections.namedtuple`. """ - # `get_origin` is documented as normalizing any typing-module aliases to `collections` classes, - # hence the second check: - return tp is collections.abc.Hashable or get_origin(tp) is collections.abc.Hashable + from ._utils import lenient_issubclass + + return lenient_issubclass(type_, tuple) and hasattr(type_, '_fields') -def is_callable(tp: Any, /) -> bool: - """Return whether the provided argument is a `Callable`, parametrized or not. +test_new_type = typing.NewType('test_new_type', str) - ```python {test="skip" lint="skip"} - is_callable(Callable[[int], str]) - #> True - is_callable(typing.Callable) - #> True - is_callable(collections.abc.Callable) - #> True - ``` + +def is_new_type(type_: type[Any]) -> bool: + """Check whether type_ was created using typing.NewType. + + Can't use isinstance because it fails <3.10. """ - # `get_origin` is documented as normalizing any typing-module aliases to `collections` classes, - # hence the second check: - return tp is collections.abc.Callable or get_origin(tp) is collections.abc.Callable + return isinstance(type_, test_new_type.__class__) and hasattr(type_, '__supertype__') # type: ignore[arg-type] -_classvar_re = re.compile(r'((\w+\.)?Annotated\[)?(\w+\.)?ClassVar\[') +def _check_classvar(v: type[Any] | None) -> bool: + if v is None: + return False + + return v.__class__ == typing.ClassVar.__class__ and getattr(v, '_name', None) == 'ClassVar' -def is_classvar_annotation(tp: Any, /) -> bool: - """Return whether the provided argument represents a class variable annotation. - - Although not explicitly stated by the typing specification, `ClassVar` can be used - inside `Annotated` and as such, this function checks for this specific scenario. - - Because this function is used to detect class variables before evaluating forward references - (or because evaluation failed), we also implement a naive regex match implementation. This is - required because class variables are inspected before fields are collected, so we try to be - as accurate as possible. - """ - if typing_objects.is_classvar(tp): +def is_classvar(ann_type: type[Any]) -> bool: + if _check_classvar(ann_type) or _check_classvar(get_origin(ann_type)): return True - origin = get_origin(tp) - - if typing_objects.is_classvar(origin): - return True - - if typing_objects.is_annotated(origin): - annotated_type = tp.__origin__ - if typing_objects.is_classvar(annotated_type) or typing_objects.is_classvar(get_origin(annotated_type)): - return True - - str_ann: str | None = None - if isinstance(tp, typing.ForwardRef): - str_ann = tp.__forward_arg__ - if isinstance(tp, str): - str_ann = tp - - if str_ann is not None and _classvar_re.match(str_ann): - # stdlib dataclasses do something similar, although a bit more advanced - # (see `dataclass._is_type`). + # this is an ugly workaround for class vars that contain forward references and are therefore themselves + # forward references, see #3679 + if ann_type.__class__ == typing.ForwardRef and ann_type.__forward_arg__.startswith('ClassVar['): # type: ignore return True return False -_t_final = typing.Final -_te_final = typing_extensions.Final +def _check_finalvar(v: type[Any] | None) -> bool: + """Check if a given type is a `typing.Final` type.""" + if v is None: + return False + + return v.__class__ == Final.__class__ and (sys.version_info < (3, 8) or getattr(v, '_name', None) == 'Final') -# TODO implement `is_finalvar_annotation` as Final can be wrapped with other special forms: -def is_finalvar(tp: Any, /) -> bool: - """Return whether the provided argument is a `Final` special form, parametrized or not. - - ```python {test="skip" lint="skip"} - is_finalvar(Final[int]) - #> True - is_finalvar(Final) - #> True - """ - # Final is not necessarily parametrized: - if tp is _t_final or tp is _te_final: - return True - origin = get_origin(tp) - return origin is _t_final or origin is _te_final +def is_finalvar(ann_type: Any) -> bool: + return _check_finalvar(ann_type) or _check_finalvar(get_origin(ann_type)) -_NONE_TYPES: tuple[Any, ...] = (None, NoneType, typing.Literal[None], typing_extensions.Literal[None]) +def parent_frame_namespace(*, parent_depth: int = 2) -> dict[str, Any] | None: + """We allow use of items in parent namespace to get around the issue with `get_type_hints` only looking in the + global module namespace. See https://github.com/pydantic/pydantic/issues/2678#issuecomment-1008139014 -> Scope + and suggestion at the end of the next comment by @gvanrossum. + WARNING 1: it matters exactly where this is called. By default, this function will build a namespace from the + parent of where it is called. -def is_none_type(tp: Any, /) -> bool: - """Return whether the argument represents the `None` type as part of an annotation. - - ```python {test="skip" lint="skip"} - is_none_type(None) - #> True - is_none_type(NoneType) - #> True - is_none_type(Literal[None]) - #> True - is_none_type(type[None]) - #> False - """ - return tp in _NONE_TYPES - - -def is_namedtuple(tp: Any, /) -> bool: - """Return whether the provided argument is a named tuple class. - - The class can be created using `typing.NamedTuple` or `collections.namedtuple`. - Parametrized generic classes are *not* assumed to be named tuples. - """ - from ._utils import lenient_issubclass # circ. import - - return lenient_issubclass(tp, tuple) and hasattr(tp, '_fields') - - -# TODO In 2.12, delete this export. It is currently defined only to not break -# pydantic-settings which relies on it: -origin_is_union = is_union_origin - - -def is_generic_alias(tp: Any, /) -> bool: - return isinstance(tp, (types.GenericAlias, typing._GenericAlias)) # pyright: ignore[reportAttributeAccessIssue] - - -# TODO: Ideally, we should avoid relying on the private `typing` constructs: - -if sys.version_info < (3, 10): - WithArgsTypes: tuple[Any, ...] = (typing._GenericAlias, types.GenericAlias) # pyright: ignore[reportAttributeAccessIssue] -else: - WithArgsTypes: tuple[Any, ...] = (typing._GenericAlias, types.GenericAlias, types.UnionType) # pyright: ignore[reportAttributeAccessIssue] - - -# Similarly, we shouldn't rely on this `_Final` class, which is even more private than `_GenericAlias`: -typing_base: Any = typing._Final # pyright: ignore[reportAttributeAccessIssue] - - -### Annotation evaluations functions: - - -def parent_frame_namespace(*, parent_depth: int = 2, force: bool = False) -> dict[str, Any] | None: - """Fetch the local namespace of the parent frame where this function is called. - - Using this function is mostly useful to resolve forward annotations pointing to members defined in a local namespace, - such as assignments inside a function. Using the standard library tools, it is currently not possible to resolve - such annotations: - - ```python {lint="skip" test="skip"} - from typing import get_type_hints - - def func() -> None: - Alias = int - - class C: - a: 'Alias' - - # Raises a `NameError: 'Alias' is not defined` - get_type_hints(C) - ``` - - Pydantic uses this function when a Pydantic model is being defined to fetch the parent frame locals. However, - this only allows us to fetch the parent frame namespace and not other parents (e.g. a model defined in a function, - itself defined in another function). Inspecting the next outer frames (using `f_back`) is not reliable enough - (see https://discuss.python.org/t/20659). - - Because this function is mostly used to better resolve forward annotations, nothing is returned if the parent frame's - code object is defined at the module level. In this case, the locals of the frame will be the same as the module - globals where the class is defined (see `_namespace_utils.get_module_ns_of`). However, if you still want to fetch - the module globals (e.g. when rebuilding a model, where the frame where the rebuild call is performed might contain - members that you want to use for forward annotations evaluation), you can use the `force` parameter. - - Args: - parent_depth: The depth at which to get the frame. Defaults to 2, meaning the parent frame where this function - is called will be used. - force: Whether to always return the frame locals, even if the frame's code object is defined at the module level. - - Returns: - The locals of the namespace, or `None` if it was skipped as per the described logic. + WARNING 2: this only looks in the parent namespace, not other parents since (AFAIK) there's no way to collect a + dict of exactly what's in scope. Using `f_back` would work sometimes but would be very wrong and confusing in many + other cases. See https://discuss.python.org/t/is-there-a-way-to-access-parent-nested-namespaces/20659. """ frame = sys._getframe(parent_depth) - - if frame.f_code.co_name.startswith('`, - # and we need to skip this frame as it is irrelevant. - frame = cast(types.FrameType, frame.f_back) # guaranteed to not be `None` - - # note, we don't copy frame.f_locals here (or during the last return call), because we don't expect the namespace to be - # modified down the line if this becomes a problem, we could implement some sort of frozen mapping structure to enforce this. - if force: + # if f_back is None, it's the global module namespace and we don't need to include it here + if frame.f_back is None: + return None + else: return frame.f_locals - # If either of the following conditions are true, the class is defined at the top module level. - # To better understand why we need both of these checks, see - # https://github.com/pydantic/pydantic/pull/10113#discussion_r1714981531. - if frame.f_back is None or frame.f_code.co_name == '': - return None - return frame.f_locals +def add_module_globals(obj: Any, globalns: dict[str, Any] | None = None) -> dict[str, Any]: + module_name = getattr(obj, '__module__', None) + if module_name: + try: + module_globalns = sys.modules[module_name].__dict__ + except KeyError: + # happens occasionally, see https://github.com/pydantic/pydantic/issues/2363 + pass + else: + if globalns: + return {**module_globalns, **globalns} + else: + # copy module globals to make sure it can't be updated later + return module_globalns.copy() + + return globalns or {} -def _type_convert(arg: Any) -> Any: - """Convert `None` to `NoneType` and strings to `ForwardRef` instances. - - This is a backport of the private `typing._type_convert` function. When - evaluating a type, `ForwardRef._evaluate` ends up being called, and is - responsible for making this conversion. However, we still have to apply - it for the first argument passed to our type evaluation functions, similarly - to the `typing.get_type_hints` function. - """ - if arg is None: - return NoneType - if isinstance(arg, str): - # Like `typing.get_type_hints`, assume the arg can be in any context, - # hence the proper `is_argument` and `is_class` args: - return _make_forward_ref(arg, is_argument=False, is_class=True) - return arg +def get_cls_types_namespace(cls: type[Any], parent_namespace: dict[str, Any] | None = None) -> dict[str, Any]: + ns = add_module_globals(cls, parent_namespace) + ns[cls.__name__] = cls + return ns -def safe_get_annotations(cls: type[Any]) -> dict[str, Any]: - """Get the annotations for the provided class, accounting for potential deferred forward references. - - Starting with Python 3.14, accessing the `__annotations__` attribute might raise a `NameError` if - a referenced symbol isn't defined yet. In this case, we return the annotation in the *forward ref* - format. - """ - if sys.version_info >= (3, 14): - return annotationlib.get_annotations(cls, format=annotationlib.Format.FORWARDREF) - else: - return cls.__dict__.get('__annotations__', {}) - - -def get_model_type_hints( - obj: type[BaseModel], - *, - ns_resolver: NsResolver | None = None, -) -> dict[str, tuple[Any, bool]]: - """Collect annotations from a Pydantic model class, including those from parent classes. - - Args: - obj: The Pydantic model to inspect. - ns_resolver: A namespace resolver instance to use. Defaults to an empty instance. - - Returns: - A dictionary mapping annotation names to a two-tuple: the first element is the evaluated - type or the original annotation if a `NameError` occurred, the second element is a boolean - indicating if whether the evaluation succeeded. - """ - hints: dict[str, Any] | dict[str, tuple[Any, bool]] = {} - ns_resolver = ns_resolver or NsResolver() - - for base in reversed(obj.__mro__): - # For Python 3.14, we could also use `Format.VALUE` and pass the globals/locals - # from the ns_resolver, but we want to be able to know which specific field failed - # to evaluate: - ann = safe_get_annotations(base) - - if not ann: - continue - - with ns_resolver.push(base): - globalns, localns = ns_resolver.types_namespace - for name, value in ann.items(): - if name.startswith('_'): - # For private attributes, we only need the annotation to detect the `ClassVar` special form. - # For this reason, we still try to evaluate it, but we also catch any possible exception (on - # top of the `NameError`s caught in `try_eval_type`) that could happen so that users are free - # to use any kind of forward annotation for private fields (e.g. circular imports, new typing - # syntax, etc). - try: - hints[name] = try_eval_type(value, globalns, localns) - except Exception: - hints[name] = (value, False) - else: - hints[name] = try_eval_type(value, globalns, localns) - return hints - - -def get_cls_type_hints( - obj: type[Any], - *, - ns_resolver: NsResolver | None = None, -) -> dict[str, Any]: +def get_cls_type_hints_lenient(obj: Any, globalns: dict[str, Any] | None = None) -> dict[str, Any]: """Collect annotations from a class, including those from parent classes. - Args: - obj: The class to inspect. - ns_resolver: A namespace resolver instance to use. Defaults to an empty instance. + Unlike `typing.get_type_hints`, this function will not error if a forward reference is not resolvable. """ - hints: dict[str, Any] = {} - ns_resolver = ns_resolver or NsResolver() - + hints = {} for base in reversed(obj.__mro__): - # For Python 3.14, we could also use `Format.VALUE` and pass the globals/locals - # from the ns_resolver, but we want to be able to know which specific field failed - # to evaluate: - ann = safe_get_annotations(base) - - if not ann: - continue - - with ns_resolver.push(base): - globalns, localns = ns_resolver.types_namespace + ann = base.__dict__.get('__annotations__') + localns = dict(vars(base)) + if ann is not None and ann is not GetSetDescriptorType: for name, value in ann.items(): - hints[name] = eval_type(value, globalns, localns) + hints[name] = eval_type_lenient(value, globalns, localns) return hints -def try_eval_type( - value: Any, - globalns: GlobalsNamespace | None = None, - localns: MappingNamespace | None = None, -) -> tuple[Any, bool]: - """Try evaluating the annotation using the provided namespaces. - - Args: - value: The value to evaluate. If `None`, it will be replaced by `type[None]`. If an instance - of `str`, it will be converted to a `ForwardRef`. - localns: The global namespace to use during annotation evaluation. - globalns: The local namespace to use during annotation evaluation. - - Returns: - A two-tuple containing the possibly evaluated type and a boolean indicating - whether the evaluation succeeded or not. - """ - value = _type_convert(value) +def eval_type_lenient(value: Any, globalns: dict[str, Any] | None, localns: dict[str, Any] | None) -> Any: + """Behaves like typing._eval_type, except it won't raise an error if a forward reference can't be resolved.""" + if value is None: + value = NoneType + elif isinstance(value, str): + value = _make_forward_ref(value, is_argument=False, is_class=True) try: - return eval_type_backport(value, globalns, localns), True + return typing._eval_type(value, globalns, localns) # type: ignore except NameError: - return value, False - - -def eval_type( - value: Any, - globalns: GlobalsNamespace | None = None, - localns: MappingNamespace | None = None, -) -> Any: - """Evaluate the annotation using the provided namespaces. - - Args: - value: The value to evaluate. If `None`, it will be replaced by `type[None]`. If an instance - of `str`, it will be converted to a `ForwardRef`. - localns: The global namespace to use during annotation evaluation. - globalns: The local namespace to use during annotation evaluation. - """ - value = _type_convert(value) - return eval_type_backport(value, globalns, localns) - - -@deprecated( - '`eval_type_lenient` is deprecated, use `try_eval_type` instead.', - category=None, -) -def eval_type_lenient( - value: Any, - globalns: GlobalsNamespace | None = None, - localns: MappingNamespace | None = None, -) -> Any: - ev, _ = try_eval_type(value, globalns, localns) - return ev - - -def eval_type_backport( - value: Any, - globalns: GlobalsNamespace | None = None, - localns: MappingNamespace | None = None, - type_params: tuple[Any, ...] | None = None, -) -> Any: - """An enhanced version of `typing._eval_type` which will fall back to using the `eval_type_backport` - package if it's installed to let older Python versions use newer typing constructs. - - Specifically, this transforms `X | Y` into `typing.Union[X, Y]` and `list[X]` into `typing.List[X]` - (as well as all the types made generic in PEP 585) if the original syntax is not supported in the - current Python version. - - This function will also display a helpful error if the value passed fails to evaluate. - """ - try: - return _eval_type_backport(value, globalns, localns, type_params) - except TypeError as e: - if 'Unable to evaluate type annotation' in str(e): - raise - - # If it is a `TypeError` and value isn't a `ForwardRef`, it would have failed during annotation definition. - # Thus we assert here for type checking purposes: - assert isinstance(value, typing.ForwardRef) - - message = f'Unable to evaluate type annotation {value.__forward_arg__!r}.' - if sys.version_info >= (3, 11): - e.add_note(message) - raise - else: - raise TypeError(message) from e - except RecursionError as e: - # TODO ideally recursion errors should be checked in `eval_type` above, but `eval_type_backport` - # is used directly in some places. - message = ( - "If you made use of an implicit recursive type alias (e.g. `MyType = list['MyType']), " - 'consider using PEP 695 type aliases instead. For more details, refer to the documentation: ' - f'https://docs.pydantic.dev/{version_short()}/concepts/types/#named-recursive-types' - ) - if sys.version_info >= (3, 11): - e.add_note(message) - raise - else: - raise RecursionError(f'{e.args[0]}\n{message}') - - -def _eval_type_backport( - value: Any, - globalns: GlobalsNamespace | None = None, - localns: MappingNamespace | None = None, - type_params: tuple[Any, ...] | None = None, -) -> Any: - try: - return _eval_type(value, globalns, localns, type_params) - except TypeError as e: - if not (isinstance(value, typing.ForwardRef) and is_backport_fixable_error(e)): - raise - - try: - from eval_type_backport import eval_type_backport - except ImportError: - raise TypeError( - f'Unable to evaluate type annotation {value.__forward_arg__!r}. If you are making use ' - 'of the new typing syntax (unions using `|` since Python 3.10 or builtins subscripting ' - 'since Python 3.9), you should either replace the use of new syntax with the existing ' - '`typing` constructs or install the `eval_type_backport` package.' - ) from e - - return eval_type_backport( - value, - globalns, - localns, # pyright: ignore[reportArgumentType], waiting on a new `eval_type_backport` release. - try_default=False, - ) - - -def _eval_type( - value: Any, - globalns: GlobalsNamespace | None = None, - localns: MappingNamespace | None = None, - type_params: tuple[Any, ...] | None = None, -) -> Any: - if sys.version_info >= (3, 14): - # Starting in 3.14, `_eval_type()` does *not* apply `_type_convert()` - # anymore. This means the `None` -> `type(None)` conversion does not apply: - evaluated = typing._eval_type( # type: ignore - value, - globalns, - localns, - type_params=type_params, - # This is relevant when evaluating types from `TypedDict` classes, where string annotations - # are automatically converted to `ForwardRef` instances with a module set. In this case, - # Our `globalns` is irrelevant and we need to indicate `typing._eval_type()` that it should - # infer it from the `ForwardRef.__forward_module__` attribute instead (`typing.get_type_hints()` - # does the same). Note that this would probably be unnecessary if we properly iterated over the - # `__orig_bases__` for TypedDicts in `get_cls_type_hints()`: - prefer_fwd_module=True, - ) - if evaluated is None: - evaluated = type(None) - return evaluated - elif sys.version_info >= (3, 13): - return typing._eval_type( # type: ignore - value, globalns, localns, type_params=type_params - ) - else: - return typing._eval_type( # type: ignore - value, globalns, localns - ) - - -def is_backport_fixable_error(e: TypeError) -> bool: - msg = str(e) - - return sys.version_info < (3, 10) and msg.startswith('unsupported operand type(s) for |: ') + # the point of this function is to be tolerant to this case + return value def get_function_type_hints( - function: Callable[..., Any], - *, - include_keys: set[str] | None = None, - globalns: GlobalsNamespace | None = None, - localns: MappingNamespace | None = None, + function: Callable[..., Any], *, include_keys: set[str] | None = None, types_namespace: dict[str, Any] | None = None ) -> dict[str, Any]: - """Return type hints for a function. - - This is similar to the `typing.get_type_hints` function, with a few differences: - - Support `functools.partial` by using the underlying `func` attribute. - - Do not wrap type annotation of a parameter with `Optional` if it has a default value of `None` - (related bug: https://github.com/python/cpython/issues/90353, only fixed in 3.11+). + """Like `typing.get_type_hints`, but doesn't convert `X` to `Optional[X]` if the default value is `None`, also + copes with `partial`. """ - try: - if isinstance(function, partial): - annotations = function.func.__annotations__ - else: - annotations = function.__annotations__ - except AttributeError: - # Some functions (e.g. builtins) don't have annotations: - return {} - - if globalns is None: - globalns = get_module_ns_of(function) - type_params: tuple[Any, ...] | None = None - if localns is None: - # If localns was specified, it is assumed to already contain type params. This is because - # Pydantic has more advanced logic to do so (see `_namespace_utils.ns_for_function`). - type_params = getattr(function, '__type_params__', ()) + if isinstance(function, partial): + annotations = function.func.__annotations__ + else: + annotations = function.__annotations__ + globalns = add_module_globals(function) type_hints = {} for name, value in annotations.items(): if include_keys is not None and name not in include_keys: @@ -593,12 +248,11 @@ def get_function_type_hints( elif isinstance(value, str): value = _make_forward_ref(value) - type_hints[name] = eval_type_backport(value, globalns, localns, type_params) + type_hints[name] = typing._eval_type(value, globalns, types_namespace) # type: ignore return type_hints -# TODO use typing.ForwardRef directly when we stop supporting 3.9: if sys.version_info < (3, 9, 8) or (3, 10) <= sys.version_info < (3, 10, 1): def _make_forward_ref( @@ -618,10 +272,10 @@ if sys.version_info < (3, 9, 8) or (3, 10) <= sys.version_info < (3, 10, 1): Implemented as EAFP with memory. """ - return typing.ForwardRef(arg, is_argument) # pyright: ignore[reportCallIssue] + return typing.ForwardRef(arg, is_argument) else: - _make_forward_ref = typing.ForwardRef # pyright: ignore[reportAssignmentType] + _make_forward_ref = typing.ForwardRef if sys.version_info >= (3, 10): @@ -709,15 +363,11 @@ else: if isinstance(value, str): value = _make_forward_ref(value, is_argument=False, is_class=True) - value = eval_type_backport(value, base_globals, base_locals) + value = typing._eval_type(value, base_globals, base_locals) # type: ignore hints[name] = value - if not include_extras and hasattr(typing, '_strip_annotations'): - return { - k: typing._strip_annotations(t) # type: ignore - for k, t in hints.items() - } - else: - return hints + return ( + hints if include_extras else {k: typing._strip_annotations(t) for k, t in hints.items()} # type: ignore + ) if globalns is None: if isinstance(obj, types.ModuleType): @@ -738,7 +388,7 @@ else: if isinstance(obj, typing._allowed_types): # type: ignore return {} else: - raise TypeError(f'{obj!r} is not a module, class, method, or function.') + raise TypeError(f'{obj!r} is not a module, class, method, ' 'or function.') defaults = typing._get_defaults(obj) # type: ignore hints = dict(hints) for name, value in hints.items(): @@ -753,8 +403,44 @@ else: is_argument=not isinstance(obj, types.ModuleType), is_class=False, ) - value = eval_type_backport(value, globalns, localns) + value = typing._eval_type(value, globalns, localns) # type: ignore if name in defaults and defaults[name] is None: value = typing.Optional[value] hints[name] = value return hints if include_extras else {k: typing._strip_annotations(t) for k, t in hints.items()} # type: ignore + + +if sys.version_info < (3, 9): + + def evaluate_fwd_ref( + ref: ForwardRef, globalns: dict[str, Any] | None = None, localns: dict[str, Any] | None = None + ) -> Any: + return ref._evaluate(globalns=globalns, localns=localns) + +else: + + def evaluate_fwd_ref( + ref: ForwardRef, globalns: dict[str, Any] | None = None, localns: dict[str, Any] | None = None + ) -> Any: + return ref._evaluate(globalns=globalns, localns=localns, recursive_guard=frozenset()) + + +def is_dataclass(_cls: type[Any]) -> TypeGuard[type[StandardDataclass]]: + # The dataclasses.is_dataclass function doesn't seem to provide TypeGuard functionality, + # so I created this convenience function + return dataclasses.is_dataclass(_cls) + + +def origin_is_type_alias_type(origin: Any) -> TypeGuard[TypeAliasType]: + return isinstance(origin, TypeAliasType) + + +if sys.version_info >= (3, 10): + + def is_generic_alias(type_: type[Any]) -> bool: + return isinstance(type_, (types.GenericAlias, typing._GenericAlias)) # type: ignore[attr-defined] + +else: + + def is_generic_alias(type_: type[Any]) -> bool: + return isinstance(type_, typing._GenericAlias) # type: ignore diff --git a/Backend/venv/lib/python3.12/site-packages/pydantic/_internal/_utils.py b/Backend/venv/lib/python3.12/site-packages/pydantic/_internal/_utils.py index 7eae1b77..fa92711d 100644 --- a/Backend/venv/lib/python3.12/site-packages/pydantic/_internal/_utils.py +++ b/Backend/venv/lib/python3.12/site-packages/pydantic/_internal/_utils.py @@ -2,36 +2,24 @@ This should be reduced as much as possible with functions only used in one place, moved to that place. """ - from __future__ import annotations as _annotations -import dataclasses import keyword -import sys -import warnings +import typing import weakref from collections import OrderedDict, defaultdict, deque -from collections.abc import Callable, Iterable, Mapping -from collections.abc import Set as AbstractSet from copy import deepcopy -from functools import cached_property -from inspect import Parameter from itertools import zip_longest from types import BuiltinFunctionType, CodeType, FunctionType, GeneratorType, LambdaType, ModuleType -from typing import TYPE_CHECKING, Any, Generic, TypeVar, overload +from typing import Any, TypeVar -from pydantic_core import MISSING -from typing_extensions import TypeAlias, TypeGuard, deprecated - -from pydantic import PydanticDeprecatedSince211 +from typing_extensions import TypeAlias, TypeGuard from . import _repr, _typing_extra -from ._import_utils import import_cached_base_model -if TYPE_CHECKING: - # TODO remove type error comments when we drop support for Python 3.9 - MappingIntStrAny: TypeAlias = Mapping[int, Any] | Mapping[str, Any] # pyright: ignore[reportGeneralTypeIssues] - AbstractSetIntStr: TypeAlias = AbstractSet[int] | AbstractSet[str] # pyright: ignore[reportGeneralTypeIssues] +if typing.TYPE_CHECKING: + MappingIntStrAny: TypeAlias = 'typing.Mapping[int, Any] | typing.Mapping[str, Any]' + AbstractSetIntStr: TypeAlias = 'typing.AbstractSet[int] | typing.AbstractSet[str]' from ..main import BaseModel @@ -71,25 +59,6 @@ BUILTIN_COLLECTIONS: set[type[Any]] = { } -def can_be_positional(param: Parameter) -> bool: - """Return whether the parameter accepts a positional argument. - - ```python {test="skip" lint="skip"} - def func(a, /, b, *, c): - pass - - params = inspect.signature(func).parameters - can_be_positional(params['a']) - #> True - can_be_positional(params['b']) - #> True - can_be_positional(params['c']) - #> False - ``` - """ - return param.kind in (Parameter.POSITIONAL_ONLY, Parameter.POSITIONAL_OR_KEYWORD) - - def sequence_like(v: Any) -> bool: return isinstance(v, (list, tuple, set, frozenset, GeneratorType, deque)) @@ -114,7 +83,7 @@ def is_model_class(cls: Any) -> TypeGuard[type[BaseModel]]: """Returns true if cls is a _proper_ subclass of BaseModel, and provides proper type-checking, unlike raw calls to lenient_issubclass. """ - BaseModel = import_cached_base_model() + from ..main import BaseModel return lenient_issubclass(cls, BaseModel) and cls is not BaseModel @@ -151,7 +120,7 @@ T = TypeVar('T') def unique_list( input_list: list[T] | tuple[T, ...], *, - name_factory: Callable[[T], str] = str, + name_factory: typing.Callable[[T], str] = str, ) -> list[T]: """Make a list unique while maintaining order. We update the list if another one with the same name is set @@ -216,7 +185,7 @@ class ValueItems(_repr.Representation): normalized_items: dict[int | str, Any] = {} all_items = None for i, v in items.items(): - if not (isinstance(v, Mapping) or isinstance(v, AbstractSet) or self.is_true(v)): + if not (isinstance(v, typing.Mapping) or isinstance(v, typing.AbstractSet) or self.is_true(v)): raise TypeError(f'Unexpected type of exclude value for index "{i}" {v.__class__}') if i == '__all__': all_items = self._coerce_value(v) @@ -281,9 +250,9 @@ class ValueItems(_repr.Representation): @staticmethod def _coerce_items(items: AbstractSetIntStr | MappingIntStrAny) -> MappingIntStrAny: - if isinstance(items, Mapping): + if isinstance(items, typing.Mapping): pass - elif isinstance(items, AbstractSet): + elif isinstance(items, typing.AbstractSet): items = dict.fromkeys(items, ...) # type: ignore else: class_name = getattr(items, '__class__', '???') @@ -304,25 +273,21 @@ class ValueItems(_repr.Representation): return [(None, self._items)] -if TYPE_CHECKING: +if typing.TYPE_CHECKING: - def LazyClassAttribute(name: str, get_value: Callable[[], T]) -> T: ... + def ClassAttribute(name: str, value: T) -> T: + ... else: - class LazyClassAttribute: - """A descriptor exposing an attribute only accessible on a class (hidden from instances). + class ClassAttribute: + """Hide class attribute from its instances.""" - The attribute is lazily computed and cached during the first access. - """ + __slots__ = 'name', 'value' - def __init__(self, name: str, get_value: Callable[[], Any]) -> None: + def __init__(self, name: str, value: Any) -> None: self.name = name - self.get_value = get_value - - @cached_property - def value(self) -> Any: - return self.get_value() + self.value = value def __get__(self, instance: Any, owner: type[Any]) -> None: if instance is None: @@ -338,8 +303,6 @@ def smart_deepcopy(obj: Obj) -> Obj: Use obj.copy() for built-in empty collections Use copy.deepcopy() for non-empty collections and unknown objects. """ - if obj is MISSING: - return obj # pyright: ignore[reportReturnType] obj_type = obj.__class__ if obj_type in IMMUTABLE_NON_COLLECTIONS_TYPES: return obj # fastest case: obj is immutable and not collection therefore will not be copied anyway @@ -354,10 +317,10 @@ def smart_deepcopy(obj: Obj) -> Obj: return deepcopy(obj) # slowest way when we actually might need a deepcopy -_SENTINEL = object() +_EMPTY = object() -def all_identical(left: Iterable[Any], right: Iterable[Any]) -> bool: +def all_identical(left: typing.Iterable[Any], right: typing.Iterable[Any]) -> bool: """Check that the items of `left` are the same objects as those in `right`. >>> a, b = object(), object() @@ -366,81 +329,7 @@ def all_identical(left: Iterable[Any], right: Iterable[Any]) -> bool: >>> all_identical([a, b, [a]], [a, b, [a]]) # new list object, while "equal" is not "identical" False """ - for left_item, right_item in zip_longest(left, right, fillvalue=_SENTINEL): + for left_item, right_item in zip_longest(left, right, fillvalue=_EMPTY): if left_item is not right_item: return False return True - - -def get_first_not_none(a: Any, b: Any) -> Any: - """Return the first argument if it is not `None`, otherwise return the second argument.""" - return a if a is not None else b - - -@dataclasses.dataclass(frozen=True) -class SafeGetItemProxy: - """Wrapper redirecting `__getitem__` to `get` with a sentinel value as default - - This makes is safe to use in `operator.itemgetter` when some keys may be missing - """ - - # Define __slots__manually for performances - # @dataclasses.dataclass() only support slots=True in python>=3.10 - __slots__ = ('wrapped',) - - wrapped: Mapping[str, Any] - - def __getitem__(self, key: str, /) -> Any: - return self.wrapped.get(key, _SENTINEL) - - # required to pass the object to operator.itemgetter() instances due to a quirk of typeshed - # https://github.com/python/mypy/issues/13713 - # https://github.com/python/typeshed/pull/8785 - # Since this is typing-only, hide it in a typing.TYPE_CHECKING block - if TYPE_CHECKING: - - def __contains__(self, key: str, /) -> bool: - return self.wrapped.__contains__(key) - - -_ModelT = TypeVar('_ModelT', bound='BaseModel') -_RT = TypeVar('_RT') - - -class deprecated_instance_property(Generic[_ModelT, _RT]): - """A decorator exposing the decorated class method as a property, with a warning on instance access. - - This decorator takes a class method defined on the `BaseModel` class and transforms it into - an attribute. The attribute can be accessed on both the class and instances of the class. If accessed - via an instance, a deprecation warning is emitted stating that instance access will be removed in V3. - """ - - def __init__(self, fget: Callable[[type[_ModelT]], _RT], /) -> None: - # Note: fget should be a classmethod: - self.fget = fget - - @overload - def __get__(self, instance: None, objtype: type[_ModelT]) -> _RT: ... - @overload - @deprecated( - 'Accessing this attribute on the instance is deprecated, and will be removed in Pydantic V3. ' - 'Instead, you should access this attribute from the model class.', - category=None, - ) - def __get__(self, instance: _ModelT, objtype: type[_ModelT]) -> _RT: ... - def __get__(self, instance: _ModelT | None, objtype: type[_ModelT]) -> _RT: - if instance is not None: - # fmt: off - attr_name = ( - self.fget.__name__ - if sys.version_info >= (3, 10) - else self.fget.__func__.__name__ # pyright: ignore[reportFunctionMemberAccess] - ) - # fmt: on - warnings.warn( - f'Accessing the {attr_name!r} attribute on the instance is deprecated. ' - 'Instead, you should access this attribute from the model class.', - category=PydanticDeprecatedSince211, - stacklevel=2, - ) - return self.fget.__get__(instance, objtype)() diff --git a/Backend/venv/lib/python3.12/site-packages/pydantic/_internal/_validate_call.py b/Backend/venv/lib/python3.12/site-packages/pydantic/_internal/_validate_call.py index ab82832f..543b064b 100644 --- a/Backend/venv/lib/python3.12/site-packages/pydantic/_internal/_validate_call.py +++ b/Backend/venv/lib/python3.12/site-packages/pydantic/_internal/_validate_call.py @@ -1,122 +1,101 @@ from __future__ import annotations as _annotations -import functools import inspect -from collections.abc import Awaitable +from dataclasses import dataclass from functools import partial -from typing import Any, Callable +from typing import Any, Awaitable, Callable import pydantic_core from ..config import ConfigDict from ..plugin._schema_validator import create_schema_validator +from . import _generate_schema, _typing_extra from ._config import ConfigWrapper -from ._generate_schema import GenerateSchema, ValidateCallSupportedTypes -from ._namespace_utils import MappingNamespace, NsResolver, ns_for_function -def extract_function_name(func: ValidateCallSupportedTypes) -> str: - """Extract the name of a `ValidateCallSupportedTypes` object.""" - return f'partial({func.func.__name__})' if isinstance(func, functools.partial) else func.__name__ - - -def extract_function_qualname(func: ValidateCallSupportedTypes) -> str: - """Extract the qualname of a `ValidateCallSupportedTypes` object.""" - return f'partial({func.func.__qualname__})' if isinstance(func, functools.partial) else func.__qualname__ - - -def update_wrapper_attributes(wrapped: ValidateCallSupportedTypes, wrapper: Callable[..., Any]): - """Update the `wrapper` function with the attributes of the `wrapped` function. Return the updated function.""" - if inspect.iscoroutinefunction(wrapped): - - @functools.wraps(wrapped) - async def wrapper_function(*args, **kwargs): # type: ignore - return await wrapper(*args, **kwargs) - else: - - @functools.wraps(wrapped) - def wrapper_function(*args, **kwargs): - return wrapper(*args, **kwargs) - - # We need to manually update this because `partial` object has no `__name__` and `__qualname__`. - wrapper_function.__name__ = extract_function_name(wrapped) - wrapper_function.__qualname__ = extract_function_qualname(wrapped) - wrapper_function.raw_function = wrapped # type: ignore - - return wrapper_function +@dataclass +class CallMarker: + function: Callable[..., Any] + validate_return: bool class ValidateCallWrapper: - """This is a wrapper around a function that validates the arguments passed to it, and optionally the return value.""" + """This is a wrapper around a function that validates the arguments passed to it, and optionally the return value. + + It's partially inspired by `wraps` which in turn uses `partial`, but extended to be a descriptor so + these functions can be applied to instance methods, class methods, static methods, as well as normal functions. + """ __slots__ = ( - 'function', - 'validate_return', - 'schema_type', - 'module', - 'qualname', - 'ns_resolver', - 'config_wrapper', - '__pydantic_complete__', + 'raw_function', + '_config', + '_validate_return', + '__pydantic_core_schema__', '__pydantic_validator__', - '__return_pydantic_validator__', + '__signature__', + '__name__', + '__qualname__', + '__annotations__', + '__dict__', # required for __module__ ) - def __init__( - self, - function: ValidateCallSupportedTypes, - config: ConfigDict | None, - validate_return: bool, - parent_namespace: MappingNamespace | None, - ) -> None: - self.function = function - self.validate_return = validate_return + def __init__(self, function: Callable[..., Any], config: ConfigDict | None, validate_return: bool): + self.raw_function = function + self._config = config + self._validate_return = validate_return + self.__signature__ = inspect.signature(function) if isinstance(function, partial): - self.schema_type = function.func - self.module = function.func.__module__ + func = function.func + schema_type = func + self.__name__ = f'partial({func.__name__})' + self.__qualname__ = f'partial({func.__qualname__})' + self.__annotations__ = func.__annotations__ + self.__module__ = func.__module__ + self.__doc__ = func.__doc__ else: - self.schema_type = function - self.module = function.__module__ - self.qualname = extract_function_qualname(function) + schema_type = function + self.__name__ = function.__name__ + self.__qualname__ = function.__qualname__ + self.__annotations__ = function.__annotations__ + self.__module__ = function.__module__ + self.__doc__ = function.__doc__ - self.ns_resolver = NsResolver( - namespaces_tuple=ns_for_function(self.schema_type, parent_namespace=parent_namespace) - ) - self.config_wrapper = ConfigWrapper(config) - if not self.config_wrapper.defer_build: - self._create_validators() - else: - self.__pydantic_complete__ = False - - def _create_validators(self) -> None: - gen_schema = GenerateSchema(self.config_wrapper, self.ns_resolver) - schema = gen_schema.clean_schema(gen_schema.generate_schema(self.function)) - core_config = self.config_wrapper.core_config(title=self.qualname) + namespace = _typing_extra.add_module_globals(function, None) + config_wrapper = ConfigWrapper(config) + gen_schema = _generate_schema.GenerateSchema(config_wrapper, namespace) + schema = gen_schema.clean_schema(gen_schema.generate_schema(function)) + self.__pydantic_core_schema__ = schema + core_config = config_wrapper.core_config(self) self.__pydantic_validator__ = create_schema_validator( schema, - self.schema_type, - self.module, - self.qualname, + schema_type, + self.__module__, + self.__qualname__, 'validate_call', core_config, - self.config_wrapper.plugin_settings, + config_wrapper.plugin_settings, ) - if self.validate_return: - signature = inspect.signature(self.function) - return_type = signature.return_annotation if signature.return_annotation is not signature.empty else Any - gen_schema = GenerateSchema(self.config_wrapper, self.ns_resolver) + + if self._validate_return: + return_type = ( + self.__signature__.return_annotation + if self.__signature__.return_annotation is not self.__signature__.empty + else Any + ) + gen_schema = _generate_schema.GenerateSchema(config_wrapper, namespace) schema = gen_schema.clean_schema(gen_schema.generate_schema(return_type)) + self.__return_pydantic_core_schema__ = schema validator = create_schema_validator( schema, - self.schema_type, - self.module, - self.qualname, + schema_type, + self.__module__, + self.__qualname__, 'validate_call', core_config, - self.config_wrapper.plugin_settings, + config_wrapper.plugin_settings, ) - if inspect.iscoroutinefunction(self.function): + if inspect.iscoroutinefunction(self.raw_function): async def return_val_wrapper(aw: Awaitable[Any]) -> None: return validator.validate_python(await aw) @@ -125,16 +104,46 @@ class ValidateCallWrapper: else: self.__return_pydantic_validator__ = validator.validate_python else: + self.__return_pydantic_core_schema__ = None self.__return_pydantic_validator__ = None - self.__pydantic_complete__ = True + self._name: str | None = None # set by __get__, used to set the instance attribute when decorating methods def __call__(self, *args: Any, **kwargs: Any) -> Any: - if not self.__pydantic_complete__: - self._create_validators() - res = self.__pydantic_validator__.validate_python(pydantic_core.ArgsKwargs(args, kwargs)) if self.__return_pydantic_validator__: return self.__return_pydantic_validator__(res) - else: - return res + return res + + def __get__(self, obj: Any, objtype: type[Any] | None = None) -> ValidateCallWrapper: + """Bind the raw function and return another ValidateCallWrapper wrapping that.""" + if obj is None: + try: + # Handle the case where a method is accessed as a class attribute + return objtype.__getattribute__(objtype, self._name) # type: ignore + except AttributeError: + # This will happen the first time the attribute is accessed + pass + + bound_function = self.raw_function.__get__(obj, objtype) + result = self.__class__(bound_function, self._config, self._validate_return) + + # skip binding to instance when obj or objtype has __slots__ attribute + if hasattr(obj, '__slots__') or hasattr(objtype, '__slots__'): + return result + + if self._name is not None: + if obj is not None: + object.__setattr__(obj, self._name, result) + else: + object.__setattr__(objtype, self._name, result) + return result + + def __set_name__(self, owner: Any, name: str) -> None: + self._name = name + + def __repr__(self) -> str: + return f'ValidateCallWrapper({self.raw_function})' + + def __eq__(self, other): + return self.raw_function == other.raw_function diff --git a/Backend/venv/lib/python3.12/site-packages/pydantic/_internal/_validators.py b/Backend/venv/lib/python3.12/site-packages/pydantic/_internal/_validators.py index 2c7fab66..7193fe5c 100644 --- a/Backend/venv/lib/python3.12/site-packages/pydantic/_internal/_validators.py +++ b/Backend/venv/lib/python3.12/site-packages/pydantic/_internal/_validators.py @@ -5,33 +5,22 @@ Import of this module is deferred since it contains imports of many standard lib from __future__ import annotations as _annotations -import collections.abc import math import re import typing -from collections.abc import Sequence -from decimal import Decimal -from fractions import Fraction from ipaddress import IPv4Address, IPv4Interface, IPv4Network, IPv6Address, IPv6Interface, IPv6Network -from typing import Any, Callable, TypeVar, Union, cast -from zoneinfo import ZoneInfo, ZoneInfoNotFoundError +from typing import Any -import typing_extensions -from pydantic_core import PydanticCustomError, PydanticKnownError, core_schema -from typing_extensions import get_args, get_origin -from typing_inspection import typing_objects - -from pydantic._internal._import_utils import import_cached_field_info -from pydantic.errors import PydanticSchemaGenerationError +from pydantic_core import PydanticCustomError, core_schema +from pydantic_core._pydantic_core import PydanticKnownError def sequence_validator( - input_value: Sequence[Any], - /, + __input_value: typing.Sequence[Any], validator: core_schema.ValidatorFunctionWrapHandler, -) -> Sequence[Any]: +) -> typing.Sequence[Any]: """Validator for `Sequence` types, isinstance(v, Sequence) has already been called.""" - value_type = type(input_value) + value_type = type(__input_value) # We don't accept any plain string as a sequence # Relevant issue: https://github.com/pydantic/pydantic/issues/5595 @@ -42,24 +31,14 @@ def sequence_validator( {'type_name': value_type.__name__}, ) - # TODO: refactor sequence validation to validate with either a list or a tuple - # schema, depending on the type of the value. - # Additionally, we should be able to remove one of either this validator or the - # SequenceValidator in _std_types_schema.py (preferably this one, while porting over some logic). - # Effectively, a refactor for sequence validation is needed. - if value_type is tuple: - input_value = list(input_value) - - v_list = validator(input_value) + v_list = validator(__input_value) # the rest of the logic is just re-creating the original type from `v_list` - if value_type is list: + if value_type == list: return v_list elif issubclass(value_type, range): # return the list as we probably can't re-create the range return v_list - elif value_type is tuple: - return tuple(v_list) else: # best guess at how to re-create the original type, more custom construction logic might be required return value_type(v_list) # type: ignore[call-arg] @@ -127,407 +106,173 @@ def _import_string_logic(dotted_path: str) -> Any: return module -def pattern_either_validator(input_value: Any, /) -> re.Pattern[Any]: - if isinstance(input_value, re.Pattern): - return input_value - elif isinstance(input_value, (str, bytes)): +def pattern_either_validator(__input_value: Any) -> typing.Pattern[Any]: + if isinstance(__input_value, typing.Pattern): + return __input_value + elif isinstance(__input_value, (str, bytes)): # todo strict mode - return compile_pattern(input_value) # type: ignore + return compile_pattern(__input_value) # type: ignore else: raise PydanticCustomError('pattern_type', 'Input should be a valid pattern') -def pattern_str_validator(input_value: Any, /) -> re.Pattern[str]: - if isinstance(input_value, re.Pattern): - if isinstance(input_value.pattern, str): - return input_value +def pattern_str_validator(__input_value: Any) -> typing.Pattern[str]: + if isinstance(__input_value, typing.Pattern): + if isinstance(__input_value.pattern, str): + return __input_value else: raise PydanticCustomError('pattern_str_type', 'Input should be a string pattern') - elif isinstance(input_value, str): - return compile_pattern(input_value) - elif isinstance(input_value, bytes): + elif isinstance(__input_value, str): + return compile_pattern(__input_value) + elif isinstance(__input_value, bytes): raise PydanticCustomError('pattern_str_type', 'Input should be a string pattern') else: raise PydanticCustomError('pattern_type', 'Input should be a valid pattern') -def pattern_bytes_validator(input_value: Any, /) -> re.Pattern[bytes]: - if isinstance(input_value, re.Pattern): - if isinstance(input_value.pattern, bytes): - return input_value +def pattern_bytes_validator(__input_value: Any) -> typing.Pattern[bytes]: + if isinstance(__input_value, typing.Pattern): + if isinstance(__input_value.pattern, bytes): + return __input_value else: raise PydanticCustomError('pattern_bytes_type', 'Input should be a bytes pattern') - elif isinstance(input_value, bytes): - return compile_pattern(input_value) - elif isinstance(input_value, str): + elif isinstance(__input_value, bytes): + return compile_pattern(__input_value) + elif isinstance(__input_value, str): raise PydanticCustomError('pattern_bytes_type', 'Input should be a bytes pattern') else: raise PydanticCustomError('pattern_type', 'Input should be a valid pattern') -PatternType = TypeVar('PatternType', str, bytes) +PatternType = typing.TypeVar('PatternType', str, bytes) -def compile_pattern(pattern: PatternType) -> re.Pattern[PatternType]: +def compile_pattern(pattern: PatternType) -> typing.Pattern[PatternType]: try: return re.compile(pattern) except re.error: raise PydanticCustomError('pattern_regex', 'Input should be a valid regular expression') -def ip_v4_address_validator(input_value: Any, /) -> IPv4Address: - if isinstance(input_value, IPv4Address): - return input_value +def ip_v4_address_validator(__input_value: Any) -> IPv4Address: + if isinstance(__input_value, IPv4Address): + return __input_value try: - return IPv4Address(input_value) + return IPv4Address(__input_value) except ValueError: raise PydanticCustomError('ip_v4_address', 'Input is not a valid IPv4 address') -def ip_v6_address_validator(input_value: Any, /) -> IPv6Address: - if isinstance(input_value, IPv6Address): - return input_value +def ip_v6_address_validator(__input_value: Any) -> IPv6Address: + if isinstance(__input_value, IPv6Address): + return __input_value try: - return IPv6Address(input_value) + return IPv6Address(__input_value) except ValueError: raise PydanticCustomError('ip_v6_address', 'Input is not a valid IPv6 address') -def ip_v4_network_validator(input_value: Any, /) -> IPv4Network: +def ip_v4_network_validator(__input_value: Any) -> IPv4Network: """Assume IPv4Network initialised with a default `strict` argument. See more: https://docs.python.org/library/ipaddress.html#ipaddress.IPv4Network """ - if isinstance(input_value, IPv4Network): - return input_value + if isinstance(__input_value, IPv4Network): + return __input_value try: - return IPv4Network(input_value) + return IPv4Network(__input_value) except ValueError: raise PydanticCustomError('ip_v4_network', 'Input is not a valid IPv4 network') -def ip_v6_network_validator(input_value: Any, /) -> IPv6Network: +def ip_v6_network_validator(__input_value: Any) -> IPv6Network: """Assume IPv6Network initialised with a default `strict` argument. See more: https://docs.python.org/library/ipaddress.html#ipaddress.IPv6Network """ - if isinstance(input_value, IPv6Network): - return input_value + if isinstance(__input_value, IPv6Network): + return __input_value try: - return IPv6Network(input_value) + return IPv6Network(__input_value) except ValueError: raise PydanticCustomError('ip_v6_network', 'Input is not a valid IPv6 network') -def ip_v4_interface_validator(input_value: Any, /) -> IPv4Interface: - if isinstance(input_value, IPv4Interface): - return input_value +def ip_v4_interface_validator(__input_value: Any) -> IPv4Interface: + if isinstance(__input_value, IPv4Interface): + return __input_value try: - return IPv4Interface(input_value) + return IPv4Interface(__input_value) except ValueError: raise PydanticCustomError('ip_v4_interface', 'Input is not a valid IPv4 interface') -def ip_v6_interface_validator(input_value: Any, /) -> IPv6Interface: - if isinstance(input_value, IPv6Interface): - return input_value +def ip_v6_interface_validator(__input_value: Any) -> IPv6Interface: + if isinstance(__input_value, IPv6Interface): + return __input_value try: - return IPv6Interface(input_value) + return IPv6Interface(__input_value) except ValueError: raise PydanticCustomError('ip_v6_interface', 'Input is not a valid IPv6 interface') -def fraction_validator(input_value: Any, /) -> Fraction: - if isinstance(input_value, Fraction): - return input_value +def greater_than_validator(x: Any, gt: Any) -> Any: + if not (x > gt): + raise PydanticKnownError('greater_than', {'gt': gt}) + return x - try: - return Fraction(input_value) - except ValueError: - raise PydanticCustomError('fraction_parsing', 'Input is not a valid fraction') + +def greater_than_or_equal_validator(x: Any, ge: Any) -> Any: + if not (x >= ge): + raise PydanticKnownError('greater_than_equal', {'ge': ge}) + return x + + +def less_than_validator(x: Any, lt: Any) -> Any: + if not (x < lt): + raise PydanticKnownError('less_than', {'lt': lt}) + return x + + +def less_than_or_equal_validator(x: Any, le: Any) -> Any: + if not (x <= le): + raise PydanticKnownError('less_than_equal', {'le': le}) + return x + + +def multiple_of_validator(x: Any, multiple_of: Any) -> Any: + if not (x % multiple_of == 0): + raise PydanticKnownError('multiple_of', {'multiple_of': multiple_of}) + return x + + +def min_length_validator(x: Any, min_length: Any) -> Any: + if not (len(x) >= min_length): + raise PydanticKnownError( + 'too_short', + {'field_type': 'Value', 'min_length': min_length, 'actual_length': len(x)}, + ) + return x + + +def max_length_validator(x: Any, max_length: Any) -> Any: + if len(x) > max_length: + raise PydanticKnownError( + 'too_long', + {'field_type': 'Value', 'max_length': max_length, 'actual_length': len(x)}, + ) + return x def forbid_inf_nan_check(x: Any) -> Any: if not math.isfinite(x): raise PydanticKnownError('finite_number') return x - - -def _safe_repr(v: Any) -> int | float | str: - """The context argument for `PydanticKnownError` requires a number or str type, so we do a simple repr() coercion for types like timedelta. - - See tests/test_types.py::test_annotated_metadata_any_order for some context. - """ - if isinstance(v, (int, float, str)): - return v - return repr(v) - - -def greater_than_validator(x: Any, gt: Any) -> Any: - try: - if not (x > gt): - raise PydanticKnownError('greater_than', {'gt': _safe_repr(gt)}) - return x - except TypeError: - raise TypeError(f"Unable to apply constraint 'gt' to supplied value {x}") - - -def greater_than_or_equal_validator(x: Any, ge: Any) -> Any: - try: - if not (x >= ge): - raise PydanticKnownError('greater_than_equal', {'ge': _safe_repr(ge)}) - return x - except TypeError: - raise TypeError(f"Unable to apply constraint 'ge' to supplied value {x}") - - -def less_than_validator(x: Any, lt: Any) -> Any: - try: - if not (x < lt): - raise PydanticKnownError('less_than', {'lt': _safe_repr(lt)}) - return x - except TypeError: - raise TypeError(f"Unable to apply constraint 'lt' to supplied value {x}") - - -def less_than_or_equal_validator(x: Any, le: Any) -> Any: - try: - if not (x <= le): - raise PydanticKnownError('less_than_equal', {'le': _safe_repr(le)}) - return x - except TypeError: - raise TypeError(f"Unable to apply constraint 'le' to supplied value {x}") - - -def multiple_of_validator(x: Any, multiple_of: Any) -> Any: - try: - if x % multiple_of: - raise PydanticKnownError('multiple_of', {'multiple_of': _safe_repr(multiple_of)}) - return x - except TypeError: - raise TypeError(f"Unable to apply constraint 'multiple_of' to supplied value {x}") - - -def min_length_validator(x: Any, min_length: Any) -> Any: - try: - if not (len(x) >= min_length): - raise PydanticKnownError( - 'too_short', {'field_type': 'Value', 'min_length': min_length, 'actual_length': len(x)} - ) - return x - except TypeError: - raise TypeError(f"Unable to apply constraint 'min_length' to supplied value {x}") - - -def max_length_validator(x: Any, max_length: Any) -> Any: - try: - if len(x) > max_length: - raise PydanticKnownError( - 'too_long', - {'field_type': 'Value', 'max_length': max_length, 'actual_length': len(x)}, - ) - return x - except TypeError: - raise TypeError(f"Unable to apply constraint 'max_length' to supplied value {x}") - - -def _extract_decimal_digits_info(decimal: Decimal) -> tuple[int, int]: - """Compute the total number of digits and decimal places for a given [`Decimal`][decimal.Decimal] instance. - - This function handles both normalized and non-normalized Decimal instances. - Example: Decimal('1.230') -> 4 digits, 3 decimal places - - Args: - decimal (Decimal): The decimal number to analyze. - - Returns: - tuple[int, int]: A tuple containing the number of decimal places and total digits. - - Though this could be divided into two separate functions, the logic is easier to follow if we couple the computation - of the number of decimals and digits together. - """ - try: - decimal_tuple = decimal.as_tuple() - - assert isinstance(decimal_tuple.exponent, int) - - exponent = decimal_tuple.exponent - num_digits = len(decimal_tuple.digits) - - if exponent >= 0: - # A positive exponent adds that many trailing zeros - # Ex: digit_tuple=(1, 2, 3), exponent=2 -> 12300 -> 0 decimal places, 5 digits - num_digits += exponent - decimal_places = 0 - else: - # If the absolute value of the negative exponent is larger than the - # number of digits, then it's the same as the number of digits, - # because it'll consume all the digits in digit_tuple and then - # add abs(exponent) - len(digit_tuple) leading zeros after the decimal point. - # Ex: digit_tuple=(1, 2, 3), exponent=-2 -> 1.23 -> 2 decimal places, 3 digits - # Ex: digit_tuple=(1, 2, 3), exponent=-4 -> 0.0123 -> 4 decimal places, 4 digits - decimal_places = abs(exponent) - num_digits = max(num_digits, decimal_places) - - return decimal_places, num_digits - except (AssertionError, AttributeError): - raise TypeError(f'Unable to extract decimal digits info from supplied value {decimal}') - - -def max_digits_validator(x: Any, max_digits: Any) -> Any: - try: - _, num_digits = _extract_decimal_digits_info(x) - _, normalized_num_digits = _extract_decimal_digits_info(x.normalize()) - if (num_digits > max_digits) and (normalized_num_digits > max_digits): - raise PydanticKnownError( - 'decimal_max_digits', - {'max_digits': max_digits}, - ) - return x - except TypeError: - raise TypeError(f"Unable to apply constraint 'max_digits' to supplied value {x}") - - -def decimal_places_validator(x: Any, decimal_places: Any) -> Any: - try: - decimal_places_, _ = _extract_decimal_digits_info(x) - if decimal_places_ > decimal_places: - normalized_decimal_places, _ = _extract_decimal_digits_info(x.normalize()) - if normalized_decimal_places > decimal_places: - raise PydanticKnownError( - 'decimal_max_places', - {'decimal_places': decimal_places}, - ) - return x - except TypeError: - raise TypeError(f"Unable to apply constraint 'decimal_places' to supplied value {x}") - - -def deque_validator(input_value: Any, handler: core_schema.ValidatorFunctionWrapHandler) -> collections.deque[Any]: - return collections.deque(handler(input_value), maxlen=getattr(input_value, 'maxlen', None)) - - -def defaultdict_validator( - input_value: Any, handler: core_schema.ValidatorFunctionWrapHandler, default_default_factory: Callable[[], Any] -) -> collections.defaultdict[Any, Any]: - if isinstance(input_value, collections.defaultdict): - default_factory = input_value.default_factory - return collections.defaultdict(default_factory, handler(input_value)) - else: - return collections.defaultdict(default_default_factory, handler(input_value)) - - -def get_defaultdict_default_default_factory(values_source_type: Any) -> Callable[[], Any]: - FieldInfo = import_cached_field_info() - - values_type_origin = get_origin(values_source_type) - - def infer_default() -> Callable[[], Any]: - allowed_default_types: dict[Any, Any] = { - tuple: tuple, - collections.abc.Sequence: tuple, - collections.abc.MutableSequence: list, - list: list, - typing.Sequence: list, - set: set, - typing.MutableSet: set, - collections.abc.MutableSet: set, - collections.abc.Set: frozenset, - typing.MutableMapping: dict, - typing.Mapping: dict, - collections.abc.Mapping: dict, - collections.abc.MutableMapping: dict, - float: float, - int: int, - str: str, - bool: bool, - } - values_type = values_type_origin or values_source_type - instructions = 'set using `DefaultDict[..., Annotated[..., Field(default_factory=...)]]`' - if typing_objects.is_typevar(values_type): - - def type_var_default_factory() -> None: - raise RuntimeError( - 'Generic defaultdict cannot be used without a concrete value type or an' - ' explicit default factory, ' + instructions - ) - - return type_var_default_factory - elif values_type not in allowed_default_types: - # a somewhat subjective set of types that have reasonable default values - allowed_msg = ', '.join([t.__name__ for t in set(allowed_default_types.values())]) - raise PydanticSchemaGenerationError( - f'Unable to infer a default factory for keys of type {values_source_type}.' - f' Only {allowed_msg} are supported, other types require an explicit default factory' - ' ' + instructions - ) - return allowed_default_types[values_type] - - # Assume Annotated[..., Field(...)] - if typing_objects.is_annotated(values_type_origin): - field_info = next((v for v in get_args(values_source_type) if isinstance(v, FieldInfo)), None) - else: - field_info = None - if field_info and field_info.default_factory: - # Assume the default factory does not take any argument: - default_default_factory = cast(Callable[[], Any], field_info.default_factory) - else: - default_default_factory = infer_default() - return default_default_factory - - -def validate_str_is_valid_iana_tz(value: Any, /) -> ZoneInfo: - if isinstance(value, ZoneInfo): - return value - try: - return ZoneInfo(value) - except (ZoneInfoNotFoundError, ValueError, TypeError): - raise PydanticCustomError('zoneinfo_str', 'invalid timezone: {value}', {'value': value}) - - -NUMERIC_VALIDATOR_LOOKUP: dict[str, Callable] = { - 'gt': greater_than_validator, - 'ge': greater_than_or_equal_validator, - 'lt': less_than_validator, - 'le': less_than_or_equal_validator, - 'multiple_of': multiple_of_validator, - 'min_length': min_length_validator, - 'max_length': max_length_validator, - 'max_digits': max_digits_validator, - 'decimal_places': decimal_places_validator, -} - -IpType = Union[IPv4Address, IPv6Address, IPv4Network, IPv6Network, IPv4Interface, IPv6Interface] - -IP_VALIDATOR_LOOKUP: dict[type[IpType], Callable] = { - IPv4Address: ip_v4_address_validator, - IPv6Address: ip_v6_address_validator, - IPv4Network: ip_v4_network_validator, - IPv6Network: ip_v6_network_validator, - IPv4Interface: ip_v4_interface_validator, - IPv6Interface: ip_v6_interface_validator, -} - -MAPPING_ORIGIN_MAP: dict[Any, Any] = { - typing.DefaultDict: collections.defaultdict, # noqa: UP006 - collections.defaultdict: collections.defaultdict, - typing.OrderedDict: collections.OrderedDict, # noqa: UP006 - collections.OrderedDict: collections.OrderedDict, - typing_extensions.OrderedDict: collections.OrderedDict, - typing.Counter: collections.Counter, - collections.Counter: collections.Counter, - # this doesn't handle subclasses of these - typing.Mapping: dict, - typing.MutableMapping: dict, - # parametrized typing.{Mutable}Mapping creates one of these - collections.abc.Mapping: dict, - collections.abc.MutableMapping: dict, -} diff --git a/Backend/venv/lib/python3.12/site-packages/pydantic/_migration.py b/Backend/venv/lib/python3.12/site-packages/pydantic/_migration.py index b4ecd283..c8478a62 100644 --- a/Backend/venv/lib/python3.12/site-packages/pydantic/_migration.py +++ b/Backend/venv/lib/python3.12/site-packages/pydantic/_migration.py @@ -1,7 +1,5 @@ import sys -from typing import Any, Callable - -from pydantic.warnings import PydanticDeprecatedSince20 +from typing import Any, Callable, Dict from .version import version_short @@ -282,11 +280,7 @@ def getattr_migration(module: str) -> Callable[[str], Any]: import_path = f'{module}:{name}' if import_path in MOVED_IN_V2.keys(): new_location = MOVED_IN_V2[import_path] - warnings.warn( - f'`{import_path}` has been moved to `{new_location}`.', - category=PydanticDeprecatedSince20, - stacklevel=2, - ) + warnings.warn(f'`{import_path}` has been moved to `{new_location}`.') return import_string(MOVED_IN_V2[import_path]) if import_path in DEPRECATED_MOVED_IN_V2: # skip the warning here because a deprecation warning will be raised elsewhere @@ -295,9 +289,7 @@ def getattr_migration(module: str) -> Callable[[str], Any]: new_location = REDIRECT_TO_V1[import_path] warnings.warn( f'`{import_path}` has been removed. We are importing from `{new_location}` instead.' - 'See the migration guide for more details: https://docs.pydantic.dev/latest/migration/', - category=PydanticDeprecatedSince20, - stacklevel=2, + 'See the migration guide for more details: https://docs.pydantic.dev/latest/migration/' ) return import_string(REDIRECT_TO_V1[import_path]) if import_path == 'pydantic:BaseSettings': @@ -308,7 +300,7 @@ def getattr_migration(module: str) -> Callable[[str], Any]: ) if import_path in REMOVED_IN_V2: raise PydanticImportError(f'`{import_path}` has been removed in V2.') - globals: dict[str, Any] = sys.modules[module].__dict__ + globals: Dict[str, Any] = sys.modules[module].__dict__ if name in globals: return globals[name] raise AttributeError(f'module {module!r} has no attribute {name!r}') diff --git a/Backend/venv/lib/python3.12/site-packages/pydantic/alias_generators.py b/Backend/venv/lib/python3.12/site-packages/pydantic/alias_generators.py index 0b7653f5..bbdaaaf1 100644 --- a/Backend/venv/lib/python3.12/site-packages/pydantic/alias_generators.py +++ b/Backend/venv/lib/python3.12/site-packages/pydantic/alias_generators.py @@ -1,13 +1,8 @@ """Alias generators for converting between different capitalization conventions.""" - import re __all__ = ('to_pascal', 'to_camel', 'to_snake') -# TODO: in V3, change the argument names to be more descriptive -# Generally, don't only convert from snake_case, or name the functions -# more specifically like snake_to_camel. - def to_pascal(snake: str) -> str: """Convert a snake_case string to PascalCase. @@ -31,17 +26,12 @@ def to_camel(snake: str) -> str: Returns: The converted camelCase string. """ - # If the string is already in camelCase and does not contain a digit followed - # by a lowercase letter, return it as it is - if re.match('^[a-z]+[A-Za-z0-9]*$', snake) and not re.search(r'\d[a-z]', snake): - return snake - camel = to_pascal(snake) return re.sub('(^_*[A-Z])', lambda m: m.group(1).lower(), camel) def to_snake(camel: str) -> str: - """Convert a PascalCase, camelCase, or kebab-case string to snake_case. + """Convert a PascalCase or camelCase string to snake_case. Args: camel: The string to convert. @@ -49,14 +39,6 @@ def to_snake(camel: str) -> str: Returns: The converted string in snake_case. """ - # Handle the sequence of uppercase letters followed by a lowercase letter - snake = re.sub(r'([A-Z]+)([A-Z][a-z])', lambda m: f'{m.group(1)}_{m.group(2)}', camel) - # Insert an underscore between a lowercase letter and an uppercase letter - snake = re.sub(r'([a-z])([A-Z])', lambda m: f'{m.group(1)}_{m.group(2)}', snake) - # Insert an underscore between a digit and an uppercase letter - snake = re.sub(r'([0-9])([A-Z])', lambda m: f'{m.group(1)}_{m.group(2)}', snake) - # Insert an underscore between a lowercase letter and a digit - snake = re.sub(r'([a-z])([0-9])', lambda m: f'{m.group(1)}_{m.group(2)}', snake) - # Replace hyphens with underscores to handle kebab-case - snake = snake.replace('-', '_') + snake = re.sub(r'([a-zA-Z])([0-9])', lambda m: f'{m.group(1)}_{m.group(2)}', camel) + snake = re.sub(r'([a-z0-9])([A-Z])', lambda m: f'{m.group(1)}_{m.group(2)}', snake) return snake.lower() diff --git a/Backend/venv/lib/python3.12/site-packages/pydantic/aliases.py b/Backend/venv/lib/python3.12/site-packages/pydantic/aliases.py deleted file mode 100644 index ac227370..00000000 --- a/Backend/venv/lib/python3.12/site-packages/pydantic/aliases.py +++ /dev/null @@ -1,135 +0,0 @@ -"""Support for alias configurations.""" - -from __future__ import annotations - -import dataclasses -from typing import Any, Callable, Literal - -from pydantic_core import PydanticUndefined - -from ._internal import _internal_dataclass - -__all__ = ('AliasGenerator', 'AliasPath', 'AliasChoices') - - -@dataclasses.dataclass(**_internal_dataclass.slots_true) -class AliasPath: - """!!! abstract "Usage Documentation" - [`AliasPath` and `AliasChoices`](../concepts/alias.md#aliaspath-and-aliaschoices) - - A data class used by `validation_alias` as a convenience to create aliases. - - Attributes: - path: A list of string or integer aliases. - """ - - path: list[int | str] - - def __init__(self, first_arg: str, *args: str | int) -> None: - self.path = [first_arg] + list(args) - - def convert_to_aliases(self) -> list[str | int]: - """Converts arguments to a list of string or integer aliases. - - Returns: - The list of aliases. - """ - return self.path - - def search_dict_for_path(self, d: dict) -> Any: - """Searches a dictionary for the path specified by the alias. - - Returns: - The value at the specified path, or `PydanticUndefined` if the path is not found. - """ - v = d - for k in self.path: - if isinstance(v, str): - # disallow indexing into a str, like for AliasPath('x', 0) and x='abc' - return PydanticUndefined - try: - v = v[k] - except (KeyError, IndexError, TypeError): - return PydanticUndefined - return v - - -@dataclasses.dataclass(**_internal_dataclass.slots_true) -class AliasChoices: - """!!! abstract "Usage Documentation" - [`AliasPath` and `AliasChoices`](../concepts/alias.md#aliaspath-and-aliaschoices) - - A data class used by `validation_alias` as a convenience to create aliases. - - Attributes: - choices: A list containing a string or `AliasPath`. - """ - - choices: list[str | AliasPath] - - def __init__(self, first_choice: str | AliasPath, *choices: str | AliasPath) -> None: - self.choices = [first_choice] + list(choices) - - def convert_to_aliases(self) -> list[list[str | int]]: - """Converts arguments to a list of lists containing string or integer aliases. - - Returns: - The list of aliases. - """ - aliases: list[list[str | int]] = [] - for c in self.choices: - if isinstance(c, AliasPath): - aliases.append(c.convert_to_aliases()) - else: - aliases.append([c]) - return aliases - - -@dataclasses.dataclass(**_internal_dataclass.slots_true) -class AliasGenerator: - """!!! abstract "Usage Documentation" - [Using an `AliasGenerator`](../concepts/alias.md#using-an-aliasgenerator) - - A data class used by `alias_generator` as a convenience to create various aliases. - - Attributes: - alias: A callable that takes a field name and returns an alias for it. - validation_alias: A callable that takes a field name and returns a validation alias for it. - serialization_alias: A callable that takes a field name and returns a serialization alias for it. - """ - - alias: Callable[[str], str] | None = None - validation_alias: Callable[[str], str | AliasPath | AliasChoices] | None = None - serialization_alias: Callable[[str], str] | None = None - - def _generate_alias( - self, - alias_kind: Literal['alias', 'validation_alias', 'serialization_alias'], - allowed_types: tuple[type[str] | type[AliasPath] | type[AliasChoices], ...], - field_name: str, - ) -> str | AliasPath | AliasChoices | None: - """Generate an alias of the specified kind. Returns None if the alias generator is None. - - Raises: - TypeError: If the alias generator produces an invalid type. - """ - alias = None - if alias_generator := getattr(self, alias_kind): - alias = alias_generator(field_name) - if alias and not isinstance(alias, allowed_types): - raise TypeError( - f'Invalid `{alias_kind}` type. `{alias_kind}` generator must produce one of `{allowed_types}`' - ) - return alias - - def generate_aliases(self, field_name: str) -> tuple[str | None, str | AliasPath | AliasChoices | None, str | None]: - """Generate `alias`, `validation_alias`, and `serialization_alias` for a field. - - Returns: - A tuple of three aliases - validation, alias, and serialization. - """ - alias = self._generate_alias('alias', (str,), field_name) - validation_alias = self._generate_alias('validation_alias', (str, AliasChoices, AliasPath), field_name) - serialization_alias = self._generate_alias('serialization_alias', (str,), field_name) - - return alias, validation_alias, serialization_alias # type: ignore diff --git a/Backend/venv/lib/python3.12/site-packages/pydantic/annotated_handlers.py b/Backend/venv/lib/python3.12/site-packages/pydantic/annotated_handlers.py index d0cb5d3d..59adabfd 100644 --- a/Backend/venv/lib/python3.12/site-packages/pydantic/annotated_handlers.py +++ b/Backend/venv/lib/python3.12/site-packages/pydantic/annotated_handlers.py @@ -1,5 +1,4 @@ """Type annotations to use with `__get_pydantic_core_schema__` and `__get_pydantic_json_schema__`.""" - from __future__ import annotations as _annotations from typing import TYPE_CHECKING, Any, Union @@ -7,7 +6,6 @@ from typing import TYPE_CHECKING, Any, Union from pydantic_core import core_schema if TYPE_CHECKING: - from ._internal._namespace_utils import NamespacesTuple from .json_schema import JsonSchemaMode, JsonSchemaValue CoreSchemaOrField = Union[ @@ -30,7 +28,7 @@ class GetJsonSchemaHandler: mode: JsonSchemaMode - def __call__(self, core_schema: CoreSchemaOrField, /) -> JsonSchemaValue: + def __call__(self, __core_schema: CoreSchemaOrField) -> JsonSchemaValue: """Call the inner handler and get the JsonSchemaValue it returns. This will call the next JSON schema modifying function up until it calls into `pydantic.json_schema.GenerateJsonSchema`, which will raise a @@ -38,7 +36,7 @@ class GetJsonSchemaHandler: a JSON schema. Args: - core_schema: A `pydantic_core.core_schema.CoreSchema`. + __core_schema: A `pydantic_core.core_schema.CoreSchema`. Returns: JsonSchemaValue: The JSON schema generated by the inner JSON schema modify @@ -46,13 +44,13 @@ class GetJsonSchemaHandler: """ raise NotImplementedError - def resolve_ref_schema(self, maybe_ref_json_schema: JsonSchemaValue, /) -> JsonSchemaValue: + def resolve_ref_schema(self, __maybe_ref_json_schema: JsonSchemaValue) -> JsonSchemaValue: """Get the real schema for a `{"$ref": ...}` schema. If the schema given is not a `$ref` schema, it will be returned as is. This means you don't have to check before calling this function. Args: - maybe_ref_json_schema: A JsonSchemaValue which may be a `$ref` schema. + __maybe_ref_json_schema: A JsonSchemaValue, ref based or not. Raises: LookupError: If the ref is not found. @@ -66,7 +64,7 @@ class GetJsonSchemaHandler: class GetCoreSchemaHandler: """Handler to call into the next CoreSchema schema generation function.""" - def __call__(self, source_type: Any, /) -> core_schema.CoreSchema: + def __call__(self, __source_type: Any) -> core_schema.CoreSchema: """Call the inner handler and get the CoreSchema it returns. This will call the next CoreSchema modifying function up until it calls into Pydantic's internal schema generation machinery, which will raise a @@ -74,14 +72,14 @@ class GetCoreSchemaHandler: a CoreSchema for the given source type. Args: - source_type: The input type. + __source_type: The input type. Returns: CoreSchema: The `pydantic-core` CoreSchema generated. """ raise NotImplementedError - def generate_schema(self, source_type: Any, /) -> core_schema.CoreSchema: + def generate_schema(self, __source_type: Any) -> core_schema.CoreSchema: """Generate a schema unrelated to the current context. Use this function if e.g. you are handling schema generation for a sequence and want to generate a schema for its items. @@ -89,20 +87,20 @@ class GetCoreSchemaHandler: that was intended for the sequence itself to its items! Args: - source_type: The input type. + __source_type: The input type. Returns: CoreSchema: The `pydantic-core` CoreSchema generated. """ raise NotImplementedError - def resolve_ref_schema(self, maybe_ref_schema: core_schema.CoreSchema, /) -> core_schema.CoreSchema: + def resolve_ref_schema(self, __maybe_ref_schema: core_schema.CoreSchema) -> core_schema.CoreSchema: """Get the real schema for a `definition-ref` schema. If the schema given is not a `definition-ref` schema, it will be returned as is. This means you don't have to check before calling this function. Args: - maybe_ref_schema: A `CoreSchema`, `ref`-based or not. + __maybe_ref_schema: A `CoreSchema`, `ref`-based or not. Raises: LookupError: If the `ref` is not found. @@ -117,6 +115,6 @@ class GetCoreSchemaHandler: """Get the name of the closest field to this validator.""" raise NotImplementedError - def _get_types_namespace(self) -> NamespacesTuple: + def _get_types_namespace(self) -> dict[str, Any] | None: """Internal method used during type resolution for serializer annotations.""" raise NotImplementedError diff --git a/Backend/venv/lib/python3.12/site-packages/pydantic/class_validators.py b/Backend/venv/lib/python3.12/site-packages/pydantic/class_validators.py index 9977150c..2ff72ae5 100644 --- a/Backend/venv/lib/python3.12/site-packages/pydantic/class_validators.py +++ b/Backend/venv/lib/python3.12/site-packages/pydantic/class_validators.py @@ -1,5 +1,4 @@ """`class_validators` module is a backport module from V1.""" - from ._migration import getattr_migration __getattr__ = getattr_migration(__name__) diff --git a/Backend/venv/lib/python3.12/site-packages/pydantic/color.py b/Backend/venv/lib/python3.12/site-packages/pydantic/color.py index 9a42d586..108bb8fa 100644 --- a/Backend/venv/lib/python3.12/site-packages/pydantic/color.py +++ b/Backend/venv/lib/python3.12/site-packages/pydantic/color.py @@ -11,11 +11,10 @@ Warning: Deprecated See [`pydantic-extra-types.Color`](../usage/types/extra_types/color_types.md) for more information. """ - import math import re from colorsys import hls_to_rgb, rgb_to_hls -from typing import Any, Callable, Optional, Union, cast +from typing import Any, Callable, Optional, Tuple, Type, Union, cast from pydantic_core import CoreSchema, PydanticCustomError, core_schema from typing_extensions import deprecated @@ -25,9 +24,9 @@ from ._internal._schema_generation_shared import GetJsonSchemaHandler as _GetJso from .json_schema import JsonSchemaValue from .warnings import PydanticDeprecatedSince20 -ColorTuple = Union[tuple[int, int, int], tuple[int, int, int, float]] +ColorTuple = Union[Tuple[int, int, int], Tuple[int, int, int, float]] ColorType = Union[ColorTuple, str] -HslColorTuple = Union[tuple[float, float, float], tuple[float, float, float, float]] +HslColorTuple = Union[Tuple[float, float, float], Tuple[float, float, float, float]] class RGBA: @@ -41,7 +40,7 @@ class RGBA: self.b = b self.alpha = alpha - self._tuple: tuple[float, float, float, Optional[float]] = (r, g, b, alpha) + self._tuple: Tuple[float, float, float, Optional[float]] = (r, g, b, alpha) def __getitem__(self, item: Any) -> Any: return self._tuple[item] @@ -124,7 +123,7 @@ class Color(_repr.Representation): ValueError: When no named color is found and fallback is `False`. """ if self._rgba.alpha is None: - rgb = cast(tuple[int, int, int], self.as_rgb_tuple()) + rgb = cast(Tuple[int, int, int], self.as_rgb_tuple()) try: return COLORS_BY_VALUE[rgb] except KeyError as e: @@ -232,7 +231,7 @@ class Color(_repr.Representation): @classmethod def __get_pydantic_core_schema__( - cls, source: type[Any], handler: Callable[[Any], CoreSchema] + cls, source: Type[Any], handler: Callable[[Any], CoreSchema] ) -> core_schema.CoreSchema: return core_schema.with_info_plain_validator_function( cls._validate, serialization=core_schema.to_string_ser_schema() @@ -255,7 +254,7 @@ class Color(_repr.Representation): return hash(self.as_rgb_tuple()) -def parse_tuple(value: tuple[Any, ...]) -> RGBA: +def parse_tuple(value: Tuple[Any, ...]) -> RGBA: """Parse a tuple or list to get RGBA values. Args: diff --git a/Backend/venv/lib/python3.12/site-packages/pydantic/config.py b/Backend/venv/lib/python3.12/site-packages/pydantic/config.py index bbf57aa4..976fa06c 100644 --- a/Backend/venv/lib/python3.12/site-packages/pydantic/config.py +++ b/Backend/venv/lib/python3.12/site-packages/pydantic/config.py @@ -1,33 +1,26 @@ """Configuration for Pydantic models.""" - from __future__ import annotations as _annotations -import warnings -from re import Pattern -from typing import TYPE_CHECKING, Any, Callable, Literal, TypeVar, Union, cast, overload +from typing import TYPE_CHECKING, Any, Callable, Dict, List, Type, Union -from typing_extensions import TypeAlias, TypedDict, Unpack, deprecated +from typing_extensions import Literal, TypeAlias, TypedDict from ._migration import getattr_migration -from .aliases import AliasGenerator -from .errors import PydanticUserError -from .warnings import PydanticDeprecatedSince211 if TYPE_CHECKING: from ._internal._generate_schema import GenerateSchema as _GenerateSchema - from .fields import ComputedFieldInfo, FieldInfo -__all__ = ('ConfigDict', 'with_config') +__all__ = ('ConfigDict',) -JsonValue: TypeAlias = Union[int, float, str, bool, None, list['JsonValue'], 'JsonDict'] -JsonDict: TypeAlias = dict[str, JsonValue] +JsonValue: TypeAlias = Union[int, float, str, bool, None, List['JsonValue'], 'JsonDict'] +JsonDict: TypeAlias = Dict[str, JsonValue] JsonEncoder = Callable[[Any], Any] JsonSchemaExtraCallable: TypeAlias = Union[ Callable[[JsonDict], None], - Callable[[JsonDict, type[Any]], None], + Callable[[JsonDict, Type[Any]], None], ] ExtraValues = Literal['allow', 'ignore', 'forbid'] @@ -39,18 +32,11 @@ class ConfigDict(TypedDict, total=False): title: str | None """The title for the generated JSON schema, defaults to the model's name""" - model_title_generator: Callable[[type], str] | None - """A callable that takes a model class and returns the title for it. Defaults to `None`.""" - - field_title_generator: Callable[[str, FieldInfo | ComputedFieldInfo], str] | None - """A callable that takes a field's name and info and returns title for it. Defaults to `None`.""" - str_to_lower: bool """Whether to convert all characters to lowercase for str types. Defaults to `False`.""" str_to_upper: bool """Whether to convert all characters to uppercase for str types. Defaults to `False`.""" - str_strip_whitespace: bool """Whether to strip leading and trailing whitespace for str types.""" @@ -61,129 +47,84 @@ class ConfigDict(TypedDict, total=False): """The maximum length for str types. Defaults to `None`.""" extra: ExtraValues | None - ''' - Whether to ignore, allow, or forbid extra data during model initialization. Defaults to `'ignore'`. + """ + Whether to ignore, allow, or forbid extra attributes during model initialization. Defaults to `'ignore'`. - Three configuration values are available: + You can configure how pydantic handles the attributes that are not defined in the model: - - `'ignore'`: Providing extra data is ignored (the default): - ```python - from pydantic import BaseModel, ConfigDict + * `allow` - Allow any extra attributes. + * `forbid` - Forbid any extra attributes. + * `ignore` - Ignore any extra attributes. - class User(BaseModel): - model_config = ConfigDict(extra='ignore') # (1)! - - name: str - - user = User(name='John Doe', age=20) # (2)! - print(user) - #> name='John Doe' - ``` - - 1. This is the default behaviour. - 2. The `age` argument is ignored. - - - `'forbid'`: Providing extra data is not permitted, and a [`ValidationError`][pydantic_core.ValidationError] - will be raised if this is the case: - ```python - from pydantic import BaseModel, ConfigDict, ValidationError + ```py + from pydantic import BaseModel, ConfigDict - class Model(BaseModel): - x: int + class User(BaseModel): + model_config = ConfigDict(extra='ignore') # (1)! - model_config = ConfigDict(extra='forbid') + name: str - try: - Model(x=1, y='a') - except ValidationError as exc: - print(exc) - """ - 1 validation error for Model - y - Extra inputs are not permitted [type=extra_forbidden, input_value='a', input_type=str] - """ - ``` + user = User(name='John Doe', age=20) # (2)! + print(user) + #> name='John Doe' + ``` - - `'allow'`: Providing extra data is allowed and stored in the `__pydantic_extra__` dictionary attribute: - ```python - from pydantic import BaseModel, ConfigDict + 1. This is the default behaviour. + 2. The `age` argument is ignored. + + Instead, with `extra='allow'`, the `age` argument is included: + + ```py + from pydantic import BaseModel, ConfigDict - class Model(BaseModel): - x: int + class User(BaseModel): + model_config = ConfigDict(extra='allow') - model_config = ConfigDict(extra='allow') + name: str - m = Model(x=1, y='a') - assert m.__pydantic_extra__ == {'y': 'a'} - ``` - By default, no validation will be applied to these extra items, but you can set a type for the values by overriding - the type annotation for `__pydantic_extra__`: - ```python - from pydantic import BaseModel, ConfigDict, Field, ValidationError + user = User(name='John Doe', age=20) # (1)! + print(user) + #> name='John Doe' age=20 + ``` + 1. The `age` argument is included. - class Model(BaseModel): - __pydantic_extra__: dict[str, int] = Field(init=False) # (1)! + With `extra='forbid'`, an error is raised: - x: int - - model_config = ConfigDict(extra='allow') - - - try: - Model(x=1, y='a') - except ValidationError as exc: - print(exc) - """ - 1 validation error for Model - y - Input should be a valid integer, unable to parse string as an integer [type=int_parsing, input_value='a', input_type=str] - """ - - m = Model(x=1, y='2') - assert m.x == 1 - assert m.y == 2 - assert m.model_dump() == {'x': 1, 'y': 2} - assert m.__pydantic_extra__ == {'y': 2} - ``` - - 1. The `= Field(init=False)` does not have any effect at runtime, but prevents the `__pydantic_extra__` field from - being included as a parameter to the model's `__init__` method by type checkers. - - As well as specifying an `extra` configuration value on the model, you can also provide it as an argument to the validation methods. - This will override any `extra` configuration value set on the model: - ```python + ```py from pydantic import BaseModel, ConfigDict, ValidationError - class Model(BaseModel): - x: int - model_config = ConfigDict(extra="allow") + + class User(BaseModel): + model_config = ConfigDict(extra='forbid') + + name: str + try: - # Override model config and forbid extra fields just this time - Model.model_validate({"x": 1, "y": 2}, extra="forbid") - except ValidationError as exc: - print(exc) - """ - 1 validation error for Model - y - Extra inputs are not permitted [type=extra_forbidden, input_value=2, input_type=int] - """ + User(name='John Doe', age=20) + except ValidationError as e: + print(e) + ''' + 1 validation error for User + age + Extra inputs are not permitted [type=extra_forbidden, input_value=20, input_type=int] + ''' ``` - ''' + """ frozen: bool """ - Whether models are faux-immutable, i.e. whether `__setattr__` is allowed, and also generates + Whether or not models are faux-immutable, i.e. whether `__setattr__` is allowed, and also generates a `__hash__()` method for the model. This makes instances of the model potentially hashable if all the attributes are hashable. Defaults to `False`. Note: - On V1, the inverse of this setting was called `allow_mutation`, and was `True` by default. + On V1, this setting was called `allow_mutation`, and was `True` by default. """ populate_by_name: bool @@ -191,38 +132,32 @@ class ConfigDict(TypedDict, total=False): Whether an aliased field may be populated by its name as given by the model attribute, as well as the alias. Defaults to `False`. - !!! warning - `populate_by_name` usage is not recommended in v2.11+ and will be deprecated in v3. - Instead, you should use the [`validate_by_name`][pydantic.config.ConfigDict.validate_by_name] configuration setting. + Note: + The name of this configuration setting was changed in **v2.0** from + `allow_population_by_field_name` to `populate_by_name`. - When `validate_by_name=True` and `validate_by_alias=True`, this is strictly equivalent to the - previous behavior of `populate_by_name=True`. + ```py + from pydantic import BaseModel, ConfigDict, Field - In v2.11, we also introduced a [`validate_by_alias`][pydantic.config.ConfigDict.validate_by_alias] setting that introduces more fine grained - control for validation behavior. - Here's how you might go about using the new settings to achieve the same behavior: + class User(BaseModel): + model_config = ConfigDict(populate_by_name=True) - ```python - from pydantic import BaseModel, ConfigDict, Field + name: str = Field(alias='full_name') # (1)! + age: int - class Model(BaseModel): - model_config = ConfigDict(validate_by_name=True, validate_by_alias=True) - my_field: str = Field(alias='my_alias') # (1)! + user = User(full_name='John Doe', age=20) # (2)! + print(user) + #> name='John Doe' age=20 + user = User(name='John Doe', age=20) # (3)! + print(user) + #> name='John Doe' age=20 + ``` - m = Model(my_alias='foo') # (2)! - print(m) - #> my_field='foo' - - m = Model(my_field='foo') # (3)! - print(m) - #> my_field='foo' - ``` - - 1. The field `'my_field'` has an alias `'my_alias'`. - 2. The model is populated by the alias `'my_alias'`. - 3. The model is populated by the attribute name `'my_field'`. + 1. The field `'name'` has an alias `'full_name'`. + 2. The model is populated by the alias `'full_name'`. + 3. The model is populated by the field name `'name'`. """ use_enum_values: bool @@ -235,28 +170,29 @@ class ConfigDict(TypedDict, total=False): for said Field to ensure that the `use_enum_values` flag takes effect on the default, as extracting an enum's value occurs during validation, not serialization. - ```python + ```py from enum import Enum from typing import Optional from pydantic import BaseModel, ConfigDict, Field + class SomeEnum(Enum): FOO = 'foo' BAR = 'bar' BAZ = 'baz' + class SomeModel(BaseModel): model_config = ConfigDict(use_enum_values=True) some_enum: SomeEnum - another_enum: Optional[SomeEnum] = Field( - default=SomeEnum.FOO, validate_default=True - ) + another_enum: Optional[SomeEnum] = Field(default=SomeEnum.FOO, validate_default=True) + model1 = SomeModel(some_enum=SomeEnum.BAR) print(model1.model_dump()) - #> {'some_enum': 'bar', 'another_enum': 'foo'} + # {'some_enum': 'bar', 'another_enum': 'foo'} model2 = SomeModel(some_enum=SomeEnum.BAR, another_enum=SomeEnum.BAZ) print(model2.model_dump()) @@ -272,7 +208,7 @@ class ConfigDict(TypedDict, total=False): In case the user changes the data after the model is created, the model is _not_ revalidated. - ```python + ```py from pydantic import BaseModel class User(BaseModel): @@ -291,7 +227,7 @@ class ConfigDict(TypedDict, total=False): In case you want to revalidate the model when the data is changed, you can use `validate_assignment=True`: - ```python + ```py from pydantic import BaseModel, ValidationError class User(BaseModel, validate_assignment=True): # (1)! @@ -320,7 +256,7 @@ class ConfigDict(TypedDict, total=False): """ Whether arbitrary types are allowed for field types. Defaults to `False`. - ```python + ```py from pydantic import BaseModel, ConfigDict, ValidationError # This is not a pydantic model, it's an arbitrary class @@ -379,20 +315,14 @@ class ConfigDict(TypedDict, total=False): loc_by_alias: bool """Whether to use the actual key provided in the data (e.g. alias) for error `loc`s rather than the field's name. Defaults to `True`.""" - alias_generator: Callable[[str], str] | AliasGenerator | None + alias_generator: Callable[[str], str] | None """ - A callable that takes a field name and returns an alias for it - or an instance of [`AliasGenerator`][pydantic.aliases.AliasGenerator]. Defaults to `None`. + A callable that takes a field name and returns an alias for it. - When using a callable, the alias generator is used for both validation and serialization. - If you want to use different alias generators for validation and serialization, you can use - [`AliasGenerator`][pydantic.aliases.AliasGenerator] instead. + If data source field names do not match your code style (e. g. CamelCase fields), + you can automatically generate aliases using `alias_generator`: - If data source field names do not match your code style (e.g. CamelCase fields), - you can automatically generate aliases using `alias_generator`. Here's an example with - a basic callable: - - ```python + ```py from pydantic import BaseModel, ConfigDict from pydantic.alias_generators import to_pascal @@ -409,30 +339,6 @@ class ConfigDict(TypedDict, total=False): #> {'Name': 'Filiz', 'LanguageCode': 'tr-TR'} ``` - If you want to use different alias generators for validation and serialization, you can use - [`AliasGenerator`][pydantic.aliases.AliasGenerator]. - - ```python - from pydantic import AliasGenerator, BaseModel, ConfigDict - from pydantic.alias_generators import to_camel, to_pascal - - class Athlete(BaseModel): - first_name: str - last_name: str - sport: str - - model_config = ConfigDict( - alias_generator=AliasGenerator( - validation_alias=to_camel, - serialization_alias=to_pascal, - ) - ) - - athlete = Athlete(firstName='John', lastName='Doe', sport='track') - print(athlete.model_dump(by_alias=True)) - #> {'FirstName': 'John', 'LastName': 'Doe', 'Sport': 'track'} - ``` - Note: Pydantic offers three built-in alias generators: [`to_pascal`][pydantic.alias_generators.to_pascal], [`to_camel`][pydantic.alias_generators.to_camel], and [`to_snake`][pydantic.alias_generators.to_snake]. @@ -446,7 +352,7 @@ class ConfigDict(TypedDict, total=False): """ allow_inf_nan: bool - """Whether to allow infinity (`+inf` an `-inf`) and NaN values to float and decimal fields. Defaults to `True`.""" + """Whether to allow infinity (`+inf` an `-inf`) and NaN values to float fields. Defaults to `True`.""" json_schema_extra: JsonDict | JsonSchemaExtraCallable | None """A dict or callable to provide extra JSON schema properties. Defaults to `None`.""" @@ -455,16 +361,16 @@ class ConfigDict(TypedDict, total=False): """ A `dict` of custom JSON encoders for specific types. Defaults to `None`. - /// version-deprecated | v2 - This configuration option is a carryover from v1. We originally planned to remove it in v2 but didn't have a 1:1 replacement - so we are keeping it for now. It is still deprecated and will likely be removed in the future. - /// + !!! warning "Deprecated" + This config option is a carryover from v1. + We originally planned to remove it in v2 but didn't have a 1:1 replacement so we are keeping it for now. + It is still deprecated and will likely be removed in the future. """ # new in V2 strict: bool """ - Whether strict validation is applied to all fields on the model. + _(new in V2)_ If `True`, strict validation is applied to all fields on the model. By default, Pydantic attempts to coerce values to the correct type, when possible. @@ -473,7 +379,7 @@ class ConfigDict(TypedDict, total=False): To configure strict mode for all fields on a model, you can set `strict=True` on the model. - ```python + ```py from pydantic import BaseModel, ConfigDict class Model(BaseModel): @@ -487,81 +393,133 @@ class ConfigDict(TypedDict, total=False): See the [Conversion Table](../concepts/conversion_table.md) for more details on how Pydantic converts data in both strict and lax modes. - - /// version-added | v2 - /// """ # whether instances of models and dataclasses (including subclass instances) should re-validate, default 'never' revalidate_instances: Literal['always', 'never', 'subclass-instances'] """ - When and how to revalidate models and dataclasses during validation. Can be one of: + When and how to revalidate models and dataclasses during validation. Accepts the string + values of `'never'`, `'always'` and `'subclass-instances'`. Defaults to `'never'`. - - `'never'`: will *not* revalidate models and dataclasses during validation - - `'always'`: will revalidate models and dataclasses during validation - - `'subclass-instances'`: will revalidate models and dataclasses during validation if the instance is a + - `'never'` will not revalidate models and dataclasses during validation + - `'always'` will revalidate models and dataclasses during validation + - `'subclass-instances'` will revalidate models and dataclasses during validation if the instance is a subclass of the model or dataclass - The default is `'never'` (no revalidation). + By default, model and dataclass instances are not revalidated during validation. - This configuration only affects *the current model* it is applied on, and does *not* populate to the models - referenced in fields. + ```py + from typing import List - ```python from pydantic import BaseModel class User(BaseModel, revalidate_instances='never'): # (1)! - name: str - - class Transaction(BaseModel): - user: User - - my_user = User(name='John') - t = Transaction(user=my_user) - - my_user.name = 1 # (2)! - t = Transaction(user=my_user) # (3)! - print(t) - #> user=User(name=1) - ``` - - 1. This is the default behavior. - 2. The assignment is *not* validated, unless you set [`validate_assignment`][pydantic.ConfigDict.validate_assignment] in the configuration. - 3. Since `revalidate_instances` is set to `'never'`, the user instance is not revalidated. - - Here is an example demonstrating the behavior of `'subclass-instances'`: - - ```python - from pydantic import BaseModel - - class User(BaseModel, revalidate_instances='subclass-instances'): - name: str + hobbies: List[str] class SubUser(User): - age: int + sins: List[str] class Transaction(BaseModel): user: User - my_user = User(name='John') - my_user.name = 1 # (1)! - t = Transaction(user=my_user) # (2)! + my_user = User(hobbies=['reading']) + t = Transaction(user=my_user) print(t) - #> user=User(name=1) + #> user=User(hobbies=['reading']) - my_sub_user = SubUser(name='John', age=20) + my_user.hobbies = [1] # (2)! + t = Transaction(user=my_user) # (3)! + print(t) + #> user=User(hobbies=[1]) + + my_sub_user = SubUser(hobbies=['scuba diving'], sins=['lying']) t = Transaction(user=my_sub_user) - print(t) # (3)! - #> user=User(name='John') + print(t) + #> user=SubUser(hobbies=['scuba diving'], sins=['lying']) ``` - 1. The assignment is *not* validated, unless you set [`validate_assignment`][pydantic.ConfigDict.validate_assignment] in the configuration. - 2. Because `my_user` is a "direct" instance of `User`, it is *not* being revalidated. It would have been the case if - `revalidate_instances` was set to `'always'`. - 3. Because `my_sub_user` is an instance of a `User` subclass, it is being revalidated. In this case, Pydantic coerces `my_sub_user` to the defined - `User` class defined on `Transaction`. If one of its fields had an invalid value, a validation error would have been raised. + 1. `revalidate_instances` is set to `'never'` by **default. + 2. The assignment is not validated, unless you set `validate_assignment` to `True` in the model's config. + 3. Since `revalidate_instances` is set to `never`, this is not revalidated. - /// version-added | v2 - /// + If you want to revalidate instances during validation, you can set `revalidate_instances` to `'always'` + in the model's config. + + ```py + from typing import List + + from pydantic import BaseModel, ValidationError + + class User(BaseModel, revalidate_instances='always'): # (1)! + hobbies: List[str] + + class SubUser(User): + sins: List[str] + + class Transaction(BaseModel): + user: User + + my_user = User(hobbies=['reading']) + t = Transaction(user=my_user) + print(t) + #> user=User(hobbies=['reading']) + + my_user.hobbies = [1] + try: + t = Transaction(user=my_user) # (2)! + except ValidationError as e: + print(e) + ''' + 1 validation error for Transaction + user.hobbies.0 + Input should be a valid string [type=string_type, input_value=1, input_type=int] + ''' + + my_sub_user = SubUser(hobbies=['scuba diving'], sins=['lying']) + t = Transaction(user=my_sub_user) + print(t) # (3)! + #> user=User(hobbies=['scuba diving']) + ``` + + 1. `revalidate_instances` is set to `'always'`. + 2. The model is revalidated, since `revalidate_instances` is set to `'always'`. + 3. Using `'never'` we would have gotten `user=SubUser(hobbies=['scuba diving'], sins=['lying'])`. + + It's also possible to set `revalidate_instances` to `'subclass-instances'` to only revalidate instances + of subclasses of the model. + + ```py + from typing import List + + from pydantic import BaseModel + + class User(BaseModel, revalidate_instances='subclass-instances'): # (1)! + hobbies: List[str] + + class SubUser(User): + sins: List[str] + + class Transaction(BaseModel): + user: User + + my_user = User(hobbies=['reading']) + t = Transaction(user=my_user) + print(t) + #> user=User(hobbies=['reading']) + + my_user.hobbies = [1] + t = Transaction(user=my_user) # (2)! + print(t) + #> user=User(hobbies=[1]) + + my_sub_user = SubUser(hobbies=['scuba diving'], sins=['lying']) + t = Transaction(user=my_sub_user) + print(t) # (3)! + #> user=User(hobbies=['scuba diving']) + ``` + + 1. `revalidate_instances` is set to `'subclass-instances'`. + 2. This is not revalidated, since `my_user` is not a subclass of `User`. + 3. Using `'never'` we would have gotten `user=SubUser(hobbies=['scuba diving'], sins=['lying'])`. """ ser_json_timedelta: Literal['iso8601', 'float'] @@ -569,84 +527,17 @@ class ConfigDict(TypedDict, total=False): The format of JSON serialized timedeltas. Accepts the string values of `'iso8601'` and `'float'`. Defaults to `'iso8601'`. - - `'iso8601'` will serialize timedeltas to [ISO 8601 text format](https://en.wikipedia.org/wiki/ISO_8601#Durations). + - `'iso8601'` will serialize timedeltas to ISO 8601 durations. - `'float'` will serialize timedeltas to the total number of seconds. - - /// version-changed | v2.12 - It is now recommended to use the [`ser_json_temporal`][pydantic.config.ConfigDict.ser_json_temporal] - setting. `ser_json_timedelta` will be deprecated in v3. - /// """ - ser_json_temporal: Literal['iso8601', 'seconds', 'milliseconds'] + ser_json_bytes: Literal['utf8', 'base64'] """ - The format of JSON serialized temporal types from the [`datetime`][] module. This includes: - - - [`datetime.datetime`][] - - [`datetime.date`][] - - [`datetime.time`][] - - [`datetime.timedelta`][] - - Can be one of: - - - `'iso8601'` will serialize date-like types to [ISO 8601 text format](https://en.wikipedia.org/wiki/ISO_8601#Durations). - - `'milliseconds'` will serialize date-like types to a floating point number of milliseconds since the epoch. - - `'seconds'` will serialize date-like types to a floating point number of seconds since the epoch. - - Defaults to `'iso8601'`. - - /// version-added | v2.12 - This setting replaces [`ser_json_timedelta`][pydantic.config.ConfigDict.ser_json_timedelta], - which will be deprecated in v3. `ser_json_temporal` adds more configurability for the other temporal types. - /// - """ - - val_temporal_unit: Literal['seconds', 'milliseconds', 'infer'] - """ - The unit to assume for validating numeric input for datetime-like types ([`datetime.datetime`][] and [`datetime.date`][]). Can be one of: - - - `'seconds'` will validate date or time numeric inputs as seconds since the [epoch]. - - `'milliseconds'` will validate date or time numeric inputs as milliseconds since the [epoch]. - - `'infer'` will infer the unit from the string numeric input on unix time as: - - * seconds since the [epoch] if $-2^{10} <= v <= 2^{10}$ - * milliseconds since the [epoch] (if $v < -2^{10}$ or $v > 2^{10}$). - - Defaults to `'infer'`. - - /// version-added | v2.12 - /// - - [epoch]: https://en.wikipedia.org/wiki/Unix_time - """ - - ser_json_bytes: Literal['utf8', 'base64', 'hex'] - """ - The encoding of JSON serialized bytes. Defaults to `'utf8'`. - Set equal to `val_json_bytes` to get back an equal value after serialization round trip. + The encoding of JSON serialized bytes. Accepts the string values of `'utf8'` and `'base64'`. + Defaults to `'utf8'`. - `'utf8'` will serialize bytes to UTF-8 strings. - `'base64'` will serialize bytes to URL safe base64 strings. - - `'hex'` will serialize bytes to hexadecimal strings. - """ - - val_json_bytes: Literal['utf8', 'base64', 'hex'] - """ - The encoding of JSON serialized bytes to decode. Defaults to `'utf8'`. - Set equal to `ser_json_bytes` to get back an equal value after serialization round trip. - - - `'utf8'` will deserialize UTF-8 strings to bytes. - - `'base64'` will deserialize URL safe base64 strings to bytes. - - `'hex'` will deserialize hexadecimal strings to bytes. - """ - - ser_json_inf_nan: Literal['null', 'constants', 'strings'] - """ - The encoding of JSON serialized infinity and NaN float values. Defaults to `'null'`. - - - `'null'` will serialize infinity and NaN values as `null`. - - `'constants'` will serialize infinity and NaN values as `Infinity` and `NaN`. - - `'strings'` will serialize infinity as string `"Infinity"` and NaN as string `"NaN"`. """ # whether to validate default values during validation, default False @@ -654,21 +545,17 @@ class ConfigDict(TypedDict, total=False): """Whether to validate default values during validation. Defaults to `False`.""" validate_return: bool - """Whether to validate the return value from call validators. Defaults to `False`.""" + """whether to validate the return value from call validators. Defaults to `False`.""" - protected_namespaces: tuple[str | Pattern[str], ...] + protected_namespaces: tuple[str, ...] """ - A tuple of strings and/or regex patterns that prevent models from having fields with names that conflict with its existing members/methods. + A `tuple` of strings that prevent model to have field which conflict with them. + Defaults to `('model_', )`). - Strings are matched on a prefix basis. For instance, with `'dog'`, having a field named `'dog_name'` will be disallowed. + Pydantic prevents collisions between model attributes and `BaseModel`'s own methods by + namespacing them with the prefix `model_`. - Regex patterns are matched on the entire field name. For instance, with the pattern `'^dog$'`, having a field named `'dog'` will be disallowed, - but `'dog_name'` will be accepted. - - Defaults to `('model_validate', 'model_dump')`. This default is used to prevent collisions with the existing (and possibly future) - [validation](../concepts/models.md#validating-data) and [serialization](../concepts/serialization.md#serializing-data) methods. - - ```python + ```py import warnings from pydantic import BaseModel @@ -678,76 +565,62 @@ class ConfigDict(TypedDict, total=False): try: class Model(BaseModel): - model_dump_something: str + model_prefixed_field: str except UserWarning as e: print(e) ''' - Field 'model_dump_something' in 'Model' conflicts with protected namespace 'model_dump'. + Field "model_prefixed_field" has conflict with protected namespace "model_". - You may be able to solve this by setting the 'protected_namespaces' configuration to ('model_validate',). + You may be able to resolve this warning by setting `model_config['protected_namespaces'] = ()`. ''' ``` You can customize this behavior using the `protected_namespaces` setting: - ```python {test="skip"} - import re + ```py import warnings from pydantic import BaseModel, ConfigDict - with warnings.catch_warnings(record=True) as caught_warnings: - warnings.simplefilter('always') # Catch all warnings + warnings.filterwarnings('error') # Raise warnings as errors + + try: class Model(BaseModel): - safe_field: str + model_prefixed_field: str also_protect_field: str - protect_this: str model_config = ConfigDict( - protected_namespaces=( - 'protect_me_', - 'also_protect_', - re.compile('^protect_this$'), - ) + protected_namespaces=('protect_me_', 'also_protect_') ) - for warning in caught_warnings: - print(f'{warning.message}') + except UserWarning as e: + print(e) ''' - Field 'also_protect_field' in 'Model' conflicts with protected namespace 'also_protect_'. - You may be able to solve this by setting the 'protected_namespaces' configuration to ('protect_me_', re.compile('^protect_this$'))`. + Field "also_protect_field" has conflict with protected namespace "also_protect_". - Field 'protect_this' in 'Model' conflicts with protected namespace 're.compile('^protect_this$')'. - You may be able to solve this by setting the 'protected_namespaces' configuration to ('protect_me_', 'also_protect_')`. + You may be able to resolve this warning by setting `model_config['protected_namespaces'] = ('protect_me_',)`. ''' ``` While Pydantic will only emit a warning when an item is in a protected namespace but does not actually have a collision, an error _is_ raised if there is an actual collision with an existing attribute: - ```python - from pydantic import BaseModel, ConfigDict + ```py + from pydantic import BaseModel try: class Model(BaseModel): model_validate: str - model_config = ConfigDict(protected_namespaces=('model_',)) - - except ValueError as e: + except NameError as e: print(e) ''' - Field 'model_validate' conflicts with member > of protected namespace 'model_'. + Field "model_validate" conflicts with member > of protected namespace "model_". ''' ``` - - /// version-changed | v2.10 - The default protected namespaces was changed from `('model_',)` to `('model_validate', 'model_dump')`, to allow - for fields like `model_id`, `model_name` to be used. - /// """ hide_input_in_errors: bool @@ -756,7 +629,7 @@ class ConfigDict(TypedDict, total=False): Pydantic shows the input value and type when it raises `ValidationError` during the validation. - ```python + ```py from pydantic import BaseModel, ValidationError class Model(BaseModel): @@ -775,7 +648,7 @@ class ConfigDict(TypedDict, total=False): You can hide the input value and type by setting the `hide_input_in_errors` config to `True`. - ```python + ```py from pydantic import BaseModel, ConfigDict, ValidationError class Model(BaseModel): @@ -796,27 +669,27 @@ class ConfigDict(TypedDict, total=False): defer_build: bool """ - Whether to defer model validator and serializer construction until the first model validation. Defaults to False. + Whether to defer model validator and serializer construction until the first model validation. This can be useful to avoid the overhead of building models which are only used nested within other models, or when you want to manually define type namespace via - [`Model.model_rebuild(_types_namespace=...)`][pydantic.BaseModel.model_rebuild]. - - /// version-changed | v2.10 - The setting also applies to [Pydantic dataclasses](../concepts/dataclasses.md) and [type adapters](../concepts/type_adapter.md). - /// + [`Model.model_rebuild(_types_namespace=...)`][pydantic.BaseModel.model_rebuild]. Defaults to False. """ plugin_settings: dict[str, object] | None - """A `dict` of settings for plugins. Defaults to `None`.""" + """A `dict` of settings for plugins. Defaults to `None`. + + See [Pydantic Plugins](../concepts/plugins.md) for details. + """ schema_generator: type[_GenerateSchema] | None """ - The `GenerateSchema` class to use during core schema generation. + A custom core schema generator class to use when generating JSON schemas. + Useful if you want to change the way types are validated across an entire model/schema. Defaults to `None`. - /// version-deprecated | v2.10 - The `GenerateSchema` class is private and highly subject to change. - /// + The `GenerateSchema` interface is subject to change, currently only the `string_schema` method is public. + + See [#6737](https://github.com/pydantic/pydantic/pull/6737) for details. """ json_schema_serialization_defaults_required: bool @@ -830,7 +703,7 @@ class ConfigDict(TypedDict, total=False): between validation and serialization, and don't mind fields with defaults being marked as not required during serialization. See [#7209](https://github.com/pydantic/pydantic/issues/7209) for more details. - ```python + ```py from pydantic import BaseModel, ConfigDict class Model(BaseModel): @@ -856,9 +729,6 @@ class ConfigDict(TypedDict, total=False): } ''' ``` - - /// version-added | v2.4 - /// """ json_schema_mode_override: Literal['validation', 'serialization', None] @@ -876,7 +746,7 @@ class ConfigDict(TypedDict, total=False): the validation and serialization schemas (since both will use the specified schema), and so prevents the suffixes from being added to the definition references. - ```python + ```py from pydantic import BaseModel, ConfigDict, Json class Model(BaseModel): @@ -914,9 +784,6 @@ class ConfigDict(TypedDict, total=False): } ''' ``` - - /// version-added | v2.4 - /// """ coerce_numbers_to_str: bool @@ -925,7 +792,7 @@ class ConfigDict(TypedDict, total=False): Pydantic doesn't allow number types (`int`, `float`, `Decimal`) to be coerced as type `str` by default. - ```python + ```py from decimal import Decimal from pydantic import BaseModel, ConfigDict, ValidationError @@ -959,18 +826,15 @@ class ConfigDict(TypedDict, total=False): regex_engine: Literal['rust-regex', 'python-re'] """ - The regex engine to be used for pattern validation. + The regex engine to used for pattern validation Defaults to `'rust-regex'`. - - `'rust-regex'` uses the [`regex`](https://docs.rs/regex) Rust crate, + - `rust-regex` uses the [`regex`](https://docs.rs/regex) Rust crate, which is non-backtracking and therefore more DDoS resistant, but does not support all regex features. - - `'python-re'` use the [`re`][] module, which supports all regex features, but may be slower. + - `python-re` use the [`re`](https://docs.python.org/3/library/re.html) module, + which supports all regex features, but may be slower. - !!! note - If you use a compiled regex pattern, the `'python-re'` engine will be used regardless of this setting. - This is so that flags such as [`re.IGNORECASE`][] are respected. - - ```python + ```py from pydantic import BaseModel, ConfigDict, Field, ValidationError class Model(BaseModel): @@ -991,298 +855,18 @@ class ConfigDict(TypedDict, total=False): String should match pattern '^abc(?=def)' [type=string_pattern_mismatch, input_value='abxyzcdef', input_type=str] ''' ``` - - /// version-added | v2.5 - /// """ validation_error_cause: bool """ - If `True`, Python exceptions that were part of a validation failure will be shown as an exception group as a cause. Can be useful for debugging. Defaults to `False`. + If `True`, python exceptions that were part of a validation failure will be shown as an exception group as a cause. Can be useful for debugging. Defaults to `False`. Note: Python 3.10 and older don't support exception groups natively. <=3.10, backport must be installed: `pip install exceptiongroup`. Note: - The structure of validation errors are likely to change in future Pydantic versions. Pydantic offers no guarantees about their structure. Should be used for visual traceback debugging only. - - /// version-added | v2.5 - /// + The structure of validation errors are likely to change in future pydantic versions. Pydantic offers no guarantees about the structure of validation errors. Should be used for visual traceback debugging only. """ - use_attribute_docstrings: bool - ''' - Whether docstrings of attributes (bare string literals immediately following the attribute declaration) - should be used for field descriptions. Defaults to `False`. - - ```python - from pydantic import BaseModel, ConfigDict, Field - - - class Model(BaseModel): - model_config = ConfigDict(use_attribute_docstrings=True) - - x: str - """ - Example of an attribute docstring - """ - - y: int = Field(description="Description in Field") - """ - Description in Field overrides attribute docstring - """ - - - print(Model.model_fields["x"].description) - # > Example of an attribute docstring - print(Model.model_fields["y"].description) - # > Description in Field - ``` - This requires the source code of the class to be available at runtime. - - !!! warning "Usage with `TypedDict` and stdlib dataclasses" - Due to current limitations, attribute docstrings detection may not work as expected when using - [`TypedDict`][typing.TypedDict] and stdlib dataclasses, in particular when: - - - inheritance is being used. - - multiple classes have the same name in the same source file (unless Python 3.13 or greater is used). - - /// version-added | v2.7 - /// - ''' - - cache_strings: bool | Literal['all', 'keys', 'none'] - """ - Whether to cache strings to avoid constructing new Python objects. Defaults to True. - - Enabling this setting should significantly improve validation performance while increasing memory usage slightly. - - - `True` or `'all'` (the default): cache all strings - - `'keys'`: cache only dictionary keys - - `False` or `'none'`: no caching - - !!! note - `True` or `'all'` is required to cache strings during general validation because - validators don't know if they're in a key or a value. - - !!! tip - If repeated strings are rare, it's recommended to use `'keys'` or `'none'` to reduce memory usage, - as the performance difference is minimal if repeated strings are rare. - - /// version-added | v2.7 - /// - """ - - validate_by_alias: bool - """ - Whether an aliased field may be populated by its alias. Defaults to `True`. - - Here's an example of disabling validation by alias: - - ```py - from pydantic import BaseModel, ConfigDict, Field - - class Model(BaseModel): - model_config = ConfigDict(validate_by_name=True, validate_by_alias=False) - - my_field: str = Field(validation_alias='my_alias') # (1)! - - m = Model(my_field='foo') # (2)! - print(m) - #> my_field='foo' - ``` - - 1. The field `'my_field'` has an alias `'my_alias'`. - 2. The model can only be populated by the attribute name `'my_field'`. - - !!! warning - You cannot set both `validate_by_alias` and `validate_by_name` to `False`. - This would make it impossible to populate an attribute. - - See [usage errors](../errors/usage_errors.md#validate-by-alias-and-name-false) for an example. - - If you set `validate_by_alias` to `False`, under the hood, Pydantic dynamically sets - `validate_by_name` to `True` to ensure that validation can still occur. - - /// version-added | v2.11 - This setting was introduced in conjunction with [`validate_by_name`][pydantic.ConfigDict.validate_by_name] - to empower users with more fine grained validation control. - /// - """ - - validate_by_name: bool - """ - Whether an aliased field may be populated by its name as given by the model - attribute. Defaults to `False`. - - ```python - from pydantic import BaseModel, ConfigDict, Field - - class Model(BaseModel): - model_config = ConfigDict(validate_by_name=True, validate_by_alias=True) - - my_field: str = Field(validation_alias='my_alias') # (1)! - - m = Model(my_alias='foo') # (2)! - print(m) - #> my_field='foo' - - m = Model(my_field='foo') # (3)! - print(m) - #> my_field='foo' - ``` - - 1. The field `'my_field'` has an alias `'my_alias'`. - 2. The model is populated by the alias `'my_alias'`. - 3. The model is populated by the attribute name `'my_field'`. - - !!! warning - You cannot set both `validate_by_alias` and `validate_by_name` to `False`. - This would make it impossible to populate an attribute. - - See [usage errors](../errors/usage_errors.md#validate-by-alias-and-name-false) for an example. - - /// version-added | v2.11 - This setting was introduced in conjunction with [`validate_by_alias`][pydantic.ConfigDict.validate_by_alias] - to empower users with more fine grained validation control. It is an alternative to [`populate_by_name`][pydantic.ConfigDict.populate_by_name], - that enables validation by name **and** by alias. - /// - """ - - serialize_by_alias: bool - """ - Whether an aliased field should be serialized by its alias. Defaults to `False`. - - Note: In v2.11, `serialize_by_alias` was introduced to address the - [popular request](https://github.com/pydantic/pydantic/issues/8379) - for consistency with alias behavior for validation and serialization settings. - In v3, the default value is expected to change to `True` for consistency with the validation default. - - ```python - from pydantic import BaseModel, ConfigDict, Field - - class Model(BaseModel): - model_config = ConfigDict(serialize_by_alias=True) - - my_field: str = Field(serialization_alias='my_alias') # (1)! - - m = Model(my_field='foo') - print(m.model_dump()) # (2)! - #> {'my_alias': 'foo'} - ``` - - 1. The field `'my_field'` has an alias `'my_alias'`. - 2. The model is serialized using the alias `'my_alias'` for the `'my_field'` attribute. - - - /// version-added | v2.11 - This setting was introduced to address the [popular request](https://github.com/pydantic/pydantic/issues/8379) - for consistency with alias behavior for validation and serialization. - - In v3, the default value is expected to change to `True` for consistency with the validation default. - /// - """ - - url_preserve_empty_path: bool - """ - Whether to preserve empty URL paths when validating values for a URL type. Defaults to `False`. - - ```python - from pydantic import AnyUrl, BaseModel, ConfigDict - - class Model(BaseModel): - model_config = ConfigDict(url_preserve_empty_path=True) - - url: AnyUrl - - m = Model(url='http://example.com') - print(m.url) - #> http://example.com - ``` - - /// version-added | v2.12 - /// - """ - - -_TypeT = TypeVar('_TypeT', bound=type) - - -@overload -@deprecated('Passing `config` as a keyword argument is deprecated. Pass `config` as a positional argument instead.') -def with_config(*, config: ConfigDict) -> Callable[[_TypeT], _TypeT]: ... - - -@overload -def with_config(config: ConfigDict, /) -> Callable[[_TypeT], _TypeT]: ... - - -@overload -def with_config(**config: Unpack[ConfigDict]) -> Callable[[_TypeT], _TypeT]: ... - - -def with_config(config: ConfigDict | None = None, /, **kwargs: Any) -> Callable[[_TypeT], _TypeT]: - """!!! abstract "Usage Documentation" - [Configuration with other types](../concepts/config.md#configuration-on-other-supported-types) - - A convenience decorator to set a [Pydantic configuration](config.md) on a `TypedDict` or a `dataclass` from the standard library. - - Although the configuration can be set using the `__pydantic_config__` attribute, it does not play well with type checkers, - especially with `TypedDict`. - - !!! example "Usage" - - ```python - from typing_extensions import TypedDict - - from pydantic import ConfigDict, TypeAdapter, with_config - - @with_config(ConfigDict(str_to_lower=True)) - class TD(TypedDict): - x: str - - ta = TypeAdapter(TD) - - print(ta.validate_python({'x': 'ABC'})) - #> {'x': 'abc'} - ``` - - /// deprecated-removed | v2.11 v3 - Passing `config` as a keyword argument. - /// - - /// version-changed | v2.11 - Keyword arguments can be provided directly instead of a config dictionary. - /// - """ - if config is not None and kwargs: - raise ValueError('Cannot specify both `config` and keyword arguments') - - if len(kwargs) == 1 and (kwargs_conf := kwargs.get('config')) is not None: - warnings.warn( - 'Passing `config` as a keyword argument is deprecated. Pass `config` as a positional argument instead', - category=PydanticDeprecatedSince211, - stacklevel=2, - ) - final_config = cast(ConfigDict, kwargs_conf) - else: - final_config = config if config is not None else cast(ConfigDict, kwargs) - - def inner(class_: _TypeT, /) -> _TypeT: - # Ideally, we would check for `class_` to either be a `TypedDict` or a stdlib dataclass. - # However, the `@with_config` decorator can be applied *after* `@dataclass`. To avoid - # common mistakes, we at least check for `class_` to not be a Pydantic model. - from ._internal._utils import is_model_class - - if is_model_class(class_): - raise PydanticUserError( - f'Cannot use `with_config` on {class_.__name__} as it is a Pydantic model', - code='with-config-on-model', - ) - class_.__pydantic_config__ = final_config - return class_ - - return inner - __getattr__ = getattr_migration(__name__) diff --git a/Backend/venv/lib/python3.12/site-packages/pydantic/dataclasses.py b/Backend/venv/lib/python3.12/site-packages/pydantic/dataclasses.py index cecd5402..736762d6 100644 --- a/Backend/venv/lib/python3.12/site-packages/pydantic/dataclasses.py +++ b/Backend/venv/lib/python3.12/site-packages/pydantic/dataclasses.py @@ -1,26 +1,21 @@ """Provide an enhanced dataclass that performs validation.""" - from __future__ import annotations as _annotations import dataclasses -import functools import sys import types -from typing import TYPE_CHECKING, Any, Callable, Generic, Literal, NoReturn, TypeVar, overload -from warnings import warn +from typing import TYPE_CHECKING, Any, Callable, Generic, NoReturn, TypeVar, overload -from typing_extensions import TypeGuard, dataclass_transform +from typing_extensions import Literal, TypeGuard, dataclass_transform -from ._internal import _config, _decorators, _mock_val_ser, _namespace_utils, _typing_extra +from ._internal import _config, _decorators, _typing_extra from ._internal import _dataclasses as _pydantic_dataclasses from ._migration import getattr_migration from .config import ConfigDict -from .errors import PydanticUserError -from .fields import Field, FieldInfo, PrivateAttr +from .fields import Field, FieldInfo if TYPE_CHECKING: from ._internal._dataclasses import PydanticDataclass - from ._internal._namespace_utils import MappingNamespace __all__ = 'dataclass', 'rebuild_dataclass' @@ -28,7 +23,7 @@ _T = TypeVar('_T') if sys.version_info >= (3, 10): - @dataclass_transform(field_specifiers=(dataclasses.field, Field, PrivateAttr)) + @dataclass_transform(field_specifiers=(dataclasses.field, Field)) @overload def dataclass( *, @@ -45,7 +40,7 @@ if sys.version_info >= (3, 10): ) -> Callable[[type[_T]], type[PydanticDataclass]]: # type: ignore ... - @dataclass_transform(field_specifiers=(dataclasses.field, Field, PrivateAttr)) + @dataclass_transform(field_specifiers=(dataclasses.field, Field)) @overload def dataclass( _cls: type[_T], # type: ignore @@ -55,16 +50,17 @@ if sys.version_info >= (3, 10): eq: bool = True, order: bool = False, unsafe_hash: bool = False, - frozen: bool | None = None, + frozen: bool = False, config: ConfigDict | type[object] | None = None, validate_on_init: bool | None = None, kw_only: bool = ..., slots: bool = ..., - ) -> type[PydanticDataclass]: ... + ) -> type[PydanticDataclass]: + ... else: - @dataclass_transform(field_specifiers=(dataclasses.field, Field, PrivateAttr)) + @dataclass_transform(field_specifiers=(dataclasses.field, Field)) @overload def dataclass( *, @@ -73,13 +69,13 @@ else: eq: bool = True, order: bool = False, unsafe_hash: bool = False, - frozen: bool | None = None, + frozen: bool = False, config: ConfigDict | type[object] | None = None, validate_on_init: bool | None = None, ) -> Callable[[type[_T]], type[PydanticDataclass]]: # type: ignore ... - @dataclass_transform(field_specifiers=(dataclasses.field, Field, PrivateAttr)) + @dataclass_transform(field_specifiers=(dataclasses.field, Field)) @overload def dataclass( _cls: type[_T], # type: ignore @@ -89,13 +85,14 @@ else: eq: bool = True, order: bool = False, unsafe_hash: bool = False, - frozen: bool | None = None, + frozen: bool = False, config: ConfigDict | type[object] | None = None, validate_on_init: bool | None = None, - ) -> type[PydanticDataclass]: ... + ) -> type[PydanticDataclass]: + ... -@dataclass_transform(field_specifiers=(dataclasses.field, Field, PrivateAttr)) +@dataclass_transform(field_specifiers=(dataclasses.field, Field)) def dataclass( _cls: type[_T] | None = None, *, @@ -104,14 +101,13 @@ def dataclass( eq: bool = True, order: bool = False, unsafe_hash: bool = False, - frozen: bool | None = None, + frozen: bool = False, config: ConfigDict | type[object] | None = None, validate_on_init: bool | None = None, kw_only: bool = False, slots: bool = False, ) -> Callable[[type[_T]], type[PydanticDataclass]] | type[PydanticDataclass]: - """!!! abstract "Usage Documentation" - [`dataclasses`](../concepts/dataclasses.md) + """Usage docs: https://docs.pydantic.dev/2.5/concepts/dataclasses/ A decorator used to create a Pydantic-enhanced dataclass, similar to the standard Python `dataclass`, but with added validation. @@ -123,13 +119,13 @@ def dataclass( init: Included for signature compatibility with `dataclasses.dataclass`, and is passed through to `dataclasses.dataclass` when appropriate. If specified, must be set to `False`, as pydantic inserts its own `__init__` function. - repr: A boolean indicating whether to include the field in the `__repr__` output. - eq: Determines if a `__eq__` method should be generated for the class. + repr: A boolean indicating whether or not to include the field in the `__repr__` output. + eq: Determines if a `__eq__` should be generated for the class. order: Determines if comparison magic methods should be generated, such as `__lt__`, but not `__eq__`. - unsafe_hash: Determines if a `__hash__` method should be included in the class, as in `dataclasses.dataclass`. + unsafe_hash: Determines if an unsafe hashing function should be included in the class. frozen: Determines if the generated class should be a 'frozen' `dataclass`, which does not allow its - attributes to be modified after it has been initialized. If not set, the value from the provided `config` argument will be used (and will default to `False` otherwise). - config: The Pydantic config to use for the `dataclass`. + attributes to be modified from its constructor. + config: A configuration for the `dataclass` generation. validate_on_init: A deprecated parameter included for backwards compatibility; in V2, all Pydantic dataclasses are validated on init. kw_only: Determines if `__init__` method parameters must be specified by keyword only. Defaults to `False`. @@ -146,10 +142,30 @@ def dataclass( assert validate_on_init is not False, 'validate_on_init=False is no longer supported' if sys.version_info >= (3, 10): - kwargs = {'kw_only': kw_only, 'slots': slots} + kwargs = dict(kw_only=kw_only, slots=slots) + + def make_pydantic_fields_compatible(cls: type[Any]) -> None: + """Make sure that stdlib `dataclasses` understands `Field` kwargs like `kw_only` + To do that, we simply change + `x: int = pydantic.Field(..., kw_only=True)` + into + `x: int = dataclasses.field(default=pydantic.Field(..., kw_only=True), kw_only=True)` + """ + for field_name in cls.__annotations__: + try: + field_value = getattr(cls, field_name) + except AttributeError: + # no default value has been set for this field + continue + if isinstance(field_value, FieldInfo) and field_value.kw_only: + setattr(cls, field_name, dataclasses.field(default=field_value, kw_only=True)) + else: kwargs = {} + def make_pydantic_fields_compatible(_) -> None: + return None + def create_dataclass(cls: type[Any]) -> type[PydanticDataclass]: """Create a Pydantic dataclass from a regular dataclass. @@ -159,41 +175,25 @@ def dataclass( Returns: A Pydantic dataclass. """ - from ._internal._utils import is_model_class - - if is_model_class(cls): - raise PydanticUserError( - f'Cannot create a Pydantic dataclass from {cls.__name__} as it is already a Pydantic model', - code='dataclass-on-model', - ) - original_cls = cls - # we warn on conflicting config specifications, but only if the class doesn't have a dataclass base - # because a dataclass base might provide a __pydantic_config__ attribute that we don't want to warn about - has_dataclass_base = any(dataclasses.is_dataclass(base) for base in cls.__bases__) - if not has_dataclass_base and config is not None and hasattr(cls, '__pydantic_config__'): - warn( - f'`config` is set via both the `dataclass` decorator and `__pydantic_config__` for dataclass {cls.__name__}. ' - f'The `config` specification from `dataclass` decorator will take priority.', - category=UserWarning, - stacklevel=2, - ) - - # if config is not explicitly provided, try to read it from the type - config_dict = config if config is not None else getattr(cls, '__pydantic_config__', None) + config_dict = config + if config_dict is None: + # if not explicitly provided, read from the type + cls_config = getattr(cls, '__pydantic_config__', None) + if cls_config is not None: + config_dict = cls_config config_wrapper = _config.ConfigWrapper(config_dict) decorators = _decorators.DecoratorInfos.build(cls) - decorators.update_from_config(config_wrapper) # Keep track of the original __doc__ so that we can restore it after applying the dataclasses decorator # Otherwise, classes with no __doc__ will have their signature added into the JSON schema description, # since dataclasses.dataclass will set this as the __doc__ original_doc = cls.__doc__ - if _pydantic_dataclasses.is_stdlib_dataclass(cls): - # Vanilla dataclasses include a default docstring (representing the class signature), - # which we don't want to preserve. + if _pydantic_dataclasses.is_builtin_dataclass(cls): + # Don't preserve the docstring for vanilla dataclasses, as it may include the signature + # This matches v1 behavior, and there was an explicit test for it original_doc = None # We don't want to add validation to the existing std lib dataclass, so we will subclass it @@ -205,125 +205,39 @@ def dataclass( bases = bases + (generic_base,) cls = types.new_class(cls.__name__, bases) - # Respect frozen setting from dataclass constructor and fallback to config setting if not provided - if frozen is not None: - frozen_ = frozen - if config_wrapper.frozen: - # It's not recommended to define both, as the setting from the dataclass decorator will take priority. - warn( - f'`frozen` is set via both the `dataclass` decorator and `config` for dataclass {cls.__name__!r}.' - 'This is not recommended. The `frozen` specification on `dataclass` will take priority.', - category=UserWarning, - stacklevel=2, - ) - else: - frozen_ = config_wrapper.frozen or False + make_pydantic_fields_compatible(cls) - # Make Pydantic's `Field()` function compatible with stdlib dataclasses. As we'll decorate - # `cls` with the stdlib `@dataclass` decorator first, there are two attributes, `kw_only` and - # `repr` that need to be understood *during* the stdlib creation. We do so in two steps: + cls = dataclasses.dataclass( # type: ignore[call-overload] + cls, + # the value of init here doesn't affect anything except that it makes it easier to generate a signature + init=True, + repr=repr, + eq=eq, + order=order, + unsafe_hash=unsafe_hash, + frozen=frozen, + **kwargs, + ) - # 1. On the decorated class, wrap `Field()` assignment with `dataclass.field()`, with the - # two attributes set (done in `as_dataclass_field()`) - cls_anns = _typing_extra.safe_get_annotations(cls) - for field_name in cls_anns: - # We should look for assignments in `__dict__` instead, but for now we follow - # the same behavior as stdlib dataclasses (see https://github.com/python/cpython/issues/88609) - field_value = getattr(cls, field_name, None) - if isinstance(field_value, FieldInfo): - setattr(cls, field_name, _pydantic_dataclasses.as_dataclass_field(field_value)) - - # 2. For bases of `cls` that are stdlib dataclasses, we temporarily patch their fields - # (see the docstring of the context manager): - with _pydantic_dataclasses.patch_base_fields(cls): - cls = dataclasses.dataclass( # pyright: ignore[reportCallIssue] - cls, - # the value of init here doesn't affect anything except that it makes it easier to generate a signature - init=True, - repr=repr, - eq=eq, - order=order, - unsafe_hash=unsafe_hash, - frozen=frozen_, - **kwargs, - ) - - if config_wrapper.validate_assignment: - original_setattr = cls.__setattr__ - - @functools.wraps(cls.__setattr__) - def validated_setattr(instance: PydanticDataclass, name: str, value: Any, /) -> None: - if frozen_: - return original_setattr(instance, name, value) # pyright: ignore[reportCallIssue] - inst_cls = type(instance) - attr = getattr(inst_cls, name, None) - - if isinstance(attr, property): - attr.__set__(instance, value) - elif isinstance(attr, functools.cached_property): - instance.__dict__.__setitem__(name, value) - else: - inst_cls.__pydantic_validator__.validate_assignment(instance, name, value) - - cls.__setattr__ = validated_setattr.__get__(None, cls) # type: ignore - - if slots and not hasattr(cls, '__setstate__'): - # If slots is set, `pickle` (relied on by `copy.copy()`) will use - # `__setattr__()` to reconstruct the dataclass. However, the custom - # `__setattr__()` set above relies on `validate_assignment()`, which - # in turn expects all the field values to be already present on the - # instance, resulting in attribute errors. - # As such, we make use of `object.__setattr__()` instead. - # Note that we do so only if `__setstate__()` isn't already set (this is the - # case if on top of `slots`, `frozen` is used). - - # Taken from `dataclasses._dataclass_get/setstate()`: - def _dataclass_getstate(self: Any) -> list[Any]: - return [getattr(self, f.name) for f in dataclasses.fields(self)] - - def _dataclass_setstate(self: Any, state: list[Any]) -> None: - for field, value in zip(dataclasses.fields(self), state): - object.__setattr__(self, field.name, value) - - cls.__getstate__ = _dataclass_getstate # pyright: ignore[reportAttributeAccessIssue] - cls.__setstate__ = _dataclass_setstate # pyright: ignore[reportAttributeAccessIssue] - - # This is an undocumented attribute to distinguish stdlib/Pydantic dataclasses. - # It should be set as early as possible: - cls.__is_pydantic_dataclass__ = True cls.__pydantic_decorators__ = decorators # type: ignore cls.__doc__ = original_doc - # Can be non-existent for dynamically created classes: - firstlineno = getattr(original_cls, '__firstlineno__', None) cls.__module__ = original_cls.__module__ - if sys.version_info >= (3, 13) and firstlineno is not None: - # As per https://docs.python.org/3/reference/datamodel.html#type.__firstlineno__: - # Setting the `__module__` attribute removes the `__firstlineno__` item from the type’s dictionary. - original_cls.__firstlineno__ = firstlineno - cls.__firstlineno__ = firstlineno cls.__qualname__ = original_cls.__qualname__ - cls.__pydantic_fields_complete__ = classmethod(_pydantic_fields_complete) - cls.__pydantic_complete__ = False # `complete_dataclass` will set it to `True` if successful. - # TODO `parent_namespace` is currently None, but we could do the same thing as Pydantic models: - # fetch the parent ns using `parent_frame_namespace` (if the dataclass was defined in a function), - # and possibly cache it (see the `__pydantic_parent_namespace__` logic for models). - _pydantic_dataclasses.complete_dataclass(cls, config_wrapper, raise_errors=False) + pydantic_complete = _pydantic_dataclasses.complete_dataclass( + cls, config_wrapper, raise_errors=False, types_namespace=None + ) + cls.__pydantic_complete__ = pydantic_complete # type: ignore return cls - return create_dataclass if _cls is None else create_dataclass(_cls) + if _cls is None: + return create_dataclass - -def _pydantic_fields_complete(cls: type[PydanticDataclass]) -> bool: - """Return whether the fields where successfully collected (i.e. type hints were successfully resolves). - - This is a private property, not meant to be used outside Pydantic. - """ - return all(field_info._complete for field_info in cls.__pydantic_fields__.values()) + return create_dataclass(_cls) __getattr__ = getattr_migration(__name__) -if sys.version_info < (3, 11): +if (3, 8) <= sys.version_info < (3, 11): # Monkeypatch dataclasses.InitVar so that typing doesn't error if it occurs as a type when evaluating type hints # Starting in 3.11, typing.get_type_hints will not raise an error if the retrieved type hints are not callable. @@ -343,7 +257,7 @@ def rebuild_dataclass( force: bool = False, raise_errors: bool = True, _parent_namespace_depth: int = 2, - _types_namespace: MappingNamespace | None = None, + _types_namespace: dict[str, Any] | None = None, ) -> bool | None: """Try to rebuild the pydantic-core schema for the dataclass. @@ -353,8 +267,8 @@ def rebuild_dataclass( This is analogous to `BaseModel.model_rebuild`. Args: - cls: The class to rebuild the pydantic-core schema for. - force: Whether to force the rebuilding of the schema, defaults to `False`. + cls: The class to build the dataclass core schema for. + force: Whether to force the rebuilding of the model schema, defaults to `False`. raise_errors: Whether to raise errors, defaults to `True`. _parent_namespace_depth: The depth level of the parent namespace, defaults to 2. _types_namespace: The types namespace, defaults to `None`. @@ -365,49 +279,34 @@ def rebuild_dataclass( """ if not force and cls.__pydantic_complete__: return None - - for attr in ('__pydantic_core_schema__', '__pydantic_validator__', '__pydantic_serializer__'): - if attr in cls.__dict__ and not isinstance(getattr(cls, attr), _mock_val_ser.MockValSer): - # Deleting the validator/serializer is necessary as otherwise they can get reused in - # pydantic-core. Same applies for the core schema that can be reused in schema generation. - delattr(cls, attr) - - cls.__pydantic_complete__ = False - - if _types_namespace is not None: - rebuild_ns = _types_namespace - elif _parent_namespace_depth > 0: - rebuild_ns = _typing_extra.parent_frame_namespace(parent_depth=_parent_namespace_depth, force=True) or {} else: - rebuild_ns = {} + if _types_namespace is not None: + types_namespace: dict[str, Any] | None = _types_namespace.copy() + else: + if _parent_namespace_depth > 0: + frame_parent_ns = _typing_extra.parent_frame_namespace(parent_depth=_parent_namespace_depth) or {} + # Note: we may need to add something similar to cls.__pydantic_parent_namespace__ from BaseModel + # here when implementing handling of recursive generics. See BaseModel.model_rebuild for reference. + types_namespace = frame_parent_ns + else: + types_namespace = {} - ns_resolver = _namespace_utils.NsResolver( - parent_namespace=rebuild_ns, - ) - - return _pydantic_dataclasses.complete_dataclass( - cls, - _config.ConfigWrapper(cls.__pydantic_config__, check=False), - raise_errors=raise_errors, - ns_resolver=ns_resolver, - # We could provide a different config instead (with `'defer_build'` set to `True`) - # of this explicit `_force_build` argument, but because config can come from the - # decorator parameter or the `__pydantic_config__` attribute, `complete_dataclass` - # will overwrite `__pydantic_config__` with the provided config above: - _force_build=True, - ) + types_namespace = _typing_extra.get_cls_types_namespace(cls, types_namespace) + return _pydantic_dataclasses.complete_dataclass( + cls, + _config.ConfigWrapper(cls.__pydantic_config__, check=False), + raise_errors=raise_errors, + types_namespace=types_namespace, + ) -def is_pydantic_dataclass(class_: type[Any], /) -> TypeGuard[type[PydanticDataclass]]: +def is_pydantic_dataclass(__cls: type[Any]) -> TypeGuard[type[PydanticDataclass]]: """Whether a class is a pydantic dataclass. Args: - class_: The class. + __cls: The class. Returns: `True` if the class is a pydantic dataclass, `False` otherwise. """ - try: - return '__is_pydantic_dataclass__' in class_.__dict__ and dataclasses.is_dataclass(class_) - except AttributeError: - return False + return dataclasses.is_dataclass(__cls) and '__pydantic_validator__' in __cls.__dict__ diff --git a/Backend/venv/lib/python3.12/site-packages/pydantic/datetime_parse.py b/Backend/venv/lib/python3.12/site-packages/pydantic/datetime_parse.py index 53d52649..902219df 100644 --- a/Backend/venv/lib/python3.12/site-packages/pydantic/datetime_parse.py +++ b/Backend/venv/lib/python3.12/site-packages/pydantic/datetime_parse.py @@ -1,5 +1,4 @@ """The `datetime_parse` module is a backport module from V1.""" - from ._migration import getattr_migration __getattr__ = getattr_migration(__name__) diff --git a/Backend/venv/lib/python3.12/site-packages/pydantic/decorator.py b/Backend/venv/lib/python3.12/site-packages/pydantic/decorator.py index 0d97560c..c3643468 100644 --- a/Backend/venv/lib/python3.12/site-packages/pydantic/decorator.py +++ b/Backend/venv/lib/python3.12/site-packages/pydantic/decorator.py @@ -1,5 +1,4 @@ """The `decorator` module is a backport module from V1.""" - from ._migration import getattr_migration __getattr__ = getattr_migration(__name__) diff --git a/Backend/venv/lib/python3.12/site-packages/pydantic/deprecated/__pycache__/__init__.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/pydantic/deprecated/__pycache__/__init__.cpython-312.pyc index a56b38ed706013443b0c73d1756d962c2185dce9..c0e0f93d25f196550752ef45e2c5d9aa7d777efa 100644 GIT binary patch delta 19 ZcmX@bc#4txG%qg~0}z-x8&Blk4*)Ol1eX8+ delta 19 ZcmX@bc#4txG%qg~0}#YX=}zR{4*)O$1d#v$ diff --git a/Backend/venv/lib/python3.12/site-packages/pydantic/deprecated/__pycache__/class_validators.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/pydantic/deprecated/__pycache__/class_validators.cpython-312.pyc index f8de8e72eaf2fe32692227884d6f33f76f6701c4..3a32cfd895479a998bc4dbecbf5cffb27bf0bade 100644 GIT binary patch delta 3427 zcma)8Yit}>6}~gGJ3IS+dA+-S?9Q&^$J&nbXp*+ZgoM_wV4T!RaoLcpx1MouvJZ22 z6KZ3yg)FSVpQN{?{0I*LqC^f*$^Q@tA@KuLKtv6qEU8EZC_ezPCCd*&g*fNVzT!p= zGuks}zw^B3o_l6Wr+<`mz3z0{2wVrBdTjB_Jy%^J@o(bQz7uN#(F9G-c(UH4m-Cj4 zFY8bGvn|P%Y#;>4@1V@=i2t1>5lK{wCn`AML1_2E

    f@%cj^&6 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 C8Y?>h delta 1481 zcmaJ>T}&KR6ux)v470QBuwmKqvjumt8(=^Y3KXayE`(~)E+!fiG&-)k18%d-k~>qO z4YUON&^{Q&o5ly~iw~wvpPD{uG}~8SAl9^*(D-2bXoR$;jZdC41Fiq};hQtxx%b?A zzH{!~O#YhGzt{CJf$?tQ+2Y)~o~fQ!-%=?lkb+!VpZPJxJpGNC*Cx%0mnSD)Ii7vV zV;TFjr@mTrEuJeGRAlK_;X4rEbD|NKh}}?gc$qc7~UTzL*jZ>o#F3? z#5F14DOr|YCx?g|3H}L56W+SQ#CfT`fo+g4c7ZCnG|i{{Jr zY;n#kShKlPCD-vni#cu=?K#Jj(Gp?SDJEIEMfPOJD$RN_9Dd$o<@Zl|%v#DjGDJy< zRd)HvELf{#M^dyr-HtWgju~4q<4Srf_S}Vu?MVES6BkchZoi!v*h&oC8a#e0GIgh} z{=$^V%ER%skuma}mN8f*)SOAPN?OSnVnZI)TOj6DavzZJW^qqW()0~QIYT?+kklm_ z=!RY#7v*L0u|mi)-A{Q>#y0V$6z_bZ&_A@R2?F@qje~ZY+RIRb8r9;un#k8eNFGB#op~KX9HAb-Q|Bx<=epdJ-O~#ePXcEsyb=9a zex5)$2;ga^nJ?uW$21*Cjig|#@@90mh-fG^@FAFwPw{OKduk`;A>-k^N z-wRE(eKa&ezR|{2R;h|-Qc@*B(M}~ZV@hR=jZ5sNq>QU#Gqm1%2sSZP{+~H@h&8RP z?irZnFo4HL>=s{Zt+ZF%)%wq+!NH%xKr-(^8`I$_08h@AZ42TzAk&KQG}5YR7Rq_k z{XMb4UkpUS3&Rm`je`LnohQ4pti(dUMZ(I^!$wKz+a&-z zedEjU2lT*`r2O)9U;slTBQ5`uk0GWbDLNFLM(0}IG85FMwx;tOs^wKd)4~(M@$Ls@tU|grpiOJZwQL8&a}{~bEZXqm*|}117w`@9 z?*djhhlS)_NZ~E?Yv&8%Z~eD3{oWNCnJ*Vkm8=)|F_?`)I-dgUFiPoNa`Lrh2e8xPRF&4XPJ2z>7|BDr)&0`ozS*ogMZDDEFqwnJC| diff --git a/Backend/venv/lib/python3.12/site-packages/pydantic/deprecated/__pycache__/copy_internals.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/pydantic/deprecated/__pycache__/copy_internals.cpython-312.pyc index 7f043c313aa9c117b7234e726f679d12deb6b2d0..9e952ca21665816a076c490a6cb4a6c122710fdb 100644 GIT binary patch delta 2029 zcmah~YfMvD96#r_w6~8-3-ke$wiiUSiU>m?9iU>-0aJ9F(NV-wd#_k*0naTu6ay|x zwyDV^C)p!=WFJwNWm)&ZWLe@XF_|-=nvCsknftgUGhxPk(3ouJf2ylwCOggj-SdCH z&OQAuayKH~kR&T&Ykj0Sd0|$nz>BjhI;PW>s0AYhDMHE`wJIjXoU*0uQF~g7O6lTg zF-EFkBmj0x7wKlYV#=8=iIy;XlVVAgrpuybX;;+6Y}~2{zXOH}W)}4@9}P?Gfl@8% z?451co~_3oED5@yb97QK+BGqrQfap^hNbL9VF2Sc+H2@;>_YE|2_cCR!e9|XC&VdH z!BjY7HZl&Q3<~~CxM0W!Ibq01^j%{sE~Ybv2Kvb8u5kW0JgJ#NBhJSfrF5hy{Vc5+ zAJZzPi$%>+*%Kd}(`ag4!g10@Qwu$BdIh^_Q)Q(|b51!%JoHaz8ErCerCp_E^px3e z^FMKt3DPgk%WyT<_}%P!yekpI^$7v+X1JLhZ?@X-zLmt7KT!?ddT^O~no*)s(`RNsw_%+Gcqp z2>uC-j6CHL$Vvbo{l(IPgVb&P+`67IpcL&*ded6Fwl!DRx=`1VtLwO3w{gMV|AF#; z{L_+4P1nPh!@0<-Z@qLDzh{}XyuJ6fy?=gSKb38Pnu}cv?b~zh+rMAc_r>A4ra9$Y z>#bFN^E>yT>hvpcpqsQ$lmRxzu4_@DbcV*7Ia;_rh zZC>z(bKdYR@79a`^ol(_9mNmsiD>l>yl6$1(1Ty?Ef4S4B3IQtgeCWnPS>J=y&q}A ztbo_Uy_NWDSI_g-%T5Pi@Hxh~Qey2z;uT+~z=*4U+*@S48d$^j*KD{~G+wiBZfC@G zi=)>jTrc0;z=&@}3~00Tdb1x&L2Rmqp4HGx#c{lv);Jlj0K#S&xVld<@y64TU7 z>YXdW z<0^1r(}jjc9Vd0+NGu<%^WSI?gK%Hm^;#es8E9~>WLchhyvRDb&;2u&Xq%^IImk#A z1Kp@36B!Z&x*MPeARn2Y^aR{+5$RG=i;c$9s*-^(o`mUFp3pQ;VGXDkYATdosE#Kn zfg9majBJCAsHulzaWbrtLb?tn7?OvEWcDzS9p@kktb~ zd78)o5`vXaNd_4JJ?gtJb5~FxZ-j2#KQ@-iPbm&eH$7d|6y%@$exP}0xP+e;zVp$a zs#dJ!j^O$u?F^0;!)OMy45^pdbvsBpfXQ0Nd4psFZSwo3H-fqfunB;BOTZ5Ngj}SP zy^c9DljG{Z=D4PAhdX7E*F{XA#%IT^_+`R(ye&M}|H&Gm>Ze13!w~KZ+4J4yEpgL7 z{Qeg1=K#bjR6oSXV^u7(gYt8u)h?PPu)yU z2Wo09K*K4`U!>Bm{+(N5k?t*#7km0%AUi-H(Oke|Du%6t-VM}O7+6z@!f4&Ri*;sq zobYy$QW_2}-`EC<>j5I5B8`s4pntK%K{atGe;j2dIEP3VD8V6pD7LfPdLpH6Ag|Gn lgMPyu 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 Cmmg;U delta 3236 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 diff --git a/Backend/venv/lib/python3.12/site-packages/pydantic/deprecated/__pycache__/json.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/pydantic/deprecated/__pycache__/json.cpython-312.pyc index 001d8af6404c20c35b073bb88b77d864546870b5..5cae3f4ab3b22adfec6ce8af06bd83c13a1e2c0e 100644 GIT binary patch delta 2162 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 NADKiL*@{GfdI1>tVBr7& diff --git a/Backend/venv/lib/python3.12/site-packages/pydantic/deprecated/__pycache__/tools.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/pydantic/deprecated/__pycache__/tools.cpython-312.pyc index 3bed269bb61653b45641147c7c1ac32668363022..1e49cf19315d181923869c7512debb7b8d025e2a 100644 GIT binary patch delta 1089 zcmaKq%TLrm9LHz+-gdU#2g?E*mtDaq1~3HiqFy9;(IxmGB-OZ7I^YtztkVTTOhiu} zh$dv>&Bxi`!Nik^|AEHr0pn(s7~{obdFaW5GhO6h3{Cp&r|GZr{bbsD=1sY+}IO|PQn&?9H!Vz;=q{-lqi9{P@&IZrzBlnuF$t|JzuCe#K*FFdt&Dcme5C z(M|No4Q_ArhTe+vPUI+X9@2i86GB!hB52U zmy6BC8+yqvmHnzyp27{$uM%2U2k4|8>F#Bt{wfP5*S0S=wsG05-6lUpK~{DZdP-aD zy0E7iu6ls$jwZnVrX5%5V$q}gBiNAmDh=6P@G3ru(~oK=J*Q{;68sGw1$O!)ESOct zzSa1~M5(s8^w;X4UWQ5fTmK=D2>oWHkMX~m^zcADqAVJyx?I6U$8{=IOu~&J7R{mb zA!F3>@OfvdI!~5KlFx@9EY2xGZPbxJ%aH${{w0=y2qD}Ahra{kGqApbkxyWRK1PL= zE43R-yP_ZnI|_n>J1V1q(^eJ;s4iWsO;p0i0Rs6W^;CPkt+zffycNwrt8SQq$gY6` zP&QCGX~0Sb5l%Wtwgv_#1kxu0J|CDsY1y_I?bR?^+&UBXT&i7P_-{`PDq#=1?)7kL h_Hb(UaBB8&GC`^>usFql64{P33LCc+MkLSnk delta 1229 zcmah|O>7%Q6rNe{pZCvR+ezG{b#0n}(l#v-+>lx-6Mjk)TGXoQ7O~!Dr)?syZDvhF zB&3uR2c$}24qQ;~QMe%?aX{R-a4uRcR6SHkNL)5;xbxmRsnkk^mG+zO&3l^foA-8q zoJyvgUv1kU@O(Tuw<6h_PMvNAU0m?n?=H08 ze{boXv~aGsp6czO+YN4X#V>Sc`ch{Q@R<4i8>@a0cbY44Gh_qKmV+S+Pc^T^tl1G? zOVhL?evt0XsktEl&{lQ|qll7W@nHXRa&WIzQ+!f5T2+^L6_OlVy)E$?EMlt=zP?TQ z1n^lk)z<>vTj|}3QyCd|U^}h6weMo3-@7`>b6Xsjw~mz{%@HQyjh6uKl0Abc_Lqxa zEGGK(KiuQuZ@Jw%--(xRvncTUH(zkA3rdrAzV9jxYNKZUz`Zo_jXFbh@soO8Mb~^> zG_%eDqj+5l5of`#HTUtxuQ?Ma^*5>ERm_e9>H~tC$>`gwkcNy#@)!ILrtf+g2 zIHKQq`GW(at8u^ge{O%%B|1NHg+j*wX4U6Br81tBD&eQmAkMvjv%_M>XoyTJPG3S} z3nOEPpBlUNtg(U7qZRSc_-i9|hwB3vkIz0EvR(}Hh&hg%&mx!z7C>r28S{fM7z`Qb zHtu6r^UkE2@54vu`}_o!%2=A3OF_im4wi>~zRoLHnvXVbpbOzP;Vo$Dg5|c(K#0Ff z{2^dgpp-r!FFhjW@1*pQoV`!ZiZyF-<7#5NdrCo)p6C{R?MV?>hHSS%BrB0G9;7pe zv}TgALrMK)GT+{{kI+(LI#~hMOeIz$(~#+;RLzRW3{oA>Ok@_BIGtfV9HG`8mw@fd z09)IAljcHKUL;hZYAyupz7VpJ5VDaFvXKxnhm6&;60$N;i;rDkx#X@63>!rL1%_oQ A4FCWD diff --git a/Backend/venv/lib/python3.12/site-packages/pydantic/deprecated/class_validators.py b/Backend/venv/lib/python3.12/site-packages/pydantic/deprecated/class_validators.py index f1a331dd..43db6e26 100644 --- a/Backend/venv/lib/python3.12/site-packages/pydantic/deprecated/class_validators.py +++ b/Backend/venv/lib/python3.12/site-packages/pydantic/deprecated/class_validators.py @@ -4,10 +4,10 @@ from __future__ import annotations as _annotations from functools import partial, partialmethod from types import FunctionType -from typing import TYPE_CHECKING, Any, Callable, Literal, TypeVar, Union, overload +from typing import TYPE_CHECKING, Any, Callable, TypeVar, Union, overload from warnings import warn -from typing_extensions import Protocol, TypeAlias, deprecated +from typing_extensions import Literal, Protocol, TypeAlias from .._internal import _decorators, _decorators_v1 from ..errors import PydanticUserError @@ -19,24 +19,30 @@ _ALLOW_REUSE_WARNING_MESSAGE = '`allow_reuse` is deprecated and will be ignored; if TYPE_CHECKING: class _OnlyValueValidatorClsMethod(Protocol): - def __call__(self, __cls: Any, __value: Any) -> Any: ... + def __call__(self, __cls: Any, __value: Any) -> Any: + ... class _V1ValidatorWithValuesClsMethod(Protocol): - def __call__(self, __cls: Any, __value: Any, values: dict[str, Any]) -> Any: ... + def __call__(self, __cls: Any, __value: Any, values: dict[str, Any]) -> Any: + ... class _V1ValidatorWithValuesKwOnlyClsMethod(Protocol): - def __call__(self, __cls: Any, __value: Any, *, values: dict[str, Any]) -> Any: ... + def __call__(self, __cls: Any, __value: Any, *, values: dict[str, Any]) -> Any: + ... class _V1ValidatorWithKwargsClsMethod(Protocol): - def __call__(self, __cls: Any, **kwargs: Any) -> Any: ... + def __call__(self, __cls: Any, **kwargs: Any) -> Any: + ... class _V1ValidatorWithValuesAndKwargsClsMethod(Protocol): - def __call__(self, __cls: Any, values: dict[str, Any], **kwargs: Any) -> Any: ... + def __call__(self, __cls: Any, values: dict[str, Any], **kwargs: Any) -> Any: + ... class _V1RootValidatorClsMethod(Protocol): def __call__( self, __cls: Any, __values: _decorators_v1.RootValidatorValues - ) -> _decorators_v1.RootValidatorValues: ... + ) -> _decorators_v1.RootValidatorValues: + ... V1Validator = Union[ _OnlyValueValidatorClsMethod, @@ -73,12 +79,6 @@ else: DeprecationWarning = PydanticDeprecatedSince20 -@deprecated( - 'Pydantic V1 style `@validator` validators are deprecated.' - ' You should migrate to Pydantic V2 style `@field_validator` validators,' - ' see the migration guide for more details', - category=None, -) def validator( __field: str, *fields: str, @@ -94,7 +94,7 @@ def validator( __field (str): The first field the validator should be called on; this is separate from `fields` to ensure an error is raised if you don't pass at least one. *fields (str): Additional field(s) the validator should be called on. - pre (bool, optional): Whether this validator should be called before the standard + pre (bool, optional): Whether or not this validator should be called before the standard validators (else after). Defaults to False. each_item (bool, optional): For complex objects (sets, lists etc.) whether to validate individual elements rather than the whole object. Defaults to False. @@ -109,17 +109,9 @@ def validator( Callable: A decorator that can be used to decorate a function to be used as a validator. """ - warn( - 'Pydantic V1 style `@validator` validators are deprecated.' - ' You should migrate to Pydantic V2 style `@field_validator` validators,' - ' see the migration guide for more details', - DeprecationWarning, - stacklevel=2, - ) - if allow_reuse is True: # pragma: no cover - warn(_ALLOW_REUSE_WARNING_MESSAGE, DeprecationWarning, stacklevel=2) - fields = __field, *fields + warn(_ALLOW_REUSE_WARNING_MESSAGE, DeprecationWarning) + fields = tuple((__field, *fields)) if isinstance(fields[0], FunctionType): raise PydanticUserError( '`@validator` should be used with fields and keyword arguments, not bare. ' @@ -133,6 +125,14 @@ def validator( code='validator-invalid-fields', ) + warn( + 'Pydantic V1 style `@validator` validators are deprecated.' + ' You should migrate to Pydantic V2 style `@field_validator` validators,' + ' see the migration guide for more details', + DeprecationWarning, + stacklevel=2, + ) + mode: Literal['before', 'after'] = 'before' if pre is True else 'after' def dec(f: Any) -> _decorators.PydanticDescriptorProxy[Any]: @@ -165,7 +165,8 @@ def root_validator( ) -> Callable[ [_V1RootValidatorFunctionType], _V1RootValidatorFunctionType, -]: ... +]: + ... @overload @@ -178,7 +179,8 @@ def root_validator( ) -> Callable[ [_V1RootValidatorFunctionType], _V1RootValidatorFunctionType, -]: ... +]: + ... @overload @@ -192,15 +194,10 @@ def root_validator( ) -> Callable[ [_V1RootValidatorFunctionType], _V1RootValidatorFunctionType, -]: ... +]: + ... -@deprecated( - 'Pydantic V1 style `@root_validator` validators are deprecated.' - ' You should migrate to Pydantic V2 style `@model_validator` validators,' - ' see the migration guide for more details', - category=None, -) def root_validator( *__args, pre: bool = False, @@ -234,7 +231,7 @@ def root_validator( return root_validator()(*__args) # type: ignore if allow_reuse is True: # pragma: no cover - warn(_ALLOW_REUSE_WARNING_MESSAGE, DeprecationWarning, stacklevel=2) + warn(_ALLOW_REUSE_WARNING_MESSAGE, DeprecationWarning) mode: Literal['before', 'after'] = 'before' if pre is True else 'after' if pre is False and skip_on_failure is not True: raise PydanticUserError( diff --git a/Backend/venv/lib/python3.12/site-packages/pydantic/deprecated/config.py b/Backend/venv/lib/python3.12/site-packages/pydantic/deprecated/config.py index bd4692ac..7409847b 100644 --- a/Backend/venv/lib/python3.12/site-packages/pydantic/deprecated/config.py +++ b/Backend/venv/lib/python3.12/site-packages/pydantic/deprecated/config.py @@ -1,9 +1,9 @@ from __future__ import annotations as _annotations import warnings -from typing import TYPE_CHECKING, Any, Literal +from typing import TYPE_CHECKING, Any -from typing_extensions import deprecated +from typing_extensions import Literal, deprecated from .._internal import _config from ..warnings import PydanticDeprecatedSince20 @@ -18,10 +18,10 @@ __all__ = 'BaseConfig', 'Extra' class _ConfigMetaclass(type): def __getattr__(self, item: str) -> Any: + warnings.warn(_config.DEPRECATION_MESSAGE, DeprecationWarning) + try: - obj = _config.config_defaults[item] - warnings.warn(_config.DEPRECATION_MESSAGE, DeprecationWarning) - return obj + return _config.config_defaults[item] except KeyError as exc: raise AttributeError(f"type object '{self.__name__}' has no attribute {exc}") from exc @@ -35,10 +35,9 @@ class BaseConfig(metaclass=_ConfigMetaclass): """ def __getattr__(self, item: str) -> Any: + warnings.warn(_config.DEPRECATION_MESSAGE, DeprecationWarning) try: - obj = super().__getattribute__(item) - warnings.warn(_config.DEPRECATION_MESSAGE, DeprecationWarning) - return obj + return super().__getattribute__(item) except AttributeError as exc: try: return getattr(type(self), item) diff --git a/Backend/venv/lib/python3.12/site-packages/pydantic/deprecated/copy_internals.py b/Backend/venv/lib/python3.12/site-packages/pydantic/deprecated/copy_internals.py index 0170dc08..efe5de28 100644 --- a/Backend/venv/lib/python3.12/site-packages/pydantic/deprecated/copy_internals.py +++ b/Backend/venv/lib/python3.12/site-packages/pydantic/deprecated/copy_internals.py @@ -3,7 +3,7 @@ from __future__ import annotations as _annotations import typing from copy import deepcopy from enum import Enum -from typing import Any +from typing import Any, Tuple import typing_extensions @@ -18,7 +18,7 @@ if typing.TYPE_CHECKING: from .._internal._utils import AbstractSetIntStr, MappingIntStrAny AnyClassMethod = classmethod[Any, Any, Any] - TupleGenerator = typing.Generator[tuple[str, Any], None, None] + TupleGenerator = typing.Generator[Tuple[str, Any], None, None] Model = typing.TypeVar('Model', bound='BaseModel') # should be `set[int] | set[str] | dict[int, IncEx] | dict[str, IncEx] | None`, but mypy can't cope IncEx: typing_extensions.TypeAlias = 'set[int] | set[str] | dict[int, Any] | dict[str, Any] | None' @@ -40,11 +40,11 @@ def _iter( # The extra "is not None" guards are not logically necessary but optimizes performance for the simple case. if exclude is not None: exclude = _utils.ValueItems.merge( - {k: v.exclude for k, v in self.__pydantic_fields__.items() if v.exclude is not None}, exclude + {k: v.exclude for k, v in self.model_fields.items() if v.exclude is not None}, exclude ) if include is not None: - include = _utils.ValueItems.merge(dict.fromkeys(self.__pydantic_fields__, True), include, intersect=True) + include = _utils.ValueItems.merge({k: True for k in self.model_fields}, include, intersect=True) allowed_keys = _calculate_keys(self, include=include, exclude=exclude, exclude_unset=exclude_unset) # type: ignore if allowed_keys is None and not (to_dict or by_alias or exclude_unset or exclude_defaults or exclude_none): @@ -68,15 +68,15 @@ def _iter( if exclude_defaults: try: - field = self.__pydantic_fields__[field_key] + field = self.model_fields[field_key] except KeyError: pass else: if not field.is_required() and field.default == v: continue - if by_alias and field_key in self.__pydantic_fields__: - dict_key = self.__pydantic_fields__[field_key].alias or field_key + if by_alias and field_key in self.model_fields: + dict_key = self.model_fields[field_key].alias or field_key else: dict_key = field_key @@ -200,7 +200,7 @@ def _calculate_keys( include: MappingIntStrAny | None, exclude: MappingIntStrAny | None, exclude_unset: bool, - update: dict[str, Any] | None = None, # noqa UP006 + update: typing.Dict[str, Any] | None = None, # noqa UP006 ) -> typing.AbstractSet[str] | None: if include is None and exclude is None and exclude_unset is False: return None diff --git a/Backend/venv/lib/python3.12/site-packages/pydantic/deprecated/decorator.py b/Backend/venv/lib/python3.12/site-packages/pydantic/deprecated/decorator.py index e73ad209..11244ba1 100644 --- a/Backend/venv/lib/python3.12/site-packages/pydantic/deprecated/decorator.py +++ b/Backend/venv/lib/python3.12/site-packages/pydantic/deprecated/decorator.py @@ -1,7 +1,6 @@ import warnings -from collections.abc import Mapping from functools import wraps -from typing import TYPE_CHECKING, Any, Callable, Optional, TypeVar, Union, overload +from typing import TYPE_CHECKING, Any, Callable, Dict, List, Mapping, Optional, Tuple, Type, TypeVar, Union, overload from typing_extensions import deprecated @@ -23,29 +22,29 @@ if TYPE_CHECKING: AnyCallable = Callable[..., Any] AnyCallableT = TypeVar('AnyCallableT', bound=AnyCallable) - ConfigType = Union[None, type[Any], dict[str, Any]] + ConfigType = Union[None, Type[Any], Dict[str, Any]] @overload -def validate_arguments( - func: None = None, *, config: 'ConfigType' = None -) -> Callable[['AnyCallableT'], 'AnyCallableT']: ... - - -@overload -def validate_arguments(func: 'AnyCallableT') -> 'AnyCallableT': ... - - @deprecated( - 'The `validate_arguments` method is deprecated; use `validate_call` instead.', - category=None, + 'The `validate_arguments` method is deprecated; use `validate_call` instead.', category=PydanticDeprecatedSince20 ) +def validate_arguments(func: None = None, *, config: 'ConfigType' = None) -> Callable[['AnyCallableT'], 'AnyCallableT']: + ... + + +@overload +@deprecated( + 'The `validate_arguments` method is deprecated; use `validate_call` instead.', category=PydanticDeprecatedSince20 +) +def validate_arguments(func: 'AnyCallableT') -> 'AnyCallableT': + ... + + def validate_arguments(func: Optional['AnyCallableT'] = None, *, config: 'ConfigType' = None) -> Any: """Decorator to validate the arguments passed to a function.""" warnings.warn( - 'The `validate_arguments` method is deprecated; use `validate_call` instead.', - PydanticDeprecatedSince20, - stacklevel=2, + 'The `validate_arguments` method is deprecated; use `validate_call` instead.', DeprecationWarning, stacklevel=2 ) def validate(_func: 'AnyCallable') -> 'AnyCallable': @@ -87,7 +86,7 @@ class ValidatedFunction: ) self.raw_function = function - self.arg_mapping: dict[int, str] = {} + self.arg_mapping: Dict[int, str] = {} self.positional_only_args: set[str] = set() self.v_args_name = 'args' self.v_kwargs_name = 'kwargs' @@ -95,7 +94,7 @@ class ValidatedFunction: type_hints = _typing_extra.get_type_hints(function, include_extras=True) takes_args = False takes_kwargs = False - fields: dict[str, tuple[Any, Any]] = {} + fields: Dict[str, Tuple[Any, Any]] = {} for i, (name, p) in enumerate(parameters.items()): if p.annotation is p.empty: annotation = Any @@ -106,22 +105,22 @@ class ValidatedFunction: if p.kind == Parameter.POSITIONAL_ONLY: self.arg_mapping[i] = name fields[name] = annotation, default - fields[V_POSITIONAL_ONLY_NAME] = list[str], None + fields[V_POSITIONAL_ONLY_NAME] = List[str], None self.positional_only_args.add(name) elif p.kind == Parameter.POSITIONAL_OR_KEYWORD: self.arg_mapping[i] = name fields[name] = annotation, default - fields[V_DUPLICATE_KWARGS] = list[str], None + fields[V_DUPLICATE_KWARGS] = List[str], None elif p.kind == Parameter.KEYWORD_ONLY: fields[name] = annotation, default elif p.kind == Parameter.VAR_POSITIONAL: self.v_args_name = name - fields[name] = tuple[annotation, ...], None + fields[name] = Tuple[annotation, ...], None takes_args = True else: assert p.kind == Parameter.VAR_KEYWORD, p.kind self.v_kwargs_name = name - fields[name] = dict[str, annotation], None + fields[name] = Dict[str, annotation], None takes_kwargs = True # these checks avoid a clash between "args" and a field with that name @@ -134,11 +133,11 @@ class ValidatedFunction: if not takes_args: # we add the field so validation below can raise the correct exception - fields[self.v_args_name] = list[Any], None + fields[self.v_args_name] = List[Any], None if not takes_kwargs: # same with kwargs - fields[self.v_kwargs_name] = dict[Any, Any], None + fields[self.v_kwargs_name] = Dict[Any, Any], None self.create_model(fields, takes_args, takes_kwargs, config) @@ -150,8 +149,8 @@ class ValidatedFunction: m = self.init_model_instance(*args, **kwargs) return self.execute(m) - def build_values(self, args: tuple[Any, ...], kwargs: dict[str, Any]) -> dict[str, Any]: - values: dict[str, Any] = {} + def build_values(self, args: Tuple[Any, ...], kwargs: Dict[str, Any]) -> Dict[str, Any]: + values: Dict[str, Any] = {} if args: arg_iter = enumerate(args) while True: @@ -166,15 +165,15 @@ class ValidatedFunction: values[self.v_args_name] = [a] + [a for _, a in arg_iter] break - var_kwargs: dict[str, Any] = {} + var_kwargs: Dict[str, Any] = {} wrong_positional_args = [] duplicate_kwargs = [] fields_alias = [ field.alias - for name, field in self.model.__pydantic_fields__.items() + for name, field in self.model.model_fields.items() if name not in (self.v_args_name, self.v_kwargs_name) ] - non_var_fields = set(self.model.__pydantic_fields__) - {self.v_args_name, self.v_kwargs_name} + non_var_fields = set(self.model.model_fields) - {self.v_args_name, self.v_kwargs_name} for k, v in kwargs.items(): if k in non_var_fields or k in fields_alias: if k in self.positional_only_args: @@ -194,15 +193,11 @@ class ValidatedFunction: return values def execute(self, m: BaseModel) -> Any: - d = { - k: v - for k, v in m.__dict__.items() - if k in m.__pydantic_fields_set__ or m.__pydantic_fields__[k].default_factory - } + d = {k: v for k, v in m.__dict__.items() if k in m.__pydantic_fields_set__ or m.model_fields[k].default_factory} var_kwargs = d.pop(self.v_kwargs_name, {}) if self.v_args_name in d: - args_: list[Any] = [] + args_: List[Any] = [] in_kwargs = False kwargs = {} for name, value in d.items(): @@ -226,7 +221,7 @@ class ValidatedFunction: else: return self.raw_function(**d, **var_kwargs) - def create_model(self, fields: dict[str, Any], takes_args: bool, takes_kwargs: bool, config: 'ConfigType') -> None: + def create_model(self, fields: Dict[str, Any], takes_args: bool, takes_kwargs: bool, config: 'ConfigType') -> None: pos_args = len(self.arg_mapping) config_wrapper = _config.ConfigWrapper(config) @@ -243,7 +238,7 @@ class ValidatedFunction: class DecoratorBaseModel(BaseModel): @field_validator(self.v_args_name, check_fields=False) @classmethod - def check_args(cls, v: Optional[list[Any]]) -> Optional[list[Any]]: + def check_args(cls, v: Optional[List[Any]]) -> Optional[List[Any]]: if takes_args or v is None: return v @@ -251,7 +246,7 @@ class ValidatedFunction: @field_validator(self.v_kwargs_name, check_fields=False) @classmethod - def check_kwargs(cls, v: Optional[dict[str, Any]]) -> Optional[dict[str, Any]]: + def check_kwargs(cls, v: Optional[Dict[str, Any]]) -> Optional[Dict[str, Any]]: if takes_kwargs or v is None: return v @@ -261,7 +256,7 @@ class ValidatedFunction: @field_validator(V_POSITIONAL_ONLY_NAME, check_fields=False) @classmethod - def check_positional_only(cls, v: Optional[list[str]]) -> None: + def check_positional_only(cls, v: Optional[List[str]]) -> None: if v is None: return @@ -271,7 +266,7 @@ class ValidatedFunction: @field_validator(V_DUPLICATE_KWARGS, check_fields=False) @classmethod - def check_duplicate_kwargs(cls, v: Optional[list[str]]) -> None: + def check_duplicate_kwargs(cls, v: Optional[List[str]]) -> None: if v is None: return diff --git a/Backend/venv/lib/python3.12/site-packages/pydantic/deprecated/json.py b/Backend/venv/lib/python3.12/site-packages/pydantic/deprecated/json.py index 1e216a76..d0673532 100644 --- a/Backend/venv/lib/python3.12/site-packages/pydantic/deprecated/json.py +++ b/Backend/venv/lib/python3.12/site-packages/pydantic/deprecated/json.py @@ -7,12 +7,11 @@ from ipaddress import IPv4Address, IPv4Interface, IPv4Network, IPv6Address, IPv6 from pathlib import Path from re import Pattern from types import GeneratorType -from typing import TYPE_CHECKING, Any, Callable, Union +from typing import TYPE_CHECKING, Any, Callable, Dict, Type, Union from uuid import UUID from typing_extensions import deprecated -from .._internal._import_utils import import_cached_base_model from ..color import Color from ..networks import NameEmail from ..types import SecretBytes, SecretStr @@ -51,7 +50,7 @@ def decimal_encoder(dec_value: Decimal) -> Union[int, float]: return float(dec_value) -ENCODERS_BY_TYPE: dict[type[Any], Callable[[Any], Any]] = { +ENCODERS_BY_TYPE: Dict[Type[Any], Callable[[Any], Any]] = { bytes: lambda o: o.decode(), Color: str, datetime.date: isoformat, @@ -80,23 +79,18 @@ ENCODERS_BY_TYPE: dict[type[Any], Callable[[Any], Any]] = { @deprecated( - '`pydantic_encoder` is deprecated, use `pydantic_core.to_jsonable_python` instead.', - category=None, + 'pydantic_encoder is deprecated, use pydantic_core.to_jsonable_python instead.', category=PydanticDeprecatedSince20 ) def pydantic_encoder(obj: Any) -> Any: - warnings.warn( - '`pydantic_encoder` is deprecated, use `pydantic_core.to_jsonable_python` instead.', - category=PydanticDeprecatedSince20, - stacklevel=2, - ) from dataclasses import asdict, is_dataclass - BaseModel = import_cached_base_model() + from ..main import BaseModel + warnings.warn('pydantic_encoder is deprecated, use BaseModel.model_dump instead.', DeprecationWarning, stacklevel=2) if isinstance(obj, BaseModel): return obj.model_dump() elif is_dataclass(obj): - return asdict(obj) # type: ignore + return asdict(obj) # Check the class type and its superclasses for a matching encoder for base in obj.__class__.__mro__[:-1]: @@ -110,17 +104,12 @@ def pydantic_encoder(obj: Any) -> Any: # TODO: Add a suggested migration path once there is a way to use custom encoders -@deprecated( - '`custom_pydantic_encoder` is deprecated, use `BaseModel.model_dump` instead.', - category=None, -) -def custom_pydantic_encoder(type_encoders: dict[Any, Callable[[type[Any]], Any]], obj: Any) -> Any: - warnings.warn( - '`custom_pydantic_encoder` is deprecated, use `BaseModel.model_dump` instead.', - category=PydanticDeprecatedSince20, - stacklevel=2, - ) +@deprecated('custom_pydantic_encoder is deprecated.', category=PydanticDeprecatedSince20) +def custom_pydantic_encoder(type_encoders: Dict[Any, Callable[[Type[Any]], Any]], obj: Any) -> Any: # Check the class type and its superclasses for a matching encoder + warnings.warn( + 'custom_pydantic_encoder is deprecated, use BaseModel.model_dump instead.', DeprecationWarning, stacklevel=2 + ) for base in obj.__class__.__mro__[:-1]: try: encoder = type_encoders[base] @@ -132,10 +121,10 @@ def custom_pydantic_encoder(type_encoders: dict[Any, Callable[[type[Any]], Any]] return pydantic_encoder(obj) -@deprecated('`timedelta_isoformat` is deprecated.', category=None) +@deprecated('timedelta_isoformat is deprecated.', category=PydanticDeprecatedSince20) def timedelta_isoformat(td: datetime.timedelta) -> str: """ISO 8601 encoding for Python timedelta object.""" - warnings.warn('`timedelta_isoformat` is deprecated.', category=PydanticDeprecatedSince20, stacklevel=2) + warnings.warn('timedelta_isoformat is deprecated.', DeprecationWarning, stacklevel=2) minutes, seconds = divmod(td.seconds, 60) hours, minutes = divmod(minutes, 60) return f'{"-" if td.days < 0 else ""}P{abs(td.days)}DT{hours:d}H{minutes:d}M{seconds:d}.{td.microseconds:06d}S' diff --git a/Backend/venv/lib/python3.12/site-packages/pydantic/deprecated/parse.py b/Backend/venv/lib/python3.12/site-packages/pydantic/deprecated/parse.py index 2a92e62b..126d6aae 100644 --- a/Backend/venv/lib/python3.12/site-packages/pydantic/deprecated/parse.py +++ b/Backend/venv/lib/python3.12/site-packages/pydantic/deprecated/parse.py @@ -22,7 +22,7 @@ class Protocol(str, Enum): pickle = 'pickle' -@deprecated('`load_str_bytes` is deprecated.', category=None) +@deprecated('load_str_bytes is deprecated.', category=PydanticDeprecatedSince20) def load_str_bytes( b: str | bytes, *, @@ -32,7 +32,7 @@ def load_str_bytes( allow_pickle: bool = False, json_loads: Callable[[str], Any] = json.loads, ) -> Any: - warnings.warn('`load_str_bytes` is deprecated.', category=PydanticDeprecatedSince20, stacklevel=2) + warnings.warn('load_str_bytes is deprecated.', DeprecationWarning, stacklevel=2) if proto is None and content_type: if content_type.endswith(('json', 'javascript')): pass @@ -56,7 +56,7 @@ def load_str_bytes( raise TypeError(f'Unknown protocol: {proto}') -@deprecated('`load_file` is deprecated.', category=None) +@deprecated('load_file is deprecated.', category=PydanticDeprecatedSince20) def load_file( path: str | Path, *, @@ -66,7 +66,7 @@ def load_file( allow_pickle: bool = False, json_loads: Callable[[str], Any] = json.loads, ) -> Any: - warnings.warn('`load_file` is deprecated.', category=PydanticDeprecatedSince20, stacklevel=2) + warnings.warn('load_file is deprecated.', DeprecationWarning, stacklevel=2) path = Path(path) b = path.read_bytes() if content_type is None: diff --git a/Backend/venv/lib/python3.12/site-packages/pydantic/deprecated/tools.py b/Backend/venv/lib/python3.12/site-packages/pydantic/deprecated/tools.py index 5ad7faef..2b05d38e 100644 --- a/Backend/venv/lib/python3.12/site-packages/pydantic/deprecated/tools.py +++ b/Backend/venv/lib/python3.12/site-packages/pydantic/deprecated/tools.py @@ -2,7 +2,7 @@ from __future__ import annotations import json import warnings -from typing import TYPE_CHECKING, Any, Callable, TypeVar, Union +from typing import TYPE_CHECKING, Any, Callable, Type, TypeVar, Union from typing_extensions import deprecated @@ -17,20 +17,19 @@ if not TYPE_CHECKING: __all__ = 'parse_obj_as', 'schema_of', 'schema_json_of' -NameFactory = Union[str, Callable[[type[Any]], str]] +NameFactory = Union[str, Callable[[Type[Any]], str]] T = TypeVar('T') @deprecated( - '`parse_obj_as` is deprecated. Use `pydantic.TypeAdapter.validate_python` instead.', - category=None, + 'parse_obj_as is deprecated. Use pydantic.TypeAdapter.validate_python instead.', category=PydanticDeprecatedSince20 ) def parse_obj_as(type_: type[T], obj: Any, type_name: NameFactory | None = None) -> T: warnings.warn( - '`parse_obj_as` is deprecated. Use `pydantic.TypeAdapter.validate_python` instead.', - category=PydanticDeprecatedSince20, + 'parse_obj_as is deprecated. Use pydantic.TypeAdapter.validate_python instead.', + DeprecationWarning, stacklevel=2, ) if type_name is not None: # pragma: no cover @@ -43,8 +42,7 @@ def parse_obj_as(type_: type[T], obj: Any, type_name: NameFactory | None = None) @deprecated( - '`schema_of` is deprecated. Use `pydantic.TypeAdapter.json_schema` instead.', - category=None, + 'schema_of is deprecated. Use pydantic.TypeAdapter.json_schema instead.', category=PydanticDeprecatedSince20 ) def schema_of( type_: Any, @@ -56,9 +54,7 @@ def schema_of( ) -> dict[str, Any]: """Generate a JSON schema (as dict) for the passed model or dynamically generated one.""" warnings.warn( - '`schema_of` is deprecated. Use `pydantic.TypeAdapter.json_schema` instead.', - category=PydanticDeprecatedSince20, - stacklevel=2, + 'schema_of is deprecated. Use pydantic.TypeAdapter.json_schema instead.', DeprecationWarning, stacklevel=2 ) res = TypeAdapter(type_).json_schema( by_alias=by_alias, @@ -79,8 +75,7 @@ def schema_of( @deprecated( - '`schema_json_of` is deprecated. Use `pydantic.TypeAdapter.json_schema` instead.', - category=None, + 'schema_json_of is deprecated. Use pydantic.TypeAdapter.json_schema instead.', category=PydanticDeprecatedSince20 ) def schema_json_of( type_: Any, @@ -93,9 +88,7 @@ def schema_json_of( ) -> str: """Generate a JSON schema (as JSON) for the passed model or dynamically generated one.""" warnings.warn( - '`schema_json_of` is deprecated. Use `pydantic.TypeAdapter.json_schema` instead.', - category=PydanticDeprecatedSince20, - stacklevel=2, + 'schema_json_of is deprecated. Use pydantic.TypeAdapter.json_schema instead.', DeprecationWarning, stacklevel=2 ) return json.dumps( schema_of(type_, title=title, by_alias=by_alias, ref_template=ref_template, schema_generator=schema_generator), diff --git a/Backend/venv/lib/python3.12/site-packages/pydantic/env_settings.py b/Backend/venv/lib/python3.12/site-packages/pydantic/env_settings.py index cd0b04e6..662f5900 100644 --- a/Backend/venv/lib/python3.12/site-packages/pydantic/env_settings.py +++ b/Backend/venv/lib/python3.12/site-packages/pydantic/env_settings.py @@ -1,5 +1,4 @@ """The `env_settings` module is a backport module from V1.""" - from ._migration import getattr_migration __getattr__ = getattr_migration(__name__) diff --git a/Backend/venv/lib/python3.12/site-packages/pydantic/error_wrappers.py b/Backend/venv/lib/python3.12/site-packages/pydantic/error_wrappers.py index 2985419a..5144eeee 100644 --- a/Backend/venv/lib/python3.12/site-packages/pydantic/error_wrappers.py +++ b/Backend/venv/lib/python3.12/site-packages/pydantic/error_wrappers.py @@ -1,5 +1,4 @@ """The `error_wrappers` module is a backport module from V1.""" - from ._migration import getattr_migration __getattr__ = getattr_migration(__name__) diff --git a/Backend/venv/lib/python3.12/site-packages/pydantic/errors.py b/Backend/venv/lib/python3.12/site-packages/pydantic/errors.py index f2270682..6e6b3d28 100644 --- a/Backend/venv/lib/python3.12/site-packages/pydantic/errors.py +++ b/Backend/venv/lib/python3.12/site-packages/pydantic/errors.py @@ -1,14 +1,9 @@ """Pydantic-specific errors.""" - from __future__ import annotations as _annotations import re -from typing import Any, ClassVar, Literal -from typing_extensions import Self -from typing_inspection.introspection import Qualifier - -from pydantic._internal import _repr +from typing_extensions import Literal, Self from ._migration import getattr_migration from .version import version_short @@ -19,7 +14,6 @@ __all__ = ( 'PydanticImportError', 'PydanticSchemaGenerationError', 'PydanticInvalidForJsonSchema', - 'PydanticForbiddenQualifier', 'PydanticErrorCodes', ) @@ -42,7 +36,6 @@ PydanticErrorCodes = Literal[ 'model-field-missing-annotation', 'config-both', 'removed-kwargs', - 'circular-reference-schema', 'invalid-for-json-schema', 'json-schema-already-used', 'base-model-instantiated', @@ -50,10 +43,10 @@ PydanticErrorCodes = Literal[ 'schema-for-unknown-type', 'import-error', 'create-model-field-definitions', + 'create-model-config-base', 'validator-no-fields', 'validator-invalid-fields', 'validator-instance-method', - 'validator-input-type', 'root-validator-pre-skip', 'model-serializer-instance-method', 'validator-field-config-info', @@ -62,20 +55,9 @@ PydanticErrorCodes = Literal[ 'field-serializer-signature', 'model-serializer-signature', 'multiple-field-serializers', - 'invalid-annotated-type', + 'invalid_annotated_type', 'type-adapter-config-unused', 'root-model-extra', - 'unevaluable-type-annotation', - 'dataclass-init-false-extra-allow', - 'clashing-init-and-init-var', - 'model-config-invalid-field-name', - 'with-config-on-model', - 'dataclass-on-model', - 'validate-call-type', - 'unpack-typed-dict', - 'overlapping-unpack-typed-dict', - 'invalid-self-type', - 'validate-by-alias-and-name-false', ] @@ -164,26 +146,4 @@ class PydanticInvalidForJsonSchema(PydanticUserError): super().__init__(message, code='invalid-for-json-schema') -class PydanticForbiddenQualifier(PydanticUserError): - """An error raised if a forbidden type qualifier is found in a type annotation.""" - - _qualifier_repr_map: ClassVar[dict[Qualifier, str]] = { - 'required': 'typing.Required', - 'not_required': 'typing.NotRequired', - 'read_only': 'typing.ReadOnly', - 'class_var': 'typing.ClassVar', - 'init_var': 'dataclasses.InitVar', - 'final': 'typing.Final', - } - - def __init__(self, qualifier: Qualifier, annotation: Any) -> None: - super().__init__( - message=( - f'The annotation {_repr.display_as_type(annotation)!r} contains the {self._qualifier_repr_map[qualifier]!r} ' - f'type qualifier, which is invalid in the context it is defined.' - ), - code=None, - ) - - __getattr__ = getattr_migration(__name__) diff --git a/Backend/venv/lib/python3.12/site-packages/pydantic/experimental/__init__.py b/Backend/venv/lib/python3.12/site-packages/pydantic/experimental/__init__.py deleted file mode 100644 index 5b5add10..00000000 --- a/Backend/venv/lib/python3.12/site-packages/pydantic/experimental/__init__.py +++ /dev/null @@ -1 +0,0 @@ -"""The "experimental" module of pydantic contains potential new features that are subject to change.""" diff --git a/Backend/venv/lib/python3.12/site-packages/pydantic/experimental/__pycache__/__init__.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/pydantic/experimental/__pycache__/__init__.cpython-312.pyc deleted file mode 100644 index e2aa759fc34e8be8673a3124f625320ba73f83fa..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 316 zcmYjNF-`+95VQe7gp?0Zt0z+3o1T0Vf3 zE)_lnB(~XE&1!dMKBv=jmh1VVa5nd^ari6#3wDzX-kD)fY~b^wH}z-{X1IyixfVUC zW(I9AeS;8I5C@|?ISo2w%J~E_P~LK?0gtb+LPdRt3CJn})gh#Q`GT5&0%)szh2_JX zZ_lJOK}-3;cB77cEo^8}RDL7wFx3>IxX*{1Vi7{^d?gl2*XWH{qhE{0Ekzv227g^% zUWw!giNpA*J(_ZUPPL-;=CoNrmxo#f#M25w=8 diff --git a/Backend/venv/lib/python3.12/site-packages/pydantic/experimental/__pycache__/arguments_schema.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/pydantic/experimental/__pycache__/arguments_schema.cpython-312.pyc deleted file mode 100644 index 05df5ddb4473af14307a2d93b8e6239696faeb98..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2408 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≷=pFZ!jhb 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 CoreSchema: - """Generate the schema for the arguments of a function. - - Args: - func: The function to generate the schema for. - schema_type: The type of schema to generate. - parameters_callback: A callable that will be invoked for each parameter. The callback - should take three required arguments: the index, the name and the type annotation - (or [`Parameter.empty`][inspect.Parameter.empty] if not annotated) of the parameter. - The callback can optionally return `'skip'`, so that the parameter gets excluded - from the resulting schema. - config: The configuration to use. - - Returns: - The generated schema. - """ - generate_schema = _generate_schema.GenerateSchema( - _config.ConfigWrapper(config), - ns_resolver=_namespace_utils.NsResolver(namespaces_tuple=_namespace_utils.ns_for_function(func)), - ) - - if schema_type == 'arguments': - schema = generate_schema._arguments_schema(func, parameters_callback) # pyright: ignore[reportArgumentType] - else: - schema = generate_schema._arguments_v3_schema(func, parameters_callback) # pyright: ignore[reportArgumentType] - return generate_schema.clean_schema(schema) diff --git a/Backend/venv/lib/python3.12/site-packages/pydantic/experimental/missing_sentinel.py b/Backend/venv/lib/python3.12/site-packages/pydantic/experimental/missing_sentinel.py deleted file mode 100644 index 3e7f820c..00000000 --- a/Backend/venv/lib/python3.12/site-packages/pydantic/experimental/missing_sentinel.py +++ /dev/null @@ -1,5 +0,0 @@ -"""Experimental module exposing a function a `MISSING` sentinel.""" - -from pydantic_core import MISSING - -__all__ = ('MISSING',) diff --git a/Backend/venv/lib/python3.12/site-packages/pydantic/experimental/pipeline.py b/Backend/venv/lib/python3.12/site-packages/pydantic/experimental/pipeline.py deleted file mode 100644 index 633fb00a..00000000 --- a/Backend/venv/lib/python3.12/site-packages/pydantic/experimental/pipeline.py +++ /dev/null @@ -1,654 +0,0 @@ -"""Experimental pipeline API functionality. Be careful with this API, it's subject to change.""" - -from __future__ import annotations - -import datetime -import operator -import re -import sys -from collections import deque -from collections.abc import Container -from dataclasses import dataclass -from decimal import Decimal -from functools import cached_property, partial -from re import Pattern -from typing import TYPE_CHECKING, Annotated, Any, Callable, Generic, Protocol, TypeVar, Union, overload - -import annotated_types - -if TYPE_CHECKING: - from pydantic import GetCoreSchemaHandler - -from pydantic_core import PydanticCustomError -from pydantic_core import core_schema as cs - -from pydantic import Strict -from pydantic._internal._internal_dataclass import slots_true as _slots_true - -if sys.version_info < (3, 10): - EllipsisType = type(Ellipsis) -else: - from types import EllipsisType - -__all__ = ['validate_as', 'validate_as_deferred', 'transform'] - -_slots_frozen = {**_slots_true, 'frozen': True} - - -@dataclass(**_slots_frozen) -class _ValidateAs: - tp: type[Any] - strict: bool = False - - -@dataclass -class _ValidateAsDefer: - func: Callable[[], type[Any]] - - @cached_property - def tp(self) -> type[Any]: - return self.func() - - -@dataclass(**_slots_frozen) -class _Transform: - func: Callable[[Any], Any] - - -@dataclass(**_slots_frozen) -class _PipelineOr: - left: _Pipeline[Any, Any] - right: _Pipeline[Any, Any] - - -@dataclass(**_slots_frozen) -class _PipelineAnd: - left: _Pipeline[Any, Any] - right: _Pipeline[Any, Any] - - -@dataclass(**_slots_frozen) -class _Eq: - value: Any - - -@dataclass(**_slots_frozen) -class _NotEq: - value: Any - - -@dataclass(**_slots_frozen) -class _In: - values: Container[Any] - - -@dataclass(**_slots_frozen) -class _NotIn: - values: Container[Any] - - -_ConstraintAnnotation = Union[ - annotated_types.Le, - annotated_types.Ge, - annotated_types.Lt, - annotated_types.Gt, - annotated_types.Len, - annotated_types.MultipleOf, - annotated_types.Timezone, - annotated_types.Interval, - annotated_types.Predicate, - # common predicates not included in annotated_types - _Eq, - _NotEq, - _In, - _NotIn, - # regular expressions - Pattern[str], -] - - -@dataclass(**_slots_frozen) -class _Constraint: - constraint: _ConstraintAnnotation - - -_Step = Union[_ValidateAs, _ValidateAsDefer, _Transform, _PipelineOr, _PipelineAnd, _Constraint] - -_InT = TypeVar('_InT') -_OutT = TypeVar('_OutT') -_NewOutT = TypeVar('_NewOutT') - - -class _FieldTypeMarker: - pass - - -# TODO: ultimately, make this public, see https://github.com/pydantic/pydantic/pull/9459#discussion_r1628197626 -# Also, make this frozen eventually, but that doesn't work right now because of the generic base -# Which attempts to modify __orig_base__ and such. -# We could go with a manual freeze, but that seems overkill for now. -@dataclass(**_slots_true) -class _Pipeline(Generic[_InT, _OutT]): - """Abstract representation of a chain of validation, transformation, and parsing steps.""" - - _steps: tuple[_Step, ...] - - def transform( - self, - func: Callable[[_OutT], _NewOutT], - ) -> _Pipeline[_InT, _NewOutT]: - """Transform the output of the previous step. - - If used as the first step in a pipeline, the type of the field is used. - That is, the transformation is applied to after the value is parsed to the field's type. - """ - return _Pipeline[_InT, _NewOutT](self._steps + (_Transform(func),)) - - @overload - def validate_as(self, tp: type[_NewOutT], *, strict: bool = ...) -> _Pipeline[_InT, _NewOutT]: ... - - @overload - def validate_as(self, tp: EllipsisType, *, strict: bool = ...) -> _Pipeline[_InT, Any]: # type: ignore - ... - - def validate_as(self, tp: type[_NewOutT] | EllipsisType, *, strict: bool = False) -> _Pipeline[_InT, Any]: # type: ignore - """Validate / parse the input into a new type. - - If no type is provided, the type of the field is used. - - Types are parsed in Pydantic's `lax` mode by default, - but you can enable `strict` mode by passing `strict=True`. - """ - if isinstance(tp, EllipsisType): - return _Pipeline[_InT, Any](self._steps + (_ValidateAs(_FieldTypeMarker, strict=strict),)) - return _Pipeline[_InT, _NewOutT](self._steps + (_ValidateAs(tp, strict=strict),)) - - def validate_as_deferred(self, func: Callable[[], type[_NewOutT]]) -> _Pipeline[_InT, _NewOutT]: - """Parse the input into a new type, deferring resolution of the type until the current class - is fully defined. - - This is useful when you need to reference the class in it's own type annotations. - """ - return _Pipeline[_InT, _NewOutT](self._steps + (_ValidateAsDefer(func),)) - - # constraints - @overload - def constrain(self: _Pipeline[_InT, _NewOutGe], constraint: annotated_types.Ge) -> _Pipeline[_InT, _NewOutGe]: ... - - @overload - def constrain(self: _Pipeline[_InT, _NewOutGt], constraint: annotated_types.Gt) -> _Pipeline[_InT, _NewOutGt]: ... - - @overload - def constrain(self: _Pipeline[_InT, _NewOutLe], constraint: annotated_types.Le) -> _Pipeline[_InT, _NewOutLe]: ... - - @overload - def constrain(self: _Pipeline[_InT, _NewOutLt], constraint: annotated_types.Lt) -> _Pipeline[_InT, _NewOutLt]: ... - - @overload - def constrain( - self: _Pipeline[_InT, _NewOutLen], constraint: annotated_types.Len - ) -> _Pipeline[_InT, _NewOutLen]: ... - - @overload - def constrain( - self: _Pipeline[_InT, _NewOutT], constraint: annotated_types.MultipleOf - ) -> _Pipeline[_InT, _NewOutT]: ... - - @overload - def constrain( - self: _Pipeline[_InT, _NewOutDatetime], constraint: annotated_types.Timezone - ) -> _Pipeline[_InT, _NewOutDatetime]: ... - - @overload - def constrain(self: _Pipeline[_InT, _OutT], constraint: annotated_types.Predicate) -> _Pipeline[_InT, _OutT]: ... - - @overload - def constrain( - self: _Pipeline[_InT, _NewOutInterval], constraint: annotated_types.Interval - ) -> _Pipeline[_InT, _NewOutInterval]: ... - - @overload - def constrain(self: _Pipeline[_InT, _OutT], constraint: _Eq) -> _Pipeline[_InT, _OutT]: ... - - @overload - def constrain(self: _Pipeline[_InT, _OutT], constraint: _NotEq) -> _Pipeline[_InT, _OutT]: ... - - @overload - def constrain(self: _Pipeline[_InT, _OutT], constraint: _In) -> _Pipeline[_InT, _OutT]: ... - - @overload - def constrain(self: _Pipeline[_InT, _OutT], constraint: _NotIn) -> _Pipeline[_InT, _OutT]: ... - - @overload - def constrain(self: _Pipeline[_InT, _NewOutT], constraint: Pattern[str]) -> _Pipeline[_InT, _NewOutT]: ... - - def constrain(self, constraint: _ConstraintAnnotation) -> Any: - """Constrain a value to meet a certain condition. - - We support most conditions from `annotated_types`, as well as regular expressions. - - Most of the time you'll be calling a shortcut method like `gt`, `lt`, `len`, etc - so you don't need to call this directly. - """ - return _Pipeline[_InT, _OutT](self._steps + (_Constraint(constraint),)) - - def predicate(self: _Pipeline[_InT, _NewOutT], func: Callable[[_NewOutT], bool]) -> _Pipeline[_InT, _NewOutT]: - """Constrain a value to meet a certain predicate.""" - return self.constrain(annotated_types.Predicate(func)) - - def gt(self: _Pipeline[_InT, _NewOutGt], gt: _NewOutGt) -> _Pipeline[_InT, _NewOutGt]: - """Constrain a value to be greater than a certain value.""" - return self.constrain(annotated_types.Gt(gt)) - - def lt(self: _Pipeline[_InT, _NewOutLt], lt: _NewOutLt) -> _Pipeline[_InT, _NewOutLt]: - """Constrain a value to be less than a certain value.""" - return self.constrain(annotated_types.Lt(lt)) - - def ge(self: _Pipeline[_InT, _NewOutGe], ge: _NewOutGe) -> _Pipeline[_InT, _NewOutGe]: - """Constrain a value to be greater than or equal to a certain value.""" - return self.constrain(annotated_types.Ge(ge)) - - def le(self: _Pipeline[_InT, _NewOutLe], le: _NewOutLe) -> _Pipeline[_InT, _NewOutLe]: - """Constrain a value to be less than or equal to a certain value.""" - return self.constrain(annotated_types.Le(le)) - - def len(self: _Pipeline[_InT, _NewOutLen], min_len: int, max_len: int | None = None) -> _Pipeline[_InT, _NewOutLen]: - """Constrain a value to have a certain length.""" - return self.constrain(annotated_types.Len(min_len, max_len)) - - @overload - def multiple_of(self: _Pipeline[_InT, _NewOutDiv], multiple_of: _NewOutDiv) -> _Pipeline[_InT, _NewOutDiv]: ... - - @overload - def multiple_of(self: _Pipeline[_InT, _NewOutMod], multiple_of: _NewOutMod) -> _Pipeline[_InT, _NewOutMod]: ... - - def multiple_of(self: _Pipeline[_InT, Any], multiple_of: Any) -> _Pipeline[_InT, Any]: - """Constrain a value to be a multiple of a certain number.""" - return self.constrain(annotated_types.MultipleOf(multiple_of)) - - def eq(self: _Pipeline[_InT, _OutT], value: _OutT) -> _Pipeline[_InT, _OutT]: - """Constrain a value to be equal to a certain value.""" - return self.constrain(_Eq(value)) - - def not_eq(self: _Pipeline[_InT, _OutT], value: _OutT) -> _Pipeline[_InT, _OutT]: - """Constrain a value to not be equal to a certain value.""" - return self.constrain(_NotEq(value)) - - def in_(self: _Pipeline[_InT, _OutT], values: Container[_OutT]) -> _Pipeline[_InT, _OutT]: - """Constrain a value to be in a certain set.""" - return self.constrain(_In(values)) - - def not_in(self: _Pipeline[_InT, _OutT], values: Container[_OutT]) -> _Pipeline[_InT, _OutT]: - """Constrain a value to not be in a certain set.""" - return self.constrain(_NotIn(values)) - - # timezone methods - def datetime_tz_naive(self: _Pipeline[_InT, datetime.datetime]) -> _Pipeline[_InT, datetime.datetime]: - return self.constrain(annotated_types.Timezone(None)) - - def datetime_tz_aware(self: _Pipeline[_InT, datetime.datetime]) -> _Pipeline[_InT, datetime.datetime]: - return self.constrain(annotated_types.Timezone(...)) - - def datetime_tz( - self: _Pipeline[_InT, datetime.datetime], tz: datetime.tzinfo - ) -> _Pipeline[_InT, datetime.datetime]: - return self.constrain(annotated_types.Timezone(tz)) # type: ignore - - def datetime_with_tz( - self: _Pipeline[_InT, datetime.datetime], tz: datetime.tzinfo | None - ) -> _Pipeline[_InT, datetime.datetime]: - return self.transform(partial(datetime.datetime.replace, tzinfo=tz)) - - # string methods - def str_lower(self: _Pipeline[_InT, str]) -> _Pipeline[_InT, str]: - return self.transform(str.lower) - - def str_upper(self: _Pipeline[_InT, str]) -> _Pipeline[_InT, str]: - return self.transform(str.upper) - - def str_title(self: _Pipeline[_InT, str]) -> _Pipeline[_InT, str]: - return self.transform(str.title) - - def str_strip(self: _Pipeline[_InT, str]) -> _Pipeline[_InT, str]: - return self.transform(str.strip) - - def str_pattern(self: _Pipeline[_InT, str], pattern: str) -> _Pipeline[_InT, str]: - return self.constrain(re.compile(pattern)) - - def str_contains(self: _Pipeline[_InT, str], substring: str) -> _Pipeline[_InT, str]: - return self.predicate(lambda v: substring in v) - - def str_starts_with(self: _Pipeline[_InT, str], prefix: str) -> _Pipeline[_InT, str]: - return self.predicate(lambda v: v.startswith(prefix)) - - def str_ends_with(self: _Pipeline[_InT, str], suffix: str) -> _Pipeline[_InT, str]: - return self.predicate(lambda v: v.endswith(suffix)) - - # operators - def otherwise(self, other: _Pipeline[_OtherIn, _OtherOut]) -> _Pipeline[_InT | _OtherIn, _OutT | _OtherOut]: - """Combine two validation chains, returning the result of the first chain if it succeeds, and the second chain if it fails.""" - return _Pipeline((_PipelineOr(self, other),)) - - __or__ = otherwise - - def then(self, other: _Pipeline[_OutT, _OtherOut]) -> _Pipeline[_InT, _OtherOut]: - """Pipe the result of one validation chain into another.""" - return _Pipeline((_PipelineAnd(self, other),)) - - __and__ = then - - def __get_pydantic_core_schema__(self, source_type: Any, handler: GetCoreSchemaHandler) -> cs.CoreSchema: - queue = deque(self._steps) - - s = None - - while queue: - step = queue.popleft() - s = _apply_step(step, s, handler, source_type) - - s = s or cs.any_schema() - return s - - def __supports_type__(self, _: _OutT) -> bool: - raise NotImplementedError - - -validate_as = _Pipeline[Any, Any](()).validate_as -validate_as_deferred = _Pipeline[Any, Any](()).validate_as_deferred -transform = _Pipeline[Any, Any]((_ValidateAs(_FieldTypeMarker),)).transform - - -def _check_func( - func: Callable[[Any], bool], predicate_err: str | Callable[[], str], s: cs.CoreSchema | None -) -> cs.CoreSchema: - def handler(v: Any) -> Any: - if func(v): - return v - raise ValueError(f'Expected {predicate_err if isinstance(predicate_err, str) else predicate_err()}') - - if s is None: - return cs.no_info_plain_validator_function(handler) - else: - return cs.no_info_after_validator_function(handler, s) - - -def _apply_step(step: _Step, s: cs.CoreSchema | None, handler: GetCoreSchemaHandler, source_type: Any) -> cs.CoreSchema: - if isinstance(step, _ValidateAs): - s = _apply_parse(s, step.tp, step.strict, handler, source_type) - elif isinstance(step, _ValidateAsDefer): - s = _apply_parse(s, step.tp, False, handler, source_type) - elif isinstance(step, _Transform): - s = _apply_transform(s, step.func, handler) - elif isinstance(step, _Constraint): - s = _apply_constraint(s, step.constraint) - elif isinstance(step, _PipelineOr): - s = cs.union_schema([handler(step.left), handler(step.right)]) - else: - assert isinstance(step, _PipelineAnd) - s = cs.chain_schema([handler(step.left), handler(step.right)]) - return s - - -def _apply_parse( - s: cs.CoreSchema | None, - tp: type[Any], - strict: bool, - handler: GetCoreSchemaHandler, - source_type: Any, -) -> cs.CoreSchema: - if tp is _FieldTypeMarker: - return cs.chain_schema([s, handler(source_type)]) if s else handler(source_type) - - if strict: - tp = Annotated[tp, Strict()] # type: ignore - - if s and s['type'] == 'any': - return handler(tp) - else: - return cs.chain_schema([s, handler(tp)]) if s else handler(tp) - - -def _apply_transform( - s: cs.CoreSchema | None, func: Callable[[Any], Any], handler: GetCoreSchemaHandler -) -> cs.CoreSchema: - if s is None: - return cs.no_info_plain_validator_function(func) - - if s['type'] == 'str': - if func is str.strip: - s = s.copy() - s['strip_whitespace'] = True - return s - elif func is str.lower: - s = s.copy() - s['to_lower'] = True - return s - elif func is str.upper: - s = s.copy() - s['to_upper'] = True - return s - - return cs.no_info_after_validator_function(func, s) - - -def _apply_constraint( # noqa: C901 - s: cs.CoreSchema | None, constraint: _ConstraintAnnotation -) -> cs.CoreSchema: - """Apply a single constraint to a schema.""" - if isinstance(constraint, annotated_types.Gt): - gt = constraint.gt - if s and s['type'] in {'int', 'float', 'decimal'}: - s = s.copy() - if s['type'] == 'int' and isinstance(gt, int): - s['gt'] = gt - elif s['type'] == 'float' and isinstance(gt, float): - s['gt'] = gt - elif s['type'] == 'decimal' and isinstance(gt, Decimal): - s['gt'] = gt - else: - - def check_gt(v: Any) -> bool: - return v > gt - - s = _check_func(check_gt, f'> {gt}', s) - elif isinstance(constraint, annotated_types.Ge): - ge = constraint.ge - if s and s['type'] in {'int', 'float', 'decimal'}: - s = s.copy() - if s['type'] == 'int' and isinstance(ge, int): - s['ge'] = ge - elif s['type'] == 'float' and isinstance(ge, float): - s['ge'] = ge - elif s['type'] == 'decimal' and isinstance(ge, Decimal): - s['ge'] = ge - - def check_ge(v: Any) -> bool: - return v >= ge - - s = _check_func(check_ge, f'>= {ge}', s) - elif isinstance(constraint, annotated_types.Lt): - lt = constraint.lt - if s and s['type'] in {'int', 'float', 'decimal'}: - s = s.copy() - if s['type'] == 'int' and isinstance(lt, int): - s['lt'] = lt - elif s['type'] == 'float' and isinstance(lt, float): - s['lt'] = lt - elif s['type'] == 'decimal' and isinstance(lt, Decimal): - s['lt'] = lt - - def check_lt(v: Any) -> bool: - return v < lt - - s = _check_func(check_lt, f'< {lt}', s) - elif isinstance(constraint, annotated_types.Le): - le = constraint.le - if s and s['type'] in {'int', 'float', 'decimal'}: - s = s.copy() - if s['type'] == 'int' and isinstance(le, int): - s['le'] = le - elif s['type'] == 'float' and isinstance(le, float): - s['le'] = le - elif s['type'] == 'decimal' and isinstance(le, Decimal): - s['le'] = le - - def check_le(v: Any) -> bool: - return v <= le - - s = _check_func(check_le, f'<= {le}', s) - elif isinstance(constraint, annotated_types.Len): - min_len = constraint.min_length - max_len = constraint.max_length - - if s and s['type'] in {'str', 'list', 'tuple', 'set', 'frozenset', 'dict'}: - assert ( - s['type'] == 'str' - or s['type'] == 'list' - or s['type'] == 'tuple' - or s['type'] == 'set' - or s['type'] == 'dict' - or s['type'] == 'frozenset' - ) - s = s.copy() - if min_len != 0: - s['min_length'] = min_len - if max_len is not None: - s['max_length'] = max_len - - def check_len(v: Any) -> bool: - if max_len is not None: - return (min_len <= len(v)) and (len(v) <= max_len) - return min_len <= len(v) - - s = _check_func(check_len, f'length >= {min_len} and length <= {max_len}', s) - elif isinstance(constraint, annotated_types.MultipleOf): - multiple_of = constraint.multiple_of - if s and s['type'] in {'int', 'float', 'decimal'}: - s = s.copy() - if s['type'] == 'int' and isinstance(multiple_of, int): - s['multiple_of'] = multiple_of - elif s['type'] == 'float' and isinstance(multiple_of, float): - s['multiple_of'] = multiple_of - elif s['type'] == 'decimal' and isinstance(multiple_of, Decimal): - s['multiple_of'] = multiple_of - - def check_multiple_of(v: Any) -> bool: - return v % multiple_of == 0 - - s = _check_func(check_multiple_of, f'% {multiple_of} == 0', s) - elif isinstance(constraint, annotated_types.Timezone): - tz = constraint.tz - - if tz is ...: - if s and s['type'] == 'datetime': - s = s.copy() - s['tz_constraint'] = 'aware' - else: - - def check_tz_aware(v: object) -> bool: - assert isinstance(v, datetime.datetime) - return v.tzinfo is not None - - s = _check_func(check_tz_aware, 'timezone aware', s) - elif tz is None: - if s and s['type'] == 'datetime': - s = s.copy() - s['tz_constraint'] = 'naive' - else: - - def check_tz_naive(v: object) -> bool: - assert isinstance(v, datetime.datetime) - return v.tzinfo is None - - s = _check_func(check_tz_naive, 'timezone naive', s) - else: - raise NotImplementedError('Constraining to a specific timezone is not yet supported') - elif isinstance(constraint, annotated_types.Interval): - if constraint.ge: - s = _apply_constraint(s, annotated_types.Ge(constraint.ge)) - if constraint.gt: - s = _apply_constraint(s, annotated_types.Gt(constraint.gt)) - if constraint.le: - s = _apply_constraint(s, annotated_types.Le(constraint.le)) - if constraint.lt: - s = _apply_constraint(s, annotated_types.Lt(constraint.lt)) - assert s is not None - elif isinstance(constraint, annotated_types.Predicate): - func = constraint.func - # Same logic as in `_known_annotated_metadata.apply_known_metadata()`: - predicate_name = f'{func.__qualname__!r} ' if hasattr(func, '__qualname__') else '' - - def predicate_func(v: Any) -> Any: - if not func(v): - raise PydanticCustomError( - 'predicate_failed', - f'Predicate {predicate_name}failed', # pyright: ignore[reportArgumentType] - ) - return v - - if s is None: - s = cs.no_info_plain_validator_function(predicate_func) - else: - s = cs.no_info_after_validator_function(predicate_func, s) - elif isinstance(constraint, _NotEq): - value = constraint.value - - def check_not_eq(v: Any) -> bool: - return operator.__ne__(v, value) - - s = _check_func(check_not_eq, f'!= {value}', s) - elif isinstance(constraint, _Eq): - value = constraint.value - - def check_eq(v: Any) -> bool: - return operator.__eq__(v, value) - - s = _check_func(check_eq, f'== {value}', s) - elif isinstance(constraint, _In): - values = constraint.values - - def check_in(v: Any) -> bool: - return operator.__contains__(values, v) - - s = _check_func(check_in, f'in {values}', s) - elif isinstance(constraint, _NotIn): - values = constraint.values - - def check_not_in(v: Any) -> bool: - return operator.__not__(operator.__contains__(values, v)) - - s = _check_func(check_not_in, f'not in {values}', s) - else: - assert isinstance(constraint, Pattern) - if s and s['type'] == 'str': - s = s.copy() - s['pattern'] = constraint.pattern - else: - - def check_pattern(v: object) -> bool: - assert isinstance(v, str) - return constraint.match(v) is not None - - s = _check_func(check_pattern, f'~ {constraint.pattern}', s) - return s - - -class _SupportsRange(annotated_types.SupportsLe, annotated_types.SupportsGe, Protocol): - pass - - -class _SupportsLen(Protocol): - def __len__(self) -> int: ... - - -_NewOutGt = TypeVar('_NewOutGt', bound=annotated_types.SupportsGt) -_NewOutGe = TypeVar('_NewOutGe', bound=annotated_types.SupportsGe) -_NewOutLt = TypeVar('_NewOutLt', bound=annotated_types.SupportsLt) -_NewOutLe = TypeVar('_NewOutLe', bound=annotated_types.SupportsLe) -_NewOutLen = TypeVar('_NewOutLen', bound=_SupportsLen) -_NewOutDiv = TypeVar('_NewOutDiv', bound=annotated_types.SupportsDiv) -_NewOutMod = TypeVar('_NewOutMod', bound=annotated_types.SupportsMod) -_NewOutDatetime = TypeVar('_NewOutDatetime', bound=datetime.datetime) -_NewOutInterval = TypeVar('_NewOutInterval', bound=_SupportsRange) -_OtherIn = TypeVar('_OtherIn') -_OtherOut = TypeVar('_OtherOut') diff --git a/Backend/venv/lib/python3.12/site-packages/pydantic/fields.py b/Backend/venv/lib/python3.12/site-packages/pydantic/fields.py index b091710a..15831b75 100644 --- a/Backend/venv/lib/python3.12/site-packages/pydantic/fields.py +++ b/Backend/venv/lib/python3.12/site-packages/pydantic/fields.py @@ -1,92 +1,76 @@ """Defining fields on models.""" - from __future__ import annotations as _annotations import dataclasses import inspect -import re import sys -from collections.abc import Callable, Mapping +import typing from copy import copy from dataclasses import Field as DataclassField -from functools import cached_property -from typing import TYPE_CHECKING, Annotated, Any, ClassVar, Literal, TypeVar, cast, final, overload + +try: + from functools import cached_property # type: ignore +except ImportError: + # python 3.7 + cached_property = None +from typing import Any, ClassVar from warnings import warn import annotated_types import typing_extensions -from pydantic_core import MISSING, PydanticUndefined -from typing_extensions import Self, TypeAlias, TypedDict, Unpack, deprecated -from typing_inspection import typing_objects -from typing_inspection.introspection import UNKNOWN, AnnotationSource, ForbiddenQualifier, Qualifier, inspect_annotation +from pydantic_core import PydanticUndefined +from typing_extensions import Literal, Unpack from . import types from ._internal import _decorators, _fields, _generics, _internal_dataclass, _repr, _typing_extra, _utils -from ._internal._namespace_utils import GlobalsNamespace, MappingNamespace -from .aliases import AliasChoices, AliasGenerator, AliasPath from .config import JsonDict -from .errors import PydanticForbiddenQualifier, PydanticUserError -from .json_schema import PydanticJsonSchemaWarning +from .errors import PydanticUserError from .warnings import PydanticDeprecatedSince20 -if TYPE_CHECKING: - from ._internal._config import ConfigWrapper +if typing.TYPE_CHECKING: from ._internal._repr import ReprArgs - - -__all__ = 'Field', 'FieldInfo', 'PrivateAttr', 'computed_field' +else: + # See PyCharm issues https://youtrack.jetbrains.com/issue/PY-21915 + # and https://youtrack.jetbrains.com/issue/PY-51428 + DeprecationWarning = PydanticDeprecatedSince20 _Unset: Any = PydanticUndefined -if sys.version_info >= (3, 13): - import warnings - Deprecated: TypeAlias = warnings.deprecated | deprecated -else: - Deprecated: TypeAlias = deprecated - - -class _FromFieldInfoInputs(TypedDict, total=False): +class _FromFieldInfoInputs(typing_extensions.TypedDict, total=False): """This class exists solely to add type checking for the `**kwargs` in `FieldInfo.from_field`.""" - # TODO PEP 747: use TypeForm: annotation: type[Any] | None - default_factory: Callable[[], Any] | Callable[[dict[str, Any]], Any] | None + default_factory: typing.Callable[[], Any] | None alias: str | None alias_priority: int | None validation_alias: str | AliasPath | AliasChoices | None serialization_alias: str | None title: str | None - field_title_generator: Callable[[str, FieldInfo], str] | None description: str | None examples: list[Any] | None exclude: bool | None - exclude_if: Callable[[Any], bool] | None - gt: annotated_types.SupportsGt | None - ge: annotated_types.SupportsGe | None - lt: annotated_types.SupportsLt | None - le: annotated_types.SupportsLe | None + gt: float | None + ge: float | None + lt: float | None + le: float | None multiple_of: float | None strict: bool | None min_length: int | None max_length: int | None - pattern: str | re.Pattern[str] | None + pattern: str | None allow_inf_nan: bool | None max_digits: int | None decimal_places: int | None union_mode: Literal['smart', 'left_to_right'] | None discriminator: str | types.Discriminator | None - deprecated: Deprecated | str | bool | None - json_schema_extra: JsonDict | Callable[[JsonDict], None] | None + json_schema_extra: JsonDict | typing.Callable[[JsonDict], None] | None frozen: bool | None validate_default: bool | None repr: bool - init: bool | None init_var: bool | None kw_only: bool | None - coerce_numbers_to_str: bool | None - fail_fast: bool | None class _FieldInfoInputs(_FromFieldInfoInputs, total=False): @@ -95,14 +79,6 @@ class _FieldInfoInputs(_FromFieldInfoInputs, total=False): default: Any -class _FieldInfoAsDict(TypedDict, closed=True): - # TODO PEP 747: use TypeForm: - annotation: Any - metadata: list[Any] - attributes: dict[str, Any] - - -@final class FieldInfo(_repr.Representation): """This class holds information about a field. @@ -110,65 +86,47 @@ class FieldInfo(_repr.Representation): function is explicitly used. !!! warning - The `FieldInfo` class is meant to expose information about a field in a Pydantic model or dataclass. - `FieldInfo` instances shouldn't be instantiated directly, nor mutated. - - If you need to derive a new model from another one and are willing to alter `FieldInfo` instances, - refer to this [dynamic model example](../examples/dynamic_models.md). + You generally shouldn't be creating `FieldInfo` directly, you'll only need to use it when accessing + [`BaseModel`][pydantic.main.BaseModel] `.model_fields` internals. Attributes: annotation: The type annotation of the field. default: The default value of the field. - default_factory: A callable to generate the default value. The callable can either take 0 arguments - (in which case it is called as is) or a single argument containing the already validated data. + default_factory: The factory function used to construct the default for the field. alias: The alias name of the field. alias_priority: The priority of the field's alias. - validation_alias: The validation alias of the field. - serialization_alias: The serialization alias of the field. + validation_alias: The validation alias name of the field. + serialization_alias: The serialization alias name of the field. title: The title of the field. - field_title_generator: A callable that takes a field name and returns title for it. description: The description of the field. examples: List of examples of the field. exclude: Whether to exclude the field from the model serialization. - exclude_if: A callable that determines whether to exclude a field during serialization based on its value. discriminator: Field name or Discriminator for discriminating the type in a tagged union. - deprecated: A deprecation message, an instance of `warnings.deprecated` or the `typing_extensions.deprecated` backport, - or a boolean. If `True`, a default deprecation message will be emitted when accessing the field. - json_schema_extra: A dict or callable to provide extra JSON schema properties. + json_schema_extra: Dictionary of extra JSON schema properties. frozen: Whether the field is frozen. validate_default: Whether to validate the default value of the field. repr: Whether to include the field in representation of the model. - init: Whether the field should be included in the constructor of the dataclass. - init_var: Whether the field should _only_ be included in the constructor of the dataclass, and not stored. + init_var: Whether the field should be included in the constructor of the dataclass. kw_only: Whether the field should be a keyword-only argument in the constructor of the dataclass. - metadata: The metadata list. Contains all the data that isn't expressed as direct `FieldInfo` attributes, including: - - * Type-specific constraints, such as `gt` or `min_length` (these are converted to metadata classes such as `annotated_types.Gt`). - * Any other arbitrary object used within [`Annotated`][typing.Annotated] metadata - (e.g. [custom types handlers](../concepts/types.md#as-an-annotation) or any object not recognized by Pydantic). + metadata: List of metadata constraints. """ - # TODO PEP 747: use TypeForm: annotation: type[Any] | None default: Any - default_factory: Callable[[], Any] | Callable[[dict[str, Any]], Any] | None + default_factory: typing.Callable[[], Any] | None alias: str | None alias_priority: int | None validation_alias: str | AliasPath | AliasChoices | None serialization_alias: str | None title: str | None - field_title_generator: Callable[[str, FieldInfo], str] | None description: str | None examples: list[Any] | None exclude: bool | None - exclude_if: Callable[[Any], bool] | None discriminator: str | types.Discriminator | None - deprecated: Deprecated | str | bool | None - json_schema_extra: JsonDict | Callable[[JsonDict], None] | None + json_schema_extra: JsonDict | typing.Callable[[JsonDict], None] | None frozen: bool | None validate_default: bool | None repr: bool - init: bool | None init_var: bool | None kw_only: bool | None metadata: list[Any] @@ -182,32 +140,23 @@ class FieldInfo(_repr.Representation): 'validation_alias', 'serialization_alias', 'title', - 'field_title_generator', 'description', 'examples', 'exclude', - 'exclude_if', 'discriminator', - 'deprecated', 'json_schema_extra', 'frozen', 'validate_default', 'repr', - 'init', 'init_var', 'kw_only', 'metadata', '_attributes_set', - '_qualifiers', - '_complete', - '_original_assignment', - '_original_annotation', - '_final', ) # used to convert kwargs to metadata/constraints, # None has a special meaning - these items are collected into a `PydanticGeneralMetadata` - metadata_lookup: ClassVar[dict[str, Callable[[Any], Any] | None]] = { + metadata_lookup: ClassVar[dict[str, typing.Callable[[Any], Any] | None]] = { 'strict': types.Strict, 'gt': annotated_types.Gt, 'ge': annotated_types.Ge, @@ -221,8 +170,6 @@ class FieldInfo(_repr.Representation): 'max_digits': None, 'decimal_places': None, 'union_mode': None, - 'coerce_numbers_to_str': None, - 'fail_fast': types.FailFast, } def __init__(self, **kwargs: Unpack[_FieldInfoInputs]) -> None: @@ -231,18 +178,13 @@ class FieldInfo(_repr.Representation): See the signature of `pydantic.fields.Field` for more details about the expected arguments. """ - # Tracking the explicitly set attributes is necessary to correctly merge `Field()` functions - # (e.g. with `Annotated[int, Field(alias='a'), Field(alias=None)]`, even though `None` is the default value, - # we need to track that `alias=None` was explicitly set): - self._attributes_set = {k: v for k, v in kwargs.items() if v is not _Unset and k not in self.metadata_lookup} + self._attributes_set = {k: v for k, v in kwargs.items() if v is not _Unset} kwargs = {k: _DefaultValues.get(k) if v is _Unset else v for k, v in kwargs.items()} # type: ignore - self.annotation = kwargs.get('annotation') + self.annotation, annotation_metadata = self._extract_metadata(kwargs.get('annotation')) - # Note: in theory, the second `pop()` arguments are not required below, as defaults are already set from `_DefaultsValues`. default = kwargs.pop('default', PydanticUndefined) if default is Ellipsis: self.default = PydanticUndefined - self._attributes_set.pop('default', None) else: self.default = default @@ -251,44 +193,30 @@ class FieldInfo(_repr.Representation): if self.default is not PydanticUndefined and self.default_factory is not None: raise TypeError('cannot specify both default and default_factory') + self.title = kwargs.pop('title', None) self.alias = kwargs.pop('alias', None) self.validation_alias = kwargs.pop('validation_alias', None) self.serialization_alias = kwargs.pop('serialization_alias', None) alias_is_set = any(alias is not None for alias in (self.alias, self.validation_alias, self.serialization_alias)) self.alias_priority = kwargs.pop('alias_priority', None) or 2 if alias_is_set else None - self.title = kwargs.pop('title', None) - self.field_title_generator = kwargs.pop('field_title_generator', None) self.description = kwargs.pop('description', None) self.examples = kwargs.pop('examples', None) self.exclude = kwargs.pop('exclude', None) - self.exclude_if = kwargs.pop('exclude_if', None) self.discriminator = kwargs.pop('discriminator', None) - # For compatibility with FastAPI<=0.110.0, we preserve the existing value if it is not overridden - self.deprecated = kwargs.pop('deprecated', getattr(self, 'deprecated', None)) self.repr = kwargs.pop('repr', True) self.json_schema_extra = kwargs.pop('json_schema_extra', None) self.validate_default = kwargs.pop('validate_default', None) self.frozen = kwargs.pop('frozen', None) # currently only used on dataclasses - self.init = kwargs.pop('init', None) self.init_var = kwargs.pop('init_var', None) self.kw_only = kwargs.pop('kw_only', None) - self.metadata = self._collect_metadata(kwargs) # type: ignore + self.metadata = self._collect_metadata(kwargs) + annotation_metadata # type: ignore - # Private attributes: - self._qualifiers: set[Qualifier] = set() - # Used to rebuild FieldInfo instances: - self._complete = True - self._original_annotation: Any = PydanticUndefined - self._original_assignment: Any = PydanticUndefined - # Used to track whether the `FieldInfo` instance represents the data about a field (and is exposed in `model_fields`/`__pydantic_fields__`), - # or if it is the result of the `Field()` function being used as metadata in an `Annotated` type/as an assignment - # (not an ideal pattern, see https://github.com/pydantic/pydantic/issues/11122): - self._final = False - - @staticmethod - def from_field(default: Any = PydanticUndefined, **kwargs: Unpack[_FromFieldInfoInputs]) -> FieldInfo: + @classmethod + def from_field( + cls, default: Any = PydanticUndefined, **kwargs: Unpack[_FromFieldInfoInputs] + ) -> typing_extensions.Self: """Create a new `FieldInfo` object with the `Field` function. Args: @@ -313,263 +241,148 @@ class FieldInfo(_repr.Representation): """ if 'annotation' in kwargs: raise TypeError('"annotation" is not permitted as a Field keyword argument') - return FieldInfo(default=default, **kwargs) + return cls(default=default, **kwargs) - @staticmethod - def from_annotation(annotation: type[Any], *, _source: AnnotationSource = AnnotationSource.ANY) -> FieldInfo: + @classmethod + def from_annotation(cls, annotation: type[Any]) -> FieldInfo: """Creates a `FieldInfo` instance from a bare annotation. - This function is used internally to create a `FieldInfo` from a bare annotation like this: - - ```python - import pydantic - - class MyModel(pydantic.BaseModel): - foo: int # <-- like this - ``` - - We also account for the case where the annotation can be an instance of `Annotated` and where - one of the (not first) arguments in `Annotated` is an instance of `FieldInfo`, e.g.: - - ```python - from typing import Annotated - - import annotated_types - - import pydantic - - class MyModel(pydantic.BaseModel): - foo: Annotated[int, annotated_types.Gt(42)] - bar: Annotated[int, pydantic.Field(gt=42)] - ``` - Args: annotation: An annotation object. Returns: An instance of the field metadata. + + Example: + This is how you can create a field from a bare annotation like this: + + ```python + import pydantic + + class MyModel(pydantic.BaseModel): + foo: int # <-- like this + ``` + + We also account for the case where the annotation can be an instance of `Annotated` and where + one of the (not first) arguments in `Annotated` are an instance of `FieldInfo`, e.g.: + + ```python + import annotated_types + from typing_extensions import Annotated + + import pydantic + + class MyModel(pydantic.BaseModel): + foo: Annotated[int, annotated_types.Gt(42)] + bar: Annotated[int, pydantic.Field(gt=42)] + ``` + """ - try: - inspected_ann = inspect_annotation( - annotation, - annotation_source=_source, - unpack_type_aliases='skip', - ) - except ForbiddenQualifier as e: - raise PydanticForbiddenQualifier(e.qualifier, annotation) + final = False + if _typing_extra.is_finalvar(annotation): + final = True + if annotation is not typing_extensions.Final: + annotation = typing_extensions.get_args(annotation)[0] - # TODO check for classvar and error? + if _typing_extra.is_annotated(annotation): + first_arg, *extra_args = typing_extensions.get_args(annotation) + if _typing_extra.is_finalvar(first_arg): + final = True + field_info_annotations = [a for a in extra_args if isinstance(a, FieldInfo)] + field_info = cls.merge_field_infos(*field_info_annotations, annotation=first_arg) + if field_info: + new_field_info = copy(field_info) + new_field_info.annotation = first_arg + new_field_info.frozen = final or field_info.frozen + metadata: list[Any] = [] + for a in extra_args: + if not isinstance(a, FieldInfo): + metadata.append(a) + else: + metadata.extend(a.metadata) + new_field_info.metadata = metadata + return new_field_info - # No assigned value, this happens when using a bare `Final` qualifier (also for other - # qualifiers, but they shouldn't appear here). In this case we infer the type as `Any` - # because we don't have any assigned value. - type_expr: Any = Any if inspected_ann.type is UNKNOWN else inspected_ann.type - final = 'final' in inspected_ann.qualifiers - metadata = inspected_ann.metadata + return cls(annotation=annotation, frozen=final or None) - attr_overrides = {'annotation': type_expr} - if final: - attr_overrides['frozen'] = True - field_info = FieldInfo._construct(metadata, **attr_overrides) - field_info._qualifiers = inspected_ann.qualifiers - field_info._final = True - return field_info - - @staticmethod - def from_annotated_attribute( - annotation: type[Any], default: Any, *, _source: AnnotationSource = AnnotationSource.ANY - ) -> FieldInfo: + @classmethod + def from_annotated_attribute(cls, annotation: type[Any], default: Any) -> FieldInfo: """Create `FieldInfo` from an annotation with a default value. - This is used in cases like the following: - - ```python - from typing import Annotated - - import annotated_types - - import pydantic - - class MyModel(pydantic.BaseModel): - foo: int = 4 # <-- like this - bar: Annotated[int, annotated_types.Gt(4)] = 4 # <-- or this - spam: Annotated[int, pydantic.Field(gt=4)] = 4 # <-- or this - ``` - Args: annotation: The type annotation of the field. default: The default value of the field. Returns: A field object with the passed values. + + Example: + ```python + import annotated_types + from typing_extensions import Annotated + + import pydantic + + class MyModel(pydantic.BaseModel): + foo: int = 4 # <-- like this + bar: Annotated[int, annotated_types.Gt(4)] = 4 # <-- or this + spam: Annotated[int, pydantic.Field(gt=4)] = 4 # <-- or this + ``` """ - if annotation is not MISSING and annotation is default: - raise PydanticUserError( - 'Error when building FieldInfo from annotated attribute. ' - "Make sure you don't have any field name clashing with a type annotation.", - code='unevaluable-type-annotation', + final = False + if _typing_extra.is_finalvar(annotation): + final = True + if annotation is not typing_extensions.Final: + annotation = typing_extensions.get_args(annotation)[0] + + if isinstance(default, cls): + default.annotation, annotation_metadata = cls._extract_metadata(annotation) + default.metadata += annotation_metadata + default = default.merge_field_infos( + *[x for x in annotation_metadata if isinstance(x, cls)], default, annotation=default.annotation ) - - try: - inspected_ann = inspect_annotation( - annotation, - annotation_source=_source, - unpack_type_aliases='skip', - ) - except ForbiddenQualifier as e: - raise PydanticForbiddenQualifier(e.qualifier, annotation) - - # TODO check for classvar and error? - - # TODO infer from the default, this can be done in v3 once we treat final fields with - # a default as proper fields and not class variables: - type_expr: Any = Any if inspected_ann.type is UNKNOWN else inspected_ann.type - final = 'final' in inspected_ann.qualifiers - metadata = inspected_ann.metadata - - # HACK 1: the order in which the metadata is merged is inconsistent; we need to prepend - # metadata from the assignment at the beginning of the metadata. Changing this is only - # possible in v3 (at least). See https://github.com/pydantic/pydantic/issues/10507 - prepend_metadata: list[Any] | None = None - attr_overrides = {'annotation': type_expr} - if final: - attr_overrides['frozen'] = True - - # HACK 2: FastAPI is subclassing `FieldInfo` and historically expected the actual - # instance's type to be preserved when constructing new models with its subclasses as assignments. - # This code is never reached by Pydantic itself, and in an ideal world this shouldn't be necessary. - if not metadata and isinstance(default, FieldInfo) and type(default) is not FieldInfo: - field_info = default._copy() - field_info._attributes_set.update(attr_overrides) - for k, v in attr_overrides.items(): - setattr(field_info, k, v) - return field_info - - if isinstance(default, FieldInfo): - default_copy = default._copy() # Copy unnecessary when we remove HACK 1. - prepend_metadata = default_copy.metadata - default_copy.metadata = [] - metadata = metadata + [default_copy] + default.frozen = final or default.frozen + return default elif isinstance(default, dataclasses.Field): - from_field = FieldInfo._from_dataclass_field(default) - prepend_metadata = from_field.metadata # Unnecessary when we remove HACK 1. - from_field.metadata = [] - metadata = metadata + [from_field] - if 'init_var' in inspected_ann.qualifiers: - attr_overrides['init_var'] = True - if (init := getattr(default, 'init', None)) is not None: - attr_overrides['init'] = init - if (kw_only := getattr(default, 'kw_only', None)) is not None: - attr_overrides['kw_only'] = kw_only + init_var = False + if annotation is dataclasses.InitVar: + if sys.version_info < (3, 8): + raise RuntimeError('InitVar is not supported in Python 3.7 as type information is lost') + + init_var = True + annotation = Any + elif isinstance(annotation, dataclasses.InitVar): + init_var = True + annotation = annotation.type + pydantic_field = cls._from_dataclass_field(default) + pydantic_field.annotation, annotation_metadata = cls._extract_metadata(annotation) + pydantic_field.metadata += annotation_metadata + pydantic_field = pydantic_field.merge_field_infos( + *[x for x in annotation_metadata if isinstance(x, cls)], + pydantic_field, + annotation=pydantic_field.annotation, + ) + pydantic_field.frozen = final or pydantic_field.frozen + pydantic_field.init_var = init_var + pydantic_field.kw_only = getattr(default, 'kw_only', None) + return pydantic_field else: - # `default` is the actual default value - attr_overrides['default'] = default + if _typing_extra.is_annotated(annotation): + first_arg, *extra_args = typing_extensions.get_args(annotation) + field_infos = [a for a in extra_args if isinstance(a, FieldInfo)] + field_info = cls.merge_field_infos(*field_infos, annotation=first_arg, default=default) + metadata: list[Any] = [] + for a in extra_args: + if not isinstance(a, FieldInfo): + metadata.append(a) + else: + metadata.extend(a.metadata) + field_info.metadata = metadata + return field_info - field_info = FieldInfo._construct( - prepend_metadata + metadata if prepend_metadata is not None else metadata, **attr_overrides - ) - field_info._qualifiers = inspected_ann.qualifiers - field_info._final = True - return field_info - - @classmethod - def _construct(cls, metadata: list[Any], **attr_overrides: Any) -> Self: - """Construct the final `FieldInfo` instance, by merging the possibly existing `FieldInfo` instances from the metadata. - - With the following example: - - ```python {test="skip" lint="skip"} - class Model(BaseModel): - f: Annotated[int, Gt(1), Field(description='desc', lt=2)] - ``` - - `metadata` refers to the metadata elements of the `Annotated` form. This metadata is iterated over from left to right: - - - If the element is a `Field()` function (which is itself a `FieldInfo` instance), the field attributes (such as - `description`) are saved to be set on the final `FieldInfo` instance. - On the other hand, some kwargs (such as `lt`) are stored as `metadata` (see `FieldInfo.__init__()`, calling - `FieldInfo._collect_metadata()`). In this case, the final metadata list is extended with the one from this instance. - - Else, the element is considered as a single metadata object, and is appended to the final metadata list. - - Args: - metadata: The list of metadata elements to merge together. If the `FieldInfo` instance to be constructed is for - a field with an assigned `Field()`, this `Field()` assignment should be added as the last element of the - provided metadata. - **attr_overrides: Extra attributes that should be set on the final merged `FieldInfo` instance. - - Returns: - The final merged `FieldInfo` instance. - """ - merged_metadata: list[Any] = [] - merged_kwargs: dict[str, Any] = {} - - for meta in metadata: - if isinstance(meta, FieldInfo): - merged_metadata.extend(meta.metadata) - - new_js_extra: JsonDict | None = None - current_js_extra = meta.json_schema_extra - if current_js_extra is not None and 'json_schema_extra' in merged_kwargs: - # We need to merge `json_schema_extra`'s: - existing_js_extra = merged_kwargs['json_schema_extra'] - if isinstance(existing_js_extra, dict): - if isinstance(current_js_extra, dict): - new_js_extra = { - **existing_js_extra, - **current_js_extra, - } - elif callable(current_js_extra): - warn( - 'Composing `dict` and `callable` type `json_schema_extra` is not supported. ' - 'The `callable` type is being ignored. ' - "If you'd like support for this behavior, please open an issue on pydantic.", - UserWarning, - ) - elif callable(existing_js_extra) and isinstance(current_js_extra, dict): - warn( - 'Composing `dict` and `callable` type `json_schema_extra` is not supported. ' - 'The `callable` type is being ignored. ' - "If you'd like support for this behavior, please open an issue on pydantic.", - UserWarning, - ) - - # HACK: It is common for users to define "make model partial" (or similar) utilities, that - # convert all model fields to be optional (i.e. have a default value). To do so, they mutate - # each `FieldInfo` instance from `model_fields` to set a `default`, and use `create_model()` - # with `Annotated[ | None, mutated_field_info]`` as an annotation. However, such - # mutations (by doing simple assignments) are only accidentally working, because we also - # need to track attributes explicitly set in `_attributes_set` (relying on default values for - # each attribute is *not* enough, for instance with `Annotated[int, Field(alias='a'), Field(alias=None)]` - # the resulting `FieldInfo` should have `alias=None`). - # To mitigate this, we add a special case when a "final" `FieldInfo` instance (that is an instance coming - # from `model_fields`) is used in annotated metadata (or assignment). In this case, we assume *all* attributes - # were explicitly set, and as such we use all of them (and this will correctly pick up the mutations). - # In theory, this shouldn't really be supported, you are only supposed to use the `Field()` function, not - # a `FieldInfo` instance directly (granted, `Field()` returns a `FieldInfo`, see - # https://github.com/pydantic/pydantic/issues/11122): - if meta._final: - merged_kwargs.update({attr: getattr(meta, attr) for attr in _Attrs}) - else: - merged_kwargs.update(meta._attributes_set) - - if new_js_extra is not None: - merged_kwargs['json_schema_extra'] = new_js_extra - elif typing_objects.is_deprecated(meta): - merged_kwargs['deprecated'] = meta - else: - merged_metadata.append(meta) - - merged_kwargs.update(attr_overrides) - merged_field_info = cls(**merged_kwargs) - merged_field_info.metadata = merged_metadata - return merged_field_info + return cls(annotation=annotation, default=default, frozen=final or None) @staticmethod - @typing_extensions.deprecated( - "The 'merge_field_infos()' method is deprecated and will be removed in a future version. " - 'If you relied on this method, please open an issue in the Pydantic issue tracker.', - category=None, - ) def merge_field_infos(*field_infos: FieldInfo, **overrides: Any) -> FieldInfo: """Merge `FieldInfo` instances keeping only explicitly set attributes. @@ -578,65 +391,33 @@ class FieldInfo(_repr.Representation): Returns: FieldInfo: A merged FieldInfo instance. """ + flattened_field_infos: list[FieldInfo] = [] + for field_info in field_infos: + flattened_field_infos.extend(x for x in field_info.metadata if isinstance(x, FieldInfo)) + flattened_field_infos.append(field_info) + field_infos = tuple(flattened_field_infos) if len(field_infos) == 1: # No merging necessary, but we still need to make a copy and apply the overrides - field_info = field_infos[0]._copy() + field_info = copy(field_infos[0]) field_info._attributes_set.update(overrides) - - default_override = overrides.pop('default', PydanticUndefined) - if default_override is Ellipsis: - default_override = PydanticUndefined - if default_override is not PydanticUndefined: - field_info.default = default_override - for k, v in overrides.items(): setattr(field_info, k, v) return field_info # type: ignore - merged_field_info_kwargs: dict[str, Any] = {} + new_kwargs: dict[str, Any] = {} metadata = {} for field_info in field_infos: - attributes_set = field_info._attributes_set.copy() - - try: - json_schema_extra = attributes_set.pop('json_schema_extra') - existing_json_schema_extra = merged_field_info_kwargs.get('json_schema_extra') - - if existing_json_schema_extra is None: - merged_field_info_kwargs['json_schema_extra'] = json_schema_extra - if isinstance(existing_json_schema_extra, dict): - if isinstance(json_schema_extra, dict): - merged_field_info_kwargs['json_schema_extra'] = { - **existing_json_schema_extra, - **json_schema_extra, - } - if callable(json_schema_extra): - warn( - 'Composing `dict` and `callable` type `json_schema_extra` is not supported.' - 'The `callable` type is being ignored.' - "If you'd like support for this behavior, please open an issue on pydantic.", - PydanticJsonSchemaWarning, - ) - elif callable(json_schema_extra): - # if ever there's a case of a callable, we'll just keep the last json schema extra spec - merged_field_info_kwargs['json_schema_extra'] = json_schema_extra - except KeyError: - pass - - # later FieldInfo instances override everything except json_schema_extra from earlier FieldInfo instances - merged_field_info_kwargs.update(attributes_set) - + new_kwargs.update(field_info._attributes_set) for x in field_info.metadata: if not isinstance(x, FieldInfo): metadata[type(x)] = x - - merged_field_info_kwargs.update(overrides) - field_info = FieldInfo(**merged_field_info_kwargs) + new_kwargs.update(overrides) + field_info = FieldInfo(**new_kwargs) field_info.metadata = list(metadata.values()) return field_info - @staticmethod - def _from_dataclass_field(dc_field: DataclassField[Any]) -> FieldInfo: + @classmethod + def _from_dataclass_field(cls, dc_field: DataclassField[Any]) -> typing_extensions.Self: """Return a new `FieldInfo` instance from a `dataclasses.Field` instance. Args: @@ -650,23 +431,41 @@ class FieldInfo(_repr.Representation): """ default = dc_field.default if default is dataclasses.MISSING: - default = _Unset + default = PydanticUndefined if dc_field.default_factory is dataclasses.MISSING: - default_factory = _Unset + default_factory: typing.Callable[[], Any] | None = None else: default_factory = dc_field.default_factory # use the `Field` function so in correct kwargs raise the correct `TypeError` dc_field_metadata = {k: v for k, v in dc_field.metadata.items() if k in _FIELD_ARG_NAMES} - if sys.version_info >= (3, 14) and dc_field.doc is not None: - dc_field_metadata['description'] = dc_field.doc - return Field(default=default, default_factory=default_factory, repr=dc_field.repr, **dc_field_metadata) # pyright: ignore[reportCallIssue] + return Field(default=default, default_factory=default_factory, repr=dc_field.repr, **dc_field_metadata) - @staticmethod - def _collect_metadata(kwargs: dict[str, Any]) -> list[Any]: + @classmethod + def _extract_metadata(cls, annotation: type[Any] | None) -> tuple[type[Any] | None, list[Any]]: + """Tries to extract metadata/constraints from an annotation if it uses `Annotated`. + + Args: + annotation: The type hint annotation for which metadata has to be extracted. + + Returns: + A tuple containing the extracted metadata type and the list of extra arguments. + """ + if annotation is not None: + if _typing_extra.is_annotated(annotation): + first_arg, *extra_args = typing_extensions.get_args(annotation) + return first_arg, list(extra_args) + + return annotation, [] + + @classmethod + def _collect_metadata(cls, kwargs: dict[str, Any]) -> list[Any]: """Collect annotations from kwargs. + The return type is actually `annotated_types.BaseMetadata | PydanticMetadata`, + but it gets combined with `list[Any]` from `Annotated[T, ...]`, hence types. + Args: kwargs: Keyword arguments passed to the function. @@ -678,7 +477,7 @@ class FieldInfo(_repr.Representation): general_metadata = {} for key, value in list(kwargs.items()): try: - marker = FieldInfo.metadata_lookup[key] + marker = cls.metadata_lookup[key] except KeyError: continue @@ -692,33 +491,7 @@ class FieldInfo(_repr.Representation): metadata.append(_fields.pydantic_general_metadata(**general_metadata)) return metadata - @property - def deprecation_message(self) -> str | None: - """The deprecation message to be emitted, or `None` if not set.""" - if self.deprecated is None: - return None - if isinstance(self.deprecated, bool): - return 'deprecated' if self.deprecated else None - return self.deprecated if isinstance(self.deprecated, str) else self.deprecated.message - - @property - def default_factory_takes_validated_data(self) -> bool | None: - """Whether the provided default factory callable has a validated data parameter. - - Returns `None` if no default factory is set. - """ - if self.default_factory is not None: - return _fields.takes_validated_data_argument(self.default_factory) - - @overload - def get_default( - self, *, call_default_factory: Literal[True], validated_data: dict[str, Any] | None = None - ) -> Any: ... - - @overload - def get_default(self, *, call_default_factory: Literal[False] = ...) -> Any: ... - - def get_default(self, *, call_default_factory: bool = False, validated_data: dict[str, Any] | None = None) -> Any: + def get_default(self, *, call_default_factory: bool = False) -> Any: """Get the default value. We expose an option for whether to call the default_factory (if present), as calling it may @@ -726,8 +499,7 @@ class FieldInfo(_repr.Representation): be called (namely, when instantiating a model via `model_construct`). Args: - call_default_factory: Whether to call the default factory or not. - validated_data: The already validated data to be passed to the default factory. + call_default_factory: Whether to call the default_factory or not. Defaults to `False`. Returns: The default value, calling the default factory if requested or `None` if not set. @@ -735,36 +507,23 @@ class FieldInfo(_repr.Representation): if self.default_factory is None: return _utils.smart_deepcopy(self.default) elif call_default_factory: - if self.default_factory_takes_validated_data: - fac = cast('Callable[[dict[str, Any]], Any]', self.default_factory) - if validated_data is None: - raise ValueError( - "The default factory requires the 'validated_data' argument, which was not provided when calling 'get_default'." - ) - return fac(validated_data) - else: - fac = cast('Callable[[], Any]', self.default_factory) - return fac() + return self.default_factory() else: return None def is_required(self) -> bool: - """Check if the field is required (i.e., does not have a default value or factory). + """Check if the argument is required. Returns: - `True` if the field is required, `False` otherwise. + `True` if the argument is required, `False` otherwise. """ return self.default is PydanticUndefined and self.default_factory is None def rebuild_annotation(self) -> Any: - """Attempts to rebuild the original annotation for use in function signatures. + """Rebuilds the original annotation for use in function signatures. - If metadata is present, it adds it to the original annotation using - `Annotated`. Otherwise, it returns the original annotation as-is. - - Note that because the metadata has been flattened, the original annotation - may not be reconstructed exactly as originally provided, e.g. if the original - type had unrecognized annotations, or was annotated with a call to `pydantic.Field`. + If metadata is present, it adds it to the original annotation using an + `AnnotatedAlias`. Otherwise, it returns the original annotation as is. Returns: The rebuilt annotation. @@ -773,14 +532,9 @@ class FieldInfo(_repr.Representation): return self.annotation else: # Annotated arguments must be a tuple - return Annotated[(self.annotation, *self.metadata)] # type: ignore + return typing_extensions.Annotated[(self.annotation, *self.metadata)] # type: ignore - def apply_typevars_map( - self, - typevars_map: Mapping[TypeVar, Any] | None, - globalns: GlobalsNamespace | None = None, - localns: MappingNamespace | None = None, - ) -> None: + def apply_typevars_map(self, typevars_map: dict[Any, Any] | None, types_namespace: dict[str, Any] | None) -> None: """Apply a `typevars_map` to the annotation. This method is used when analyzing parametrized generic types to replace typevars with their concrete types. @@ -789,64 +543,23 @@ class FieldInfo(_repr.Representation): Args: typevars_map: A dictionary mapping type variables to their concrete types. - globalns: The globals namespace to use during type annotation evaluation. - localns: The locals namespace to use during type annotation evaluation. + types_namespace (dict | None): A dictionary containing related types to the annotated type. See Also: pydantic._internal._generics.replace_types is used for replacing the typevars with their concrete types. """ - annotation = _generics.replace_types(self.annotation, typevars_map) - annotation, evaluated = _typing_extra.try_eval_type(annotation, globalns, localns) - self.annotation = annotation - if not evaluated: - self._complete = False - self._original_annotation = self.annotation - - def asdict(self) -> _FieldInfoAsDict: - """Return a dictionary representation of the `FieldInfo` instance. - - The returned value is a dictionary with three items: - - * `annotation`: The type annotation of the field. - * `metadata`: The metadata list. - * `attributes`: A mapping of the remaining `FieldInfo` attributes to their values (e.g. `alias`, `title`). - """ - return { - 'annotation': self.annotation, - 'metadata': self.metadata, - 'attributes': {attr: getattr(self, attr) for attr in _Attrs}, - } - - def _copy(self) -> Self: - """Return a copy of the `FieldInfo` instance.""" - # Note: we can't define a custom `__copy__()`, as `FieldInfo` is being subclassed - # by some third-party libraries with extra attributes defined (and as `FieldInfo` - # is slotted, we can't make a copy of the `__dict__`). - copied = copy(self) - for attr_name in ('metadata', '_attributes_set', '_qualifiers'): - # Apply "deep-copy" behavior on collections attributes: - value = getattr(copied, attr_name).copy() - setattr(copied, attr_name, value) - - return copied + annotation = _typing_extra.eval_type_lenient(self.annotation, types_namespace, None) + self.annotation = _generics.replace_types(annotation, typevars_map) def __repr_args__(self) -> ReprArgs: yield 'annotation', _repr.PlainRepr(_repr.display_as_type(self.annotation)) yield 'required', self.is_required() for s in self.__slots__: - # TODO: properly make use of the protocol (https://rich.readthedocs.io/en/stable/pretty.html#rich-repr-protocol) - # By yielding a three-tuple: - if s in ( - 'annotation', - '_attributes_set', - '_qualifiers', - '_complete', - '_original_assignment', - '_original_annotation', - '_final', - ): + if s == '_attributes_set': + continue + if s == 'annotation': continue elif s == 'metadata' and not self.metadata: continue @@ -858,9 +571,7 @@ class FieldInfo(_repr.Representation): continue if s == 'serialization_alias' and self.serialization_alias == self.alias: continue - if s == 'default' and self.default is not PydanticUndefined: - yield 'default', self.default - elif s == 'default_factory' and self.default_factory is not None: + if s == 'default_factory' and self.default_factory is not None: yield 'default_factory', _repr.PlainRepr(_repr.display_as_type(self.default_factory)) else: value = getattr(self, s) @@ -868,333 +579,122 @@ class FieldInfo(_repr.Representation): yield s, value -class _EmptyKwargs(TypedDict): +@dataclasses.dataclass(**_internal_dataclass.slots_true) +class AliasPath: + """Usage docs: https://docs.pydantic.dev/2.5/concepts/fields#aliaspath-and-aliaschoices + + A data class used by `validation_alias` as a convenience to create aliases. + + Attributes: + path: A list of string or integer aliases. + """ + + path: list[int | str] + + def __init__(self, first_arg: str, *args: str | int) -> None: + self.path = [first_arg] + list(args) + + def convert_to_aliases(self) -> list[str | int]: + """Converts arguments to a list of string or integer aliases. + + Returns: + The list of aliases. + """ + return self.path + + +@dataclasses.dataclass(**_internal_dataclass.slots_true) +class AliasChoices: + """Usage docs: https://docs.pydantic.dev/2.5/concepts/fields#aliaspath-and-aliaschoices + + A data class used by `validation_alias` as a convenience to create aliases. + + Attributes: + choices: A list containing a string or `AliasPath`. + """ + + choices: list[str | AliasPath] + + def __init__(self, first_choice: str | AliasPath, *choices: str | AliasPath) -> None: + self.choices = [first_choice] + list(choices) + + def convert_to_aliases(self) -> list[list[str | int]]: + """Converts arguments to a list of lists containing string or integer aliases. + + Returns: + The list of aliases. + """ + aliases: list[list[str | int]] = [] + for c in self.choices: + if isinstance(c, AliasPath): + aliases.append(c.convert_to_aliases()) + else: + aliases.append([c]) + return aliases + + +class _EmptyKwargs(typing_extensions.TypedDict): """This class exists solely to ensure that type checking warns about passing `**extra` in `Field`.""" -_Attrs = { - 'default': ..., - 'default_factory': None, - 'alias': None, - 'alias_priority': None, - 'validation_alias': None, - 'serialization_alias': None, - 'title': None, - 'field_title_generator': None, - 'description': None, - 'examples': None, - 'exclude': None, - 'exclude_if': None, - 'discriminator': None, - 'deprecated': None, - 'json_schema_extra': None, - 'frozen': None, - 'validate_default': None, - 'repr': True, - 'init': None, - 'init_var': None, - 'kw_only': None, -} - -_DefaultValues = { - **_Attrs, - 'kw_only': None, - 'pattern': None, - 'strict': None, - 'gt': None, - 'ge': None, - 'lt': None, - 'le': None, - 'multiple_of': None, - 'allow_inf_nan': None, - 'max_digits': None, - 'decimal_places': None, - 'min_length': None, - 'max_length': None, - 'coerce_numbers_to_str': None, -} +_DefaultValues = dict( + default=..., + default_factory=None, + alias=None, + alias_priority=None, + validation_alias=None, + serialization_alias=None, + title=None, + description=None, + examples=None, + exclude=None, + discriminator=None, + json_schema_extra=None, + frozen=None, + validate_default=None, + repr=True, + init_var=None, + kw_only=None, + pattern=None, + strict=None, + gt=None, + ge=None, + lt=None, + le=None, + multiple_of=None, + allow_inf_nan=None, + max_digits=None, + decimal_places=None, + min_length=None, + max_length=None, +) -_T = TypeVar('_T') - - -# NOTE: Actual return type is 'FieldInfo', but we want to help type checkers -# to understand the magic that happens at runtime with the following overloads: -@overload # type hint the return value as `Any` to avoid type checking regressions when using `...`. -def Field( - default: ellipsis, # noqa: F821 # TODO: use `_typing_extra.EllipsisType` when we drop Py3.9 - *, - alias: str | None = _Unset, - alias_priority: int | None = _Unset, - validation_alias: str | AliasPath | AliasChoices | None = _Unset, - serialization_alias: str | None = _Unset, - title: str | None = _Unset, - field_title_generator: Callable[[str, FieldInfo], str] | None = _Unset, - description: str | None = _Unset, - examples: list[Any] | None = _Unset, - exclude: bool | None = _Unset, - exclude_if: Callable[[Any], bool] | None = _Unset, - discriminator: str | types.Discriminator | None = _Unset, - deprecated: Deprecated | str | bool | None = _Unset, - json_schema_extra: JsonDict | Callable[[JsonDict], None] | None = _Unset, - frozen: bool | None = _Unset, - validate_default: bool | None = _Unset, - repr: bool = _Unset, - init: bool | None = _Unset, - init_var: bool | None = _Unset, - kw_only: bool | None = _Unset, - pattern: str | re.Pattern[str] | None = _Unset, - strict: bool | None = _Unset, - coerce_numbers_to_str: bool | None = _Unset, - gt: annotated_types.SupportsGt | None = _Unset, - ge: annotated_types.SupportsGe | None = _Unset, - lt: annotated_types.SupportsLt | None = _Unset, - le: annotated_types.SupportsLe | None = _Unset, - multiple_of: float | None = _Unset, - allow_inf_nan: bool | None = _Unset, - max_digits: int | None = _Unset, - decimal_places: int | None = _Unset, - min_length: int | None = _Unset, - max_length: int | None = _Unset, - union_mode: Literal['smart', 'left_to_right'] = _Unset, - fail_fast: bool | None = _Unset, - **extra: Unpack[_EmptyKwargs], -) -> Any: ... -@overload # `default` argument set, validate_default=True (no type checking on the default value) -def Field( - default: Any, - *, - alias: str | None = _Unset, - alias_priority: int | None = _Unset, - validation_alias: str | AliasPath | AliasChoices | None = _Unset, - serialization_alias: str | None = _Unset, - title: str | None = _Unset, - field_title_generator: Callable[[str, FieldInfo], str] | None = _Unset, - description: str | None = _Unset, - examples: list[Any] | None = _Unset, - exclude: bool | None = _Unset, - exclude_if: Callable[[Any], bool] | None = _Unset, - discriminator: str | types.Discriminator | None = _Unset, - deprecated: Deprecated | str | bool | None = _Unset, - json_schema_extra: JsonDict | Callable[[JsonDict], None] | None = _Unset, - frozen: bool | None = _Unset, - validate_default: Literal[True], - repr: bool = _Unset, - init: bool | None = _Unset, - init_var: bool | None = _Unset, - kw_only: bool | None = _Unset, - pattern: str | re.Pattern[str] | None = _Unset, - strict: bool | None = _Unset, - coerce_numbers_to_str: bool | None = _Unset, - gt: annotated_types.SupportsGt | None = _Unset, - ge: annotated_types.SupportsGe | None = _Unset, - lt: annotated_types.SupportsLt | None = _Unset, - le: annotated_types.SupportsLe | None = _Unset, - multiple_of: float | None = _Unset, - allow_inf_nan: bool | None = _Unset, - max_digits: int | None = _Unset, - decimal_places: int | None = _Unset, - min_length: int | None = _Unset, - max_length: int | None = _Unset, - union_mode: Literal['smart', 'left_to_right'] = _Unset, - fail_fast: bool | None = _Unset, - **extra: Unpack[_EmptyKwargs], -) -> Any: ... -@overload # `default` argument set, validate_default=False or unset -def Field( - default: _T, - *, - alias: str | None = _Unset, - alias_priority: int | None = _Unset, - validation_alias: str | AliasPath | AliasChoices | None = _Unset, - serialization_alias: str | None = _Unset, - title: str | None = _Unset, - field_title_generator: Callable[[str, FieldInfo], str] | None = _Unset, - description: str | None = _Unset, - examples: list[Any] | None = _Unset, - exclude: bool | None = _Unset, - # NOTE: to get proper type checking on `exclude_if`'s argument, we could use `_T` instead of `Any`. However, - # this requires (at least for pyright) adding an additional overload where `exclude_if` is required (otherwise - # `a: int = Field(default_factory=str)` results in a false negative). - exclude_if: Callable[[Any], bool] | None = _Unset, - discriminator: str | types.Discriminator | None = _Unset, - deprecated: Deprecated | str | bool | None = _Unset, - json_schema_extra: JsonDict | Callable[[JsonDict], None] | None = _Unset, - frozen: bool | None = _Unset, - validate_default: Literal[False] = ..., - repr: bool = _Unset, - init: bool | None = _Unset, - init_var: bool | None = _Unset, - kw_only: bool | None = _Unset, - pattern: str | re.Pattern[str] | None = _Unset, - strict: bool | None = _Unset, - coerce_numbers_to_str: bool | None = _Unset, - gt: annotated_types.SupportsGt | None = _Unset, - ge: annotated_types.SupportsGe | None = _Unset, - lt: annotated_types.SupportsLt | None = _Unset, - le: annotated_types.SupportsLe | None = _Unset, - multiple_of: float | None = _Unset, - allow_inf_nan: bool | None = _Unset, - max_digits: int | None = _Unset, - decimal_places: int | None = _Unset, - min_length: int | None = _Unset, - max_length: int | None = _Unset, - union_mode: Literal['smart', 'left_to_right'] = _Unset, - fail_fast: bool | None = _Unset, - **extra: Unpack[_EmptyKwargs], -) -> _T: ... -@overload # `default_factory` argument set, validate_default=True (no type checking on the default value) -def Field( # pyright: ignore[reportOverlappingOverload] - *, - default_factory: Callable[[], Any] | Callable[[dict[str, Any]], Any], - alias: str | None = _Unset, - alias_priority: int | None = _Unset, - validation_alias: str | AliasPath | AliasChoices | None = _Unset, - serialization_alias: str | None = _Unset, - title: str | None = _Unset, - field_title_generator: Callable[[str, FieldInfo], str] | None = _Unset, - description: str | None = _Unset, - examples: list[Any] | None = _Unset, - exclude: bool | None = _Unset, - exclude_if: Callable[[Any], bool] | None = _Unset, - discriminator: str | types.Discriminator | None = _Unset, - deprecated: Deprecated | str | bool | None = _Unset, - json_schema_extra: JsonDict | Callable[[JsonDict], None] | None = _Unset, - frozen: bool | None = _Unset, - validate_default: Literal[True], - repr: bool = _Unset, - init: bool | None = _Unset, - init_var: bool | None = _Unset, - kw_only: bool | None = _Unset, - pattern: str | re.Pattern[str] | None = _Unset, - strict: bool | None = _Unset, - coerce_numbers_to_str: bool | None = _Unset, - gt: annotated_types.SupportsGt | None = _Unset, - ge: annotated_types.SupportsGe | None = _Unset, - lt: annotated_types.SupportsLt | None = _Unset, - le: annotated_types.SupportsLe | None = _Unset, - multiple_of: float | None = _Unset, - allow_inf_nan: bool | None = _Unset, - max_digits: int | None = _Unset, - decimal_places: int | None = _Unset, - min_length: int | None = _Unset, - max_length: int | None = _Unset, - union_mode: Literal['smart', 'left_to_right'] = _Unset, - fail_fast: bool | None = _Unset, - **extra: Unpack[_EmptyKwargs], -) -> Any: ... -@overload # `default_factory` argument set, validate_default=False or unset -def Field( - *, - default_factory: Callable[[], _T] | Callable[[dict[str, Any]], _T], - alias: str | None = _Unset, - alias_priority: int | None = _Unset, - validation_alias: str | AliasPath | AliasChoices | None = _Unset, - serialization_alias: str | None = _Unset, - title: str | None = _Unset, - field_title_generator: Callable[[str, FieldInfo], str] | None = _Unset, - description: str | None = _Unset, - examples: list[Any] | None = _Unset, - exclude: bool | None = _Unset, - # NOTE: to get proper type checking on `exclude_if`'s argument, we could use `_T` instead of `Any`. However, - # this requires (at least for pyright) adding an additional overload where `exclude_if` is required (otherwise - # `a: int = Field(default_factory=str)` results in a false negative). - exclude_if: Callable[[Any], bool] | None = _Unset, - discriminator: str | types.Discriminator | None = _Unset, - deprecated: Deprecated | str | bool | None = _Unset, - json_schema_extra: JsonDict | Callable[[JsonDict], None] | None = _Unset, - frozen: bool | None = _Unset, - validate_default: Literal[False] | None = _Unset, - repr: bool = _Unset, - init: bool | None = _Unset, - init_var: bool | None = _Unset, - kw_only: bool | None = _Unset, - pattern: str | re.Pattern[str] | None = _Unset, - strict: bool | None = _Unset, - coerce_numbers_to_str: bool | None = _Unset, - gt: annotated_types.SupportsGt | None = _Unset, - ge: annotated_types.SupportsGe | None = _Unset, - lt: annotated_types.SupportsLt | None = _Unset, - le: annotated_types.SupportsLe | None = _Unset, - multiple_of: float | None = _Unset, - allow_inf_nan: bool | None = _Unset, - max_digits: int | None = _Unset, - decimal_places: int | None = _Unset, - min_length: int | None = _Unset, - max_length: int | None = _Unset, - union_mode: Literal['smart', 'left_to_right'] = _Unset, - fail_fast: bool | None = _Unset, - **extra: Unpack[_EmptyKwargs], -) -> _T: ... -@overload -def Field( # No default set - *, - alias: str | None = _Unset, - alias_priority: int | None = _Unset, - validation_alias: str | AliasPath | AliasChoices | None = _Unset, - serialization_alias: str | None = _Unset, - title: str | None = _Unset, - field_title_generator: Callable[[str, FieldInfo], str] | None = _Unset, - description: str | None = _Unset, - examples: list[Any] | None = _Unset, - exclude: bool | None = _Unset, - exclude_if: Callable[[Any], bool] | None = _Unset, - discriminator: str | types.Discriminator | None = _Unset, - deprecated: Deprecated | str | bool | None = _Unset, - json_schema_extra: JsonDict | Callable[[JsonDict], None] | None = _Unset, - frozen: bool | None = _Unset, - validate_default: bool | None = _Unset, - repr: bool = _Unset, - init: bool | None = _Unset, - init_var: bool | None = _Unset, - kw_only: bool | None = _Unset, - pattern: str | re.Pattern[str] | None = _Unset, - strict: bool | None = _Unset, - coerce_numbers_to_str: bool | None = _Unset, - gt: annotated_types.SupportsGt | None = _Unset, - ge: annotated_types.SupportsGe | None = _Unset, - lt: annotated_types.SupportsLt | None = _Unset, - le: annotated_types.SupportsLe | None = _Unset, - multiple_of: float | None = _Unset, - allow_inf_nan: bool | None = _Unset, - max_digits: int | None = _Unset, - decimal_places: int | None = _Unset, - min_length: int | None = _Unset, - max_length: int | None = _Unset, - union_mode: Literal['smart', 'left_to_right'] = _Unset, - fail_fast: bool | None = _Unset, - **extra: Unpack[_EmptyKwargs], -) -> Any: ... def Field( # noqa: C901 default: Any = PydanticUndefined, *, - default_factory: Callable[[], Any] | Callable[[dict[str, Any]], Any] | None = _Unset, + default_factory: typing.Callable[[], Any] | None = _Unset, alias: str | None = _Unset, alias_priority: int | None = _Unset, validation_alias: str | AliasPath | AliasChoices | None = _Unset, serialization_alias: str | None = _Unset, title: str | None = _Unset, - field_title_generator: Callable[[str, FieldInfo], str] | None = _Unset, description: str | None = _Unset, examples: list[Any] | None = _Unset, exclude: bool | None = _Unset, - exclude_if: Callable[[Any], bool] | None = _Unset, discriminator: str | types.Discriminator | None = _Unset, - deprecated: Deprecated | str | bool | None = _Unset, - json_schema_extra: JsonDict | Callable[[JsonDict], None] | None = _Unset, + json_schema_extra: JsonDict | typing.Callable[[JsonDict], None] | None = _Unset, frozen: bool | None = _Unset, validate_default: bool | None = _Unset, repr: bool = _Unset, - init: bool | None = _Unset, init_var: bool | None = _Unset, kw_only: bool | None = _Unset, - pattern: str | re.Pattern[str] | None = _Unset, + pattern: str | None = _Unset, strict: bool | None = _Unset, - coerce_numbers_to_str: bool | None = _Unset, - gt: annotated_types.SupportsGt | None = _Unset, - ge: annotated_types.SupportsGe | None = _Unset, - lt: annotated_types.SupportsLt | None = _Unset, - le: annotated_types.SupportsLe | None = _Unset, + gt: float | None = _Unset, + ge: float | None = _Unset, + lt: float | None = _Unset, + le: float | None = _Unset, multiple_of: float | None = _Unset, allow_inf_nan: bool | None = _Unset, max_digits: int | None = _Unset, @@ -1202,11 +702,9 @@ def Field( # noqa: C901 min_length: int | None = _Unset, max_length: int | None = _Unset, union_mode: Literal['smart', 'left_to_right'] = _Unset, - fail_fast: bool | None = _Unset, **extra: Unpack[_EmptyKwargs], ) -> Any: - """!!! abstract "Usage Documentation" - [Fields](../concepts/fields.md) + """Usage docs: https://docs.pydantic.dev/2.5/concepts/fields Create a field for objects that can be configured. @@ -1218,34 +716,24 @@ def Field( # noqa: C901 Args: default: Default value if the field is not set. - default_factory: A callable to generate the default value. The callable can either take 0 arguments - (in which case it is called as is) or a single argument containing the already validated data. - alias: The name to use for the attribute when validating or serializing by alias. - This is often used for things like converting between snake and camel case. + default_factory: A callable to generate the default value, such as :func:`~datetime.utcnow`. + alias: An alternative name for the attribute. alias_priority: Priority of the alias. This affects whether an alias generator is used. - validation_alias: Like `alias`, but only affects validation, not serialization. - serialization_alias: Like `alias`, but only affects serialization, not validation. + validation_alias: 'Whitelist' validation step. The field will be the single one allowed by the alias or set of + aliases defined. + serialization_alias: 'Blacklist' validation step. The vanilla field will be the single one of the alias' or set + of aliases' fields and all the other fields will be ignored at serialization time. title: Human-readable title. - field_title_generator: A callable that takes a field name and returns title for it. description: Human-readable description. examples: Example values for this field. exclude: Whether to exclude the field from the model serialization. - exclude_if: A callable that determines whether to exclude a field during serialization based on its value. discriminator: Field name or Discriminator for discriminating the type in a tagged union. - deprecated: A deprecation message, an instance of `warnings.deprecated` or the `typing_extensions.deprecated` backport, - or a boolean. If `True`, a default deprecation message will be emitted when accessing the field. - json_schema_extra: A dict or callable to provide extra JSON schema properties. - frozen: Whether the field is frozen. If true, attempts to change the value on an instance will raise an error. - validate_default: If `True`, apply validation to the default value every time you create an instance. - Otherwise, for performance reasons, the default value of the field is trusted and not validated. + json_schema_extra: Any additional JSON schema data for the schema property. + frozen: Whether the field is frozen. + validate_default: Run validation that isn't only checking existence of defaults. This can be set to `True` or `False`. If not set, it defaults to `None`. repr: A boolean indicating whether to include the field in the `__repr__` output. - init: Whether the field should be included in the constructor of the dataclass. - (Only applies to dataclasses.) - init_var: Whether the field should _only_ be included in the constructor of the dataclass. - (Only applies to dataclasses.) + init_var: Whether the field should be included in the constructor of the dataclass. kw_only: Whether the field should be a keyword-only argument in the constructor of the dataclass. - (Only applies to dataclasses.) - coerce_numbers_to_str: Whether to enable coercion of any `Number` type to `str` (not applicable in `strict` mode). strict: If `True`, strict validation is applied to the field. See [Strict Mode](../concepts/strict_mode.md) for details. gt: Greater than. If set, value must be greater than this. Only applicable to numbers. @@ -1253,24 +741,22 @@ def Field( # noqa: C901 lt: Less than. If set, value must be less than this. Only applicable to numbers. le: Less than or equal. If set, value must be less than or equal to this. Only applicable to numbers. multiple_of: Value must be a multiple of this. Only applicable to numbers. - min_length: Minimum length for iterables. - max_length: Maximum length for iterables. - pattern: Pattern for strings (a regular expression). - allow_inf_nan: Allow `inf`, `-inf`, `nan`. Only applicable to float and [`Decimal`][decimal.Decimal] numbers. + min_length: Minimum length for strings. + max_length: Maximum length for strings. + pattern: Pattern for strings. + allow_inf_nan: Allow `inf`, `-inf`, `nan`. Only applicable to numbers. max_digits: Maximum number of allow digits for strings. decimal_places: Maximum number of decimal places allowed for numbers. union_mode: The strategy to apply when validating a union. Can be `smart` (the default), or `left_to_right`. - See [Union Mode](../concepts/unions.md#union-modes) for details. - fail_fast: If `True`, validation will stop on the first error. If `False`, all validation errors will be collected. - This option can be applied only to iterable types (list, tuple, set, and frozenset). - extra: (Deprecated) Extra fields that will be included in the JSON schema. + See [Union Mode](standard_library_types.md#union-mode) for details. + extra: Include extra fields used by the JSON schema. !!! warning Deprecated The `extra` kwargs is deprecated. Use `json_schema_extra` instead. Returns: - A new [`FieldInfo`][pydantic.fields.FieldInfo]. The return annotation is `Any` so `Field` can be used on - type-annotated fields without causing a type error. + A new [`FieldInfo`][pydantic.fields.FieldInfo], the return annotation is `Any` so `Field` can be used on + type annotated fields without causing a typing error. """ # Check deprecated and removed params from V1. This logic should eventually be removed. const = extra.pop('const', None) # type: ignore @@ -1279,21 +765,13 @@ def Field( # noqa: C901 min_items = extra.pop('min_items', None) # type: ignore if min_items is not None: - warn( - '`min_items` is deprecated and will be removed, use `min_length` instead', - PydanticDeprecatedSince20, - stacklevel=2, - ) + warn('`min_items` is deprecated and will be removed, use `min_length` instead', DeprecationWarning) if min_length in (None, _Unset): min_length = min_items # type: ignore max_items = extra.pop('max_items', None) # type: ignore if max_items is not None: - warn( - '`max_items` is deprecated and will be removed, use `max_length` instead', - PydanticDeprecatedSince20, - stacklevel=2, - ) + warn('`max_items` is deprecated and will be removed, use `max_length` instead', DeprecationWarning) if max_length in (None, _Unset): max_length = max_items # type: ignore @@ -1309,11 +787,7 @@ def Field( # noqa: C901 allow_mutation = extra.pop('allow_mutation', None) # type: ignore if allow_mutation is not None: - warn( - '`allow_mutation` is deprecated and will be removed. use `frozen` instead', - PydanticDeprecatedSince20, - stacklevel=2, - ) + warn('`allow_mutation` is deprecated and will be removed. use `frozen` instead', DeprecationWarning) if allow_mutation is False: frozen = True @@ -1326,8 +800,7 @@ def Field( # noqa: C901 'Using extra keyword arguments on `Field` is deprecated and will be removed.' ' Use `json_schema_extra` instead.' f' (Extra keys: {", ".join(k.__repr__() for k in extra.keys())})', - PydanticDeprecatedSince20, - stacklevel=2, + DeprecationWarning, ) if not json_schema_extra or json_schema_extra is _Unset: json_schema_extra = extra # type: ignore @@ -1347,11 +820,7 @@ def Field( # noqa: C901 include = extra.pop('include', None) # type: ignore if include is not None: - warn( - '`include` is deprecated and does nothing. It will be removed, use `exclude` instead', - PydanticDeprecatedSince20, - stacklevel=2, - ) + warn('`include` is deprecated and does nothing. It will be removed, use `exclude` instead', DeprecationWarning) return FieldInfo.from_field( default, @@ -1361,22 +830,17 @@ def Field( # noqa: C901 validation_alias=validation_alias, serialization_alias=serialization_alias, title=title, - field_title_generator=field_title_generator, description=description, examples=examples, exclude=exclude, - exclude_if=exclude_if, discriminator=discriminator, - deprecated=deprecated, json_schema_extra=json_schema_extra, frozen=frozen, pattern=pattern, validate_default=validate_default, repr=repr, - init=init, init_var=init_var, kw_only=kw_only, - coerce_numbers_to_str=coerce_numbers_to_str, strict=strict, gt=gt, ge=ge, @@ -1389,7 +853,6 @@ def Field( # noqa: C901 max_digits=max_digits, decimal_places=decimal_places, union_mode=union_mode, - fail_fast=fail_fast, ) @@ -1400,26 +863,21 @@ _FIELD_ARG_NAMES.remove('extra') # do not include the varkwargs parameter class ModelPrivateAttr(_repr.Representation): """A descriptor for private attributes in class models. - !!! warning - You generally shouldn't be creating `ModelPrivateAttr` instances directly, instead use - `pydantic.fields.PrivateAttr`. (This is similar to `FieldInfo` vs. `Field`.) - Attributes: default: The default value of the attribute if not provided. default_factory: A callable function that generates the default value of the attribute if not provided. """ - __slots__ = ('default', 'default_factory') + __slots__ = 'default', 'default_factory' - def __init__(self, default: Any = PydanticUndefined, *, default_factory: Callable[[], Any] | None = None) -> None: - if default is Ellipsis: - self.default = PydanticUndefined - else: - self.default = default + def __init__( + self, default: Any = PydanticUndefined, *, default_factory: typing.Callable[[], Any] | None = None + ) -> None: + self.default = default self.default_factory = default_factory - if not TYPE_CHECKING: + if not typing.TYPE_CHECKING: # We put `__getattr__` in a non-TYPE_CHECKING block because otherwise, mypy allows arbitrary attribute access def __getattr__(self, item: str) -> Any: @@ -1433,10 +891,11 @@ class ModelPrivateAttr(_repr.Representation): def __set_name__(self, cls: type[Any], name: str) -> None: """Preserve `__set_name__` protocol defined in https://peps.python.org/pep-0487.""" - default = self.default - if default is PydanticUndefined: + if self.default is PydanticUndefined: return - set_name = getattr(default, '__set_name__', None) + if not hasattr(self.default, '__set_name__'): + return + set_name = self.default.__set_name__ if callable(set_name): set_name(cls, name) @@ -1459,37 +918,14 @@ class ModelPrivateAttr(_repr.Representation): ) -# NOTE: Actual return type is 'ModelPrivateAttr', but we want to help type checkers -# to understand the magic that happens at runtime. -@overload # `default` argument set -def PrivateAttr( - default: _T, - *, - init: Literal[False] = False, -) -> _T: ... -@overload # `default_factory` argument set -def PrivateAttr( - *, - default_factory: Callable[[], _T], - init: Literal[False] = False, -) -> _T: ... -@overload # No default set -def PrivateAttr( - *, - init: Literal[False] = False, -) -> Any: ... def PrivateAttr( default: Any = PydanticUndefined, *, - default_factory: Callable[[], Any] | None = None, - init: Literal[False] = False, + default_factory: typing.Callable[[], Any] | None = None, ) -> Any: - """!!! abstract "Usage Documentation" - [Private Model Attributes](../concepts/models.md#private-model-attributes) + """Indicates that attribute is only used internally and never mixed with regular fields. - Indicates that an attribute is intended for private use and not handled during normal validation/serialization. - - Private attributes are not validated by Pydantic, so it's up to you to ensure they are used in a type-safe manner. + Private attributes are not checked by Pydantic, so it's up to you to maintain their accuracy. Private attributes are stored in `__private_attributes__` on the model. @@ -1498,7 +934,6 @@ def PrivateAttr( default_factory: Callable that will be called when a default value is needed for this attribute. If both `default` and `default_factory` are set, an error will be raised. - init: Whether the attribute should be included in the constructor of the dataclass. Always `False`. Returns: An instance of [`ModelPrivateAttr`][pydantic.fields.ModelPrivateAttr] class. @@ -1523,16 +958,13 @@ class ComputedFieldInfo: decorator_repr: A class variable representing the decorator string, '@computed_field'. wrapped_property: The wrapped computed field property. return_type: The type of the computed field property's return value. - alias: The alias of the property to be used during serialization. - alias_priority: The priority of the alias. This affects whether an alias generator is used. - title: Title of the computed field to include in the serialization JSON schema. - field_title_generator: A callable that takes a field name and returns title for it. - description: Description of the computed field to include in the serialization JSON schema. - deprecated: A deprecation message, an instance of `warnings.deprecated` or the `typing_extensions.deprecated` backport, - or a boolean. If `True`, a default deprecation message will be emitted when accessing the field. - examples: Example values of the computed field to include in the serialization JSON schema. - json_schema_extra: A dict or callable to provide extra JSON schema properties. - repr: A boolean indicating whether to include the field in the __repr__ output. + alias: The alias of the property to be used during encoding and decoding. + alias_priority: priority of the alias. This affects whether an alias generator is used + title: Title of the computed field as in OpenAPI document, should be a short summary. + description: Description of the computed field as in OpenAPI document. + examples: Example values of the computed field as in OpenAPI document. + json_schema_extra: Dictionary of extra JSON schema properties. + repr: A boolean indicating whether or not to include the field in the __repr__ output. """ decorator_repr: ClassVar[str] = '@computed_field' @@ -1541,60 +973,35 @@ class ComputedFieldInfo: alias: str | None alias_priority: int | None title: str | None - field_title_generator: Callable[[str, ComputedFieldInfo], str] | None description: str | None - deprecated: Deprecated | str | bool | None examples: list[Any] | None - json_schema_extra: JsonDict | Callable[[JsonDict], None] | None + json_schema_extra: JsonDict | typing.Callable[[JsonDict], None] | None repr: bool - @property - def deprecation_message(self) -> str | None: - """The deprecation message to be emitted, or `None` if not set.""" - if self.deprecated is None: - return None - if isinstance(self.deprecated, bool): - return 'deprecated' if self.deprecated else None - return self.deprecated if isinstance(self.deprecated, str) else self.deprecated.message - def _update_from_config(self, config_wrapper: ConfigWrapper, name: str) -> None: - """Update the instance from the configuration set on the class this computed field belongs to.""" - title_generator = self.field_title_generator or config_wrapper.field_title_generator - if title_generator is not None and self.title is None: - self.title = title_generator(name, self) - if config_wrapper.alias_generator is not None: - self._apply_alias_generator(config_wrapper.alias_generator, name) +# this should really be `property[T], cached_proprety[T]` but property is not generic unlike cached_property +# See https://github.com/python/typing/issues/985 and linked issues +PropertyT = typing.TypeVar('PropertyT') - def _apply_alias_generator(self, alias_generator: Callable[[str], str] | AliasGenerator, name: str) -> None: - """Apply an alias generator to aliases if appropriate. - Args: - alias_generator: A callable that takes a string and returns a string, or an `AliasGenerator` instance. - name: The name of the computed field from which to generate the alias. - """ - # Apply an alias_generator if - # 1. An alias is not specified - # 2. An alias is specified, but the priority is <= 1 +@typing.overload +def computed_field( + *, + alias: str | None = None, + alias_priority: int | None = None, + title: str | None = None, + description: str | None = None, + examples: list[Any] | None = None, + json_schema_extra: JsonDict | typing.Callable[[JsonDict], None] | None = None, + repr: bool = True, + return_type: Any = PydanticUndefined, +) -> typing.Callable[[PropertyT], PropertyT]: + ... - if self.alias_priority is None or self.alias_priority <= 1 or self.alias is None: - alias, _, serialization_alias = None, None, None - if isinstance(alias_generator, AliasGenerator): - alias, _, serialization_alias = alias_generator.generate_aliases(name) - elif callable(alias_generator): - alias = alias_generator(name) - - # if priority is not set, we set to 1 - # which supports the case where the alias_generator from a child class is used - # to generate an alias for a field in a parent class - if self.alias_priority is None or self.alias_priority <= 1: - self.alias_priority = 1 - - # if the priority is 1, then we set the aliases to the generated alias - # note that we use the serialization_alias with priority over alias, as computed_field - # aliases are used for serialization only (not validation) - if self.alias_priority == 1: - self.alias = _utils.get_first_not_none(serialization_alias, alias) +@typing.overload +def computed_field(__func: PropertyT) -> PropertyT: + ... def _wrapped_property_is_private(property_: cached_property | property) -> bool: # type: ignore @@ -1609,54 +1016,23 @@ def _wrapped_property_is_private(property_: cached_property | property) -> bool: return wrapped_name.startswith('_') and not wrapped_name.startswith('__') -# this should really be `property[T], cached_property[T]` but property is not generic unlike cached_property -# See https://github.com/python/typing/issues/985 and linked issues -PropertyT = TypeVar('PropertyT') - - -@overload -def computed_field(func: PropertyT, /) -> PropertyT: ... - - -@overload def computed_field( + __f: PropertyT | None = None, *, alias: str | None = None, alias_priority: int | None = None, title: str | None = None, - field_title_generator: Callable[[str, ComputedFieldInfo], str] | None = None, description: str | None = None, - deprecated: Deprecated | str | bool | None = None, examples: list[Any] | None = None, - json_schema_extra: JsonDict | Callable[[JsonDict], None] | None = None, - repr: bool = True, - return_type: Any = PydanticUndefined, -) -> Callable[[PropertyT], PropertyT]: ... - - -def computed_field( - func: PropertyT | None = None, - /, - *, - alias: str | None = None, - alias_priority: int | None = None, - title: str | None = None, - field_title_generator: Callable[[str, ComputedFieldInfo], str] | None = None, - description: str | None = None, - deprecated: Deprecated | str | bool | None = None, - examples: list[Any] | None = None, - json_schema_extra: JsonDict | Callable[[JsonDict], None] | None = None, + json_schema_extra: JsonDict | typing.Callable[[JsonDict], None] | None = None, repr: bool | None = None, return_type: Any = PydanticUndefined, -) -> PropertyT | Callable[[PropertyT], PropertyT]: - """!!! abstract "Usage Documentation" - [The `computed_field` decorator](../concepts/fields.md#the-computed_field-decorator) - - Decorator to include `property` and `cached_property` when serializing models or dataclasses. +) -> PropertyT | typing.Callable[[PropertyT], PropertyT]: + """Decorator to include `property` and `cached_property` when serializing models or dataclasses. This is useful for fields that are computed from other fields, or for fields that are expensive to compute and should be cached. - ```python + ```py from pydantic import BaseModel, computed_field class Rectangle(BaseModel): @@ -1680,11 +1056,11 @@ def computed_field( Even with the `@property` or `@cached_property` applied to your function before `@computed_field`, mypy may throw a `Decorated property not supported` error. See [mypy issue #1362](https://github.com/python/mypy/issues/1362), for more information. - To avoid this error message, add `# type: ignore[prop-decorator]` to the `@computed_field` line. + To avoid this error message, add `# type: ignore[misc]` to the `@computed_field` line. [pyright](https://github.com/microsoft/pyright) supports `@computed_field` without error. - ```python + ```py import random from pydantic import BaseModel, computed_field @@ -1724,7 +1100,7 @@ def computed_field( `mypy` complains about this behavior if allowed, and `dataclasses` doesn't allow this pattern either. See the example below: - ```python + ```py from pydantic import BaseModel, computed_field class Parent(BaseModel): @@ -1738,16 +1114,14 @@ def computed_field( def a(self) -> str: return 'new a' - except TypeError as e: - print(e) - ''' - Field 'a' of class 'Child' overrides symbol of same name in a parent class. This override with a computed_field is incompatible. - ''' + except ValueError as e: + print(repr(e)) + #> ValueError("you can't override a field with a computed field") ``` Private properties decorated with `@computed_field` have `repr=False` by default. - ```python + ```py from functools import cached_property from pydantic import BaseModel, computed_field @@ -1767,22 +1141,18 @@ def computed_field( m = Model(foo=1) print(repr(m)) - #> Model(foo=1) + #> M(foo=1) ``` Args: - func: the function to wrap. + __f: the function to wrap. alias: alias to use when serializing this computed field, only used when `by_alias=True` alias_priority: priority of the alias. This affects whether an alias generator is used title: Title to use when including this computed field in JSON Schema - field_title_generator: A callable that takes a field name and returns title for it. description: Description to use when including this computed field in JSON Schema, defaults to the function's docstring - deprecated: A deprecation message (or an instance of `warnings.deprecated` or the `typing_extensions.deprecated` backport). - to be emitted when accessing the field. Or a boolean. This will automatically be set if the property is decorated with the - `deprecated` decorator. examples: Example values to use when including this computed field in JSON Schema - json_schema_extra: A dict or callable to provide extra JSON schema properties. + json_schema_extra: Dictionary of extra JSON schema properties. repr: whether to include this computed field in model repr. Default is `False` for private properties and `True` for public properties. return_type: optional return for serialization logic to expect when serializing to JSON, if included @@ -1795,40 +1165,26 @@ def computed_field( """ def dec(f: Any) -> Any: - nonlocal description, deprecated, return_type, alias_priority + nonlocal description, return_type, alias_priority unwrapped = _decorators.unwrap_wrapped_function(f) - if description is None and unwrapped.__doc__: description = inspect.cleandoc(unwrapped.__doc__) - if deprecated is None and hasattr(unwrapped, '__deprecated__'): - deprecated = unwrapped.__deprecated__ - # if the function isn't already decorated with `@property` (or another descriptor), then we wrap it now f = _decorators.ensure_property(f) alias_priority = (alias_priority or 2) if alias is not None else None if repr is None: - repr_: bool = not _wrapped_property_is_private(property_=f) + repr_: bool = False if _wrapped_property_is_private(property_=f) else True else: repr_ = repr dec_info = ComputedFieldInfo( - f, - return_type, - alias, - alias_priority, - title, - field_title_generator, - description, - deprecated, - examples, - json_schema_extra, - repr_, + f, return_type, alias, alias_priority, title, description, examples, json_schema_extra, repr_ ) return _decorators.PydanticDescriptorProxy(f, dec_info) - if func is None: + if __f is None: return dec else: - return dec(func) + return dec(__f) diff --git a/Backend/venv/lib/python3.12/site-packages/pydantic/functional_serializers.py b/Backend/venv/lib/python3.12/site-packages/pydantic/functional_serializers.py index 0c1522f1..849dfe5c 100644 --- a/Backend/venv/lib/python3.12/site-packages/pydantic/functional_serializers.py +++ b/Backend/venv/lib/python3.12/site-packages/pydantic/functional_serializers.py @@ -1,14 +1,13 @@ """This module contains related classes and functions for serialization.""" - from __future__ import annotations import dataclasses -from functools import partial, partialmethod -from typing import TYPE_CHECKING, Annotated, Any, Callable, Literal, TypeVar, overload +from functools import partialmethod +from typing import TYPE_CHECKING, Any, Callable, TypeVar, Union, overload from pydantic_core import PydanticUndefined, core_schema -from pydantic_core.core_schema import SerializationInfo, SerializerFunctionWrapHandler, WhenUsed -from typing_extensions import TypeAlias +from pydantic_core import core_schema as _core_schema +from typing_extensions import Annotated, Literal, TypeAlias from . import PydanticUndefinedAnnotation from ._internal import _decorators, _internal_dataclass @@ -19,26 +18,6 @@ from .annotated_handlers import GetCoreSchemaHandler class PlainSerializer: """Plain serializers use a function to modify the output of serialization. - This is particularly helpful when you want to customize the serialization for annotated types. - Consider an input of `list`, which will be serialized into a space-delimited string. - - ```python - from typing import Annotated - - from pydantic import BaseModel, PlainSerializer - - CustomStr = Annotated[ - list, PlainSerializer(lambda x: ' '.join(x), return_type=str) - ] - - class StudentModel(BaseModel): - courses: CustomStr - - student = StudentModel(courses=['Math', 'Chemistry', 'English']) - print(student.model_dump()) - #> {'courses': 'Math Chemistry English'} - ``` - Attributes: func: The serializer function. return_type: The return type for the function. If omitted it will be inferred from the type annotation. @@ -48,7 +27,7 @@ class PlainSerializer: func: core_schema.SerializerFunction return_type: Any = PydanticUndefined - when_used: WhenUsed = 'always' + when_used: Literal['always', 'unless-none', 'json', 'json-unless-none'] = 'always' def __get_pydantic_core_schema__(self, source_type: Any, handler: GetCoreSchemaHandler) -> core_schema.CoreSchema: """Gets the Pydantic core schema. @@ -61,20 +40,12 @@ class PlainSerializer: The Pydantic core schema. """ schema = handler(source_type) - if self.return_type is not PydanticUndefined: - return_type = self.return_type - else: - try: - # Do not pass in globals as the function could be defined in a different module. - # Instead, let `get_callable_return_type` infer the globals to use, but still pass - # in locals that may contain a parent/rebuild namespace: - return_type = _decorators.get_callable_return_type( - self.func, - localns=handler._get_types_namespace().locals, - ) - except NameError as e: - raise PydanticUndefinedAnnotation.from_name_error(e) from e - + try: + return_type = _decorators.get_function_return_type( + self.func, self.return_type, handler._get_types_namespace() + ) + except NameError as e: + raise PydanticUndefinedAnnotation.from_name_error(e) from e return_schema = None if return_type is PydanticUndefined else handler.generate_schema(return_type) schema['serialization'] = core_schema.plain_serializer_function_ser_schema( function=self.func, @@ -90,58 +61,6 @@ class WrapSerializer: """Wrap serializers receive the raw inputs along with a handler function that applies the standard serialization logic, and can modify the resulting value before returning it as the final output of serialization. - For example, here's a scenario in which a wrap serializer transforms timezones to UTC **and** utilizes the existing `datetime` serialization logic. - - ```python - from datetime import datetime, timezone - from typing import Annotated, Any - - from pydantic import BaseModel, WrapSerializer - - class EventDatetime(BaseModel): - start: datetime - end: datetime - - def convert_to_utc(value: Any, handler, info) -> dict[str, datetime]: - # Note that `handler` can actually help serialize the `value` for - # further custom serialization in case it's a subclass. - partial_result = handler(value, info) - if info.mode == 'json': - return { - k: datetime.fromisoformat(v).astimezone(timezone.utc) - for k, v in partial_result.items() - } - return {k: v.astimezone(timezone.utc) for k, v in partial_result.items()} - - UTCEventDatetime = Annotated[EventDatetime, WrapSerializer(convert_to_utc)] - - class EventModel(BaseModel): - event_datetime: UTCEventDatetime - - dt = EventDatetime( - start='2024-01-01T07:00:00-08:00', end='2024-01-03T20:00:00+06:00' - ) - event = EventModel(event_datetime=dt) - print(event.model_dump()) - ''' - { - 'event_datetime': { - 'start': datetime.datetime( - 2024, 1, 1, 15, 0, tzinfo=datetime.timezone.utc - ), - 'end': datetime.datetime( - 2024, 1, 3, 14, 0, tzinfo=datetime.timezone.utc - ), - } - } - ''' - - print(event.model_dump_json()) - ''' - {"event_datetime":{"start":"2024-01-01T15:00:00Z","end":"2024-01-03T14:00:00Z"}} - ''' - ``` - Attributes: func: The serializer function to be wrapped. return_type: The return type for the function. If omitted it will be inferred from the type annotation. @@ -151,7 +70,7 @@ class WrapSerializer: func: core_schema.WrapSerializerFunction return_type: Any = PydanticUndefined - when_used: WhenUsed = 'always' + when_used: Literal['always', 'unless-none', 'json', 'json-unless-none'] = 'always' def __get_pydantic_core_schema__(self, source_type: Any, handler: GetCoreSchemaHandler) -> core_schema.CoreSchema: """This method is used to get the Pydantic core schema of the class. @@ -164,20 +83,12 @@ class WrapSerializer: The generated core schema of the class. """ schema = handler(source_type) - if self.return_type is not PydanticUndefined: - return_type = self.return_type - else: - try: - # Do not pass in globals as the function could be defined in a different module. - # Instead, let `get_callable_return_type` infer the globals to use, but still pass - # in locals that may contain a parent/rebuild namespace: - return_type = _decorators.get_callable_return_type( - self.func, - localns=handler._get_types_namespace().locals, - ) - except NameError as e: - raise PydanticUndefinedAnnotation.from_name_error(e) from e - + try: + return_type = _decorators.get_function_return_type( + self.func, self.return_type, handler._get_types_namespace() + ) + except NameError as e: + raise PydanticUndefinedAnnotation.from_name_error(e) from e return_schema = None if return_type is PydanticUndefined else handler.generate_schema(return_type) schema['serialization'] = core_schema.wrap_serializer_function_ser_schema( function=self.func, @@ -189,77 +100,58 @@ class WrapSerializer: if TYPE_CHECKING: - _Partial: TypeAlias = 'partial[Any] | partialmethod[Any]' - - FieldPlainSerializer: TypeAlias = 'core_schema.SerializerFunction | _Partial' - """A field serializer method or function in `plain` mode.""" - - FieldWrapSerializer: TypeAlias = 'core_schema.WrapSerializerFunction | _Partial' - """A field serializer method or function in `wrap` mode.""" - - FieldSerializer: TypeAlias = 'FieldPlainSerializer | FieldWrapSerializer' - """A field serializer method or function.""" - - _FieldPlainSerializerT = TypeVar('_FieldPlainSerializerT', bound=FieldPlainSerializer) - _FieldWrapSerializerT = TypeVar('_FieldWrapSerializerT', bound=FieldWrapSerializer) + _PartialClsOrStaticMethod: TypeAlias = Union[classmethod[Any, Any, Any], staticmethod[Any, Any], partialmethod[Any]] + _PlainSerializationFunction = Union[_core_schema.SerializerFunction, _PartialClsOrStaticMethod] + _WrapSerializationFunction = Union[_core_schema.WrapSerializerFunction, _PartialClsOrStaticMethod] + _PlainSerializeMethodType = TypeVar('_PlainSerializeMethodType', bound=_PlainSerializationFunction) + _WrapSerializeMethodType = TypeVar('_WrapSerializeMethodType', bound=_WrapSerializationFunction) @overload def field_serializer( - field: str, - /, + __field: str, + *fields: str, + return_type: Any = ..., + when_used: Literal['always', 'unless-none', 'json', 'json-unless-none'] = ..., + check_fields: bool | None = ..., +) -> Callable[[_PlainSerializeMethodType], _PlainSerializeMethodType]: + ... + + +@overload +def field_serializer( + __field: str, + *fields: str, + mode: Literal['plain'], + return_type: Any = ..., + when_used: Literal['always', 'unless-none', 'json', 'json-unless-none'] = ..., + check_fields: bool | None = ..., +) -> Callable[[_PlainSerializeMethodType], _PlainSerializeMethodType]: + ... + + +@overload +def field_serializer( + __field: str, *fields: str, mode: Literal['wrap'], return_type: Any = ..., - when_used: WhenUsed = ..., + when_used: Literal['always', 'unless-none', 'json', 'json-unless-none'] = ..., check_fields: bool | None = ..., -) -> Callable[[_FieldWrapSerializerT], _FieldWrapSerializerT]: ... - - -@overload -def field_serializer( - field: str, - /, - *fields: str, - mode: Literal['plain'] = ..., - return_type: Any = ..., - when_used: WhenUsed = ..., - check_fields: bool | None = ..., -) -> Callable[[_FieldPlainSerializerT], _FieldPlainSerializerT]: ... +) -> Callable[[_WrapSerializeMethodType], _WrapSerializeMethodType]: + ... def field_serializer( *fields: str, mode: Literal['plain', 'wrap'] = 'plain', - # TODO PEP 747 (grep for 'return_type' on the whole code base): return_type: Any = PydanticUndefined, - when_used: WhenUsed = 'always', + when_used: Literal['always', 'unless-none', 'json', 'json-unless-none'] = 'always', check_fields: bool | None = None, -) -> ( - Callable[[_FieldWrapSerializerT], _FieldWrapSerializerT] - | Callable[[_FieldPlainSerializerT], _FieldPlainSerializerT] -): +) -> Callable[[Any], Any]: """Decorator that enables custom field serialization. - In the below example, a field of type `set` is used to mitigate duplication. A `field_serializer` is used to serialize the data as a sorted list. - - ```python - from pydantic import BaseModel, field_serializer - - class StudentModel(BaseModel): - name: str = 'Jane' - courses: set[str] - - @field_serializer('courses', when_used='json') - def serialize_courses_in_order(self, courses: set[str]): - return sorted(courses) - - student = StudentModel(courses={'Math', 'Chemistry', 'English'}) - print(student.model_dump_json()) - #> {"name":"Jane","courses":["Chemistry","English","Math"]} - ``` - - See [the usage documentation](../concepts/serialization.md#serializers) for more information. + See [Custom serializers](../concepts/serialization.md#custom-serializers) for more information. Four signatures are supported: @@ -283,7 +175,9 @@ def field_serializer( The decorator function. """ - def dec(f: FieldSerializer) -> _decorators.PydanticDescriptorProxy[Any]: + def dec( + f: Callable[..., Any] | staticmethod[Any, Any] | classmethod[Any, Any, Any] + ) -> _decorators.PydanticDescriptorProxy[Any]: dec_info = _decorators.FieldSerializerDecoratorInfo( fields=fields, mode=mode, @@ -291,109 +185,42 @@ def field_serializer( when_used=when_used, check_fields=check_fields, ) - return _decorators.PydanticDescriptorProxy(f, dec_info) # pyright: ignore[reportArgumentType] + return _decorators.PydanticDescriptorProxy(f, dec_info) - return dec # pyright: ignore[reportReturnType] + return dec -if TYPE_CHECKING: - # The first argument in the following callables represent the `self` type: - - ModelPlainSerializerWithInfo: TypeAlias = Callable[[Any, SerializationInfo[Any]], Any] - """A model serializer method with the `info` argument, in `plain` mode.""" - - ModelPlainSerializerWithoutInfo: TypeAlias = Callable[[Any], Any] - """A model serializer method without the `info` argument, in `plain` mode.""" - - ModelPlainSerializer: TypeAlias = 'ModelPlainSerializerWithInfo | ModelPlainSerializerWithoutInfo' - """A model serializer method in `plain` mode.""" - - ModelWrapSerializerWithInfo: TypeAlias = Callable[[Any, SerializerFunctionWrapHandler, SerializationInfo[Any]], Any] - """A model serializer method with the `info` argument, in `wrap` mode.""" - - ModelWrapSerializerWithoutInfo: TypeAlias = Callable[[Any, SerializerFunctionWrapHandler], Any] - """A model serializer method without the `info` argument, in `wrap` mode.""" - - ModelWrapSerializer: TypeAlias = 'ModelWrapSerializerWithInfo | ModelWrapSerializerWithoutInfo' - """A model serializer method in `wrap` mode.""" - - ModelSerializer: TypeAlias = 'ModelPlainSerializer | ModelWrapSerializer' - - _ModelPlainSerializerT = TypeVar('_ModelPlainSerializerT', bound=ModelPlainSerializer) - _ModelWrapSerializerT = TypeVar('_ModelWrapSerializerT', bound=ModelWrapSerializer) +FuncType = TypeVar('FuncType', bound=Callable[..., Any]) @overload -def model_serializer(f: _ModelPlainSerializerT, /) -> _ModelPlainSerializerT: ... - - -@overload -def model_serializer( - *, mode: Literal['wrap'], when_used: WhenUsed = 'always', return_type: Any = ... -) -> Callable[[_ModelWrapSerializerT], _ModelWrapSerializerT]: ... +def model_serializer(__f: FuncType) -> FuncType: + ... @overload def model_serializer( *, - mode: Literal['plain'] = ..., - when_used: WhenUsed = 'always', + mode: Literal['plain', 'wrap'] = ..., + when_used: Literal['always', 'unless-none', 'json', 'json-unless-none'] = 'always', return_type: Any = ..., -) -> Callable[[_ModelPlainSerializerT], _ModelPlainSerializerT]: ... +) -> Callable[[FuncType], FuncType]: + ... def model_serializer( - f: _ModelPlainSerializerT | _ModelWrapSerializerT | None = None, - /, + __f: Callable[..., Any] | None = None, *, mode: Literal['plain', 'wrap'] = 'plain', - when_used: WhenUsed = 'always', + when_used: Literal['always', 'unless-none', 'json', 'json-unless-none'] = 'always', return_type: Any = PydanticUndefined, -) -> ( - _ModelPlainSerializerT - | Callable[[_ModelWrapSerializerT], _ModelWrapSerializerT] - | Callable[[_ModelPlainSerializerT], _ModelPlainSerializerT] -): +) -> Callable[[Any], Any]: """Decorator that enables custom model serialization. - This is useful when a model need to be serialized in a customized manner, allowing for flexibility beyond just specific fields. - - An example would be to serialize temperature to the same temperature scale, such as degrees Celsius. - - ```python - from typing import Literal - - from pydantic import BaseModel, model_serializer - - class TemperatureModel(BaseModel): - unit: Literal['C', 'F'] - value: int - - @model_serializer() - def serialize_model(self): - if self.unit == 'F': - return {'unit': 'C', 'value': int((self.value - 32) / 1.8)} - return {'unit': self.unit, 'value': self.value} - - temperature = TemperatureModel(unit='F', value=212) - print(temperature.model_dump()) - #> {'unit': 'C', 'value': 100} - ``` - - Two signatures are supported for `mode='plain'`, which is the default: - - - `(self)` - - `(self, info: SerializationInfo)` - - And two other signatures for `mode='wrap'`: - - - `(self, nxt: SerializerFunctionWrapHandler)` - - `(self, nxt: SerializerFunctionWrapHandler, info: SerializationInfo)` - - See [the usage documentation](../concepts/serialization.md#serializers) for more information. + See [Custom serializers](../concepts/serialization.md#custom-serializers) for more information. Args: - f: The function to be decorated. + __f: The function to be decorated. mode: The serialization mode. - `'plain'` means the function will be called instead of the default serialization logic @@ -406,14 +233,14 @@ def model_serializer( The decorator function. """ - def dec(f: ModelSerializer) -> _decorators.PydanticDescriptorProxy[Any]: + def dec(f: Callable[..., Any]) -> _decorators.PydanticDescriptorProxy[Any]: dec_info = _decorators.ModelSerializerDecoratorInfo(mode=mode, return_type=return_type, when_used=when_used) return _decorators.PydanticDescriptorProxy(f, dec_info) - if f is None: - return dec # pyright: ignore[reportReturnType] + if __f is None: + return dec else: - return dec(f) # pyright: ignore[reportReturnType] + return dec(__f) # type: ignore AnyType = TypeVar('AnyType') @@ -421,19 +248,15 @@ AnyType = TypeVar('AnyType') if TYPE_CHECKING: SerializeAsAny = Annotated[AnyType, ...] # SerializeAsAny[list[str]] will be treated by type checkers as list[str] - """Annotation used to mark a type as having duck-typing serialization behavior. - - See [usage documentation](../concepts/serialization.md#serializing-with-duck-typing) for more details. + """Force serialization to ignore whatever is defined in the schema and instead ask the object + itself how it should be serialized. + In particular, this means that when model subclasses are serialized, fields present in the subclass + but not in the original schema will be included. """ else: @dataclasses.dataclass(**_internal_dataclass.slots_true) - class SerializeAsAny: - """Annotation used to mark a type as having duck-typing serialization behavior. - - See [usage documentation](../concepts/serialization.md#serializing-with-duck-typing) for more details. - """ - + class SerializeAsAny: # noqa: D101 def __class_getitem__(cls, item: Any) -> Any: return Annotated[item, SerializeAsAny()] @@ -445,7 +268,9 @@ else: while schema_to_update['type'] == 'definitions': schema_to_update = schema_to_update.copy() schema_to_update = schema_to_update['schema'] - schema_to_update['serialization'] = core_schema.simple_ser_schema('any') + schema_to_update['serialization'] = core_schema.wrap_serializer_function_ser_schema( + lambda x, h: h(x), schema=core_schema.any_schema() + ) return schema __hash__ = object.__hash__ diff --git a/Backend/venv/lib/python3.12/site-packages/pydantic/functional_validators.py b/Backend/venv/lib/python3.12/site-packages/pydantic/functional_validators.py index fc4bbba6..df5d6c7e 100644 --- a/Backend/venv/lib/python3.12/site-packages/pydantic/functional_validators.py +++ b/Backend/venv/lib/python3.12/site-packages/pydantic/functional_validators.py @@ -4,19 +4,18 @@ from __future__ import annotations as _annotations import dataclasses import sys -import warnings from functools import partialmethod from types import FunctionType -from typing import TYPE_CHECKING, Annotated, Any, Callable, Literal, TypeVar, Union, cast, overload +from typing import TYPE_CHECKING, Any, Callable, TypeVar, Union, cast, overload -from pydantic_core import PydanticUndefined, core_schema -from typing_extensions import Self, TypeAlias +from pydantic_core import core_schema +from pydantic_core import core_schema as _core_schema +from typing_extensions import Annotated, Literal, TypeAlias -from ._internal import _decorators, _generics, _internal_dataclass +from . import GetCoreSchemaHandler as _GetCoreSchemaHandler +from ._internal import _core_metadata, _decorators, _generics, _internal_dataclass from .annotated_handlers import GetCoreSchemaHandler from .errors import PydanticUserError -from .version import version_short -from .warnings import ArbitraryTypeWarning, PydanticDeprecatedSince212 if sys.version_info < (3, 11): from typing_extensions import Protocol @@ -28,8 +27,7 @@ _inspect_validator = _decorators.inspect_validator @dataclasses.dataclass(frozen=True, **_internal_dataclass.slots_true) class AfterValidator: - """!!! abstract "Usage Documentation" - [field *after* validators](../concepts/validators.md#field-after-validator) + """Usage docs: https://docs.pydantic.dev/2.5/concepts/validators/#annotated-validators A metadata class that indicates that a validation should be applied **after** the inner validation logic. @@ -37,8 +35,8 @@ class AfterValidator: func: The validator function. Example: - ```python - from typing import Annotated + ```py + from typing_extensions import Annotated from pydantic import AfterValidator, BaseModel, ValidationError @@ -72,36 +70,29 @@ class AfterValidator: func: core_schema.NoInfoValidatorFunction | core_schema.WithInfoValidatorFunction - def __get_pydantic_core_schema__(self, source_type: Any, handler: GetCoreSchemaHandler) -> core_schema.CoreSchema: + def __get_pydantic_core_schema__(self, source_type: Any, handler: _GetCoreSchemaHandler) -> core_schema.CoreSchema: schema = handler(source_type) - info_arg = _inspect_validator(self.func, mode='after', type='field') + info_arg = _inspect_validator(self.func, 'after') if info_arg: func = cast(core_schema.WithInfoValidatorFunction, self.func) - return core_schema.with_info_after_validator_function(func, schema=schema) + return core_schema.with_info_after_validator_function(func, schema=schema, field_name=handler.field_name) else: func = cast(core_schema.NoInfoValidatorFunction, self.func) return core_schema.no_info_after_validator_function(func, schema=schema) - @classmethod - def _from_decorator(cls, decorator: _decorators.Decorator[_decorators.FieldValidatorDecoratorInfo]) -> Self: - return cls(func=decorator.func) - @dataclasses.dataclass(frozen=True, **_internal_dataclass.slots_true) class BeforeValidator: - """!!! abstract "Usage Documentation" - [field *before* validators](../concepts/validators.md#field-before-validator) + """Usage docs: https://docs.pydantic.dev/2.5/concepts/validators/#annotated-validators A metadata class that indicates that a validation should be applied **before** the inner validation logic. Attributes: func: The validator function. - json_schema_input_type: The input type used to generate the appropriate - JSON Schema (in validation mode). The actual input type is `Any`. Example: - ```python - from typing import Annotated + ```py + from typing_extensions import Annotated from pydantic import BaseModel, BeforeValidator @@ -122,153 +113,68 @@ class BeforeValidator: """ func: core_schema.NoInfoValidatorFunction | core_schema.WithInfoValidatorFunction - json_schema_input_type: Any = PydanticUndefined - def __get_pydantic_core_schema__(self, source_type: Any, handler: GetCoreSchemaHandler) -> core_schema.CoreSchema: + def __get_pydantic_core_schema__(self, source_type: Any, handler: _GetCoreSchemaHandler) -> core_schema.CoreSchema: schema = handler(source_type) - input_schema = ( - None - if self.json_schema_input_type is PydanticUndefined - else handler.generate_schema(self.json_schema_input_type) - ) - - info_arg = _inspect_validator(self.func, mode='before', type='field') + info_arg = _inspect_validator(self.func, 'before') if info_arg: func = cast(core_schema.WithInfoValidatorFunction, self.func) - return core_schema.with_info_before_validator_function( - func, - schema=schema, - json_schema_input_schema=input_schema, - ) + return core_schema.with_info_before_validator_function(func, schema=schema, field_name=handler.field_name) else: func = cast(core_schema.NoInfoValidatorFunction, self.func) - return core_schema.no_info_before_validator_function( - func, schema=schema, json_schema_input_schema=input_schema - ) - - @classmethod - def _from_decorator(cls, decorator: _decorators.Decorator[_decorators.FieldValidatorDecoratorInfo]) -> Self: - return cls( - func=decorator.func, - json_schema_input_type=decorator.info.json_schema_input_type, - ) + return core_schema.no_info_before_validator_function(func, schema=schema) @dataclasses.dataclass(frozen=True, **_internal_dataclass.slots_true) class PlainValidator: - """!!! abstract "Usage Documentation" - [field *plain* validators](../concepts/validators.md#field-plain-validator) + """Usage docs: https://docs.pydantic.dev/2.5/concepts/validators/#annotated-validators A metadata class that indicates that a validation should be applied **instead** of the inner validation logic. - !!! note - Before v2.9, `PlainValidator` wasn't always compatible with JSON Schema generation for `mode='validation'`. - You can now use the `json_schema_input_type` argument to specify the input type of the function - to be used in the JSON schema when `mode='validation'` (the default). See the example below for more details. - Attributes: func: The validator function. - json_schema_input_type: The input type used to generate the appropriate - JSON Schema (in validation mode). The actual input type is `Any`. Example: - ```python - from typing import Annotated, Union + ```py + from typing_extensions import Annotated from pydantic import BaseModel, PlainValidator - def validate(v: object) -> int: - if not isinstance(v, (int, str)): - raise ValueError(f'Expected int or str, go {type(v)}') - - return int(v) + 1 - - MyInt = Annotated[ - int, - PlainValidator(validate, json_schema_input_type=Union[str, int]), # (1)! - ] + MyInt = Annotated[int, PlainValidator(lambda v: int(v) + 1)] class Model(BaseModel): a: MyInt print(Model(a='1').a) #> 2 - - print(Model(a=1).a) - #> 2 ``` - - 1. In this example, we've specified the `json_schema_input_type` as `Union[str, int]` which indicates to the JSON schema - generator that in validation mode, the input type for the `a` field can be either a [`str`][] or an [`int`][]. """ func: core_schema.NoInfoValidatorFunction | core_schema.WithInfoValidatorFunction - json_schema_input_type: Any = Any - def __get_pydantic_core_schema__(self, source_type: Any, handler: GetCoreSchemaHandler) -> core_schema.CoreSchema: - # Note that for some valid uses of PlainValidator, it is not possible to generate a core schema for the - # source_type, so calling `handler(source_type)` will error, which prevents us from generating a proper - # serialization schema. To work around this for use cases that will not involve serialization, we simply - # catch any PydanticSchemaGenerationError that may be raised while attempting to build the serialization schema - # and abort any attempts to handle special serialization. - from pydantic import PydanticSchemaGenerationError - - try: - schema = handler(source_type) - # TODO if `schema['serialization']` is one of `'include-exclude-dict/sequence', - # schema validation will fail. That's why we use 'type ignore' comments below. - serialization = schema.get( - 'serialization', - core_schema.wrap_serializer_function_ser_schema( - function=lambda v, h: h(v), - schema=schema, - return_schema=handler.generate_schema(source_type), - ), - ) - except PydanticSchemaGenerationError: - serialization = None - - input_schema = handler.generate_schema(self.json_schema_input_type) - - info_arg = _inspect_validator(self.func, mode='plain', type='field') + def __get_pydantic_core_schema__(self, source_type: Any, handler: _GetCoreSchemaHandler) -> core_schema.CoreSchema: + info_arg = _inspect_validator(self.func, 'plain') if info_arg: func = cast(core_schema.WithInfoValidatorFunction, self.func) - return core_schema.with_info_plain_validator_function( - func, - serialization=serialization, # pyright: ignore[reportArgumentType] - json_schema_input_schema=input_schema, - ) + return core_schema.with_info_plain_validator_function(func, field_name=handler.field_name) else: func = cast(core_schema.NoInfoValidatorFunction, self.func) - return core_schema.no_info_plain_validator_function( - func, - serialization=serialization, # pyright: ignore[reportArgumentType] - json_schema_input_schema=input_schema, - ) - - @classmethod - def _from_decorator(cls, decorator: _decorators.Decorator[_decorators.FieldValidatorDecoratorInfo]) -> Self: - return cls( - func=decorator.func, - json_schema_input_type=decorator.info.json_schema_input_type, - ) + return core_schema.no_info_plain_validator_function(func) @dataclasses.dataclass(frozen=True, **_internal_dataclass.slots_true) class WrapValidator: - """!!! abstract "Usage Documentation" - [field *wrap* validators](../concepts/validators.md#field-wrap-validator) + """Usage docs: https://docs.pydantic.dev/2.5/concepts/validators/#annotated-validators A metadata class that indicates that a validation should be applied **around** the inner validation logic. Attributes: func: The validator function. - json_schema_input_type: The input type used to generate the appropriate - JSON Schema (in validation mode). The actual input type is `Any`. - ```python + ```py from datetime import datetime - from typing import Annotated + + from typing_extensions import Annotated from pydantic import BaseModel, ValidationError, WrapValidator @@ -295,133 +201,95 @@ class WrapValidator: """ func: core_schema.NoInfoWrapValidatorFunction | core_schema.WithInfoWrapValidatorFunction - json_schema_input_type: Any = PydanticUndefined - def __get_pydantic_core_schema__(self, source_type: Any, handler: GetCoreSchemaHandler) -> core_schema.CoreSchema: + def __get_pydantic_core_schema__(self, source_type: Any, handler: _GetCoreSchemaHandler) -> core_schema.CoreSchema: schema = handler(source_type) - input_schema = ( - None - if self.json_schema_input_type is PydanticUndefined - else handler.generate_schema(self.json_schema_input_type) - ) - - info_arg = _inspect_validator(self.func, mode='wrap', type='field') + info_arg = _inspect_validator(self.func, 'wrap') if info_arg: func = cast(core_schema.WithInfoWrapValidatorFunction, self.func) - return core_schema.with_info_wrap_validator_function( - func, - schema=schema, - json_schema_input_schema=input_schema, - ) + return core_schema.with_info_wrap_validator_function(func, schema=schema, field_name=handler.field_name) else: func = cast(core_schema.NoInfoWrapValidatorFunction, self.func) - return core_schema.no_info_wrap_validator_function( - func, - schema=schema, - json_schema_input_schema=input_schema, - ) - - @classmethod - def _from_decorator(cls, decorator: _decorators.Decorator[_decorators.FieldValidatorDecoratorInfo]) -> Self: - return cls( - func=decorator.func, - json_schema_input_type=decorator.info.json_schema_input_type, - ) + return core_schema.no_info_wrap_validator_function(func, schema=schema) if TYPE_CHECKING: class _OnlyValueValidatorClsMethod(Protocol): - def __call__(self, cls: Any, value: Any, /) -> Any: ... + def __call__(self, __cls: Any, __value: Any) -> Any: + ... class _V2ValidatorClsMethod(Protocol): - def __call__(self, cls: Any, value: Any, info: core_schema.ValidationInfo[Any], /) -> Any: ... - - class _OnlyValueWrapValidatorClsMethod(Protocol): - def __call__(self, cls: Any, value: Any, handler: core_schema.ValidatorFunctionWrapHandler, /) -> Any: ... + def __call__(self, __cls: Any, __input_value: Any, __info: _core_schema.ValidationInfo) -> Any: + ... class _V2WrapValidatorClsMethod(Protocol): def __call__( self, - cls: Any, - value: Any, - handler: core_schema.ValidatorFunctionWrapHandler, - info: core_schema.ValidationInfo[Any], - /, - ) -> Any: ... + __cls: Any, + __input_value: Any, + __validator: _core_schema.ValidatorFunctionWrapHandler, + __info: _core_schema.ValidationInfo, + ) -> Any: + ... _V2Validator = Union[ _V2ValidatorClsMethod, - core_schema.WithInfoValidatorFunction, + _core_schema.WithInfoValidatorFunction, _OnlyValueValidatorClsMethod, - core_schema.NoInfoValidatorFunction, + _core_schema.NoInfoValidatorFunction, ] _V2WrapValidator = Union[ _V2WrapValidatorClsMethod, - core_schema.WithInfoWrapValidatorFunction, - _OnlyValueWrapValidatorClsMethod, - core_schema.NoInfoWrapValidatorFunction, + _core_schema.WithInfoWrapValidatorFunction, ] _PartialClsOrStaticMethod: TypeAlias = Union[classmethod[Any, Any, Any], staticmethod[Any, Any], partialmethod[Any]] _V2BeforeAfterOrPlainValidatorType = TypeVar( '_V2BeforeAfterOrPlainValidatorType', - bound=Union[_V2Validator, _PartialClsOrStaticMethod], + _V2Validator, + _PartialClsOrStaticMethod, ) - _V2WrapValidatorType = TypeVar('_V2WrapValidatorType', bound=Union[_V2WrapValidator, _PartialClsOrStaticMethod]) + _V2WrapValidatorType = TypeVar('_V2WrapValidatorType', _V2WrapValidator, _PartialClsOrStaticMethod) + + +@overload +def field_validator( + __field: str, + *fields: str, + mode: Literal['before', 'after', 'plain'] = ..., + check_fields: bool | None = ..., +) -> Callable[[_V2BeforeAfterOrPlainValidatorType], _V2BeforeAfterOrPlainValidatorType]: + ... + + +@overload +def field_validator( + __field: str, + *fields: str, + mode: Literal['wrap'], + check_fields: bool | None = ..., +) -> Callable[[_V2WrapValidatorType], _V2WrapValidatorType]: + ... + FieldValidatorModes: TypeAlias = Literal['before', 'after', 'wrap', 'plain'] -@overload def field_validator( - field: str, - /, - *fields: str, - mode: Literal['wrap'], - check_fields: bool | None = ..., - json_schema_input_type: Any = ..., -) -> Callable[[_V2WrapValidatorType], _V2WrapValidatorType]: ... - - -@overload -def field_validator( - field: str, - /, - *fields: str, - mode: Literal['before', 'plain'], - check_fields: bool | None = ..., - json_schema_input_type: Any = ..., -) -> Callable[[_V2BeforeAfterOrPlainValidatorType], _V2BeforeAfterOrPlainValidatorType]: ... - - -@overload -def field_validator( - field: str, - /, - *fields: str, - mode: Literal['after'] = ..., - check_fields: bool | None = ..., -) -> Callable[[_V2BeforeAfterOrPlainValidatorType], _V2BeforeAfterOrPlainValidatorType]: ... - - -def field_validator( - field: str, - /, + __field: str, *fields: str, mode: FieldValidatorModes = 'after', check_fields: bool | None = None, - json_schema_input_type: Any = PydanticUndefined, ) -> Callable[[Any], Any]: - """!!! abstract "Usage Documentation" - [field validators](../concepts/validators.md#field-validators) + """Usage docs: https://docs.pydantic.dev/2.5/concepts/validators/#field-validators Decorate methods on the class indicating that they should be used to validate fields. Example usage: - ```python + ```py from typing import Any from pydantic import ( @@ -457,14 +325,11 @@ def field_validator( For more in depth examples, see [Field Validators](../concepts/validators.md#field-validators). Args: - field: The first field the `field_validator` should be called on; this is separate + __field: The first field the `field_validator` should be called on; this is separate from `fields` to ensure an error is raised if you don't pass at least one. *fields: Additional field(s) the `field_validator` should be called on. mode: Specifies whether to validate the fields before or after validation. check_fields: Whether to check that the fields actually exist on the model. - json_schema_input_type: The input type of the function. This is only used to generate - the appropriate JSON Schema (in validation mode) and can only specified - when `mode` is either `'before'`, `'plain'` or `'wrap'`. Returns: A decorator that can be used to decorate a function to be used as a field_validator. @@ -475,23 +340,13 @@ def field_validator( - If the args passed to `@field_validator` as fields are not strings. - If `@field_validator` applied to instance methods. """ - if isinstance(field, FunctionType): + if isinstance(__field, FunctionType): raise PydanticUserError( '`@field_validator` should be used with fields and keyword arguments, not bare. ' "E.g. usage should be `@validator('', ...)`", code='validator-no-fields', ) - - if mode not in ('before', 'plain', 'wrap') and json_schema_input_type is not PydanticUndefined: - raise PydanticUserError( - f"`json_schema_input_type` can't be used when mode is set to {mode!r}", - code='validator-input-type', - ) - - if json_schema_input_type is PydanticUndefined and mode == 'plain': - json_schema_input_type = Any - - fields = field, *fields + fields = __field, *fields if not all(isinstance(field, str) for field in fields): raise PydanticUserError( '`@field_validator` fields should be passed as separate string args. ' @@ -500,7 +355,7 @@ def field_validator( ) def dec( - f: Callable[..., Any] | staticmethod[Any, Any] | classmethod[Any, Any, Any], + f: Callable[..., Any] | staticmethod[Any, Any] | classmethod[Any, Any, Any] ) -> _decorators.PydanticDescriptorProxy[Any]: if _decorators.is_instance_method_from_sig(f): raise PydanticUserError( @@ -510,9 +365,7 @@ def field_validator( # auto apply the @classmethod decorator f = _decorators.ensure_classmethod_based_on_signature(f) - dec_info = _decorators.FieldValidatorDecoratorInfo( - fields=fields, mode=mode, check_fields=check_fields, json_schema_input_type=json_schema_input_type - ) + dec_info = _decorators.FieldValidatorDecoratorInfo(fields=fields, mode=mode, check_fields=check_fields) return _decorators.PydanticDescriptorProxy(f, dec_info) return dec @@ -522,20 +375,17 @@ _ModelType = TypeVar('_ModelType') _ModelTypeCo = TypeVar('_ModelTypeCo', covariant=True) -class ModelWrapValidatorHandler(core_schema.ValidatorFunctionWrapHandler, Protocol[_ModelTypeCo]): - """`@model_validator` decorated function handler argument type. This is used when `mode='wrap'`.""" +class ModelWrapValidatorHandler(_core_schema.ValidatorFunctionWrapHandler, Protocol[_ModelTypeCo]): + """@model_validator decorated function handler argument type. This is used when `mode='wrap'`.""" def __call__( # noqa: D102 - self, - value: Any, - outer_location: str | int | None = None, - /, + self, input_value: Any, outer_location: str | int | None = None ) -> _ModelTypeCo: # pragma: no cover ... class ModelWrapValidatorWithoutInfo(Protocol[_ModelType]): - """A `@model_validator` decorated function signature. + """A @model_validator decorated function signature. This is used when `mode='wrap'` and the function does not have info argument. """ @@ -545,14 +395,14 @@ class ModelWrapValidatorWithoutInfo(Protocol[_ModelType]): # this can be a dict, a model instance # or anything else that gets passed to validate_python # thus validators _must_ handle all cases - value: Any, - handler: ModelWrapValidatorHandler[_ModelType], - /, - ) -> _ModelType: ... + __value: Any, + __handler: ModelWrapValidatorHandler[_ModelType], + ) -> _ModelType: + ... class ModelWrapValidator(Protocol[_ModelType]): - """A `@model_validator` decorated function signature. This is used when `mode='wrap'`.""" + """A @model_validator decorated function signature. This is used when `mode='wrap'`.""" def __call__( # noqa: D102 self, @@ -560,30 +410,15 @@ class ModelWrapValidator(Protocol[_ModelType]): # this can be a dict, a model instance # or anything else that gets passed to validate_python # thus validators _must_ handle all cases - value: Any, - handler: ModelWrapValidatorHandler[_ModelType], - info: core_schema.ValidationInfo, - /, - ) -> _ModelType: ... - - -class FreeModelBeforeValidatorWithoutInfo(Protocol): - """A `@model_validator` decorated function signature. - This is used when `mode='before'` and the function does not have info argument. - """ - - def __call__( # noqa: D102 - self, - # this can be a dict, a model instance - # or anything else that gets passed to validate_python - # thus validators _must_ handle all cases - value: Any, - /, - ) -> Any: ... + __value: Any, + __handler: ModelWrapValidatorHandler[_ModelType], + __info: _core_schema.ValidationInfo, + ) -> _ModelType: + ... class ModelBeforeValidatorWithoutInfo(Protocol): - """A `@model_validator` decorated function signature. + """A @model_validator decorated function signature. This is used when `mode='before'` and the function does not have info argument. """ @@ -593,23 +428,9 @@ class ModelBeforeValidatorWithoutInfo(Protocol): # this can be a dict, a model instance # or anything else that gets passed to validate_python # thus validators _must_ handle all cases - value: Any, - /, - ) -> Any: ... - - -class FreeModelBeforeValidator(Protocol): - """A `@model_validator` decorated function signature. This is used when `mode='before'`.""" - - def __call__( # noqa: D102 - self, - # this can be a dict, a model instance - # or anything else that gets passed to validate_python - # thus validators _must_ handle all cases - value: Any, - info: core_schema.ValidationInfo[Any], - /, - ) -> Any: ... + __value: Any, + ) -> Any: + ... class ModelBeforeValidator(Protocol): @@ -621,10 +442,10 @@ class ModelBeforeValidator(Protocol): # this can be a dict, a model instance # or anything else that gets passed to validate_python # thus validators _must_ handle all cases - value: Any, - info: core_schema.ValidationInfo[Any], - /, - ) -> Any: ... + __value: Any, + __info: _core_schema.ValidationInfo, + ) -> Any: + ... ModelAfterValidatorWithoutInfo = Callable[[_ModelType], _ModelType] @@ -632,13 +453,11 @@ ModelAfterValidatorWithoutInfo = Callable[[_ModelType], _ModelType] have info argument. """ -ModelAfterValidator = Callable[[_ModelType, core_schema.ValidationInfo[Any]], _ModelType] +ModelAfterValidator = Callable[[_ModelType, _core_schema.ValidationInfo], _ModelType] """A `@model_validator` decorated function signature. This is used when `mode='after'`.""" _AnyModelWrapValidator = Union[ModelWrapValidator[_ModelType], ModelWrapValidatorWithoutInfo[_ModelType]] -_AnyModelBeforeValidator = Union[ - FreeModelBeforeValidator, ModelBeforeValidator, FreeModelBeforeValidatorWithoutInfo, ModelBeforeValidatorWithoutInfo -] +_AnyModeBeforeValidator = Union[ModelBeforeValidator, ModelBeforeValidatorWithoutInfo] _AnyModelAfterValidator = Union[ModelAfterValidator[_ModelType], ModelAfterValidatorWithoutInfo[_ModelType]] @@ -648,16 +467,16 @@ def model_validator( mode: Literal['wrap'], ) -> Callable[ [_AnyModelWrapValidator[_ModelType]], _decorators.PydanticDescriptorProxy[_decorators.ModelValidatorDecoratorInfo] -]: ... +]: + ... @overload def model_validator( *, mode: Literal['before'], -) -> Callable[ - [_AnyModelBeforeValidator], _decorators.PydanticDescriptorProxy[_decorators.ModelValidatorDecoratorInfo] -]: ... +) -> Callable[[_AnyModeBeforeValidator], _decorators.PydanticDescriptorProxy[_decorators.ModelValidatorDecoratorInfo]]: + ... @overload @@ -666,33 +485,33 @@ def model_validator( mode: Literal['after'], ) -> Callable[ [_AnyModelAfterValidator[_ModelType]], _decorators.PydanticDescriptorProxy[_decorators.ModelValidatorDecoratorInfo] -]: ... +]: + ... def model_validator( *, mode: Literal['wrap', 'before', 'after'], ) -> Any: - """!!! abstract "Usage Documentation" - [Model Validators](../concepts/validators.md#model-validators) + """Usage docs: https://docs.pydantic.dev/2.5/concepts/validators/#model-validators Decorate model methods for validation purposes. Example usage: - ```python - from typing_extensions import Self + ```py + from typing import Optional from pydantic import BaseModel, ValidationError, model_validator class Square(BaseModel): - width: float - height: float + width: float + height: float - @model_validator(mode='after') - def verify_square(self) -> Self: - if self.width != self.height: - raise ValueError('width and height do not match') - return self + @model_validator(mode='after') + def verify_square(self) -> 'Rectangle': + if self.width != self.height: + raise ValueError('width and height do not match') + return self s = Square(width=1, height=1) print(repr(s)) @@ -704,7 +523,8 @@ def model_validator( print(e) ''' 1 validation error for Square - Value error, width and height do not match [type=value_error, input_value={'width': 1, 'height': 2}, input_type=dict] + __root__ + width and height do not match (type=value_error) ''' ``` @@ -719,18 +539,8 @@ def model_validator( """ def dec(f: Any) -> _decorators.PydanticDescriptorProxy[Any]: - # auto apply the @classmethod decorator. NOTE: in V3, do not apply the conversion for 'after' validators: + # auto apply the @classmethod decorator f = _decorators.ensure_classmethod_based_on_signature(f) - if mode == 'after' and isinstance(f, classmethod): - warnings.warn( - category=PydanticDeprecatedSince212, - message=( - "Using `@model_validator` with mode='after' on a classmethod is deprecated. Instead, use an instance method. " - f'See the documentation at https://docs.pydantic.dev/{version_short()}/concepts/validators/#model-after-validator.' - ), - stacklevel=2, - ) - dec_info = _decorators.ModelValidatorDecoratorInfo(mode=mode) return _decorators.PydanticDescriptorProxy(f, dec_info) @@ -751,7 +561,7 @@ else: '''Generic type for annotating a type that is an instance of a given class. Example: - ```python + ```py from pydantic import BaseModel, InstanceOf class Foo: @@ -829,10 +639,8 @@ else: @classmethod def __get_pydantic_core_schema__(cls, source: Any, handler: GetCoreSchemaHandler) -> core_schema.CoreSchema: - with warnings.catch_warnings(): - warnings.simplefilter('ignore', ArbitraryTypeWarning) - original_schema = handler(source) - metadata = {'pydantic_js_annotation_functions': [lambda _c, h: h(original_schema)]} + original_schema = handler(source) + metadata = _core_metadata.build_metadata_dict(js_annotation_functions=[lambda _c, h: h(original_schema)]) return core_schema.any_schema( metadata=metadata, serialization=core_schema.wrap_serializer_function_ser_schema( @@ -841,53 +649,3 @@ else: ) __hash__ = object.__hash__ - - -_FromTypeT = TypeVar('_FromTypeT') - - -class ValidateAs: - """A helper class to validate a custom type from a type that is natively supported by Pydantic. - - Args: - from_type: The type natively supported by Pydantic to use to perform validation. - instantiation_hook: A callable taking the validated type as an argument, and returning - the populated custom type. - - Example: - ```python {lint="skip"} - from typing import Annotated - - from pydantic import BaseModel, TypeAdapter, ValidateAs - - class MyCls: - def __init__(self, a: int) -> None: - self.a = a - - def __repr__(self) -> str: - return f"MyCls(a={self.a})" - - class Model(BaseModel): - a: int - - - ta = TypeAdapter( - Annotated[MyCls, ValidateAs(Model, lambda v: MyCls(a=v.a))] - ) - - print(ta.validate_python({'a': 1})) - #> MyCls(a=1) - ``` - """ - - # TODO: make use of PEP 747 - def __init__(self, from_type: type[_FromTypeT], /, instantiation_hook: Callable[[_FromTypeT], Any]) -> None: - self.from_type = from_type - self.instantiation_hook = instantiation_hook - - def __get_pydantic_core_schema__(self, source: Any, handler: GetCoreSchemaHandler) -> core_schema.CoreSchema: - schema = handler(self.from_type) - return core_schema.no_info_after_validator_function( - self.instantiation_hook, - schema=schema, - ) diff --git a/Backend/venv/lib/python3.12/site-packages/pydantic/generics.py b/Backend/venv/lib/python3.12/site-packages/pydantic/generics.py index 3f1070d0..5f6f7f7a 100644 --- a/Backend/venv/lib/python3.12/site-packages/pydantic/generics.py +++ b/Backend/venv/lib/python3.12/site-packages/pydantic/generics.py @@ -1,5 +1,4 @@ """The `generics` module is a backport module from V1.""" - from ._migration import getattr_migration __getattr__ = getattr_migration(__name__) diff --git a/Backend/venv/lib/python3.12/site-packages/pydantic/json.py b/Backend/venv/lib/python3.12/site-packages/pydantic/json.py index bcaff9f5..020fb6d2 100644 --- a/Backend/venv/lib/python3.12/site-packages/pydantic/json.py +++ b/Backend/venv/lib/python3.12/site-packages/pydantic/json.py @@ -1,5 +1,4 @@ """The `json` module is a backport module from V1.""" - from ._migration import getattr_migration __getattr__ = getattr_migration(__name__) diff --git a/Backend/venv/lib/python3.12/site-packages/pydantic/json_schema.py b/Backend/venv/lib/python3.12/site-packages/pydantic/json_schema.py index a16afb89..636669c7 100644 --- a/Backend/venv/lib/python3.12/site-packages/pydantic/json_schema.py +++ b/Backend/venv/lib/python3.12/site-packages/pydantic/json_schema.py @@ -1,47 +1,44 @@ -"""!!! abstract "Usage Documentation" - [JSON Schema](../concepts/json_schema.md) +""" +Usage docs: https://docs.pydantic.dev/2.5/concepts/json_schema/ The `json_schema` module contains classes and functions to allow the way [JSON Schema](https://json-schema.org/) is generated to be customized. -In general you shouldn't need to use this module directly; instead, you can use +In general you shouldn't need to use this module directly; instead, you can [`BaseModel.model_json_schema`][pydantic.BaseModel.model_json_schema] and [`TypeAdapter.json_schema`][pydantic.TypeAdapter.json_schema]. """ - from __future__ import annotations as _annotations import dataclasses import inspect import math -import os import re import warnings -from collections import Counter, defaultdict -from collections.abc import Hashable, Iterable, Sequence +from collections import defaultdict from copy import deepcopy +from dataclasses import is_dataclass from enum import Enum -from re import Pattern from typing import ( TYPE_CHECKING, - Annotated, Any, Callable, - Literal, + Counter, + Dict, + Hashable, + Iterable, NewType, + Sequence, + Tuple, TypeVar, Union, cast, - overload, ) import pydantic_core -from pydantic_core import MISSING, CoreSchema, PydanticOmit, core_schema, to_jsonable_python +from pydantic_core import CoreSchema, PydanticOmit, core_schema, to_jsonable_python from pydantic_core.core_schema import ComputedField -from typing_extensions import TypeAlias, assert_never, deprecated, final -from typing_inspection.introspection import get_literal_values - -from pydantic.warnings import PydanticDeprecatedSince26, PydanticDeprecatedSince29 +from typing_extensions import Annotated, Literal, TypeAlias, assert_never from ._internal import ( _config, @@ -51,10 +48,11 @@ from ._internal import ( _internal_dataclass, _mock_val_ser, _schema_generation_shared, + _typing_extra, ) from .annotated_handlers import GetJsonSchemaHandler -from .config import JsonDict, JsonValue -from .errors import PydanticInvalidForJsonSchema, PydanticSchemaGenerationError, PydanticUserError +from .config import JsonDict, JsonSchemaExtraCallable, JsonValue +from .errors import PydanticInvalidForJsonSchema, PydanticUserError if TYPE_CHECKING: from . import ConfigDict @@ -71,9 +69,9 @@ A type alias for defined schema types that represents a union of `core_schema.CoreSchemaFieldType`. """ -JsonSchemaValue = dict[str, Any] +JsonSchemaValue = Dict[str, Any] """ -A type alias for a JSON schema value. This is a dictionary of string keys to arbitrary JSON values. +A type alias for a JSON schema value. This is a dictionary of string keys to arbitrary values. """ JsonSchemaMode = Literal['validation', 'serialization'] @@ -89,7 +87,23 @@ for validation inputs, or that will be matched by serialization outputs. _MODE_TITLE_MAPPING: dict[JsonSchemaMode, str] = {'validation': 'Input', 'serialization': 'Output'} -JsonSchemaWarningKind = Literal['skipped-choice', 'non-serializable-default', 'skipped-discriminator'] +def update_json_schema(schema: JsonSchemaValue, updates: dict[str, Any]) -> JsonSchemaValue: + """Update a JSON schema by providing a dictionary of updates. + + This function sets the provided key-value pairs in the schema and returns the updated schema. + + Args: + schema: The JSON schema to update. + updates: A dictionary of key-value pairs to set in the schema. + + Returns: + The updated JSON schema. + """ + schema.update(updates) + return schema + + +JsonSchemaWarningKind = Literal['skipped-choice', 'non-serializable-default'] """ A type alias representing the kinds of warnings that can be emitted during JSON schema generation. @@ -106,12 +120,6 @@ class PydanticJsonSchemaWarning(UserWarning): """ -NoDefault = object() -"""A sentinel value used to indicate that no default value should be used when generating a JSON Schema -for a core schema with a default value. -""" - - # ##### JSON Schema Generation ##### DEFAULT_REF_TEMPLATE = '#/$defs/{model}' """The default format string used to generate reference names.""" @@ -128,11 +136,9 @@ DefsRef = NewType('DefsRef', str) # * By default, these look like "#/$defs/MyModel", as in {"$ref": "#/$defs/MyModel"} JsonRef = NewType('JsonRef', str) -CoreModeRef = tuple[CoreRef, JsonSchemaMode] +CoreModeRef = Tuple[CoreRef, JsonSchemaMode] JsonSchemaKeyT = TypeVar('JsonSchemaKeyT', bound=Hashable) -_PRIMITIVE_JSON_SCHEMA_TYPES = ('string', 'boolean', 'null', 'integer', 'number') - @dataclasses.dataclass(**_internal_dataclass.slots_true) class _DefinitionsRemapping: @@ -165,7 +171,7 @@ class _DefinitionsRemapping: # Deduplicate the schemas for each alternative; the idea is that we only want to remap to a new DefsRef # if it introduces no ambiguity, i.e., there is only one distinct schema for that DefsRef. - for defs_ref in schemas_for_alternatives: + for defs_ref, schemas in schemas_for_alternatives.items(): schemas_for_alternatives[defs_ref] = _deduplicate_schemas(schemas_for_alternatives[defs_ref]) # Build the remapping @@ -216,8 +222,7 @@ class _DefinitionsRemapping: class GenerateJsonSchema: - """!!! abstract "Usage Documentation" - [Customizing the JSON Schema Generation Process](../concepts/json_schema.md#customizing-the-json-schema-generation-process) + """Usage docs: https://docs.pydantic.dev/2.5/concepts/json_schema/#customizing-the-json-schema-generation-process A class for generating JSON schemas. @@ -233,28 +238,27 @@ class GenerateJsonSchema: ignored_warning_kinds: Warnings to ignore when generating the schema. `self.render_warning_message` will do nothing if its argument `kind` is in `ignored_warning_kinds`; this value can be modified on subclasses to easily control which warnings are emitted. - by_alias: Whether to use field aliases when generating the schema. + by_alias: Whether or not to use field names when generating the schema. ref_template: The format string used when generating reference names. core_to_json_refs: A mapping of core refs to JSON refs. core_to_defs_refs: A mapping of core refs to definition refs. defs_to_core_refs: A mapping of definition refs to core refs. json_to_defs_refs: A mapping of JSON refs to definition refs. definitions: Definitions in the schema. + collisions: Definitions with colliding names. When collisions are detected, we choose a non-colliding + name during generation, but we also track the colliding tag so that it can be remapped for the first + occurrence at the end of the process. + defs_ref_fallbacks: Core refs to fallback definitions refs. + _schema_type_to_method: A mapping of schema types to generator methods. + _used: Set to `True` after generating a schema to avoid re-use issues. + mode: The schema mode. Args: - by_alias: Whether to use field aliases in the generated schemas. + by_alias: Whether or not to include field names. ref_template: The format string to use when generating reference names. - union_format: The format to use when combining schemas from unions together. Can be one of: - - - `'any_of'`: Use the [`anyOf`](https://json-schema.org/understanding-json-schema/reference/combining#anyOf) - keyword to combine schemas (the default). - - `'primitive_type_array'`: Use the [`type`](https://json-schema.org/understanding-json-schema/reference/type) - keyword as an array of strings, containing each type of the combination. If any of the schemas is not a primitive - type (`string`, `boolean`, `null`, `integer` or `number`) or contains constraints/metadata, falls back to - `any_of`. Raises: - JsonSchemaError: If the instance of the class is inadvertently reused after generating a schema. + JsonSchemaError: If the instance of the class is inadvertently re-used after generating a schema. """ schema_dialect = 'https://json-schema.org/draft/2020-12/schema' @@ -263,15 +267,9 @@ class GenerateJsonSchema: # this value can be modified on subclasses to easily control which warnings are emitted ignored_warning_kinds: set[JsonSchemaWarningKind] = {'skipped-choice'} - def __init__( - self, - by_alias: bool = True, - ref_template: str = DEFAULT_REF_TEMPLATE, - union_format: Literal['any_of', 'primitive_type_array'] = 'any_of', - ) -> None: + def __init__(self, by_alias: bool = True, ref_template: str = DEFAULT_REF_TEMPLATE): self.by_alias = by_alias self.ref_template = ref_template - self.union_format: Literal['any_of', 'primitive_type_array'] = union_format self.core_to_json_refs: dict[CoreModeRef, JsonRef] = {} self.core_to_defs_refs: dict[CoreModeRef, DefsRef] = {} @@ -301,7 +299,7 @@ class GenerateJsonSchema: # store the error raised and re-throw it if we end up needing that def self._core_defs_invalid_for_json_schema: dict[DefsRef, PydanticInvalidForJsonSchema] = {} - # This changes to True after generating a schema, to prevent issues caused by accidental reuse + # This changes to True after generating a schema, to prevent issues caused by accidental re-use # of a single instance of a schema generator self._used = False @@ -328,14 +326,14 @@ class GenerateJsonSchema: TypeError: If no method has been defined for generating a JSON schema for a given pydantic core schema type. """ mapping: dict[CoreSchemaOrFieldType, Callable[[CoreSchemaOrField], JsonSchemaValue]] = {} - core_schema_types: list[CoreSchemaOrFieldType] = list(get_literal_values(CoreSchemaOrFieldType)) + core_schema_types: list[CoreSchemaOrFieldType] = _typing_extra.all_literal_values( + CoreSchemaOrFieldType # type: ignore + ) for key in core_schema_types: - method_name = f'{key.replace("-", "_")}_schema' + method_name = f"{key.replace('-', '_')}_schema" try: mapping[key] = getattr(self, method_name) except AttributeError as e: # pragma: no cover - if os.getenv('PYDANTIC_PRIVATE_ALLOW_UNHANDLED_SCHEMA_TYPES'): - continue raise TypeError( f'No method for generating JsonSchema for core_schema.type={key!r} ' f'(expected: {type(self).__name__}.{method_name})' @@ -374,7 +372,7 @@ class GenerateJsonSchema: code='json-schema-already-used', ) - for _, mode, schema in inputs: + for key, mode, schema in inputs: self._mode = mode self.generate_inner(schema) @@ -389,7 +387,7 @@ class GenerateJsonSchema: json_schema = {'$defs': self.definitions} json_schema = definitions_remapping.remap_json_schema(json_schema) self._used = True - return json_schemas_map, self.sort(json_schema['$defs']) # type: ignore + return json_schemas_map, _sort_json_schema(json_schema['$defs']) # type: ignore def generate(self, schema: CoreSchema, mode: JsonSchemaMode = 'validation') -> JsonSchemaValue: """Generates a JSON schema for a specified schema in a specified mode. @@ -415,15 +413,18 @@ class GenerateJsonSchema: json_schema: JsonSchemaValue = self.generate_inner(schema) json_ref_counts = self.get_json_ref_counts(json_schema) + # Remove the top-level $ref if present; note that the _generate method already ensures there are no sibling keys ref = cast(JsonRef, json_schema.get('$ref')) while ref is not None: # may need to unpack multiple levels ref_json_schema = self.get_schema_from_definitions(ref) - if json_ref_counts[ref] == 1 and ref_json_schema is not None and len(json_schema) == 1: - # "Unpack" the ref since this is the only reference and there are no sibling keys + if json_ref_counts[ref] > 1 or ref_json_schema is None: + # Keep the ref, but use an allOf to remove the top level $ref + json_schema = {'allOf': [{'$ref': ref}]} + else: + # "Unpack" the ref since this is the only reference json_schema = ref_json_schema.copy() # copy to prevent recursive dict reference json_ref_counts[ref] -= 1 - ref = cast(JsonRef, json_schema.get('$ref')) - ref = None + ref = cast(JsonRef, json_schema.get('$ref')) self._garbage_collect_definitions(json_schema) definitions_remapping = self._build_definitions_remapping() @@ -438,7 +439,7 @@ class GenerateJsonSchema: # json_schema['$schema'] = self.schema_dialect self._used = True - return self.sort(json_schema) + return _sort_json_schema(json_schema) def generate_inner(self, schema: CoreSchemaOrField) -> JsonSchemaValue: # noqa: C901 """Generates a JSON schema for a given core schema. @@ -448,10 +449,6 @@ class GenerateJsonSchema: Returns: The generated JSON schema. - - TODO: the nested function definitions here seem like bad practice, I'd like to unpack these - in a future PR. It'd be great if we could shorten the call stack a bit for JSON schema generation, - and I think there's potential for that here. """ # If a schema with the same CoreRef has been handled, just return a reference to it # Note that this assumes that it will _never_ be the case that the same CoreRef is used @@ -462,11 +459,15 @@ class GenerateJsonSchema: if core_mode_ref in self.core_to_defs_refs and self.core_to_defs_refs[core_mode_ref] in self.definitions: return {'$ref': self.core_to_json_refs[core_mode_ref]} + # Generate the JSON schema, accounting for the json_schema_override and core_schema_override + metadata_handler = _core_metadata.CoreMetadataHandler(schema) + def populate_defs(core_schema: CoreSchema, json_schema: JsonSchemaValue) -> JsonSchemaValue: if 'ref' in core_schema: core_ref = CoreRef(core_schema['ref']) # type: ignore[typeddict-item] defs_ref, ref_json_schema = self.get_cache_defs_ref_schema(core_ref) json_ref = JsonRef(ref_json_schema['$ref']) + self.json_to_defs_refs[json_ref] = defs_ref # Replace the schema if it's not a reference to itself # What we want to avoid is having the def be just a ref to itself # which is what would happen if we blindly assigned any @@ -476,6 +477,15 @@ class GenerateJsonSchema: json_schema = ref_json_schema return json_schema + def convert_to_all_of(json_schema: JsonSchemaValue) -> JsonSchemaValue: + if '$ref' in json_schema and len(json_schema.keys()) > 1: + # technically you can't have any other keys next to a "$ref" + # but it's an easy mistake to make and not hard to correct automatically here + json_schema = json_schema.copy() + ref = json_schema.pop('$ref') + json_schema = {'allOf': [{'$ref': ref}], **json_schema} + return json_schema + def handler_func(schema_or_field: CoreSchemaOrField) -> JsonSchemaValue: """Generate a JSON schema based on the input schema. @@ -491,62 +501,22 @@ class GenerateJsonSchema: # Generate the core-schema-type-specific bits of the schema generation: json_schema: JsonSchemaValue | None = None if self.mode == 'serialization' and 'serialization' in schema_or_field: - # In this case, we skip the JSON Schema generation of the schema - # and use the `'serialization'` schema instead (canonical example: - # `Annotated[int, PlainSerializer(str)]`). ser_schema = schema_or_field['serialization'] # type: ignore json_schema = self.ser_schema(ser_schema) - - # It might be that the 'serialization'` is skipped depending on `when_used`. - # This is only relevant for `nullable` schemas though, so we special case here. - if ( - json_schema is not None - and ser_schema.get('when_used') in ('unless-none', 'json-unless-none') - and schema_or_field['type'] == 'nullable' - ): - json_schema = self.get_union_of_schemas([{'type': 'null'}, json_schema]) if json_schema is None: if _core_utils.is_core_schema(schema_or_field) or _core_utils.is_core_schema_field(schema_or_field): generate_for_schema_type = self._schema_type_to_method[schema_or_field['type']] json_schema = generate_for_schema_type(schema_or_field) else: raise TypeError(f'Unexpected schema type: schema={schema_or_field}') + if _core_utils.is_core_schema(schema_or_field): + json_schema = populate_defs(schema_or_field, json_schema) + json_schema = convert_to_all_of(json_schema) return json_schema current_handler = _schema_generation_shared.GenerateJsonSchemaHandler(self, handler_func) - metadata = cast(_core_metadata.CoreMetadata, schema.get('metadata', {})) - - # TODO: I dislike that we have to wrap these basic dict updates in callables, is there any way around this? - - if js_updates := metadata.get('pydantic_js_updates'): - - def js_updates_handler_func( - schema_or_field: CoreSchemaOrField, - current_handler: GetJsonSchemaHandler = current_handler, - ) -> JsonSchemaValue: - json_schema = {**current_handler(schema_or_field), **js_updates} - return json_schema - - current_handler = _schema_generation_shared.GenerateJsonSchemaHandler(self, js_updates_handler_func) - - if js_extra := metadata.get('pydantic_js_extra'): - - def js_extra_handler_func( - schema_or_field: CoreSchemaOrField, - current_handler: GetJsonSchemaHandler = current_handler, - ) -> JsonSchemaValue: - json_schema = current_handler(schema_or_field) - if isinstance(js_extra, dict): - json_schema.update(to_jsonable_python(js_extra)) - elif callable(js_extra): - # similar to typing issue in _update_class_schema when we're working with callable js extra - js_extra(json_schema) # type: ignore - return json_schema - - current_handler = _schema_generation_shared.GenerateJsonSchemaHandler(self, js_extra_handler_func) - - for js_modify_function in metadata.get('pydantic_js_functions', ()): + for js_modify_function in metadata_handler.metadata.get('pydantic_js_functions', ()): def new_handler_func( schema_or_field: CoreSchemaOrField, @@ -564,59 +534,28 @@ class GenerateJsonSchema: current_handler = _schema_generation_shared.GenerateJsonSchemaHandler(self, new_handler_func) - for js_modify_function in metadata.get('pydantic_js_annotation_functions', ()): + for js_modify_function in metadata_handler.metadata.get('pydantic_js_annotation_functions', ()): def new_handler_func( schema_or_field: CoreSchemaOrField, current_handler: GetJsonSchemaHandler = current_handler, js_modify_function: GetJsonSchemaFunction = js_modify_function, ) -> JsonSchemaValue: - return js_modify_function(schema_or_field, current_handler) + json_schema = js_modify_function(schema_or_field, current_handler) + if _core_utils.is_core_schema(schema_or_field): + json_schema = populate_defs(schema_or_field, json_schema) + json_schema = convert_to_all_of(json_schema) + return json_schema current_handler = _schema_generation_shared.GenerateJsonSchemaHandler(self, new_handler_func) json_schema = current_handler(schema) if _core_utils.is_core_schema(schema): json_schema = populate_defs(schema, json_schema) + json_schema = convert_to_all_of(json_schema) return json_schema - def sort(self, value: JsonSchemaValue, parent_key: str | None = None) -> JsonSchemaValue: - """Override this method to customize the sorting of the JSON schema (e.g., don't sort at all, sort all keys unconditionally, etc.) - - By default, alphabetically sort the keys in the JSON schema, skipping the 'properties' and 'default' keys to preserve field definition order. - This sort is recursive, so it will sort all nested dictionaries as well. - """ - sorted_dict: dict[str, JsonSchemaValue] = {} - keys = value.keys() - if parent_key not in ('properties', 'default'): - keys = sorted(keys) - for key in keys: - sorted_dict[key] = self._sort_recursive(value[key], parent_key=key) - return sorted_dict - - def _sort_recursive(self, value: Any, parent_key: str | None = None) -> Any: - """Recursively sort a JSON schema value.""" - if isinstance(value, dict): - sorted_dict: dict[str, JsonSchemaValue] = {} - keys = value.keys() - if parent_key not in ('properties', 'default'): - keys = sorted(keys) - for key in keys: - sorted_dict[key] = self._sort_recursive(value[key], parent_key=key) - return sorted_dict - elif isinstance(value, list): - sorted_list: list[JsonSchemaValue] = [self._sort_recursive(item, parent_key) for item in value] - return sorted_list - else: - return value - # ### Schema generation methods - - def invalid_schema(self, schema: core_schema.InvalidSchema) -> JsonSchemaValue: - """Placeholder - should never be called.""" - - raise RuntimeError('Cannot generate schema for invalid_schema. This is a bug! Please report it.') - def any_schema(self, schema: core_schema.AnySchema) -> JsonSchemaValue: """Generates a JSON schema that matches any value. @@ -629,7 +568,7 @@ class GenerateJsonSchema: return {} def none_schema(self, schema: core_schema.NoneSchema) -> JsonSchemaValue: - """Generates a JSON schema that matches `None`. + """Generates a JSON schema that matches a None value. Args: schema: The core schema. @@ -651,7 +590,7 @@ class GenerateJsonSchema: return {'type': 'boolean'} def int_schema(self, schema: core_schema.IntSchema) -> JsonSchemaValue: - """Generates a JSON schema that matches an int value. + """Generates a JSON schema that matches an Int value. Args: schema: The core schema. @@ -687,49 +626,7 @@ class GenerateJsonSchema: Returns: The generated JSON schema. """ - - def get_decimal_pattern(schema: core_schema.DecimalSchema) -> str: - max_digits = schema.get('max_digits') - decimal_places = schema.get('decimal_places') - - pattern = ( - r'^(?!^[-+.]*$)[+-]?0*' # check it is not empty string and not one or sequence of ".+-" characters. - ) - - # Case 1: Both max_digits and decimal_places are set - if max_digits is not None and decimal_places is not None: - integer_places = max(0, max_digits - decimal_places) - pattern += ( - rf'(?:' - rf'\d{{0,{integer_places}}}' - rf'|' - rf'(?=[\d.]{{1,{max_digits + 1}}}0*$)' - rf'\d{{0,{integer_places}}}\.\d{{0,{decimal_places}}}0*$' - rf')' - ) - - # Case 2: Only max_digits is set - elif max_digits is not None and decimal_places is None: - pattern += ( - rf'(?:' - rf'\d{{0,{max_digits}}}' - rf'|' - rf'(?=[\d.]{{1,{max_digits + 1}}}0*$)' - rf'\d*\.\d*0*$' - rf')' - ) - - # Case 3: Only decimal_places is set - elif max_digits is None and decimal_places is not None: - pattern += rf'\d*\.?\d{{0,{decimal_places}}}0*$' - - # Case 4: Both are None (no restrictions) - else: - pattern += r'\d*\.?\d*$' # look for arbitrary integer or decimal - - return pattern - - json_schema = self.str_schema(core_schema.str_schema(pattern=get_decimal_pattern(schema))) + json_schema = self.str_schema(core_schema.str_schema()) if self.mode == 'validation': multiple_of = schema.get('multiple_of') le = schema.get('le') @@ -764,9 +661,6 @@ class GenerateJsonSchema: """ json_schema = {'type': 'string'} self.update_with_validations(json_schema, schema, self.ValidationsMapping.string) - if isinstance(json_schema.get('pattern'), Pattern): - # TODO: should we add regex flags to the pattern? - json_schema['pattern'] = json_schema.get('pattern').pattern # type: ignore return json_schema def bytes_schema(self, schema: core_schema.BytesSchema) -> JsonSchemaValue: @@ -791,7 +685,9 @@ class GenerateJsonSchema: Returns: The generated JSON schema. """ - return {'type': 'string', 'format': 'date'} + json_schema = {'type': 'string', 'format': 'date'} + self.update_with_validations(json_schema, schema, self.ValidationsMapping.date) + return json_schema def time_schema(self, schema: core_schema.TimeSchema) -> JsonSchemaValue: """Generates a JSON schema that matches a time value. @@ -837,80 +733,32 @@ class GenerateJsonSchema: Returns: The generated JSON schema. """ - expected = [to_jsonable_python(v.value if isinstance(v, Enum) else v) for v in schema['expected']] + expected = [v.value if isinstance(v, Enum) else v for v in schema['expected']] + # jsonify the expected values + expected = [to_jsonable_python(v) for v in expected] - result: dict[str, Any] = {} if len(expected) == 1: - result['const'] = expected[0] - else: - result['enum'] = expected + return {'const': expected[0]} types = {type(e) for e in expected} if types == {str}: - result['type'] = 'string' + return {'enum': expected, 'type': 'string'} elif types == {int}: - result['type'] = 'integer' + return {'enum': expected, 'type': 'integer'} elif types == {float}: - result['type'] = 'number' + return {'enum': expected, 'type': 'number'} elif types == {bool}: - result['type'] = 'boolean' + return {'enum': expected, 'type': 'boolean'} elif types == {list}: - result['type'] = 'array' - elif types == {type(None)}: - result['type'] = 'null' - return result - - def missing_sentinel_schema(self, schema: core_schema.MissingSentinelSchema) -> JsonSchemaValue: - """Generates a JSON schema that matches the `MISSING` sentinel value. - - Args: - schema: The core schema. - - Returns: - The generated JSON schema. - """ - raise PydanticOmit - - def enum_schema(self, schema: core_schema.EnumSchema) -> JsonSchemaValue: - """Generates a JSON schema that matches an Enum value. - - Args: - schema: The core schema. - - Returns: - The generated JSON schema. - """ - enum_type = schema['cls'] - description = None if not enum_type.__doc__ else inspect.cleandoc(enum_type.__doc__) - if ( - description == 'An enumeration.' - ): # This is the default value provided by enum.EnumMeta.__new__; don't use it - description = None - result: dict[str, Any] = {'title': enum_type.__name__, 'description': description} - result = {k: v for k, v in result.items() if v is not None} - - expected = [to_jsonable_python(v.value) for v in schema['members']] - - result['enum'] = expected - - types = {type(e) for e in expected} - if isinstance(enum_type, str) or types == {str}: - result['type'] = 'string' - elif isinstance(enum_type, int) or types == {int}: - result['type'] = 'integer' - elif isinstance(enum_type, float) or types == {float}: - result['type'] = 'number' - elif types == {bool}: - result['type'] = 'boolean' - elif types == {list}: - result['type'] = 'array' - - return result + return {'enum': expected, 'type': 'array'} + # there is not None case because if it's mixed it hits the final `else` + # if it's a single Literal[None] then it becomes a `const` schema above + else: + return {'enum': expected} def is_instance_schema(self, schema: core_schema.IsInstanceSchema) -> JsonSchemaValue: - """Handles JSON schema generation for a core schema that checks if a value is an instance of a class. - - Unless overridden in a subclass, this raises an error. + """Generates a JSON schema that checks if a value is an instance of a class, equivalent to Python's + `isinstance` method. Args: schema: The core schema. @@ -921,9 +769,8 @@ class GenerateJsonSchema: return self.handle_invalid_for_json_schema(schema, f'core_schema.IsInstanceSchema ({schema["cls"]})') def is_subclass_schema(self, schema: core_schema.IsSubclassSchema) -> JsonSchemaValue: - """Handles JSON schema generation for a core schema that checks if a value is a subclass of a class. - - For backwards compatibility with v1, this does not raise an error, but can be overridden to change this. + """Generates a JSON schema that checks if a value is a subclass of a class, equivalent to Python's `issubclass` + method. Args: schema: The core schema. @@ -937,8 +784,6 @@ class GenerateJsonSchema: def callable_schema(self, schema: core_schema.CallableSchema) -> JsonSchemaValue: """Generates a JSON schema that matches a callable value. - Unless overridden in a subclass, this raises an error. - Args: schema: The core schema. @@ -961,31 +806,8 @@ class GenerateJsonSchema: self.update_with_validations(json_schema, schema, self.ValidationsMapping.array) return json_schema - @deprecated('`tuple_positional_schema` is deprecated. Use `tuple_schema` instead.', category=None) - @final - def tuple_positional_schema(self, schema: core_schema.TupleSchema) -> JsonSchemaValue: - """Replaced by `tuple_schema`.""" - warnings.warn( - '`tuple_positional_schema` is deprecated. Use `tuple_schema` instead.', - PydanticDeprecatedSince26, - stacklevel=2, - ) - return self.tuple_schema(schema) - - @deprecated('`tuple_variable_schema` is deprecated. Use `tuple_schema` instead.', category=None) - @final - def tuple_variable_schema(self, schema: core_schema.TupleSchema) -> JsonSchemaValue: - """Replaced by `tuple_schema`.""" - warnings.warn( - '`tuple_variable_schema` is deprecated. Use `tuple_schema` instead.', - PydanticDeprecatedSince26, - stacklevel=2, - ) - return self.tuple_schema(schema) - - def tuple_schema(self, schema: core_schema.TupleSchema) -> JsonSchemaValue: - """Generates a JSON schema that matches a tuple schema e.g. `tuple[int, - str, bool]` or `tuple[int, ...]`. + def tuple_positional_schema(self, schema: core_schema.TuplePositionalSchema) -> JsonSchemaValue: + """Generates a JSON schema that matches a positional tuple schema e.g. `Tuple[int, str, bool]`. Args: schema: The core schema. @@ -994,27 +816,28 @@ class GenerateJsonSchema: The generated JSON schema. """ json_schema: JsonSchemaValue = {'type': 'array'} - if 'variadic_item_index' in schema: - variadic_item_index = schema['variadic_item_index'] - if variadic_item_index > 0: - json_schema['minItems'] = variadic_item_index - json_schema['prefixItems'] = [ - self.generate_inner(item) for item in schema['items_schema'][:variadic_item_index] - ] - if variadic_item_index + 1 == len(schema['items_schema']): - # if the variadic item is the last item, then represent it faithfully - json_schema['items'] = self.generate_inner(schema['items_schema'][variadic_item_index]) - else: - # otherwise, 'items' represents the schema for the variadic - # item plus the suffix, so just allow anything for simplicity - # for now - json_schema['items'] = True + json_schema['minItems'] = len(schema['items_schema']) + prefixItems = [self.generate_inner(item) for item in schema['items_schema']] + if prefixItems: + json_schema['prefixItems'] = prefixItems + if 'extras_schema' in schema: + json_schema['items'] = self.generate_inner(schema['extras_schema']) else: - prefixItems = [self.generate_inner(item) for item in schema['items_schema']] - if prefixItems: - json_schema['prefixItems'] = prefixItems - json_schema['minItems'] = len(prefixItems) - json_schema['maxItems'] = len(prefixItems) + json_schema['maxItems'] = len(schema['items_schema']) + self.update_with_validations(json_schema, schema, self.ValidationsMapping.array) + return json_schema + + def tuple_variable_schema(self, schema: core_schema.TupleVariableSchema) -> JsonSchemaValue: + """Generates a JSON schema that matches a variable tuple schema e.g. `Tuple[int, ...]`. + + Args: + schema: The core schema. + + Returns: + The generated JSON schema. + """ + items_schema = {} if 'items_schema' not in schema else self.generate_inner(schema['items_schema']) + json_schema = {'type': 'array', 'items': items_schema} self.update_with_validations(json_schema, schema, self.ValidationsMapping.array) return json_schema @@ -1072,42 +895,33 @@ class GenerateJsonSchema: json_schema: JsonSchemaValue = {'type': 'object'} keys_schema = self.generate_inner(schema['keys_schema']).copy() if 'keys_schema' in schema else {} - if '$ref' not in keys_schema: - keys_pattern = keys_schema.pop('pattern', None) - # Don't give a title to patternProperties/propertyNames: - keys_schema.pop('title', None) - else: - # Here, we assume that if the keys schema is a definition reference, - # it can't be a simple string core schema (and thus no pattern can exist). - # However, this is only in practice (in theory, a definition reference core - # schema could be generated for a simple string schema). - # Note that we avoid calling `self.resolve_ref_schema`, as it might not exist yet. - keys_pattern = None + keys_pattern = keys_schema.pop('pattern', None) values_schema = self.generate_inner(schema['values_schema']).copy() if 'values_schema' in schema else {} - # don't give a title to additionalProperties: - values_schema.pop('title', None) - - if values_schema or keys_pattern is not None: + values_schema.pop('title', None) # don't give a title to the additionalProperties + if values_schema or keys_pattern is not None: # don't add additionalProperties if it's empty if keys_pattern is None: json_schema['additionalProperties'] = values_schema else: json_schema['patternProperties'] = {keys_pattern: values_schema} - else: # for `dict[str, Any]`, we allow any key and any value, since `str` is the default key type - json_schema['additionalProperties'] = True - - if ( - # The len check indicates that constraints are probably present: - (keys_schema.get('type') == 'string' and len(keys_schema) > 1) - # If this is a definition reference schema, it most likely has constraints: - or '$ref' in keys_schema - ): - keys_schema.pop('type', None) - json_schema['propertyNames'] = keys_schema self.update_with_validations(json_schema, schema, self.ValidationsMapping.object) return json_schema + def _function_schema( + self, + schema: _core_utils.AnyFunctionSchema, + ) -> JsonSchemaValue: + if _core_utils.is_function_with_inner_schema(schema): + # This could be wrong if the function's mode is 'before', but in practice will often be right, and when it + # isn't, I think it would be hard to automatically infer what the desired schema should be. + return self.generate_inner(schema['schema']) + + # function-plain + return self.handle_invalid_for_json_schema( + schema, f'core_schema.PlainValidatorFunctionSchema ({schema["function"]})' + ) + def function_before_schema(self, schema: core_schema.BeforeValidatorFunctionSchema) -> JsonSchemaValue: """Generates a JSON schema that matches a function-before schema. @@ -1117,10 +931,7 @@ class GenerateJsonSchema: Returns: The generated JSON schema. """ - if self.mode == 'validation' and (input_schema := schema.get('json_schema_input_schema')): - return self.generate_inner(input_schema) - - return self.generate_inner(schema['schema']) + return self._function_schema(schema) def function_after_schema(self, schema: core_schema.AfterValidatorFunctionSchema) -> JsonSchemaValue: """Generates a JSON schema that matches a function-after schema. @@ -1131,7 +942,7 @@ class GenerateJsonSchema: Returns: The generated JSON schema. """ - return self.generate_inner(schema['schema']) + return self._function_schema(schema) def function_plain_schema(self, schema: core_schema.PlainValidatorFunctionSchema) -> JsonSchemaValue: """Generates a JSON schema that matches a function-plain schema. @@ -1142,12 +953,7 @@ class GenerateJsonSchema: Returns: The generated JSON schema. """ - if self.mode == 'validation' and (input_schema := schema.get('json_schema_input_schema')): - return self.generate_inner(input_schema) - - return self.handle_invalid_for_json_schema( - schema, f'core_schema.PlainValidatorFunctionSchema ({schema["function"]})' - ) + return self._function_schema(schema) def function_wrap_schema(self, schema: core_schema.WrapValidatorFunctionSchema) -> JsonSchemaValue: """Generates a JSON schema that matches a function-wrap schema. @@ -1158,10 +964,7 @@ class GenerateJsonSchema: Returns: The generated JSON schema. """ - if self.mode == 'validation' and (input_schema := schema.get('json_schema_input_schema')): - return self.generate_inner(input_schema) - - return self.generate_inner(schema['schema']) + return self._function_schema(schema) def default_schema(self, schema: core_schema.WithDefaultSchema) -> JsonSchemaValue: """Generates a JSON schema that matches a schema with a default value. @@ -1174,35 +977,17 @@ class GenerateJsonSchema: """ json_schema = self.generate_inner(schema['schema']) - default = self.get_default_value(schema) - if default is NoDefault or default is MISSING: + if 'default' not in schema: return json_schema - - # we reflect the application of custom plain, no-info serializers to defaults for - # JSON Schemas viewed in serialization mode: - # TODO: improvements along with https://github.com/pydantic/pydantic/issues/8208 - if self.mode == 'serialization': - # `_get_ser_schema_for_default_value()` is used to unpack potentially nested validator schemas: - ser_schema = _get_ser_schema_for_default_value(schema['schema']) - if ( - ser_schema is not None - and (ser_func := ser_schema.get('function')) - and not (default is None and ser_schema.get('when_used') in ('unless-none', 'json-unless-none')) - ): - try: - default = ser_func(default) # type: ignore - except Exception: - # It might be that the provided default needs to be validated (read: parsed) first - # (assuming `validate_default` is enabled). However, we can't perform - # such validation during JSON Schema generation so we don't support - # this pattern for now. - # (One example is when using `foo: ByteSize = '1MB'`, which validates and - # serializes as an int. In this case, `ser_func` is `int` and `int('1MB')` fails). - self.emit_warning( - 'non-serializable-default', - f'Unable to serialize value {default!r} with the plain serializer; excluding default from JSON schema', - ) - return json_schema + default = schema['default'] + # Note: if you want to include the value returned by the default_factory, + # override this method and replace the code above with: + # if 'default' in schema: + # default = schema['default'] + # elif 'default_factory' in schema: + # default = schema['default_factory']() + # else: + # return json_schema try: encoded_default = self.encode_default(default) @@ -1214,23 +999,12 @@ class GenerateJsonSchema: # Return the inner schema, as though there was no default return json_schema - json_schema['default'] = encoded_default - return json_schema - - def get_default_value(self, schema: core_schema.WithDefaultSchema) -> Any: - """Get the default value to be used when generating a JSON Schema for a core schema with a default. - - The default implementation is to use the statically defined default value. This method can be overridden - if you want to make use of the default factory. - - Args: - schema: The `'with-default'` core schema. - - Returns: - The default value to use, or [`NoDefault`][pydantic.json_schema.NoDefault] if no default - value is available. - """ - return schema.get('default', NoDefault) + if '$ref' in json_schema: + # Since reference schemas do not support child keys, we wrap the reference schema in a single-case allOf: + return {'allOf': [json_schema], 'default': encoded_default} + else: + json_schema['default'] = encoded_default + return json_schema def nullable_schema(self, schema: core_schema.NullableSchema) -> JsonSchemaValue: """Generates a JSON schema that matches a schema that allows null values. @@ -1247,7 +1021,9 @@ class GenerateJsonSchema: if inner_json_schema == null_schema: return null_schema else: - return self.get_union_of_schemas([inner_json_schema, null_schema]) + # Thanks to the equality check against `null_schema` above, I think 'oneOf' would also be valid here; + # I'll use 'anyOf' for now, but it could be changed it if it would work better with some external tooling + return self.get_flattened_anyof([inner_json_schema, null_schema]) def union_schema(self, schema: core_schema.UnionSchema) -> JsonSchemaValue: """Generates a JSON schema that matches a schema that allows values matching any of the given schemas. @@ -1272,43 +1048,7 @@ class GenerateJsonSchema: self.emit_warning('skipped-choice', exc.message) if len(generated) == 1: return generated[0] - return self.get_union_of_schemas(generated) - - def get_union_of_schemas(self, schemas: list[JsonSchemaValue]) -> JsonSchemaValue: - """Returns the JSON Schema representation for the union of the provided JSON Schemas. - - The result depends on the configured `'union_format'`. - - Args: - schemas: The list of JSON Schemas to be included in the union. - - Returns: - The JSON Schema representing the union of schemas. - """ - if self.union_format == 'primitive_type_array': - types: list[str] = [] - for schema in schemas: - schema_types: list[str] | str | None = schema.get('type') - if schema_types is None: - # No type, meaning it can be a ref or an empty schema. - break - if not isinstance(schema_types, list): - schema_types = [schema_types] - if not all(t in _PRIMITIVE_JSON_SCHEMA_TYPES for t in schema_types): - break - if len(schema) != 1: - # We only want to include types that don't have any constraints. For instance, - # if `schemas = [{'type': 'string', 'maxLength': 3}, {'type': 'string', 'minLength': 5}]`, - # we don't want to produce `{'type': 'string', 'maxLength': 3, 'minLength': 5}`. - # Same if we have some metadata (e.g. `title`) on a specific union member, we want to preserve it. - break - - types.extend(schema_types) - else: - # If we got there, all the schemas where valid to be used with the `'primitive_type_array` format - return {'type': list(dict.fromkeys(types))} - - return self.get_flattened_anyof(schemas) + return self.get_flattened_anyof(generated) def tagged_union_schema(self, schema: core_schema.TaggedUnionSchema) -> JsonSchemaValue: """Generates a JSON schema that matches a schema that allows values matching any of the given schemas, where @@ -1375,14 +1115,9 @@ class GenerateJsonSchema: continue # this means that the "alias" does not represent a field alias_is_present_on_all_choices = True for choice in one_of_choices: - try: - choice = self.resolve_ref_schema(choice) - except RuntimeError as exc: - # TODO: fixme - this is a workaround for the fact that we can't always resolve refs - # for tagged union choices at this point in the schema gen process, we might need to do - # another pass at the end like we do for core schemas - self.emit_warning('skipped-discriminator', str(exc)) - choice = {} + while '$ref' in choice: + assert isinstance(choice['$ref'], str) + choice = self.get_schema_from_definitions(JsonRef(choice['$ref'])) or {} properties = choice.get('properties', {}) if not isinstance(properties, dict) or alias not in properties: alias_is_present_on_all_choices = False @@ -1458,35 +1193,18 @@ class GenerateJsonSchema: ] if self.mode == 'serialization': named_required_fields.extend(self._name_required_computed_fields(schema.get('computed_fields', []))) - cls = schema.get('cls') - config = _get_typed_dict_config(cls) + + config = _get_typed_dict_config(schema) with self._config_wrapper_stack.push(config): json_schema = self._named_required_fields_schema(named_required_fields) - # There's some duplication between `extra_behavior` and - # the config's `extra`/core config's `extra_fields_behavior`. - # However, it is common to manually create TypedDictSchemas, - # where you don't necessarily have a class. - # At runtime, `extra_behavior` takes priority over the config - # for validation, so follow the same for the JSON Schema: - if schema.get('extra_behavior') == 'forbid': + extra = schema.get('extra_behavior') + if extra is None: + extra = config.get('extra', 'ignore') + if extra == 'forbid': json_schema['additionalProperties'] = False - elif schema.get('extra_behavior') == 'allow': - if 'extras_schema' in schema and schema['extras_schema'] != {'type': 'any'}: - json_schema['additionalProperties'] = self.generate_inner(schema['extras_schema']) - else: - json_schema['additionalProperties'] = True - - if cls is not None: - # `_update_class_schema()` will not override - # `additionalProperties` if already present: - self._update_class_schema(json_schema, cls, config) - elif 'additionalProperties' not in json_schema: - extra = schema.get('config', {}).get('extra_fields_behavior') - if extra == 'forbid': - json_schema['additionalProperties'] = False - elif extra == 'allow': - json_schema['additionalProperties'] = True + elif extra == 'allow': + json_schema['additionalProperties'] = True return json_schema @@ -1599,56 +1317,13 @@ class GenerateJsonSchema: # because it could lead to inconsistent refs handling, etc. cls = cast('type[BaseModel]', schema['cls']) config = cls.model_config + title = config.get('title') with self._config_wrapper_stack.push(config): json_schema = self.generate_inner(schema['schema']) - self._update_class_schema(json_schema, cls, config) - - return json_schema - - def _update_class_schema(self, json_schema: JsonSchemaValue, cls: type[Any], config: ConfigDict) -> None: - """Update json_schema with the following, extracted from `config` and `cls`: - - * title - * description - * additional properties - * json_schema_extra - * deprecated - - Done in place, hence there's no return value as the original json_schema is mutated. - No ref resolving is involved here, as that's not appropriate for simple updates. - """ - from .main import BaseModel - from .root_model import RootModel - - if (config_title := config.get('title')) is not None: - json_schema.setdefault('title', config_title) - elif model_title_generator := config.get('model_title_generator'): - title = model_title_generator(cls) - if not isinstance(title, str): - raise TypeError(f'model_title_generator {model_title_generator} must return str, not {title.__class__}') - json_schema.setdefault('title', title) - if 'title' not in json_schema: - json_schema['title'] = cls.__name__ - - # BaseModel and dataclasses; don't use cls.__doc__ as it will contain the verbose class signature by default - docstring = None if cls is BaseModel or dataclasses.is_dataclass(cls) else cls.__doc__ - - if docstring: - json_schema.setdefault('description', inspect.cleandoc(docstring)) - elif issubclass(cls, RootModel) and (root_description := cls.__pydantic_fields__['root'].description): - json_schema.setdefault('description', root_description) - - extra = config.get('extra') - if 'additionalProperties' not in json_schema: # This check is particularly important for `typed_dict_schema()` - if extra == 'allow': - json_schema['additionalProperties'] = True - elif extra == 'forbid': - json_schema['additionalProperties'] = False - json_schema_extra = config.get('json_schema_extra') - if issubclass(cls, BaseModel) and cls.__pydantic_root_model__: + if cls.__pydantic_root_model__: root_json_schema_extra = cls.model_fields['root'].json_schema_extra if json_schema_extra and root_json_schema_extra: raise ValueError( @@ -1658,27 +1333,52 @@ class GenerateJsonSchema: if root_json_schema_extra: json_schema_extra = root_json_schema_extra + json_schema = self._update_class_schema(json_schema, title, config.get('extra', None), cls, json_schema_extra) + + return json_schema + + def _update_class_schema( + self, + json_schema: JsonSchemaValue, + title: str | None, + extra: Literal['allow', 'ignore', 'forbid'] | None, + cls: type[Any], + json_schema_extra: JsonDict | JsonSchemaExtraCallable | None, + ) -> JsonSchemaValue: + if '$ref' in json_schema: + schema_to_update = self.get_schema_from_definitions(JsonRef(json_schema['$ref'])) or json_schema + else: + schema_to_update = json_schema + + if title is not None: + # referenced_schema['title'] = title + schema_to_update.setdefault('title', title) + + if 'additionalProperties' not in schema_to_update: + if extra == 'allow': + schema_to_update['additionalProperties'] = True + elif extra == 'forbid': + schema_to_update['additionalProperties'] = False + if isinstance(json_schema_extra, (staticmethod, classmethod)): # In older versions of python, this is necessary to ensure staticmethod/classmethods are callable json_schema_extra = json_schema_extra.__get__(cls) if isinstance(json_schema_extra, dict): - json_schema.update(json_schema_extra) + schema_to_update.update(json_schema_extra) elif callable(json_schema_extra): - # FIXME: why are there type ignores here? We support two signatures for json_schema_extra callables... if len(inspect.signature(json_schema_extra).parameters) > 1: - json_schema_extra(json_schema, cls) # type: ignore + json_schema_extra(schema_to_update, cls) # type: ignore else: - json_schema_extra(json_schema) # type: ignore + json_schema_extra(schema_to_update) # type: ignore elif json_schema_extra is not None: raise ValueError( f"model_config['json_schema_extra']={json_schema_extra} should be a dict, callable, or None" ) - if hasattr(cls, '__deprecated__'): - json_schema['deprecated'] = True + return json_schema - def resolve_ref_schema(self, json_schema: JsonSchemaValue) -> JsonSchemaValue: + def resolve_schema_to_update(self, json_schema: JsonSchemaValue) -> JsonSchemaValue: """Resolve a JsonSchemaValue to the non-ref schema if it is a $ref schema. Args: @@ -1686,17 +1386,15 @@ class GenerateJsonSchema: Returns: The resolved schema. - - Raises: - RuntimeError: If the schema reference can't be found in definitions. """ - while '$ref' in json_schema: - ref = json_schema['$ref'] - schema_to_update = self.get_schema_from_definitions(JsonRef(ref)) + if '$ref' in json_schema: + schema_to_update = self.get_schema_from_definitions(JsonRef(json_schema['$ref'])) if schema_to_update is None: - raise RuntimeError(f'Cannot update undefined schema for $ref={ref}') - json_schema = schema_to_update - return json_schema + raise RuntimeError(f'Cannot update undefined schema for $ref={json_schema["$ref"]}') + return self.resolve_schema_to_update(schema_to_update) + else: + schema_to_update = json_schema + return schema_to_update def model_fields_schema(self, schema: core_schema.ModelFieldsSchema) -> JsonSchemaValue: """Generates a JSON schema that matches a schema that defines a model's fields. @@ -1717,7 +1415,7 @@ class GenerateJsonSchema: json_schema = self._named_required_fields_schema(named_required_fields) extras_schema = schema.get('extras_schema', None) if extras_schema is not None: - schema_to_update = self.resolve_ref_schema(json_schema) + schema_to_update = self.resolve_schema_to_update(json_schema) schema_to_update['additionalProperties'] = self.generate_inner(extras_schema) return json_schema @@ -1756,19 +1454,13 @@ class GenerateJsonSchema: Returns: `True` if the field should be marked as required in the generated JSON schema, `False` otherwise. """ - if field['type'] == 'typed-dict-field': - required = field.get('required', total) + if self.mode == 'serialization' and self._config.json_schema_serialization_defaults_required: + return not field.get('serialization_exclude') else: - required = field['schema']['type'] != 'default' - - if self.mode == 'serialization': - has_exclude_if = field.get('serialization_exclude_if') is not None - if self._config.json_schema_serialization_defaults_required: - return not has_exclude_if + if field['type'] == 'typed-dict-field': + return field.get('required', total) else: - return required and not has_exclude_if - else: - return required + return field['schema']['type'] != 'default' def dataclass_args_schema(self, schema: core_schema.DataclassArgsSchema) -> JsonSchemaValue: """Generates a JSON schema that matches a schema that defines a dataclass's constructor arguments. @@ -1797,18 +1489,18 @@ class GenerateJsonSchema: Returns: The generated JSON schema. """ - from ._internal._dataclasses import is_stdlib_dataclass - cls = schema['cls'] config: ConfigDict = getattr(cls, '__pydantic_config__', cast('ConfigDict', {})) + title = config.get('title') or cls.__name__ with self._config_wrapper_stack.push(config): json_schema = self.generate_inner(schema['schema']).copy() - self._update_class_schema(json_schema, cls, config) + json_schema_extra = config.get('json_schema_extra') + json_schema = self._update_class_schema(json_schema, title, config.get('extra', None), cls, json_schema_extra) # Dataclass-specific handling of description - if is_stdlib_dataclass(cls): + if is_dataclass(cls) and not hasattr(cls, '__pydantic_validator__'): # vanilla dataclass; don't use cls.__doc__ as it will contain the class signature by default description = None else: @@ -1827,7 +1519,8 @@ class GenerateJsonSchema: Returns: The generated JSON schema. """ - prefer_positional = schema.get('metadata', {}).get('pydantic_js_prefer_positional_arguments') + metadata = _core_metadata.CoreMetadataHandler(schema).metadata + prefer_positional = metadata.get('pydantic_js_prefer_positional_arguments') arguments = schema['arguments_schema'] kw_only_arguments = [a for a in arguments if a.get('mode') == 'keyword_only'] @@ -1850,7 +1543,9 @@ class GenerateJsonSchema: if positional_possible: return self.p_arguments_schema(p_only_arguments + kw_or_p_arguments, var_args_schema) - raise PydanticInvalidForJsonSchema( + # TODO: When support for Python 3.7 is dropped, uncomment the block on `test_json_schema` + # to cover this test case. + raise PydanticInvalidForJsonSchema( # pragma: no cover 'Unable to generate JSON schema for arguments validator with positional-only and keyword-only arguments' ) @@ -1870,8 +1565,7 @@ class GenerateJsonSchema: for argument in arguments: name = self.get_argument_name(argument) argument_schema = self.generate_inner(argument['schema']).copy() - if 'title' not in argument_schema and self.field_title_should_be_set(argument['schema']): - argument_schema['title'] = self.get_title_from_name(name) + argument_schema['title'] = self.get_title_from_name(name) properties[name] = argument_schema if argument['schema']['type'] != 'default': @@ -1910,8 +1604,7 @@ class GenerateJsonSchema: name = self.get_argument_name(argument) argument_schema = self.generate_inner(argument['schema']).copy() - if 'title' not in argument_schema and self.field_title_should_be_set(argument['schema']): - argument_schema['title'] = self.get_title_from_name(name) + argument_schema['title'] = self.get_title_from_name(name) prefix_items.append(argument_schema) if argument['schema']['type'] != 'default': @@ -1920,9 +1613,7 @@ class GenerateJsonSchema: # I believe this is true, but I am not 100% sure min_items += 1 - json_schema: JsonSchemaValue = {'type': 'array'} - if prefix_items: - json_schema['prefixItems'] = prefix_items + json_schema: JsonSchemaValue = {'type': 'array', 'prefixItems': prefix_items} if min_items: json_schema['minItems'] = min_items @@ -1935,7 +1626,7 @@ class GenerateJsonSchema: return json_schema - def get_argument_name(self, argument: core_schema.ArgumentsParameter | core_schema.ArgumentsV3Parameter) -> str: + def get_argument_name(self, argument: core_schema.ArgumentsParameter) -> str: """Retrieves the name of an argument. Args: @@ -1953,45 +1644,6 @@ class GenerateJsonSchema: pass # might want to do something else? return name - def arguments_v3_schema(self, schema: core_schema.ArgumentsV3Schema) -> JsonSchemaValue: - """Generates a JSON schema that matches a schema that defines a function's arguments. - - Args: - schema: The core schema. - - Returns: - The generated JSON schema. - """ - arguments = schema['arguments_schema'] - properties: dict[str, JsonSchemaValue] = {} - required: list[str] = [] - for argument in arguments: - mode = argument.get('mode', 'positional_or_keyword') - name = self.get_argument_name(argument) - argument_schema = self.generate_inner(argument['schema']).copy() - if mode == 'var_args': - argument_schema = {'type': 'array', 'items': argument_schema} - elif mode == 'var_kwargs_uniform': - argument_schema = {'type': 'object', 'additionalProperties': argument_schema} - - argument_schema.setdefault('title', self.get_title_from_name(name)) - properties[name] = argument_schema - - if ( - (mode == 'var_kwargs_unpacked_typed_dict' and 'required' in argument_schema) - or mode not in {'var_args', 'var_kwargs_uniform', 'var_kwargs_unpacked_typed_dict'} - and argument['schema']['type'] != 'default' - ): - # This assumes that if the argument has a default value, - # the inner schema must be of type WithDefaultSchema. - # I believe this is true, but I am not 100% sure - required.append(name) - - json_schema: JsonSchemaValue = {'type': 'object', 'properties': properties} - if required: - json_schema['required'] = required - return json_schema - def call_schema(self, schema: core_schema.CallSchema) -> JsonSchemaValue: """Generates a JSON schema that matches a schema that defines a function call. @@ -2081,7 +1733,7 @@ class GenerateJsonSchema: for definition in schema['definitions']: try: self.generate_inner(definition) - except PydanticInvalidForJsonSchema as e: # noqa: PERF203 + except PydanticInvalidForJsonSchema as e: core_ref: CoreRef = CoreRef(definition['ref']) # type: ignore self._core_defs_invalid_for_json_schema[self.get_defs_ref((core_ref, self.mode))] = e continue @@ -2125,22 +1777,6 @@ class GenerateJsonSchema: return self.generate_inner(schema['schema']) return None - def complex_schema(self, schema: core_schema.ComplexSchema) -> JsonSchemaValue: - """Generates a JSON schema that matches a complex number. - - JSON has no standard way to represent complex numbers. Complex number is not a numeric - type. Here we represent complex number as strings following the rule defined by Python. - For instance, '1+2j' is an accepted complex string. Details can be found in - [Python's `complex` documentation][complex]. - - Args: - schema: The core schema. - - Returns: - The generated JSON schema. - """ - return {'type': 'string'} - # ### Utility methods def get_title_from_name(self, name: str) -> str: @@ -2152,7 +1788,7 @@ class GenerateJsonSchema: Returns: The title. """ - return name.title().replace('_', ' ').strip() + return name.title().replace('_', ' ') def field_title_should_be_set(self, schema: CoreSchemaOrField) -> bool: """Returns true if a field with the given schema should have a title set based on the field name. @@ -2277,13 +1913,14 @@ class GenerateJsonSchema: return defs_ref, ref_json_schema def handle_ref_overrides(self, json_schema: JsonSchemaValue) -> JsonSchemaValue: - """Remove any sibling keys that are redundant with the referenced schema. + """It is not valid for a schema with a top-level $ref to have sibling keys. - Args: - json_schema: The schema to remove redundant sibling keys from. + During our own schema generation, we treat sibling keys as overrides to the referenced schema, + but this is not how the official JSON schema spec works. - Returns: - The schema with redundant sibling keys removed. + Because of this, we first remove any sibling keys that are redundant with the referenced schema, then if + any remain, we transform the schema from a top-level '$ref' to use allOf to move the $ref out of the top level. + (See bottom of https://swagger.io/docs/specification/using-ref/ for a reference about this behavior) """ if '$ref' in json_schema: # prevent modifications to the input; this copy may be safe to drop if there is significant overhead @@ -2294,25 +1931,33 @@ class GenerateJsonSchema: # This can happen when building schemas for models with not-yet-defined references. # It may be a good idea to do a recursive pass at the end of the generation to remove # any redundant override keys. + if len(json_schema) > 1: + # Make it an allOf to at least resolve the sibling keys issue + json_schema = json_schema.copy() + json_schema.setdefault('allOf', []) + json_schema['allOf'].append({'$ref': json_schema['$ref']}) + del json_schema['$ref'] + return json_schema for k, v in list(json_schema.items()): if k == '$ref': continue if k in referenced_json_schema and referenced_json_schema[k] == v: del json_schema[k] # redundant key + if len(json_schema) > 1: + # There is a remaining "override" key, so we need to move $ref out of the top level + json_ref = JsonRef(json_schema['$ref']) + del json_schema['$ref'] + assert 'allOf' not in json_schema # this should never happen, but just in case + json_schema['allOf'] = [{'$ref': json_ref}] return json_schema def get_schema_from_definitions(self, json_ref: JsonRef) -> JsonSchemaValue | None: - try: - def_ref = self.json_to_defs_refs[json_ref] - if def_ref in self._core_defs_invalid_for_json_schema: - raise self._core_defs_invalid_for_json_schema[def_ref] - return self.definitions.get(def_ref, None) - except KeyError: - if json_ref.startswith(('http://', 'https://')): - return None - raise + def_ref = self.json_to_defs_refs[json_ref] + if def_ref in self._core_defs_invalid_for_json_schema: + raise self._core_defs_invalid_for_json_schema[def_ref] + return self.definitions.get(def_ref, None) def encode_default(self, dft: Any) -> Any: """Encode a default value to a JSON-serializable value. @@ -2325,22 +1970,11 @@ class GenerateJsonSchema: Returns: The encoded default value. """ - from .type_adapter import TypeAdapter, _type_has_config - config = self._config - try: - default = ( - dft - if _type_has_config(type(dft)) - else TypeAdapter(type(dft), config=config.config_dict).dump_python( - dft, by_alias=self.by_alias, mode='json' - ) - ) - except PydanticSchemaGenerationError: - raise pydantic_core.PydanticSerializationError(f'Unable to encode default value {dft}') - return pydantic_core.to_jsonable_python( - default, timedelta_mode=config.ser_json_timedelta, bytes_mode=config.ser_json_bytes, by_alias=self.by_alias + dft, + timedelta_mode=config.ser_json_timedelta, + bytes_mode=config.ser_json_bytes, ) def update_with_validations( @@ -2389,6 +2023,12 @@ class GenerateJsonSchema: 'min_length': 'minProperties', 'max_length': 'maxProperties', } + date = { + 'le': 'maximum', + 'ge': 'minimum', + 'lt': 'exclusiveMaximum', + 'gt': 'exclusiveMinimum', + } def get_flattened_anyof(self, schemas: list[JsonSchemaValue]) -> JsonSchemaValue: members = [] @@ -2416,20 +2056,12 @@ class GenerateJsonSchema: json_refs[json_ref] += 1 if already_visited: return # prevent recursion on a definition that was already visited - try: - defs_ref = self.json_to_defs_refs[json_ref] - if defs_ref in self._core_defs_invalid_for_json_schema: - raise self._core_defs_invalid_for_json_schema[defs_ref] - _add_json_refs(self.definitions[defs_ref]) - except KeyError: - if not json_ref.startswith(('http://', 'https://')): - raise + defs_ref = self.json_to_defs_refs[json_ref] + if defs_ref in self._core_defs_invalid_for_json_schema: + raise self._core_defs_invalid_for_json_schema[defs_ref] + _add_json_refs(self.definitions[defs_ref]) - for k, v in schema.items(): - if k == 'examples' and isinstance(v, list): - # Skip examples that may contain arbitrary values and references - # (see the comment in `_get_all_json_refs` for more details). - continue + for v in schema.values(): _add_json_refs(v) elif isinstance(schema, list): for v in schema: @@ -2484,15 +2116,11 @@ class GenerateJsonSchema: unvisited_json_refs = _get_all_json_refs(schema) while unvisited_json_refs: next_json_ref = unvisited_json_refs.pop() - try: - next_defs_ref = self.json_to_defs_refs[next_json_ref] - if next_defs_ref in visited_defs_refs: - continue - visited_defs_refs.add(next_defs_ref) - unvisited_json_refs.update(_get_all_json_refs(self.definitions[next_defs_ref])) - except KeyError: - if not next_json_ref.startswith(('http://', 'https://')): - raise + next_defs_ref = self.json_to_defs_refs[next_json_ref] + if next_defs_ref in visited_defs_refs: + continue + visited_defs_refs.add(next_defs_ref) + unvisited_json_refs.update(_get_all_json_refs(self.definitions[next_defs_ref])) self.definitions = {k: v for k, v in self.definitions.items() if k in visited_defs_refs} @@ -2504,7 +2132,6 @@ def model_json_schema( cls: type[BaseModel] | type[PydanticDataclass], by_alias: bool = True, ref_template: str = DEFAULT_REF_TEMPLATE, - union_format: Literal['any_of', 'primitive_type_array'] = 'any_of', schema_generator: type[GenerateJsonSchema] = GenerateJsonSchema, mode: JsonSchemaMode = 'validation', ) -> dict[str, Any]: @@ -2515,14 +2142,6 @@ def model_json_schema( by_alias: If `True` (the default), fields will be serialized according to their alias. If `False`, fields will be serialized according to their attribute name. ref_template: The template to use for generating JSON Schema references. - union_format: The format to use when combining schemas from unions together. Can be one of: - - - `'any_of'`: Use the [`anyOf`](https://json-schema.org/understanding-json-schema/reference/combining#anyOf) - keyword to combine schemas (the default). - - `'primitive_type_array'`: Use the [`type`](https://json-schema.org/understanding-json-schema/reference/type) - keyword as an array of strings, containing each type of the combination. If any of the schemas is not a primitive - type (`string`, `boolean`, `null`, `integer` or `number`) or contains constraints/metadata, falls back to - `any_of`. schema_generator: The class to use for generating the JSON Schema. mode: The mode to use for generating the JSON Schema. It can be one of the following: @@ -2532,19 +2151,10 @@ def model_json_schema( Returns: The generated JSON Schema. """ - from .main import BaseModel - - schema_generator_instance = schema_generator( - by_alias=by_alias, ref_template=ref_template, union_format=union_format - ) - - if isinstance(cls.__pydantic_core_schema__, _mock_val_ser.MockCoreSchema): - cls.__pydantic_core_schema__.rebuild() - - if cls is BaseModel: - raise AttributeError('model_json_schema() must be called on a subclass of BaseModel, not BaseModel itself.') - - assert not isinstance(cls.__pydantic_core_schema__, _mock_val_ser.MockCoreSchema), 'this is a bug! please report it' + schema_generator_instance = schema_generator(by_alias=by_alias, ref_template=ref_template) + if isinstance(cls.__pydantic_validator__, _mock_val_ser.MockValSer): + cls.__pydantic_validator__.rebuild() + assert '__pydantic_core_schema__' in cls.__dict__, 'this is a bug! please report it' return schema_generator_instance.generate(cls.__pydantic_core_schema__, mode=mode) @@ -2555,7 +2165,6 @@ def models_json_schema( title: str | None = None, description: str | None = None, ref_template: str = DEFAULT_REF_TEMPLATE, - union_format: Literal['any_of', 'primitive_type_array'] = 'any_of', schema_generator: type[GenerateJsonSchema] = GenerateJsonSchema, ) -> tuple[dict[tuple[type[BaseModel] | type[PydanticDataclass], JsonSchemaMode], JsonSchemaValue], JsonSchemaValue]: """Utility function to generate a JSON Schema for multiple models. @@ -2566,14 +2175,6 @@ def models_json_schema( title: The title of the generated JSON Schema. description: The description of the generated JSON Schema. ref_template: The reference template to use for generating JSON Schema references. - union_format: The format to use when combining schemas from unions together. Can be one of: - - - `'any_of'`: Use the [`anyOf`](https://json-schema.org/understanding-json-schema/reference/combining#anyOf) - keyword to combine schemas (the default). - - `'primitive_type_array'`: Use the [`type`](https://json-schema.org/understanding-json-schema/reference/type) - keyword as an array of strings, containing each type of the combination. If any of the schemas is not a primitive - type (`string`, `boolean`, `null`, `integer` or `number`) or contains constraints/metadata, falls back to - `any_of`. schema_generator: The schema generator to use for generating the JSON Schema. Returns: @@ -2585,13 +2186,11 @@ def models_json_schema( element, along with the optional title and description keys. """ for cls, _ in models: - if isinstance(cls.__pydantic_core_schema__, _mock_val_ser.MockCoreSchema): - cls.__pydantic_core_schema__.rebuild() + if isinstance(cls.__pydantic_validator__, _mock_val_ser.MockValSer): + cls.__pydantic_validator__.rebuild() - instance = schema_generator(by_alias=by_alias, ref_template=ref_template, union_format=union_format) - inputs: list[tuple[type[BaseModel] | type[PydanticDataclass], JsonSchemaMode, CoreSchema]] = [ - (m, mode, m.__pydantic_core_schema__) for m, mode in models - ] + instance = schema_generator(by_alias=by_alias, ref_template=ref_template) + inputs = [(m, mode, m.__pydantic_core_schema__) for m, mode in models] json_schemas_map, definitions = instance.generate_definitions(inputs) json_schema: dict[str, Any] = {} @@ -2609,7 +2208,7 @@ def models_json_schema( _HashableJsonValue: TypeAlias = Union[ - int, float, str, bool, None, tuple['_HashableJsonValue', ...], tuple[tuple[str, '_HashableJsonValue'], ...] + int, float, str, bool, None, Tuple['_HashableJsonValue', ...], Tuple[Tuple[str, '_HashableJsonValue'], ...] ] @@ -2626,12 +2225,27 @@ def _make_json_hashable(value: JsonValue) -> _HashableJsonValue: return value +def _sort_json_schema(value: JsonSchemaValue, parent_key: str | None = None) -> JsonSchemaValue: + if isinstance(value, dict): + sorted_dict: dict[str, JsonSchemaValue] = {} + keys = value.keys() + if (parent_key != 'properties') and (parent_key != 'default'): + keys = sorted(keys) + for key in keys: + sorted_dict[key] = _sort_json_schema(value[key], parent_key=key) + return sorted_dict + elif isinstance(value, list): + sorted_list: list[JsonSchemaValue] = [] + for item in value: # type: ignore + sorted_list.append(_sort_json_schema(item, parent_key)) + return sorted_list # type: ignore + else: + return value + + @dataclasses.dataclass(**_internal_dataclass.slots_true) class WithJsonSchema: - """!!! abstract "Usage Documentation" - [`WithJsonSchema` Annotation](../concepts/json_schema.md#withjsonschema-annotation) - - Add this as an annotation on a field to override the (base) JSON schema that would be generated for that field. + """Add this as an annotation on a field to override the (base) JSON schema that would be generated for that field. This provides a way to set a JSON schema for types that would otherwise raise errors when producing a JSON schema, such as Callable, or types that have an is-instance core schema, without needing to go so far as creating a custom subclass of pydantic.json_schema.GenerateJsonSchema. @@ -2655,42 +2269,25 @@ class WithJsonSchema: # This exception is handled in pydantic.json_schema.GenerateJsonSchema._named_required_fields_schema raise PydanticOmit else: - return self.json_schema.copy() + return self.json_schema def __hash__(self) -> int: return hash(type(self.mode)) +@dataclasses.dataclass(**_internal_dataclass.slots_true) class Examples: """Add examples to a JSON schema. - If the JSON Schema already contains examples, the provided examples - will be appended. + Examples should be a map of example names (strings) + to example values (any valid JSON). If `mode` is set this will only apply to that schema generation mode, allowing you to add different examples for validation and serialization. """ - @overload - @deprecated('Using a dict for `examples` is deprecated since v2.9 and will be removed in v3.0. Use a list instead.') - def __init__( - self, examples: dict[str, Any], mode: Literal['validation', 'serialization'] | None = None - ) -> None: ... - - @overload - def __init__(self, examples: list[Any], mode: Literal['validation', 'serialization'] | None = None) -> None: ... - - def __init__( - self, examples: dict[str, Any] | list[Any], mode: Literal['validation', 'serialization'] | None = None - ) -> None: - if isinstance(examples, dict): - warnings.warn( - 'Using a dict for `examples` is deprecated, use a list instead.', - PydanticDeprecatedSince29, - stacklevel=2, - ) - self.examples = examples - self.mode = mode + examples: dict[str, Any] + mode: Literal['validation', 'serialization'] | None = None def __get_pydantic_json_schema__( self, core_schema: core_schema.CoreSchema, handler: GetJsonSchemaHandler @@ -2699,36 +2296,9 @@ class Examples: json_schema = handler(core_schema) if mode != handler.mode: return json_schema - examples = json_schema.get('examples') - if examples is None: - json_schema['examples'] = to_jsonable_python(self.examples) - if isinstance(examples, dict): - if isinstance(self.examples, list): - warnings.warn( - 'Updating existing JSON Schema examples of type dict with examples of type list. ' - 'Only the existing examples values will be retained. Note that dict support for ' - 'examples is deprecated and will be removed in v3.0.', - UserWarning, - ) - json_schema['examples'] = to_jsonable_python( - [ex for value in examples.values() for ex in value] + self.examples - ) - else: - json_schema['examples'] = to_jsonable_python({**examples, **self.examples}) - if isinstance(examples, list): - if isinstance(self.examples, list): - json_schema['examples'] = to_jsonable_python(examples + self.examples) - elif isinstance(self.examples, dict): - warnings.warn( - 'Updating existing JSON Schema examples of type list with examples of type dict. ' - 'Only the examples values will be retained. Note that dict support for ' - 'examples is deprecated and will be removed in v3.0.', - UserWarning, - ) - json_schema['examples'] = to_jsonable_python( - examples + [ex for value in self.examples.values() for ex in value] - ) - + examples = json_schema.get('examples', {}) + examples.update(to_jsonable_python(self.examples)) + json_schema['examples'] = examples return json_schema def __hash__(self) -> int: @@ -2738,28 +2308,19 @@ class Examples: def _get_all_json_refs(item: Any) -> set[JsonRef]: """Get all the definitions references from a JSON schema.""" refs: set[JsonRef] = set() - stack = [item] - - while stack: - current = stack.pop() - if isinstance(current, dict): - for key, value in current.items(): - if key == 'examples' and isinstance(value, list): - # Skip examples that may contain arbitrary values and references - # (e.g. `{"examples": [{"$ref": "..."}]}`). Note: checking for value - # of type list is necessary to avoid skipping valid portions of the schema, - # for instance when "examples" is used as a property key. A more robust solution - # could be found, but would require more advanced JSON Schema parsing logic. - continue - if key == '$ref' and isinstance(value, str): - refs.add(JsonRef(value)) - elif isinstance(value, dict): - stack.append(value) - elif isinstance(value, list): - stack.extend(value) - elif isinstance(current, list): - stack.extend(current) - + if isinstance(item, dict): + for key, value in item.items(): + if key == '$ref' and isinstance(value, str): + # the isinstance check ensures that '$ref' isn't the name of a property, etc. + refs.add(JsonRef(value)) + elif isinstance(value, dict): + refs.update(_get_all_json_refs(value)) + elif isinstance(value, list): + for item in value: + refs.update(_get_all_json_refs(item)) + elif isinstance(item, list): + for item in item: + refs.update(_get_all_json_refs(item)) return refs @@ -2771,51 +2332,20 @@ else: @dataclasses.dataclass(**_internal_dataclass.slots_true) class SkipJsonSchema: - """!!! abstract "Usage Documentation" - [`SkipJsonSchema` Annotation](../concepts/json_schema.md#skipjsonschema-annotation) - - Add this as an annotation on a field to skip generating a JSON schema for that field. + """Add this as an annotation on a field to skip generating a JSON schema for that field. Example: - ```python - from pprint import pprint - from typing import Union - + ```py from pydantic import BaseModel from pydantic.json_schema import SkipJsonSchema class Model(BaseModel): - a: Union[int, None] = None # (1)! - b: Union[int, SkipJsonSchema[None]] = None # (2)! - c: SkipJsonSchema[Union[int, None]] = None # (3)! + a: int | SkipJsonSchema[None] = None - pprint(Model.model_json_schema()) - ''' - { - 'properties': { - 'a': { - 'anyOf': [ - {'type': 'integer'}, - {'type': 'null'} - ], - 'default': None, - 'title': 'A' - }, - 'b': { - 'default': None, - 'title': 'B', - 'type': 'integer' - } - }, - 'title': 'Model', - 'type': 'object' - } - ''' + + print(Model.model_json_schema()) + #> {'properties': {'a': {'default': None, 'title': 'A', 'type': 'integer'}}, 'title': 'Model', 'type': 'object'} ``` - - 1. The integer and null types are both included in the schema for `a`. - 2. The integer type is the only type included in the schema for `b`. - 3. The entirety of the `c` field is omitted from the schema. """ def __class_getitem__(cls, item: AnyType) -> AnyType: @@ -2830,25 +2360,12 @@ else: return hash(type(self)) -def _get_typed_dict_config(cls: type[Any] | None) -> ConfigDict: +def _get_typed_dict_config(schema: core_schema.TypedDictSchema) -> ConfigDict: + metadata = _core_metadata.CoreMetadataHandler(schema).metadata + cls = metadata.get('pydantic_typed_dict_cls') if cls is not None: try: return _decorators.get_attribute_from_bases(cls, '__pydantic_config__') except AttributeError: pass return {} - - -def _get_ser_schema_for_default_value(schema: CoreSchema) -> core_schema.PlainSerializerFunctionSerSchema | None: - """Get a `'function-plain'` serialization schema that can be used to serialize a default value. - - This takes into account having the serialization schema nested under validation schema(s). - """ - if ( - (ser_schema := schema.get('serialization')) - and ser_schema['type'] == 'function-plain' - and not ser_schema.get('info_arg') - ): - return ser_schema - if _core_utils.is_function_with_inner_schema(schema): - return _get_ser_schema_for_default_value(schema['schema']) diff --git a/Backend/venv/lib/python3.12/site-packages/pydantic/main.py b/Backend/venv/lib/python3.12/site-packages/pydantic/main.py index 2b3148ed..2e716ac1 100644 --- a/Backend/venv/lib/python3.12/site-packages/pydantic/main.py +++ b/Backend/venv/lib/python3.12/site-packages/pydantic/main.py @@ -1,38 +1,17 @@ """Logic for creating models.""" - -# Because `dict` is in the local namespace of the `BaseModel` class, we use `Dict` for annotations. -# TODO v3 fallback to `dict` when the deprecated `dict` method gets removed. -# ruff: noqa: UP035 - from __future__ import annotations as _annotations -import operator import sys import types +import typing import warnings -from collections.abc import Generator, Mapping from copy import copy, deepcopy -from functools import cached_property -from typing import ( - TYPE_CHECKING, - Any, - Callable, - ClassVar, - Dict, - Generic, - Literal, - TypeVar, - Union, - cast, - overload, -) +from typing import Any, ClassVar import pydantic_core import typing_extensions -from pydantic_core import PydanticUndefined, ValidationError -from typing_extensions import Self, TypeAlias, Unpack +from pydantic_core import PydanticUndefined -from . import PydanticDeprecatedSince20, PydanticDeprecatedSince211 from ._internal import ( _config, _decorators, @@ -41,93 +20,55 @@ from ._internal import ( _generics, _mock_val_ser, _model_construction, - _namespace_utils, _repr, _typing_extra, _utils, ) from ._migration import getattr_migration -from .aliases import AliasChoices, AliasPath from .annotated_handlers import GetCoreSchemaHandler, GetJsonSchemaHandler -from .config import ConfigDict, ExtraValues +from .config import ConfigDict from .errors import PydanticUndefinedAnnotation, PydanticUserError from .json_schema import DEFAULT_REF_TEMPLATE, GenerateJsonSchema, JsonSchemaMode, JsonSchemaValue, model_json_schema -from .plugin._schema_validator import PluggableSchemaValidator +from .warnings import PydanticDeprecatedSince20 -if TYPE_CHECKING: +if typing.TYPE_CHECKING: from inspect import Signature from pathlib import Path from pydantic_core import CoreSchema, SchemaSerializer, SchemaValidator + from typing_extensions import Literal, Unpack - from ._internal._namespace_utils import MappingNamespace from ._internal._utils import AbstractSetIntStr, MappingIntStrAny from .deprecated.parse import Protocol as DeprecatedParseProtocol from .fields import ComputedFieldInfo, FieldInfo, ModelPrivateAttr + from .fields import Field as _Field + TupleGenerator = typing.Generator[typing.Tuple[str, Any], None, None] + Model = typing.TypeVar('Model', bound='BaseModel') + # should be `set[int] | set[str] | dict[int, IncEx] | dict[str, IncEx] | None`, but mypy can't cope + IncEx: typing_extensions.TypeAlias = 'set[int] | set[str] | dict[int, Any] | dict[str, Any] | None' +else: + # See PyCharm issues https://youtrack.jetbrains.com/issue/PY-21915 + # and https://youtrack.jetbrains.com/issue/PY-51428 + DeprecationWarning = PydanticDeprecatedSince20 __all__ = 'BaseModel', 'create_model' -# Keep these type aliases available at runtime: -TupleGenerator: TypeAlias = Generator[tuple[str, Any], None, None] -# NOTE: In reality, `bool` should be replaced by `Literal[True]` but mypy fails to correctly apply bidirectional -# type inference (e.g. when using `{'a': {'b': True}}`): -# NOTE: Keep this type alias in sync with the stub definition in `pydantic-core`: -IncEx: TypeAlias = Union[set[int], set[str], Mapping[int, Union['IncEx', bool]], Mapping[str, Union['IncEx', bool]]] - _object_setattr = _model_construction.object_setattr -def _check_frozen(model_cls: type[BaseModel], name: str, value: Any) -> None: - if model_cls.model_config.get('frozen'): - error_type = 'frozen_instance' - elif getattr(model_cls.__pydantic_fields__.get(name), 'frozen', False): - error_type = 'frozen_field' - else: - return - - raise ValidationError.from_exception_data( - model_cls.__name__, [{'type': error_type, 'loc': (name,), 'input': value}] - ) - - -def _model_field_setattr_handler(model: BaseModel, name: str, val: Any) -> None: - model.__dict__[name] = val - model.__pydantic_fields_set__.add(name) - - -def _private_setattr_handler(model: BaseModel, name: str, val: Any) -> None: - if getattr(model, '__pydantic_private__', None) is None: - # While the attribute should be present at this point, this may not be the case if - # users do unusual stuff with `model_post_init()` (which is where the `__pydantic_private__` - # is initialized, by wrapping the user-defined `model_post_init()`), e.g. if they mock - # the `model_post_init()` call. Ideally we should find a better way to init private attrs. - object.__setattr__(model, '__pydantic_private__', {}) - model.__pydantic_private__[name] = val # pyright: ignore[reportOptionalSubscript] - - -_SIMPLE_SETATTR_HANDLERS: Mapping[str, Callable[[BaseModel, str, Any], None]] = { - 'model_field': _model_field_setattr_handler, - 'validate_assignment': lambda model, name, val: model.__pydantic_validator__.validate_assignment(model, name, val), # pyright: ignore[reportAssignmentType] - 'private': _private_setattr_handler, - 'cached_property': lambda model, name, val: model.__dict__.__setitem__(name, val), - 'extra_known': lambda model, name, val: _object_setattr(model, name, val), -} - - class BaseModel(metaclass=_model_construction.ModelMetaclass): - """!!! abstract "Usage Documentation" - [Models](../concepts/models.md) + """Usage docs: https://docs.pydantic.dev/2.5/concepts/models/ A base class for creating Pydantic models. Attributes: - __class_vars__: The names of the class variables defined on the model. + __class_vars__: The names of classvars defined on the model. __private_attributes__: Metadata about the private attributes of the model. - __signature__: The synthesized `__init__` [`Signature`][inspect.Signature] of the model. + __signature__: The signature for instantiating the model. __pydantic_complete__: Whether model building is completed, or if there are still undefined fields. - __pydantic_core_schema__: The core schema of the model. + __pydantic_core_schema__: The pydantic-core schema used to build the SchemaValidator and SchemaSerializer. __pydantic_custom_init__: Whether the model has a custom `__init__` function. __pydantic_decorators__: Metadata containing the decorators defined on the model. This replaces `Model.__validators__` and `Model.__root_validators__` from Pydantic V1. @@ -135,95 +76,63 @@ class BaseModel(metaclass=_model_construction.ModelMetaclass): __args__, __origin__, __parameters__ in typing-module generics. May eventually be replaced by these. __pydantic_parent_namespace__: Parent namespace of the model, used for automatic rebuilding of models. __pydantic_post_init__: The name of the post-init method for the model, if defined. - __pydantic_root_model__: Whether the model is a [`RootModel`][pydantic.root_model.RootModel]. - __pydantic_serializer__: The `pydantic-core` `SchemaSerializer` used to dump instances of the model. - __pydantic_validator__: The `pydantic-core` `SchemaValidator` used to validate instances of the model. + __pydantic_root_model__: Whether the model is a `RootModel`. + __pydantic_serializer__: The pydantic-core SchemaSerializer used to dump instances of the model. + __pydantic_validator__: The pydantic-core SchemaValidator used to validate instances of the model. - __pydantic_fields__: A dictionary of field names and their corresponding [`FieldInfo`][pydantic.fields.FieldInfo] objects. - __pydantic_computed_fields__: A dictionary of computed field names and their corresponding [`ComputedFieldInfo`][pydantic.fields.ComputedFieldInfo] objects. - - __pydantic_extra__: A dictionary containing extra values, if [`extra`][pydantic.config.ConfigDict.extra] - is set to `'allow'`. - __pydantic_fields_set__: The names of fields explicitly set during instantiation. - __pydantic_private__: Values of private attributes set on the model instance. + __pydantic_extra__: An instance attribute with the values of extra fields from validation when + `model_config['extra'] == 'allow'`. + __pydantic_fields_set__: An instance attribute with the names of fields explicitly set. + __pydantic_private__: Instance attribute with the values of private attributes set on the model instance. """ - # Note: Many of the below class vars are defined in the metaclass, but we define them here for type checking purposes. + if typing.TYPE_CHECKING: + # Here we provide annotations for the attributes of BaseModel. + # Many of these are populated by the metaclass, which is why this section is in a `TYPE_CHECKING` block. + # However, for the sake of easy review, we have included type annotations of all class and instance attributes + # of `BaseModel` here: - model_config: ClassVar[ConfigDict] = ConfigDict() - """ - Configuration for the model, should be a dictionary conforming to [`ConfigDict`][pydantic.config.ConfigDict]. - """ + # Class attributes + model_config: ClassVar[ConfigDict] + """ + Configuration for the model, should be a dictionary conforming to [`ConfigDict`][pydantic.config.ConfigDict]. + """ - __class_vars__: ClassVar[set[str]] - """The names of the class variables defined on the model.""" + model_fields: ClassVar[dict[str, FieldInfo]] + """ + Metadata about the fields defined on the model, + mapping of field names to [`FieldInfo`][pydantic.fields.FieldInfo]. - __private_attributes__: ClassVar[Dict[str, ModelPrivateAttr]] # noqa: UP006 - """Metadata about the private attributes of the model.""" + This replaces `Model.__fields__` from Pydantic V1. + """ - __signature__: ClassVar[Signature] - """The synthesized `__init__` [`Signature`][inspect.Signature] of the model.""" + __class_vars__: ClassVar[set[str]] + __private_attributes__: ClassVar[dict[str, ModelPrivateAttr]] + __signature__: ClassVar[Signature] - __pydantic_complete__: ClassVar[bool] = False - """Whether model building is completed, or if there are still undefined fields.""" + __pydantic_complete__: ClassVar[bool] + __pydantic_core_schema__: ClassVar[CoreSchema] + __pydantic_custom_init__: ClassVar[bool] + __pydantic_decorators__: ClassVar[_decorators.DecoratorInfos] + __pydantic_generic_metadata__: ClassVar[_generics.PydanticGenericMetadata] + __pydantic_parent_namespace__: ClassVar[dict[str, Any] | None] + __pydantic_post_init__: ClassVar[None | Literal['model_post_init']] + __pydantic_root_model__: ClassVar[bool] + __pydantic_serializer__: ClassVar[SchemaSerializer] + __pydantic_validator__: ClassVar[SchemaValidator] - __pydantic_core_schema__: ClassVar[CoreSchema] - """The core schema of the model.""" - - __pydantic_custom_init__: ClassVar[bool] - """Whether the model has a custom `__init__` method.""" - - # Must be set for `GenerateSchema.model_schema` to work for a plain `BaseModel` annotation. - __pydantic_decorators__: ClassVar[_decorators.DecoratorInfos] = _decorators.DecoratorInfos() - """Metadata containing the decorators defined on the model. - This replaces `Model.__validators__` and `Model.__root_validators__` from Pydantic V1.""" - - __pydantic_generic_metadata__: ClassVar[_generics.PydanticGenericMetadata] - """Metadata for generic models; contains data used for a similar purpose to - __args__, __origin__, __parameters__ in typing-module generics. May eventually be replaced by these.""" - - __pydantic_parent_namespace__: ClassVar[Dict[str, Any] | None] = None # noqa: UP006 - """Parent namespace of the model, used for automatic rebuilding of models.""" - - __pydantic_post_init__: ClassVar[None | Literal['model_post_init']] - """The name of the post-init method for the model, if defined.""" - - __pydantic_root_model__: ClassVar[bool] = False - """Whether the model is a [`RootModel`][pydantic.root_model.RootModel].""" - - __pydantic_serializer__: ClassVar[SchemaSerializer] - """The `pydantic-core` `SchemaSerializer` used to dump instances of the model.""" - - __pydantic_validator__: ClassVar[SchemaValidator | PluggableSchemaValidator] - """The `pydantic-core` `SchemaValidator` used to validate instances of the model.""" - - __pydantic_fields__: ClassVar[Dict[str, FieldInfo]] # noqa: UP006 - """A dictionary of field names and their corresponding [`FieldInfo`][pydantic.fields.FieldInfo] objects. - This replaces `Model.__fields__` from Pydantic V1. - """ - - __pydantic_setattr_handlers__: ClassVar[Dict[str, Callable[[BaseModel, str, Any], None]]] # noqa: UP006 - """`__setattr__` handlers. Memoizing the handlers leads to a dramatic performance improvement in `__setattr__`""" - - __pydantic_computed_fields__: ClassVar[Dict[str, ComputedFieldInfo]] # noqa: UP006 - """A dictionary of computed field names and their corresponding [`ComputedFieldInfo`][pydantic.fields.ComputedFieldInfo] objects.""" - - __pydantic_extra__: Dict[str, Any] | None = _model_construction.NoInitField(init=False) # noqa: UP006 - """A dictionary containing extra values, if [`extra`][pydantic.config.ConfigDict.extra] is set to `'allow'`.""" - - __pydantic_fields_set__: set[str] = _model_construction.NoInitField(init=False) - """The names of fields explicitly set during instantiation.""" - - __pydantic_private__: Dict[str, Any] | None = _model_construction.NoInitField(init=False) # noqa: UP006 - """Values of private attributes set on the model instance.""" - - if not TYPE_CHECKING: - # Prevent `BaseModel` from being instantiated directly - # (defined in an `if not TYPE_CHECKING` block for clarity and to avoid type checking errors): - __pydantic_core_schema__ = _mock_val_ser.MockCoreSchema( - 'Pydantic models should inherit from BaseModel, BaseModel cannot be instantiated directly', - code='base-model-instantiated', - ) + # Instance attributes + # Note: we use the non-existent kwarg `init=False` in pydantic.fields.Field below so that @dataclass_transform + # doesn't think these are valid as keyword arguments to the class initializer. + __pydantic_extra__: dict[str, Any] | None = _Field(init=False) # type: ignore + __pydantic_fields_set__: set[str] = _Field(init=False) # type: ignore + __pydantic_private__: dict[str, Any] | None = _Field(init=False) # type: ignore + else: + # `model_fields` and `__pydantic_decorators__` must be set for + # pydantic._internal._generate_schema.GenerateSchema.model_schema to work for a plain BaseModel annotation + model_fields = {} + __pydantic_decorators__ = _decorators.DecoratorInfos() + # Prevent `BaseModel` from being instantiated directly: __pydantic_validator__ = _mock_val_ser.MockValSer( 'Pydantic models should inherit from BaseModel, BaseModel cannot be instantiated directly', val_or_ser='validator', @@ -237,49 +146,34 @@ class BaseModel(metaclass=_model_construction.ModelMetaclass): __slots__ = '__dict__', '__pydantic_fields_set__', '__pydantic_extra__', '__pydantic_private__' - def __init__(self, /, **data: Any) -> None: + model_config = ConfigDict() + __pydantic_complete__ = False + __pydantic_root_model__ = False + + def __init__(__pydantic_self__, **data: Any) -> None: # type: ignore """Create a new model by parsing and validating input data from keyword arguments. Raises [`ValidationError`][pydantic_core.ValidationError] if the input data cannot be validated to form a valid model. - `self` is explicitly positional-only to allow `self` as a field name. + `__init__` uses `__pydantic_self__` instead of the more common `self` for the first arg to + allow `self` as a field name. """ # `__tracebackhide__` tells pytest and some other tools to omit this function from tracebacks __tracebackhide__ = True - validated_self = self.__pydantic_validator__.validate_python(data, self_instance=self) - if self is not validated_self: - warnings.warn( - 'A custom validator is returning a value other than `self`.\n' - "Returning anything other than `self` from a top level model validator isn't supported when validating via `__init__`.\n" - 'See the `model_validator` docs (https://docs.pydantic.dev/latest/concepts/validators/#model-validators) for more details.', - stacklevel=2, - ) + __pydantic_self__.__pydantic_validator__.validate_python(data, self_instance=__pydantic_self__) # The following line sets a flag that we use to determine when `__init__` gets overridden by the user - __init__.__pydantic_base_init__ = True # pyright: ignore[reportFunctionMemberAccess] + __init__.__pydantic_base_init__ = True - @_utils.deprecated_instance_property - @classmethod - def model_fields(cls) -> dict[str, FieldInfo]: - """A mapping of field names to their respective [`FieldInfo`][pydantic.fields.FieldInfo] instances. + @property + def model_computed_fields(self) -> dict[str, ComputedFieldInfo]: + """Get the computed fields of this model instance. - !!! warning - Accessing this attribute from a model instance is deprecated, and will not work in Pydantic V3. - Instead, you should access this attribute from the model class. + Returns: + A dictionary of computed field names and their corresponding `ComputedFieldInfo` objects. """ - return getattr(cls, '__pydantic_fields__', {}) - - @_utils.deprecated_instance_property - @classmethod - def model_computed_fields(cls) -> dict[str, ComputedFieldInfo]: - """A mapping of computed field names to their respective [`ComputedFieldInfo`][pydantic.fields.ComputedFieldInfo] instances. - - !!! warning - Accessing this attribute from a model instance is deprecated, and will not work in Pydantic V3. - Instead, you should access this attribute from the model class. - """ - return getattr(cls, '__pydantic_computed_fields__', {}) + return {k: v.info for k, v in self.__pydantic_decorators__.computed_fields.items()} @property def model_extra(self) -> dict[str, Any] | None: @@ -301,23 +195,15 @@ class BaseModel(metaclass=_model_construction.ModelMetaclass): return self.__pydantic_fields_set__ @classmethod - def model_construct(cls, _fields_set: set[str] | None = None, **values: Any) -> Self: # noqa: C901 + def model_construct(cls: type[Model], _fields_set: set[str] | None = None, **values: Any) -> Model: """Creates a new instance of the `Model` class with validated data. Creates a new model setting `__dict__` and `__pydantic_fields_set__` from trusted or pre-validated data. Default values are respected, but no other validation is performed. - - !!! note - `model_construct()` generally respects the `model_config.extra` setting on the provided model. - That is, if `model_config.extra == 'allow'`, then all extra passed values are added to the model instance's `__dict__` - and `__pydantic_extra__` fields. If `model_config.extra == 'ignore'` (the default), then all extra passed values are ignored. - Because no validation is performed with a call to `model_construct()`, having `model_config.extra == 'forbid'` does not result in - an error if extra values are passed, but they will be ignored. + Behaves as if `Config.extra = 'allow'` was set since it adds all passed values Args: - _fields_set: A set of field names that were originally explicitly set during instantiation. If provided, - this is directly used for the [`model_fields_set`][pydantic.BaseModel.model_fields_set] attribute. - Otherwise, the field names from the `values` argument will be used. + _fields_set: The set of field names accepted for the Model instance. values: Trusted or pre-validated data dictionary. Returns: @@ -325,42 +211,25 @@ class BaseModel(metaclass=_model_construction.ModelMetaclass): """ m = cls.__new__(cls) fields_values: dict[str, Any] = {} - fields_set = set() - - for name, field in cls.__pydantic_fields__.items(): - if field.alias is not None and field.alias in values: + defaults: dict[str, Any] = {} # keeping this separate from `fields_values` helps us compute `_fields_set` + for name, field in cls.model_fields.items(): + if field.alias and field.alias in values: fields_values[name] = values.pop(field.alias) - fields_set.add(name) - - if (name not in fields_set) and (field.validation_alias is not None): - validation_aliases: list[str | AliasPath] = ( - field.validation_alias.choices - if isinstance(field.validation_alias, AliasChoices) - else [field.validation_alias] - ) - - for alias in validation_aliases: - if isinstance(alias, str) and alias in values: - fields_values[name] = values.pop(alias) - fields_set.add(name) - break - elif isinstance(alias, AliasPath): - value = alias.search_dict_for_path(values) - if value is not PydanticUndefined: - fields_values[name] = value - fields_set.add(name) - break - - if name not in fields_set: - if name in values: - fields_values[name] = values.pop(name) - fields_set.add(name) - elif not field.is_required(): - fields_values[name] = field.get_default(call_default_factory=True, validated_data=fields_values) + elif name in values: + fields_values[name] = values.pop(name) + elif not field.is_required(): + defaults[name] = field.get_default(call_default_factory=True) if _fields_set is None: - _fields_set = fields_set + _fields_set = set(fields_values.keys()) + fields_values.update(defaults) - _extra: dict[str, Any] | None = values if cls.model_config.get('extra') == 'allow' else None + _extra: dict[str, Any] | None = None + if cls.model_config.get('extra') == 'allow': + _extra = {} + for k, v in values.items(): + _extra[k] = v + else: + fields_values.update(values) _object_setattr(m, '__dict__', fields_values) _object_setattr(m, '__pydantic_fields_set__', _fields_set) if not cls.__pydantic_root_model__: @@ -368,12 +237,6 @@ class BaseModel(metaclass=_model_construction.ModelMetaclass): if cls.__pydantic_post_init__: m.model_post_init(None) - # update private attributes with values set - if hasattr(m, '__pydantic_private__') and m.__pydantic_private__ is not None: - for k, v in values.items(): - if k in m.__private_attributes__: - m.__pydantic_private__[k] = v - elif not cls.__pydantic_root_model__: # Note: if there are any private attributes, cls.__pydantic_post_init__ would exist # Since it doesn't, that means that `__pydantic_private__` should be set to None @@ -381,17 +244,11 @@ class BaseModel(metaclass=_model_construction.ModelMetaclass): return m - def model_copy(self, *, update: Mapping[str, Any] | None = None, deep: bool = False) -> Self: - """!!! abstract "Usage Documentation" - [`model_copy`](../concepts/models.md#model-copy) + def model_copy(self: Model, *, update: dict[str, Any] | None = None, deep: bool = False) -> Model: + """Usage docs: https://docs.pydantic.dev/2.5/concepts/serialization/#model_copy Returns a copy of the model. - !!! note - The underlying instance's [`__dict__`][object.__dict__] attribute is copied. This - might have unexpected side effects if you store anything in it, on top of the model - fields (e.g. the value of [cached properties][functools.cached_property]). - Args: update: Values to change/add in the new model. Note: the data is not validated before creating the new model. You should trust this data. @@ -404,7 +261,7 @@ class BaseModel(metaclass=_model_construction.ModelMetaclass): if update: if self.model_config.get('extra') == 'allow': for k, v in update.items(): - if k in self.__pydantic_fields__: + if k in self.model_fields: copied.__dict__[k] = v else: if copied.__pydantic_extra__ is None: @@ -419,44 +276,31 @@ class BaseModel(metaclass=_model_construction.ModelMetaclass): self, *, mode: Literal['json', 'python'] | str = 'python', - include: IncEx | None = None, - exclude: IncEx | None = None, - context: Any | None = None, - by_alias: bool | None = None, + include: IncEx = None, + exclude: IncEx = None, + by_alias: bool = False, exclude_unset: bool = False, exclude_defaults: bool = False, exclude_none: bool = False, - exclude_computed_fields: bool = False, round_trip: bool = False, - warnings: bool | Literal['none', 'warn', 'error'] = True, - fallback: Callable[[Any], Any] | None = None, - serialize_as_any: bool = False, + warnings: bool = True, ) -> dict[str, Any]: - """!!! abstract "Usage Documentation" - [`model_dump`](../concepts/serialization.md#python-mode) + """Usage docs: https://docs.pydantic.dev/2.5/concepts/serialization/#modelmodel_dump Generate a dictionary representation of the model, optionally specifying which fields to include or exclude. Args: mode: The mode in which `to_python` should run. - If mode is 'json', the output will only contain JSON serializable types. - If mode is 'python', the output may contain non-JSON-serializable Python objects. - include: A set of fields to include in the output. - exclude: A set of fields to exclude from the output. - context: Additional context to pass to the serializer. + If mode is 'json', the dictionary will only contain JSON serializable types. + If mode is 'python', the dictionary may contain any Python objects. + include: A list of fields to include in the output. + exclude: A list of fields to exclude from the output. by_alias: Whether to use the field's alias in the dictionary key if defined. exclude_unset: Whether to exclude fields that have not been explicitly set. - exclude_defaults: Whether to exclude fields that are set to their default value. - exclude_none: Whether to exclude fields that have a value of `None`. - exclude_computed_fields: Whether to exclude computed fields. - While this can be useful for round-tripping, it is usually recommended to use the dedicated - `round_trip` parameter instead. - round_trip: If True, dumped values should be valid as input for non-idempotent types such as Json[T]. - warnings: How to handle serialization errors. False/"none" ignores them, True/"warn" logs errors, - "error" raises a [`PydanticSerializationError`][pydantic_core.PydanticSerializationError]. - fallback: A function to call when an unknown value is encountered. If not provided, - a [`PydanticSerializationError`][pydantic_core.PydanticSerializationError] error is raised. - serialize_as_any: Whether to serialize fields with duck-typing serialization behavior. + exclude_defaults: Whether to exclude fields that are set to their default value from the output. + exclude_none: Whether to exclude fields that have a value of `None` from the output. + round_trip: Whether to enable serialization and deserialization round-trip support. + warnings: Whether to log warnings when invalid fields are encountered. Returns: A dictionary representation of the model. @@ -467,60 +311,40 @@ class BaseModel(metaclass=_model_construction.ModelMetaclass): by_alias=by_alias, include=include, exclude=exclude, - context=context, exclude_unset=exclude_unset, exclude_defaults=exclude_defaults, exclude_none=exclude_none, - exclude_computed_fields=exclude_computed_fields, round_trip=round_trip, warnings=warnings, - fallback=fallback, - serialize_as_any=serialize_as_any, ) def model_dump_json( self, *, indent: int | None = None, - ensure_ascii: bool = False, - include: IncEx | None = None, - exclude: IncEx | None = None, - context: Any | None = None, - by_alias: bool | None = None, + include: IncEx = None, + exclude: IncEx = None, + by_alias: bool = False, exclude_unset: bool = False, exclude_defaults: bool = False, exclude_none: bool = False, - exclude_computed_fields: bool = False, round_trip: bool = False, - warnings: bool | Literal['none', 'warn', 'error'] = True, - fallback: Callable[[Any], Any] | None = None, - serialize_as_any: bool = False, + warnings: bool = True, ) -> str: - """!!! abstract "Usage Documentation" - [`model_dump_json`](../concepts/serialization.md#json-mode) + """Usage docs: https://docs.pydantic.dev/2.5/concepts/serialization/#modelmodel_dump_json Generates a JSON representation of the model using Pydantic's `to_json` method. Args: indent: Indentation to use in the JSON output. If None is passed, the output will be compact. - ensure_ascii: If `True`, the output is guaranteed to have all incoming non-ASCII characters escaped. - If `False` (the default), these characters will be output as-is. - include: Field(s) to include in the JSON output. - exclude: Field(s) to exclude from the JSON output. - context: Additional context to pass to the serializer. + include: Field(s) to include in the JSON output. Can take either a string or set of strings. + exclude: Field(s) to exclude from the JSON output. Can take either a string or set of strings. by_alias: Whether to serialize using field aliases. exclude_unset: Whether to exclude fields that have not been explicitly set. - exclude_defaults: Whether to exclude fields that are set to their default value. + exclude_defaults: Whether to exclude fields that have the default value. exclude_none: Whether to exclude fields that have a value of `None`. - exclude_computed_fields: Whether to exclude computed fields. - While this can be useful for round-tripping, it is usually recommended to use the dedicated - `round_trip` parameter instead. - round_trip: If True, dumped values should be valid as input for non-idempotent types such as Json[T]. - warnings: How to handle serialization errors. False/"none" ignores them, True/"warn" logs errors, - "error" raises a [`PydanticSerializationError`][pydantic_core.PydanticSerializationError]. - fallback: A function to call when an unknown value is encountered. If not provided, - a [`PydanticSerializationError`][pydantic_core.PydanticSerializationError] error is raised. - serialize_as_any: Whether to serialize fields with duck-typing serialization behavior. + round_trip: Whether to use serialization/deserialization between JSON and class instance. + warnings: Whether to show any warnings that occurred during serialization. Returns: A JSON string representation of the model. @@ -528,19 +352,14 @@ class BaseModel(metaclass=_model_construction.ModelMetaclass): return self.__pydantic_serializer__.to_json( self, indent=indent, - ensure_ascii=ensure_ascii, include=include, exclude=exclude, - context=context, by_alias=by_alias, exclude_unset=exclude_unset, exclude_defaults=exclude_defaults, exclude_none=exclude_none, - exclude_computed_fields=exclude_computed_fields, round_trip=round_trip, warnings=warnings, - fallback=fallback, - serialize_as_any=serialize_as_any, ).decode() @classmethod @@ -550,22 +369,12 @@ class BaseModel(metaclass=_model_construction.ModelMetaclass): ref_template: str = DEFAULT_REF_TEMPLATE, schema_generator: type[GenerateJsonSchema] = GenerateJsonSchema, mode: JsonSchemaMode = 'validation', - *, - union_format: Literal['any_of', 'primitive_type_array'] = 'any_of', ) -> dict[str, Any]: """Generates a JSON schema for a model class. Args: by_alias: Whether to use attribute aliases or not. ref_template: The reference template. - union_format: The format to use when combining schemas from unions together. Can be one of: - - - `'any_of'`: Use the [`anyOf`](https://json-schema.org/understanding-json-schema/reference/combining#anyOf) - keyword to combine schemas (the default). - - `'primitive_type_array'`: Use the [`type`](https://json-schema.org/understanding-json-schema/reference/type) - keyword as an array of strings, containing each type of the combination. If any of the schemas is not a primitive - type (`string`, `boolean`, `null`, `integer` or `number`) or contains constraints/metadata, falls back to - `any_of`. schema_generator: To override the logic used to generate the JSON schema, as a subclass of `GenerateJsonSchema` with your desired modifications mode: The mode in which to generate the schema. @@ -574,12 +383,7 @@ class BaseModel(metaclass=_model_construction.ModelMetaclass): The JSON schema for the given model class. """ return model_json_schema( - cls, - by_alias=by_alias, - ref_template=ref_template, - union_format=union_format, - schema_generator=schema_generator, - mode=mode, + cls, by_alias=by_alias, ref_template=ref_template, schema_generator=schema_generator, mode=mode ) @classmethod @@ -599,7 +403,7 @@ class BaseModel(metaclass=_model_construction.ModelMetaclass): Raises: TypeError: Raised when trying to generate concrete names for non-generic models. """ - if not issubclass(cls, Generic): + if not issubclass(cls, typing.Generic): raise TypeError('Concrete names should only be generated for generic models.') # Any strings received should represent forward references, so we handle them specially below. @@ -609,10 +413,11 @@ class BaseModel(metaclass=_model_construction.ModelMetaclass): params_component = ', '.join(param_names) return f'{cls.__name__}[{params_component}]' - def model_post_init(self, context: Any, /) -> None: + def model_post_init(self, __context: Any) -> None: """Override this method to perform additional initialization after `__init__` and `model_construct`. This is useful if you want to do some validation that requires the entire model to be initialized. """ + pass @classmethod def model_rebuild( @@ -621,7 +426,7 @@ class BaseModel(metaclass=_model_construction.ModelMetaclass): force: bool = False, raise_errors: bool = True, _parent_namespace_depth: int = 2, - _types_namespace: MappingNamespace | None = None, + _types_namespace: dict[str, Any] | None = None, ) -> bool | None: """Try to rebuild the pydantic-core schema for the model. @@ -638,65 +443,54 @@ class BaseModel(metaclass=_model_construction.ModelMetaclass): Returns `None` if the schema is already "complete" and rebuilding was not required. If rebuilding _was_ required, returns `True` if rebuilding was successful, otherwise `False`. """ - already_complete = cls.__pydantic_complete__ - if already_complete and not force: + if not force and cls.__pydantic_complete__: return None - - cls.__pydantic_complete__ = False - - for attr in ('__pydantic_core_schema__', '__pydantic_validator__', '__pydantic_serializer__'): - if attr in cls.__dict__ and not isinstance(getattr(cls, attr), _mock_val_ser.MockValSer): - # Deleting the validator/serializer is necessary as otherwise they can get reused in - # pydantic-core. We do so only if they aren't mock instances, otherwise — as `model_rebuild()` - # isn't thread-safe — concurrent model instantiations can lead to the parent validator being used. - # Same applies for the core schema that can be reused in schema generation. - delattr(cls, attr) - - if _types_namespace is not None: - rebuild_ns = _types_namespace - elif _parent_namespace_depth > 0: - rebuild_ns = _typing_extra.parent_frame_namespace(parent_depth=_parent_namespace_depth, force=True) or {} else: - rebuild_ns = {} + if '__pydantic_core_schema__' in cls.__dict__: + delattr(cls, '__pydantic_core_schema__') # delete cached value to ensure full rebuild happens + if _types_namespace is not None: + types_namespace: dict[str, Any] | None = _types_namespace.copy() + else: + if _parent_namespace_depth > 0: + frame_parent_ns = _typing_extra.parent_frame_namespace(parent_depth=_parent_namespace_depth) or {} + cls_parent_ns = ( + _model_construction.unpack_lenient_weakvaluedict(cls.__pydantic_parent_namespace__) or {} + ) + types_namespace = {**cls_parent_ns, **frame_parent_ns} + cls.__pydantic_parent_namespace__ = _model_construction.build_lenient_weakvaluedict(types_namespace) + else: + types_namespace = _model_construction.unpack_lenient_weakvaluedict( + cls.__pydantic_parent_namespace__ + ) - parent_ns = _model_construction.unpack_lenient_weakvaluedict(cls.__pydantic_parent_namespace__) or {} + types_namespace = _typing_extra.get_cls_types_namespace(cls, types_namespace) - ns_resolver = _namespace_utils.NsResolver( - parent_namespace={**rebuild_ns, **parent_ns}, - ) - - return _model_construction.complete_model_class( - cls, - _config.ConfigWrapper(cls.model_config, check=False), - ns_resolver, - raise_errors=raise_errors, - # If the model was already complete, we don't need to call the hook again. - call_on_complete_hook=not already_complete, - ) + # manually override defer_build so complete_model_class doesn't skip building the model again + config = {**cls.model_config, 'defer_build': False} + return _model_construction.complete_model_class( + cls, + cls.__name__, + _config.ConfigWrapper(config, check=False), + raise_errors=raise_errors, + types_namespace=types_namespace, + ) @classmethod def model_validate( - cls, + cls: type[Model], obj: Any, *, strict: bool | None = None, - extra: ExtraValues | None = None, from_attributes: bool | None = None, - context: Any | None = None, - by_alias: bool | None = None, - by_name: bool | None = None, - ) -> Self: + context: dict[str, Any] | None = None, + ) -> Model: """Validate a pydantic model instance. Args: obj: The object to validate. - strict: Whether to enforce types strictly. - extra: Whether to ignore, allow, or forbid extra data during model validation. - See the [`extra` configuration value][pydantic.ConfigDict.extra] for details. + strict: Whether to raise an exception on invalid fields. from_attributes: Whether to extract data from object attributes. context: Additional context to pass to the validator. - by_alias: Whether to use the field's alias when validating against the provided input data. - by_name: Whether to use the field's name when validating against the provided input data. Raises: ValidationError: If the object could not be validated. @@ -706,140 +500,97 @@ class BaseModel(metaclass=_model_construction.ModelMetaclass): """ # `__tracebackhide__` tells pytest and some other tools to omit this function from tracebacks __tracebackhide__ = True - - if by_alias is False and by_name is not True: - raise PydanticUserError( - 'At least one of `by_alias` or `by_name` must be set to True.', - code='validate-by-alias-and-name-false', - ) - return cls.__pydantic_validator__.validate_python( - obj, - strict=strict, - extra=extra, - from_attributes=from_attributes, - context=context, - by_alias=by_alias, - by_name=by_name, + obj, strict=strict, from_attributes=from_attributes, context=context ) @classmethod def model_validate_json( - cls, + cls: type[Model], json_data: str | bytes | bytearray, *, strict: bool | None = None, - extra: ExtraValues | None = None, - context: Any | None = None, - by_alias: bool | None = None, - by_name: bool | None = None, - ) -> Self: - """!!! abstract "Usage Documentation" - [JSON Parsing](../concepts/json.md#json-parsing) + context: dict[str, Any] | None = None, + ) -> Model: + """Usage docs: https://docs.pydantic.dev/2.5/concepts/json/#json-parsing Validate the given JSON data against the Pydantic model. Args: json_data: The JSON data to validate. strict: Whether to enforce types strictly. - extra: Whether to ignore, allow, or forbid extra data during model validation. - See the [`extra` configuration value][pydantic.ConfigDict.extra] for details. context: Extra variables to pass to the validator. - by_alias: Whether to use the field's alias when validating against the provided input data. - by_name: Whether to use the field's name when validating against the provided input data. Returns: The validated Pydantic model. Raises: - ValidationError: If `json_data` is not a JSON string or the object could not be validated. + ValueError: If `json_data` is not a JSON string. """ # `__tracebackhide__` tells pytest and some other tools to omit this function from tracebacks __tracebackhide__ = True - - if by_alias is False and by_name is not True: - raise PydanticUserError( - 'At least one of `by_alias` or `by_name` must be set to True.', - code='validate-by-alias-and-name-false', - ) - - return cls.__pydantic_validator__.validate_json( - json_data, strict=strict, extra=extra, context=context, by_alias=by_alias, by_name=by_name - ) + return cls.__pydantic_validator__.validate_json(json_data, strict=strict, context=context) @classmethod def model_validate_strings( - cls, + cls: type[Model], obj: Any, *, strict: bool | None = None, - extra: ExtraValues | None = None, - context: Any | None = None, - by_alias: bool | None = None, - by_name: bool | None = None, - ) -> Self: - """Validate the given object with string data against the Pydantic model. + context: dict[str, Any] | None = None, + ) -> Model: + """Validate the given object contains string data against the Pydantic model. Args: - obj: The object containing string data to validate. + obj: The object contains string data to validate. strict: Whether to enforce types strictly. - extra: Whether to ignore, allow, or forbid extra data during model validation. - See the [`extra` configuration value][pydantic.ConfigDict.extra] for details. context: Extra variables to pass to the validator. - by_alias: Whether to use the field's alias when validating against the provided input data. - by_name: Whether to use the field's name when validating against the provided input data. Returns: The validated Pydantic model. """ # `__tracebackhide__` tells pytest and some other tools to omit this function from tracebacks __tracebackhide__ = True - - if by_alias is False and by_name is not True: - raise PydanticUserError( - 'At least one of `by_alias` or `by_name` must be set to True.', - code='validate-by-alias-and-name-false', - ) - - return cls.__pydantic_validator__.validate_strings( - obj, strict=strict, extra=extra, context=context, by_alias=by_alias, by_name=by_name - ) + return cls.__pydantic_validator__.validate_strings(obj, strict=strict, context=context) @classmethod - def __get_pydantic_core_schema__(cls, source: type[BaseModel], handler: GetCoreSchemaHandler, /) -> CoreSchema: - # This warning is only emitted when calling `super().__get_pydantic_core_schema__` from a model subclass. - # In the generate schema logic, this method (`BaseModel.__get_pydantic_core_schema__`) is special cased to - # *not* be called if not overridden. - warnings.warn( - 'The `__get_pydantic_core_schema__` method of the `BaseModel` class is deprecated. If you are calling ' - '`super().__get_pydantic_core_schema__` when overriding the method on a Pydantic model, consider using ' - '`handler(source)` instead. However, note that overriding this method on models can lead to unexpected ' - 'side effects.', - PydanticDeprecatedSince211, - stacklevel=2, - ) - # Logic copied over from `GenerateSchema._model_schema`: - schema = cls.__dict__.get('__pydantic_core_schema__') - if schema is not None and not isinstance(schema, _mock_val_ser.MockCoreSchema): - return cls.__pydantic_core_schema__ + def __get_pydantic_core_schema__(cls, __source: type[BaseModel], __handler: GetCoreSchemaHandler) -> CoreSchema: + """Hook into generating the model's CoreSchema. - return handler(source) + Args: + __source: The class we are generating a schema for. + This will generally be the same as the `cls` argument if this is a classmethod. + __handler: Call into Pydantic's internal JSON schema generation. + A callable that calls into Pydantic's internal CoreSchema generation logic. + + Returns: + A `pydantic-core` `CoreSchema`. + """ + # Only use the cached value from this _exact_ class; we don't want one from a parent class + # This is why we check `cls.__dict__` and don't use `cls.__pydantic_core_schema__` or similar. + if '__pydantic_core_schema__' in cls.__dict__: + # Due to the way generic classes are built, it's possible that an invalid schema may be temporarily + # set on generic classes. I think we could resolve this to ensure that we get proper schema caching + # for generics, but for simplicity for now, we just always rebuild if the class has a generic origin. + if not cls.__pydantic_generic_metadata__['origin']: + return cls.__pydantic_core_schema__ + + return __handler(__source) @classmethod def __get_pydantic_json_schema__( cls, - core_schema: CoreSchema, - handler: GetJsonSchemaHandler, - /, + __core_schema: CoreSchema, + __handler: GetJsonSchemaHandler, ) -> JsonSchemaValue: """Hook into generating the model's JSON schema. Args: - core_schema: A `pydantic-core` CoreSchema. + __core_schema: A `pydantic-core` CoreSchema. You can ignore this argument and call the handler with a new CoreSchema, wrap this CoreSchema (`{'type': 'nullable', 'schema': current_schema}`), or just call the handler with the original schema. - handler: Call into Pydantic's internal JSON schema generation. + __handler: Call into Pydantic's internal JSON schema generation. This will raise a `pydantic.errors.PydanticInvalidForJsonSchema` if JSON schema generation fails. Since this gets called by `BaseModel.model_json_schema` you can override the @@ -849,41 +600,26 @@ class BaseModel(metaclass=_model_construction.ModelMetaclass): Returns: A JSON schema, as a Python object. """ - return handler(core_schema) + return __handler(__core_schema) @classmethod def __pydantic_init_subclass__(cls, **kwargs: Any) -> None: """This is intended to behave just like `__init_subclass__`, but is called by `ModelMetaclass` - only after basic class initialization is complete. In particular, attributes like `model_fields` will - be present when this is called, but forward annotations are not guaranteed to be resolved yet, - meaning that creating an instance of the class may fail. + only after the class is actually fully initialized. In particular, attributes like `model_fields` will + be present when this is called. This is necessary because `__init_subclass__` will always be called by `type.__new__`, and it would require a prohibitively large refactor to the `ModelMetaclass` to ensure that `type.__new__` was called in such a manner that the class would already be sufficiently initialized. This will receive the same `kwargs` that would be passed to the standard `__init_subclass__`, namely, - any kwargs passed to the class definition that aren't used internally by Pydantic. + any kwargs passed to the class definition that aren't used internally by pydantic. Args: **kwargs: Any keyword arguments passed to the class definition that aren't used internally - by Pydantic. - - Note: - You may want to override [`__pydantic_on_complete__()`][pydantic.main.BaseModel.__pydantic_on_complete__] - instead, which is called once the class and its fields are fully initialized and ready for validation. - """ - - @classmethod - def __pydantic_on_complete__(cls) -> None: - """This is called once the class and its fields are fully initialized and ready to be used. - - This typically happens when the class is created (just before - [`__pydantic_init_subclass__()`][pydantic.main.BaseModel.__pydantic_init_subclass__] is called on the superclass), - except when forward annotations are used that could not immediately be resolved. - In that case, it will be called later, when the model is rebuilt automatically or explicitly using - [`model_rebuild()`][pydantic.main.BaseModel.model_rebuild]. + by pydantic. """ + pass def __class_getitem__( cls, typevar_values: type[Any] | tuple[type[Any], ...] @@ -896,17 +632,17 @@ class BaseModel(metaclass=_model_construction.ModelMetaclass): raise TypeError('Type parameters should be placed on typing.Generic, not BaseModel') if not hasattr(cls, '__parameters__'): raise TypeError(f'{cls} cannot be parametrized because it does not inherit from typing.Generic') - if not cls.__pydantic_generic_metadata__['parameters'] and Generic not in cls.__bases__: + if not cls.__pydantic_generic_metadata__['parameters'] and typing.Generic not in cls.__bases__: raise TypeError(f'{cls} is not a generic class') if not isinstance(typevar_values, tuple): typevar_values = (typevar_values,) + _generics.check_parameters_count(cls, typevar_values) - # For a model `class Model[T, U, V = int](BaseModel): ...` parametrized with `(str, bool)`, - # this gives us `{T: str, U: bool, V: int}`: - typevars_map = _generics.map_generic_model_arguments(cls, typevar_values) - # We also update the provided args to use defaults values (`(str, bool)` becomes `(str, bool, int)`): - typevar_values = tuple(v for v in typevars_map.values()) + # Build map from generic typevars to passed params + typevars_map: dict[_typing_extra.TypeVarType, type[Any]] = dict( + zip(cls.__pydantic_generic_metadata__['parameters'], typevar_values) + ) if _utils.all_identical(typevars_map.keys(), typevars_map.values()) and typevars_map: submodel = cls # if arguments are equal to parameters it's the same object @@ -921,38 +657,35 @@ class BaseModel(metaclass=_model_construction.ModelMetaclass): origin = cls.__pydantic_generic_metadata__['origin'] or cls model_name = origin.model_parametrized_name(args) params = tuple( - dict.fromkeys(_generics.iter_contained_typevars(typevars_map.values())) + {param: None for param in _generics.iter_contained_typevars(typevars_map.values())} ) # use dict as ordered set with _generics.generic_recursion_self_type(origin, args) as maybe_self_type: + if maybe_self_type is not None: + return maybe_self_type + cached = _generics.get_cached_generic_type_late(cls, typevar_values, origin, args) if cached is not None: return cached - if maybe_self_type is not None: - return maybe_self_type - # Attempt to rebuild the origin in case new types have been defined try: - # depth 2 gets you above this __class_getitem__ call. - # Note that we explicitly provide the parent ns, otherwise - # `model_rebuild` will use the parent ns no matter if it is the ns of a module. - # We don't want this here, as this has unexpected effects when a model - # is being parametrized during a forward annotation evaluation. - parent_ns = _typing_extra.parent_frame_namespace(parent_depth=2) or {} - origin.model_rebuild(_types_namespace=parent_ns) + # depth 3 gets you above this __class_getitem__ call + origin.model_rebuild(_parent_namespace_depth=3) except PydanticUndefinedAnnotation: # It's okay if it fails, it just means there are still undefined types # that could be evaluated later. + # TODO: Make sure validation fails if there are still undefined types, perhaps using MockValidator pass submodel = _generics.create_generic_submodel(model_name, origin, args, params) + # Update cache _generics.set_cached_generic_type(cls, typevar_values, submodel, origin, args) return submodel - def __copy__(self) -> Self: + def __copy__(self: Model) -> Model: """Returns a shallow copy of the model.""" cls = type(self) m = cls.__new__(cls) @@ -960,7 +693,7 @@ class BaseModel(metaclass=_model_construction.ModelMetaclass): _object_setattr(m, '__pydantic_extra__', copy(self.__pydantic_extra__)) _object_setattr(m, '__pydantic_fields_set__', copy(self.__pydantic_fields_set__)) - if not hasattr(self, '__pydantic_private__') or self.__pydantic_private__ is None: + if self.__pydantic_private__ is None: _object_setattr(m, '__pydantic_private__', None) else: _object_setattr( @@ -971,7 +704,7 @@ class BaseModel(metaclass=_model_construction.ModelMetaclass): return m - def __deepcopy__(self, memo: dict[int, Any] | None = None) -> Self: + def __deepcopy__(self: Model, memo: dict[int, Any] | None = None) -> Model: """Returns a deep copy of the model.""" cls = type(self) m = cls.__new__(cls) @@ -981,7 +714,7 @@ class BaseModel(metaclass=_model_construction.ModelMetaclass): # and attempting a deepcopy would be marginally slower. _object_setattr(m, '__pydantic_fields_set__', copy(self.__pydantic_fields_set__)) - if not hasattr(self, '__pydantic_private__') or self.__pydantic_private__ is None: + if self.__pydantic_private__ is None: _object_setattr(m, '__pydantic_private__', None) else: _object_setattr( @@ -992,9 +725,8 @@ class BaseModel(metaclass=_model_construction.ModelMetaclass): return m - if not TYPE_CHECKING: + if not typing.TYPE_CHECKING: # We put `__getattr__` in a non-TYPE_CHECKING block because otherwise, mypy allows arbitrary attribute access - # The same goes for __setattr__ and __delattr__, see: https://github.com/pydantic/pydantic/issues/8643 def __getattr__(self, item: str) -> Any: private_attributes = object.__getattribute__(self, '__private_attributes__') @@ -1016,8 +748,11 @@ class BaseModel(metaclass=_model_construction.ModelMetaclass): except AttributeError: pydantic_extra = None - if pydantic_extra and item in pydantic_extra: - return pydantic_extra[item] + if pydantic_extra is not None: + try: + return pydantic_extra[item] + except KeyError as exc: + raise AttributeError(f'{type(self).__name__!r} object has no attribute {item!r}') from exc else: if hasattr(self.__class__, item): return super().__getattribute__(item) # Raises AttributeError if appropriate @@ -1025,105 +760,88 @@ class BaseModel(metaclass=_model_construction.ModelMetaclass): # this is the current error raise AttributeError(f'{type(self).__name__!r} object has no attribute {item!r}') - def __setattr__(self, name: str, value: Any) -> None: - if (setattr_handler := self.__pydantic_setattr_handlers__.get(name)) is not None: - setattr_handler(self, name, value) - # if None is returned from _setattr_handler, the attribute was set directly - elif (setattr_handler := self._setattr_handler(name, value)) is not None: - setattr_handler(self, name, value) # call here to not memo on possibly unknown fields - self.__pydantic_setattr_handlers__[name] = setattr_handler # memoize the handler for faster access - - def _setattr_handler(self, name: str, value: Any) -> Callable[[BaseModel, str, Any], None] | None: - """Get a handler for setting an attribute on the model instance. - - Returns: - A handler for setting an attribute on the model instance. Used for memoization of the handler. - Memoizing the handlers leads to a dramatic performance improvement in `__setattr__` - Returns `None` when memoization is not safe, then the attribute is set directly. - """ - cls = self.__class__ - if name in cls.__class_vars__: - raise AttributeError( - f'{name!r} is a ClassVar of `{cls.__name__}` and cannot be set on an instance. ' - f'If you want to set a value on the class, use `{cls.__name__}.{name} = value`.' - ) - elif not _fields.is_valid_field_name(name): - if (attribute := cls.__private_attributes__.get(name)) is not None: - if hasattr(attribute, '__set__'): - return lambda model, _name, val: attribute.__set__(model, val) - else: - return _SIMPLE_SETATTR_HANDLERS['private'] - else: - _object_setattr(self, name, value) - return None # Can not return memoized handler with possibly freeform attr names - - attr = getattr(cls, name, None) - # NOTE: We currently special case properties and `cached_property`, but we might need - # to generalize this to all data/non-data descriptors at some point. For non-data descriptors - # (such as `cached_property`), it isn't obvious though. `cached_property` caches the value - # to the instance's `__dict__`, but other non-data descriptors might do things differently. - if isinstance(attr, cached_property): - return _SIMPLE_SETATTR_HANDLERS['cached_property'] - - _check_frozen(cls, name, value) - - # We allow properties to be set only on non frozen models for now (to match dataclasses). - # This can be changed if it ever gets requested. - if isinstance(attr, property): - return lambda model, _name, val: attr.__set__(model, val) - elif cls.model_config.get('validate_assignment'): - return _SIMPLE_SETATTR_HANDLERS['validate_assignment'] - elif name not in cls.__pydantic_fields__: - if cls.model_config.get('extra') != 'allow': - # TODO - matching error - raise ValueError(f'"{cls.__name__}" object has no field "{name}"') - elif attr is None: - # attribute does not exist, so put it in extra - self.__pydantic_extra__[name] = value - return None # Can not return memoized handler with possibly freeform attr names - else: - # attribute _does_ exist, and was not in extra, so update it - return _SIMPLE_SETATTR_HANDLERS['extra_known'] + def __setattr__(self, name: str, value: Any) -> None: + if name in self.__class_vars__: + raise AttributeError( + f'{name!r} is a ClassVar of `{self.__class__.__name__}` and cannot be set on an instance. ' + f'If you want to set a value on the class, use `{self.__class__.__name__}.{name} = value`.' + ) + elif not _fields.is_valid_field_name(name): + if self.__pydantic_private__ is None or name not in self.__private_attributes__: + _object_setattr(self, name, value) else: - return _SIMPLE_SETATTR_HANDLERS['model_field'] + attribute = self.__private_attributes__[name] + if hasattr(attribute, '__set__'): + attribute.__set__(self, value) # type: ignore + else: + self.__pydantic_private__[name] = value + return - def __delattr__(self, item: str) -> Any: - cls = self.__class__ + self._check_frozen(name, value) - if item in self.__private_attributes__: - attribute = self.__private_attributes__[item] - if hasattr(attribute, '__delete__'): - attribute.__delete__(self) # type: ignore - return - - try: - # Note: self.__pydantic_private__ cannot be None if self.__private_attributes__ has items - del self.__pydantic_private__[item] # type: ignore - return - except KeyError as exc: - raise AttributeError(f'{cls.__name__!r} object has no attribute {item!r}') from exc - - # Allow cached properties to be deleted (even if the class is frozen): - attr = getattr(cls, item, None) - if isinstance(attr, cached_property): - return object.__delattr__(self, item) - - _check_frozen(cls, name=item, value=None) - - if item in self.__pydantic_fields__: - object.__delattr__(self, item) - elif self.__pydantic_extra__ is not None and item in self.__pydantic_extra__: - del self.__pydantic_extra__[item] + attr = getattr(self.__class__, name, None) + if isinstance(attr, property): + attr.__set__(self, value) + elif self.model_config.get('validate_assignment', None): + self.__pydantic_validator__.validate_assignment(self, name, value) + elif self.model_config.get('extra') != 'allow' and name not in self.model_fields: + # TODO - matching error + raise ValueError(f'"{self.__class__.__name__}" object has no field "{name}"') + elif self.model_config.get('extra') == 'allow' and name not in self.model_fields: + if self.model_extra and name in self.model_extra: + self.__pydantic_extra__[name] = value # type: ignore else: try: - object.__delattr__(self, item) + getattr(self, name) except AttributeError: - raise AttributeError(f'{type(self).__name__!r} object has no attribute {item!r}') + # attribute does not already exist on instance, so put it in extra + self.__pydantic_extra__[name] = value # type: ignore + else: + # attribute _does_ already exist on instance, and was not in extra, so update it + _object_setattr(self, name, value) + else: + self.__dict__[name] = value + self.__pydantic_fields_set__.add(name) - # Because we make use of `@dataclass_transform()`, `__replace__` is already synthesized by - # type checkers, so we define the implementation in this `if not TYPE_CHECKING:` block: - def __replace__(self, **changes: Any) -> Self: - return self.model_copy(update=changes) + def __delattr__(self, item: str) -> Any: + if item in self.__private_attributes__: + attribute = self.__private_attributes__[item] + if hasattr(attribute, '__delete__'): + attribute.__delete__(self) # type: ignore + return + + try: + # Note: self.__pydantic_private__ cannot be None if self.__private_attributes__ has items + del self.__pydantic_private__[item] # type: ignore + return + except KeyError as exc: + raise AttributeError(f'{type(self).__name__!r} object has no attribute {item!r}') from exc + + self._check_frozen(item, None) + + if item in self.model_fields: + object.__delattr__(self, item) + elif self.__pydantic_extra__ is not None and item in self.__pydantic_extra__: + del self.__pydantic_extra__[item] + else: + try: + object.__delattr__(self, item) + except AttributeError: + raise AttributeError(f'{type(self).__name__!r} object has no attribute {item!r}') + + def _check_frozen(self, name: str, value: Any) -> None: + if self.model_config.get('frozen', None): + typ = 'frozen_instance' + elif getattr(self.model_fields.get(name), 'frozen', False): + typ = 'frozen_field' + else: + return + error: pydantic_core.InitErrorDetails = { + 'type': typ, + 'loc': (name,), + 'input': value, + } + raise pydantic_core.ValidationError.from_exception_data(self.__class__.__name__, [error]) def __getstate__(self) -> dict[Any, Any]: private = self.__pydantic_private__ @@ -1137,69 +855,29 @@ class BaseModel(metaclass=_model_construction.ModelMetaclass): } def __setstate__(self, state: dict[Any, Any]) -> None: - _object_setattr(self, '__pydantic_fields_set__', state.get('__pydantic_fields_set__', {})) - _object_setattr(self, '__pydantic_extra__', state.get('__pydantic_extra__', {})) - _object_setattr(self, '__pydantic_private__', state.get('__pydantic_private__', {})) - _object_setattr(self, '__dict__', state.get('__dict__', {})) + _object_setattr(self, '__pydantic_fields_set__', state['__pydantic_fields_set__']) + _object_setattr(self, '__pydantic_extra__', state['__pydantic_extra__']) + _object_setattr(self, '__pydantic_private__', state['__pydantic_private__']) + _object_setattr(self, '__dict__', state['__dict__']) - if not TYPE_CHECKING: + def __eq__(self, other: Any) -> bool: + if isinstance(other, BaseModel): + # When comparing instances of generic types for equality, as long as all field values are equal, + # only require their generic origin types to be equal, rather than exact type equality. + # This prevents headaches like MyGeneric(x=1) != MyGeneric[Any](x=1). + self_type = self.__pydantic_generic_metadata__['origin'] or self.__class__ + other_type = other.__pydantic_generic_metadata__['origin'] or other.__class__ - def __eq__(self, other: Any) -> bool: - if isinstance(other, BaseModel): - # When comparing instances of generic types for equality, as long as all field values are equal, - # only require their generic origin types to be equal, rather than exact type equality. - # This prevents headaches like MyGeneric(x=1) != MyGeneric[Any](x=1). - self_type = self.__pydantic_generic_metadata__['origin'] or self.__class__ - other_type = other.__pydantic_generic_metadata__['origin'] or other.__class__ + return ( + self_type == other_type + and self.__dict__ == other.__dict__ + and self.__pydantic_private__ == other.__pydantic_private__ + and self.__pydantic_extra__ == other.__pydantic_extra__ + ) + else: + return NotImplemented # delegate to the other item in the comparison - # Perform common checks first - if not ( - self_type == other_type - and getattr(self, '__pydantic_private__', None) == getattr(other, '__pydantic_private__', None) - and self.__pydantic_extra__ == other.__pydantic_extra__ - ): - return False - - # We only want to compare pydantic fields but ignoring fields is costly. - # We'll perform a fast check first, and fallback only when needed - # See GH-7444 and GH-7825 for rationale and a performance benchmark - - # First, do the fast (and sometimes faulty) __dict__ comparison - if self.__dict__ == other.__dict__: - # If the check above passes, then pydantic fields are equal, we can return early - return True - - # We don't want to trigger unnecessary costly filtering of __dict__ on all unequal objects, so we return - # early if there are no keys to ignore (we would just return False later on anyway) - model_fields = type(self).__pydantic_fields__.keys() - if self.__dict__.keys() <= model_fields and other.__dict__.keys() <= model_fields: - return False - - # If we reach here, there are non-pydantic-fields keys, mapped to unequal values, that we need to ignore - # Resort to costly filtering of the __dict__ objects - # We use operator.itemgetter because it is much faster than dict comprehensions - # NOTE: Contrary to standard python class and instances, when the Model class has a default value for an - # attribute and the model instance doesn't have a corresponding attribute, accessing the missing attribute - # raises an error in BaseModel.__getattr__ instead of returning the class attribute - # So we can use operator.itemgetter() instead of operator.attrgetter() - getter = operator.itemgetter(*model_fields) if model_fields else lambda _: _utils._SENTINEL - try: - return getter(self.__dict__) == getter(other.__dict__) - except KeyError: - # In rare cases (such as when using the deprecated BaseModel.copy() method), - # the __dict__ may not contain all model fields, which is how we can get here. - # getter(self.__dict__) is much faster than any 'safe' method that accounts - # for missing keys, and wrapping it in a `try` doesn't slow things down much - # in the common case. - self_fields_proxy = _utils.SafeGetItemProxy(self.__dict__) - other_fields_proxy = _utils.SafeGetItemProxy(other.__dict__) - return getter(self_fields_proxy) == getter(other_fields_proxy) - - # other instance is not a BaseModel - else: - return NotImplemented # delegate to the other item in the comparison - - if TYPE_CHECKING: + if typing.TYPE_CHECKING: # We put `__init_subclass__` in a TYPE_CHECKING block because, even though we want the type-checking benefits # described in the signature of `__init_subclass__` below, we don't want to modify the default behavior of # subclass initialization. @@ -1208,10 +886,11 @@ class BaseModel(metaclass=_model_construction.ModelMetaclass): """This signature is included purely to help type-checkers check arguments to class declaration, which provides a way to conveniently set model_config key/value pairs. - ```python + ```py from pydantic import BaseModel - class MyModel(BaseModel, extra='allow'): ... + class MyModel(BaseModel, extra='allow'): + ... ``` However, this may be deceiving, since the _actual_ calls to `__init_subclass__` will not receive any @@ -1237,20 +916,11 @@ class BaseModel(metaclass=_model_construction.ModelMetaclass): return f'{self.__repr_name__()}({self.__repr_str__(", ")})' def __repr_args__(self) -> _repr.ReprArgs: - # Eagerly create the repr of computed fields, as this may trigger access of cached properties and as such - # modify the instance's `__dict__`. If we don't do it now, it could happen when iterating over the `__dict__` - # below if the instance happens to be referenced in a field, and would modify the `__dict__` size *during* iteration. - computed_fields_repr_args = [ - (k, getattr(self, k)) for k, v in self.__pydantic_computed_fields__.items() if v.repr - ] - for k, v in self.__dict__.items(): - field = self.__pydantic_fields__.get(k) + field = self.model_fields.get(k) if field and field.repr: - if v is not self: - yield k, v - else: - yield k, self.__repr_recursion__(v) + yield k, v + # `__pydantic_extra__` can fail to be set if the model is not yet fully initialized. # This can happen if a `ValidationError` is raised during initialization and the instance's # repr is generated as part of the exception handling. Therefore, we use `getattr` here @@ -1262,11 +932,10 @@ class BaseModel(metaclass=_model_construction.ModelMetaclass): if pydantic_extra is not None: yield from ((k, v) for k, v in pydantic_extra.items()) - yield from computed_fields_repr_args + yield from ((k, getattr(self, k)) for k, v in self.model_computed_fields.items() if v.repr) # take logic from `_repr.Representation` without the side effects of inheritance, see #5740 __repr_name__ = _repr.Representation.__repr_name__ - __repr_recursion__ = _repr.Representation.__repr_recursion__ __repr_str__ = _repr.Representation.__repr_str__ __pretty__ = _repr.Representation.__pretty__ __rich_repr__ = _repr.Representation.__rich_repr__ @@ -1277,45 +946,37 @@ class BaseModel(metaclass=_model_construction.ModelMetaclass): # ##### Deprecated methods from v1 ##### @property @typing_extensions.deprecated( - 'The `__fields__` attribute is deprecated, use the `model_fields` class property instead.', category=None + 'The `__fields__` attribute is deprecated, use `model_fields` instead.', category=PydanticDeprecatedSince20 ) def __fields__(self) -> dict[str, FieldInfo]: - warnings.warn( - 'The `__fields__` attribute is deprecated, use the `model_fields` class property instead.', - category=PydanticDeprecatedSince20, - stacklevel=2, - ) - return getattr(type(self), '__pydantic_fields__', {}) + warnings.warn('The `__fields__` attribute is deprecated, use `model_fields` instead.', DeprecationWarning) + return self.model_fields @property @typing_extensions.deprecated( 'The `__fields_set__` attribute is deprecated, use `model_fields_set` instead.', - category=None, + category=PydanticDeprecatedSince20, ) def __fields_set__(self) -> set[str]: warnings.warn( - 'The `__fields_set__` attribute is deprecated, use `model_fields_set` instead.', - category=PydanticDeprecatedSince20, - stacklevel=2, + 'The `__fields_set__` attribute is deprecated, use `model_fields_set` instead.', DeprecationWarning ) return self.__pydantic_fields_set__ - @typing_extensions.deprecated('The `dict` method is deprecated; use `model_dump` instead.', category=None) + @typing_extensions.deprecated( + 'The `dict` method is deprecated; use `model_dump` instead.', category=PydanticDeprecatedSince20 + ) def dict( # noqa: D102 self, *, - include: IncEx | None = None, - exclude: IncEx | None = None, + include: IncEx = None, + exclude: IncEx = None, by_alias: bool = False, exclude_unset: bool = False, exclude_defaults: bool = False, exclude_none: bool = False, - ) -> Dict[str, Any]: # noqa UP006 - warnings.warn( - 'The `dict` method is deprecated; use `model_dump` instead.', - category=PydanticDeprecatedSince20, - stacklevel=2, - ) + ) -> typing.Dict[str, Any]: # noqa UP006 + warnings.warn('The `dict` method is deprecated; use `model_dump` instead.', DeprecationWarning) return self.model_dump( include=include, exclude=exclude, @@ -1325,25 +986,23 @@ class BaseModel(metaclass=_model_construction.ModelMetaclass): exclude_none=exclude_none, ) - @typing_extensions.deprecated('The `json` method is deprecated; use `model_dump_json` instead.', category=None) + @typing_extensions.deprecated( + 'The `json` method is deprecated; use `model_dump_json` instead.', category=PydanticDeprecatedSince20 + ) def json( # noqa: D102 self, *, - include: IncEx | None = None, - exclude: IncEx | None = None, + include: IncEx = None, + exclude: IncEx = None, by_alias: bool = False, exclude_unset: bool = False, exclude_defaults: bool = False, exclude_none: bool = False, - encoder: Callable[[Any], Any] | None = PydanticUndefined, # type: ignore[assignment] + encoder: typing.Callable[[Any], Any] | None = PydanticUndefined, # type: ignore[assignment] models_as_dict: bool = PydanticUndefined, # type: ignore[assignment] **dumps_kwargs: Any, ) -> str: - warnings.warn( - 'The `json` method is deprecated; use `model_dump_json` instead.', - category=PydanticDeprecatedSince20, - stacklevel=2, - ) + warnings.warn('The `json` method is deprecated; use `model_dump_json` instead.', DeprecationWarning) if encoder is not PydanticUndefined: raise TypeError('The `encoder` argument is no longer supported; use field serializers instead.') if models_as_dict is not PydanticUndefined: @@ -1360,35 +1019,32 @@ class BaseModel(metaclass=_model_construction.ModelMetaclass): ) @classmethod - @typing_extensions.deprecated('The `parse_obj` method is deprecated; use `model_validate` instead.', category=None) - def parse_obj(cls, obj: Any) -> Self: # noqa: D102 - warnings.warn( - 'The `parse_obj` method is deprecated; use `model_validate` instead.', - category=PydanticDeprecatedSince20, - stacklevel=2, - ) + @typing_extensions.deprecated( + 'The `parse_obj` method is deprecated; use `model_validate` instead.', category=PydanticDeprecatedSince20 + ) + def parse_obj(cls: type[Model], obj: Any) -> Model: # noqa: D102 + warnings.warn('The `parse_obj` method is deprecated; use `model_validate` instead.', DeprecationWarning) return cls.model_validate(obj) @classmethod @typing_extensions.deprecated( 'The `parse_raw` method is deprecated; if your data is JSON use `model_validate_json`, ' 'otherwise load the data then use `model_validate` instead.', - category=None, + category=PydanticDeprecatedSince20, ) def parse_raw( # noqa: D102 - cls, + cls: type[Model], b: str | bytes, *, content_type: str | None = None, encoding: str = 'utf8', proto: DeprecatedParseProtocol | None = None, allow_pickle: bool = False, - ) -> Self: # pragma: no cover + ) -> Model: # pragma: no cover warnings.warn( 'The `parse_raw` method is deprecated; if your data is JSON use `model_validate_json`, ' 'otherwise load the data then use `model_validate` instead.', - category=PydanticDeprecatedSince20, - stacklevel=2, + DeprecationWarning, ) from .deprecated import parse @@ -1427,22 +1083,21 @@ class BaseModel(metaclass=_model_construction.ModelMetaclass): @typing_extensions.deprecated( 'The `parse_file` method is deprecated; load the data from file, then if your data is JSON ' 'use `model_validate_json`, otherwise `model_validate` instead.', - category=None, + category=PydanticDeprecatedSince20, ) def parse_file( # noqa: D102 - cls, + cls: type[Model], path: str | Path, *, content_type: str | None = None, encoding: str = 'utf8', proto: DeprecatedParseProtocol | None = None, allow_pickle: bool = False, - ) -> Self: + ) -> Model: warnings.warn( 'The `parse_file` method is deprecated; load the data from file, then if your data is JSON ' - 'use `model_validate_json`, otherwise `model_validate` instead.', - category=PydanticDeprecatedSince20, - stacklevel=2, + 'use `model_validate_json` otherwise `model_validate` instead.', + DeprecationWarning, ) from .deprecated import parse @@ -1459,14 +1114,13 @@ class BaseModel(metaclass=_model_construction.ModelMetaclass): @typing_extensions.deprecated( 'The `from_orm` method is deprecated; set ' "`model_config['from_attributes']=True` and use `model_validate` instead.", - category=None, + category=PydanticDeprecatedSince20, ) - def from_orm(cls, obj: Any) -> Self: # noqa: D102 + def from_orm(cls: type[Model], obj: Any) -> Model: # noqa: D102 warnings.warn( - 'The `from_orm` method is deprecated; set ' - "`model_config['from_attributes']=True` and use `model_validate` instead.", - category=PydanticDeprecatedSince20, - stacklevel=2, + 'The `from_orm` method is deprecated; set `model_config["from_attributes"]=True` ' + 'and use `model_validate` instead.', + DeprecationWarning, ) if not cls.model_config.get('from_attributes', None): raise PydanticUserError( @@ -1475,28 +1129,24 @@ class BaseModel(metaclass=_model_construction.ModelMetaclass): return cls.model_validate(obj) @classmethod - @typing_extensions.deprecated('The `construct` method is deprecated; use `model_construct` instead.', category=None) - def construct(cls, _fields_set: set[str] | None = None, **values: Any) -> Self: # noqa: D102 - warnings.warn( - 'The `construct` method is deprecated; use `model_construct` instead.', - category=PydanticDeprecatedSince20, - stacklevel=2, - ) + @typing_extensions.deprecated( + 'The `construct` method is deprecated; use `model_construct` instead.', category=PydanticDeprecatedSince20 + ) + def construct(cls: type[Model], _fields_set: set[str] | None = None, **values: Any) -> Model: # noqa: D102 + warnings.warn('The `construct` method is deprecated; use `model_construct` instead.', DeprecationWarning) return cls.model_construct(_fields_set=_fields_set, **values) @typing_extensions.deprecated( - 'The `copy` method is deprecated; use `model_copy` instead. ' - 'See the docstring of `BaseModel.copy` for details about how to handle `include` and `exclude`.', - category=None, + 'The copy method is deprecated; use `model_copy` instead.', category=PydanticDeprecatedSince20 ) def copy( - self, + self: Model, *, include: AbstractSetIntStr | MappingIntStrAny | None = None, exclude: AbstractSetIntStr | MappingIntStrAny | None = None, - update: Dict[str, Any] | None = None, # noqa UP006 + update: typing.Dict[str, Any] | None = None, # noqa UP006 deep: bool = False, - ) -> Self: # pragma: no cover + ) -> Model: # pragma: no cover """Returns a copy of the model. !!! warning "Deprecated" @@ -1504,17 +1154,20 @@ class BaseModel(metaclass=_model_construction.ModelMetaclass): If you need `include` or `exclude`, use: - ```python {test="skip" lint="skip"} + ```py data = self.model_dump(include=include, exclude=exclude, round_trip=True) data = {**data, **(update or {})} copied = self.model_validate(data) ``` Args: - include: Optional set or mapping specifying which fields to include in the copied model. - exclude: Optional set or mapping specifying which fields to exclude in the copied model. - update: Optional dictionary of field-value pairs to override field values in the copied model. - deep: If True, the values of fields that are Pydantic models will be deep-copied. + include: Optional set or mapping + specifying which fields to include in the copied model. + exclude: Optional set or mapping + specifying which fields to exclude in the copied model. + update: Optional dictionary of field-value pairs to override field values + in the copied model. + deep: If True, the values of fields that are Pydantic models will be deep copied. Returns: A copy of the model with included, excluded and updated fields as specified. @@ -1522,8 +1175,7 @@ class BaseModel(metaclass=_model_construction.ModelMetaclass): warnings.warn( 'The `copy` method is deprecated; use `model_copy` instead. ' 'See the docstring of `BaseModel.copy` for details about how to handle `include` and `exclude`.', - category=PydanticDeprecatedSince20, - stacklevel=2, + DeprecationWarning, ) from .deprecated import copy_internals @@ -1562,32 +1214,29 @@ class BaseModel(metaclass=_model_construction.ModelMetaclass): return copy_internals._copy_and_set_values(self, values, fields_set, extra, private, deep=deep) @classmethod - @typing_extensions.deprecated('The `schema` method is deprecated; use `model_json_schema` instead.', category=None) + @typing_extensions.deprecated( + 'The `schema` method is deprecated; use `model_json_schema` instead.', category=PydanticDeprecatedSince20 + ) def schema( # noqa: D102 cls, by_alias: bool = True, ref_template: str = DEFAULT_REF_TEMPLATE - ) -> Dict[str, Any]: # noqa UP006 - warnings.warn( - 'The `schema` method is deprecated; use `model_json_schema` instead.', - category=PydanticDeprecatedSince20, - stacklevel=2, - ) + ) -> typing.Dict[str, Any]: # noqa UP006 + warnings.warn('The `schema` method is deprecated; use `model_json_schema` instead.', DeprecationWarning) return cls.model_json_schema(by_alias=by_alias, ref_template=ref_template) @classmethod @typing_extensions.deprecated( 'The `schema_json` method is deprecated; use `model_json_schema` and json.dumps instead.', - category=None, + category=PydanticDeprecatedSince20, ) def schema_json( # noqa: D102 cls, *, by_alias: bool = True, ref_template: str = DEFAULT_REF_TEMPLATE, **dumps_kwargs: Any ) -> str: # pragma: no cover - warnings.warn( - 'The `schema_json` method is deprecated; use `model_json_schema` and json.dumps instead.', - category=PydanticDeprecatedSince20, - stacklevel=2, - ) import json + warnings.warn( + 'The `schema_json` method is deprecated; use `model_json_schema` and json.dumps instead.', + DeprecationWarning, + ) from .deprecated.json import pydantic_encoder return json.dumps( @@ -1597,52 +1246,44 @@ class BaseModel(metaclass=_model_construction.ModelMetaclass): ) @classmethod - @typing_extensions.deprecated('The `validate` method is deprecated; use `model_validate` instead.', category=None) - def validate(cls, value: Any) -> Self: # noqa: D102 - warnings.warn( - 'The `validate` method is deprecated; use `model_validate` instead.', - category=PydanticDeprecatedSince20, - stacklevel=2, - ) + @typing_extensions.deprecated( + 'The `validate` method is deprecated; use `model_validate` instead.', category=PydanticDeprecatedSince20 + ) + def validate(cls: type[Model], value: Any) -> Model: # noqa: D102 + warnings.warn('The `validate` method is deprecated; use `model_validate` instead.', DeprecationWarning) return cls.model_validate(value) @classmethod @typing_extensions.deprecated( 'The `update_forward_refs` method is deprecated; use `model_rebuild` instead.', - category=None, + category=PydanticDeprecatedSince20, ) def update_forward_refs(cls, **localns: Any) -> None: # noqa: D102 warnings.warn( - 'The `update_forward_refs` method is deprecated; use `model_rebuild` instead.', - category=PydanticDeprecatedSince20, - stacklevel=2, + 'The `update_forward_refs` method is deprecated; use `model_rebuild` instead.', DeprecationWarning ) if localns: # pragma: no cover raise TypeError('`localns` arguments are not longer accepted.') cls.model_rebuild(force=True) @typing_extensions.deprecated( - 'The private method `_iter` will be removed and should no longer be used.', category=None + 'The private method `_iter` will be removed and should no longer be used.', category=PydanticDeprecatedSince20 ) def _iter(self, *args: Any, **kwargs: Any) -> Any: - warnings.warn( - 'The private method `_iter` will be removed and should no longer be used.', - category=PydanticDeprecatedSince20, - stacklevel=2, - ) + warnings.warn('The private method `_iter` will be removed and should no longer be used.', DeprecationWarning) + from .deprecated import copy_internals return copy_internals._iter(self, *args, **kwargs) @typing_extensions.deprecated( 'The private method `_copy_and_set_values` will be removed and should no longer be used.', - category=None, + category=PydanticDeprecatedSince20, ) def _copy_and_set_values(self, *args: Any, **kwargs: Any) -> Any: warnings.warn( - 'The private method `_copy_and_set_values` will be removed and should no longer be used.', - category=PydanticDeprecatedSince20, - stacklevel=2, + 'The private method `_copy_and_set_values` will be removed and should no longer be used.', + DeprecationWarning, ) from .deprecated import copy_internals @@ -1651,110 +1292,88 @@ class BaseModel(metaclass=_model_construction.ModelMetaclass): @classmethod @typing_extensions.deprecated( 'The private method `_get_value` will be removed and should no longer be used.', - category=None, + category=PydanticDeprecatedSince20, ) def _get_value(cls, *args: Any, **kwargs: Any) -> Any: warnings.warn( - 'The private method `_get_value` will be removed and should no longer be used.', - category=PydanticDeprecatedSince20, - stacklevel=2, + 'The private method `_get_value` will be removed and should no longer be used.', DeprecationWarning ) + from .deprecated import copy_internals return copy_internals._get_value(cls, *args, **kwargs) @typing_extensions.deprecated( 'The private method `_calculate_keys` will be removed and should no longer be used.', - category=None, + category=PydanticDeprecatedSince20, ) def _calculate_keys(self, *args: Any, **kwargs: Any) -> Any: warnings.warn( - 'The private method `_calculate_keys` will be removed and should no longer be used.', - category=PydanticDeprecatedSince20, - stacklevel=2, + 'The private method `_calculate_keys` will be removed and should no longer be used.', DeprecationWarning ) + from .deprecated import copy_internals return copy_internals._calculate_keys(self, *args, **kwargs) -ModelT = TypeVar('ModelT', bound=BaseModel) - - -@overload +@typing.overload def create_model( - model_name: str, - /, + __model_name: str, *, __config__: ConfigDict | None = None, __doc__: str | None = None, __base__: None = None, __module__: str = __name__, - __validators__: dict[str, Callable[..., Any]] | None = None, + __validators__: dict[str, classmethod] | None = None, __cls_kwargs__: dict[str, Any] | None = None, - __qualname__: str | None = None, - **field_definitions: Any | tuple[str, Any], -) -> type[BaseModel]: ... + **field_definitions: Any, +) -> type[BaseModel]: + ... -@overload +@typing.overload def create_model( - model_name: str, - /, + __model_name: str, *, __config__: ConfigDict | None = None, __doc__: str | None = None, - __base__: type[ModelT] | tuple[type[ModelT], ...], + __base__: type[Model] | tuple[type[Model], ...], __module__: str = __name__, - __validators__: dict[str, Callable[..., Any]] | None = None, + __validators__: dict[str, classmethod] | None = None, __cls_kwargs__: dict[str, Any] | None = None, - __qualname__: str | None = None, - **field_definitions: Any | tuple[str, Any], -) -> type[ModelT]: ... + **field_definitions: Any, +) -> type[Model]: + ... def create_model( # noqa: C901 - model_name: str, - /, + __model_name: str, *, __config__: ConfigDict | None = None, __doc__: str | None = None, - __base__: type[ModelT] | tuple[type[ModelT], ...] | None = None, + __base__: type[Model] | tuple[type[Model], ...] | None = None, __module__: str | None = None, - __validators__: dict[str, Callable[..., Any]] | None = None, + __validators__: dict[str, classmethod] | None = None, __cls_kwargs__: dict[str, Any] | None = None, - __qualname__: str | None = None, - # TODO PEP 747: replace `Any` by the TypeForm: - **field_definitions: Any | tuple[str, Any], -) -> type[ModelT]: - """!!! abstract "Usage Documentation" - [Dynamic Model Creation](../concepts/models.md#dynamic-model-creation) - - Dynamically creates and returns a new Pydantic model, in other words, `create_model` dynamically creates a + __slots__: tuple[str, ...] | None = None, + **field_definitions: Any, +) -> type[Model]: + """Dynamically creates and returns a new Pydantic model, in other words, `create_model` dynamically creates a subclass of [`BaseModel`][pydantic.BaseModel]. - !!! warning - This function may execute arbitrary code contained in field annotations, if string references need to be evaluated. - - See [Security implications of introspecting annotations](https://docs.python.org/3/library/annotationlib.html#annotationlib-security) for more information. - Args: - model_name: The name of the newly created model. + __model_name: The name of the newly created model. __config__: The configuration of the new model. __doc__: The docstring of the new model. - __base__: The base class or classes for the new model. - __module__: The name of the module that the model belongs to; - if `None`, the value is taken from `sys._getframe(1)` - __validators__: A dictionary of methods that validate fields. The keys are the names of the validation methods to - be added to the model, and the values are the validation methods themselves. You can read more about functional - validators [here](https://docs.pydantic.dev/2.9/concepts/validators/#field-validators). - __cls_kwargs__: A dictionary of keyword arguments for class creation, such as `metaclass`. - __qualname__: The qualified name of the newly created model. - **field_definitions: Field definitions of the new model. Either: - - - a single element, representing the type annotation of the field. - - a two-tuple, the first element being the type and the second element the assigned value - (either a default or the [`Field()`][pydantic.Field] function). + __base__: The base class for the new model. + __module__: The name of the module that the model belongs to, + if `None` the value is taken from `sys._getframe(1)` + __validators__: A dictionary of methods that validate fields. + __cls_kwargs__: A dictionary of keyword arguments for class creation. + __slots__: Deprecated. Should not be passed to `create_model`. + **field_definitions: Attributes of the new model. They should be passed in the format: + `=(, )` or `=(, )`. Returns: The new [model][pydantic.BaseModel]. @@ -1762,29 +1381,44 @@ def create_model( # noqa: C901 Raises: PydanticUserError: If `__base__` and `__config__` are both passed. """ - if __base__ is None: - __base__ = (cast('type[ModelT]', BaseModel),) - elif not isinstance(__base__, tuple): - __base__ = (__base__,) + if __slots__ is not None: + # __slots__ will be ignored from here on + warnings.warn('__slots__ should not be passed to create_model', RuntimeWarning) + + if __base__ is not None: + if __config__ is not None: + raise PydanticUserError( + 'to avoid confusion `__config__` and `__base__` cannot be used together', + code='create-model-config-base', + ) + if not isinstance(__base__, tuple): + __base__ = (__base__,) + else: + __base__ = (typing.cast(typing.Type['Model'], BaseModel),) __cls_kwargs__ = __cls_kwargs__ or {} - fields: dict[str, Any] = {} - annotations: dict[str, Any] = {} + fields = {} + annotations = {} for f_name, f_def in field_definitions.items(): + if not _fields.is_valid_field_name(f_name): + warnings.warn(f'fields may not start with an underscore, ignoring "{f_name}"', RuntimeWarning) if isinstance(f_def, tuple): - if len(f_def) != 2: + f_def = typing.cast('tuple[str, Any]', f_def) + try: + f_annotation, f_value = f_def + except ValueError as e: raise PydanticUserError( - f'Field definition for {f_name!r} should a single element representing the type or a two-tuple, the first element ' - 'being the type and the second element the assigned value (either a default or the `Field()` function).', + 'Field definitions should be a `(, )`.', code='create-model-field-definitions', - ) - - annotations[f_name] = f_def[0] - fields[f_name] = f_def[1] + ) from e else: - annotations[f_name] = f_def + f_annotation, f_value = None, f_def + + if f_annotation: + annotations[f_name] = f_annotation + fields[f_name] = f_value if __module__ is None: f = sys._getframe(1) @@ -1792,22 +1426,20 @@ def create_model( # noqa: C901 namespace: dict[str, Any] = {'__annotations__': annotations, '__module__': __module__} if __doc__: - namespace['__doc__'] = __doc__ - if __qualname__ is not None: - namespace['__qualname__'] = __qualname__ + namespace.update({'__doc__': __doc__}) if __validators__: namespace.update(__validators__) namespace.update(fields) if __config__: - namespace['model_config'] = __config__ + namespace['model_config'] = _config.ConfigWrapper(__config__).config_dict resolved_bases = types.resolve_bases(__base__) - meta, ns, kwds = types.prepare_class(model_name, resolved_bases, kwds=__cls_kwargs__) + meta, ns, kwds = types.prepare_class(__model_name, resolved_bases, kwds=__cls_kwargs__) if resolved_bases is not __base__: ns['__orig_bases__'] = __base__ namespace.update(ns) return meta( - model_name, + __model_name, resolved_bases, namespace, __pydantic_reset_parent_namespace__=False, diff --git a/Backend/venv/lib/python3.12/site-packages/pydantic/mypy.py b/Backend/venv/lib/python3.12/site-packages/pydantic/mypy.py index 6e8228ef..c4b6e2a6 100644 --- a/Backend/venv/lib/python3.12/site-packages/pydantic/mypy.py +++ b/Backend/venv/lib/python3.12/site-packages/pydantic/mypy.py @@ -3,9 +3,8 @@ from __future__ import annotations import sys -from collections.abc import Iterator from configparser import ConfigParser -from typing import Any, Callable +from typing import Any, Callable, Iterator from mypy.errorcodes import ErrorCode from mypy.expandtype import expand_type, expand_type_by_instance @@ -15,7 +14,6 @@ from mypy.nodes import ( ARG_OPT, ARG_POS, ARG_STAR2, - INVARIANT, MDEF, Argument, AssignmentStmt, @@ -47,24 +45,26 @@ from mypy.options import Options from mypy.plugin import ( CheckerPluginInterface, ClassDefContext, + FunctionContext, MethodContext, Plugin, ReportConfigContext, SemanticAnalyzerPluginInterface, ) +from mypy.plugins import dataclasses from mypy.plugins.common import ( deserialize_and_fixup_type, ) from mypy.semanal import set_callable_name from mypy.server.trigger import make_wildcard_trigger from mypy.state import state -from mypy.type_visitor import TypeTranslator from mypy.typeops import map_type_from_supertype from mypy.types import ( AnyType, CallableType, Instance, NoneType, + Overloaded, Type, TypeOfAny, TypeType, @@ -79,6 +79,12 @@ from mypy.version import __version__ as mypy_version from pydantic._internal import _fields from pydantic.version import parse_mypy_version +try: + from mypy.types import TypeVarDef # type: ignore[attr-defined] +except ImportError: # pragma: no cover + # Backward-compatible with TypeVarDef from Mypy 0.930. + from mypy.types import TypeVarType as TypeVarDef + CONFIGFILE_KEY = 'pydantic-mypy' METADATA_KEY = 'pydantic-mypy-metadata' BASEMODEL_FULLNAME = 'pydantic.main.BaseModel' @@ -96,11 +102,10 @@ DECORATOR_FULLNAMES = { 'pydantic.deprecated.class_validators.validator', 'pydantic.deprecated.class_validators.root_validator', } -IMPLICIT_CLASSMETHOD_DECORATOR_FULLNAMES = DECORATOR_FULLNAMES - {'pydantic.functional_serializers.model_serializer'} MYPY_VERSION_TUPLE = parse_mypy_version(mypy_version) -BUILTINS_NAME = 'builtins' +BUILTINS_NAME = 'builtins' if MYPY_VERSION_TUPLE >= (0, 930) else '__builtins__' # Increment version if plugin changes and mypy caches should be invalidated __version__ = 2 @@ -129,12 +134,12 @@ class PydanticPlugin(Plugin): self._plugin_data = self.plugin_config.to_data() super().__init__(options) - def get_base_class_hook(self, fullname: str) -> Callable[[ClassDefContext], None] | None: + def get_base_class_hook(self, fullname: str) -> Callable[[ClassDefContext], bool] | None: """Update Pydantic model class.""" sym = self.lookup_fully_qualified(fullname) if sym and isinstance(sym.node, TypeInfo): # pragma: no branch # No branching may occur if the mypy cache has not been cleared - if sym.node.has_base(BASEMODEL_FULLNAME): + if any(base.fullname == BASEMODEL_FULLNAME for base in sym.node.mro): return self._pydantic_model_class_maker_callback return None @@ -144,12 +149,28 @@ class PydanticPlugin(Plugin): return self._pydantic_model_metaclass_marker_callback return None + def get_function_hook(self, fullname: str) -> Callable[[FunctionContext], Type] | None: + """Adjust the return type of the `Field` function.""" + sym = self.lookup_fully_qualified(fullname) + if sym and sym.fullname == FIELD_FULLNAME: + return self._pydantic_field_callback + return None + def get_method_hook(self, fullname: str) -> Callable[[MethodContext], Type] | None: """Adjust return type of `from_orm` method call.""" if fullname.endswith('.from_orm'): return from_attributes_callback return None + def get_class_decorator_hook(self, fullname: str) -> Callable[[ClassDefContext], None] | None: + """Mark pydantic.dataclasses as dataclass. + + Mypy version 1.1.1 added support for `@dataclass_transform` decorator. + """ + if fullname == DATACLASS_FULLNAME and MYPY_VERSION_TUPLE < (1, 1): + return dataclasses.dataclass_class_maker_callback # type: ignore[return-value] + return None + def report_config_data(self, ctx: ReportConfigContext) -> dict[str, Any]: """Return all plugin config data. @@ -157,9 +178,9 @@ class PydanticPlugin(Plugin): """ return self._plugin_data - def _pydantic_model_class_maker_callback(self, ctx: ClassDefContext) -> None: + def _pydantic_model_class_maker_callback(self, ctx: ClassDefContext) -> bool: transformer = PydanticModelTransformer(ctx.cls, ctx.reason, ctx.api, self.plugin_config) - transformer.transform() + return transformer.transform() def _pydantic_model_metaclass_marker_callback(self, ctx: ClassDefContext) -> None: """Reset dataclass_transform_spec attribute of ModelMetaclass. @@ -174,6 +195,54 @@ class PydanticPlugin(Plugin): if getattr(info_metaclass.type, 'dataclass_transform_spec', None): info_metaclass.type.dataclass_transform_spec = None + def _pydantic_field_callback(self, ctx: FunctionContext) -> Type: + """Extract the type of the `default` argument from the Field function, and use it as the return type. + + In particular: + * Check whether the default and default_factory argument is specified. + * Output an error if both are specified. + * Retrieve the type of the argument which is specified, and use it as return type for the function. + """ + default_any_type = ctx.default_return_type + + assert ctx.callee_arg_names[0] == 'default', '"default" is no longer first argument in Field()' + assert ctx.callee_arg_names[1] == 'default_factory', '"default_factory" is no longer second argument in Field()' + default_args = ctx.args[0] + default_factory_args = ctx.args[1] + + if default_args and default_factory_args: + error_default_and_default_factory_specified(ctx.api, ctx.context) + return default_any_type + + if default_args: + default_type = ctx.arg_types[0][0] + default_arg = default_args[0] + + # Fallback to default Any type if the field is required + if not isinstance(default_arg, EllipsisExpr): + return default_type + + elif default_factory_args: + default_factory_type = ctx.arg_types[1][0] + + # Functions which use `ParamSpec` can be overloaded, exposing the callable's types as a parameter + # Pydantic calls the default factory without any argument, so we retrieve the first item + if isinstance(default_factory_type, Overloaded): + default_factory_type = default_factory_type.items[0] + + if isinstance(default_factory_type, CallableType): + ret_type = default_factory_type.ret_type + # mypy doesn't think `ret_type` has `args`, you'd think mypy should know, + # add this check in case it varies by version + args = getattr(ret_type, 'args', None) + if args: + if all(isinstance(arg, TypeVarType) for arg in args): + # Looks like the default factory is a type like `list` or `dict`, replace all args with `Any` + ret_type.args = tuple(default_any_type for _ in args) # type: ignore[attr-defined] + return ret_type + + return default_any_type + class PydanticPluginConfig: """A Pydantic mypy plugin config holder. @@ -238,9 +307,6 @@ def from_attributes_callback(ctx: MethodContext) -> Type: pydantic_metadata = model_type.type.metadata.get(METADATA_KEY) if pydantic_metadata is None: return ctx.default_return_type - if not model_type.type.has_base(BASEMODEL_FULLNAME): - # not a Pydantic v2 model - return ctx.default_return_type from_attributes = pydantic_metadata.get('config', {}).get('from_attributes') if from_attributes is not True: error_from_attributes(model_type.type.name, ctx.api, ctx.context) @@ -254,10 +320,8 @@ class PydanticModelField: self, name: str, alias: str | None, - is_frozen: bool, has_dynamic_alias: bool, has_default: bool, - strict: bool | None, line: int, column: int, type: Type | None, @@ -265,103 +329,41 @@ class PydanticModelField: ): self.name = name self.alias = alias - self.is_frozen = is_frozen self.has_dynamic_alias = has_dynamic_alias self.has_default = has_default - self.strict = strict self.line = line self.column = column self.type = type self.info = info - def to_argument( - self, - current_info: TypeInfo, - typed: bool, - model_strict: bool, - force_optional: bool, - use_alias: bool, - api: SemanticAnalyzerPluginInterface, - force_typevars_invariant: bool, - is_root_model_root: bool, - ) -> Argument: + def to_argument(self, current_info: TypeInfo, typed: bool, force_optional: bool, use_alias: bool) -> Argument: """Based on mypy.plugins.dataclasses.DataclassAttribute.to_argument.""" - variable = self.to_var(current_info, api, use_alias, force_typevars_invariant) - - strict = model_strict if self.strict is None else self.strict - if typed or strict: - type_annotation = self.expand_type(current_info, api, include_root_type=True) - else: - type_annotation = AnyType(TypeOfAny.explicit) - return Argument( - variable=variable, - type_annotation=type_annotation, + variable=self.to_var(current_info, use_alias), + type_annotation=self.expand_type(current_info) if typed else AnyType(TypeOfAny.explicit), initializer=None, - kind=ARG_OPT - if is_root_model_root - else (ARG_NAMED_OPT if force_optional or self.has_default else ARG_NAMED), + kind=ARG_NAMED_OPT if force_optional or self.has_default else ARG_NAMED, ) - def expand_type( - self, - current_info: TypeInfo, - api: SemanticAnalyzerPluginInterface, - force_typevars_invariant: bool = False, - include_root_type: bool = False, - ) -> Type | None: + def expand_type(self, current_info: TypeInfo) -> Type | None: """Based on mypy.plugins.dataclasses.DataclassAttribute.expand_type.""" - if force_typevars_invariant: - # In some cases, mypy will emit an error "Cannot use a covariant type variable as a parameter" - # To prevent that, we add an option to replace typevars with invariant ones while building certain - # method signatures (in particular, `__init__`). There may be a better way to do this, if this causes - # us problems in the future, we should look into why the dataclasses plugin doesn't have this issue. - if isinstance(self.type, TypeVarType): - modified_type = self.type.copy_modified() - modified_type.variance = INVARIANT - self.type = modified_type - - if self.type is not None and self.info.self_type is not None: - # In general, it is not safe to call `expand_type()` during semantic analysis, + # The getattr in the next line is used to prevent errors in legacy versions of mypy without this attribute + if self.type is not None and getattr(self.info, 'self_type', None) is not None: + # In general, it is not safe to call `expand_type()` during semantic analyzis, # however this plugin is called very late, so all types should be fully ready. # Also, it is tricky to avoid eager expansion of Self types here (e.g. because # we serialize attributes). - with state.strict_optional_set(api.options.strict_optional): - filled_with_typevars = fill_typevars(current_info) - # Cannot be TupleType as current_info represents a Pydantic model: - assert isinstance(filled_with_typevars, Instance) - if force_typevars_invariant: - for arg in filled_with_typevars.args: - if isinstance(arg, TypeVarType): - arg.variance = INVARIANT - - expanded_type = expand_type(self.type, {self.info.self_type.id: filled_with_typevars}) - if include_root_type and isinstance(expanded_type, Instance) and is_root_model(expanded_type.type): - # When a root model is used as a field, Pydantic allows both an instance of the root model - # as well as instances of the `root` field type: - root_type = expanded_type.type['root'].type - if root_type is None: - # Happens if the hint for 'root' has unsolved forward references - return expanded_type - expanded_root_type = expand_type_by_instance(root_type, expanded_type) - expanded_type = UnionType([expanded_type, expanded_root_type]) - return expanded_type + return expand_type(self.type, {self.info.self_type.id: fill_typevars(current_info)}) return self.type - def to_var( - self, - current_info: TypeInfo, - api: SemanticAnalyzerPluginInterface, - use_alias: bool, - force_typevars_invariant: bool = False, - ) -> Var: + def to_var(self, current_info: TypeInfo, use_alias: bool) -> Var: """Based on mypy.plugins.dataclasses.DataclassAttribute.to_var.""" if use_alias and self.alias is not None: name = self.alias else: name = self.name - return Var(name, self.expand_type(current_info, api, force_typevars_invariant)) + return Var(name, self.expand_type(current_info)) def serialize(self) -> JsonDict: """Based on mypy.plugins.dataclasses.DataclassAttribute.serialize.""" @@ -369,10 +371,8 @@ class PydanticModelField: return { 'name': self.name, 'alias': self.alias, - 'is_frozen': self.is_frozen, 'has_dynamic_alias': self.has_dynamic_alias, 'has_default': self.has_default, - 'strict': self.strict, 'line': self.line, 'column': self.column, 'type': self.type.serialize(), @@ -385,38 +385,12 @@ class PydanticModelField: typ = deserialize_and_fixup_type(data.pop('type'), api) return cls(type=typ, info=info, **data) - def expand_typevar_from_subtype(self, sub_type: TypeInfo, api: SemanticAnalyzerPluginInterface) -> None: + def expand_typevar_from_subtype(self, sub_type: TypeInfo) -> None: """Expands type vars in the context of a subtype when an attribute is inherited from a generic super type. """ if self.type is not None: - with state.strict_optional_set(api.options.strict_optional): - self.type = map_type_from_supertype(self.type, sub_type, self.info) - - -class PydanticModelClassVar: - """Based on mypy.plugins.dataclasses.DataclassAttribute. - - ClassVars are ignored by subclasses. - - Attributes: - name: the ClassVar name - """ - - def __init__(self, name): - self.name = name - - @classmethod - def deserialize(cls, data: JsonDict) -> PydanticModelClassVar: - """Based on mypy.plugins.dataclasses.DataclassAttribute.deserialize.""" - data = data.copy() - return cls(**data) - - def serialize(self) -> JsonDict: - """Based on mypy.plugins.dataclasses.DataclassAttribute.serialize.""" - return { - 'name': self.name, - } + self.type = map_type_from_supertype(self.type, sub_type, self.info) class PydanticModelTransformer: @@ -431,10 +405,7 @@ class PydanticModelTransformer: 'frozen', 'from_attributes', 'populate_by_name', - 'validate_by_alias', - 'validate_by_name', 'alias_generator', - 'strict', } def __init__( @@ -461,26 +432,25 @@ class PydanticModelTransformer: * stores the fields, config, and if the class is settings in the mypy metadata for access by subclasses """ info = self._cls.info - is_a_root_model = is_root_model(info) + is_root_model = any(ROOT_MODEL_FULLNAME in base.fullname for base in info.mro[:-1]) config = self.collect_config() - fields, class_vars = self.collect_fields_and_class_vars(config, is_a_root_model) - if fields is None or class_vars is None: + fields = self.collect_fields(config, is_root_model) + if fields is None: # Some definitions are not ready. We need another pass. return False for field in fields: if field.type is None: return False - is_settings = info.has_base(BASESETTINGS_FULLNAME) - self.add_initializer(fields, config, is_settings, is_a_root_model) - self.add_model_construct_method(fields, config, is_settings, is_a_root_model) - self.set_frozen(fields, self._api, frozen=config.frozen is True) + is_settings = any(base.fullname == BASESETTINGS_FULLNAME for base in info.mro[:-1]) + self.add_initializer(fields, config, is_settings, is_root_model) + self.add_model_construct_method(fields, config, is_settings) + self.set_frozen(fields, frozen=config.frozen is True) self.adjust_decorator_signatures() info.metadata[METADATA_KEY] = { 'fields': {field.name: field.serialize() for field in fields}, - 'class_vars': {class_var.name: class_var.serialize() for class_var in class_vars}, 'config': config.get_values_dict(), } @@ -494,13 +464,13 @@ class PydanticModelTransformer: Teach mypy this by marking any function whose outermost decorator is a `validator()`, `field_validator()` or `serializer()` call as a `classmethod`. """ - for sym in self._cls.info.names.values(): + for name, sym in self._cls.info.names.items(): if isinstance(sym.node, Decorator): first_dec = sym.node.original_decorators[0] if ( isinstance(first_dec, CallExpr) and isinstance(first_dec.callee, NameExpr) - and first_dec.callee.fullname in IMPLICIT_CLASSMETHOD_DECORATOR_FULLNAMES + and first_dec.callee.fullname in DECORATOR_FULLNAMES # @model_validator(mode="after") is an exception, it expects a regular method and not ( first_dec.callee.fullname == MODEL_VALIDATOR_FULLNAME @@ -543,7 +513,7 @@ class PydanticModelTransformer: for arg_name, arg in zip(stmt.rvalue.arg_names, stmt.rvalue.args): if arg_name is None: continue - config.update(self.get_config_update(arg_name, arg, lax_extra=True)) + config.update(self.get_config_update(arg_name, arg)) elif isinstance(stmt.rvalue, DictExpr): # dict literals for key_expr, value_expr in stmt.rvalue.items: if not isinstance(key_expr, StrExpr): @@ -574,7 +544,7 @@ class PydanticModelTransformer: if ( stmt and config.has_alias_generator - and not (config.validate_by_name or config.populate_by_name) + and not config.populate_by_name and self.plugin_config.warn_required_dynamic_aliases ): error_required_dynamic_aliases(self._api, stmt) @@ -589,13 +559,11 @@ class PydanticModelTransformer: config.setdefault(name, value) return config - def collect_fields_and_class_vars( - self, model_config: ModelConfigData, is_root_model: bool - ) -> tuple[list[PydanticModelField] | None, list[PydanticModelClassVar] | None]: + def collect_fields(self, model_config: ModelConfigData, is_root_model: bool) -> list[PydanticModelField] | None: """Collects the fields for the model, accounting for parent classes.""" cls = self._cls - # First, collect fields and ClassVars belonging to any class in the MRO, ignoring duplicates. + # First, collect fields belonging to any class in the MRO, ignoring duplicates. # # We iterate through the MRO in reverse because attrs defined in the parent must appear # earlier in the attributes list than attrs defined in the child. See: @@ -605,11 +573,10 @@ class PydanticModelTransformer: # in the parent. We can implement this via a dict without disrupting the attr order # because dicts preserve insertion order in Python 3.7+. found_fields: dict[str, PydanticModelField] = {} - found_class_vars: dict[str, PydanticModelClassVar] = {} for info in reversed(cls.info.mro[1:-1]): # 0 is the current class, -2 is BaseModel, -1 is object # if BASEMODEL_METADATA_TAG_KEY in info.metadata and BASEMODEL_METADATA_KEY not in info.metadata: # # We haven't processed the base class yet. Need another pass. - # return None, None + # return None if METADATA_KEY not in info.metadata: continue @@ -622,7 +589,8 @@ class PydanticModelTransformer: # TODO: We shouldn't be performing type operations during the main # semantic analysis pass, since some TypeInfo attributes might # still be in flux. This should be performed in a later phase. - field.expand_typevar_from_subtype(cls.info, self._api) + with state.strict_optional_set(self._api.options.strict_optional): + field.expand_typevar_from_subtype(cls.info) found_fields[name] = field sym_node = cls.info.names.get(name) @@ -631,31 +599,20 @@ class PydanticModelTransformer: 'BaseModel field may only be overridden by another field', sym_node.node, ) - # Collect ClassVars - for name, data in info.metadata[METADATA_KEY]['class_vars'].items(): - found_class_vars[name] = PydanticModelClassVar.deserialize(data) - # Second, collect fields and ClassVars belonging to the current class. + # Second, collect fields belonging to the current class. current_field_names: set[str] = set() - current_class_vars_names: set[str] = set() for stmt in self._get_assignment_statements_from_block(cls.defs): - maybe_field = self.collect_field_or_class_var_from_stmt(stmt, model_config, found_class_vars) - if maybe_field is None: - continue - - lhs = stmt.lvalues[0] - assert isinstance(lhs, NameExpr) # collect_field_or_class_var_from_stmt guarantees this - if isinstance(maybe_field, PydanticModelField): + maybe_field = self.collect_field_from_stmt(stmt, model_config) + if maybe_field is not None: + lhs = stmt.lvalues[0] if is_root_model and lhs.name != 'root': error_extra_fields_on_root_model(self._api, stmt) else: current_field_names.add(lhs.name) found_fields[lhs.name] = maybe_field - elif isinstance(maybe_field, PydanticModelClassVar): - current_class_vars_names.add(lhs.name) - found_class_vars[lhs.name] = maybe_field - return list(found_fields.values()), list(found_class_vars.values()) + return list(found_fields.values()) def _get_assignment_statements_from_if_statement(self, stmt: IfStmt) -> Iterator[AssignmentStmt]: for body in stmt.body: @@ -671,15 +628,14 @@ class PydanticModelTransformer: elif isinstance(stmt, IfStmt): yield from self._get_assignment_statements_from_if_statement(stmt) - def collect_field_or_class_var_from_stmt( # noqa C901 - self, stmt: AssignmentStmt, model_config: ModelConfigData, class_vars: dict[str, PydanticModelClassVar] - ) -> PydanticModelField | PydanticModelClassVar | None: + def collect_field_from_stmt( # noqa C901 + self, stmt: AssignmentStmt, model_config: ModelConfigData + ) -> PydanticModelField | None: """Get pydantic model field from statement. Args: stmt: The statement. model_config: Configuration settings for the model. - class_vars: ClassVars already known to be defined on the model. Returns: A pydantic model field if it could find the field in statement. Otherwise, `None`. @@ -702,10 +658,6 @@ class PydanticModelTransformer: # Eventually, we may want to attempt to respect model_config['ignored_types'] return None - if lhs.name in class_vars: - # Class vars are not fields and are not required to be annotated - return None - # The assignment does not have an annotation, and it's not anything else we recognize error_untyped_fields(self._api, stmt) return None @@ -750,7 +702,7 @@ class PydanticModelTransformer: # x: ClassVar[int] is not a field if node.is_classvar: - return PydanticModelClassVar(lhs.name) + return None # x: InitVar[int] is not supported in BaseModel node_type = get_proper_type(node.type) @@ -761,7 +713,6 @@ class PydanticModelTransformer: ) has_default = self.get_has_default(stmt) - strict = self.get_strict(stmt) if sym.type is None and node.is_final and node.is_inferred: # This follows the logic from the dataclasses plugin. The following comment is taken verbatim: @@ -781,27 +732,16 @@ class PydanticModelTransformer: ) node.type = AnyType(TypeOfAny.from_error) - if node.is_final and has_default: - # TODO this path should be removed (see https://github.com/pydantic/pydantic/issues/11119) - return PydanticModelClassVar(lhs.name) - alias, has_dynamic_alias = self.get_alias_info(stmt) - if ( - has_dynamic_alias - and not (model_config.validate_by_name or model_config.populate_by_name) - and self.plugin_config.warn_required_dynamic_aliases - ): + if has_dynamic_alias and not model_config.populate_by_name and self.plugin_config.warn_required_dynamic_aliases: error_required_dynamic_aliases(self._api, stmt) - is_frozen = self.is_field_frozen(stmt) init_type = self._infer_dataclass_attr_init_type(sym, lhs.name, stmt) return PydanticModelField( name=lhs.name, has_dynamic_alias=has_dynamic_alias, has_default=has_default, - strict=strict, alias=alias, - is_frozen=is_frozen, line=stmt.line, column=stmt.column, type=init_type, @@ -857,42 +797,32 @@ class PydanticModelTransformer: return # Don't generate an __init__ if one already exists typed = self.plugin_config.init_typed - model_strict = bool(config.strict) - use_alias = not (config.validate_by_name or config.populate_by_name) and config.validate_by_alias is not False - requires_dynamic_aliases = bool(config.has_alias_generator and not config.validate_by_name) - args = self.get_field_arguments( - fields, - typed=typed, - model_strict=model_strict, - requires_dynamic_aliases=requires_dynamic_aliases, - use_alias=use_alias, - is_settings=is_settings, - is_root_model=is_root_model, - force_typevars_invariant=True, - ) + use_alias = config.populate_by_name is not True + requires_dynamic_aliases = bool(config.has_alias_generator and not config.populate_by_name) + with state.strict_optional_set(self._api.options.strict_optional): + args = self.get_field_arguments( + fields, + typed=typed, + requires_dynamic_aliases=requires_dynamic_aliases, + use_alias=use_alias, + is_settings=is_settings, + ) + if is_root_model: + # convert root argument to positional argument + args[0].kind = ARG_POS if args[0].kind == ARG_NAMED else ARG_OPT - if is_settings: - base_settings_node = self._api.lookup_fully_qualified(BASESETTINGS_FULLNAME).node - assert isinstance(base_settings_node, TypeInfo) - if '__init__' in base_settings_node.names: - base_settings_init_node = base_settings_node.names['__init__'].node - assert isinstance(base_settings_init_node, FuncDef) - if base_settings_init_node is not None and base_settings_init_node.type is not None: - func_type = base_settings_init_node.type - assert isinstance(func_type, CallableType) - for arg_idx, arg_name in enumerate(func_type.arg_names): - if arg_name is None or arg_name.startswith('__') or not arg_name.startswith('_'): - continue - analyzed_variable_type = self._api.anal_type(func_type.arg_types[arg_idx]) - if analyzed_variable_type is not None and arg_name == '_cli_settings_source': - # _cli_settings_source is defined as CliSettingsSource[Any], and as such - # the Any causes issues with --disallow-any-explicit. As a workaround, change - # the Any type (as if CliSettingsSource was left unparameterized): - analyzed_variable_type = analyzed_variable_type.accept( - ChangeExplicitTypeOfAny(TypeOfAny.from_omitted_generics) - ) - variable = Var(arg_name, analyzed_variable_type) - args.append(Argument(variable, analyzed_variable_type, None, ARG_OPT)) + if is_settings: + base_settings_node = self._api.lookup_fully_qualified(BASESETTINGS_FULLNAME).node + if '__init__' in base_settings_node.names: + base_settings_init_node = base_settings_node.names['__init__'].node + if base_settings_init_node is not None and base_settings_init_node.type is not None: + func_type = base_settings_init_node.type + for arg_idx, arg_name in enumerate(func_type.arg_names): + if arg_name.startswith('__') or not arg_name.startswith('_'): + continue + analyzed_variable_type = self._api.anal_type(func_type.arg_types[arg_idx]) + variable = Var(arg_name, analyzed_variable_type) + args.append(Argument(variable, analyzed_variable_type, None, ARG_OPT)) if not self.should_init_forbid_extra(fields, config): var = Var('kwargs') @@ -901,11 +831,7 @@ class PydanticModelTransformer: add_method(self._api, self._cls, '__init__', args=args, return_type=NoneType()) def add_model_construct_method( - self, - fields: list[PydanticModelField], - config: ModelConfigData, - is_settings: bool, - is_root_model: bool, + self, fields: list[PydanticModelField], config: ModelConfigData, is_settings: bool ) -> None: """Adds a fully typed `model_construct` classmethod to the class. @@ -917,19 +843,13 @@ class PydanticModelTransformer: fields_set_argument = Argument(Var('_fields_set', optional_set_str), optional_set_str, None, ARG_OPT) with state.strict_optional_set(self._api.options.strict_optional): args = self.get_field_arguments( - fields, - typed=True, - model_strict=bool(config.strict), - requires_dynamic_aliases=False, - use_alias=False, - is_settings=is_settings, - is_root_model=is_root_model, + fields, typed=True, requires_dynamic_aliases=False, use_alias=False, is_settings=is_settings ) if not self.should_init_forbid_extra(fields, config): var = Var('kwargs') args.append(Argument(var, AnyType(TypeOfAny.explicit), None, ARG_STAR2)) - args = args + [fields_set_argument] if is_root_model else [fields_set_argument] + args + args = [fields_set_argument] + args add_method( self._api, @@ -940,7 +860,7 @@ class PydanticModelTransformer: is_classmethod=True, ) - def set_frozen(self, fields: list[PydanticModelField], api: SemanticAnalyzerPluginInterface, frozen: bool) -> None: + def set_frozen(self, fields: list[PydanticModelField], frozen: bool) -> None: """Marks all fields as properties so that attempts to set them trigger mypy errors. This is the same approach used by the attrs and dataclasses plugins. @@ -951,21 +871,27 @@ class PydanticModelTransformer: if sym_node is not None: var = sym_node.node if isinstance(var, Var): - var.is_property = frozen or field.is_frozen + var.is_property = frozen elif isinstance(var, PlaceholderNode) and not self._api.final_iteration: # See https://github.com/pydantic/pydantic/issues/5191 to hit this branch for test coverage self._api.defer() - # `var` can also be a FuncDef or Decorator node (e.g. when overriding a field with a function or property). - # In that case, we don't want to do anything. Mypy will already raise an error that a field was not properly - # overridden. + else: # pragma: no cover + # I don't know whether it's possible to hit this branch, but I've added it for safety + try: + var_str = str(var) + except TypeError: + # This happens for PlaceholderNode; perhaps it will happen for other types in the future.. + var_str = repr(var) + detail = f'sym_node.node: {var_str} (of type {var.__class__})' + error_unexpected_behavior(detail, self._api, self._cls) else: - var = field.to_var(info, api, use_alias=False) + var = field.to_var(info, use_alias=False) var.info = info var.is_property = frozen var._fullname = info.fullname + '.' + var.name info.names[var.name] = SymbolTableNode(MDEF, var) - def get_config_update(self, name: str, arg: Expression, lax_extra: bool = False) -> ModelConfigData | None: + def get_config_update(self, name: str, arg: Expression) -> ModelConfigData | None: """Determines the config update due to a single kwarg in the ConfigDict definition. Warns if a tracked config attribute is set to a value the plugin doesn't know how to interpret (e.g., an int) @@ -978,16 +904,7 @@ class PydanticModelTransformer: elif isinstance(arg, MemberExpr): forbid_extra = arg.name == 'forbid' else: - if not lax_extra: - # Only emit an error for other types of `arg` (e.g., `NameExpr`, `ConditionalExpr`, etc.) when - # reading from a config class, etc. If a ConfigDict is used, then we don't want to emit an error - # because you'll get type checking from the ConfigDict itself. - # - # It would be nice if we could introspect the types better otherwise, but I don't know what the API - # is to evaluate an expr into its type and then check if that type is compatible with the expected - # type. Note that you can still get proper type checking via: `model_config = ConfigDict(...)`, just - # if you don't use an explicit string, the plugin won't be able to infer whether extra is forbidden. - error_invalid_config_value(name, self._api, arg) + error_invalid_config_value(name, self._api, arg) return None return ModelConfigData(forbid_extra=forbid_extra) if name == 'alias_generator': @@ -1022,22 +939,6 @@ class PydanticModelTransformer: # Has no default if the "default value" is Ellipsis (i.e., `field_name: Annotation = ...`) return not isinstance(expr, EllipsisExpr) - @staticmethod - def get_strict(stmt: AssignmentStmt) -> bool | None: - """Returns a the `strict` value of a field if defined, otherwise `None`.""" - expr = stmt.rvalue - if isinstance(expr, CallExpr) and isinstance(expr.callee, RefExpr) and expr.callee.fullname == FIELD_FULLNAME: - for arg, name in zip(expr.args, expr.arg_names): - if name != 'strict': - continue - if isinstance(arg, NameExpr): - if arg.fullname == 'builtins.True': - return True - elif arg.fullname == 'builtins.False': - return False - return None - return None - @staticmethod def get_alias_info(stmt: AssignmentStmt) -> tuple[str | None, bool]: """Returns a pair (alias, has_dynamic_alias), extracted from the declaration of the field defined in `stmt`. @@ -1056,53 +957,23 @@ class PydanticModelTransformer: # Assigned value is not a call to pydantic.fields.Field return None, False - if 'validation_alias' in expr.arg_names: - arg = expr.args[expr.arg_names.index('validation_alias')] - elif 'alias' in expr.arg_names: - arg = expr.args[expr.arg_names.index('alias')] - else: - return None, False - - if isinstance(arg, StrExpr): - return arg.value, False - else: - return None, True - - @staticmethod - def is_field_frozen(stmt: AssignmentStmt) -> bool: - """Returns whether the field is frozen, extracted from the declaration of the field defined in `stmt`. - - Note that this is only whether the field was declared to be frozen in a ` = Field(frozen=True)` - sense; this does not determine whether the field is frozen because the entire model is frozen; that is - handled separately. - """ - expr = stmt.rvalue - if isinstance(expr, TempNode): - # TempNode means annotation-only - return False - - if not ( - isinstance(expr, CallExpr) and isinstance(expr.callee, RefExpr) and expr.callee.fullname == FIELD_FULLNAME - ): - # Assigned value is not a call to pydantic.fields.Field - return False - for i, arg_name in enumerate(expr.arg_names): - if arg_name == 'frozen': - arg = expr.args[i] - return isinstance(arg, NameExpr) and arg.fullname == 'builtins.True' - return False + if arg_name != 'alias': + continue + arg = expr.args[i] + if isinstance(arg, StrExpr): + return arg.value, False + else: + return None, True + return None, False def get_field_arguments( self, fields: list[PydanticModelField], typed: bool, - model_strict: bool, use_alias: bool, requires_dynamic_aliases: bool, is_settings: bool, - is_root_model: bool, - force_typevars_invariant: bool = False, ) -> list[Argument]: """Helper function used during the construction of the `__init__` and `model_construct` method signatures. @@ -1111,14 +982,7 @@ class PydanticModelTransformer: info = self._cls.info arguments = [ field.to_argument( - info, - typed=typed, - model_strict=model_strict, - force_optional=requires_dynamic_aliases or is_settings, - use_alias=use_alias, - api=self._api, - force_typevars_invariant=force_typevars_invariant, - is_root_model_root=is_root_model and field.name == 'root', + info, typed=typed, force_optional=requires_dynamic_aliases or is_settings, use_alias=use_alias ) for field in fields if not (use_alias and field.has_dynamic_alias) @@ -1131,7 +995,7 @@ class PydanticModelTransformer: We disallow arbitrary kwargs if the extra config setting is "forbid", or if the plugin config says to, *unless* a required dynamic alias is present (since then we can't determine a valid signature). """ - if not (config.validate_by_name or config.populate_by_name): + if not config.populate_by_name: if self.is_dynamic_alias_present(fields, bool(config.has_alias_generator)): return False if config.forbid_extra: @@ -1153,20 +1017,6 @@ class PydanticModelTransformer: return False -class ChangeExplicitTypeOfAny(TypeTranslator): - """A type translator used to change type of Any's, if explicit.""" - - def __init__(self, type_of_any: int) -> None: - self._type_of_any = type_of_any - super().__init__() - - def visit_any(self, t: AnyType) -> Type: # noqa: D102 - if t.type_of_any == TypeOfAny.explicit: - return t.copy_modified(type_of_any=self._type_of_any) - else: - return t - - class ModelConfigData: """Pydantic mypy plugin model config class.""" @@ -1176,19 +1026,13 @@ class ModelConfigData: frozen: bool | None = None, from_attributes: bool | None = None, populate_by_name: bool | None = None, - validate_by_alias: bool | None = None, - validate_by_name: bool | None = None, has_alias_generator: bool | None = None, - strict: bool | None = None, ): self.forbid_extra = forbid_extra self.frozen = frozen self.from_attributes = from_attributes self.populate_by_name = populate_by_name - self.validate_by_alias = validate_by_alias - self.validate_by_name = validate_by_name self.has_alias_generator = has_alias_generator - self.strict = strict def get_values_dict(self) -> dict[str, Any]: """Returns a dict of Pydantic model config names to their values. @@ -1210,11 +1054,6 @@ class ModelConfigData: setattr(self, key, value) -def is_root_model(info: TypeInfo) -> bool: - """Return whether the type info is a root model subclass (or the `RootModel` class itself).""" - return info.has_base(ROOT_MODEL_FULLNAME) - - ERROR_ORM = ErrorCode('pydantic-orm', 'Invalid from_attributes call', 'Pydantic') ERROR_CONFIG = ErrorCode('pydantic-config', 'Invalid config value', 'Pydantic') ERROR_ALIAS = ErrorCode('pydantic-alias', 'Dynamic alias disallowed', 'Pydantic') @@ -1263,6 +1102,11 @@ def error_extra_fields_on_root_model(api: CheckerPluginInterface, context: Conte api.fail('Only `root` is allowed as a field of a `RootModel`', context, code=ERROR_EXTRA_FIELD_ROOT_MODEL) +def error_default_and_default_factory_specified(api: CheckerPluginInterface, context: Context) -> None: + """Emits an error when `Field` has both `default` and `default_factory` together.""" + api.fail('Field default and default_factory cannot be specified together', context, code=ERROR_FIELD_DEFAULTS) + + def add_method( api: SemanticAnalyzerPluginInterface | CheckerPluginInterface, cls: ClassDef, @@ -1270,7 +1114,7 @@ def add_method( args: list[Argument], return_type: Type, self_type: Type | None = None, - tvar_def: TypeVarType | None = None, + tvar_def: TypeVarDef | None = None, is_classmethod: bool = False, ) -> None: """Very closely related to `mypy.plugins.common.add_method_to_class`, with a few pydantic-specific changes.""" @@ -1293,16 +1137,6 @@ def add_method( first = [Argument(Var('_cls'), self_type, None, ARG_POS, True)] else: self_type = self_type or fill_typevars(info) - # `self` is positional *ONLY* here, but this can't be expressed - # fully in the mypy internal API. ARG_POS is the closest we can get. - # Using ARG_POS will, however, give mypy errors if a `self` field - # is present on a model: - # - # Name "self" already defined (possibly by an import) [no-redef] - # - # As a workaround, we give this argument a name that will - # never conflict. By its positional nature, this name will not - # be used or exposed to users. first = [Argument(Var('__pydantic_self__'), self_type, None, ARG_POS)] args = first + args @@ -1313,9 +1147,9 @@ def add_method( arg_names.append(arg.variable.name) arg_kinds.append(arg.kind) - signature = CallableType( - arg_types, arg_kinds, arg_names, return_type, function_type, variables=[tvar_def] if tvar_def else None - ) + signature = CallableType(arg_types, arg_kinds, arg_names, return_type, function_type) + if tvar_def: + signature.variables = [tvar_def] func = FuncDef(name, args, Block([PassStmt()])) func.info = info @@ -1367,7 +1201,7 @@ def parse_toml(config_file: str) -> dict[str, Any] | None: except ImportError: # pragma: no cover import warnings - warnings.warn('No TOML parser installed, cannot read configuration from `pyproject.toml`.', stacklevel=2) + warnings.warn('No TOML parser installed, cannot read configuration from `pyproject.toml`.') return None with open(config_file, 'rb') as rf: diff --git a/Backend/venv/lib/python3.12/site-packages/pydantic/networks.py b/Backend/venv/lib/python3.12/site-packages/pydantic/networks.py index 04a7cac6..e9f25ea3 100644 --- a/Backend/venv/lib/python3.12/site-packages/pydantic/networks.py +++ b/Backend/venv/lib/python3.12/site-packages/pydantic/networks.py @@ -1,33 +1,18 @@ """The networks module contains types for common network-related fields.""" - from __future__ import annotations as _annotations import dataclasses as _dataclasses import re -from dataclasses import fields -from functools import lru_cache -from importlib.metadata import version from ipaddress import IPv4Address, IPv4Interface, IPv4Network, IPv6Address, IPv6Interface, IPv6Network -from typing import TYPE_CHECKING, Annotated, Any, ClassVar +from typing import TYPE_CHECKING, Any -from pydantic_core import ( - MultiHostHost, - PydanticCustomError, - PydanticSerializationUnexpectedValue, - SchemaSerializer, - core_schema, -) -from pydantic_core import MultiHostUrl as _CoreMultiHostUrl -from pydantic_core import Url as _CoreUrl -from typing_extensions import Self, TypeAlias +from pydantic_core import MultiHostUrl, PydanticCustomError, Url, core_schema +from typing_extensions import Annotated, TypeAlias -from pydantic.errors import PydanticUserError - -from ._internal import _repr, _schema_generation_shared +from ._internal import _fields, _repr, _schema_generation_shared from ._migration import getattr_migration from .annotated_handlers import GetCoreSchemaHandler from .json_schema import JsonSchemaValue -from .type_adapter import TypeAdapter if TYPE_CHECKING: import email_validator @@ -42,10 +27,7 @@ __all__ = [ 'AnyUrl', 'AnyHttpUrl', 'FileUrl', - 'FtpUrl', 'HttpUrl', - 'WebsocketUrl', - 'AnyWebsocketUrl', 'UrlConstraints', 'EmailStr', 'NameEmail', @@ -58,17 +40,14 @@ __all__ = [ 'RedisDsn', 'MongoDsn', 'KafkaDsn', - 'NatsDsn', 'validate_email', 'MySQLDsn', 'MariaDBDsn', - 'ClickHouseDsn', - 'SnowflakeDsn', ] @_dataclasses.dataclass -class UrlConstraints: +class UrlConstraints(_fields.PydanticMetadata): """Url constraints. Attributes: @@ -78,7 +57,6 @@ class UrlConstraints: default_host: The default host. Defaults to `None`. default_port: The default port. Defaults to `None`. default_path: The default path. Defaults to `None`. - preserve_empty_path: Whether to preserve empty URL paths. Defaults to `None`. """ max_length: int | None = None @@ -87,7 +65,6 @@ class UrlConstraints: default_host: str | None = None default_port: int | None = None default_path: str | None = None - preserve_empty_path: bool | None = None def __hash__(self) -> int: return hash( @@ -98,659 +75,118 @@ class UrlConstraints: self.default_host, self.default_port, self.default_path, - self.preserve_empty_path, ) ) - @property - def defined_constraints(self) -> dict[str, Any]: - """Fetch a key / value mapping of constraints to values that are not None. Used for core schema updates.""" - return {field.name: value for field in fields(self) if (value := getattr(self, field.name)) is not None} - def __get_pydantic_core_schema__(self, source: Any, handler: GetCoreSchemaHandler) -> core_schema.CoreSchema: - schema = handler(source) - - # for function-wrap schemas, url constraints is applied to the inner schema - # because when we generate schemas for urls, we wrap a core_schema.url_schema() with a function-wrap schema - # that helps with validation on initialization, see _BaseUrl and _BaseMultiHostUrl below. - schema_to_mutate = schema['schema'] if schema['type'] == 'function-wrap' else schema - if annotated_type := schema_to_mutate['type'] not in ('url', 'multi-host-url'): - raise PydanticUserError( - f"'UrlConstraints' cannot annotate '{annotated_type}'.", code='invalid-annotated-type' - ) - for constraint_key, constraint_value in self.defined_constraints.items(): - schema_to_mutate[constraint_key] = constraint_value - return schema - - -class _BaseUrl: - _constraints: ClassVar[UrlConstraints] = UrlConstraints() - _url: _CoreUrl - - def __init__(self, url: str | _CoreUrl | _BaseUrl) -> None: - self._url = _build_type_adapter(self.__class__).validate_python(url)._url - - @property - def scheme(self) -> str: - """The scheme part of the URL. - - e.g. `https` in `https://user:pass@host:port/path?query#fragment` - """ - return self._url.scheme - - @property - def username(self) -> str | None: - """The username part of the URL, or `None`. - - e.g. `user` in `https://user:pass@host:port/path?query#fragment` - """ - return self._url.username - - @property - def password(self) -> str | None: - """The password part of the URL, or `None`. - - e.g. `pass` in `https://user:pass@host:port/path?query#fragment` - """ - return self._url.password - - @property - def host(self) -> str | None: - """The host part of the URL, or `None`. - - If the URL must be punycode encoded, this is the encoded host, e.g if the input URL is `https://£££.com`, - `host` will be `xn--9aaa.com` - """ - return self._url.host - - def unicode_host(self) -> str | None: - """The host part of the URL as a unicode string, or `None`. - - e.g. `host` in `https://user:pass@host:port/path?query#fragment` - - If the URL must be punycode encoded, this is the decoded host, e.g if the input URL is `https://£££.com`, - `unicode_host()` will be `£££.com` - """ - return self._url.unicode_host() - - @property - def port(self) -> int | None: - """The port part of the URL, or `None`. - - e.g. `port` in `https://user:pass@host:port/path?query#fragment` - """ - return self._url.port - - @property - def path(self) -> str | None: - """The path part of the URL, or `None`. - - e.g. `/path` in `https://user:pass@host:port/path?query#fragment` - """ - return self._url.path - - @property - def query(self) -> str | None: - """The query part of the URL, or `None`. - - e.g. `query` in `https://user:pass@host:port/path?query#fragment` - """ - return self._url.query - - def query_params(self) -> list[tuple[str, str]]: - """The query part of the URL as a list of key-value pairs. - - e.g. `[('foo', 'bar')]` in `https://user:pass@host:port/path?foo=bar#fragment` - """ - return self._url.query_params() - - @property - def fragment(self) -> str | None: - """The fragment part of the URL, or `None`. - - e.g. `fragment` in `https://user:pass@host:port/path?query#fragment` - """ - return self._url.fragment - - def unicode_string(self) -> str: - """The URL as a unicode string, unlike `__str__()` this will not punycode encode the host. - - If the URL must be punycode encoded, this is the decoded string, e.g if the input URL is `https://£££.com`, - `unicode_string()` will be `https://£££.com` - """ - return self._url.unicode_string() - - def encoded_string(self) -> str: - """The URL's encoded string representation via __str__(). - - This returns the punycode-encoded host version of the URL as a string. - """ - return str(self) - - def __str__(self) -> str: - """The URL as a string, this will punycode encode the host if required.""" - return str(self._url) - - def __repr__(self) -> str: - return f'{self.__class__.__name__}({str(self._url)!r})' - - def __deepcopy__(self, memo: dict) -> Self: - return self.__class__(self._url) - - def __eq__(self, other: Any) -> bool: - return self.__class__ is other.__class__ and self._url == other._url - - def __lt__(self, other: Any) -> bool: - return self.__class__ is other.__class__ and self._url < other._url - - def __gt__(self, other: Any) -> bool: - return self.__class__ is other.__class__ and self._url > other._url - - def __le__(self, other: Any) -> bool: - return self.__class__ is other.__class__ and self._url <= other._url - - def __ge__(self, other: Any) -> bool: - return self.__class__ is other.__class__ and self._url >= other._url - - def __hash__(self) -> int: - return hash(self._url) - - def __len__(self) -> int: - return len(str(self._url)) - - @classmethod - def build( - cls, - *, - scheme: str, - username: str | None = None, - password: str | None = None, - host: str, - port: int | None = None, - path: str | None = None, - query: str | None = None, - fragment: str | None = None, - ) -> Self: - """Build a new `Url` instance from its component parts. - - Args: - scheme: The scheme part of the URL. - username: The username part of the URL, or omit for no username. - password: The password part of the URL, or omit for no password. - host: The host part of the URL. - port: The port part of the URL, or omit for no port. - path: The path part of the URL, or omit for no path. - query: The query part of the URL, or omit for no query. - fragment: The fragment part of the URL, or omit for no fragment. - - Returns: - An instance of URL - """ - return cls( - _CoreUrl.build( - scheme=scheme, - username=username, - password=password, - host=host, - port=port, - path=path, - query=query, - fragment=fragment, - ) - ) - - @classmethod - def serialize_url(cls, url: Any, info: core_schema.SerializationInfo) -> str | Self: - if not isinstance(url, cls): - raise PydanticSerializationUnexpectedValue( - f"Expected `{cls}` but got `{type(url)}` with value `'{url}'` - serialized value may not be as expected." - ) - if info.mode == 'json': - return str(url) - return url - - @classmethod - def __get_pydantic_core_schema__( - cls, source: type[_BaseUrl], handler: GetCoreSchemaHandler - ) -> core_schema.CoreSchema: - def wrap_val(v, h): - if isinstance(v, source): - return v - if isinstance(v, _BaseUrl): - v = str(v) - core_url = h(v) - instance = source.__new__(source) - instance._url = core_url - return instance - - return core_schema.no_info_wrap_validator_function( - wrap_val, - schema=core_schema.url_schema(**cls._constraints.defined_constraints), - serialization=core_schema.plain_serializer_function_ser_schema( - cls.serialize_url, info_arg=True, when_used='always' - ), - ) - - @classmethod - def __get_pydantic_json_schema__( - cls, core_schema: core_schema.CoreSchema, handler: _schema_generation_shared.GetJsonSchemaHandler - ) -> JsonSchemaValue: - # we use the url schema for json schema generation, but we might have to extract it from - # the function-wrap schema we use as a tool for validation on initialization - inner_schema = core_schema['schema'] if core_schema['type'] == 'function-wrap' else core_schema - return handler(inner_schema) - - __pydantic_serializer__ = SchemaSerializer(core_schema.any_schema(serialization=core_schema.to_string_ser_schema())) - - -class _BaseMultiHostUrl: - _constraints: ClassVar[UrlConstraints] = UrlConstraints() - _url: _CoreMultiHostUrl - - def __init__(self, url: str | _CoreMultiHostUrl | _BaseMultiHostUrl) -> None: - self._url = _build_type_adapter(self.__class__).validate_python(url)._url - - @property - def scheme(self) -> str: - """The scheme part of the URL. - - e.g. `https` in `https://foo.com,bar.com/path?query#fragment` - """ - return self._url.scheme - - @property - def path(self) -> str | None: - """The path part of the URL, or `None`. - - e.g. `/path` in `https://foo.com,bar.com/path?query#fragment` - """ - return self._url.path - - @property - def query(self) -> str | None: - """The query part of the URL, or `None`. - - e.g. `query` in `https://foo.com,bar.com/path?query#fragment` - """ - return self._url.query - - def query_params(self) -> list[tuple[str, str]]: - """The query part of the URL as a list of key-value pairs. - - e.g. `[('foo', 'bar')]` in `https://foo.com,bar.com/path?foo=bar#fragment` - """ - return self._url.query_params() - - @property - def fragment(self) -> str | None: - """The fragment part of the URL, or `None`. - - e.g. `fragment` in `https://foo.com,bar.com/path?query#fragment` - """ - return self._url.fragment - - def hosts(self) -> list[MultiHostHost]: - '''The hosts of the `MultiHostUrl` as [`MultiHostHost`][pydantic_core.MultiHostHost] typed dicts. - - ```python - from pydantic_core import MultiHostUrl - - mhu = MultiHostUrl('https://foo.com:123,foo:bar@bar.com/path') - print(mhu.hosts()) - """ - [ - {'username': None, 'password': None, 'host': 'foo.com', 'port': 123}, - {'username': 'foo', 'password': 'bar', 'host': 'bar.com', 'port': 443} - ] - ``` - Returns: - A list of dicts, each representing a host. - ''' - return self._url.hosts() - - def encoded_string(self) -> str: - """The URL's encoded string representation via __str__(). - - This returns the punycode-encoded host version of the URL as a string. - """ - return str(self) - - def unicode_string(self) -> str: - """The URL as a unicode string, unlike `__str__()` this will not punycode encode the hosts.""" - return self._url.unicode_string() - - def __str__(self) -> str: - """The URL as a string, this will punycode encode the host if required.""" - return str(self._url) - - def __repr__(self) -> str: - return f'{self.__class__.__name__}({str(self._url)!r})' - - def __deepcopy__(self, memo: dict) -> Self: - return self.__class__(self._url) - - def __eq__(self, other: Any) -> bool: - return self.__class__ is other.__class__ and self._url == other._url - - def __hash__(self) -> int: - return hash(self._url) - - def __len__(self) -> int: - return len(str(self._url)) - - @classmethod - def build( - cls, - *, - scheme: str, - hosts: list[MultiHostHost] | None = None, - username: str | None = None, - password: str | None = None, - host: str | None = None, - port: int | None = None, - path: str | None = None, - query: str | None = None, - fragment: str | None = None, - ) -> Self: - """Build a new `MultiHostUrl` instance from its component parts. - - This method takes either `hosts` - a list of `MultiHostHost` typed dicts, or the individual components - `username`, `password`, `host` and `port`. - - Args: - scheme: The scheme part of the URL. - hosts: Multiple hosts to build the URL from. - username: The username part of the URL. - password: The password part of the URL. - host: The host part of the URL. - port: The port part of the URL. - path: The path part of the URL. - query: The query part of the URL, or omit for no query. - fragment: The fragment part of the URL, or omit for no fragment. - - Returns: - An instance of `MultiHostUrl` - """ - return cls( - _CoreMultiHostUrl.build( - scheme=scheme, - hosts=hosts, - username=username, - password=password, - host=host, - port=port, - path=path, - query=query, - fragment=fragment, - ) - ) - - @classmethod - def serialize_url(cls, url: Any, info: core_schema.SerializationInfo) -> str | Self: - if not isinstance(url, cls): - raise PydanticSerializationUnexpectedValue( - f"Expected `{cls}` but got `{type(url)}` with value `'{url}'` - serialized value may not be as expected." - ) - if info.mode == 'json': - return str(url) - return url - - @classmethod - def __get_pydantic_core_schema__( - cls, source: type[_BaseMultiHostUrl], handler: GetCoreSchemaHandler - ) -> core_schema.CoreSchema: - def wrap_val(v, h): - if isinstance(v, source): - return v - if isinstance(v, _BaseMultiHostUrl): - v = str(v) - core_url = h(v) - instance = source.__new__(source) - instance._url = core_url - return instance - - return core_schema.no_info_wrap_validator_function( - wrap_val, - schema=core_schema.multi_host_url_schema(**cls._constraints.defined_constraints), - serialization=core_schema.plain_serializer_function_ser_schema( - cls.serialize_url, info_arg=True, when_used='always' - ), - ) - - @classmethod - def __get_pydantic_json_schema__( - cls, core_schema: core_schema.CoreSchema, handler: _schema_generation_shared.GetJsonSchemaHandler - ) -> JsonSchemaValue: - # we use the url schema for json schema generation, but we might have to extract it from - # the function-wrap schema we use as a tool for validation on initialization - inner_schema = core_schema['schema'] if core_schema['type'] == 'function-wrap' else core_schema - return handler(inner_schema) - - __pydantic_serializer__ = SchemaSerializer(core_schema.any_schema(serialization=core_schema.to_string_ser_schema())) - - -@lru_cache -def _build_type_adapter(cls: type[_BaseUrl | _BaseMultiHostUrl]) -> TypeAdapter: - return TypeAdapter(cls) - - -class AnyUrl(_BaseUrl): - """Base type for all URLs. - - * Any scheme allowed - * Top-level domain (TLD) not required - * Host not required - - Assuming an input URL of `http://samuel:pass@example.com:8000/the/path/?query=here#fragment=is;this=bit`, - the types export the following properties: - - - `scheme`: the URL scheme (`http`), always set. - - `host`: the URL host (`example.com`). - - `username`: optional username if included (`samuel`). - - `password`: optional password if included (`pass`). - - `port`: optional port (`8000`). - - `path`: optional path (`/the/path/`). - - `query`: optional URL query (for example, `GET` arguments or "search string", such as `query=here`). - - `fragment`: optional fragment (`fragment=is;this=bit`). - """ - - -# Note: all single host urls inherit from `AnyUrl` to preserve compatibility with pre-v2.10 code -# Where urls were annotated variants of `AnyUrl`, which was an alias to `pydantic_core.Url` - - -class AnyHttpUrl(AnyUrl): - """A type that will accept any http or https URL. - - * TLD not required - * Host not required - """ - - _constraints = UrlConstraints(allowed_schemes=['http', 'https']) - - -class HttpUrl(AnyUrl): - """A type that will accept any http or https URL. - - * TLD not required - * Host not required - * Max length 2083 - - ```python - from pydantic import BaseModel, HttpUrl, ValidationError - - class MyModel(BaseModel): - url: HttpUrl - - m = MyModel(url='http://www.example.com') # (1)! - print(m.url) - #> http://www.example.com/ - - try: - MyModel(url='ftp://invalid.url') - except ValidationError as e: - print(e) - ''' - 1 validation error for MyModel - url - URL scheme should be 'http' or 'https' [type=url_scheme, input_value='ftp://invalid.url', input_type=str] - ''' - - try: - MyModel(url='not a url') - except ValidationError as e: - print(e) - ''' - 1 validation error for MyModel - url - Input should be a valid URL, relative URL without a base [type=url_parsing, input_value='not a url', input_type=str] - ''' - ``` - - 1. Note: mypy would prefer `m = MyModel(url=HttpUrl('http://www.example.com'))`, but Pydantic will convert the string to an HttpUrl instance anyway. - - "International domains" (e.g. a URL where the host or TLD includes non-ascii characters) will be encoded via - [punycode](https://en.wikipedia.org/wiki/Punycode) (see - [this article](https://www.xudongz.com/blog/2017/idn-phishing/) for a good description of why this is important): - - ```python - from pydantic import BaseModel, HttpUrl - - class MyModel(BaseModel): - url: HttpUrl - - m1 = MyModel(url='http://puny£code.com') - print(m1.url) - #> http://xn--punycode-eja.com/ - m2 = MyModel(url='https://www.аррӏе.com/') - print(m2.url) - #> https://www.xn--80ak6aa92e.com/ - m3 = MyModel(url='https://www.example.珠宝/') - print(m3.url) - #> https://www.example.xn--pbt977c/ - ``` - - - !!! warning "Underscores in Hostnames" - In Pydantic, underscores are allowed in all parts of a domain except the TLD. - Technically this might be wrong - in theory the hostname cannot have underscores, but subdomains can. - - To explain this; consider the following two cases: - - - `exam_ple.co.uk`: the hostname is `exam_ple`, which should not be allowed since it contains an underscore. - - `foo_bar.example.com` the hostname is `example`, which should be allowed since the underscore is in the subdomain. - - Without having an exhaustive list of TLDs, it would be impossible to differentiate between these two. Therefore - underscores are allowed, but you can always do further validation in a validator if desired. - - Also, Chrome, Firefox, and Safari all currently accept `http://exam_ple.com` as a URL, so we're in good - (or at least big) company. - """ - - _constraints = UrlConstraints(max_length=2083, allowed_schemes=['http', 'https']) - - -class AnyWebsocketUrl(AnyUrl): - """A type that will accept any ws or wss URL. - - * TLD not required - * Host not required - """ - - _constraints = UrlConstraints(allowed_schemes=['ws', 'wss']) - - -class WebsocketUrl(AnyUrl): - """A type that will accept any ws or wss URL. - - * TLD not required - * Host not required - * Max length 2083 - """ - - _constraints = UrlConstraints(max_length=2083, allowed_schemes=['ws', 'wss']) - - -class FileUrl(AnyUrl): - """A type that will accept any file URL. - - * Host not required - """ - - _constraints = UrlConstraints(allowed_schemes=['file']) - - -class FtpUrl(AnyUrl): - """A type that will accept ftp URL. - - * TLD not required - * Host not required - """ - - _constraints = UrlConstraints(allowed_schemes=['ftp']) - - -class PostgresDsn(_BaseMultiHostUrl): - """A type that will accept any Postgres DSN. - - * User info required - * TLD not required - * Host required - * Supports multiple hosts - - If further validation is required, these properties can be used by validators to enforce specific behaviour: - - ```python - from pydantic import ( - BaseModel, - HttpUrl, - PostgresDsn, - ValidationError, - field_validator, - ) - - class MyModel(BaseModel): - url: HttpUrl - - m = MyModel(url='http://www.example.com') - - # the repr() method for a url will display all properties of the url - print(repr(m.url)) - #> HttpUrl('http://www.example.com/') - print(m.url.scheme) - #> http - print(m.url.host) - #> www.example.com - print(m.url.port) - #> 80 - - class MyDatabaseModel(BaseModel): - db: PostgresDsn - - @field_validator('db') - def check_db_name(cls, v): - assert v.path and len(v.path) > 1, 'database must be provided' - return v - - m = MyDatabaseModel(db='postgres://user:pass@localhost:5432/foobar') - print(m.db) - #> postgres://user:pass@localhost:5432/foobar - - try: - MyDatabaseModel(db='postgres://user:pass@localhost:5432') - except ValidationError as e: - print(e) - ''' - 1 validation error for MyDatabaseModel - db - Assertion failed, database must be provided - assert (None) - + where None = PostgresDsn('postgres://user:pass@localhost:5432').path [type=assertion_error, input_value='postgres://user:pass@localhost:5432', input_type=str] - ''' - ``` - """ - - _constraints = UrlConstraints( +AnyUrl = Url +"""Base type for all URLs. + +* Any scheme allowed +* Top-level domain (TLD) not required +* Host required + +Assuming an input URL of `http://samuel:pass@example.com:8000/the/path/?query=here#fragment=is;this=bit`, +the types export the following properties: + +- `scheme`: the URL scheme (`http`), always set. +- `host`: the URL host (`example.com`), always set. +- `username`: optional username if included (`samuel`). +- `password`: optional password if included (`pass`). +- `port`: optional port (`8000`). +- `path`: optional path (`/the/path/`). +- `query`: optional URL query (for example, `GET` arguments or "search string", such as `query=here`). +- `fragment`: optional fragment (`fragment=is;this=bit`). +""" +AnyHttpUrl = Annotated[Url, UrlConstraints(allowed_schemes=['http', 'https'])] +"""A type that will accept any http or https URL. + +* TLD not required +* Host required +""" +HttpUrl = Annotated[Url, UrlConstraints(max_length=2083, allowed_schemes=['http', 'https'])] +"""A type that will accept any http or https URL. + +* TLD required +* Host required +* Max length 2083 + +```py +from pydantic import BaseModel, HttpUrl, ValidationError + +class MyModel(BaseModel): + url: HttpUrl + +m = MyModel(url='http://www.example.com') +print(m.url) +#> http://www.example.com/ + +try: + MyModel(url='ftp://invalid.url') +except ValidationError as e: + print(e) + ''' + 1 validation error for MyModel + url + URL scheme should be 'http' or 'https' [type=url_scheme, input_value='ftp://invalid.url', input_type=str] + ''' + +try: + MyModel(url='not a url') +except ValidationError as e: + print(e) + ''' + 1 validation error for MyModel + url + Input should be a valid URL, relative URL without a base [type=url_parsing, input_value='not a url', input_type=str] + ''' +``` + +"International domains" (e.g. a URL where the host or TLD includes non-ascii characters) will be encoded via +[punycode](https://en.wikipedia.org/wiki/Punycode) (see +[this article](https://www.xudongz.com/blog/2017/idn-phishing/) for a good description of why this is important): + +```py +from pydantic import BaseModel, HttpUrl + +class MyModel(BaseModel): + url: HttpUrl + +m1 = MyModel(url='http://puny£code.com') +print(m1.url) +#> http://xn--punycode-eja.com/ +m2 = MyModel(url='https://www.аррӏе.com/') +print(m2.url) +#> https://www.xn--80ak6aa92e.com/ +m3 = MyModel(url='https://www.example.珠宝/') +print(m3.url) +#> https://www.example.xn--pbt977c/ +``` + + +!!! warning "Underscores in Hostnames" + In Pydantic, underscores are allowed in all parts of a domain except the TLD. + Technically this might be wrong - in theory the hostname cannot have underscores, but subdomains can. + + To explain this; consider the following two cases: + + - `exam_ple.co.uk`: the hostname is `exam_ple`, which should not be allowed since it contains an underscore. + - `foo_bar.example.com` the hostname is `example`, which should be allowed since the underscore is in the subdomain. + + Without having an exhaustive list of TLDs, it would be impossible to differentiate between these two. Therefore + underscores are allowed, but you can always do further validation in a validator if desired. + + Also, Chrome, Firefox, and Safari all currently accept `http://exam_ple.com` as a URL, so we're in good + (or at least big) company. +""" +FileUrl = Annotated[Url, UrlConstraints(allowed_schemes=['file'])] +"""A type that will accept any file URL. + +* Host not required +""" +PostgresDsn = Annotated[ + MultiHostUrl, + UrlConstraints( host_required=True, allowed_schemes=[ 'postgres', @@ -763,132 +199,119 @@ class PostgresDsn(_BaseMultiHostUrl): 'postgresql+py-postgresql', 'postgresql+pygresql', ], - ) + ), +] +"""A type that will accept any Postgres DSN. - @property - def host(self) -> str: - """The required URL host.""" - return self._url.host # pyright: ignore[reportAttributeAccessIssue] +* User info required +* TLD not required +* Host required +* Supports multiple hosts +If further validation is required, these properties can be used by validators to enforce specific behaviour: -class CockroachDsn(AnyUrl): - """A type that will accept any Cockroach DSN. +```py +from pydantic import ( + BaseModel, + HttpUrl, + PostgresDsn, + ValidationError, + field_validator, +) - * User info required - * TLD not required - * Host required - """ +class MyModel(BaseModel): + url: HttpUrl - _constraints = UrlConstraints( +m = MyModel(url='http://www.example.com') + +# the repr() method for a url will display all properties of the url +print(repr(m.url)) +#> Url('http://www.example.com/') +print(m.url.scheme) +#> http +print(m.url.host) +#> www.example.com +print(m.url.port) +#> 80 + +class MyDatabaseModel(BaseModel): + db: PostgresDsn + + @field_validator('db') + def check_db_name(cls, v): + assert v.path and len(v.path) > 1, 'database must be provided' + return v + +m = MyDatabaseModel(db='postgres://user:pass@localhost:5432/foobar') +print(m.db) +#> postgres://user:pass@localhost:5432/foobar + +try: + MyDatabaseModel(db='postgres://user:pass@localhost:5432') +except ValidationError as e: + print(e) + ''' + 1 validation error for MyDatabaseModel + db + Assertion failed, database must be provided + assert (None) + + where None = MultiHostUrl('postgres://user:pass@localhost:5432').path [type=assertion_error, input_value='postgres://user:pass@localhost:5432', input_type=str] + ''' +``` +""" + +CockroachDsn = Annotated[ + Url, + UrlConstraints( host_required=True, allowed_schemes=[ 'cockroachdb', 'cockroachdb+psycopg2', 'cockroachdb+asyncpg', ], - ) + ), +] +"""A type that will accept any Cockroach DSN. - @property - def host(self) -> str: - """The required URL host.""" - return self._url.host # pyright: ignore[reportReturnType] +* User info required +* TLD not required +* Host required +""" +AmqpDsn = Annotated[Url, UrlConstraints(allowed_schemes=['amqp', 'amqps'])] +"""A type that will accept any AMQP DSN. +* User info required +* TLD not required +* Host required +""" +RedisDsn = Annotated[ + Url, + UrlConstraints(allowed_schemes=['redis', 'rediss'], default_host='localhost', default_port=6379, default_path='/0'), +] +"""A type that will accept any Redis DSN. -class AmqpDsn(AnyUrl): - """A type that will accept any AMQP DSN. +* User info required +* TLD not required +* Host required (e.g., `rediss://:pass@localhost`) +""" +MongoDsn = Annotated[MultiHostUrl, UrlConstraints(allowed_schemes=['mongodb', 'mongodb+srv'], default_port=27017)] +"""A type that will accept any MongoDB DSN. - * User info required - * TLD not required - * Host not required - """ +* User info not required +* Database name not required +* Port not required +* User info may be passed without user part (e.g., `mongodb://mongodb0.example.com:27017`). +""" +KafkaDsn = Annotated[Url, UrlConstraints(allowed_schemes=['kafka'], default_host='localhost', default_port=9092)] +"""A type that will accept any Kafka DSN. - _constraints = UrlConstraints(allowed_schemes=['amqp', 'amqps']) - - -class RedisDsn(AnyUrl): - """A type that will accept any Redis DSN. - - * User info required - * TLD not required - * Host required (e.g., `rediss://:pass@localhost`) - """ - - _constraints = UrlConstraints( - allowed_schemes=['redis', 'rediss'], - default_host='localhost', - default_port=6379, - default_path='/0', - host_required=True, - ) - - @property - def host(self) -> str: - """The required URL host.""" - return self._url.host # pyright: ignore[reportReturnType] - - -class MongoDsn(_BaseMultiHostUrl): - """A type that will accept any MongoDB DSN. - - * User info not required - * Database name not required - * Port not required - * User info may be passed without user part (e.g., `mongodb://mongodb0.example.com:27017`). - - !!! warning - If a port isn't specified, the default MongoDB port `27017` will be used. If this behavior is - undesirable, you can use the following: - - ```python - from typing import Annotated - - from pydantic import UrlConstraints - from pydantic_core import MultiHostUrl - - MongoDsnNoDefaultPort = Annotated[ - MultiHostUrl, - UrlConstraints(allowed_schemes=['mongodb', 'mongodb+srv']), - ] - ``` - """ - - _constraints = UrlConstraints(allowed_schemes=['mongodb', 'mongodb+srv'], default_port=27017) - - -class KafkaDsn(AnyUrl): - """A type that will accept any Kafka DSN. - - * User info required - * TLD not required - * Host not required - """ - - _constraints = UrlConstraints(allowed_schemes=['kafka'], default_host='localhost', default_port=9092) - - -class NatsDsn(_BaseMultiHostUrl): - """A type that will accept any NATS DSN. - - NATS is a connective technology built for the ever increasingly hyper-connected world. - It is a single technology that enables applications to securely communicate across - any combination of cloud vendors, on-premise, edge, web and mobile, and devices. - More: https://nats.io - """ - - _constraints = UrlConstraints( - allowed_schemes=['nats', 'tls', 'ws', 'wss'], default_host='localhost', default_port=4222 - ) - - -class MySQLDsn(AnyUrl): - """A type that will accept any MySQL DSN. - - * User info required - * TLD not required - * Host not required - """ - - _constraints = UrlConstraints( +* User info required +* TLD not required +* Host required +""" +MySQLDsn = Annotated[ + Url, + UrlConstraints( allowed_schemes=[ 'mysql', 'mysql+mysqlconnector', @@ -900,63 +323,27 @@ class MySQLDsn(AnyUrl): 'mysql+pyodbc', ], default_port=3306, - host_required=True, - ) + ), +] +"""A type that will accept any MySQL DSN. - -class MariaDBDsn(AnyUrl): - """A type that will accept any MariaDB DSN. - - * User info required - * TLD not required - * Host not required - """ - - _constraints = UrlConstraints( +* User info required +* TLD not required +* Host required +""" +MariaDBDsn = Annotated[ + Url, + UrlConstraints( allowed_schemes=['mariadb', 'mariadb+mariadbconnector', 'mariadb+pymysql'], default_port=3306, - ) + ), +] +"""A type that will accept any MariaDB DSN. - -class ClickHouseDsn(AnyUrl): - """A type that will accept any ClickHouse DSN. - - * User info required - * TLD not required - * Host not required - """ - - _constraints = UrlConstraints( - allowed_schemes=[ - 'clickhouse+native', - 'clickhouse+asynch', - 'clickhouse+http', - 'clickhouse', - 'clickhouses', - 'clickhousedb', - ], - default_host='localhost', - default_port=9000, - ) - - -class SnowflakeDsn(AnyUrl): - """A type that will accept any Snowflake DSN. - - * User info required - * TLD not required - * Host required - """ - - _constraints = UrlConstraints( - allowed_schemes=['snowflake'], - host_required=True, - ) - - @property - def host(self) -> str: - """The required URL host.""" - return self._url.host # pyright: ignore[reportReturnType] +* User info required +* TLD not required +* Host required +""" def import_email_validator() -> None: @@ -964,9 +351,7 @@ def import_email_validator() -> None: try: import email_validator except ImportError as e: - raise ImportError("email-validator is not installed, run `pip install 'pydantic[email]'`") from e - if not version('email-validator').partition('.')[0] == '2': - raise ImportError('email-validator version >= 2.0 required, run pip install -U email-validator') + raise ImportError('email-validator is not installed, run `pip install pydantic[email]`') from e if TYPE_CHECKING: @@ -985,7 +370,7 @@ else: Validate email addresses. - ```python + ```py from pydantic import BaseModel, EmailStr class Model(BaseModel): @@ -1014,8 +399,8 @@ else: return field_schema @classmethod - def _validate(cls, input_value: str, /) -> str: - return validate_email(input_value)[1] + def _validate(cls, __input_value: str) -> str: + return validate_email(__input_value)[1] class NameEmail(_repr.Representation): @@ -1034,7 +419,7 @@ class NameEmail(_repr.Representation): The `NameEmail` has two properties: `name` and `email`. In case the `name` is not provided, it's inferred from the email address. - ```python + ```py from pydantic import BaseModel, NameEmail class User(BaseModel): @@ -1078,197 +463,182 @@ class NameEmail(_repr.Representation): _handler: GetCoreSchemaHandler, ) -> core_schema.CoreSchema: import_email_validator() - return core_schema.no_info_after_validator_function( cls._validate, - core_schema.json_or_python_schema( - json_schema=core_schema.str_schema(), - python_schema=core_schema.union_schema( - [core_schema.is_instance_schema(cls), core_schema.str_schema()], - custom_error_type='name_email_type', - custom_error_message='Input is not a valid NameEmail', - ), - serialization=core_schema.to_string_ser_schema(), + core_schema.union_schema( + [core_schema.is_instance_schema(cls), core_schema.str_schema()], + custom_error_type='name_email_type', + custom_error_message='Input is not a valid NameEmail', ), + serialization=core_schema.to_string_ser_schema(), ) @classmethod - def _validate(cls, input_value: Self | str, /) -> Self: - if isinstance(input_value, str): - name, email = validate_email(input_value) - return cls(name, email) + def _validate(cls, __input_value: NameEmail | str) -> NameEmail: + if isinstance(__input_value, cls): + return __input_value else: - return input_value + name, email = validate_email(__input_value) # type: ignore[arg-type] + return cls(name, email) def __str__(self) -> str: - if '@' in self.name: - return f'"{self.name}" <{self.email}>' - return f'{self.name} <{self.email}>' -IPvAnyAddressType: TypeAlias = 'IPv4Address | IPv6Address' -IPvAnyInterfaceType: TypeAlias = 'IPv4Interface | IPv6Interface' -IPvAnyNetworkType: TypeAlias = 'IPv4Network | IPv6Network' +class IPvAnyAddress: + """Validate an IPv4 or IPv6 address. -if TYPE_CHECKING: - IPvAnyAddress = IPvAnyAddressType - IPvAnyInterface = IPvAnyInterfaceType - IPvAnyNetwork = IPvAnyNetworkType -else: + ```py + from pydantic import BaseModel + from pydantic.networks import IPvAnyAddress - class IPvAnyAddress: - """Validate an IPv4 or IPv6 address. + class IpModel(BaseModel): + ip: IPvAnyAddress - ```python - from pydantic import BaseModel - from pydantic.networks import IPvAnyAddress + print(IpModel(ip='127.0.0.1')) + #> ip=IPv4Address('127.0.0.1') - class IpModel(BaseModel): - ip: IPvAnyAddress + try: + IpModel(ip='http://www.example.com') + except ValueError as e: + print(e.errors()) + ''' + [ + { + 'type': 'ip_any_address', + 'loc': ('ip',), + 'msg': 'value is not a valid IPv4 or IPv6 address', + 'input': 'http://www.example.com', + } + ] + ''' + ``` + """ - print(IpModel(ip='127.0.0.1')) - #> ip=IPv4Address('127.0.0.1') + __slots__ = () + + def __new__(cls, value: Any) -> IPv4Address | IPv6Address: + """Validate an IPv4 or IPv6 address.""" + try: + return IPv4Address(value) + except ValueError: + pass try: - IpModel(ip='http://www.example.com') - except ValueError as e: - print(e.errors()) - ''' - [ - { - 'type': 'ip_any_address', - 'loc': ('ip',), - 'msg': 'value is not a valid IPv4 or IPv6 address', - 'input': 'http://www.example.com', - } - ] - ''' - ``` - """ + return IPv6Address(value) + except ValueError: + raise PydanticCustomError('ip_any_address', 'value is not a valid IPv4 or IPv6 address') - __slots__ = () + @classmethod + def __get_pydantic_json_schema__( + cls, core_schema: core_schema.CoreSchema, handler: _schema_generation_shared.GetJsonSchemaHandler + ) -> JsonSchemaValue: + field_schema = {} + field_schema.update(type='string', format='ipvanyaddress') + return field_schema - def __new__(cls, value: Any) -> IPvAnyAddressType: - """Validate an IPv4 or IPv6 address.""" - try: - return IPv4Address(value) - except ValueError: - pass + @classmethod + def __get_pydantic_core_schema__( + cls, + _source: type[Any], + _handler: GetCoreSchemaHandler, + ) -> core_schema.CoreSchema: + return core_schema.no_info_plain_validator_function( + cls._validate, serialization=core_schema.to_string_ser_schema() + ) - try: - return IPv6Address(value) - except ValueError: - raise PydanticCustomError('ip_any_address', 'value is not a valid IPv4 or IPv6 address') + @classmethod + def _validate(cls, __input_value: Any) -> IPv4Address | IPv6Address: + return cls(__input_value) # type: ignore[return-value] - @classmethod - def __get_pydantic_json_schema__( - cls, core_schema: core_schema.CoreSchema, handler: _schema_generation_shared.GetJsonSchemaHandler - ) -> JsonSchemaValue: - field_schema = {} - field_schema.update(type='string', format='ipvanyaddress') - return field_schema - @classmethod - def __get_pydantic_core_schema__( - cls, - _source: type[Any], - _handler: GetCoreSchemaHandler, - ) -> core_schema.CoreSchema: - return core_schema.no_info_plain_validator_function( - cls._validate, serialization=core_schema.to_string_ser_schema() - ) +class IPvAnyInterface: + """Validate an IPv4 or IPv6 interface.""" - @classmethod - def _validate(cls, input_value: Any, /) -> IPvAnyAddressType: - return cls(input_value) # type: ignore[return-value] + __slots__ = () - class IPvAnyInterface: + def __new__(cls, value: NetworkType) -> IPv4Interface | IPv6Interface: """Validate an IPv4 or IPv6 interface.""" + try: + return IPv4Interface(value) + except ValueError: + pass - __slots__ = () + try: + return IPv6Interface(value) + except ValueError: + raise PydanticCustomError('ip_any_interface', 'value is not a valid IPv4 or IPv6 interface') - def __new__(cls, value: NetworkType) -> IPvAnyInterfaceType: - """Validate an IPv4 or IPv6 interface.""" - try: - return IPv4Interface(value) - except ValueError: - pass + @classmethod + def __get_pydantic_json_schema__( + cls, core_schema: core_schema.CoreSchema, handler: _schema_generation_shared.GetJsonSchemaHandler + ) -> JsonSchemaValue: + field_schema = {} + field_schema.update(type='string', format='ipvanyinterface') + return field_schema - try: - return IPv6Interface(value) - except ValueError: - raise PydanticCustomError('ip_any_interface', 'value is not a valid IPv4 or IPv6 interface') + @classmethod + def __get_pydantic_core_schema__( + cls, + _source: type[Any], + _handler: GetCoreSchemaHandler, + ) -> core_schema.CoreSchema: + return core_schema.no_info_plain_validator_function( + cls._validate, serialization=core_schema.to_string_ser_schema() + ) - @classmethod - def __get_pydantic_json_schema__( - cls, core_schema: core_schema.CoreSchema, handler: _schema_generation_shared.GetJsonSchemaHandler - ) -> JsonSchemaValue: - field_schema = {} - field_schema.update(type='string', format='ipvanyinterface') - return field_schema + @classmethod + def _validate(cls, __input_value: NetworkType) -> IPv4Interface | IPv6Interface: + return cls(__input_value) # type: ignore[return-value] - @classmethod - def __get_pydantic_core_schema__( - cls, - _source: type[Any], - _handler: GetCoreSchemaHandler, - ) -> core_schema.CoreSchema: - return core_schema.no_info_plain_validator_function( - cls._validate, serialization=core_schema.to_string_ser_schema() - ) - @classmethod - def _validate(cls, input_value: NetworkType, /) -> IPvAnyInterfaceType: - return cls(input_value) # type: ignore[return-value] +class IPvAnyNetwork: + """Validate an IPv4 or IPv6 network.""" - class IPvAnyNetwork: + __slots__ = () + + def __new__(cls, value: NetworkType) -> IPv4Network | IPv6Network: """Validate an IPv4 or IPv6 network.""" + # Assume IP Network is defined with a default value for `strict` argument. + # Define your own class if you want to specify network address check strictness. + try: + return IPv4Network(value) + except ValueError: + pass - __slots__ = () + try: + return IPv6Network(value) + except ValueError: + raise PydanticCustomError('ip_any_network', 'value is not a valid IPv4 or IPv6 network') - def __new__(cls, value: NetworkType) -> IPvAnyNetworkType: - """Validate an IPv4 or IPv6 network.""" - # Assume IP Network is defined with a default value for `strict` argument. - # Define your own class if you want to specify network address check strictness. - try: - return IPv4Network(value) - except ValueError: - pass + @classmethod + def __get_pydantic_json_schema__( + cls, core_schema: core_schema.CoreSchema, handler: _schema_generation_shared.GetJsonSchemaHandler + ) -> JsonSchemaValue: + field_schema = {} + field_schema.update(type='string', format='ipvanynetwork') + return field_schema - try: - return IPv6Network(value) - except ValueError: - raise PydanticCustomError('ip_any_network', 'value is not a valid IPv4 or IPv6 network') + @classmethod + def __get_pydantic_core_schema__( + cls, + _source: type[Any], + _handler: GetCoreSchemaHandler, + ) -> core_schema.CoreSchema: + return core_schema.no_info_plain_validator_function( + cls._validate, serialization=core_schema.to_string_ser_schema() + ) - @classmethod - def __get_pydantic_json_schema__( - cls, core_schema: core_schema.CoreSchema, handler: _schema_generation_shared.GetJsonSchemaHandler - ) -> JsonSchemaValue: - field_schema = {} - field_schema.update(type='string', format='ipvanynetwork') - return field_schema - - @classmethod - def __get_pydantic_core_schema__( - cls, - _source: type[Any], - _handler: GetCoreSchemaHandler, - ) -> core_schema.CoreSchema: - return core_schema.no_info_plain_validator_function( - cls._validate, serialization=core_schema.to_string_ser_schema() - ) - - @classmethod - def _validate(cls, input_value: NetworkType, /) -> IPvAnyNetworkType: - return cls(input_value) # type: ignore[return-value] + @classmethod + def _validate(cls, __input_value: NetworkType) -> IPv4Network | IPv6Network: + return cls(__input_value) # type: ignore[return-value] def _build_pretty_email_regex() -> re.Pattern[str]: name_chars = r'[\w!#$%&\'*+\-/=?^_`{|}~]' unquoted_name_group = rf'((?:{name_chars}+\s+)*{name_chars}+)' quoted_name_group = r'"((?:[^"]|\")+)"' - email_group = r'<(.+)>' + email_group = r'<\s*(.+)\s*>' return re.compile(rf'\s*(?:{unquoted_name_group}|{quoted_name_group})?\s*{email_group}\s*') @@ -1283,13 +653,6 @@ A somewhat arbitrary but very generous number compared to what is allowed by mos def validate_email(value: str) -> tuple[str, str]: """Email address validation using [email-validator](https://pypi.org/project/email-validator/). - Returns: - A tuple containing the local part of the email (or the name for "pretty" email addresses) - and the normalized email. - - Raises: - PydanticCustomError: If the email is invalid. - Note: Note that: diff --git a/Backend/venv/lib/python3.12/site-packages/pydantic/parse.py b/Backend/venv/lib/python3.12/site-packages/pydantic/parse.py index 68b7f046..ceee6342 100644 --- a/Backend/venv/lib/python3.12/site-packages/pydantic/parse.py +++ b/Backend/venv/lib/python3.12/site-packages/pydantic/parse.py @@ -1,5 +1,4 @@ """The `parse` module is a backport module from V1.""" - from ._migration import getattr_migration __getattr__ = getattr_migration(__name__) diff --git a/Backend/venv/lib/python3.12/site-packages/pydantic/plugin/__init__.py b/Backend/venv/lib/python3.12/site-packages/pydantic/plugin/__init__.py index 840d20a0..82e729c5 100644 --- a/Backend/venv/lib/python3.12/site-packages/pydantic/plugin/__init__.py +++ b/Backend/venv/lib/python3.12/site-packages/pydantic/plugin/__init__.py @@ -1,17 +1,13 @@ -"""!!! abstract "Usage Documentation" - [Build a Plugin](../concepts/plugins.md#build-a-plugin) +"""Usage docs: https://docs.pydantic.dev/2.5/concepts/plugins#build-a-plugin Plugin interface for Pydantic plugins, and related types. """ - from __future__ import annotations -from typing import Any, Callable, Literal, NamedTuple +from typing import Any, Callable, NamedTuple from pydantic_core import CoreConfig, CoreSchema, ValidationError -from typing_extensions import Protocol, TypeAlias - -from pydantic.config import ExtraValues +from typing_extensions import Literal, Protocol, TypeAlias __all__ = ( 'PydanticPluginProtocol', @@ -115,26 +111,21 @@ class ValidatePythonHandlerProtocol(BaseValidateHandlerProtocol, Protocol): input: Any, *, strict: bool | None = None, - extra: ExtraValues | None = None, from_attributes: bool | None = None, - context: Any | None = None, + context: dict[str, Any] | None = None, self_instance: Any | None = None, - by_alias: bool | None = None, - by_name: bool | None = None, ) -> None: """Callback to be notified of validation start, and create an instance of the event handler. Args: input: The input to be validated. strict: Whether to validate the object in strict mode. - extra: Whether to ignore, allow, or forbid extra data during model validation. from_attributes: Whether to validate objects as inputs by extracting attributes. context: The context to use for validation, this is passed to functional validators. self_instance: An instance of a model to set attributes on from validation, this is used when running validation from the `__init__` method of a model. - by_alias: Whether to use the field's alias to match the input data to an attribute. - by_name: Whether to use the field's name to match the input data to an attribute. """ + pass class ValidateJsonHandlerProtocol(BaseValidateHandlerProtocol, Protocol): @@ -145,24 +136,19 @@ class ValidateJsonHandlerProtocol(BaseValidateHandlerProtocol, Protocol): input: str | bytes | bytearray, *, strict: bool | None = None, - extra: ExtraValues | None = None, - context: Any | None = None, + context: dict[str, Any] | None = None, self_instance: Any | None = None, - by_alias: bool | None = None, - by_name: bool | None = None, ) -> None: """Callback to be notified of validation start, and create an instance of the event handler. Args: input: The JSON data to be validated. strict: Whether to validate the object in strict mode. - extra: Whether to ignore, allow, or forbid extra data during model validation. context: The context to use for validation, this is passed to functional validators. self_instance: An instance of a model to set attributes on from validation, this is used when running validation from the `__init__` method of a model. - by_alias: Whether to use the field's alias to match the input data to an attribute. - by_name: Whether to use the field's name to match the input data to an attribute. """ + pass StringInput: TypeAlias = 'dict[str, StringInput]' @@ -172,22 +158,13 @@ class ValidateStringsHandlerProtocol(BaseValidateHandlerProtocol, Protocol): """Event handler for `SchemaValidator.validate_strings`.""" def on_enter( - self, - input: StringInput, - *, - strict: bool | None = None, - extra: ExtraValues | None = None, - context: Any | None = None, - by_alias: bool | None = None, - by_name: bool | None = None, + self, input: StringInput, *, strict: bool | None = None, context: dict[str, Any] | None = None ) -> None: """Callback to be notified of validation start, and create an instance of the event handler. Args: input: The string data to be validated. strict: Whether to validate the object in strict mode. - extra: Whether to ignore, allow, or forbid extra data during model validation. context: The context to use for validation, this is passed to functional validators. - by_alias: Whether to use the field's alias to match the input data to an attribute. - by_name: Whether to use the field's name to match the input data to an attribute. """ + pass diff --git a/Backend/venv/lib/python3.12/site-packages/pydantic/plugin/__pycache__/__init__.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/pydantic/plugin/__pycache__/__init__.cpython-312.pyc index 74627129b3be96bede3cc45983932e597a5879da..a6f72cd6df79e615431e43b58f9053fbdf71276c 100644 GIT binary patch delta 2337 zcmaJ@O>7%Q6rS~Z9eeHdU*h~H-Tbtv6DMiYmKG;X8qzfMM}eSFsaq=7@os}7+Z)X~ zsHsq0sVzeEfT~f&rAQn=DuM$j5<)_VN?edQ(5RQ-3q?ru!eL9(OAr$8&Bjhr5F7cM z_r7`aX7_tY*&HFT8Ue;vJ zNjZN$pat@ZrsRWK5IBz((rdJ^?lmI1Zv;}g$Q04#8$|aTp3g)~PKXvY0(zhcty&(b zR3n2B88Vb=WF4$85j_laWE&mhX`{f_8ZqGAJTKAeIbR2SYzN<<*K3V@tA^@UjS$te zBdTe+Io@*R=Id5^-cWTjVoY!x&w>Ldb&`|W(IWQt-+yzLxUN!kTDjE z*5G1pX+B%9y5^R$IlVvK@A&MVFcTKb;&@@X?43yGa_PC8!J@7s?P9s+Otxsybgt}u zm6}B}W9G`f+2uuJJeN(c6kNvyA{62?r&gR~E0 zy$A^el#=!%@NEXrszVqAxDuH#sWD*|E@kJ{x7BI0V9*Rz@8d8YqXo1FHJ}yzbSK5NmiqO`HxF2B`f{M_Apj4on-SVeAd_n;!&I-YmslZjC731SB z+6x12VlCy0mJ1wJr5)^7<#2QcoToJa*N7b;z7SPeZ}3jb_H~j$sY$n%m4gTT=U@dr zf`IYeY$SBcTUo8&uZrsHn<0y12;A+XABlm+M{(mn*F=@(WX;01Iq$zT!e#9UhY^MmM%xhawzf$YL>FO-eH-po)ry+|qk2h>B|J^C(+$m{ zc-PIolylVR5NQUxF2M0^vBqB!J}sQ2FIl_#pc()>q2o)Ml0T5TC-ICmx_vxQ?rd zxio1{NFOA)4Tws5+r`b16Ukq)QP2y#9)aFI2X0otTc9bjM5^s73RoE<7XSG~1 zonrS|+Dbe_wJ`J~1oPU{Q)pH7r>D_fs+eA<8q+Z8 z+`w~!{=bY7T!!!=CO-gxGLG3EGIC6KFn8&RC`-y(OtnQh4o3eGFkn2D;^QNqvMzz| zh=ysV4~9Pb7$0e>LqmE+rvx()A0-qe?J#wa}t8K4-% z`W(O(1wr`JB?|6mULtfoCW%#&cudAu$@niMxk{4kV(08gy`Vhk9=qSTPQY3pssp$4 k=+~Fm30U?3X&$=ffA`!&vVYy9z|`(z_xC;{U~x_U0hTP|*8l(j literal 8944 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 delta 1482 zcmZuxO>7%Q6n?XR-u2(c`KdQf)BHG*>ozH(ZBo;kN+EF)g9(A8LNPz9O?H#oSv%2s zoe;@sic};de4tvXMJh;$8)^_24&0FXbK+u?gUz;-aHs?lhcqA|1tBrJ&B~}^qLdqfA90T0grb>gPAYb>waOYjIEn+31pCw3OSTU$ijq57MYNmWH+`v zw&j%qvQKH@Wxs7U$^11c-Mm3W1J`$tgptW6bw!irRV7N8zS+6ygg82x7=0x95m|qOb&%fVpyhLbr!5C@T(iS9bYn5r z;>ssV@cuCz*@`1BG@@)&f^6^^3Y#+HRBR`BnFIWLyTKEoi;dj>Keu%l`b zd!+wtO*Ues@XtUa$x~`;2Ew3+oQ3E|9kfXFfi|&8>Rk?#?RHQ@m&j~y!*Woz&p{1+ z3-{FFPBch>1U9gXEs?i~&uE$3cHchi0|av*Q=8-!vi$o~y^hx5J#r4#QP?iev7%n% zAM)CeDNN6ejZDoZN5!$^%*acrggBkLG?AQ|`4Xa}=@LarRYlQ6&zqF46_u&k12kZK zK)n|I&6+ZbOm{(-7M4|IO;N|AttPQjFqtJqSMqC`4@YPo;}I1XtZQh}Ym!=2Oe!zs z6q7Ejsu|trr;{Cw%@?AS*(7HQ)+La|RkgU3$rp@GI!Ieh+--b9uU{U-=m`D_Z{QZc z3V*sm2;JPczESD9uoH||sMg1>;4UAibM2MRp(;02=K~M9K!t0sx3qo8?sjxlSYeN7 z=K3EBCu%~hD#Uh#^ZUU2LLXE0aHJMKTMeJx2fy(a6M3~Bj8uYWzV*~%lhxQ{CG~bK zHD685R~8m`QcKm?QeEiYBV28v`tV3?c)U71zB4@eDf@Xxt><*L=kyQ4nI{2%AoPU9 z+4p*lZKlWD0-eXVk5xKi`#>8%GB3Qj8#(@$i)s(;0~UYpk#rlDe(3J6dXF9yhH<4| zjSMCzxYN-ydXl;mr!c;Il20Jl-SaPw#a;K#(U`dxr!jLMkr>~ns03>)x=uB>m~K&A zEb2u~5k-x}xr|?3U0dxKXx1gt!dRI6!iuUY3wmZHUpOVrFKE_gn~c7(n#nI|v=wK) z6((q`h3#|XaaZK?E4pO=g_Cv1Y1 mvDhOKLXV*LF+BGGxCg-h1bsh4x|7Du9?V4# z%}GHB^AA`A5B9jAH}P0hyhuGnqy-TV9`rw`GZh49;LZ2m<9qWl^Q`q{9>2%fMsm$x zIoplLID(_&V{?zVK@46X1#S|PTf_oHf$Fi%9pZ48xEvGAi==p<8}StPh{t{617dpO z(gHQ(5-*c74@kg667mYE0MZciskH^_K7>eBa*Nvkc#V0~iIihS(yFuQZfm@E$Zt@W z9j5q_bS$}PS)4W+XJir3;z%dc8d^kjYJ{k_rKw;UaD;}`ALU7tR%l6{GsE0mRS>u= zUO>|_uca(mS&f1h|lG+NK6XymU`E z>cNtx0$uF6Pe2zjz5(a5H~5wYt0MG%K}YERcc9{@{|;F8sx%GYKHn(=tYx2rHo%>% zRoMo3DE6z@|I52sThbFpW{VHCdoU}`M-A6Vhy8AEEy*kSeiU4s;Qo-V^wMsp-C0jq zVyRgUrc#}WD`DdQZECXzDeDco>%BpORsY*) XpoJf3`4d{+MW;l+{uDy7U!VB{>xzbN delta 676 zcmY*X&1)1f9L;ZbcXmGa`&(?cwNh*Cq6dqh9(u7@Dq@8mf^^*7q;+(%Te4Gdi`asD z6NHjO4_*o$>um%<{{eBmi3%%4MZ}8-FW#MOq0j_g@_z3nFCqDQac|b{+qQwiwo;jK z#g1Ku+Ro(E79av7=BX@><4nUE)3MGBY%mj>LrwK8W@DQraDpXqlBIBJSdV*Ymcbc7 zG|nxe5#7tO9L}*k&a(n8up%x3QV`7$V;^KLLbw!ilbA=mOs^WmDod#nN+)RL{-vSw z7#!J85}S^Y#FbFh!%lMIv^shrPm;YD9#zmhBB>rC>3!vJIj)id$@HRlj1);W9LKwn zsnX^dv7%N)3nok$XxDwp>kW^J9T?N%i>{=ecnjA60#or7u!8Mq0iY1<#$HE4c2l1R zxE$;nngVyko;7WnVH&SWP{n8KDX5}h--6lTmA$Np@9C&Wr2dHgOj79SFR&_pq~F6@ z@G>(3V87^R0o>q2&H=a^oGZKo*cSha3&-|cC@tnT&)#m{qpZGM_gqr<+r0XyDz+je z@x1h4>lD8crVk9qS>5nAICUHzk;mb(nryZ`k2Za`-RjipjV6!Es_J*w-PRh9NuMeq zEc{}`xcp?M7mD)1JN*#; oMgU-dYQNCCp7mPEqz2w2WV1ESDwLn@uo8NAJAo?IRF3v diff --git a/Backend/venv/lib/python3.12/site-packages/pydantic/plugin/_loader.py b/Backend/venv/lib/python3.12/site-packages/pydantic/plugin/_loader.py index a789092f..b30143b6 100644 --- a/Backend/venv/lib/python3.12/site-packages/pydantic/plugin/_loader.py +++ b/Backend/venv/lib/python3.12/site-packages/pydantic/plugin/_loader.py @@ -1,10 +1,16 @@ from __future__ import annotations -import importlib.metadata as importlib_metadata -import os +import sys import warnings -from collections.abc import Iterable -from typing import TYPE_CHECKING, Final +from typing import TYPE_CHECKING, Iterable + +from typing_extensions import Final + +if sys.version_info >= (3, 8): + import importlib.metadata as importlib_metadata +else: + import importlib_metadata + if TYPE_CHECKING: from . import PydanticPluginProtocol @@ -24,13 +30,10 @@ def get_plugins() -> Iterable[PydanticPluginProtocol]: Inspired by: https://github.com/pytest-dev/pluggy/blob/1.3.0/src/pluggy/_manager.py#L376-L402 """ - disabled_plugins = os.getenv('PYDANTIC_DISABLE_PLUGINS') global _plugins, _loading_plugins if _loading_plugins: # this happens when plugins themselves use pydantic, we return no plugins return () - elif disabled_plugins in ('__all__', '1', 'true'): - return () elif _plugins is None: _plugins = {} # set _loading_plugins so any plugins that use pydantic don't themselves use plugins @@ -42,15 +45,12 @@ def get_plugins() -> Iterable[PydanticPluginProtocol]: continue if entry_point.value in _plugins: continue - if disabled_plugins is not None and entry_point.name in disabled_plugins.split(','): - continue try: _plugins[entry_point.value] = entry_point.load() except (ImportError, AttributeError) as e: warnings.warn( f'{e.__class__.__name__} while loading the `{entry_point.name}` Pydantic plugin, ' - f'this plugin will not be installed.\n\n{e!r}', - stacklevel=2, + f'this plugin will not be installed.\n\n{e!r}' ) finally: _loading_plugins = False diff --git a/Backend/venv/lib/python3.12/site-packages/pydantic/plugin/_schema_validator.py b/Backend/venv/lib/python3.12/site-packages/pydantic/plugin/_schema_validator.py index 83f2562b..7186ece6 100644 --- a/Backend/venv/lib/python3.12/site-packages/pydantic/plugin/_schema_validator.py +++ b/Backend/venv/lib/python3.12/site-packages/pydantic/plugin/_schema_validator.py @@ -1,13 +1,11 @@ """Pluggable schema validator for pydantic.""" - from __future__ import annotations import functools -from collections.abc import Iterable -from typing import TYPE_CHECKING, Any, Callable, Literal, TypeVar +from typing import TYPE_CHECKING, Any, Callable, Iterable, TypeVar from pydantic_core import CoreConfig, CoreSchema, SchemaValidator, ValidationError -from typing_extensions import ParamSpec +from typing_extensions import Literal, ParamSpec if TYPE_CHECKING: from . import BaseValidateHandlerProtocol, PydanticPluginProtocol, SchemaKind, SchemaTypePath @@ -27,7 +25,7 @@ def create_schema_validator( schema_kind: SchemaKind, config: CoreConfig | None = None, plugin_settings: dict[str, Any] | None = None, -) -> SchemaValidator | PluggableSchemaValidator: +) -> SchemaValidator: """Create a `SchemaValidator` or `PluggableSchemaValidator` if plugins are installed. Returns: @@ -46,7 +44,7 @@ def create_schema_validator( config, plugins, plugin_settings or {}, - ) + ) # type: ignore else: return SchemaValidator(schema, config) diff --git a/Backend/venv/lib/python3.12/site-packages/pydantic/root_model.py b/Backend/venv/lib/python3.12/site-packages/pydantic/root_model.py index 80a54201..2d856102 100644 --- a/Backend/venv/lib/python3.12/site-packages/pydantic/root_model.py +++ b/Backend/venv/lib/python3.12/site-packages/pydantic/root_model.py @@ -2,36 +2,31 @@ from __future__ import annotations as _annotations +import typing from copy import copy, deepcopy -from typing import TYPE_CHECKING, Any, Generic, Literal, TypeVar from pydantic_core import PydanticUndefined -from typing_extensions import Self, dataclass_transform from . import PydanticUserError -from ._internal import _model_construction, _repr +from ._internal import _repr from .main import BaseModel, _object_setattr -if TYPE_CHECKING: - from .fields import Field as PydanticModelField - from .fields import PrivateAttr as PydanticModelPrivateAttr +if typing.TYPE_CHECKING: + from typing import Any + + from typing_extensions import Literal + + Model = typing.TypeVar('Model', bound='BaseModel') - # dataclass_transform could be applied to RootModel directly, but `ModelMetaclass`'s dataclass_transform - # takes priority (at least with pyright). We trick type checkers into thinking we apply dataclass_transform - # on a new metaclass. - @dataclass_transform(kw_only_default=False, field_specifiers=(PydanticModelField, PydanticModelPrivateAttr)) - class _RootModelMetaclass(_model_construction.ModelMetaclass): ... -else: - _RootModelMetaclass = _model_construction.ModelMetaclass __all__ = ('RootModel',) -RootModelRootType = TypeVar('RootModelRootType') + +RootModelRootType = typing.TypeVar('RootModelRootType') -class RootModel(BaseModel, Generic[RootModelRootType], metaclass=_RootModelMetaclass): - """!!! abstract "Usage Documentation" - [`RootModel` and Custom Root Types](../concepts/models.md#rootmodel-and-custom-root-types) +class RootModel(BaseModel, typing.Generic[RootModelRootType]): + """Usage docs: https://docs.pydantic.dev/2.5/concepts/models/#rootmodel-and-custom-root-types A Pydantic `BaseModel` for the root object of the model. @@ -57,7 +52,7 @@ class RootModel(BaseModel, Generic[RootModelRootType], metaclass=_RootModelMetac ) super().__init_subclass__(**kwargs) - def __init__(self, /, root: RootModelRootType = PydanticUndefined, **data) -> None: # type: ignore + def __init__(__pydantic_self__, root: RootModelRootType = PydanticUndefined, **data) -> None: # type: ignore __tracebackhide__ = True if data: if root is not PydanticUndefined: @@ -65,12 +60,12 @@ class RootModel(BaseModel, Generic[RootModelRootType], metaclass=_RootModelMetac '"RootModel.__init__" accepts either a single positional argument or arbitrary keyword arguments' ) root = data # type: ignore - self.__pydantic_validator__.validate_python(root, self_instance=self) + __pydantic_self__.__pydantic_validator__.validate_python(root, self_instance=__pydantic_self__) - __init__.__pydantic_base_init__ = True # pyright: ignore[reportFunctionMemberAccess] + __init__.__pydantic_base_init__ = True @classmethod - def model_construct(cls, root: RootModelRootType, _fields_set: set[str] | None = None) -> Self: # type: ignore + def model_construct(cls: type[Model], root: RootModelRootType, _fields_set: set[str] | None = None) -> Model: """Create a new model using the provided root object and update fields set. Args: @@ -95,7 +90,7 @@ class RootModel(BaseModel, Generic[RootModelRootType], metaclass=_RootModelMetac _object_setattr(self, '__pydantic_fields_set__', state['__pydantic_fields_set__']) _object_setattr(self, '__dict__', state['__dict__']) - def __copy__(self) -> Self: + def __copy__(self: Model) -> Model: """Returns a shallow copy of the model.""" cls = type(self) m = cls.__new__(cls) @@ -103,7 +98,7 @@ class RootModel(BaseModel, Generic[RootModelRootType], metaclass=_RootModelMetac _object_setattr(m, '__pydantic_fields_set__', copy(self.__pydantic_fields_set__)) return m - def __deepcopy__(self, memo: dict[int, Any] | None = None) -> Self: + def __deepcopy__(self: Model, memo: dict[int, Any] | None = None) -> Model: """Returns a deep copy of the model.""" cls = type(self) m = cls.__new__(cls) @@ -113,43 +108,32 @@ class RootModel(BaseModel, Generic[RootModelRootType], metaclass=_RootModelMetac _object_setattr(m, '__pydantic_fields_set__', copy(self.__pydantic_fields_set__)) return m - if TYPE_CHECKING: + if typing.TYPE_CHECKING: - def model_dump( # type: ignore + def model_dump( self, *, mode: Literal['json', 'python'] | str = 'python', include: Any = None, exclude: Any = None, - context: dict[str, Any] | None = None, - by_alias: bool | None = None, + by_alias: bool = False, exclude_unset: bool = False, exclude_defaults: bool = False, exclude_none: bool = False, - exclude_computed_fields: bool = False, round_trip: bool = False, - warnings: bool | Literal['none', 'warn', 'error'] = True, - serialize_as_any: bool = False, - ) -> Any: + warnings: bool = True, + ) -> RootModelRootType: """This method is included just to get a more accurate return type for type checkers. It is included in this `if TYPE_CHECKING:` block since no override is actually necessary. See the documentation of `BaseModel.model_dump` for more details about the arguments. - - Generally, this method will have a return type of `RootModelRootType`, assuming that `RootModelRootType` is - not a `BaseModel` subclass. If `RootModelRootType` is a `BaseModel` subclass, then the return - type will likely be `dict[str, Any]`, as `model_dump` calls are recursive. The return type could - even be something different, in the case of a custom serializer. - Thus, `Any` is used here to catch all of these cases. """ ... def __eq__(self, other: Any) -> bool: if not isinstance(other, RootModel): return NotImplemented - return self.__pydantic_fields__['root'].annotation == other.__pydantic_fields__[ - 'root' - ].annotation and super().__eq__(other) + return self.model_fields['root'].annotation == other.model_fields['root'].annotation and super().__eq__(other) def __repr_args__(self) -> _repr.ReprArgs: yield 'root', self.root diff --git a/Backend/venv/lib/python3.12/site-packages/pydantic/schema.py b/Backend/venv/lib/python3.12/site-packages/pydantic/schema.py index a3245a61..e290aed9 100644 --- a/Backend/venv/lib/python3.12/site-packages/pydantic/schema.py +++ b/Backend/venv/lib/python3.12/site-packages/pydantic/schema.py @@ -1,5 +1,4 @@ """The `schema` module is a backport module from V1.""" - from ._migration import getattr_migration __getattr__ = getattr_migration(__name__) diff --git a/Backend/venv/lib/python3.12/site-packages/pydantic/tools.py b/Backend/venv/lib/python3.12/site-packages/pydantic/tools.py index fdc68c4f..8e317c92 100644 --- a/Backend/venv/lib/python3.12/site-packages/pydantic/tools.py +++ b/Backend/venv/lib/python3.12/site-packages/pydantic/tools.py @@ -1,5 +1,4 @@ """The `tools` module is a backport module from V1.""" - from ._migration import getattr_migration __getattr__ = getattr_migration(__name__) diff --git a/Backend/venv/lib/python3.12/site-packages/pydantic/type_adapter.py b/Backend/venv/lib/python3.12/site-packages/pydantic/type_adapter.py index 6f1a082e..2262c58f 100644 --- a/Backend/venv/lib/python3.12/site-packages/pydantic/type_adapter.py +++ b/Backend/venv/lib/python3.12/site-packages/pydantic/type_adapter.py @@ -1,31 +1,18 @@ """Type adapter specification.""" - from __future__ import annotations as _annotations import sys -import types -from collections.abc import Callable, Iterable from dataclasses import is_dataclass -from types import FrameType -from typing import ( - Any, - Generic, - Literal, - TypeVar, - cast, - final, - overload, -) +from typing import TYPE_CHECKING, Any, Dict, Generic, Iterable, Set, TypeVar, Union, cast, overload from pydantic_core import CoreSchema, SchemaSerializer, SchemaValidator, Some -from typing_extensions import ParamSpec, is_typeddict +from typing_extensions import Literal, is_typeddict from pydantic.errors import PydanticUserError -from pydantic.main import BaseModel, IncEx +from pydantic.main import BaseModel -from ._internal import _config, _generate_schema, _mock_val_ser, _namespace_utils, _repr, _typing_extra, _utils -from .config import ConfigDict, ExtraValues -from .errors import PydanticUndefinedAnnotation +from ._internal import _config, _generate_schema, _typing_extra +from .config import ConfigDict from .json_schema import ( DEFAULT_REF_TEMPLATE, GenerateJsonSchema, @@ -33,12 +20,67 @@ from .json_schema import ( JsonSchemaMode, JsonSchemaValue, ) -from .plugin._schema_validator import PluggableSchemaValidator, create_schema_validator +from .plugin._schema_validator import create_schema_validator T = TypeVar('T') -R = TypeVar('R') -P = ParamSpec('P') -TypeAdapterT = TypeVar('TypeAdapterT', bound='TypeAdapter') + +if TYPE_CHECKING: + # should be `set[int] | set[str] | dict[int, IncEx] | dict[str, IncEx] | None`, but mypy can't cope + IncEx = Union[Set[int], Set[str], Dict[int, Any], Dict[str, Any]] + + +def _get_schema(type_: Any, config_wrapper: _config.ConfigWrapper, parent_depth: int) -> CoreSchema: + """`BaseModel` uses its own `__module__` to find out where it was defined + and then look for symbols to resolve forward references in those globals. + On the other hand this function can be called with arbitrary objects, + including type aliases where `__module__` (always `typing.py`) is not useful. + So instead we look at the globals in our parent stack frame. + + This works for the case where this function is called in a module that + has the target of forward references in its scope, but + does not work for more complex cases. + + For example, take the following: + + a.py + ```python + from typing import Dict, List + + IntList = List[int] + OuterDict = Dict[str, 'IntList'] + ``` + + b.py + ```python test="skip" + from a import OuterDict + + from pydantic import TypeAdapter + + IntList = int # replaces the symbol the forward reference is looking for + v = TypeAdapter(OuterDict) + v({'x': 1}) # should fail but doesn't + ``` + + If OuterDict were a `BaseModel`, this would work because it would resolve + the forward reference within the `a.py` namespace. + But `TypeAdapter(OuterDict)` + can't know what module OuterDict came from. + + In other words, the assumption that _all_ forward references exist in the + module we are being called from is not technically always true. + Although most of the time it is and it works fine for recursive models and such, + `BaseModel`'s behavior isn't perfect either and _can_ break in similar ways, + so there is no right or wrong between the two. + + But at the very least this behavior is _subtly_ different from `BaseModel`'s. + """ + local_ns = _typing_extra.parent_frame_namespace(parent_depth=parent_depth) + global_ns = sys._getframe(max(parent_depth - 1, 1)).f_globals.copy() + global_ns.update(local_ns or {}) + gen = _generate_schema.GenerateSchema(config_wrapper, types_namespace=global_ns, typevars_map={}) + schema = gen.generate_schema(type_) + schema = gen.clean_schema(schema) + return schema def _getattr_no_parents(obj: Any, attribute: str) -> Any: @@ -56,152 +98,85 @@ def _getattr_no_parents(obj: Any, attribute: str) -> Any: raise AttributeError(attribute) -def _type_has_config(type_: Any) -> bool: - """Returns whether the type has config.""" - type_ = _typing_extra.annotated_type(type_) or type_ - try: - return issubclass(type_, BaseModel) or is_dataclass(type_) or is_typeddict(type_) - except TypeError: - # type is not a class - return False - - -@final class TypeAdapter(Generic[T]): - """!!! abstract "Usage Documentation" - [`TypeAdapter`](../concepts/type_adapter.md) - - Type adapters provide a flexible way to perform validation and serialization based on a Python type. + """Type adapters provide a flexible way to perform validation and serialization based on a Python type. A `TypeAdapter` instance exposes some of the functionality from `BaseModel` instance methods for types that do not have such methods (such as dataclasses, primitive types, and more). - **Note:** `TypeAdapter` instances are not types, and cannot be used as type annotations for fields. - - Args: - type: The type associated with the `TypeAdapter`. - config: Configuration for the `TypeAdapter`, should be a dictionary conforming to - [`ConfigDict`][pydantic.config.ConfigDict]. - - !!! note - You cannot provide a configuration when instantiating a `TypeAdapter` if the type you're using - has its own config that cannot be overridden (ex: `BaseModel`, `TypedDict`, and `dataclass`). A - [`type-adapter-config-unused`](../errors/usage_errors.md#type-adapter-config-unused) error will - be raised in this case. - _parent_depth: Depth at which to search for the [parent frame][frame-objects]. This frame is used when - resolving forward annotations during schema building, by looking for the globals and locals of this - frame. Defaults to 2, which will result in the frame where the `TypeAdapter` was instantiated. - - !!! note - This parameter is named with an underscore to suggest its private nature and discourage use. - It may be deprecated in a minor version, so we only recommend using it if you're comfortable - with potential change in behavior/support. It's default value is 2 because internally, - the `TypeAdapter` class makes another call to fetch the frame. - module: The module that passes to plugin if provided. + Note that `TypeAdapter` is not an actual type, so you cannot use it in type annotations. Attributes: core_schema: The core schema for the type. - validator: The schema validator for the type. + validator (SchemaValidator): The schema validator for the type. serializer: The schema serializer for the type. - pydantic_complete: Whether the core schema for the type is successfully built. - - ??? tip "Compatibility with `mypy`" - Depending on the type used, `mypy` might raise an error when instantiating a `TypeAdapter`. As a workaround, you can explicitly - annotate your variable: - - ```py - from typing import Union - - from pydantic import TypeAdapter - - ta: TypeAdapter[Union[str, int]] = TypeAdapter(Union[str, int]) # type: ignore[arg-type] - ``` - - ??? info "Namespace management nuances and implementation details" - - Here, we collect some notes on namespace management, and subtle differences from `BaseModel`: - - `BaseModel` uses its own `__module__` to find out where it was defined - and then looks for symbols to resolve forward references in those globals. - On the other hand, `TypeAdapter` can be initialized with arbitrary objects, - which may not be types and thus do not have a `__module__` available. - So instead we look at the globals in our parent stack frame. - - It is expected that the `ns_resolver` passed to this function will have the correct - namespace for the type we're adapting. See the source code for `TypeAdapter.__init__` - and `TypeAdapter.rebuild` for various ways to construct this namespace. - - This works for the case where this function is called in a module that - has the target of forward references in its scope, but - does not always work for more complex cases. - - For example, take the following: - - ```python {title="a.py"} - IntList = list[int] - OuterDict = dict[str, 'IntList'] - ``` - - ```python {test="skip" title="b.py"} - from a import OuterDict - - from pydantic import TypeAdapter - - IntList = int # replaces the symbol the forward reference is looking for - v = TypeAdapter(OuterDict) - v({'x': 1}) # should fail but doesn't - ``` - - If `OuterDict` were a `BaseModel`, this would work because it would resolve - the forward reference within the `a.py` namespace. - But `TypeAdapter(OuterDict)` can't determine what module `OuterDict` came from. - - In other words, the assumption that _all_ forward references exist in the - module we are being called from is not technically always true. - Although most of the time it is and it works fine for recursive models and such, - `BaseModel`'s behavior isn't perfect either and _can_ break in similar ways, - so there is no right or wrong between the two. - - But at the very least this behavior is _subtly_ different from `BaseModel`'s. """ - core_schema: CoreSchema - validator: SchemaValidator | PluggableSchemaValidator - serializer: SchemaSerializer - pydantic_complete: bool + if TYPE_CHECKING: - @overload - def __init__( - self, - type: type[T], - *, - config: ConfigDict | None = ..., - _parent_depth: int = ..., - module: str | None = ..., - ) -> None: ... + @overload + def __new__(cls, __type: type[T], *, config: ConfigDict | None = ...) -> TypeAdapter[T]: + ... - # This second overload is for unsupported special forms (such as Annotated, Union, etc.) - # Currently there is no way to type this correctly - # See https://github.com/python/typing/pull/1618 - @overload - def __init__( - self, - type: Any, - *, - config: ConfigDict | None = ..., - _parent_depth: int = ..., - module: str | None = ..., - ) -> None: ... + # this overload is for non-type things like Union[int, str] + # Pyright currently handles this "correctly", but MyPy understands this as TypeAdapter[object] + # so an explicit type cast is needed + @overload + def __new__(cls, __type: T, *, config: ConfigDict | None = ...) -> TypeAdapter[T]: + ... + + def __new__(cls, __type: Any, *, config: ConfigDict | None = None) -> TypeAdapter[T]: + """A class representing the type adapter.""" + raise NotImplementedError + + @overload + def __init__( + self, type: type[T], *, config: ConfigDict | None = None, _parent_depth: int = 2, module: str | None = None + ) -> None: + ... + + # this overload is for non-type things like Union[int, str] + # Pyright currently handles this "correctly", but MyPy understands this as TypeAdapter[object] + # so an explicit type cast is needed + @overload + def __init__( + self, type: T, *, config: ConfigDict | None = None, _parent_depth: int = 2, module: str | None = None + ) -> None: + ... def __init__( - self, - type: Any, - *, - config: ConfigDict | None = None, - _parent_depth: int = 2, - module: str | None = None, + self, type: Any, *, config: ConfigDict | None = None, _parent_depth: int = 2, module: str | None = None ) -> None: - if _type_has_config(type) and config is not None: + """Initializes the TypeAdapter object. + + Args: + type: The type associated with the `TypeAdapter`. + config: Configuration for the `TypeAdapter`, should be a dictionary conforming to [`ConfigDict`][pydantic.config.ConfigDict]. + _parent_depth: depth at which to search the parent namespace to construct the local namespace. + module: The module that passes to plugin if provided. + + !!! note + You cannot use the `config` argument when instantiating a `TypeAdapter` if the type you're using has its own + config that cannot be overridden (ex: `BaseModel`, `TypedDict`, and `dataclass`). A + [`type-adapter-config-unused`](../errors/usage_errors.md#type-adapter-config-unused) error will be raised in this case. + + !!! note + The `_parent_depth` argument is named with an underscore to suggest its private nature and discourage use. + It may be deprecated in a minor version, so we only recommend using it if you're + comfortable with potential change in behavior / support. + + Returns: + A type adapter configured for the specified `type`. + """ + config_wrapper = _config.ConfigWrapper(config) + + try: + type_has_config = issubclass(type, BaseModel) or is_dataclass(type) or is_typeddict(type) + except TypeError: + # type is not a class + type_has_config = False + + if type_has_config and config is not None: raise PydanticUserError( 'Cannot use `config` when the type is a BaseModel, dataclass or TypedDict.' ' These types can have their own config and setting the config via the `config`' @@ -210,220 +185,49 @@ class TypeAdapter(Generic[T]): code='type-adapter-config-unused', ) - self._type = type - self._config = config - self._parent_depth = _parent_depth - self.pydantic_complete = False - - parent_frame = self._fetch_parent_frame() - if isinstance(type, types.FunctionType): - # Special case functions, which are *not* pushed to the `NsResolver` stack and without this special case - # would only have access to the parent namespace where the `TypeAdapter` was instantiated (if the function is defined - # in another module, we need to look at that module's globals). - if parent_frame is not None: - # `f_locals` is the namespace where the type adapter was instantiated (~ to `f_globals` if at the module level): - parent_ns = parent_frame.f_locals - else: # pragma: no cover - parent_ns = None - globalns, localns = _namespace_utils.ns_for_function( - type, - parent_namespace=parent_ns, - ) - parent_namespace = None - else: - if parent_frame is not None: - globalns = parent_frame.f_globals - # Do not provide a local ns if the type adapter happens to be instantiated at the module level: - localns = parent_frame.f_locals if parent_frame.f_locals is not globalns else {} - else: # pragma: no cover - globalns = {} - localns = {} - parent_namespace = localns - - self._module_name = module or cast(str, globalns.get('__name__', '')) - self._init_core_attrs( - ns_resolver=_namespace_utils.NsResolver( - namespaces_tuple=_namespace_utils.NamespacesTuple(locals=localns, globals=globalns), - parent_namespace=parent_namespace, - ), - force=False, - ) - - def _fetch_parent_frame(self) -> FrameType | None: - frame = sys._getframe(self._parent_depth) - if frame.f_globals.get('__name__') == 'typing': - # Because `TypeAdapter` is generic, explicitly parametrizing the class results - # in a `typing._GenericAlias` instance, which proxies instantiation calls to the - # "real" `TypeAdapter` class and thus adding an extra frame to the call. To avoid - # pulling anything from the `typing` module, use the correct frame (the one before): - return frame.f_back - - return frame - - def _init_core_attrs( - self, ns_resolver: _namespace_utils.NsResolver, force: bool, raise_errors: bool = False - ) -> bool: - """Initialize the core schema, validator, and serializer for the type. - - Args: - ns_resolver: The namespace resolver to use when building the core schema for the adapted type. - force: Whether to force the construction of the core schema, validator, and serializer. - If `force` is set to `False` and `_defer_build` is `True`, the core schema, validator, and serializer will be set to mocks. - raise_errors: Whether to raise errors if initializing any of the core attrs fails. - - Returns: - `True` if the core schema, validator, and serializer were successfully initialized, otherwise `False`. - - Raises: - PydanticUndefinedAnnotation: If `PydanticUndefinedAnnotation` occurs in`__get_pydantic_core_schema__` - and `raise_errors=True`. - """ - if not force and self._defer_build: - _mock_val_ser.set_type_adapter_mocks(self) - self.pydantic_complete = False - return False - + core_schema: CoreSchema try: - self.core_schema = _getattr_no_parents(self._type, '__pydantic_core_schema__') - self.validator = _getattr_no_parents(self._type, '__pydantic_validator__') - self.serializer = _getattr_no_parents(self._type, '__pydantic_serializer__') - - # TODO: we don't go through the rebuild logic here directly because we don't want - # to repeat all of the namespace fetching logic that we've already done - # so we simply skip to the block below that does the actual schema generation - if ( - isinstance(self.core_schema, _mock_val_ser.MockCoreSchema) - or isinstance(self.validator, _mock_val_ser.MockValSer) - or isinstance(self.serializer, _mock_val_ser.MockValSer) - ): - raise AttributeError() + core_schema = _getattr_no_parents(type, '__pydantic_core_schema__') except AttributeError: - config_wrapper = _config.ConfigWrapper(self._config) + core_schema = _get_schema(type, config_wrapper, parent_depth=_parent_depth + 1) - schema_generator = _generate_schema.GenerateSchema(config_wrapper, ns_resolver=ns_resolver) + core_config = config_wrapper.core_config(None) + validator: SchemaValidator + try: + validator = _getattr_no_parents(type, '__pydantic_validator__') + except AttributeError: + if module is None: + f = sys._getframe(1) + module = cast(str, f.f_globals['__name__']) + validator = create_schema_validator( + core_schema, type, module, str(type), 'TypeAdapter', core_config, config_wrapper.plugin_settings + ) # type: ignore - try: - core_schema = schema_generator.generate_schema(self._type) - except PydanticUndefinedAnnotation: - if raise_errors: - raise - _mock_val_ser.set_type_adapter_mocks(self) - return False + serializer: SchemaSerializer + try: + serializer = _getattr_no_parents(type, '__pydantic_serializer__') + except AttributeError: + serializer = SchemaSerializer(core_schema, core_config) - try: - self.core_schema = schema_generator.clean_schema(core_schema) - except _generate_schema.InvalidSchemaError: - _mock_val_ser.set_type_adapter_mocks(self) - return False - - core_config = config_wrapper.core_config(None) - - self.validator = create_schema_validator( - schema=self.core_schema, - schema_type=self._type, - schema_type_module=self._module_name, - schema_type_name=str(self._type), - schema_kind='TypeAdapter', - config=core_config, - plugin_settings=config_wrapper.plugin_settings, - ) - self.serializer = SchemaSerializer(self.core_schema, core_config) - - self.pydantic_complete = True - return True - - @property - def _defer_build(self) -> bool: - config = self._config if self._config is not None else self._model_config - if config: - return config.get('defer_build') is True - return False - - @property - def _model_config(self) -> ConfigDict | None: - type_: Any = _typing_extra.annotated_type(self._type) or self._type # Eg FastAPI heavily uses Annotated - if _utils.lenient_issubclass(type_, BaseModel): - return type_.model_config - return getattr(type_, '__pydantic_config__', None) - - def __repr__(self) -> str: - return f'TypeAdapter({_repr.display_as_type(self._type)})' - - def rebuild( - self, - *, - force: bool = False, - raise_errors: bool = True, - _parent_namespace_depth: int = 2, - _types_namespace: _namespace_utils.MappingNamespace | None = None, - ) -> bool | None: - """Try to rebuild the pydantic-core schema for the adapter's type. - - This may be necessary when one of the annotations is a ForwardRef which could not be resolved during - the initial attempt to build the schema, and automatic rebuilding fails. - - Args: - force: Whether to force the rebuilding of the type adapter's schema, defaults to `False`. - raise_errors: Whether to raise errors, defaults to `True`. - _parent_namespace_depth: Depth at which to search for the [parent frame][frame-objects]. This - frame is used when resolving forward annotations during schema rebuilding, by looking for - the locals of this frame. Defaults to 2, which will result in the frame where the method - was called. - _types_namespace: An explicit types namespace to use, instead of using the local namespace - from the parent frame. Defaults to `None`. - - Returns: - Returns `None` if the schema is already "complete" and rebuilding was not required. - If rebuilding _was_ required, returns `True` if rebuilding was successful, otherwise `False`. - """ - if not force and self.pydantic_complete: - return None - - if _types_namespace is not None: - rebuild_ns = _types_namespace - elif _parent_namespace_depth > 0: - rebuild_ns = _typing_extra.parent_frame_namespace(parent_depth=_parent_namespace_depth, force=True) or {} - else: - rebuild_ns = {} - - # we have to manually fetch globals here because there's no type on the stack of the NsResolver - # and so we skip the globalns = get_module_ns_of(typ) call that would normally happen - globalns = sys._getframe(max(_parent_namespace_depth - 1, 1)).f_globals - ns_resolver = _namespace_utils.NsResolver( - namespaces_tuple=_namespace_utils.NamespacesTuple(locals=rebuild_ns, globals=globalns), - parent_namespace=rebuild_ns, - ) - return self._init_core_attrs(ns_resolver=ns_resolver, force=True, raise_errors=raise_errors) + self.core_schema = core_schema + self.validator = validator + self.serializer = serializer def validate_python( self, - object: Any, - /, + __object: Any, *, strict: bool | None = None, - extra: ExtraValues | None = None, from_attributes: bool | None = None, - context: Any | None = None, - experimental_allow_partial: bool | Literal['off', 'on', 'trailing-strings'] = False, - by_alias: bool | None = None, - by_name: bool | None = None, + context: dict[str, Any] | None = None, ) -> T: """Validate a Python object against the model. Args: - object: The Python object to validate against the model. + __object: The Python object to validate against the model. strict: Whether to strictly check types. - extra: Whether to ignore, allow, or forbid extra data during model validation. - See the [`extra` configuration value][pydantic.ConfigDict.extra] for details. from_attributes: Whether to extract data from object attributes. context: Additional context to pass to the validator. - experimental_allow_partial: **Experimental** whether to enable - [partial validation](../concepts/experimental.md#partial-validation), e.g. to process streams. - * False / 'off': Default behavior, no partial validation. - * True / 'on': Enable partial validation. - * 'trailing-strings': Enable partial validation and allow trailing strings in the input. - by_alias: Whether to use the field's alias when validating against the provided input data. - by_name: Whether to use the field's name when validating against the provided input data. !!! note When using `TypeAdapter` with a Pydantic `dataclass`, the use of the `from_attributes` @@ -432,121 +236,39 @@ class TypeAdapter(Generic[T]): Returns: The validated object. """ - if by_alias is False and by_name is not True: - raise PydanticUserError( - 'At least one of `by_alias` or `by_name` must be set to True.', - code='validate-by-alias-and-name-false', - ) - - return self.validator.validate_python( - object, - strict=strict, - extra=extra, - from_attributes=from_attributes, - context=context, - allow_partial=experimental_allow_partial, - by_alias=by_alias, - by_name=by_name, - ) + return self.validator.validate_python(__object, strict=strict, from_attributes=from_attributes, context=context) def validate_json( - self, - data: str | bytes | bytearray, - /, - *, - strict: bool | None = None, - extra: ExtraValues | None = None, - context: Any | None = None, - experimental_allow_partial: bool | Literal['off', 'on', 'trailing-strings'] = False, - by_alias: bool | None = None, - by_name: bool | None = None, + self, __data: str | bytes, *, strict: bool | None = None, context: dict[str, Any] | None = None ) -> T: - """!!! abstract "Usage Documentation" - [JSON Parsing](../concepts/json.md#json-parsing) + """Usage docs: https://docs.pydantic.dev/2.5/concepts/json/#json-parsing Validate a JSON string or bytes against the model. Args: - data: The JSON data to validate against the model. + __data: The JSON data to validate against the model. strict: Whether to strictly check types. - extra: Whether to ignore, allow, or forbid extra data during model validation. - See the [`extra` configuration value][pydantic.ConfigDict.extra] for details. context: Additional context to use during validation. - experimental_allow_partial: **Experimental** whether to enable - [partial validation](../concepts/experimental.md#partial-validation), e.g. to process streams. - * False / 'off': Default behavior, no partial validation. - * True / 'on': Enable partial validation. - * 'trailing-strings': Enable partial validation and allow trailing strings in the input. - by_alias: Whether to use the field's alias when validating against the provided input data. - by_name: Whether to use the field's name when validating against the provided input data. Returns: The validated object. """ - if by_alias is False and by_name is not True: - raise PydanticUserError( - 'At least one of `by_alias` or `by_name` must be set to True.', - code='validate-by-alias-and-name-false', - ) + return self.validator.validate_json(__data, strict=strict, context=context) - return self.validator.validate_json( - data, - strict=strict, - extra=extra, - context=context, - allow_partial=experimental_allow_partial, - by_alias=by_alias, - by_name=by_name, - ) - - def validate_strings( - self, - obj: Any, - /, - *, - strict: bool | None = None, - extra: ExtraValues | None = None, - context: Any | None = None, - experimental_allow_partial: bool | Literal['off', 'on', 'trailing-strings'] = False, - by_alias: bool | None = None, - by_name: bool | None = None, - ) -> T: + def validate_strings(self, __obj: Any, *, strict: bool | None = None, context: dict[str, Any] | None = None) -> T: """Validate object contains string data against the model. Args: - obj: The object contains string data to validate. + __obj: The object contains string data to validate. strict: Whether to strictly check types. - extra: Whether to ignore, allow, or forbid extra data during model validation. - See the [`extra` configuration value][pydantic.ConfigDict.extra] for details. context: Additional context to use during validation. - experimental_allow_partial: **Experimental** whether to enable - [partial validation](../concepts/experimental.md#partial-validation), e.g. to process streams. - * False / 'off': Default behavior, no partial validation. - * True / 'on': Enable partial validation. - * 'trailing-strings': Enable partial validation and allow trailing strings in the input. - by_alias: Whether to use the field's alias when validating against the provided input data. - by_name: Whether to use the field's name when validating against the provided input data. Returns: The validated object. """ - if by_alias is False and by_name is not True: - raise PydanticUserError( - 'At least one of `by_alias` or `by_name` must be set to True.', - code='validate-by-alias-and-name-false', - ) + return self.validator.validate_strings(__obj, strict=strict, context=context) - return self.validator.validate_strings( - obj, - strict=strict, - extra=extra, - context=context, - allow_partial=experimental_allow_partial, - by_alias=by_alias, - by_name=by_name, - ) - - def get_default_value(self, *, strict: bool | None = None, context: Any | None = None) -> Some[T] | None: + def get_default_value(self, *, strict: bool | None = None, context: dict[str, Any] | None = None) -> Some[T] | None: """Get the default value for the wrapped type. Args: @@ -560,27 +282,22 @@ class TypeAdapter(Generic[T]): def dump_python( self, - instance: T, - /, + __instance: T, *, mode: Literal['json', 'python'] = 'python', include: IncEx | None = None, exclude: IncEx | None = None, - by_alias: bool | None = None, + by_alias: bool = False, exclude_unset: bool = False, exclude_defaults: bool = False, exclude_none: bool = False, - exclude_computed_fields: bool = False, round_trip: bool = False, - warnings: bool | Literal['none', 'warn', 'error'] = True, - fallback: Callable[[Any], Any] | None = None, - serialize_as_any: bool = False, - context: Any | None = None, + warnings: bool = True, ) -> Any: """Dump an instance of the adapted type to a Python object. Args: - instance: The Python object to serialize. + __instance: The Python object to serialize. mode: The output format. include: Fields to include in the output. exclude: Fields to exclude from the output. @@ -588,22 +305,14 @@ class TypeAdapter(Generic[T]): exclude_unset: Whether to exclude unset fields. exclude_defaults: Whether to exclude fields with default values. exclude_none: Whether to exclude fields with None values. - exclude_computed_fields: Whether to exclude computed fields. - While this can be useful for round-tripping, it is usually recommended to use the dedicated - `round_trip` parameter instead. round_trip: Whether to output the serialized data in a way that is compatible with deserialization. - warnings: How to handle serialization errors. False/"none" ignores them, True/"warn" logs errors, - "error" raises a [`PydanticSerializationError`][pydantic_core.PydanticSerializationError]. - fallback: A function to call when an unknown value is encountered. If not provided, - a [`PydanticSerializationError`][pydantic_core.PydanticSerializationError] error is raised. - serialize_as_any: Whether to serialize fields with duck-typing serialization behavior. - context: Additional context to pass to the serializer. + warnings: Whether to display serialization warnings. Returns: The serialized object. """ return self.serializer.to_python( - instance, + __instance, mode=mode, by_alias=by_alias, include=include, @@ -611,80 +320,54 @@ class TypeAdapter(Generic[T]): exclude_unset=exclude_unset, exclude_defaults=exclude_defaults, exclude_none=exclude_none, - exclude_computed_fields=exclude_computed_fields, round_trip=round_trip, warnings=warnings, - fallback=fallback, - serialize_as_any=serialize_as_any, - context=context, ) def dump_json( self, - instance: T, - /, + __instance: T, *, indent: int | None = None, - ensure_ascii: bool = False, include: IncEx | None = None, exclude: IncEx | None = None, - by_alias: bool | None = None, + by_alias: bool = False, exclude_unset: bool = False, exclude_defaults: bool = False, exclude_none: bool = False, - exclude_computed_fields: bool = False, round_trip: bool = False, - warnings: bool | Literal['none', 'warn', 'error'] = True, - fallback: Callable[[Any], Any] | None = None, - serialize_as_any: bool = False, - context: Any | None = None, + warnings: bool = True, ) -> bytes: - """!!! abstract "Usage Documentation" - [JSON Serialization](../concepts/json.md#json-serialization) + """Usage docs: https://docs.pydantic.dev/2.5/concepts/json/#json-serialization Serialize an instance of the adapted type to JSON. Args: - instance: The instance to be serialized. + __instance: The instance to be serialized. indent: Number of spaces for JSON indentation. - ensure_ascii: If `True`, the output is guaranteed to have all incoming non-ASCII characters escaped. - If `False` (the default), these characters will be output as-is. include: Fields to include. exclude: Fields to exclude. by_alias: Whether to use alias names for field names. exclude_unset: Whether to exclude unset fields. exclude_defaults: Whether to exclude fields with default values. exclude_none: Whether to exclude fields with a value of `None`. - exclude_computed_fields: Whether to exclude computed fields. - While this can be useful for round-tripping, it is usually recommended to use the dedicated - `round_trip` parameter instead. round_trip: Whether to serialize and deserialize the instance to ensure round-tripping. - warnings: How to handle serialization errors. False/"none" ignores them, True/"warn" logs errors, - "error" raises a [`PydanticSerializationError`][pydantic_core.PydanticSerializationError]. - fallback: A function to call when an unknown value is encountered. If not provided, - a [`PydanticSerializationError`][pydantic_core.PydanticSerializationError] error is raised. - serialize_as_any: Whether to serialize fields with duck-typing serialization behavior. - context: Additional context to pass to the serializer. + warnings: Whether to emit serialization warnings. Returns: The JSON representation of the given instance as bytes. """ return self.serializer.to_json( - instance, + __instance, indent=indent, - ensure_ascii=ensure_ascii, include=include, exclude=exclude, by_alias=by_alias, exclude_unset=exclude_unset, exclude_defaults=exclude_defaults, exclude_none=exclude_none, - exclude_computed_fields=exclude_computed_fields, round_trip=round_trip, warnings=warnings, - fallback=fallback, - serialize_as_any=serialize_as_any, - context=context, ) def json_schema( @@ -692,7 +375,6 @@ class TypeAdapter(Generic[T]): *, by_alias: bool = True, ref_template: str = DEFAULT_REF_TEMPLATE, - union_format: Literal['any_of', 'primitive_type_array'] = 'any_of', schema_generator: type[GenerateJsonSchema] = GenerateJsonSchema, mode: JsonSchemaMode = 'validation', ) -> dict[str, Any]: @@ -701,61 +383,35 @@ class TypeAdapter(Generic[T]): Args: by_alias: Whether to use alias names for field names. ref_template: The format string used for generating $ref strings. - union_format: The format to use when combining schemas from unions together. Can be one of: - - - `'any_of'`: Use the [`anyOf`](https://json-schema.org/understanding-json-schema/reference/combining#anyOf) - keyword to combine schemas (the default). - - `'primitive_type_array'`: Use the [`type`](https://json-schema.org/understanding-json-schema/reference/type) - keyword as an array of strings, containing each type of the combination. If any of the schemas is not a primitive - type (`string`, `boolean`, `null`, `integer` or `number`) or contains constraints/metadata, falls back to - `any_of`. - schema_generator: To override the logic used to generate the JSON schema, as a subclass of - `GenerateJsonSchema` with your desired modifications - mode: The mode in which to generate the schema. schema_generator: The generator class used for creating the schema. mode: The mode to use for schema generation. Returns: The JSON schema for the model as a dictionary. """ - schema_generator_instance = schema_generator( - by_alias=by_alias, ref_template=ref_template, union_format=union_format - ) - if isinstance(self.core_schema, _mock_val_ser.MockCoreSchema): - self.core_schema.rebuild() - assert not isinstance(self.core_schema, _mock_val_ser.MockCoreSchema), 'this is a bug! please report it' + schema_generator_instance = schema_generator(by_alias=by_alias, ref_template=ref_template) return schema_generator_instance.generate(self.core_schema, mode=mode) @staticmethod def json_schemas( - inputs: Iterable[tuple[JsonSchemaKeyT, JsonSchemaMode, TypeAdapter[Any]]], - /, + __inputs: Iterable[tuple[JsonSchemaKeyT, JsonSchemaMode, TypeAdapter[Any]]], *, by_alias: bool = True, title: str | None = None, description: str | None = None, ref_template: str = DEFAULT_REF_TEMPLATE, - union_format: Literal['any_of', 'primitive_type_array'] = 'any_of', schema_generator: type[GenerateJsonSchema] = GenerateJsonSchema, ) -> tuple[dict[tuple[JsonSchemaKeyT, JsonSchemaMode], JsonSchemaValue], JsonSchemaValue]: """Generate a JSON schema including definitions from multiple type adapters. Args: - inputs: Inputs to schema generation. The first two items will form the keys of the (first) + __inputs: Inputs to schema generation. The first two items will form the keys of the (first) output mapping; the type adapters will provide the core schemas that get converted into definitions in the output JSON schema. by_alias: Whether to use alias names. title: The title for the schema. description: The description for the schema. ref_template: The format string used for generating $ref strings. - union_format: The format to use when combining schemas from unions together. Can be one of: - - - `'any_of'`: Use the [`anyOf`](https://json-schema.org/understanding-json-schema/reference/combining#anyOf) - keyword to combine schemas (the default). - - `'primitive_type_array'`: Use the [`type`](https://json-schema.org/understanding-json-schema/reference/type) - keyword as an array of strings, containing each type of the combination. If any of the schemas is not a primitive - type (`string`, `boolean`, `null`, `integer` or `number`) or contains constraints/metadata, falls back to - `any_of`. schema_generator: The generator class used for creating the schema. Returns: @@ -768,21 +424,11 @@ class TypeAdapter(Generic[T]): element, along with the optional title and description keys. """ - schema_generator_instance = schema_generator( - by_alias=by_alias, ref_template=ref_template, union_format=union_format - ) + schema_generator_instance = schema_generator(by_alias=by_alias, ref_template=ref_template) - inputs_ = [] - for key, mode, adapter in inputs: - # This is the same pattern we follow for model json schemas - we attempt a core schema rebuild if we detect a mock - if isinstance(adapter.core_schema, _mock_val_ser.MockCoreSchema): - adapter.core_schema.rebuild() - assert not isinstance(adapter.core_schema, _mock_val_ser.MockCoreSchema), ( - 'this is a bug! please report it' - ) - inputs_.append((key, mode, adapter.core_schema)) + inputs = [(key, mode, adapter.core_schema) for key, mode, adapter in __inputs] - json_schemas_map, definitions = schema_generator_instance.generate_definitions(inputs_) + json_schemas_map, definitions = schema_generator_instance.generate_definitions(inputs) json_schema: dict[str, Any] = {} if definitions: diff --git a/Backend/venv/lib/python3.12/site-packages/pydantic/types.py b/Backend/venv/lib/python3.12/site-packages/pydantic/types.py index 59160ab7..095d55b4 100644 --- a/Backend/venv/lib/python3.12/site-packages/pydantic/types.py +++ b/Backend/venv/lib/python3.12/site-packages/pydantic/types.py @@ -1,25 +1,26 @@ """The types module contains custom types used by pydantic.""" - from __future__ import annotations as _annotations import base64 import dataclasses as _dataclasses import re -from collections.abc import Hashable, Iterator from datetime import date, datetime from decimal import Decimal from enum import Enum from pathlib import Path -from re import Pattern from types import ModuleType from typing import ( TYPE_CHECKING, - Annotated, Any, Callable, ClassVar, + Dict, + FrozenSet, Generic, - Literal, + Hashable, + Iterator, + List, + Set, TypeVar, Union, cast, @@ -28,24 +29,26 @@ from uuid import UUID import annotated_types from annotated_types import BaseMetadata, MaxLen, MinLen -from pydantic_core import CoreSchema, PydanticCustomError, SchemaSerializer, core_schema -from typing_extensions import Protocol, TypeAlias, TypeAliasType, deprecated, get_args, get_origin -from typing_inspection.introspection import is_union_origin +from pydantic_core import CoreSchema, PydanticCustomError, core_schema +from typing_extensions import Annotated, Literal, Protocol, TypeAlias, TypeAliasType, deprecated -from ._internal import _fields, _internal_dataclass, _utils, _validators +from ._internal import ( + _core_utils, + _fields, + _internal_dataclass, + _typing_extra, + _utils, + _validators, +) from ._migration import getattr_migration from .annotated_handlers import GetCoreSchemaHandler, GetJsonSchemaHandler from .errors import PydanticUserError from .json_schema import JsonSchemaValue from .warnings import PydanticDeprecatedSince20 -if TYPE_CHECKING: - from ._internal._core_metadata import CoreMetadata - __all__ = ( 'Strict', 'StrictStr', - 'SocketPath', 'conbytes', 'conlist', 'conset', @@ -68,14 +71,10 @@ __all__ = ( 'UUID3', 'UUID4', 'UUID5', - 'UUID6', - 'UUID7', - 'UUID8', 'FilePath', 'DirectoryPath', 'NewPath', 'Json', - 'Secret', 'SecretStr', 'SecretBytes', 'StrictBool', @@ -105,28 +104,21 @@ __all__ = ( 'Tag', 'Discriminator', 'JsonValue', - 'OnErrorOmit', - 'FailFast', ) -T = TypeVar('T') - - @_dataclasses.dataclass class Strict(_fields.PydanticMetadata, BaseMetadata): - """!!! abstract "Usage Documentation" - [Strict Mode with `Annotated` `Strict`](../concepts/strict_mode.md#strict-mode-with-annotated-strict) + """Usage docs: https://docs.pydantic.dev/2.5/concepts/strict_mode/#strict-mode-with-annotated-strict A field metadata class to indicate that a field should be validated in strict mode. - Use this class as an annotation via [`Annotated`](https://docs.python.org/3/library/typing.html#typing.Annotated), as seen below. Attributes: strict: Whether to validate the field in strict mode. Example: ```python - from typing import Annotated + from typing_extensions import Annotated from pydantic.types import Strict @@ -168,7 +160,7 @@ def conint( The reason is that `conint` returns a type, which doesn't play well with static analysis tools. === ":x: Don't do this" - ```python + ```py from pydantic import BaseModel, conint class Foo(BaseModel): @@ -176,8 +168,8 @@ def conint( ``` === ":white_check_mark: Do this" - ```python - from typing import Annotated + ```py + from typing_extensions import Annotated from pydantic import BaseModel, Field @@ -198,7 +190,7 @@ def conint( Returns: The wrapped integer type. - ```python + ```py from pydantic import BaseModel, ValidationError, conint class ConstrainedExample(BaseModel): @@ -227,7 +219,7 @@ def conint( ``` """ # noqa: D212 - return Annotated[ # pyright: ignore[reportReturnType] + return Annotated[ int, Strict(strict) if strict is not None else None, annotated_types.Interval(gt=gt, ge=ge, lt=lt, le=le), @@ -238,7 +230,7 @@ def conint( PositiveInt = Annotated[int, annotated_types.Gt(0)] """An integer that must be greater than zero. -```python +```py from pydantic import BaseModel, PositiveInt, ValidationError class Model(BaseModel): @@ -269,7 +261,7 @@ except ValidationError as e: NegativeInt = Annotated[int, annotated_types.Lt(0)] """An integer that must be less than zero. -```python +```py from pydantic import BaseModel, NegativeInt, ValidationError class Model(BaseModel): @@ -300,7 +292,7 @@ except ValidationError as e: NonPositiveInt = Annotated[int, annotated_types.Le(0)] """An integer that must be less than or equal to zero. -```python +```py from pydantic import BaseModel, NonPositiveInt, ValidationError class Model(BaseModel): @@ -331,7 +323,7 @@ except ValidationError as e: NonNegativeInt = Annotated[int, annotated_types.Ge(0)] """An integer that must be greater than or equal to zero. -```python +```py from pydantic import BaseModel, NonNegativeInt, ValidationError class Model(BaseModel): @@ -362,7 +354,7 @@ except ValidationError as e: StrictInt = Annotated[int, Strict()] """An integer that must be validated in strict mode. -```python +```py from pydantic import BaseModel, StrictInt, ValidationError class StrictIntModel(BaseModel): @@ -385,22 +377,7 @@ except ValidationError as e: @_dataclasses.dataclass class AllowInfNan(_fields.PydanticMetadata): - """A field metadata class to indicate that a field should allow `-inf`, `inf`, and `nan`. - - Use this class as an annotation via [`Annotated`](https://docs.python.org/3/library/typing.html#typing.Annotated), as seen below. - - Attributes: - allow_inf_nan: Whether to allow `-inf`, `inf`, and `nan`. Defaults to `True`. - - Example: - ```python - from typing import Annotated - - from pydantic.types import AllowInfNan - - LaxFloat = Annotated[float, AllowInfNan()] - ``` - """ + """A field metadata class to indicate that a field should allow ``-inf``, ``inf``, and ``nan``.""" allow_inf_nan: bool = True @@ -429,7 +406,7 @@ def confloat( The reason is that `confloat` returns a type, which doesn't play well with static analysis tools. === ":x: Don't do this" - ```python + ```py from pydantic import BaseModel, confloat class Foo(BaseModel): @@ -437,8 +414,8 @@ def confloat( ``` === ":white_check_mark: Do this" - ```python - from typing import Annotated + ```py + from typing_extensions import Annotated from pydantic import BaseModel, Field @@ -460,7 +437,7 @@ def confloat( Returns: The wrapped float type. - ```python + ```py from pydantic import BaseModel, ValidationError, confloat class ConstrainedExample(BaseModel): @@ -488,7 +465,7 @@ def confloat( ''' ``` """ # noqa: D212 - return Annotated[ # pyright: ignore[reportReturnType] + return Annotated[ float, Strict(strict) if strict is not None else None, annotated_types.Interval(gt=gt, ge=ge, lt=lt, le=le), @@ -500,7 +477,7 @@ def confloat( PositiveFloat = Annotated[float, annotated_types.Gt(0)] """A float that must be greater than zero. -```python +```py from pydantic import BaseModel, PositiveFloat, ValidationError class Model(BaseModel): @@ -531,7 +508,7 @@ except ValidationError as e: NegativeFloat = Annotated[float, annotated_types.Lt(0)] """A float that must be less than zero. -```python +```py from pydantic import BaseModel, NegativeFloat, ValidationError class Model(BaseModel): @@ -562,7 +539,7 @@ except ValidationError as e: NonPositiveFloat = Annotated[float, annotated_types.Le(0)] """A float that must be less than or equal to zero. -```python +```py from pydantic import BaseModel, NonPositiveFloat, ValidationError class Model(BaseModel): @@ -593,7 +570,7 @@ except ValidationError as e: NonNegativeFloat = Annotated[float, annotated_types.Ge(0)] """A float that must be greater than or equal to zero. -```python +```py from pydantic import BaseModel, NonNegativeFloat, ValidationError class Model(BaseModel): @@ -624,7 +601,7 @@ except ValidationError as e: StrictFloat = Annotated[float, Strict(True)] """A float that must be validated in strict mode. -```python +```py from pydantic import BaseModel, StrictFloat, ValidationError class StrictFloatModel(BaseModel): @@ -644,7 +621,7 @@ except ValidationError as e: FiniteFloat = Annotated[float, AllowInfNan(False)] """A float that must be finite (not ``-inf``, ``inf``, or ``nan``). -```python +```py from pydantic import BaseModel, FiniteFloat class Model(BaseModel): @@ -676,7 +653,7 @@ def conbytes( Returns: The wrapped bytes type. """ - return Annotated[ # pyright: ignore[reportReturnType] + return Annotated[ bytes, Strict(strict) if strict is not None else None, annotated_types.Len(min_length or 0, max_length), @@ -692,29 +669,18 @@ StrictBytes = Annotated[bytes, Strict()] @_dataclasses.dataclass(frozen=True) class StringConstraints(annotated_types.GroupedMetadata): - """!!! abstract "Usage Documentation" - [String types](./standard_library_types.md#strings) + """Usage docs: https://docs.pydantic.dev/2.5/concepts/fields/#string-constraints - A field metadata class to apply constraints to `str` types. - Use this class as an annotation via [`Annotated`](https://docs.python.org/3/library/typing.html#typing.Annotated), as seen below. + Apply constraints to `str` types. Attributes: - strip_whitespace: Whether to remove leading and trailing whitespace. + strip_whitespace: Whether to strip whitespace from the string. to_upper: Whether to convert the string to uppercase. to_lower: Whether to convert the string to lowercase. strict: Whether to validate the string in strict mode. min_length: The minimum length of the string. max_length: The maximum length of the string. pattern: A regex pattern that the string must match. - - Example: - ```python - from typing import Annotated - - from pydantic.types import StringConstraints - - ConstrainedStr = Annotated[str, StringConstraints(min_length=1, max_length=10)] - ``` """ strip_whitespace: bool | None = None @@ -723,7 +689,7 @@ class StringConstraints(annotated_types.GroupedMetadata): strict: bool | None = None min_length: int | None = None max_length: int | None = None - pattern: str | Pattern[str] | None = None + pattern: str | None = None def __iter__(self) -> Iterator[BaseMetadata]: if self.min_length is not None: @@ -731,7 +697,7 @@ class StringConstraints(annotated_types.GroupedMetadata): if self.max_length is not None: yield MaxLen(self.max_length) if self.strict is not None: - yield Strict(self.strict) + yield Strict() if ( self.strip_whitespace is not None or self.pattern is not None @@ -754,7 +720,7 @@ def constr( strict: bool | None = None, min_length: int | None = None, max_length: int | None = None, - pattern: str | Pattern[str] | None = None, + pattern: str | None = None, ) -> type[str]: """ !!! warning "Discouraged" @@ -767,7 +733,7 @@ def constr( The reason is that `constr` returns a type, which doesn't play well with static analysis tools. === ":x: Don't do this" - ```python + ```py from pydantic import BaseModel, constr class Foo(BaseModel): @@ -775,27 +741,23 @@ def constr( ``` === ":white_check_mark: Do this" - ```python - from typing import Annotated + ```py + from typing_extensions import Annotated from pydantic import BaseModel, StringConstraints class Foo(BaseModel): - bar: Annotated[ - str, - StringConstraints( - strip_whitespace=True, to_upper=True, pattern=r'^[A-Z]+$' - ), - ] + bar: Annotated[str, StringConstraints(strip_whitespace=True, to_upper=True, pattern=r'^[A-Z]+$')] ``` A wrapper around `str` that allows for additional constraints. - ```python + ```py from pydantic import BaseModel, constr class Foo(BaseModel): - bar: constr(strip_whitespace=True, to_upper=True) + bar: constr(strip_whitespace=True, to_upper=True, pattern=r'^[A-Z]+$') + foo = Foo(bar=' hello ') print(foo) @@ -814,7 +776,7 @@ def constr( Returns: The wrapped string type. """ # noqa: D212 - return Annotated[ # pyright: ignore[reportReturnType] + return Annotated[ str, StringConstraints( strip_whitespace=strip_whitespace, @@ -849,7 +811,7 @@ def conset( Returns: The wrapped set type. """ - return Annotated[set[item_type], annotated_types.Len(min_length or 0, max_length)] # pyright: ignore[reportReturnType] + return Annotated[Set[item_type], annotated_types.Len(min_length or 0, max_length)] def confrozenset( @@ -865,7 +827,7 @@ def confrozenset( Returns: The wrapped frozenset type. """ - return Annotated[frozenset[item_type], annotated_types.Len(min_length or 0, max_length)] # pyright: ignore[reportReturnType] + return Annotated[FrozenSet[item_type], annotated_types.Len(min_length or 0, max_length)] AnyItemType = TypeVar('AnyItemType') @@ -878,7 +840,7 @@ def conlist( max_length: int | None = None, unique_items: bool | None = None, ) -> type[list[AnyItemType]]: - """A wrapper around [`list`][] that adds validation. + """A wrapper around typing.List that adds validation. Args: item_type: The type of the items in the list. @@ -900,7 +862,7 @@ def conlist( ), code='removed-kwargs', ) - return Annotated[list[item_type], annotated_types.Len(min_length or 0, max_length)] # pyright: ignore[reportReturnType] + return Annotated[List[item_type], annotated_types.Len(min_length or 0, max_length)] # ~~~~~~~~~~~~~~~~~~~~~~~~~~ IMPORT STRING TYPE ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ @@ -911,24 +873,31 @@ if TYPE_CHECKING: else: class ImportString: - """A type that can be used to import a Python object from a string. + """A type that can be used to import a type from a string. `ImportString` expects a string and loads the Python object importable at that dotted path. - Attributes of modules may be separated from the module by `:` or `.`, e.g. if `'math:cos'` is provided, - the resulting field value would be the function `cos`. If a `.` is used and both an attribute and submodule + Attributes of modules may be separated from the module by `:` or `.`, e.g. if `'math:cos'` was provided, + the resulting field value would be the function`cos`. If a `.` is used and both an attribute and submodule are present at the same path, the module will be preferred. On model instantiation, pointers will be evaluated and imported. There is some nuance to this behavior, demonstrated in the examples below. - ```python - import math + > A known limitation: setting a default value to a string + > won't result in validation (thus evaluation). This is actively + > being worked on. + + **Good behavior:** + ```py + from math import cos + + from pydantic import BaseModel, ImportString, ValidationError - from pydantic import BaseModel, Field, ImportString, ValidationError class ImportThings(BaseModel): obj: ImportString + # A string value will cause an automatic import my_cos = ImportThings(obj='math.cos') @@ -936,6 +905,7 @@ else: cos_of_0 = my_cos.obj(0) assert cos_of_0 == 1 + # A string whose value cannot be imported will raise an error try: ImportThings(obj='foo.bar') @@ -944,45 +914,28 @@ else: ''' 1 validation error for ImportThings obj - Invalid python path: No module named 'foo.bar' [type=import_error, input_value='foo.bar', input_type=str] + Invalid python path: No module named 'foo.bar' [type=import_error, input_value='foo.bar', input_type=str] ''' + # Actual python objects can be assigned as well - my_cos = ImportThings(obj=math.cos) + my_cos = ImportThings(obj=cos) my_cos_2 = ImportThings(obj='math.cos') - my_cos_3 = ImportThings(obj='math:cos') - assert my_cos == my_cos_2 == my_cos_3 - - # You can set default field value either as Python object: - class ImportThingsDefaultPyObj(BaseModel): - obj: ImportString = math.cos - - # or as a string value (but only if used with `validate_default=True`) - class ImportThingsDefaultString(BaseModel): - obj: ImportString = Field(default='math.cos', validate_default=True) - - my_cos_default1 = ImportThingsDefaultPyObj() - my_cos_default2 = ImportThingsDefaultString() - assert my_cos_default1.obj == my_cos_default2.obj == math.cos - - # note: this will not work! - class ImportThingsMissingValidateDefault(BaseModel): - obj: ImportString = 'math.cos' - - my_cos_default3 = ImportThingsMissingValidateDefault() - assert my_cos_default3.obj == 'math.cos' # just string, not evaluated + assert my_cos == my_cos_2 ``` Serializing an `ImportString` type to json is also possible. - ```python + ```py from pydantic import BaseModel, ImportString + class ImportThings(BaseModel): obj: ImportString + # Create an instance - m = ImportThings(obj='math.cos') + m = ImportThings(obj='math:cos') print(m) #> obj= print(m.model_dump_json()) @@ -1009,26 +962,14 @@ else: function=_validators.import_string, schema=handler(source), serialization=serializer ) - @classmethod - def __get_pydantic_json_schema__(cls, cs: CoreSchema, handler: GetJsonSchemaHandler) -> JsonSchemaValue: - return handler(core_schema.str_schema()) - @staticmethod def _serialize(v: Any) -> str: if isinstance(v, ModuleType): return v.__name__ elif hasattr(v, '__module__') and hasattr(v, '__name__'): return f'{v.__module__}.{v.__name__}' - # Handle special cases for sys.XXX streams - # if we see more of these, we should consider a more general solution - elif hasattr(v, 'name'): - if v.name == '': - return 'sys.stdout' - elif v.name == '': - return 'sys.stdin' - elif v.name == '': - return 'sys.stderr' - return v + else: + return v def __repr__(self) -> str: return 'ImportString' @@ -1060,7 +1001,7 @@ def condecimal( The reason is that `condecimal` returns a type, which doesn't play well with static analysis tools. === ":x: Don't do this" - ```python + ```py from pydantic import BaseModel, condecimal class Foo(BaseModel): @@ -1068,9 +1009,10 @@ def condecimal( ``` === ":white_check_mark: Do this" - ```python + ```py from decimal import Decimal - from typing import Annotated + + from typing_extensions import Annotated from pydantic import BaseModel, Field @@ -1091,7 +1033,7 @@ def condecimal( decimal_places: The number of decimal places. Defaults to `None`. allow_inf_nan: Whether to allow infinity and NaN. Defaults to `None`. - ```python + ```py from decimal import Decimal from pydantic import BaseModel, ValidationError, condecimal @@ -1121,7 +1063,7 @@ def condecimal( ''' ``` """ # noqa: D212 - return Annotated[ # pyright: ignore[reportReturnType] + return Annotated[ Decimal, Strict(strict) if strict is not None else None, annotated_types.Interval(gt=gt, ge=ge, lt=lt, le=le), @@ -1136,25 +1078,9 @@ def condecimal( @_dataclasses.dataclass(**_internal_dataclass.slots_true) class UuidVersion: - """A field metadata class to indicate a [UUID](https://docs.python.org/3/library/uuid.html) version. + """A field metadata class to indicate a [UUID](https://docs.python.org/3/library/uuid.html) version.""" - Use this class as an annotation via [`Annotated`](https://docs.python.org/3/library/typing.html#typing.Annotated), as seen below. - - Attributes: - uuid_version: The version of the UUID. Must be one of 1, 3, 4, 5, 6, 7 or 8. - - Example: - ```python - from typing import Annotated - from uuid import UUID - - from pydantic.types import UuidVersion - - UUID1 = Annotated[UUID, UuidVersion(1)] - ``` - """ - - uuid_version: Literal[1, 3, 4, 5, 6, 7, 8] + uuid_version: Literal[1, 3, 4, 5] def __get_pydantic_json_schema__( self, core_schema: core_schema.CoreSchema, handler: GetJsonSchemaHandler @@ -1165,10 +1091,15 @@ class UuidVersion: return field_schema def __get_pydantic_core_schema__(self, source: Any, handler: GetCoreSchemaHandler) -> core_schema.CoreSchema: - schema = handler(source) - _check_annotated_type(schema['type'], 'uuid', self.__class__.__name__) - schema['version'] = self.uuid_version # type: ignore - return schema + if isinstance(self, source): + # used directly as a type + return core_schema.uuid_schema(version=self.uuid_version) + else: + # update existing schema with self.uuid_version + schema = handler(source) + _check_annotated_type(schema['type'], 'uuid', self.__class__.__name__) + schema['version'] = self.uuid_version # type: ignore + return schema def __hash__(self) -> int: return hash(type(self.uuid_version)) @@ -1177,7 +1108,7 @@ class UuidVersion: UUID1 = Annotated[UUID, UuidVersion(1)] """A [UUID](https://docs.python.org/3/library/uuid.html) that must be version 1. -```python +```py import uuid from pydantic import UUID1, BaseModel @@ -1191,7 +1122,7 @@ Model(uuid1=uuid.uuid1()) UUID3 = Annotated[UUID, UuidVersion(3)] """A [UUID](https://docs.python.org/3/library/uuid.html) that must be version 3. -```python +```py import uuid from pydantic import UUID3, BaseModel @@ -1205,7 +1136,7 @@ Model(uuid3=uuid.uuid3(uuid.NAMESPACE_DNS, 'pydantic.org')) UUID4 = Annotated[UUID, UuidVersion(4)] """A [UUID](https://docs.python.org/3/library/uuid.html) that must be version 4. -```python +```py import uuid from pydantic import UUID4, BaseModel @@ -1219,7 +1150,7 @@ Model(uuid4=uuid.uuid4()) UUID5 = Annotated[UUID, UuidVersion(5)] """A [UUID](https://docs.python.org/3/library/uuid.html) that must be version 5. -```python +```py import uuid from pydantic import UUID5, BaseModel @@ -1230,55 +1161,14 @@ class Model(BaseModel): Model(uuid5=uuid.uuid5(uuid.NAMESPACE_DNS, 'pydantic.org')) ``` """ -UUID6 = Annotated[UUID, UuidVersion(6)] -"""A [UUID](https://docs.python.org/3/library/uuid.html) that must be version 6. -```python -import uuid - -from pydantic import UUID6, BaseModel - -class Model(BaseModel): - uuid6: UUID6 - -Model(uuid6=uuid.UUID('1efea953-c2d6-6790-aa0a-69db8c87df97')) -``` -""" -UUID7 = Annotated[UUID, UuidVersion(7)] -"""A [UUID](https://docs.python.org/3/library/uuid.html) that must be version 7. - -```python -import uuid - -from pydantic import UUID7, BaseModel - -class Model(BaseModel): - uuid7: UUID7 - -Model(uuid7=uuid.UUID('0194fdcb-1c47-7a09-b52c-561154de0b4a')) -``` -""" -UUID8 = Annotated[UUID, UuidVersion(8)] -"""A [UUID](https://docs.python.org/3/library/uuid.html) that must be version 8. - -```python -import uuid - -from pydantic import UUID8, BaseModel - -class Model(BaseModel): - uuid8: UUID8 - -Model(uuid8=uuid.UUID('81a0b92e-6078-8551-9c81-8ccb666bdab8')) -``` -""" # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ PATH TYPES ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ @_dataclasses.dataclass class PathType: - path_type: Literal['file', 'dir', 'new', 'socket'] + path_type: Literal['file', 'dir', 'new'] def __get_pydantic_json_schema__( self, core_schema: core_schema.CoreSchema, handler: GetJsonSchemaHandler @@ -1293,7 +1183,6 @@ class PathType: 'file': cast(core_schema.WithInfoValidatorFunction, self.validate_file), 'dir': cast(core_schema.WithInfoValidatorFunction, self.validate_directory), 'new': cast(core_schema.WithInfoValidatorFunction, self.validate_new), - 'socket': cast(core_schema.WithInfoValidatorFunction, self.validate_socket), } return core_schema.with_info_after_validator_function( @@ -1308,13 +1197,6 @@ class PathType: else: raise PydanticCustomError('path_not_file', 'Path does not point to a file') - @staticmethod - def validate_socket(path: Path, _: core_schema.ValidationInfo) -> Path: - if path.is_socket(): - return path - else: - raise PydanticCustomError('path_not_socket', 'Path does not point to a socket') - @staticmethod def validate_directory(path: Path, _: core_schema.ValidationInfo) -> Path: if path.is_dir(): @@ -1338,7 +1220,7 @@ class PathType: FilePath = Annotated[Path, PathType('file')] """A path that must point to a file. -```python +```py from pathlib import Path from pydantic import BaseModel, FilePath, ValidationError @@ -1380,7 +1262,7 @@ except ValidationError as e: DirectoryPath = Annotated[Path, PathType('dir')] """A path that must point to a directory. -```python +```py from pathlib import Path from pydantic import BaseModel, DirectoryPath, ValidationError @@ -1420,16 +1302,13 @@ except ValidationError as e: ``` """ NewPath = Annotated[Path, PathType('new')] -"""A path for a new file or directory that must not already exist. The parent directory must already exist.""" +"""A path for a new file or directory that must not already exist.""" -SocketPath = Annotated[Path, PathType('socket')] -"""A path to an existing socket file""" # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ JSON TYPE ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if TYPE_CHECKING: - # Json[list[str]] will be recognized by type checkers as list[str] - Json = Annotated[AnyType, ...] + Json = Annotated[AnyType, ...] # Json[list[str]] will be recognized by type checkers as list[str] else: @@ -1439,16 +1318,19 @@ else: You can use the `Json` data type to make Pydantic first load a raw JSON string before validating the loaded data into the parametrized type: - ```python - from typing import Any + ```py + from typing import Any, List from pydantic import BaseModel, Json, ValidationError + class AnyJsonModel(BaseModel): json_obj: Json[Any] + class ConstrainedJsonModel(BaseModel): - json_obj: Json[list[int]] + json_obj: Json[List[int]] + print(AnyJsonModel(json_obj='{"b": 1}')) #> json_obj={'b': 1} @@ -1462,7 +1344,7 @@ else: ''' 1 validation error for ConstrainedJsonModel json_obj - JSON input should be string, bytes or bytearray [type=json_type, input_value=12, input_type=int] + JSON input should be string, bytes or bytearray [type=json_type, input_value=12, input_type=int] ''' try: @@ -1472,7 +1354,7 @@ else: ''' 1 validation error for ConstrainedJsonModel json_obj - Invalid JSON: expected value at line 1 column 2 [type=json_invalid, input_value='[a, b]', input_type=str] + Invalid JSON: expected value at line 1 column 2 [type=json_invalid, input_value='[a, b]', input_type=str] ''' try: @@ -1482,20 +1364,24 @@ else: ''' 2 validation errors for ConstrainedJsonModel json_obj.0 - Input should be a valid integer, unable to parse string as an integer [type=int_parsing, input_value='a', input_type=str] + Input should be a valid integer, unable to parse string as an integer [type=int_parsing, input_value='a', input_type=str] json_obj.1 - Input should be a valid integer, unable to parse string as an integer [type=int_parsing, input_value='b', input_type=str] + Input should be a valid integer, unable to parse string as an integer [type=int_parsing, input_value='b', input_type=str] ''' ``` When you dump the model using `model_dump` or `model_dump_json`, the dumped value will be the result of validation, not the original JSON string. However, you can use the argument `round_trip=True` to get the original JSON string back: - ```python + ```py + from typing import List + from pydantic import BaseModel, Json + class ConstrainedJsonModel(BaseModel): - json_obj: Json[list[int]] + json_obj: Json[List[int]] + print(ConstrainedJsonModel(json_obj='[1, 2, 3]').model_dump_json()) #> {"json_obj":[1,2,3]} @@ -1524,16 +1410,15 @@ else: return hash(type(self)) def __eq__(self, other: Any) -> bool: - return type(other) is type(self) + return type(other) == type(self) # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ SECRET TYPES ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -# The `Secret` class being conceptually immutable, make the type variable covariant: -SecretType = TypeVar('SecretType', covariant=True) +SecretType = TypeVar('SecretType', str, bytes) -class _SecretBase(Generic[SecretType]): +class _SecretField(Generic[SecretType]): def __init__(self, secret_value: SecretType) -> None: self._secret_value: SecretType = secret_value @@ -1551,206 +1436,41 @@ class _SecretBase(Generic[SecretType]): def __hash__(self) -> int: return hash(self.get_secret_value()) + def __len__(self) -> int: + return len(self._secret_value) + def __str__(self) -> str: return str(self._display()) def __repr__(self) -> str: return f'{self.__class__.__name__}({self._display()!r})' - def _display(self) -> str | bytes: + def _display(self) -> SecretType: raise NotImplementedError - -def _serialize_secret(value: Secret[SecretType], info: core_schema.SerializationInfo) -> str | Secret[SecretType]: - if info.mode == 'json': - return str(value) - else: - return value - - -class Secret(_SecretBase[SecretType]): - """A generic base class used for defining a field with sensitive information that you do not want to be visible in logging or tracebacks. - - You may either directly parametrize `Secret` with a type, or subclass from `Secret` with a parametrized type. The benefit of subclassing - is that you can define a custom `_display` method, which will be used for `repr()` and `str()` methods. The examples below demonstrate both - ways of using `Secret` to create a new secret type. - - 1. Directly parametrizing `Secret` with a type: - - ```python - from pydantic import BaseModel, Secret - - SecretBool = Secret[bool] - - class Model(BaseModel): - secret_bool: SecretBool - - m = Model(secret_bool=True) - print(m.model_dump()) - #> {'secret_bool': Secret('**********')} - - print(m.model_dump_json()) - #> {"secret_bool":"**********"} - - print(m.secret_bool.get_secret_value()) - #> True - ``` - - 2. Subclassing from parametrized `Secret`: - - ```python - from datetime import date - - from pydantic import BaseModel, Secret - - class SecretDate(Secret[date]): - def _display(self) -> str: - return '****/**/**' - - class Model(BaseModel): - secret_date: SecretDate - - m = Model(secret_date=date(2022, 1, 1)) - print(m.model_dump()) - #> {'secret_date': SecretDate('****/**/**')} - - print(m.model_dump_json()) - #> {"secret_date":"****/**/**"} - - print(m.secret_date.get_secret_value()) - #> 2022-01-01 - ``` - - The value returned by the `_display` method will be used for `repr()` and `str()`. - - You can enforce constraints on the underlying type through annotations: - For example: - - ```python - from typing import Annotated - - from pydantic import BaseModel, Field, Secret, ValidationError - - SecretPosInt = Secret[Annotated[int, Field(gt=0, strict=True)]] - - class Model(BaseModel): - sensitive_int: SecretPosInt - - m = Model(sensitive_int=42) - print(m.model_dump()) - #> {'sensitive_int': Secret('**********')} - - try: - m = Model(sensitive_int=-42) # (1)! - except ValidationError as exc_info: - print(exc_info.errors(include_url=False, include_input=False)) - ''' - [ - { - 'type': 'greater_than', - 'loc': ('sensitive_int',), - 'msg': 'Input should be greater than 0', - 'ctx': {'gt': 0}, - } - ] - ''' - - try: - m = Model(sensitive_int='42') # (2)! - except ValidationError as exc_info: - print(exc_info.errors(include_url=False, include_input=False)) - ''' - [ - { - 'type': 'int_type', - 'loc': ('sensitive_int',), - 'msg': 'Input should be a valid integer', - } - ] - ''' - ``` - - 1. The input value is not greater than 0, so it raises a validation error. - 2. The input value is not an integer, so it raises a validation error because the `SecretPosInt` type has strict mode enabled. - """ - - def _display(self) -> str | bytes: - return '**********' if self.get_secret_value() else '' - @classmethod def __get_pydantic_core_schema__(cls, source: type[Any], handler: GetCoreSchemaHandler) -> core_schema.CoreSchema: - inner_type = None - # if origin_type is Secret, then cls is a GenericAlias, and we can extract the inner type directly - origin_type = get_origin(source) - if origin_type is not None: - inner_type = get_args(source)[0] - # otherwise, we need to get the inner type from the base class + if issubclass(source, SecretStr): + field_type = str + inner_schema = core_schema.str_schema() else: - bases = getattr(cls, '__orig_bases__', getattr(cls, '__bases__', [])) - for base in bases: - if get_origin(base) is Secret: - inner_type = get_args(base)[0] - if bases == [] or inner_type is None: - raise TypeError( - f"Can't get secret type from {cls.__name__}. " - 'Please use Secret[], or subclass from Secret[] instead.' - ) + assert issubclass(source, SecretBytes) + field_type = bytes + inner_schema = core_schema.bytes_schema() + error_kind = 'string_type' if field_type is str else 'bytes_type' - inner_schema = handler.generate_schema(inner_type) # type: ignore + def serialize( + value: _SecretField[SecretType], info: core_schema.SerializationInfo + ) -> str | _SecretField[SecretType]: + if info.mode == 'json': + # we want the output to always be string without the `b'` prefix for bytes, + # hence we just use `secret_display` + return _secret_display(value.get_secret_value()) + else: + return value - def validate_secret_value(value, handler) -> Secret[SecretType]: - if isinstance(value, Secret): - value = value.get_secret_value() - validated_inner = handler(value) - return cls(validated_inner) - - return core_schema.json_or_python_schema( - python_schema=core_schema.no_info_wrap_validator_function( - validate_secret_value, - inner_schema, - ), - json_schema=core_schema.no_info_after_validator_function(lambda x: cls(x), inner_schema), - serialization=core_schema.plain_serializer_function_ser_schema( - _serialize_secret, - info_arg=True, - when_used='always', - ), - ) - - __pydantic_serializer__ = SchemaSerializer( - core_schema.any_schema( - serialization=core_schema.plain_serializer_function_ser_schema( - _serialize_secret, - info_arg=True, - when_used='always', - ) - ) - ) - - -def _secret_display(value: SecretType) -> str: # type: ignore - return '**********' if value else '' - - -def _serialize_secret_field( - value: _SecretField[SecretType], info: core_schema.SerializationInfo -) -> str | _SecretField[SecretType]: - if info.mode == 'json': - # we want the output to always be string without the `b'` prefix for bytes, - # hence we just use `secret_display` - return _secret_display(value.get_secret_value()) - else: - return value - - -class _SecretField(_SecretBase[SecretType]): - _inner_schema: ClassVar[CoreSchema] - _error_kind: ClassVar[str] - - @classmethod - def __get_pydantic_core_schema__(cls, source: type[Any], handler: GetCoreSchemaHandler) -> core_schema.CoreSchema: def get_json_schema(_core_schema: core_schema.CoreSchema, handler: GetJsonSchemaHandler) -> JsonSchemaValue: - json_schema = handler(cls._inner_schema) + json_schema = handler(inner_schema) _utils.update_not_none( json_schema, type='string', @@ -1759,52 +1479,41 @@ class _SecretField(_SecretBase[SecretType]): ) return json_schema - def get_secret_schema(strict: bool) -> CoreSchema: - inner_schema = {**cls._inner_schema, 'strict': strict} - json_schema = core_schema.no_info_after_validator_function( - source, # construct the type - inner_schema, # pyright: ignore[reportArgumentType] - ) - return core_schema.json_or_python_schema( - python_schema=core_schema.union_schema( - [ - core_schema.is_instance_schema(source), - json_schema, - ], - custom_error_type=cls._error_kind, - ), - json_schema=json_schema, - serialization=core_schema.plain_serializer_function_ser_schema( - _serialize_secret_field, - info_arg=True, - when_used='always', - ), - ) - - return core_schema.lax_or_strict_schema( - lax_schema=get_secret_schema(strict=False), - strict_schema=get_secret_schema(strict=True), - metadata={'pydantic_js_functions': [get_json_schema]}, + json_schema = core_schema.no_info_after_validator_function( + source, # construct the type + inner_schema, ) - - __pydantic_serializer__ = SchemaSerializer( - core_schema.any_schema( + s = core_schema.json_or_python_schema( + python_schema=core_schema.union_schema( + [ + core_schema.is_instance_schema(source), + json_schema, + ], + strict=True, + custom_error_type=error_kind, + ), + json_schema=json_schema, serialization=core_schema.plain_serializer_function_ser_schema( - _serialize_secret_field, + serialize, info_arg=True, - when_used='always', - ) + return_schema=core_schema.str_schema(), + when_used='json', + ), ) - ) + s.setdefault('metadata', {}).setdefault('pydantic_js_functions', []).append(get_json_schema) + return s + + +def _secret_display(value: str | bytes) -> str: + return '**********' if value else '' class SecretStr(_SecretField[str]): """A string used for storing sensitive information that you do not want to be visible in logging or tracebacks. - When the secret value is nonempty, it is displayed as `'**********'` instead of the underlying value in - calls to `repr()` and `str()`. If the value _is_ empty, it is displayed as `''`. + It displays `'**********'` instead of the string value on `repr()` and `str()` calls. - ```python + ```py from pydantic import BaseModel, SecretStr class User(BaseModel): @@ -1817,62 +1526,19 @@ class SecretStr(_SecretField[str]): #> username='scolvin' password=SecretStr('**********') print(user.password.get_secret_value()) #> password1 - print((SecretStr('password'), SecretStr(''))) - #> (SecretStr('**********'), SecretStr('')) - ``` - - As seen above, by default, [`SecretStr`][pydantic.types.SecretStr] (and [`SecretBytes`][pydantic.types.SecretBytes]) - will be serialized as `**********` when serializing to json. - - You can use the [`field_serializer`][pydantic.functional_serializers.field_serializer] to dump the - secret as plain-text when serializing to json. - - ```python - from pydantic import BaseModel, SecretBytes, SecretStr, field_serializer - - class Model(BaseModel): - password: SecretStr - password_bytes: SecretBytes - - @field_serializer('password', 'password_bytes', when_used='json') - def dump_secret(self, v): - return v.get_secret_value() - - model = Model(password='IAmSensitive', password_bytes=b'IAmSensitiveBytes') - print(model) - #> password=SecretStr('**********') password_bytes=SecretBytes(b'**********') - print(model.password) - #> ********** - print(model.model_dump()) - ''' - { - 'password': SecretStr('**********'), - 'password_bytes': SecretBytes(b'**********'), - } - ''' - print(model.model_dump_json()) - #> {"password":"IAmSensitive","password_bytes":"IAmSensitiveBytes"} ``` """ - _inner_schema: ClassVar[CoreSchema] = core_schema.str_schema() - _error_kind: ClassVar[str] = 'string_type' - - def __len__(self) -> int: - return len(self._secret_value) - def _display(self) -> str: - return _secret_display(self._secret_value) + return _secret_display(self.get_secret_value()) class SecretBytes(_SecretField[bytes]): """A bytes used for storing sensitive information that you do not want to be visible in logging or tracebacks. It displays `b'**********'` instead of the string value on `repr()` and `str()` calls. - When the secret value is nonempty, it is displayed as `b'**********'` instead of the underlying value in - calls to `repr()` and `str()`. If the value _is_ empty, it is displayed as `b''`. - ```python + ```py from pydantic import BaseModel, SecretBytes class User(BaseModel): @@ -1883,19 +1549,11 @@ class SecretBytes(_SecretField[bytes]): #> username='scolvin' password=SecretBytes(b'**********') print(user.password.get_secret_value()) #> b'password1' - print((SecretBytes(b'password'), SecretBytes(b''))) - #> (SecretBytes(b'**********'), SecretBytes(b'')) ``` """ - _inner_schema: ClassVar[CoreSchema] = core_schema.bytes_schema() - _error_kind: ClassVar[str] = 'bytes_type' - - def __len__(self) -> int: - return len(self._secret_value) - def _display(self) -> bytes: - return _secret_display(self._secret_value).encode() + return _secret_display(self.get_secret_value()).encode() # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ PAYMENT CARD TYPES ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ @@ -1945,9 +1603,9 @@ class PaymentCardNumber(str): ) @classmethod - def validate(cls, input_value: str, /, _: core_schema.ValidationInfo) -> PaymentCardNumber: + def validate(cls, __input_value: str, _: core_schema.ValidationInfo) -> PaymentCardNumber: """Validate the card number and return a `PaymentCardNumber` instance.""" - return cls(input_value) + return cls(__input_value) @property def masked(self) -> str: @@ -2021,6 +1679,24 @@ class PaymentCardNumber(str): # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ BYTE SIZE TYPE ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +BYTE_SIZES = { + 'b': 1, + 'kb': 10**3, + 'mb': 10**6, + 'gb': 10**9, + 'tb': 10**12, + 'pb': 10**15, + 'eb': 10**18, + 'kib': 2**10, + 'mib': 2**20, + 'gib': 2**30, + 'tib': 2**40, + 'pib': 2**50, + 'eib': 2**60, +} +BYTE_SIZES.update({k.lower()[0]: v for k, v in BYTE_SIZES.items() if 'i' not in k}) +byte_string_re = re.compile(r'^\s*(\d*\.?\d+)\s*(\w+)?', re.IGNORECASE) + class ByteSize(int): """Converts a string representing a number of bytes with units (such as `'1KB'` or `'11.5MiB'`) into an integer. @@ -2035,7 +1711,7 @@ class ByteSize(int): !!! info Note that `1b` will be parsed as "1 byte" and not "1 bit". - ```python + ```py from pydantic import BaseModel, ByteSize class MyModel(BaseModel): @@ -2051,72 +1727,24 @@ class ByteSize(int): #> 44.4PiB print(m.size.human_readable(decimal=True)) #> 50.0PB - print(m.size.human_readable(separator=' ')) - #> 44.4 PiB print(m.size.to('TiB')) #> 45474.73508864641 ``` """ - byte_sizes = { - 'b': 1, - 'kb': 10**3, - 'mb': 10**6, - 'gb': 10**9, - 'tb': 10**12, - 'pb': 10**15, - 'eb': 10**18, - 'kib': 2**10, - 'mib': 2**20, - 'gib': 2**30, - 'tib': 2**40, - 'pib': 2**50, - 'eib': 2**60, - 'bit': 1 / 8, - 'kbit': 10**3 / 8, - 'mbit': 10**6 / 8, - 'gbit': 10**9 / 8, - 'tbit': 10**12 / 8, - 'pbit': 10**15 / 8, - 'ebit': 10**18 / 8, - 'kibit': 2**10 / 8, - 'mibit': 2**20 / 8, - 'gibit': 2**30 / 8, - 'tibit': 2**40 / 8, - 'pibit': 2**50 / 8, - 'eibit': 2**60 / 8, - } - byte_sizes.update({k.lower()[0]: v for k, v in byte_sizes.items() if 'i' not in k}) - - byte_string_pattern = r'^\s*(\d*\.?\d+)\s*(\w+)?' - byte_string_re = re.compile(byte_string_pattern, re.IGNORECASE) - @classmethod def __get_pydantic_core_schema__(cls, source: type[Any], handler: GetCoreSchemaHandler) -> core_schema.CoreSchema: - return core_schema.with_info_after_validator_function( - function=cls._validate, - schema=core_schema.union_schema( - [ - core_schema.str_schema(pattern=cls.byte_string_pattern), - core_schema.int_schema(ge=0), - ], - custom_error_type='byte_size', - custom_error_message='could not parse value and unit from byte string', - ), - serialization=core_schema.plain_serializer_function_ser_schema( - int, return_schema=core_schema.int_schema(ge=0) - ), - ) + return core_schema.with_info_plain_validator_function(cls._validate) @classmethod - def _validate(cls, input_value: Any, /, _: core_schema.ValidationInfo) -> ByteSize: + def _validate(cls, __input_value: Any, _: core_schema.ValidationInfo) -> ByteSize: try: - return cls(int(input_value)) + return cls(int(__input_value)) except ValueError: pass - str_match = cls.byte_string_re.match(str(input_value)) + str_match = byte_string_re.match(str(__input_value)) if str_match is None: raise PydanticCustomError('byte_size', 'could not parse value and unit from byte string') @@ -2125,19 +1753,18 @@ class ByteSize(int): unit = 'b' try: - unit_mult = cls.byte_sizes[unit.lower()] + unit_mult = BYTE_SIZES[unit.lower()] except KeyError: raise PydanticCustomError('byte_size_unit', 'could not interpret byte unit: {unit}', {'unit': unit}) return cls(int(float(scalar) * unit_mult)) - def human_readable(self, decimal: bool = False, separator: str = '') -> str: + def human_readable(self, decimal: bool = False) -> str: """Converts a byte size to a human readable string. Args: decimal: If True, use decimal units (e.g. 1000 bytes per KB). If False, use binary units (e.g. 1024 bytes per KiB). - separator: A string used to split the value and unit. Defaults to an empty string (''). Returns: A human readable string representation of the byte size. @@ -2155,27 +1782,25 @@ class ByteSize(int): for unit in units: if abs(num) < divisor: if unit == 'B': - return f'{num:0.0f}{separator}{unit}' + return f'{num:0.0f}{unit}' else: - return f'{num:0.1f}{separator}{unit}' + return f'{num:0.1f}{unit}' num /= divisor - return f'{num:0.1f}{separator}{final_unit}' + return f'{num:0.1f}{final_unit}' def to(self, unit: str) -> float: - """Converts a byte size to another unit, including both byte and bit units. + """Converts a byte size to another unit. Args: - unit: The unit to convert to. Must be one of the following: B, KB, MB, GB, TB, PB, EB, - KiB, MiB, GiB, TiB, PiB, EiB (byte units) and - bit, kbit, mbit, gbit, tbit, pbit, ebit, - kibit, mibit, gibit, tibit, pibit, eibit (bit units). + unit: The unit to convert to. Must be one of the following: B, KB, MB, GB, TB, PB, EiB, + KiB, MiB, GiB, TiB, PiB, EiB. Returns: The byte size in the new unit. """ try: - unit_div = self.byte_sizes[unit.lower()] + unit_div = BYTE_SIZES[unit.lower()] except KeyError: raise PydanticCustomError('byte_size_unit', 'Could not interpret byte unit: {unit}', {'unit': unit}) @@ -2187,7 +1812,7 @@ class ByteSize(int): def _check_annotated_type(annotated_type: str, expected_type: str, annotation: str) -> None: if annotated_type != expected_type: - raise PydanticUserError(f"'{annotation}' cannot annotate '{annotated_type}'.", code='invalid-annotated-type') + raise PydanticUserError(f"'{annotation}' cannot annotate '{annotated_type}'.", code='invalid_annotated_type') if TYPE_CHECKING: @@ -2254,7 +1879,7 @@ def condate( Returns: A date type with the specified constraints. """ - return Annotated[ # pyright: ignore[reportReturnType] + return Annotated[ date, Strict(strict) if strict is not None else None, annotated_types.Interval(gt=gt, ge=ge, lt=lt, le=le), @@ -2402,7 +2027,7 @@ class Base64Encoder(EncoderProtocol): The decoded data. """ try: - return base64.b64decode(data) + return base64.decodebytes(data) except ValueError as e: raise PydanticCustomError('base64_decode', "Base64 decoding error: '{error}'", {'error': str(e)}) @@ -2416,7 +2041,7 @@ class Base64Encoder(EncoderProtocol): Returns: The encoded data. """ - return base64.b64encode(value) + return base64.encodebytes(value) @classmethod def get_json_format(cls) -> Literal['base64']: @@ -2474,8 +2099,8 @@ class EncodedBytes: `EncodedBytes` needs an encoder that implements `EncoderProtocol` to operate. - ```python - from typing import Annotated + ```py + from typing_extensions import Annotated from pydantic import BaseModel, EncodedBytes, EncoderProtocol, ValidationError @@ -2533,11 +2158,9 @@ class EncodedBytes: return field_schema def __get_pydantic_core_schema__(self, source: type[Any], handler: GetCoreSchemaHandler) -> core_schema.CoreSchema: - schema = handler(source) - _check_annotated_type(schema['type'], 'bytes', self.__class__.__name__) return core_schema.with_info_after_validator_function( function=self.decode, - schema=schema, + schema=core_schema.bytes_schema(), serialization=core_schema.plain_serializer_function_ser_schema(function=self.encode), ) @@ -2568,13 +2191,13 @@ class EncodedBytes: @_dataclasses.dataclass(**_internal_dataclass.slots_true) -class EncodedStr: +class EncodedStr(EncodedBytes): """A str type that is encoded and decoded using the specified encoder. `EncodedStr` needs an encoder that implements `EncoderProtocol` to operate. - ```python - from typing import Annotated + ```py + from typing_extensions import Annotated from pydantic import BaseModel, EncodedStr, EncoderProtocol, ValidationError @@ -2622,25 +2245,14 @@ class EncodedStr: ``` """ - encoder: type[EncoderProtocol] - - def __get_pydantic_json_schema__( - self, core_schema: core_schema.CoreSchema, handler: GetJsonSchemaHandler - ) -> JsonSchemaValue: - field_schema = handler(core_schema) - field_schema.update(type='string', format=self.encoder.get_json_format()) - return field_schema - def __get_pydantic_core_schema__(self, source: type[Any], handler: GetCoreSchemaHandler) -> core_schema.CoreSchema: - schema = handler(source) - _check_annotated_type(schema['type'], 'str', self.__class__.__name__) return core_schema.with_info_after_validator_function( function=self.decode_str, - schema=schema, + schema=super(EncodedStr, self).__get_pydantic_core_schema__(source=source, handler=handler), # noqa: UP008 serialization=core_schema.plain_serializer_function_ser_schema(function=self.encode_str), ) - def decode_str(self, data: str, _: core_schema.ValidationInfo) -> str: + def decode_str(self, data: bytes, _: core_schema.ValidationInfo) -> str: """Decode the data using the specified encoder. Args: @@ -2649,7 +2261,7 @@ class EncodedStr: Returns: The decoded data. """ - return self.encoder.decode(data.encode()).decode() + return data.decode() def encode_str(self, value: str) -> str: """Encode the data using the specified encoder. @@ -2660,7 +2272,7 @@ class EncodedStr: Returns: The encoded data. """ - return self.encoder.encode(value.encode()).decode() # noqa: UP008 + return super(EncodedStr, self).encode(value=value.encode()).decode() # noqa: UP008 def __hash__(self) -> int: return hash(self.encoder) @@ -2670,52 +2282,12 @@ Base64Bytes = Annotated[bytes, EncodedBytes(encoder=Base64Encoder)] """A bytes type that is encoded and decoded using the standard (non-URL-safe) base64 encoder. Note: - Under the hood, `Base64Bytes` uses the standard library `base64.b64encode` and `base64.b64decode` functions. + Under the hood, `Base64Bytes` use standard library `base64.encodebytes` and `base64.decodebytes` functions. As a result, attempting to decode url-safe base64 data using the `Base64Bytes` type may fail or produce an incorrect decoding. -Warning: - In versions of Pydantic prior to v2.10, `Base64Bytes` used [`base64.encodebytes`][base64.encodebytes] - and [`base64.decodebytes`][base64.decodebytes] functions. According to the [base64 documentation](https://docs.python.org/3/library/base64.html), - these methods are considered legacy implementation, and thus, Pydantic v2.10+ now uses the modern - [`base64.b64encode`][base64.b64encode] and [`base64.b64decode`][base64.b64decode] functions. - - If you'd still like to use these legacy encoders / decoders, you can achieve this by creating a custom annotated type, - like follows: - - ```python - import base64 - from typing import Annotated, Literal - - from pydantic_core import PydanticCustomError - - from pydantic import EncodedBytes, EncoderProtocol - - class LegacyBase64Encoder(EncoderProtocol): - @classmethod - def decode(cls, data: bytes) -> bytes: - try: - return base64.decodebytes(data) - except ValueError as e: - raise PydanticCustomError( - 'base64_decode', - "Base64 decoding error: '{error}'", - {'error': str(e)}, - ) - - @classmethod - def encode(cls, value: bytes) -> bytes: - return base64.encodebytes(value) - - @classmethod - def get_json_format(cls) -> Literal['base64']: - return 'base64' - - LegacyBase64Bytes = Annotated[bytes, EncodedBytes(encoder=LegacyBase64Encoder)] - ``` - -```python +```py from pydantic import Base64Bytes, BaseModel, ValidationError class Model(BaseModel): @@ -2730,7 +2302,7 @@ print(m.base64_bytes) # Serialize into the base64 form print(m.model_dump()) -#> {'base64_bytes': b'VGhpcyBpcyB0aGUgd2F5'} +#> {'base64_bytes': b'VGhpcyBpcyB0aGUgd2F5\n'} # Validate base64 data try: @@ -2748,21 +2320,12 @@ Base64Str = Annotated[str, EncodedStr(encoder=Base64Encoder)] """A str type that is encoded and decoded using the standard (non-URL-safe) base64 encoder. Note: - Under the hood, `Base64Str` uses the standard library `base64.b64encode` and `base64.b64decode` functions. + Under the hood, `Base64Bytes` use standard library `base64.encodebytes` and `base64.decodebytes` functions. As a result, attempting to decode url-safe base64 data using the `Base64Str` type may fail or produce an incorrect decoding. -Warning: - In versions of Pydantic prior to v2.10, `Base64Str` used [`base64.encodebytes`][base64.encodebytes] - and [`base64.decodebytes`][base64.decodebytes] functions. According to the [base64 documentation](https://docs.python.org/3/library/base64.html), - these methods are considered legacy implementation, and thus, Pydantic v2.10+ now uses the modern - [`base64.b64encode`][base64.b64encode] and [`base64.b64decode`][base64.b64decode] functions. - - See the [`Base64Bytes`][pydantic.types.Base64Bytes] type for more information on how to - replicate the old behavior with the legacy encoders / decoders. - -```python +```py from pydantic import Base64Str, BaseModel, ValidationError class Model(BaseModel): @@ -2777,7 +2340,7 @@ print(m.base64_str) # Serialize into the base64 form print(m.model_dump()) -#> {'base64_str': 'VGhlc2UgYXJlbid0IHRoZSBkcm9pZHMgeW91J3JlIGxvb2tpbmcgZm9y'} +#> {'base64_str': 'VGhlc2UgYXJlbid0IHRoZSBkcm9pZHMgeW91J3JlIGxvb2tpbmcgZm9y\n'} # Validate base64 data try: @@ -2801,7 +2364,7 @@ Note: As a result, the `Base64UrlBytes` type can be used to faithfully decode "vanilla" base64 data (using `'+'` and `'/'`). -```python +```py from pydantic import Base64UrlBytes, BaseModel class Model(BaseModel): @@ -2822,7 +2385,7 @@ Note: As a result, the `Base64UrlStr` type can be used to faithfully decode "vanilla" base64 data (using `'+'` and `'/'`). -```python +```py from pydantic import Base64UrlStr, BaseModel class Model(BaseModel): @@ -2841,8 +2404,7 @@ __getattr__ = getattr_migration(__name__) @_dataclasses.dataclass(**_internal_dataclass.slots_true) class GetPydanticSchema: - """!!! abstract "Usage Documentation" - [Using `GetPydanticSchema` to Reduce Boilerplate](../concepts/types.md#using-getpydanticschema-to-reduce-boilerplate) + """Usage docs: https://docs.pydantic.dev/2.5/concepts/types/#using-getpydanticschema-to-reduce-boilerplate A convenience class for creating an annotation that provides pydantic custom type hooks. @@ -2851,7 +2413,9 @@ class GetPydanticSchema: For example, to have a field treated by type checkers as `int`, but by pydantic as `Any`, you can do: ```python - from typing import Annotated, Any + from typing import Any + + from typing_extensions import Annotated from pydantic import BaseModel, GetPydanticSchema @@ -2900,8 +2464,10 @@ class Tag: The primary role of the `Tag` here is to map the return value from the callable `Discriminator` function to the appropriate member of the `Union` in question. - ```python - from typing import Annotated, Any, Literal, Union + ```py + from typing import Any, Union + + from typing_extensions import Annotated, Literal from pydantic import BaseModel, Discriminator, Tag @@ -2966,15 +2532,15 @@ class Tag: def __get_pydantic_core_schema__(self, source_type: Any, handler: GetCoreSchemaHandler) -> CoreSchema: schema = handler(source_type) - metadata = cast('CoreMetadata', schema.setdefault('metadata', {})) - metadata['pydantic_internal_union_tag_key'] = self.tag + metadata = schema.setdefault('metadata', {}) + assert isinstance(metadata, dict) + metadata[_core_utils.TAGGED_UNION_TAG_KEY] = self.tag return schema @_dataclasses.dataclass(**_internal_dataclass.slots_true, frozen=True) class Discriminator: - """!!! abstract "Usage Documentation" - [Discriminated Unions with `Callable` `Discriminator`](../concepts/unions.md#discriminated-unions-with-callable-discriminator) + """Usage docs: https://docs.pydantic.dev/2.5/concepts/unions/#discriminated-unions-with-callable-discriminator Provides a way to use a custom callable as the way to extract the value of a union discriminator. @@ -2987,8 +2553,10 @@ class Discriminator: Consider this example, which is much more performant with the use of `Discriminator` and thus a `TaggedUnion` than it would be as a normal `Union`. - ```python - from typing import Annotated, Any, Literal, Union + ```py + from typing import Any, Union + + from typing_extensions import Annotated, Literal from pydantic import BaseModel, Discriminator, Tag @@ -3051,7 +2619,7 @@ class Discriminator: A `str` discriminator must be the name of a field to discriminate against. """ custom_error_type: str | None = None - """Type to use in [custom errors](../errors/errors.md) replacing the standard discriminated union + """Type to use in [custom errors](../errors/errors.md#custom-errors) replacing the standard discriminated union validation errors. """ custom_error_message: str | None = None @@ -3060,7 +2628,8 @@ class Discriminator: """Context to use in custom errors.""" def __get_pydantic_core_schema__(self, source_type: Any, handler: GetCoreSchemaHandler) -> CoreSchema: - if not is_union_origin(get_origin(source_type)): + origin = _typing_extra.get_origin(source_type) + if not origin or not _typing_extra.origin_is_union(origin): raise TypeError(f'{type(self).__name__} must be used with a Union type, not {source_type}') if isinstance(self.discriminator, str): @@ -3069,11 +2638,9 @@ class Discriminator: return handler(Annotated[source_type, Field(discriminator=self.discriminator)]) else: original_schema = handler(source_type) - return self._convert_schema(original_schema, handler) + return self._convert_schema(original_schema) - def _convert_schema( - self, original_schema: core_schema.CoreSchema, handler: GetCoreSchemaHandler | None = None - ) -> core_schema.TaggedUnionSchema: + def _convert_schema(self, original_schema: core_schema.CoreSchema) -> core_schema.TaggedUnionSchema: if original_schema['type'] != 'union': # This likely indicates that the schema was a single-item union that was simplified. # In this case, we do the same thing we do in @@ -3082,31 +2649,20 @@ class Discriminator: original_schema = core_schema.union_schema([original_schema]) tagged_union_choices = {} - for choice in original_schema['choices']: + for i, choice in enumerate(original_schema['choices']): tag = None if isinstance(choice, tuple): choice, tag = choice - metadata = cast('CoreMetadata | None', choice.get('metadata')) + metadata = choice.get('metadata') if metadata is not None: - tag = metadata.get('pydantic_internal_union_tag_key') or tag + metadata_tag = metadata.get(_core_utils.TAGGED_UNION_TAG_KEY) + if metadata_tag is not None: + tag = metadata_tag if tag is None: - # `handler` is None when this method is called from `apply_discriminator()` (deferred discriminators) - if handler is not None and choice['type'] == 'definition-ref': - # If choice was built from a PEP 695 type alias, try to resolve the def: - try: - choice = handler.resolve_ref_schema(choice) - except LookupError: - pass - else: - metadata = cast('CoreMetadata | None', choice.get('metadata')) - if metadata is not None: - tag = metadata.get('pydantic_internal_union_tag_key') - - if tag is None: - raise PydanticUserError( - f'`Tag` not provided for choice {choice} used with `Discriminator`', - code='callable-discriminator-no-tag', - ) + raise PydanticUserError( + f'`Tag` not provided for choice {choice} used with `Discriminator`', + code='callable-discriminator-no-tag', + ) tagged_union_choices[tag] = choice # Have to do these verbose checks to ensure falsy values ('' and {}) don't get ignored @@ -3144,7 +2700,9 @@ def _get_type_name(x: Any) -> str: if type_ in _JSON_TYPES: return type_.__name__ - # Handle proper subclasses; note we don't need to handle None or bool here + # Handle proper subclasses; note we don't need to handle None here + if isinstance(x, bool): + return 'bool' if isinstance(x, int): return 'int' if isinstance(x, float): @@ -3170,30 +2728,30 @@ class _AllowAnyJson: if TYPE_CHECKING: # This seems to only be necessary for mypy JsonValue: TypeAlias = Union[ - list['JsonValue'], - dict[str, 'JsonValue'], + List['JsonValue'], + Dict[str, 'JsonValue'], str, - bool, int, float, + bool, None, ] """A `JsonValue` is used to represent a value that can be serialized to JSON. It may be one of: - * `list['JsonValue']` - * `dict[str, 'JsonValue']` + * `List['JsonValue']` + * `Dict[str, 'JsonValue']` * `str` - * `bool` * `int` * `float` + * `bool` * `None` The following example demonstrates how to use `JsonValue` to validate JSON data, and what kind of errors to expect when input data is not json serializable. - ```python + ```py import json from pydantic import BaseModel, JsonValue, ValidationError @@ -3226,12 +2784,12 @@ else: 'JsonValue', Annotated[ Union[ - Annotated[list['JsonValue'], Tag('list')], - Annotated[dict[str, 'JsonValue'], Tag('dict')], + Annotated[List['JsonValue'], Tag('list')], + Annotated[Dict[str, 'JsonValue'], Tag('dict')], Annotated[str, Tag('str')], - Annotated[bool, Tag('bool')], Annotated[int, Tag('int')], Annotated[float, Tag('float')], + Annotated[bool, Tag('bool')], Annotated[None, Tag('NoneType')], ], Discriminator( @@ -3242,54 +2800,3 @@ else: _AllowAnyJson, ], ) - - -class _OnErrorOmit: - @classmethod - def __get_pydantic_core_schema__(cls, source_type: Any, handler: GetCoreSchemaHandler) -> CoreSchema: - # there is no actual default value here but we use with_default_schema since it already has the on_error - # behavior implemented and it would be no more efficient to implement it on every other validator - # or as a standalone validator - return core_schema.with_default_schema(schema=handler(source_type), on_error='omit') - - -OnErrorOmit = Annotated[T, _OnErrorOmit] -""" -When used as an item in a list, the key type in a dict, optional values of a TypedDict, etc. -this annotation omits the item from the iteration if there is any error validating it. -That is, instead of a [`ValidationError`][pydantic_core.ValidationError] being propagated up and the entire iterable being discarded -any invalid items are discarded and the valid ones are returned. -""" - - -@_dataclasses.dataclass -class FailFast(_fields.PydanticMetadata, BaseMetadata): - """A `FailFast` annotation can be used to specify that validation should stop at the first error. - - This can be useful when you want to validate a large amount of data and you only need to know if it's valid or not. - - You might want to enable this setting if you want to validate your data faster (basically, if you use this, - validation will be more performant with the caveat that you get less information). - - ```python - from typing import Annotated - - from pydantic import BaseModel, FailFast, ValidationError - - class Model(BaseModel): - x: Annotated[list[int], FailFast()] - - # This will raise a single error for the first invalid value and stop validation - try: - obj = Model(x=[1, 2, 'a', 4, 5, 'b', 7, 8, 9, 'c']) - except ValidationError as e: - print(e) - ''' - 1 validation error for Model - x.2 - Input should be a valid integer, unable to parse string as an integer [type=int_parsing, input_value='a', input_type=str] - ''' - ``` - """ - - fail_fast: bool = True diff --git a/Backend/venv/lib/python3.12/site-packages/pydantic/typing.py b/Backend/venv/lib/python3.12/site-packages/pydantic/typing.py index 0bda22d0..f1b32ba2 100644 --- a/Backend/venv/lib/python3.12/site-packages/pydantic/typing.py +++ b/Backend/venv/lib/python3.12/site-packages/pydantic/typing.py @@ -1,5 +1,4 @@ """`typing` module is a backport module from V1.""" - from ._migration import getattr_migration __getattr__ = getattr_migration(__name__) diff --git a/Backend/venv/lib/python3.12/site-packages/pydantic/utils.py b/Backend/venv/lib/python3.12/site-packages/pydantic/utils.py index 8d1e2a81..1619d1db 100644 --- a/Backend/venv/lib/python3.12/site-packages/pydantic/utils.py +++ b/Backend/venv/lib/python3.12/site-packages/pydantic/utils.py @@ -1,5 +1,4 @@ """The `utils` module is a backport module from V1.""" - from ._migration import getattr_migration __getattr__ = getattr_migration(__name__) diff --git a/Backend/venv/lib/python3.12/site-packages/pydantic/v1/__init__.py b/Backend/venv/lib/python3.12/site-packages/pydantic/v1/__init__.py index 4807865c..3bf1418f 100644 --- a/Backend/venv/lib/python3.12/site-packages/pydantic/v1/__init__.py +++ b/Backend/venv/lib/python3.12/site-packages/pydantic/v1/__init__.py @@ -1,27 +1,24 @@ # flake8: noqa -import sys -import warnings - -from pydantic.v1 import dataclasses -from pydantic.v1.annotated_types import create_model_from_namedtuple, create_model_from_typeddict -from pydantic.v1.class_validators import root_validator, validator -from pydantic.v1.config import BaseConfig, ConfigDict, Extra -from pydantic.v1.decorator import validate_arguments -from pydantic.v1.env_settings import BaseSettings -from pydantic.v1.error_wrappers import ValidationError -from pydantic.v1.errors import * -from pydantic.v1.fields import Field, PrivateAttr, Required -from pydantic.v1.main import * -from pydantic.v1.networks import * -from pydantic.v1.parse import Protocol -from pydantic.v1.tools import * -from pydantic.v1.types import * -from pydantic.v1.version import VERSION, compiled +from . import dataclasses +from .annotated_types import create_model_from_namedtuple, create_model_from_typeddict +from .class_validators import root_validator, validator +from .config import BaseConfig, ConfigDict, Extra +from .decorator import validate_arguments +from .env_settings import BaseSettings +from .error_wrappers import ValidationError +from .errors import * +from .fields import Field, PrivateAttr, Required +from .main import * +from .networks import * +from .parse import Protocol +from .tools import * +from .types import * +from .version import VERSION, compiled __version__ = VERSION -# WARNING __all__ from pydantic.errors is not included here, it will be removed as an export here in v2 -# please use "from pydantic.v1.errors import ..." instead +# WARNING __all__ from .errors is not included here, it will be removed as an export here in v2 +# please use "from pydantic.errors import ..." instead __all__ = [ # annotated types utils 'create_model_from_namedtuple', @@ -132,11 +129,3 @@ __all__ = [ 'compiled', 'VERSION', ] - - -if sys.version_info >= (3, 14): - warnings.warn( - "Core Pydantic V1 functionality isn't compatible with Python 3.14 or greater.", - UserWarning, - stacklevel=2, - ) diff --git a/Backend/venv/lib/python3.12/site-packages/pydantic/v1/__pycache__/__init__.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/pydantic/v1/__pycache__/__init__.cpython-312.pyc index 627f82ce9bd56f5fa7525182608bac8e0b94fe7f..5de0dd9302a86023abd35ce5ec0f4d41d9242701 100644 GIT binary patch delta 563 zcmX|-Pm9w)7>D1<|1?dz+IH)<+Eov`6fe7o_yNSLcv6^43C(N?&LrWTxXYfpi=RL$ zc=ztfkKt(%Jj9d;;=!BfU7QKgVR-rdo(G1R`7-#^Uw;h44yg6u(f#C;O5b$(w~RLY z{;a}Vh#@8%1fhiJY;Z%E)D#xAnr?DiIMfj?b(?N+Px#aq9oi8A4H{sRCTd!wm7ABZ6xiV+=&UAo&akB?jH@f&UG@I5i1lh#lF`j;k@^QsF%!18N^W$EqNp*`;e2VefVU4w*)kmE&EZLW<^x6cu}0^OroVI z+FI>wp1RYuv&_e8D7`YF0za()?Bo7H*dVd zP366OeyXH?s(h@*Pm>Vx9rkK?R>Q*@j<4W&3-c`;Y~fx7qZ*E`;HZK@1>-GDD;TO> U!@<|y=py*#2@)8WE*9#fzspdN9smFU delta 1028 zcmZ8g%}*0S6o1q0_qLQ$z67KTB#<6#tP(G9(hC|fCPqvqL|nVmvM{sT%q*?dnBvK+ zhJ$yn>d8OD6J8_>q$b1zH=>D0<4jr1*2(70d%xfBeN1NdPwueL`I611L9WLWSM2o+ zz=;YjRxEIST}1%zzyb?Vz~?){NX8KwVH(zu!ZaFXF&txY9Ph~{Fc#MtX@qoP)uqiqbcsiYAQ+O)i zFaP7G12031%)kbl!7~VmfoJPrW#1z_M__9uINa@v)5_f%*j@+VqY)rz>rRLWTq{TB zt-+7^5863^ppDw7G<2%Md!G}i6zh~Cr;0rtkmmW_TP`QY{kCN~o?SK8Dn@O`sd~2S znAG;#hAo^0brVS4scN{p86ZA!hj={m;sa%ItQxl!lD^awAXMr6qn^3%dItJ{<` z2`w%7nrI6@*)q9fJ9Xg~^+wRG+^ldli9Z=a%6rT4iOy6QsZvvjjiwyPGCh|I9+ycx zp)!a1bgomg>pZF0lrrk!_#=Eb(?>9S4D&}&lwTJr z-v>r^^`A+G^vG`F?1=`^#5b+5uNB_3zG~A4(fsbp>(y7Q2g$XAWZ|GN{5uhi>G3nE JEAp4J`(L9XADI9E diff --git a/Backend/venv/lib/python3.12/site-packages/pydantic/v1/__pycache__/_hypothesis_plugin.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/pydantic/v1/__pycache__/_hypothesis_plugin.cpython-312.pyc index 3f33e5c09c17e2a625cd56ae0efea94914a5a824..0c415a9c427f24f618625d4726449fa8f32650c8 100644 GIT binary patch delta 46 zcmX@SfbqZrM&8rByj%=GVCrm~`DY_y@0&OCcJO1%`Q$h?hH>f2h4|tt z=h~4jjl@c;L6tM9%Suv9>p?xW1ACR52~VBCN!`HZEYiS~Op3%y8$knec7H@(|Aw>< zHO9b})kw(N1{P&KYR(L49~(g{v!oO0$mqzp$Hvv5^;e^}Dhb&j+02w{C~34WWw&WV(VT z6)FhN*cY!2J$#ks;o~XHbEq$0=0Apx7%A?a6*0i1X~1j WJ)C&k-4UB7%s*j!>bd*IAo?eXorB;2 delta 722 zcmZ8fzi-n(6uz?^+evIEPD4^$+C~wm1e&x+C@W$?Wn@4|9%32JsZ9JMI=d;E!q5eY z1>M}0m7!u}U}i=_Udo@r2JblnwcPN@?|bk2?!9;Zz5Q{={AQXp0%zh3!{;B&qZMIt zq{mgaN(m!OiE44(t;dFIlyN08W6QPThTEVdkhlspYSfHv*M^w9zKvej57TB6A>3ek zpt0&rNU~b6F;!UoOmW+Z&Wu0?Mh3<_Q=Yi(D}`2>(pUp!Q7! zv!sKzaOfj3p$lq>?{wuDATN}BIS-1O=fx>Ii2~0XP;QGvdPg_KFKIG%peUmNJ>CW6 zn}4B&i3-45@}tq_cypo7PJMoy@!G|E`IFo+fg4DLG&(G3p257N2QC-Sv^x~sPxb!Y zT~t-VJcu)1g>PO*LifDHkFgh(+sJNE;9^*HWV$DgjGY$)tobMB z_aGc-{IFD_hR%u(8nXOk4kP+WlIDIMrb)*4v1o`e0?0Ig-um#a_+s?wSo}0T>)k@m zmKkr0bF;r{&6mti^6=GY@nAF!gNUu0FPc{qu^%QJ|DyFw*F>=MFgfP<034T8*lWfM z-sC}&m7Q708;gKr=!MBNEtHpO8gZw5f&%O*kNgiI3$6{igD@gwV Dx&5X0 diff --git a/Backend/venv/lib/python3.12/site-packages/pydantic/v1/__pycache__/class_validators.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/pydantic/v1/__pycache__/class_validators.cpython-312.pyc index 6f85ab1ae91a07cd642c839844efebf60e87b497..e8449dc54304a5a2741376a7bd4400b5b8f519aa 100644 GIT binary patch delta 3777 zcmaJ@TW}NC8QzsvE7>4ygN7MZg$3Xw(0 zJBdk~A!$NS@<2*6&`YK?%rG6jv@>+zxqazFUb-2E^3a(k=`g*d!-VNW|Nmbh%g(g2 z_31zV?fkcMcJE%6FI<+rfAD&1CHVC3@5?$bdEZ-cGf&Q!Z%MVt5_7Yf+?KpQ!WXC1H#K$!k{nFZ~wGWD!;O-&_?W)?F1EC76kh1ZnI z=Di@Xx7l^YNxsobwx*=|sAXNyvhGUD_OX@S)kTLqu>~8-3Yk3t=KXB5W+UiPXz<%;^ca4- zHtP)m%ROK@z^2$<_#I@R1GP#3zZcd+tk0-lDQ6d8`+(gK?BUZA8~B-=8X@&THpGS> zcan@fYy`AM|EF{mq+@K1joZmoTBfiGkc=FmSP&YjJR6Y_*hu_)KxEsnn7wQbA>{V$AP>qaScsl2yFzS z&COI|wu#r==jsE<4I*?RgoM`5?PjxVKx5mDaq= zvO0oVe&MXUjFCIQ->>V2XK-uFqwATag;Tn&dH6IkTp9gT&Lp4Z&CxiBFpPjvm>z&& zaFsqhCi?1gUW^`m>_nY$aihNX8B7~E|2J&g=L~3)&y(;8!avok-^yFFKd`5wyg%lufqrLZPUy+dT`SGpOSNSe5>)xT*HnopxAQIUXhu z^V>s%71#VI8aV-iLEAM)R|JbFas#YNfA>f(57$a}wx5^%9jHLrl1Hp2FIWC(<6GY6 zV6D0M0c0N(4;lmg)ceCWo3x)q8O2m_LxEGN?Rl9I(@pvbDz;kog+|8^D*iZ?UZv`6 zPL%ebf~#Ny#Xh+)LGhoaIaw>|I}bbj-JtPO-Pmj)sO$LxTgn-_KJiH2!*`22zQvVs z5L;VL<zYTQ0&#jQVr(i1?-dbaNE6xPkf( zfXANVBGx(#8KqmlCBMi}r3>IugPqnwIuA*W1hZ^}p8!4#YzB371oUM&Asz0+d=$GeQ8X*9SVro zgXS*WM047@G%vV+c}Q37@ko|}oy~Fwg`=D?mQBjWQeG@%7pMbZ9~IAq!g5S3hkoaw zK~lIOCc@3fa9C$G2Mz74R!eo_I0Jk)LL6ZNp$=gy0*zb_sj~=pDyuHHIb6<(8{rZA za+?!>3*V1NfU7B%D_b=3rd^6dz_Qfz;-ay@pabX8&Jh3J6&s*C2Mfce0Lm8+j!C(_ z)^_83k*7~p9eR_mh@+7oK+8XlL>zKd$nk5>zJe}ZLZI5ydBIj%N-k>_t=h#jhe;?J z+~gd!@E)_AIb*>-Ki@_k9&4?}j_wuluXseG-hUTm-y?l9J8vmzK5v>eu%;;ONJUa> zm)|VuTAK_b`<<@U2vtF*kf0cKb7|99zqd>pC_W`Ry93avWVcVgBvReS?J~}me$)LG zMSU6fjf&cysQju(^t|&lZvxJ&*1#{IgfbpSN-aJ-XP287* zs!AR2<+Rje5DpK!gyMiZJ-02^3^A9#9vSm_+%&sF>6Sqg(67+1w zre0U0B=n?DB&K$3F#O?^?{PhkB;(?vP2xlnoA6X}s>)~rIQNp{Rh)eyGu=wu zE^%Xe;|4YRZAn}_v%hJB%?*-t3`fO-{Vmm!@JX!L9jX|@ZxL<*(7j%+N%6o#dfBmD z#pOjq=Y8ViNQ=01@C$h7x_GE#1}_=Q4fUjFAl_{BbcRR&?~%qiwYH^mIUVKMxuqgZ z`gCH5%UmEZ0&o z3vYAu_`-)X_ao4)eE}&tT{Kq-T+(gZi&P&1UG_gh>U{*-ALoZ2=vJMsrxz9q@T|`k z7EE2|dn(EDJ*Y*u1-&*Mz~vmm3c{NRm&EfkA^*lF#v{*|{hl$w|0Ld>NyGzprNBKY ncHdclSBXAU8|1zJkPzaM(r{Pl{EHI0i~qsWgPG49bQb;#J@i$F delta 3770 zcmZ`5U2Id=+1I|lF$pGde*Kdl$Hc}rAt5%99};4R0BJf%C_~WRQH;qsP7K#}daeUa zwGpU7)s3nH9n^}6qS9^BvJPn|ec7~Xlh(d$(xkm!DH=TNp{pjXdtt5iu9P%daa){Xfe_#{+fsc@8#wP3TdG# z@zOZ)!Q+P~08cBp6-RN>2D^4}GcYHS4$D-gjs#Z}Z9i=xoisq&0WXu#id;5+04SE3 z-47f>H)`qnwx;Ebi-cE{O~D;DGFBnl32p?08|dJsl4jDe%_WhwOf`wDRA~pu9&k%I z4z4LAx*}@_MafhsS$DZ)17z7sWGU$oCzfDKS|PH%AU;U8b2b8>a1Gv#G)@CnZZ-=7 zlD!}~L=vPA-os>{$W=e!W3WF&;xFA6Mi&igDw!Zs5#h|FW_3eoWkHneM9_g? z2thjl!v!E1ydi!p!iVZ~H~J1bnviFdKdFl=7_{m_N8@EjEgdfaMd-K)zaadJOqe^a zru8gI7YmG?nflJLSFEBRw*-WqNtD7; zZW<6Vh%8%;@&cc1N_|h{S=qG0&Z3ZLBGku3))kSc?J)}*BKHb#Lf$WKi&bjA1hJCl zNxRg|f93T`J^XX;!X=!8X3eagHjErC&KC&tBBpAN7SqKdV`$g3X9?R63(*0lBTa}Z zvvY_LQK48voc@N(k7zPhB zf!8Eu7Fkrj-r90fgC+DHMa%^RC}}#tKh}cV^9V%sUWFC-CDdmSD>$XA6<)24xBbJO zP?0!~0F_UJj5r6|G}+l0vRnqR#nB|c9DH9z-KxW45k*F`r6#*!)iep1H{!eyjPvuI zPuqnz@)f#dh+s_lav_@+83jFIu7!3>5q>@N>9Xho+4A0VcH`Kb$Qs3?+1aA#%4yYJ zdRH?MO*hzLJqU0HvBL;z5$r@DItY&rTSS28tzt-}af{#)JVr17?e3U0tV-5*LvvDQu-A|a=aA{pY2G>nZy*j& zt-8Z<Q!6Q8#exbBJo1dpFTQRE)c88~WUbfPBa_!Te6S8sxT?zBr{)qG@ zALzd~_=Ns8z>=6R&u2qHI!?oyyk8rg~N8b!|U33MU z6+SU=4if()>EoXa1Qhg-_3^(BHNts_9g6eTL9dm_kNCSo-JA@1rAqQ=gMN#g5aeA$ z4T>;U$&(-QgN2##CjM|JUMXEOAc3{VXc9_)sGFZ0_J3Rali@b(3?Tn^xT8XRMqm>) zo558YtsgQeO?Mv`}!;URo&Q@BVAOE>E0u}ZyvRy?$$}91W zfH*bDUgV!m-dV0+SR(0sF+1CLHP%NNE5O(i6Ke|rT+HU@#EouxDkT<+S@=W~R~z2M z%!fb>@D*I)@iVt*vJNThFAvHGc<=%Dt?^%0q>Px$fm*f8c6~Sq0 diff --git a/Backend/venv/lib/python3.12/site-packages/pydantic/v1/__pycache__/color.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/pydantic/v1/__pycache__/color.cpython-312.pyc index c3c89c7f958dcc79db6568377a4101a1a879d63f..2dab448ab65aa2ef66ac3b868cc74dbb527ab82a 100644 GIT binary patch delta 4103 zcmZvf34B!56~^bzOeP_jA^R}dCp!aKhAdPdAxMBg(SQgRo@fX;FD5b}@lFC5#6cTt z-PmqxvC3jAQi^LwX=|&k)z(t9wc4s3txH#FZPB)N!B+jweUmU$lHdEk@1A?^dH0^X zC2t=WPaPMY6CO{h4L{B8jr~V=d-6ox?&{7+61hT?2hxpnVWT8U4rL5v8kqxGMwYOd z$ub4Dl#pv6+sGcsF>+vYn`ve)|Moia5Ny0;dV8H*?zJvX{JKvgtlfo-R)$KHqM zvdK2vHk;jM=3ZkX-)NG}MtS4I*kivn!wH{lHlvz+rnqvsHN1%RvdB%0fX+caa!_Dq z9(7nX#xyEKs#B=QN+}ha1-(ux8FL!bQR9o3{V3N^Dbk%go_s1ht5kkgsltq;nqHnU z9Uzq|5ukRLpmqdJ3{qw0!o%C^qUy0EqmFCIZu&5zxz+@tHXaGxnu;j(h_ZkJ=-MhOTdI)@&z7hXalpaC(Q91^GlfDIhn;rwdL*E4-*ZK+i9`yI=N$>~s z6!oU&8tly$rrWzXD_Q zD)<`x8hoAJ0NP5%K;(+A*x>3`sd^pO%+-!?o#D?5}!D<@QvRxYSytx}*SX_X39|-du;`hrU<#4x(5_P_NX=yQ6x)|la z5t}SwUBt-NQ1`o6yRhrAI~U4AjOP;b9q@G}JA_W*4Na=O#gh2N?f$ z1N6kVxw2Rt%sj{)$hyhXl31x;&gz7{W_q4#%U+euk&XyGfG}r;yM8#kIh(t)=!l4= z^md0r>$`h4$R*KJ*|!Q8cM55`E_X$t9`zEGV-9)6`j{}oPL6;dSrk2$d(`2bhVl`6 z%w89aiA@vzQxE0s7X@lr{*+vUTZ^8FDiq~fwKac74JTM~`+!5Tmt4nK288*B^82@2 zDO`(!dLpk>T~bh6T!X@CQ65NiG=)l(ah>HM~CiG!l>bF4eqQSvUM{M6Ct?;?=b$f(2D`9f$KJ@(PbdD1@XoDi@SRx-LbjuFBH3Lv%D0#!33)L$N(`b>YtKXb_S#Kl z>>@8>KfC33!6%$wtz8f2xplWq(=+9eGucJ&HFh4~W;Z}jOr3haj(5_6`W4pn+GEbX z?r@*{Wb{YsTibY1AWSL8%}CIhtczs@+bbDWjHy6uQu|$)DEDnbfDmJlufWea~w==G1j4^IxEM?pb zc=divIKFg#>Z7j)10sjVXC;i!qB=cL^`zGut!u~-VwGxZT#h}zt1&NY4eBS7$gS3@ ztD4Hy>y3U9Rv$H9QmE&957(U2wH>Yy{pH3j<0vMl&WKMYF(DIIyq-e zk!~XI;MV7CAaVD+&@x?gst;SHilwT$b?y>Y4fEnFuC^tzR! z99^F$dWR+Vb&YK79}dec>VejLYg}{KWlr?P)(_5cslDDdHZ#7k^_8R8`E~&LJIBUO zILFoAdF?oBUYpk|Fpl>5O#!`FmU93-3Wpwre1HvYK>T#(E8yV#O1q0^NxIdE1UN|7;k8lWw>?Z3NNs@Xv z+^?7u*0AIYLNAFxnm&@`Q8qlvIL7d)BON9Fvj-kdLk+I3@gLlSZ+GlX)604ts(OUV zSd^m#boI6}KejY(uH$=~#C1prj`I6D}6rJ{FS*;GO?(A@3iU(y_XD*gB zGTa{u%gNk~$E}YA$>)K!{B)vsa8d93TUhO6WUJmaOCy&<#_U7=@-epQt*FtLa3lokXrnPZRT5!j5nN((N)Iw6!Bj4rS+-y6u0xa*`Cf!*T<0&?dbpj delta 4277 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 diff --git a/Backend/venv/lib/python3.12/site-packages/pydantic/v1/__pycache__/config.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/pydantic/v1/__pycache__/config.cpython-312.pyc index b885068f6d8d462bd3022be66502a0c2adcc47e2..12be935fea402ead09efcd5cb012c8ad01b1cd07 100644 GIT binary patch delta 1644 zcmZ9MU1%It6vy}O&P+D@(f!IK+3!gBS+TyA4+gFWX#6NZ&)A9M5cU+_LQAzZnvjYD zOwsmhrY?yK4u3;G@Aax@`r`rY{{dVlJa-tQqC#?w?9~bf1 zaqx7F3eDOvd%}*|Q`nG_Mo9kWgr@?lq0r0uBgHyP3$#c};#am+nxn-=m>R-AEfzSH z(h0jHBBY_wNf9}BK+FpNfq3fQL@d-ZgUf{E_)h3ovna-_Bw&VE8Fmhs67Y}(!!Vcu z&jjC6rnO0!75=GGT^fNoB;bd<4r8hm0a0KSz_P3Y7y$0Tviu*#O-U!lW^iu9)Yuq* zPu)M95e{FiJ5GDw*P6SnHnV-L(PrCC3ehy?p99VV^S}k*Szur@ti=Ev*-Hr=1x{j_ zJJ(L)`ki%wyX*aKg}zM9s@O(~_#osJ*z><+aX^{&%l z>)cJ7E+-Vhw&T_mp&xt z`Q6g?A$#2PzS`|H9Z%-WANs&%9-1tJ3G$7x3JXQ`6}R4O^~{KUAxU=f75C z=rH;GvISUGU>A@Hc^8(vggk6n9_XpNi}1hU=iN5#I`#|fOMb6>HZ%V)P!!)kLdl0p P`A=n1@C)ODCiOLe8*>r*64+vsoi3JNJwjdTou(>FzDujR?Y*_G+m~R}BkSPB7%sFSy%$)hg zV)gsg=-1I`NRxlp^YhJ}52Ed!MgvydPM8ThX(owAH5#-=?Ub2P_K=mfGiHWpOy^TF zHf;IrF>_4CMy#xzGjqxgS$TWh9G7`v8qUf3X2GYeYc#T>(I|`U`mv_;PB;M;q{mdo z1dW-+o=S_$v;-?L->$x&SY{bFB^OLuQG3#yB$~<_m3b*PNz!X5J~m}mRD4Xv z!@Iuy8pmmtMOcM}*$FI2NyD$cbJBAhRzs&N`5oOnNylk{PRLJ@1!#^I8pE_C{ikGs z{Zv|JB^e=&Af1$v>1|?E#An3qFZj+Ak`p)l-_8|eNj@QA_<0dF*5FeTF3w*rmw5@E zvV_?47sFYMCV`50U!PeTg*hbQ`P~lZ0SwDP7)S#s&nti`r7C2_@4B5(PK*uT!iEv# z8PN*dCbQz_K=F|im~av}1v~^i44ejz)SQKHRxAaJK~;0M|7P$3Ax8hw@G>D;u|0Ax zeWc(Brc8@!sC-q;#u<17P&-e+3Ifocr+2p7%nPA)q?BF1BM6i!WjP0`Rhg7k2F$?^L@^v*qwBaK8dvMND^UHsksJH?gxm->*dI z$ur9}L^maj5Pu9w{w>z=LQS{nxSg6)XM9>srOmo@yR1W5qt>-L{IcLlgH*+b$zmKu zTnIp_2D%YnCI285@#X04actV~aSKHPjV80Gi<7FXE2)b;T$-Wtx8)a40eOiHV~HQR zG&GM7ZVuLK09wgk2i^iy8&wD2!0@1r>Xwy)&``btTmUX=B9xBy4g~NxysN+yz>|Q| z!&9)7JTAjh@=!Mcjqq#0I)Em4`c1dxcmb62B{lM1I`AC4Tc0LVnP~ds_Ow hCO$4jMpyQ^I-c&hF0m);nkxLYdJd+Pi z0b-CTTdqj5#PoI8oUKqQ{WcSPw~rsWxc#!$1T|^rCP4mb!#@D)W|iu zUYe~{>f}15UanVya!?7$AssKvHYkm9qY{?G`r4LlQZ~pN0FkK@wS{eJXM|?CSvNXZ zel2o~(kizC5)g4>Cw854&kFoF2+3{4MI6}WWjZd;2z-|B5zr2VrD=p+YrK08B3$t* z$nAQJ%30vvjN3sBqnQ;QA$rAQZTB47kC3V{oBD&VFrZqBlm{=LNgZ2rb=I9+|;GbfC zdc?bw32w@GaLcr5_RoW_&T=$&?%y)2SmFKSa{3J39sl=gRE7w8? z#6atRevlG`6ZDMeAF}humPJM?Cy@YJUK?jV1sm*#D zY+`LtzSag^II`9*L6)6Y_X{z{^dyDePHm~qdvQN9mv$GyzG7vG0nxQ}hxp@$WieJjKJa5GD5 zB}|w^G9uo_(5<&^vyyfgZ)VBFnSI-Y(6l4HPejPFcbL>D>5*KGHfI_a>45bq;}zcQ z+85Rq5$>ly+mFFRbjtBG>^|w-)NW=bwSnJT>hl1%wEh}12)`gYSbJ0W4blF(YXCG_|1F5r z9W27S*RBNtEcAM4uT_s7(>I_44GFlZ(T12A{MwgozY5T%&9%Q}fIe*^(gk4Bv`*$| z(=J9I6aZ_%SP@`Y`@K6Y!VxXq7X|vmHotHZD8!@COH-Z-x+~rUUOEvESEz8j@+ce? zsBqjbqDjLfObWSDPI62d3Raea{vAc5rF0?SHX4{_qX!d7aPl?%I8kbKt+GZXhE>q3 z2_JPQrAn)Mj9JvPT)fQ12`+pzkt~>AV$YV>=!ePrZW9W(ygvEL{ivg42aDHLvnhs|UDnb5YKP#0CGe zEZT^wj;X09)b#i`VeCo{nshL)dN^&43*J1cj|)E+q4i7_MPA}+6$h&M+IXZelFh3D z4%9F~hxcH*u&32>oh^9z=X2CN7}&Us3XA%00TnKz_REMNJr_{V5^7#T4a=zO0_s{u lZA+;3lEJYg2A0KcjSRkPH2*XJcIdqkq=)vUjcPZG_y@$4`KbT^ delta 2862 zcmb_eYitzP6~1R?cD-J|_R0FaYkSuZYy)=iYcUwxYnzviNvW!g2&=_+)-2iCH8T^4 zleHG9C~_rIncg2EEo~`D)ilr+G*yL^UrisXRJXEYCq`RbN-KWQ2ik^6lq9Ws@7N{| zX(cK;<9pAU^Z3rW=iYPIx88#LSE2CN1qD__pTniiu}=oi78b+I*}5)gF2aCKakFd@ zEx>ql{Hz>E%P!F+yG6Gl%874~J)+0pE%9QxL@Y7*+<2*6CYH(NV!2!)R>+lNr6IS* zy|PdA8GK&6O0E{G4L(0!Bl|_a91sI?tynA9iFJm&AYLywhz;^aaij5F7*99KO=1%u zDNkvlITcZZX0h2&+Txq!&EjTxi?{_4ha@MqW5;FZC5|l)A+berNe=8Np*(g)IYz}+ z4h*Bq1{vC2yeIu;#LF0a|xI?wQZC5V{uaDbCPd>waz1P#}X@=^|R!Ua+gci zd?YuSg|fY!*ei8nA01V6RMSyIho9zCE;*zwBO@-#8#Exw2kx+P0Ba zF3=dHnLU2|lKqX$)4;5xNKc##`7>9R4kj)?eipdYc*`(*Ipb|UpNpR$o5Iy1t(E0# zd?5Wll;yu9^hAZSe!6R9r{HaV>~v_S?Ivf0vS;mU`}F_YD|&8Rt0zY=1w28?gj;AA z*o_FS#<{Xd4zknaO>Z-LVJqzg*TY`u#%&LK#!s^=GyDS7uU*=X>oFI#;*QgTxC8IO zU6l5$Lk~*%)WRM$<84&4Q=&T`|JZR^p58a zA*AHt9_+w7S#YV7LibYWzJ&D=X&;l~y*NZ^Kkla<1Jt9{NQk4zgH#^EY`0euU|0ek zqSAp!5?onuJ?`|=V7sWn;3QXrq+CBz1VGQA8U9T5N%R8$3_1x7`}7fWT5v$7Xe=^z zRKnp2B{?A}+9a8^ru5;wCILpti$&A$1;X1-!I#Ks+t!v`x>$u>z!_fE6eWjoMd5HH zkw|J0EtX8E;jm(1QsGE48CMF(9oqo(>6`6@gQMhU&acBHIqZ4`ULk*VeHFf`zvTXf z34W>fmi2(SfPv?bm&?cDNBZ6JDuBQ1w#v5w{-w`)Ex-Yg_kAC7CLps_cfms5uKpe5 zkymRnQ24sy2e1=0a4^q639dlB8wkP2x~Dd1folEfO`mYkrtfe00S`m^Keu)Pe$P{bNZWI8Gxkz+2!x^DP5Fg zO2RQU9F0kF9DZbfl!42h0?Ykrx%Kb<}5?X zHfk`o`jbKeHuqD|z>N$l?NqER(P@1|1J;<{V%RLXQ|Nk;i+Fl{oQ)%0y&bTJ9PjM` zKe^gl-=r34dDO;uQYZy$ZK(1oNO6QaQ!Ah;ehQ|zM3A|)xe+==rgDI6gp-j&3yx2=UT{5X-ZftIw11$fR9}5Dn)pW24-4rxGK*bf1_d1 z)wH-}_pkhOqX!nZJe@V6g2L(JUkPP-YB_EF08x_7NA*qLoBGbwQeAMqF1S$Fz2qK$ zO*?n|Le*mE*}20<=CJf$C^{24XFrSQ+~d>MdH48@ibk^7KkD;PfCu;T(T1a-+G&>8 z8v47FpX*;7d{uyX{cn5z1aOzk?~B3^=^Sn=HI7v# zZ?`;=RI~v_Nh%q$HaQVXjFT6KTMsHWikz{pNW#(!nv_sk-zqF(rhH-&M-p0WY}1LB zO=Izhs)kQQ;xQc2l8UN0n2F;vCdouJHctL9>`s@imrE>e_@okt1WYuY`ka^JH!p(oo!K0X*}{6}_oA+k6>Kpf=$QLto9lzwEK Ul=J3&-DtMkG;HF3BLJQM4UDhH(f|Me diff --git a/Backend/venv/lib/python3.12/site-packages/pydantic/v1/__pycache__/datetime_parse.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/pydantic/v1/__pycache__/datetime_parse.cpython-312.pyc index d3d089c1c9ed61c7b617a5686e1e3ab870914be2..f7d2c884f8c31b6a3f0452dd67e24b17b76263a2 100644 GIT binary patch delta 159 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 akw#Xeo_lrarQm&kbVbgxV`Fz@=+u8zAPai{ diff --git a/Backend/venv/lib/python3.12/site-packages/pydantic/v1/__pycache__/env_settings.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/pydantic/v1/__pycache__/env_settings.cpython-312.pyc index 45ea48d696b7b850d493612843778c5b279bcff7..addd73b59a757aa428df552c86657ebb8a1d08c6 100644 GIT binary patch delta 3305 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 P;$6?8=$`pVzTp1{)MMHi diff --git a/Backend/venv/lib/python3.12/site-packages/pydantic/v1/__pycache__/error_wrappers.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/pydantic/v1/__pycache__/error_wrappers.cpython-312.pyc index b2640e75ba66fe4f8a5de3a3e2db5d16c82a6787..f2cfa02d4859507be9657a05e02a955fd09ed3f7 100644 GIT binary patch delta 2163 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 j#%N^k$HzZBv@2Y(dRE%8h=f$pyf|~yW7GT!r diff --git a/Backend/venv/lib/python3.12/site-packages/pydantic/v1/__pycache__/errors.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/pydantic/v1/__pycache__/errors.cpython-312.pyc index c0129973f8eb11d5c5e4124d3b8d0758b8335c09..cf37dfa3f00c4a56e2460fa1c0b3873a02858145 100644 GIT binary patch literal 29588 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 literal 29603 zcmc(I33Oc7dEPt>b^-)Ifcy5i6C?qUAjJiwC@ug#u`fd4GMR!k7`MoR3T+Rgvll-UrJgH7}R;H`l2iBqk_H! z^rJ5Hh@dY6{g?}VOwf-5eZ_?y74%i0ues1ZL4N`0CtT<;K|cxfQ!ezlpq~c%i!StW zK`#S+-G!bI^p}ACvI~7e(0>B-Gp-UpDd?{NeZz(J3wj0UXI&|r6!ddIKko|rl%QV# z`l~MVX+ggT^i3D~jG$M6e#w?uLVfnIZ= z1A_i0(6?M@M9{Z^e$|B zLeGwUr}_Q=O0%I^%T{z61JQUmhS$;~;q-8GWw!R%lSjHj`ww>Qf261PKsLBHF_x{| zACASsr(#C7vd?&a)JO~%*1@N1u}CF&G^(1JoRjrc%*_ z<*M#FmsVlZXLfHgVf3VWlj*&&Sn{k9u~IZ)FLpvD6GKQgl}7$n!idPArmJdSG8r>p ztM`qijg$qGe+%x4hoe@I%Hzs%1}Lt!K9gB z4UmJ$l$Cs)rwoGN0k-6Dwj%a z=co#&(Z`r6)gBC|hS@8b&Z^_bdpgb6dcHnxsFV|S)?RfgiXKCa<+_~e{jqS$QjOZa z(NhCCXVt?gCl|ivBGo|k(}uEGm<6uG5-%5`*6u7#US{^0J7lj^ip5`^61iCYh3>l9?mlvrCm2)Wqeli$`nta^Vkmb4VK4yuY?FV`W~ zLTn;rlefl0qr(Yw*U^YeD6@MKX9$_Cu{){usc<5at+QZuseRFmk!{Qa&{)&iCaaI{ zjHU)uG#*Wa(YIuqte{>rI1o$aMh)TUaP(X>kqr){ Rh-?HV(fF31aspOtAymHb! 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 diff --git a/Backend/venv/lib/python3.12/site-packages/pydantic/v1/__pycache__/fields.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/pydantic/v1/__pycache__/fields.cpython-312.pyc index 313e3e4d5317499cecef920953a14341d33a476a..607356b845314d31f23a7cf487ea89c8e5d739ec 100644 GIT binary patch delta 5986 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 apdq#{hS>LIeI?-US8ePsSAG2NZvO+ubMNK= delta 6031 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 delta 1380 zcmZ`&O>7%Q6rNeHm&A_k#7?q_V>|v$y=}ezX_6{w9JiFJ5)z0VFLrfh;)Z$T`Uc?4n~3!#PjRW5m$bD=_cL4-LL~3n5pd zs7uFe#koi>KD9M8Xr*D%sS_O|1+fT?(D9>*L!~E7N=zjt3$ZX$XGMvr0;@E-sX(^r zgGkCO$jm`Uk0IU4Qyj+R*eN#2%Hl{$%1AL%WwAkpRr)fuZIw*|Lu$fY^|0p(kxL@0 zon?y(x{2uI9-`wcb?Aep=Y_8&IwibL3wJ70dxBIKNTV}*Dp{tpV%!oKpz-0Ys7|ry znG-#iEwuF(KN*R4x7_~dp)ayJSejj-i8T;Pih(*CWv1Lqr70n@CMqE|#_CXG>;0=! z=)B+>G<{|wBaGJ1jAmtawQoC_lUoc@a2TL@A#iOM8wFnUeaHXu{f2Y=L|wr-Z`$v} z*zn@o#t5!)JN(t??^p~s{BDw8h~&o>MRKgR+&gWz;=LYm6

    &O&s9Mycu1>CVww# zV1s`XZD?iD>880FD-@>zCg7ys>M*D6rl8=5LZI2)w3toX&8DmKjaW4ZySg`k)A<)! zoqrsAN2@@s>g6Z@&}Qa1;KZs3Z?b6;cOd84p~i+sPZGF1Y$0iiDYWbjT3qZrq`#|x^47x;ns z8oyq87iR@xUd=3FEeU-o&dO`SG{6-I^Zck>%ohM=AQ%u#2=Zp&Kku$Whx$CxFc(&u{a7*v0TpftW;O2hbJ1d#*-)B?pSu)O@o|V?IS?)CX4*l#&hBa p_Ce#Cc;rWo8TA_kQp9X5P%~ul}9>;Fn-9 zAi=mWHEKpTf?LxHZnctjs+2+!R&dZt+iFP_cAFKowUTCMN*VA&r5+q6aUwmO;rf$< z-A5g(^R75VafIaNWgM-`r9RwFWbotUEa`8uz?=a_HzhKFV|9rkk|H_4|CS|vf;qXC z@D7+;$0%kapSLNv%Zxy~-66`$M28|C+$p?4QUK2-uw9@}EbkW>5U2=j6&Mt#k{k)a zjNq=iL^QB6FpH!>5+rAO-=fkG8+NJjVH}^}N6<}T&~^-(O+d3FILQ`VYV0uT!6}HI z!)a(*>@?IoG8LkuD@fPaC)bX9A3-HnZ~2N+?2c@DGT_q8=C=IQ)sq9e%6X0U0yaXJ z%$c@fm5DP~!GzL0Grd>kEN~3T6M3qErK5%i@;KiE?lJvu--Kn@53q5K7Fom>KN7mA z#w=e(;fv6s0QSn4L|LZ$FJ(0dKvDM-!&>^M=3#oo-`PyRc98B}G-@?Mozt5*5J1fv zFsuBLu1V{UU#@JdtVuM>-uP!*TCmLa{m+q`EeEb65BnG>ATQesl(d`1K*ffX z+mUfF=w*P0Y#XLSudvt302*VTm0b8D=Z+G9`lF;((PB4eIPiB>eFv~6?aIS@vbs6m zO3^gGTwSJ<@S!(3OmW}>h;j`TwfPT1X921*fCfWc6HV}Vg8dAxqLIzTwslk-fk?w^ zo6b^=ROvnLxfd!+w0cUJ}j!NM4rjZnF4I8LQz)Xa)gEtf?n&0X>Z-@~zUMK7C-&Um}N QN$ReoZ@!3rN8*9}1vSCw@&Et; delta 1158 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 CBC%)y delta 6289 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 B9peB1 diff --git a/Backend/venv/lib/python3.12/site-packages/pydantic/v1/__pycache__/mypy.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/pydantic/v1/__pycache__/mypy.cpython-312.pyc index 60c07fc726a0f29d65917fbe6257bcabf186b8a7..f27b1b7a36e32e2b1e450f8378835add16c9ab63 100644 GIT binary patch delta 8707 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 P>12+zzD$3zlp+2<2%I7a delta 8928 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 delta 5287 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 diff --git a/Backend/venv/lib/python3.12/site-packages/pydantic/v1/__pycache__/parse.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/pydantic/v1/__pycache__/parse.cpython-312.pyc index bbcc93dedbd476b507e7f6a4da0ad6a746d69ffa..1bfc7444109447adfeba151afcd47cc9cfbad67b 100644 GIT binary patch delta 606 zcma)2yGjE=6x~@f`^fI(vAT&-K?`FH1VPkJ(nt_{u?Rv)oKd11Hr$OuK(z4(WLj-) zEK}LpTiK=&3kwna04wio1O*Wsn8TU-IOpEE_wRi6z*thlv$nC)_Ac4(Ips!>>^OCY zXu7tkaq~jsmT<+`Z9>&)TAgviZM;dL9nOqmKao3El)J*=Ot?ISH!T>?h&0a%)Hxu+ z+}8`(z&&IsK7L`;GvA6ke@adW8^@qu&HoekQ9Rox<(#aNCHhLxRtDtMaFGC$@8rmE z6m?`nFBsm4p6Oe%YfTQG^m*M=mBZv=^Q0N=LA%?-E}ud!?qVuuZ}+>R1`q;MNF+(_TcLe7VOm;?coj)*q9iO v;b0JZ71cA*3d0~ag9^SOt04X;wabUK-U<0}AgZt;Z|x$PmXG#ZLghaJmy~(Q delta 629 zcma)2O-oxr6rFkIeZPr$sn4iH?IK1(Fwi2dN>=@#%R+GxL`j@cVxPWv-%|((wlsf0 zX6s7axpdWC*X;${&(p^`bI}sE_aNr*1ceR^d1${7NA zOTR2&Za~0F0|f(e<%eJ2Ua{!gdkFQj{BC@t6Y|62WlC$t zgh{Q15<~ZMzbD=SBmllVGn*D>1+B0+G&-HsR_B+a1w~}!rM59T~Mu-qf2vc&!nJ;V0Q5?LiDyZ48hwbNEN7EqTLPRcN2tq6BR zsk_Uc!d{=Z_p`A diff --git a/Backend/venv/lib/python3.12/site-packages/pydantic/v1/__pycache__/schema.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/pydantic/v1/__pycache__/schema.cpython-312.pyc index a33c0897d632995fcc1b1b483e4babf184b42af2..5e11ef12e57f2c646a5f1e78c8f14102cb92762a 100644 GIT binary patch delta 7334 zcmbtZ33yahmabP@LK2cd2qZCNBMB4{0c8*S56{;%9eH9>V6_h26 zL4gZ)t2ip6G_9amVq;_5J=3<`(>;!Zd~R<>9lo)dvB&;o+HpSH`C8}v=T+A39_O2h z`oD9}UCz1Z{P*0O_~lpj4}Nb?|JC5ZDK`37iNS z+1}ZjO{9s8(46pG@7(Y_?>ug2s-0SOa+(+t8WFDXsyDUb80&|IeBmwLEn&acAFlJ( zX*NAarqTSYkTYEGt>-brLL#htb&|8a0WsX$ppVhZ#fV(;Loe3{;~TI8y^VUQ-pEo= zr9Dzvk5sNViTpn1Y=Lw!dcWHnh9$ir;E0Jaf6j!!^8eFPDZ;bg z<&B8_w6~d}f=1`-Wqpn5AgbSl>MMmHX#3Q>>tz#(D^(iIsFd-~>qezhhAE0qn!27J+8#QW%o5?=3afcSTF7t8&25+cHK>~Hz6mHT$_-SN#2-{2Z>E$b3z_MdS5~w zM)H<~oJq1@#H>ZLs8N^b$RN2sArB>4B;*p3Cnw}4p^NoFjojH!+CV}ZB5ea}TS;nU zNs_dQrPLm&g60IRIWheJshfDfL9sPx6CvK^p+0ga%LO8Q%0UJX_iY7oynn$bJhv~0 z5~VCrOQ>o@_)xDG%`ob{PqgT{qLpXFtZTr!1>8c?Vd@e_KPq(}p8gC-5m6d@bgzroJst%4YJV{vWu43tyhXYwD-Mym6YpzaRyREjH=i1o)I{`iN2o7 z&*hrj=^*op<7XA8ebhc-w=K4bd-mJJz52;#9AuDwybrc(o`av*;vWx+Xs%B*QpH!N zerVS=sEO&{6xCAObZ_16mkq`_O`_>>nMuKj(W2K!rBAKO7@6rMEqBR{kbG)S#xX6Z zGBO{{TMxxnKnM^9L;%h4*E64USN3SnIeD0w9&Q$T$QSX4bzj)uk{C=gOrmWd7zsv$ z%@M=nlIzs-Bi7}$V68v7zADTqcN^%As%1Hw(;Kmd+o*5U!+yC>{UGN(tv!A;_ik5~ zq@F4nCG@!EItKSaN1cF2aUoaAA zw!&DW&Xg2oBba8g)LYwvQWx?*m|3abFB!E2X_AM~os{s{K)Q>HiX?lGjlJ|Pn%I^+ zL1TVF{~6Z_I&3#n)WT68j%}ib$I4EhY@}_CG;fdicq@jr*^}|RO8>((nuEc+hX=h= z-?Mep{c9yZe~PW7(W8(}PEYKA`iCZ6+9CL44xWJZC<3=1G=mxS4-AUwPT`eaxha zV_YJk!}djv%~hn%&3n!b%E@c-&GWZ7=CD_G%N0x@Dqcf(PYBr5fc>*ifCtnc7R{pl zS62N}yPdZKPdyIFg@X@jJ1P1d57~zG0Z*u@OQvg0s&&b!;s>Zr6_7`xN+weNGmHhC zSGO&lI+zcOozI?(#O2bt&Qxvd7#iZ*ohj1QkCsu3AVQBOQU+&kT*zWx|{2oP>#>2&sUAhly>M`{!nOTfOdLA zO{mVP!c_Skz>5T)BKZ#F4FH72bQz6)vM>&c+X1%$#skIzZUuPM{nhy~99l_xN^o-$ zN#>xfdb>pk$t+>g%tlX|55=a%AC2lVA}3;61>g!G5AZJFVFJ_bZ)wpZ!gPf6h@1d* z@A1p)t_D6*bF7*%ptr^_A$UV5s|B_nqxXdbA951!kPzEYwbv@FyYeUn{Q0~(b@@GGVe?yQop^i)VT!CuCOkn ze#q@_b3SB@d~E<4B_E1Ouf)o9W~x z33a;r%J>>RfTL|<|Y9*I8^9-?WD z>U^Za{e9Y;5sH5p>C{qh-fAl@f46A*)uQQYcgx4wi)Xm$@fMZANQ3F5V$ul4skYX3 z?S}fSwKN|jlph0r4QHt8LFUc>iyAM-xcNY<_$K+++I+su@-bis20NwI2?b(dCU-yd z2HYyc5H~=X@<$iZy>K?Vz52VDb{+6<1RhO}rvY>U(jVUXK7J4fsx$oj#QV{3k)jU| z5PFXP9jdu)Dcx8vxBbGdY3iOG6SGsF0c+@IjcqsmH7=K=rs2o84U7Ndj+dO7%!|88 zXO;IG>hzvkEv~-avrBtf?c7^H(S2y|bb60p+dIk2MTSYlJoVEwdi4IeCzh2`K2eA* zMXEQfpTgpA0dE6dRQ}kMSpQ4KViu>o3uEE{4*snOP8OO-oH@wns}K1N!{?L5P%@U zybKA4*SeBkhjf=x9VIb7#l5ll_WQ;n5??O7{u{KGIY^JRh4~j6`32TK4CUay7n8xI zL3W^bEL^Gp%uN9{kkZIW+(Ai&);sevj099VsP{1fdOa23656rvj6=H`A9>){cFMb> zbFTJNwXk!tc0}#$EY0M|agF6_+odja=DFF^N$T%9M@}EuPZo&DJOHsUhlj{*=@0p+ zC`5yi`lt`j5<|YBN)IPW=$&vHa7C>>{1ox{tHaamZi}O8T318vaV%<=i!cuHF~CMt zLv^{ULiml>)i;IE1kgsCpWJ7QD`K9VQlAhm)E?ysS6@mT-5;|-jI1A%19dT(| zSNxUxOP%z(zka+dhiS8%7B-zt&A|x$w%~)6E>)nGQzk-cjP@IKQk|r#u}S8}7oNzr zyN|%crnv9H_mcB@qr*v&h>fZFdm~fu^b+kBb?UK`v=ZbJwd?VBEV-5|lf|@?e%kUHctZal!6tbDmplt6&H1Z;DPo0+y;-^0NVjvHkP2bfCmFc0IC3mwtB*m5VHXs)47o50Jx+T zL3#-=6)*)bA8;q&2Y`8i1%Mv{Dgo00(*UoieP?q^$xwpz!$|TBw(cf(vkW%S?`NnB z@>TWf*@Da;LHr3|3!qDVdbWrnHu!s!wIT5Z-}}%pi2>%0L0Xx^Wej|^Y>|+)Z`1*Wd6{F z;_CZ|5yl`I&|!OTL_w$XNSZ|rw*(F4M}U6<423lg*)d2h0FcP?g-bu+p!)rVQCZx9 zrbnxi3-SFOkdEzkS}T zYA=o(&Gax`ZP8%Ju-=~QV7>;h9`FuegL?Dg(rN4`Ul^}IxessBsHigZNK z$V;IVb%t3G2bCFAhE~UM9y_D6yYAvQqU(dbyW--GyPvMRGP67L&H8<_?)lHXNhcX+ z)^E3!|DLKkRp->Hzs|Wg@Bf$ccb_}6E{_{o5!L-V>*Pj4(I$Tr$$9=}G1?#2r|Of%m;&-cpRA9-GvoyNTl8|h zg{4-JuNR83kVS!BrY~fvP#>p9^ny@=)x|iWh0;aQ0k=OY#tRMq>0wcP$|Fkji35#@ zQcSmu@IqyJOiZ9JWp| zX(z3`yP->4A>=(#xH$qL7sn?{%%B}g-O%Iu@Q};jA!h0wqKdY9Gd*X~b2dd~PRNy@ z!9C(#r&+=V#HTWFzqw9tHdE}-W^dM={pVtOv2XAM1< zhFl?!zxz+DpK#Ew+2;WUmazc@bnv;k#n*@-cZjd+tvu2nv5;FVr;$6w0Xj;XkYZrm zS}FXs6#l(@Ow)Nj`c@=p+FhcKNM`XeHB?U{`@Sjq^@rXrELfVSNP z-9hV||2Ua)#9A`EpLVzIlr|v1e`prQQl_m~4!#XTtt4=p`#8Iv%-lm}HjtUy`VtC- zvoC23W`kF3B>e;br?B@&J@FNGzlqEo)W?X;VvE>%${BL%UXr)javI5gTTUl=yDbkB zJH+j_Jd*l%+HxMr0b9-yiOph{-N>bZpe<*U++fS2NN%*{2_(<9<%kesb66vH?xkMc z?u}7zhF?f&UK!z8e4I#DE7y2ko+;FHP|+AEz&*B(jH`I4(MAY#eRHExM?Ef>Q4W zO1|s#;riOJ%daRl1yl#C^-gQEHt!N$q8ou3=AaUC2Q6`@zCi4yz2C*9WU^ks`8-4H zqwMuizXtegkM(DMjv={&l=d*k&q_``)IRBStZ<0C4>-hr{gLmw$RPdvk9KQL-@)XE z!`ijvmf_c&+E!Ja^~GvGjhWuo&Y)~E&TA4)pT|rK$BcHpF)nvv*hQ7a%xDkFV3c+# z4b$DKcN;#h+(x53MQ(?*Q|-?_t~IN?oNpCwMn?;v6%YYL0kP!eoaek#`g_m2S?vzG}vw{tH<+my&GwsIqpPBp?W*Ny08taeCf)neC%Ye#IT{(joq2mgn3@0 zv00A>WsmyN*sEGs^5KH5o~+$8QY#HY+Qmi{TUw~z$oHhl4ou#o%1ZKPc49C?cAB_02Y~G$qshI1yOdrsA&)I)T061r9#r2fQCc`TqjZCFDt5h*gJGr#JrwMS#C;>o zj8K?J5D3RYZC124sq+&`MnXR$5&RBq*Hmq$ulw4o_pPnha zZQdtrrKZS-sQJ0OTfWgr=dHp8}gj`)y(;27om3v zz=3)YQZs=s&2s0IT2)n63dR~~1QaX$B>V6vlmTVQqg7JV!k1?Cy0iv$e|4?)Q+1_! zikE4SP`|IPu)JoX0G1`I=N7t)urXh{#Qx=9044&)17@kng1Iwz0cbIMOfMg~VYsO$ z<;Q-E18!GuEr?MpmM%Q$_BzqKMZI5BkoX0OzDzTxy;}rh@o?kxJyp}A!Ej7&g$`Ti zpmF%VkG{7F%nYNWAz)dQZ=#nCab)2v9U?P|-Q$(O@IG3`yW4fcLmj219*!7Ym(ske z)UjKmV7@>?kK;FE9iB>ccIk6okW9Xn+_G$!YYDsSwEV&ZBHvpW?vDf89TEg~5O7TW zcKISLtghUZm#nLOQM;M<2iJWr$ytCeVi$F!=#S;&eQ-w2tefWyJJiq4 zCMPCtAvo``k_6wDA$<1)r3`kTcbaa5QvMaGZ#0K@#KOBf^!m6SHRMOsWqR8hT99&| zP@k@wmiQR%nVw)IvNlB9WsUS`IK~sq^k}flnu^urNkEdoS1R9uycK|OnI5A#NJei$ zM-^ZiU^>7Ds07g79Of7+3mM^9Q$$b1+hPGbgWHEi!hQI zXwu_>_F$YUMNH1bvfI`5#fX4_-Z?L_cN}uV9=rK71-F?@##o;R)nnq$!NM)iF zTam}*0W6pqMm+l*{}%fH3~&l?1Mmcabsy~Ay{qotu*v%##;kyNZ}0_K^=hZRts{;O!?f|?_(k^=tpZLagg_Okj$8uVokC{ka-KP!wWE8oC^F45L#7cLk% zpjx(%w=&xvv;k9+C%4bk(s`>I-Gg83D0kPv`!!aP`WF&?PK%it?Xrzn77tT8et`NZ zzqQGRu&9+ELu-_k0^T5*=`Xjd`N25}Ce~4OVvhVZ;5NV)fK&*cr>1Y@&|NYeIQYy2 z4;_@XPCp&wWtwPeA?x`2*d>;G zkc1nfA`r128k833eknTsuMfV2w07kV|MdkD<5=Ac1WT3YoaSA>m5 z8K!g;jJL@^FcJN zG3UVFtd@4v(~H32j@O*paJ8|kDmU}H;1d0AbL`C&S^-Jw`t5ni3tca{bC?QSsLQGe zAF23V+qFwnLhsaGQmghAQ&d~`&C{CIxqY+!Or8&+%;eog61@($phE(NW;XQkHA5gN zEGSA=3_peRZ-BP}Ni{1`ofuq+EJpEBABN5)07v>J#3mO_oRT>#5NM194I>bcW$0u& zvZ?iGt^uTB3di&inrjJ6PrRc&qRU&+0j@hK%Y2fUw@je}2gw2DJ15tnxd*`hUV&7M zHNOuDH`=OKNWOBV(t9Q(_-dzO^S>7(i#1$%c>ULDEpwP2>xlA4j{FVQ?nUQ_fmO?} zzN+}kq5>{e0%|gVA<{O+s_PrZl~^yXpJ5Had>4(JCZIA^j52lW-QRX;SCXF{_{d3T z{?2_h+AC^I?;P!jTGd;g!%^d;dlV}iRz1CiUiNa9I@3G8Xy`a85s6vBul}yLNPAuV zw%1Ocx56{P%WCrd=kNl5|1HkGm)49UO$Em>+bNer4?!?MQvOsqbfi+drd~Ya8^9G# zOK#Gz-Zo~FWV%I|UW_jSUKI$cL##9qRB9DtLOsK&x$Qu0$f3C|DJ>%$NTPzWbaXrrX5ZmJ67)YHeihs zHRE(if%V$InhcrlmbP$=zB}k|?TGD-6RYV67OSb+$Ery^OqpVaEJ%)dXtdLNgyzc~ z$*PlA)9HR@oGv8A8|Uh@LKQpxuq~IV)o0$dFw(%Xalj`uog#Z0t2_=@oUNU5 zhdTcFwqm|8uTtN6r|gC8wFbR^9)EnZ`t;xH9&3 zo9I&zNkaZuJ@`~{4#)7%(GCC(tDihoN~ik4Q**SO-%h1O^tOgbo2wfYUYKnS>I=>_rf`?S51GW$f}L6U;)5Bwe1;@=gwyiYdcihv+K$H zwr9)MA0qk~*jSI_YJPFA`)H=cBd-K!nl64l%>dp$}v=vjc%(EY=ne#=~tfRN9Le zdKAzB*blf0coPr@{2cHYU=N_&fyMC#E4hF(rTyqjrQiltc4>0?J<#Dw#ifGtDigT{ z+DxZcRO_XJ;{J2}JbfX3@N`7<#qw#=q5mDmY<2chgM0c1jw+R&tjem@-gGR#?#g-J qU4^7vn_RDD=W3JA6y9*qvqkLSh5vgT2+H43&tOVd{4X4p|x^{b+xZPwf@9rD-O%?did=e_OO3E zMOX1D$A^V7b_?LlVKF=vmf=gTF%YsWyV!oZPG<3FQ@ MSbbO1m4JkVKRHhah5!Hn delta 1324 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 m)?UYF2KsZqS>Ao6t-mGI(6>_It==z *6{fn{v3I88P@f7U< delta 13951 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 diff --git a/Backend/venv/lib/python3.12/site-packages/pydantic/v1/__pycache__/typing.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/pydantic/v1/__pycache__/typing.cpython-312.pyc index 39ae05a091b747f7f288265f9307a4585b60122b..152c5db2a0fb2d66041db3637d4fd946448fee70 100644 GIT binary patch delta 5365 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 HmH_?_Rko7T delta 5780 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 diff --git a/Backend/venv/lib/python3.12/site-packages/pydantic/v1/__pycache__/utils.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/pydantic/v1/__pycache__/utils.cpython-312.pyc index 9be57792418d1eab2f3cf1f6d178af53ef6c8468..8550e64b639cb2706e5f560fc8246668d6f6ad9e 100644 GIT binary patch delta 7180 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 aavjTq*JSo?366vrgi%o>kt} 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 DP9`!d diff --git a/Backend/venv/lib/python3.12/site-packages/pydantic/v1/__pycache__/version.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/pydantic/v1/__pycache__/version.cpython-312.pyc index 2a4600b841135eca4071063f4e23f1c2dcb523f2..a98c06eaa863fefdbf00b0b9fe5fb7423cd3d119 100644 GIT binary patch delta 26 gcmZ3(zlNXtG%qg~0}z-x8&Bju&SYr3@yZQ009HN+NB{r; delta 26 gcmZ3(zlNXtG%qg~0}#YX=}zQ6&SYe`@yZQ009GLfK>z>% diff --git a/Backend/venv/lib/python3.12/site-packages/pydantic/v1/_hypothesis_plugin.py b/Backend/venv/lib/python3.12/site-packages/pydantic/v1/_hypothesis_plugin.py index b62234d5..0c529620 100644 --- a/Backend/venv/lib/python3.12/site-packages/pydantic/v1/_hypothesis_plugin.py +++ b/Backend/venv/lib/python3.12/site-packages/pydantic/v1/_hypothesis_plugin.py @@ -35,7 +35,7 @@ import hypothesis.strategies as st import pydantic import pydantic.color import pydantic.types -from pydantic.v1.utils import lenient_issubclass +from pydantic.utils import lenient_issubclass # FilePath and DirectoryPath are explicitly unsupported, as we'd have to create # them on-disk, and that's unsafe in general without being told *where* to do so. diff --git a/Backend/venv/lib/python3.12/site-packages/pydantic/v1/annotated_types.py b/Backend/venv/lib/python3.12/site-packages/pydantic/v1/annotated_types.py index d9eaaafd..d333457f 100644 --- a/Backend/venv/lib/python3.12/site-packages/pydantic/v1/annotated_types.py +++ b/Backend/venv/lib/python3.12/site-packages/pydantic/v1/annotated_types.py @@ -1,9 +1,9 @@ import sys from typing import TYPE_CHECKING, Any, Dict, FrozenSet, NamedTuple, Type -from pydantic.v1.fields import Required -from pydantic.v1.main import BaseModel, create_model -from pydantic.v1.typing import is_typeddict, is_typeddict_special +from .fields import Required +from .main import BaseModel, create_model +from .typing import is_typeddict, is_typeddict_special if TYPE_CHECKING: from typing_extensions import TypedDict diff --git a/Backend/venv/lib/python3.12/site-packages/pydantic/v1/class_validators.py b/Backend/venv/lib/python3.12/site-packages/pydantic/v1/class_validators.py index 2f68fc86..71e66509 100644 --- a/Backend/venv/lib/python3.12/site-packages/pydantic/v1/class_validators.py +++ b/Backend/venv/lib/python3.12/site-packages/pydantic/v1/class_validators.py @@ -5,12 +5,12 @@ from itertools import chain from types import FunctionType from typing import TYPE_CHECKING, Any, Callable, Dict, Iterable, List, Optional, Set, Tuple, Type, Union, overload -from pydantic.v1.errors import ConfigError -from pydantic.v1.typing import AnyCallable -from pydantic.v1.utils import ROOT_KEY, in_ipython +from .errors import ConfigError +from .typing import AnyCallable +from .utils import ROOT_KEY, in_ipython if TYPE_CHECKING: - from pydantic.v1.typing import AnyClassMethod + from .typing import AnyClassMethod class Validator: @@ -36,9 +36,9 @@ class Validator: if TYPE_CHECKING: from inspect import Signature - from pydantic.v1.config import BaseConfig - from pydantic.v1.fields import ModelField - from pydantic.v1.types import ModelOrDc + from .config import BaseConfig + from .fields import ModelField + from .types import ModelOrDc ValidatorCallable = Callable[[Optional[ModelOrDc], Any, Dict[str, Any], ModelField, Type[BaseConfig]], Any] ValidatorsList = List[ValidatorCallable] diff --git a/Backend/venv/lib/python3.12/site-packages/pydantic/v1/color.py b/Backend/venv/lib/python3.12/site-packages/pydantic/v1/color.py index b0bbf78f..6fdc9fb1 100644 --- a/Backend/venv/lib/python3.12/site-packages/pydantic/v1/color.py +++ b/Backend/venv/lib/python3.12/site-packages/pydantic/v1/color.py @@ -12,11 +12,11 @@ import re from colorsys import hls_to_rgb, rgb_to_hls from typing import TYPE_CHECKING, Any, Dict, Optional, Tuple, Union, cast -from pydantic.v1.errors import ColorError -from pydantic.v1.utils import Representation, almost_equal_floats +from .errors import ColorError +from .utils import Representation, almost_equal_floats if TYPE_CHECKING: - from pydantic.v1.typing import CallableGenerator, ReprArgs + from .typing import CallableGenerator, ReprArgs ColorTuple = Union[Tuple[int, int, int], Tuple[int, int, int, float]] ColorType = Union[ColorTuple, str] diff --git a/Backend/venv/lib/python3.12/site-packages/pydantic/v1/config.py b/Backend/venv/lib/python3.12/site-packages/pydantic/v1/config.py index 18f7c999..a25973af 100644 --- a/Backend/venv/lib/python3.12/site-packages/pydantic/v1/config.py +++ b/Backend/venv/lib/python3.12/site-packages/pydantic/v1/config.py @@ -4,15 +4,15 @@ from typing import TYPE_CHECKING, Any, Callable, Dict, ForwardRef, Optional, Tup from typing_extensions import Literal, Protocol -from pydantic.v1.typing import AnyArgTCallable, AnyCallable -from pydantic.v1.utils import GetterDict -from pydantic.v1.version import compiled +from .typing import AnyArgTCallable, AnyCallable +from .utils import GetterDict +from .version import compiled if TYPE_CHECKING: from typing import overload - from pydantic.v1.fields import ModelField - from pydantic.v1.main import BaseModel + from .fields import ModelField + from .main import BaseModel ConfigType = Type['BaseConfig'] diff --git a/Backend/venv/lib/python3.12/site-packages/pydantic/v1/dataclasses.py b/Backend/venv/lib/python3.12/site-packages/pydantic/v1/dataclasses.py index bd167029..86bad1e6 100644 --- a/Backend/venv/lib/python3.12/site-packages/pydantic/v1/dataclasses.py +++ b/Backend/venv/lib/python3.12/site-packages/pydantic/v1/dataclasses.py @@ -36,28 +36,21 @@ import dataclasses import sys from contextlib import contextmanager from functools import wraps - -try: - from functools import cached_property -except ImportError: - # cached_property available only for python3.8+ - pass - from typing import TYPE_CHECKING, Any, Callable, ClassVar, Dict, Generator, Optional, Type, TypeVar, Union, overload from typing_extensions import dataclass_transform -from pydantic.v1.class_validators import gather_all_validators -from pydantic.v1.config import BaseConfig, ConfigDict, Extra, get_config -from pydantic.v1.error_wrappers import ValidationError -from pydantic.v1.errors import DataclassTypeError -from pydantic.v1.fields import Field, FieldInfo, Required, Undefined -from pydantic.v1.main import create_model, validate_model -from pydantic.v1.utils import ClassAttribute +from .class_validators import gather_all_validators +from .config import BaseConfig, ConfigDict, Extra, get_config +from .error_wrappers import ValidationError +from .errors import DataclassTypeError +from .fields import Field, FieldInfo, Required, Undefined +from .main import create_model, validate_model +from .utils import ClassAttribute if TYPE_CHECKING: - from pydantic.v1.main import BaseModel - from pydantic.v1.typing import CallableGenerator, NoArgAnyCallable + from .main import BaseModel + from .typing import CallableGenerator, NoArgAnyCallable DataclassT = TypeVar('DataclassT', bound='Dataclass') @@ -416,17 +409,6 @@ def create_pydantic_model_from_dataclass( return model -if sys.version_info >= (3, 8): - - def _is_field_cached_property(obj: 'Dataclass', k: str) -> bool: - return isinstance(getattr(type(obj), k, None), cached_property) - -else: - - def _is_field_cached_property(obj: 'Dataclass', k: str) -> bool: - return False - - def _dataclass_validate_values(self: 'Dataclass') -> None: # validation errors can occur if this function is called twice on an already initialised dataclass. # for example if Extra.forbid is enabled, it would consider __pydantic_initialised__ an invalid extra property @@ -435,13 +417,9 @@ def _dataclass_validate_values(self: 'Dataclass') -> None: if getattr(self, '__pydantic_has_field_info_default__', False): # We need to remove `FieldInfo` values since they are not valid as input # It's ok to do that because they are obviously the default values! - input_data = { - k: v - for k, v in self.__dict__.items() - if not (isinstance(v, FieldInfo) or _is_field_cached_property(self, k)) - } + input_data = {k: v for k, v in self.__dict__.items() if not isinstance(v, FieldInfo)} else: - input_data = {k: v for k, v in self.__dict__.items() if not _is_field_cached_property(self, k)} + input_data = self.__dict__ d, _, validation_error = validate_model(self.__pydantic_model__, input_data, cls=self.__class__) if validation_error: raise validation_error diff --git a/Backend/venv/lib/python3.12/site-packages/pydantic/v1/datetime_parse.py b/Backend/venv/lib/python3.12/site-packages/pydantic/v1/datetime_parse.py index a7598fc6..cfd54593 100644 --- a/Backend/venv/lib/python3.12/site-packages/pydantic/v1/datetime_parse.py +++ b/Backend/venv/lib/python3.12/site-packages/pydantic/v1/datetime_parse.py @@ -18,7 +18,7 @@ import re from datetime import date, datetime, time, timedelta, timezone from typing import Dict, Optional, Type, Union -from pydantic.v1 import errors +from . import errors date_expr = r'(?P\d{4})-(?P\d{1,2})-(?P\d{1,2})' time_expr = ( diff --git a/Backend/venv/lib/python3.12/site-packages/pydantic/v1/decorator.py b/Backend/venv/lib/python3.12/site-packages/pydantic/v1/decorator.py index 2c7c2c2f..089aab65 100644 --- a/Backend/venv/lib/python3.12/site-packages/pydantic/v1/decorator.py +++ b/Backend/venv/lib/python3.12/site-packages/pydantic/v1/decorator.py @@ -1,17 +1,17 @@ from functools import wraps from typing import TYPE_CHECKING, Any, Callable, Dict, List, Mapping, Optional, Tuple, Type, TypeVar, Union, overload -from pydantic.v1 import validator -from pydantic.v1.config import Extra -from pydantic.v1.errors import ConfigError -from pydantic.v1.main import BaseModel, create_model -from pydantic.v1.typing import get_all_type_hints -from pydantic.v1.utils import to_camel +from . import validator +from .config import Extra +from .errors import ConfigError +from .main import BaseModel, create_model +from .typing import get_all_type_hints +from .utils import to_camel __all__ = ('validate_arguments',) if TYPE_CHECKING: - from pydantic.v1.typing import AnyCallable + from .typing import AnyCallable AnyCallableT = TypeVar('AnyCallableT', bound=AnyCallable) ConfigType = Union[None, Type[Any], Dict[str, Any]] diff --git a/Backend/venv/lib/python3.12/site-packages/pydantic/v1/env_settings.py b/Backend/venv/lib/python3.12/site-packages/pydantic/v1/env_settings.py index 5f6f2175..6c446e51 100644 --- a/Backend/venv/lib/python3.12/site-packages/pydantic/v1/env_settings.py +++ b/Backend/venv/lib/python3.12/site-packages/pydantic/v1/env_settings.py @@ -3,12 +3,12 @@ import warnings from pathlib import Path from typing import AbstractSet, Any, Callable, ClassVar, Dict, List, Mapping, Optional, Tuple, Type, Union -from pydantic.v1.config import BaseConfig, Extra -from pydantic.v1.fields import ModelField -from pydantic.v1.main import BaseModel -from pydantic.v1.types import JsonWrapper -from pydantic.v1.typing import StrPath, display_as_type, get_origin, is_union -from pydantic.v1.utils import deep_update, lenient_issubclass, path_type, sequence_like +from .config import BaseConfig, Extra +from .fields import ModelField +from .main import BaseModel +from .types import JsonWrapper +from .typing import StrPath, display_as_type, get_origin, is_union +from .utils import deep_update, lenient_issubclass, path_type, sequence_like env_file_sentinel = str(object()) diff --git a/Backend/venv/lib/python3.12/site-packages/pydantic/v1/error_wrappers.py b/Backend/venv/lib/python3.12/site-packages/pydantic/v1/error_wrappers.py index bc7f2631..5d3204f4 100644 --- a/Backend/venv/lib/python3.12/site-packages/pydantic/v1/error_wrappers.py +++ b/Backend/venv/lib/python3.12/site-packages/pydantic/v1/error_wrappers.py @@ -1,15 +1,15 @@ import json from typing import TYPE_CHECKING, Any, Dict, Generator, List, Optional, Sequence, Tuple, Type, Union -from pydantic.v1.json import pydantic_encoder -from pydantic.v1.utils import Representation +from .json import pydantic_encoder +from .utils import Representation if TYPE_CHECKING: from typing_extensions import TypedDict - from pydantic.v1.config import BaseConfig - from pydantic.v1.types import ModelOrDc - from pydantic.v1.typing import ReprArgs + from .config import BaseConfig + from .types import ModelOrDc + from .typing import ReprArgs Loc = Tuple[Union[int, str], ...] @@ -101,6 +101,7 @@ def flatten_errors( ) -> Generator['ErrorDict', None, None]: for error in errors: if isinstance(error, ErrorWrapper): + if loc: error_loc = loc + error.loc_tuple() else: diff --git a/Backend/venv/lib/python3.12/site-packages/pydantic/v1/errors.py b/Backend/venv/lib/python3.12/site-packages/pydantic/v1/errors.py index 6e864425..7bdafdd1 100644 --- a/Backend/venv/lib/python3.12/site-packages/pydantic/v1/errors.py +++ b/Backend/venv/lib/python3.12/site-packages/pydantic/v1/errors.py @@ -2,12 +2,12 @@ from decimal import Decimal from pathlib import Path from typing import TYPE_CHECKING, Any, Callable, Sequence, Set, Tuple, Type, Union -from pydantic.v1.typing import display_as_type +from .typing import display_as_type if TYPE_CHECKING: - from pydantic.v1.typing import DictStrAny + from .typing import DictStrAny -# explicitly state exports to avoid "from pydantic.v1.errors import *" also importing Decimal, Path etc. +# explicitly state exports to avoid "from .errors import *" also importing Decimal, Path etc. __all__ = ( 'PydanticTypeError', 'PydanticValueError', diff --git a/Backend/venv/lib/python3.12/site-packages/pydantic/v1/fields.py b/Backend/venv/lib/python3.12/site-packages/pydantic/v1/fields.py index 002b60cd..b1856c10 100644 --- a/Backend/venv/lib/python3.12/site-packages/pydantic/v1/fields.py +++ b/Backend/venv/lib/python3.12/site-packages/pydantic/v1/fields.py @@ -28,12 +28,12 @@ from typing import ( from typing_extensions import Annotated, Final -from pydantic.v1 import errors as errors_ -from pydantic.v1.class_validators import Validator, make_generic_validator, prep_validators -from pydantic.v1.error_wrappers import ErrorWrapper -from pydantic.v1.errors import ConfigError, InvalidDiscriminator, MissingDiscriminator, NoneIsNotAllowedError -from pydantic.v1.types import Json, JsonWrapper -from pydantic.v1.typing import ( +from . import errors as errors_ +from .class_validators import Validator, make_generic_validator, prep_validators +from .error_wrappers import ErrorWrapper +from .errors import ConfigError, InvalidDiscriminator, MissingDiscriminator, NoneIsNotAllowedError +from .types import Json, JsonWrapper +from .typing import ( NoArgAnyCallable, convert_generics, display_as_type, @@ -48,7 +48,7 @@ from pydantic.v1.typing import ( is_union, new_type_supertype, ) -from pydantic.v1.utils import ( +from .utils import ( PyObjectStr, Representation, ValueItems, @@ -59,7 +59,7 @@ from pydantic.v1.utils import ( sequence_like, smart_deepcopy, ) -from pydantic.v1.validators import constant_validator, dict_validator, find_validators, validate_json +from .validators import constant_validator, dict_validator, find_validators, validate_json Required: Any = Ellipsis @@ -83,11 +83,11 @@ class UndefinedType: Undefined = UndefinedType() if TYPE_CHECKING: - from pydantic.v1.class_validators import ValidatorsList - from pydantic.v1.config import BaseConfig - from pydantic.v1.error_wrappers import ErrorList - from pydantic.v1.types import ModelOrDc - from pydantic.v1.typing import AbstractSetIntStr, MappingIntStrAny, ReprArgs + from .class_validators import ValidatorsList + from .config import BaseConfig + from .error_wrappers import ErrorList + from .types import ModelOrDc + from .typing import AbstractSetIntStr, MappingIntStrAny, ReprArgs ValidateReturn = Tuple[Optional[Any], Optional[ErrorList]] LocStr = Union[Tuple[Union[int, str], ...], str] @@ -178,6 +178,7 @@ class FieldInfo(Representation): self.extra = kwargs def __repr_args__(self) -> 'ReprArgs': + field_defaults_to_hide: Dict[str, Any] = { 'repr': True, **self.__field_constraints__, @@ -404,6 +405,7 @@ class ModelField(Representation): alias: Optional[str] = None, field_info: Optional[FieldInfo] = None, ) -> None: + self.name: str = name self.has_alias: bool = alias is not None self.alias: str = alias if alias is not None else name @@ -490,7 +492,7 @@ class ModelField(Representation): class_validators: Optional[Dict[str, Validator]], config: Type['BaseConfig'], ) -> 'ModelField': - from pydantic.v1.schema import get_annotation_from_field_info + from .schema import get_annotation_from_field_info field_info, value = cls._get_field_info(name, annotation, value, config) required: 'BoolUndefined' = Undefined @@ -850,6 +852,7 @@ class ModelField(Representation): def validate( self, v: Any, values: Dict[str, Any], *, loc: 'LocStr', cls: Optional['ModelOrDc'] = None ) -> 'ValidateReturn': + assert self.type_.__class__ is not DeferredType if self.type_.__class__ is ForwardRef: @@ -1160,7 +1163,7 @@ class ModelField(Representation): """ Whether the field is "complex" eg. env variables should be parsed as JSON. """ - from pydantic.v1.main import BaseModel + from .main import BaseModel return ( self.shape != SHAPE_SINGLETON diff --git a/Backend/venv/lib/python3.12/site-packages/pydantic/v1/generics.py b/Backend/venv/lib/python3.12/site-packages/pydantic/v1/generics.py index 9a69f2b3..a75b6b98 100644 --- a/Backend/venv/lib/python3.12/site-packages/pydantic/v1/generics.py +++ b/Backend/venv/lib/python3.12/site-packages/pydantic/v1/generics.py @@ -22,12 +22,12 @@ from weakref import WeakKeyDictionary, WeakValueDictionary from typing_extensions import Annotated, Literal as ExtLiteral -from pydantic.v1.class_validators import gather_all_validators -from pydantic.v1.fields import DeferredType -from pydantic.v1.main import BaseModel, create_model -from pydantic.v1.types import JsonWrapper -from pydantic.v1.typing import display_as_type, get_all_type_hints, get_args, get_origin, typing_base -from pydantic.v1.utils import all_identical, lenient_issubclass +from .class_validators import gather_all_validators +from .fields import DeferredType +from .main import BaseModel, create_model +from .types import JsonWrapper +from .typing import display_as_type, get_all_type_hints, get_args, get_origin, typing_base +from .utils import all_identical, lenient_issubclass if sys.version_info >= (3, 10): from typing import _UnionGenericAlias diff --git a/Backend/venv/lib/python3.12/site-packages/pydantic/v1/json.py b/Backend/venv/lib/python3.12/site-packages/pydantic/v1/json.py index 41d0d5fc..b358b850 100644 --- a/Backend/venv/lib/python3.12/site-packages/pydantic/v1/json.py +++ b/Backend/venv/lib/python3.12/site-packages/pydantic/v1/json.py @@ -9,9 +9,9 @@ from types import GeneratorType from typing import Any, Callable, Dict, Type, Union from uuid import UUID -from pydantic.v1.color import Color -from pydantic.v1.networks import NameEmail -from pydantic.v1.types import SecretBytes, SecretStr +from .color import Color +from .networks import NameEmail +from .types import SecretBytes, SecretStr __all__ = 'pydantic_encoder', 'custom_pydantic_encoder', 'timedelta_isoformat' @@ -72,7 +72,7 @@ ENCODERS_BY_TYPE: Dict[Type[Any], Callable[[Any], Any]] = { def pydantic_encoder(obj: Any) -> Any: from dataclasses import asdict, is_dataclass - from pydantic.v1.main import BaseModel + from .main import BaseModel if isinstance(obj, BaseModel): return obj.dict() diff --git a/Backend/venv/lib/python3.12/site-packages/pydantic/v1/main.py b/Backend/venv/lib/python3.12/site-packages/pydantic/v1/main.py index 8000967e..683f3f88 100644 --- a/Backend/venv/lib/python3.12/site-packages/pydantic/v1/main.py +++ b/Backend/venv/lib/python3.12/site-packages/pydantic/v1/main.py @@ -26,11 +26,11 @@ from typing import ( from typing_extensions import dataclass_transform -from pydantic.v1.class_validators import ValidatorGroup, extract_root_validators, extract_validators, inherit_validators -from pydantic.v1.config import BaseConfig, Extra, inherit_config, prepare_config -from pydantic.v1.error_wrappers import ErrorWrapper, ValidationError -from pydantic.v1.errors import ConfigError, DictError, ExtraError, MissingError -from pydantic.v1.fields import ( +from .class_validators import ValidatorGroup, extract_root_validators, extract_validators, inherit_validators +from .config import BaseConfig, Extra, inherit_config, prepare_config +from .error_wrappers import ErrorWrapper, ValidationError +from .errors import ConfigError, DictError, ExtraError, MissingError +from .fields import ( MAPPING_LIKE_SHAPES, Field, ModelField, @@ -39,11 +39,11 @@ from pydantic.v1.fields import ( Undefined, is_finalvar_with_default_val, ) -from pydantic.v1.json import custom_pydantic_encoder, pydantic_encoder -from pydantic.v1.parse import Protocol, load_file, load_str_bytes -from pydantic.v1.schema import default_ref_template, model_schema -from pydantic.v1.types import PyObject, StrBytes -from pydantic.v1.typing import ( +from .json import custom_pydantic_encoder, pydantic_encoder +from .parse import Protocol, load_file, load_str_bytes +from .schema import default_ref_template, model_schema +from .types import PyObject, StrBytes +from .typing import ( AnyCallable, get_args, get_origin, @@ -53,7 +53,7 @@ from pydantic.v1.typing import ( resolve_annotations, update_model_forward_refs, ) -from pydantic.v1.utils import ( +from .utils import ( DUNDER_ATTRIBUTES, ROOT_KEY, ClassAttribute, @@ -73,9 +73,9 @@ from pydantic.v1.utils import ( if TYPE_CHECKING: from inspect import Signature - from pydantic.v1.class_validators import ValidatorListDict - from pydantic.v1.types import ModelOrDc - from pydantic.v1.typing import ( + from .class_validators import ValidatorListDict + from .types import ModelOrDc + from .typing import ( AbstractSetIntStr, AnyClassMethod, CallableGenerator, @@ -282,12 +282,6 @@ class ModelMetaclass(ABCMeta): cls = super().__new__(mcs, name, bases, new_namespace, **kwargs) # set __signature__ attr only for model class, but not for its instances cls.__signature__ = ClassAttribute('__signature__', generate_model_signature(cls.__init__, fields, config)) - - if not _is_base_model_class_defined: - # Cython does not understand the `if TYPE_CHECKING:` condition in the - # BaseModel's body (where annotations are set), so clear them manually: - getattr(cls, '__annotations__', {}).clear() - if resolve_forward_refs: cls.__try_update_forward_refs__() @@ -307,7 +301,7 @@ class ModelMetaclass(ABCMeta): See #3829 and python/cpython#92810 """ - return hasattr(instance, '__post_root_validators__') and super().__instancecheck__(instance) + return hasattr(instance, '__fields__') and super().__instancecheck__(instance) object_setattr = object.__setattr__ @@ -675,7 +669,7 @@ class BaseModel(Representation, metaclass=ModelMetaclass): def schema_json( cls, *, by_alias: bool = True, ref_template: str = default_ref_template, **dumps_kwargs: Any ) -> str: - from pydantic.v1.json import pydantic_encoder + from .json import pydantic_encoder return cls.__config__.json_dumps( cls.schema(by_alias=by_alias, ref_template=ref_template), default=pydantic_encoder, **dumps_kwargs @@ -743,6 +737,7 @@ class BaseModel(Representation, metaclass=ModelMetaclass): exclude_defaults: bool, exclude_none: bool, ) -> Any: + if isinstance(v, BaseModel): if to_dict: v_dict = v.dict( @@ -835,6 +830,7 @@ class BaseModel(Representation, metaclass=ModelMetaclass): exclude_defaults: bool = False, exclude_none: bool = False, ) -> 'TupleGenerator': + # Merge field set excludes with explicit exclude parameter with explicit overriding field set options. # The extra "is not None" guards are not logically necessary but optimizes performance for the simple case. if exclude is not None or self.__exclude_fields__ is not None: diff --git a/Backend/venv/lib/python3.12/site-packages/pydantic/v1/mypy.py b/Backend/venv/lib/python3.12/site-packages/pydantic/v1/mypy.py index 0a775692..1d6d5ae2 100644 --- a/Backend/venv/lib/python3.12/site-packages/pydantic/v1/mypy.py +++ b/Backend/venv/lib/python3.12/site-packages/pydantic/v1/mypy.py @@ -57,7 +57,6 @@ from mypy.types import ( Type, TypeOfAny, TypeType, - TypeVarId, TypeVarType, UnionType, get_proper_type, @@ -66,7 +65,7 @@ from mypy.typevars import fill_typevars from mypy.util import get_unique_redefinition_name from mypy.version import __version__ as mypy_version -from pydantic.v1.utils import is_valid_field +from pydantic.utils import is_valid_field try: from mypy.types import TypeVarDef # type: ignore[attr-defined] @@ -209,14 +208,14 @@ class PydanticPlugin(Plugin): default_factory_type = default_factory_type.items()[0] # type: ignore[operator] if isinstance(default_factory_type, CallableType): - ret_type = get_proper_type(default_factory_type.ret_type) - if ( - isinstance(ret_type, Instance) - and ret_type.args - and all(isinstance(arg, TypeVarType) for arg in ret_type.args) - ): - # Looks like the default factory is a type like `list` or `dict`, replace all args with `Any` - ret_type = ret_type.copy_modified(args=[default_any_type] * len(ret_type.args)) + ret_type = default_factory_type.ret_type + # mypy doesn't think `ret_type` has `args`, you'd think mypy should know, + # add this check in case it varies by version + args = getattr(ret_type, 'args', None) + if args: + if all(isinstance(arg, TypeVarType) for arg in args): + # Looks like the default factory is a type like `list` or `dict`, replace all args with `Any` + ret_type.args = tuple(default_any_type for _ in args) # type: ignore[attr-defined] return ret_type return default_any_type @@ -499,11 +498,7 @@ class PydanticModelTransformer: tvd = TypeVarType( self_tvar_name, tvar_fullname, - ( - TypeVarId(-1, namespace=ctx.cls.fullname + '.construct') - if MYPY_VERSION_TUPLE >= (1, 11) - else TypeVarId(-1) - ), + -1, [], obj_type, AnyType(TypeOfAny.from_omitted_generics), # type: ignore[arg-type] @@ -863,9 +858,9 @@ def add_method( arg_kinds.append(arg.kind) function_type = ctx.api.named_type(f'{BUILTINS_NAME}.function') - signature = CallableType( - arg_types, arg_kinds, arg_names, return_type, function_type, variables=[tvar_def] if tvar_def else None - ) + signature = CallableType(arg_types, arg_kinds, arg_names, return_type, function_type) + if tvar_def: + signature.variables = [tvar_def] func = FuncDef(name, args, Block([PassStmt()])) func.info = info diff --git a/Backend/venv/lib/python3.12/site-packages/pydantic/v1/networks.py b/Backend/venv/lib/python3.12/site-packages/pydantic/v1/networks.py index ba07b748..cfebe588 100644 --- a/Backend/venv/lib/python3.12/site-packages/pydantic/v1/networks.py +++ b/Backend/venv/lib/python3.12/site-packages/pydantic/v1/networks.py @@ -27,17 +27,17 @@ from typing import ( no_type_check, ) -from pydantic.v1 import errors -from pydantic.v1.utils import Representation, update_not_none -from pydantic.v1.validators import constr_length_validator, str_validator +from . import errors +from .utils import Representation, update_not_none +from .validators import constr_length_validator, str_validator if TYPE_CHECKING: import email_validator from typing_extensions import TypedDict - from pydantic.v1.config import BaseConfig - from pydantic.v1.fields import ModelField - from pydantic.v1.typing import AnyCallable + from .config import BaseConfig + from .fields import ModelField + from .typing import AnyCallable CallableGenerator = Generator[AnyCallable, None, None] diff --git a/Backend/venv/lib/python3.12/site-packages/pydantic/v1/parse.py b/Backend/venv/lib/python3.12/site-packages/pydantic/v1/parse.py index 431d75a6..7ac330ca 100644 --- a/Backend/venv/lib/python3.12/site-packages/pydantic/v1/parse.py +++ b/Backend/venv/lib/python3.12/site-packages/pydantic/v1/parse.py @@ -4,7 +4,7 @@ from enum import Enum from pathlib import Path from typing import Any, Callable, Union -from pydantic.v1.types import StrBytes +from .types import StrBytes class Protocol(str, Enum): diff --git a/Backend/venv/lib/python3.12/site-packages/pydantic/v1/schema.py b/Backend/venv/lib/python3.12/site-packages/pydantic/v1/schema.py index a91fe2cd..31e8ae37 100644 --- a/Backend/venv/lib/python3.12/site-packages/pydantic/v1/schema.py +++ b/Backend/venv/lib/python3.12/site-packages/pydantic/v1/schema.py @@ -31,7 +31,7 @@ from uuid import UUID from typing_extensions import Annotated, Literal -from pydantic.v1.fields import ( +from .fields import ( MAPPING_LIKE_SHAPES, SHAPE_DEQUE, SHAPE_FROZENSET, @@ -46,9 +46,9 @@ from pydantic.v1.fields import ( FieldInfo, ModelField, ) -from pydantic.v1.json import pydantic_encoder -from pydantic.v1.networks import AnyUrl, EmailStr -from pydantic.v1.types import ( +from .json import pydantic_encoder +from .networks import AnyUrl, EmailStr +from .types import ( ConstrainedDecimal, ConstrainedFloat, ConstrainedFrozenSet, @@ -69,7 +69,7 @@ from pydantic.v1.types import ( conset, constr, ) -from pydantic.v1.typing import ( +from .typing import ( all_literal_values, get_args, get_origin, @@ -80,11 +80,11 @@ from pydantic.v1.typing import ( is_none_type, is_union, ) -from pydantic.v1.utils import ROOT_KEY, get_model, lenient_issubclass +from .utils import ROOT_KEY, get_model, lenient_issubclass if TYPE_CHECKING: - from pydantic.v1.dataclasses import Dataclass - from pydantic.v1.main import BaseModel + from .dataclasses import Dataclass + from .main import BaseModel default_prefix = '#/definitions/' default_ref_template = '#/definitions/{model}' @@ -198,6 +198,7 @@ def model_schema( def get_field_info_schema(field: ModelField, schema_overrides: bool = False) -> Tuple[Dict[str, Any], bool]: + # If no title is explicitly set, we don't set title in the schema for enums. # The behaviour is the same as `BaseModel` reference, where the default title # is in the definitions part of the schema. @@ -378,7 +379,7 @@ def get_flat_models_from_field(field: ModelField, known_models: TypeModelSet) -> :param known_models: used to solve circular references :return: a set with the model used in the declaration for this field, if any, and all its sub-models """ - from pydantic.v1.main import BaseModel + from .main import BaseModel flat_models: TypeModelSet = set() @@ -445,7 +446,7 @@ def field_type_schema( Take a single ``field`` and generate the schema for its type only, not including additional information as title, etc. Also return additional schema definitions, from sub-models. """ - from pydantic.v1.main import BaseModel # noqa: F811 + from .main import BaseModel # noqa: F811 definitions = {} nested_models: Set[str] = set() @@ -738,7 +739,7 @@ def field_singleton_sub_fields_schema( discriminator_models_refs[discriminator_value] = discriminator_model_ref['$ref'] s['discriminator'] = { - 'propertyName': field.discriminator_alias if by_alias else field.discriminator_key, + 'propertyName': field.discriminator_alias, 'mapping': discriminator_models_refs, } @@ -838,7 +839,7 @@ def field_singleton_schema( # noqa: C901 (ignore complexity) Take a single Pydantic ``ModelField``, and return its schema and any additional definitions from sub-models. """ - from pydantic.v1.main import BaseModel + from .main import BaseModel definitions: Dict[str, Any] = {} nested_models: Set[str] = set() @@ -974,7 +975,7 @@ def multitypes_literal_field_for_schema(values: Tuple[Any, ...], field: ModelFie def encode_default(dft: Any) -> Any: - from pydantic.v1.main import BaseModel + from .main import BaseModel if isinstance(dft, BaseModel) or is_dataclass(dft): dft = cast('dict[str, Any]', pydantic_encoder(dft)) @@ -1090,7 +1091,7 @@ def get_annotation_with_constraints(annotation: Any, field_info: FieldInfo) -> T if issubclass(type_, (SecretStr, SecretBytes)): attrs = ('max_length', 'min_length') - def constraint_func(**kw: Any) -> Type[Any]: # noqa: F811 + def constraint_func(**kw: Any) -> Type[Any]: return type(type_.__name__, (type_,), kw) elif issubclass(type_, str) and not issubclass(type_, (EmailStr, AnyUrl)): diff --git a/Backend/venv/lib/python3.12/site-packages/pydantic/v1/tools.py b/Backend/venv/lib/python3.12/site-packages/pydantic/v1/tools.py index 6838a23e..45be2770 100644 --- a/Backend/venv/lib/python3.12/site-packages/pydantic/v1/tools.py +++ b/Backend/venv/lib/python3.12/site-packages/pydantic/v1/tools.py @@ -3,16 +3,16 @@ from functools import lru_cache from pathlib import Path from typing import TYPE_CHECKING, Any, Callable, Optional, Type, TypeVar, Union -from pydantic.v1.parse import Protocol, load_file, load_str_bytes -from pydantic.v1.types import StrBytes -from pydantic.v1.typing import display_as_type +from .parse import Protocol, load_file, load_str_bytes +from .types import StrBytes +from .typing import display_as_type __all__ = ('parse_file_as', 'parse_obj_as', 'parse_raw_as', 'schema_of', 'schema_json_of') NameFactory = Union[str, Callable[[Type[Any]], str]] if TYPE_CHECKING: - from pydantic.v1.typing import DictStrAny + from .typing import DictStrAny def _generate_parsing_type_name(type_: Any) -> str: @@ -21,7 +21,7 @@ def _generate_parsing_type_name(type_: Any) -> str: @lru_cache(maxsize=2048) def _get_parsing_type(type_: Any, *, type_name: Optional[NameFactory] = None) -> Any: - from pydantic.v1.main import create_model + from .main import create_model if type_name is None: type_name = _generate_parsing_type_name diff --git a/Backend/venv/lib/python3.12/site-packages/pydantic/v1/types.py b/Backend/venv/lib/python3.12/site-packages/pydantic/v1/types.py index e1840d99..5881e745 100644 --- a/Backend/venv/lib/python3.12/site-packages/pydantic/v1/types.py +++ b/Backend/venv/lib/python3.12/site-packages/pydantic/v1/types.py @@ -28,10 +28,10 @@ from typing import ( from uuid import UUID from weakref import WeakSet -from pydantic.v1 import errors -from pydantic.v1.datetime_parse import parse_date -from pydantic.v1.utils import import_string, update_not_none -from pydantic.v1.validators import ( +from . import errors +from .datetime_parse import parse_date +from .utils import import_string, update_not_none +from .validators import ( bytes_validator, constr_length_validator, constr_lower, @@ -123,9 +123,9 @@ StrIntFloat = Union[str, int, float] if TYPE_CHECKING: from typing_extensions import Annotated - from pydantic.v1.dataclasses import Dataclass - from pydantic.v1.main import BaseModel - from pydantic.v1.typing import CallableGenerator + from .dataclasses import Dataclass + from .main import BaseModel + from .typing import CallableGenerator ModelOrDc = Type[Union[BaseModel, Dataclass]] @@ -481,7 +481,6 @@ else: # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ SET TYPES ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - # This types superclass should be Set[T], but cython chokes on that... class ConstrainedSet(set): # type: ignore # Needed for pydantic to detect that this is a set @@ -570,7 +569,6 @@ def confrozenset( # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ LIST TYPES ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - # This types superclass should be List[T], but cython chokes on that... class ConstrainedList(list): # type: ignore # Needed for pydantic to detect that this is a list @@ -829,7 +827,7 @@ class JsonWrapper: class JsonMeta(type): def __getitem__(self, t: Type[Any]) -> Type[JsonWrapper]: if t is Any: - return Json # allow Json[Any] to replicate plain Json + return Json # allow Json[Any] to replecate plain Json return _registered(type('JsonWrapperValue', (JsonWrapper,), {'inner_type': t})) @@ -1096,6 +1094,7 @@ class ByteSize(int): @classmethod def validate(cls, v: StrIntFloat) -> 'ByteSize': + try: return cls(int(v)) except ValueError: @@ -1117,6 +1116,7 @@ class ByteSize(int): return cls(int(float(scalar) * unit_mult)) def human_readable(self, decimal: bool = False) -> str: + if decimal: divisor = 1000 units = ['B', 'KB', 'MB', 'GB', 'TB', 'PB'] @@ -1135,6 +1135,7 @@ class ByteSize(int): return f'{num:0.1f}{final_unit}' def to(self, unit: str) -> float: + try: unit_div = BYTE_SIZES[unit.lower()] except KeyError: diff --git a/Backend/venv/lib/python3.12/site-packages/pydantic/v1/typing.py b/Backend/venv/lib/python3.12/site-packages/pydantic/v1/typing.py index 97411618..a690a053 100644 --- a/Backend/venv/lib/python3.12/site-packages/pydantic/v1/typing.py +++ b/Backend/venv/lib/python3.12/site-packages/pydantic/v1/typing.py @@ -1,5 +1,3 @@ -import functools -import operator import sys import typing from collections.abc import Callable @@ -60,21 +58,12 @@ if sys.version_info < (3, 9): def evaluate_forwardref(type_: ForwardRef, globalns: Any, localns: Any) -> Any: return type_._evaluate(globalns, localns) -elif sys.version_info < (3, 12, 4): +else: def evaluate_forwardref(type_: ForwardRef, globalns: Any, localns: Any) -> Any: # Even though it is the right signature for python 3.9, mypy complains with # `error: Too many arguments for "_evaluate" of "ForwardRef"` hence the cast... - # Python 3.13/3.12.4+ made `recursive_guard` a kwarg, so name it explicitly to avoid: - # TypeError: ForwardRef._evaluate() missing 1 required keyword-only argument: 'recursive_guard' - return cast(Any, type_)._evaluate(globalns, localns, recursive_guard=set()) - -else: - - def evaluate_forwardref(type_: ForwardRef, globalns: Any, localns: Any) -> Any: - # Pydantic 1.x will not support PEP 695 syntax, but provide `type_params` to avoid - # warnings: - return cast(Any, type_)._evaluate(globalns, localns, type_params=(), recursive_guard=set()) + return cast(Any, type_)._evaluate(globalns, localns, set()) if sys.version_info < (3, 9): @@ -201,6 +190,9 @@ if sys.version_info < (3, 9): return tp else: + from typing import _UnionGenericAlias # type: ignore + + from typing_extensions import _AnnotatedAlias def convert_generics(tp: Type[Any]) -> Type[Any]: """ @@ -220,7 +212,7 @@ else: # typing.Annotated needs special treatment if origin is Annotated: - return Annotated[(convert_generics(args[0]), *args[1:])] # type: ignore + return _AnnotatedAlias(convert_generics(args[0]), args[1:]) # recursively replace `str` instances inside of `GenericAlias` with `ForwardRef(arg)` converted = tuple( @@ -234,7 +226,7 @@ else: return TypingGenericAlias(origin, converted) elif isinstance(tp, TypesUnionType): # recreate types.UnionType (PEP604, Python >= 3.10) - return functools.reduce(operator.or_, converted) # type: ignore + return _UnionGenericAlias(origin, converted) else: try: setattr(tp, '__args__', converted) @@ -264,7 +256,7 @@ StrPath = Union[str, PathLike] if TYPE_CHECKING: - from pydantic.v1.fields import ModelField + from .fields import ModelField TupleGenerator = Generator[Tuple[str, Any], None, None] DictStrAny = Dict[str, Any] @@ -405,10 +397,7 @@ def resolve_annotations(raw_annotations: Dict[str, Type[Any]], module_name: Opti else: value = ForwardRef(value, is_argument=False) try: - if sys.version_info >= (3, 13): - value = _eval_type(value, base_globals, None, type_params=()) - else: - value = _eval_type(value, base_globals, None) + value = _eval_type(value, base_globals, None) except NameError: # this is ok, it can be fixed with update_forward_refs pass @@ -446,7 +435,7 @@ def is_namedtuple(type_: Type[Any]) -> bool: Check if a given class is a named tuple. It can be either a `typing.NamedTuple` or `collections.namedtuple` """ - from pydantic.v1.utils import lenient_issubclass + from .utils import lenient_issubclass return lenient_issubclass(type_, tuple) and hasattr(type_, '_fields') @@ -456,7 +445,7 @@ def is_typeddict(type_: Type[Any]) -> bool: Check if a given class is a typed dict (from `typing` or `typing_extensions`) In 3.10, there will be a public method (https://docs.python.org/3.10/library/typing.html#typing.is_typeddict) """ - from pydantic.v1.utils import lenient_issubclass + from .utils import lenient_issubclass return lenient_issubclass(type_, dict) and hasattr(type_, '__total__') diff --git a/Backend/venv/lib/python3.12/site-packages/pydantic/v1/utils.py b/Backend/venv/lib/python3.12/site-packages/pydantic/v1/utils.py index 02543fd1..4d0f68ed 100644 --- a/Backend/venv/lib/python3.12/site-packages/pydantic/v1/utils.py +++ b/Backend/venv/lib/python3.12/site-packages/pydantic/v1/utils.py @@ -28,8 +28,8 @@ from typing import ( from typing_extensions import Annotated -from pydantic.v1.errors import ConfigError -from pydantic.v1.typing import ( +from .errors import ConfigError +from .typing import ( NoneType, WithArgsTypes, all_literal_values, @@ -39,17 +39,17 @@ from pydantic.v1.typing import ( is_literal_type, is_union, ) -from pydantic.v1.version import version_info +from .version import version_info if TYPE_CHECKING: from inspect import Signature from pathlib import Path - from pydantic.v1.config import BaseConfig - from pydantic.v1.dataclasses import Dataclass - from pydantic.v1.fields import ModelField - from pydantic.v1.main import BaseModel - from pydantic.v1.typing import AbstractSetIntStr, DictIntStrAny, IntStr, MappingIntStrAny, ReprArgs + from .config import BaseConfig + from .dataclasses import Dataclass + from .fields import ModelField + from .main import BaseModel + from .typing import AbstractSetIntStr, DictIntStrAny, IntStr, MappingIntStrAny, ReprArgs RichReprResult = Iterable[Union[Any, Tuple[Any], Tuple[str, Any], Tuple[str, Any, Any]]] @@ -66,7 +66,6 @@ __all__ = ( 'almost_equal_floats', 'get_model', 'to_camel', - 'to_lower_camel', 'is_valid_field', 'smart_deepcopy', 'PyObjectStr', @@ -159,7 +158,7 @@ def sequence_like(v: Any) -> bool: return isinstance(v, (list, tuple, set, frozenset, GeneratorType, deque)) -def validate_field_name(bases: Iterable[Type[Any]], field_name: str) -> None: +def validate_field_name(bases: List[Type['BaseModel']], field_name: str) -> None: """ Ensure that the field's name does not shadow an existing attribute of the model. """ @@ -241,7 +240,7 @@ def generate_model_signature( """ from inspect import Parameter, Signature, signature - from pydantic.v1.config import Extra + from .config import Extra present_params = signature(init).parameters.values() merged_params: Dict[str, Parameter] = {} @@ -299,7 +298,7 @@ def generate_model_signature( def get_model(obj: Union[Type['BaseModel'], Type['Dataclass']]) -> Type['BaseModel']: - from pydantic.v1.main import BaseModel + from .main import BaseModel try: model_cls = obj.__pydantic_model__ # type: ignore @@ -708,8 +707,6 @@ DUNDER_ATTRIBUTES = { '__orig_bases__', '__orig_class__', '__qualname__', - '__firstlineno__', - '__static_attributes__', } diff --git a/Backend/venv/lib/python3.12/site-packages/pydantic/v1/validators.py b/Backend/venv/lib/python3.12/site-packages/pydantic/v1/validators.py index c0940e81..549a235e 100644 --- a/Backend/venv/lib/python3.12/site-packages/pydantic/v1/validators.py +++ b/Backend/venv/lib/python3.12/site-packages/pydantic/v1/validators.py @@ -27,11 +27,10 @@ from typing import ( Union, ) from uuid import UUID -from warnings import warn -from pydantic.v1 import errors -from pydantic.v1.datetime_parse import parse_date, parse_datetime, parse_duration, parse_time -from pydantic.v1.typing import ( +from . import errors +from .datetime_parse import parse_date, parse_datetime, parse_duration, parse_time +from .typing import ( AnyCallable, all_literal_values, display_as_type, @@ -42,14 +41,14 @@ from pydantic.v1.typing import ( is_none_type, is_typeddict, ) -from pydantic.v1.utils import almost_equal_floats, lenient_issubclass, sequence_like +from .utils import almost_equal_floats, lenient_issubclass, sequence_like if TYPE_CHECKING: from typing_extensions import Literal, TypedDict - from pydantic.v1.config import BaseConfig - from pydantic.v1.fields import ModelField - from pydantic.v1.types import ConstrainedDecimal, ConstrainedFloat, ConstrainedInt + from .config import BaseConfig + from .fields import ModelField + from .types import ConstrainedDecimal, ConstrainedFloat, ConstrainedInt ConstrainedNumber = Union[ConstrainedDecimal, ConstrainedFloat, ConstrainedInt] AnyOrderedDict = OrderedDict[Any, Any] @@ -595,7 +594,7 @@ NamedTupleT = TypeVar('NamedTupleT', bound=NamedTuple) def make_namedtuple_validator( namedtuple_cls: Type[NamedTupleT], config: Type['BaseConfig'] ) -> Callable[[Tuple[Any, ...]], NamedTupleT]: - from pydantic.v1.annotated_types import create_model_from_namedtuple + from .annotated_types import create_model_from_namedtuple NamedTupleModel = create_model_from_namedtuple( namedtuple_cls, @@ -620,7 +619,7 @@ def make_namedtuple_validator( def make_typeddict_validator( typeddict_cls: Type['TypedDict'], config: Type['BaseConfig'] # type: ignore[valid-type] ) -> Callable[[Any], Dict[str, Any]]: - from pydantic.v1.annotated_types import create_model_from_typeddict + from .annotated_types import create_model_from_typeddict TypedDictModel = create_model_from_typeddict( typeddict_cls, @@ -699,7 +698,7 @@ _VALIDATORS: List[Tuple[Type[Any], List[Any]]] = [ def find_validators( # noqa: C901 (ignore complexity) type_: Type[Any], config: Type['BaseConfig'] ) -> Generator[AnyCallable, None, None]: - from pydantic.v1.dataclasses import is_builtin_dataclass, make_dataclass_validator + from .dataclasses import is_builtin_dataclass, make_dataclass_validator if type_ is Any or type_ is object: return @@ -763,6 +762,4 @@ def find_validators( # noqa: C901 (ignore complexity) if config.arbitrary_types_allowed: yield make_arbitrary_type_validator(type_) else: - if hasattr(type_, '__pydantic_core_schema__'): - warn(f'Mixing V1 and V2 models is not supported. `{type_.__name__}` is a V2 model.', UserWarning) raise RuntimeError(f'no validator found for {type_}, see `arbitrary_types_allowed` in Config') diff --git a/Backend/venv/lib/python3.12/site-packages/pydantic/v1/version.py b/Backend/venv/lib/python3.12/site-packages/pydantic/v1/version.py index c77cde12..462c4978 100644 --- a/Backend/venv/lib/python3.12/site-packages/pydantic/v1/version.py +++ b/Backend/venv/lib/python3.12/site-packages/pydantic/v1/version.py @@ -1,6 +1,6 @@ __all__ = 'compiled', 'VERSION', 'version_info' -VERSION = '1.10.21' +VERSION = '1.10.13' try: import cython # type: ignore diff --git a/Backend/venv/lib/python3.12/site-packages/pydantic/validate_call_decorator.py b/Backend/venv/lib/python3.12/site-packages/pydantic/validate_call_decorator.py index fe4d9c9b..b33017c3 100644 --- a/Backend/venv/lib/python3.12/site-packages/pydantic/validate_call_decorator.py +++ b/Backend/venv/lib/python3.12/site-packages/pydantic/validate_call_decorator.py @@ -1,14 +1,9 @@ """Decorator for validating function calls.""" - from __future__ import annotations as _annotations -import inspect -from functools import partial -from types import BuiltinFunctionType -from typing import TYPE_CHECKING, Any, Callable, TypeVar, cast, overload +from typing import TYPE_CHECKING, Any, Callable, TypeVar, overload -from ._internal import _generate_schema, _typing_extra, _validate_call -from .errors import PydanticUserError +from ._internal import _validate_call __all__ = ('validate_call',) @@ -18,99 +13,46 @@ if TYPE_CHECKING: AnyCallableT = TypeVar('AnyCallableT', bound=Callable[..., Any]) -_INVALID_TYPE_ERROR_CODE = 'validate-call-type' - - -def _check_function_type(function: object) -> None: - """Check if the input function is a supported type for `validate_call`.""" - if isinstance(function, _generate_schema.VALIDATE_CALL_SUPPORTED_TYPES): - try: - inspect.signature(cast(_generate_schema.ValidateCallSupportedTypes, function)) - except ValueError: - raise PydanticUserError( - f"Input function `{function}` doesn't have a valid signature", code=_INVALID_TYPE_ERROR_CODE - ) - - if isinstance(function, partial): - try: - assert not isinstance(partial.func, partial), 'Partial of partial' - _check_function_type(function.func) - except PydanticUserError as e: - raise PydanticUserError( - f'Partial of `{function.func}` is invalid because the type of `{function.func}` is not supported by `validate_call`', - code=_INVALID_TYPE_ERROR_CODE, - ) from e - - return - - if isinstance(function, BuiltinFunctionType): - raise PydanticUserError(f'Input built-in function `{function}` is not supported', code=_INVALID_TYPE_ERROR_CODE) - if isinstance(function, (classmethod, staticmethod, property)): - name = type(function).__name__ - raise PydanticUserError( - f'The `@{name}` decorator should be applied after `@validate_call` (put `@{name}` on top)', - code=_INVALID_TYPE_ERROR_CODE, - ) - - if inspect.isclass(function): - raise PydanticUserError( - f'Unable to validate {function}: `validate_call` should be applied to functions, not classes (put `@validate_call` on top of `__init__` or `__new__` instead)', - code=_INVALID_TYPE_ERROR_CODE, - ) - if callable(function): - raise PydanticUserError( - f'Unable to validate {function}: `validate_call` should be applied to functions, not instances or other callables. Use `validate_call` explicitly on `__call__` instead.', - code=_INVALID_TYPE_ERROR_CODE, - ) - - raise PydanticUserError( - f'Unable to validate {function}: `validate_call` should be applied to one of the following: function, method, partial, or lambda', - code=_INVALID_TYPE_ERROR_CODE, - ) - - @overload def validate_call( *, config: ConfigDict | None = None, validate_return: bool = False -) -> Callable[[AnyCallableT], AnyCallableT]: ... +) -> Callable[[AnyCallableT], AnyCallableT]: + ... @overload -def validate_call(func: AnyCallableT, /) -> AnyCallableT: ... +def validate_call(__func: AnyCallableT) -> AnyCallableT: + ... def validate_call( - func: AnyCallableT | None = None, - /, + __func: AnyCallableT | None = None, *, config: ConfigDict | None = None, validate_return: bool = False, ) -> AnyCallableT | Callable[[AnyCallableT], AnyCallableT]: - """!!! abstract "Usage Documentation" - [Validation Decorator](../concepts/validation_decorator.md) + """Usage docs: https://docs.pydantic.dev/2.5/concepts/validation_decorator/ Returns a decorated wrapper around the function that validates the arguments and, optionally, the return value. Usage may be either as a plain decorator `@validate_call` or with arguments `@validate_call(...)`. Args: - func: The function to be decorated. + __func: The function to be decorated. config: The configuration dictionary. validate_return: Whether to validate the return value. Returns: The decorated function. """ - parent_namespace = _typing_extra.parent_frame_namespace() def validate(function: AnyCallableT) -> AnyCallableT: - _check_function_type(function) - validate_call_wrapper = _validate_call.ValidateCallWrapper( - cast(_generate_schema.ValidateCallSupportedTypes, function), config, validate_return, parent_namespace - ) - return _validate_call.update_wrapper_attributes(function, validate_call_wrapper.__call__) # type: ignore + if isinstance(function, (classmethod, staticmethod)): + name = type(function).__name__ + raise TypeError(f'The `@{name}` decorator should be applied after `@validate_call` (put `@{name}` on top)') + return _validate_call.ValidateCallWrapper(function, config, validate_return) # type: ignore - if func is not None: - return validate(func) + if __func: + return validate(__func) else: return validate diff --git a/Backend/venv/lib/python3.12/site-packages/pydantic/validators.py b/Backend/venv/lib/python3.12/site-packages/pydantic/validators.py index 7921b04f..55b0339e 100644 --- a/Backend/venv/lib/python3.12/site-packages/pydantic/validators.py +++ b/Backend/venv/lib/python3.12/site-packages/pydantic/validators.py @@ -1,5 +1,4 @@ """The `validators` module is a backport module from V1.""" - from ._migration import getattr_migration __getattr__ = getattr_migration(__name__) diff --git a/Backend/venv/lib/python3.12/site-packages/pydantic/version.py b/Backend/venv/lib/python3.12/site-packages/pydantic/version.py index eaf2619a..1daa7e09 100644 --- a/Backend/venv/lib/python3.12/site-packages/pydantic/version.py +++ b/Backend/venv/lib/python3.12/site-packages/pydantic/version.py @@ -1,25 +1,10 @@ """The `version` module holds the version information for Pydantic.""" - from __future__ import annotations as _annotations -import sys - -from pydantic_core import __version__ as __pydantic_core_version__ - __all__ = 'VERSION', 'version_info' -VERSION = '2.12.5' -"""The version of Pydantic. - -This version specifier is guaranteed to be compliant with the [specification], -introduced by [PEP 440]. - -[specification]: https://packaging.python.org/en/latest/specifications/version-specifiers/ -[PEP 440]: https://peps.python.org/pep-0440/ -""" - -# Keep this in sync with the version constraint in the `pyproject.toml` dependencies: -_COMPATIBLE_PYDANTIC_CORE_VERSION = '2.41.5' +VERSION = '2.5.0' +"""The version of Pydantic.""" def version_short() -> str: @@ -32,13 +17,16 @@ def version_short() -> str: def version_info() -> str: """Return complete version information for Pydantic and its dependencies.""" - import importlib.metadata import platform + import sys from pathlib import Path import pydantic_core._pydantic_core as pdc - from ._internal import _git as git + if sys.version_info >= (3, 8): + import importlib.metadata as importlib_metadata + else: + import importlib_metadata # get data about packages that are closely related to pydantic, use pydantic or often conflict with pydantic package_names = { @@ -52,62 +40,36 @@ def version_info() -> str: } related_packages = [] - for dist in importlib.metadata.distributions(): + for dist in importlib_metadata.distributions(): name = dist.metadata['Name'] if name in package_names: related_packages.append(f'{name}-{dist.version}') - pydantic_dir = Path(__file__).parents[1].resolve() - most_recent_commit = ( - git.git_revision(pydantic_dir) if git.is_git_repo(pydantic_dir) and git.have_git() else 'unknown' - ) - info = { 'pydantic version': VERSION, - 'pydantic-core version': __pydantic_core_version__, - 'pydantic-core build': getattr(pdc, 'build_info', None) or pdc.build_profile, # pyright: ignore[reportPrivateImportUsage] + 'pydantic-core version': pdc.__version__, + 'pydantic-core build': getattr(pdc, 'build_info', None) or pdc.build_profile, + 'install path': Path(__file__).resolve().parent, 'python version': sys.version, 'platform': platform.platform(), 'related packages': ' '.join(related_packages), - 'commit': most_recent_commit, } return '\n'.join('{:>30} {}'.format(k + ':', str(v).replace('\n', ' ')) for k, v in info.items()) -def check_pydantic_core_version() -> bool: - """Check that the installed `pydantic-core` dependency is compatible.""" - return __pydantic_core_version__ == _COMPATIBLE_PYDANTIC_CORE_VERSION +def parse_mypy_version(version: str) -> tuple[int, ...]: + """Parse mypy string version to tuple of ints. + This function is included here rather than the mypy plugin file because the mypy plugin file cannot be imported + outside a mypy run. -def _ensure_pydantic_core_version() -> None: # pragma: no cover - if not check_pydantic_core_version(): - raise_error = True - # Do not raise the error if pydantic is installed in editable mode (i.e. in development): - if sys.version_info >= (3, 13): # origin property added in 3.13 - from importlib.metadata import distribution - - dist = distribution('pydantic') - if getattr(getattr(dist.origin, 'dir_info', None), 'editable', False): - raise_error = False - - if raise_error: - raise SystemError( - f'The installed pydantic-core version ({__pydantic_core_version__}) is incompatible ' - f'with the current pydantic version, which requires {_COMPATIBLE_PYDANTIC_CORE_VERSION}. ' - "If you encounter this error, make sure that you haven't upgraded pydantic-core manually." - ) - - -def parse_mypy_version(version: str) -> tuple[int, int, int]: - """Parse `mypy` string version to a 3-tuple of ints. - - It parses normal version like `1.11.0` and extra info followed by a `+` sign - like `1.11.0+dev.d6d9d8cd4f27c52edac1f537e236ec48a01e54cb.dirty`. + It parses normal version like `0.930` and dev version + like `0.940+dev.04cac4b5d911c4f9529e6ce86a27b44f28846f5d.dirty`. Args: version: The mypy version string. Returns: - A triple of ints, e.g. `(1, 11, 0)`. + A tuple of ints. e.g. (0, 930). """ - return tuple(map(int, version.partition('+')[0].split('.'))) # pyright: ignore[reportReturnType] + return tuple(map(int, version.partition('+')[0].split('.'))) diff --git a/Backend/venv/lib/python3.12/site-packages/pydantic/warnings.py b/Backend/venv/lib/python3.12/site-packages/pydantic/warnings.py index 2e2dd83c..e6e61fc6 100644 --- a/Backend/venv/lib/python3.12/site-packages/pydantic/warnings.py +++ b/Backend/venv/lib/python3.12/site-packages/pydantic/warnings.py @@ -1,22 +1,9 @@ """Pydantic-specific warnings.""" - from __future__ import annotations as _annotations from .version import version_short -__all__ = ( - 'PydanticDeprecatedSince20', - 'PydanticDeprecatedSince26', - 'PydanticDeprecatedSince29', - 'PydanticDeprecatedSince210', - 'PydanticDeprecatedSince211', - 'PydanticDeprecatedSince212', - 'PydanticDeprecationWarning', - 'PydanticExperimentalWarning', - 'ArbitraryTypeWarning', - 'UnsupportedFieldAttributeWarning', - 'TypedDictExtraConfigWarning', -) +__all__ = 'PydanticDeprecatedSince20', 'PydanticDeprecationWarning' class PydanticDeprecationWarning(DeprecationWarning): @@ -60,63 +47,5 @@ class PydanticDeprecatedSince20(PydanticDeprecationWarning): super().__init__(message, *args, since=(2, 0), expected_removal=(3, 0)) -class PydanticDeprecatedSince26(PydanticDeprecationWarning): - """A specific `PydanticDeprecationWarning` subclass defining functionality deprecated since Pydantic 2.6.""" - - def __init__(self, message: str, *args: object) -> None: - super().__init__(message, *args, since=(2, 6), expected_removal=(3, 0)) - - -class PydanticDeprecatedSince29(PydanticDeprecationWarning): - """A specific `PydanticDeprecationWarning` subclass defining functionality deprecated since Pydantic 2.9.""" - - def __init__(self, message: str, *args: object) -> None: - super().__init__(message, *args, since=(2, 9), expected_removal=(3, 0)) - - -class PydanticDeprecatedSince210(PydanticDeprecationWarning): - """A specific `PydanticDeprecationWarning` subclass defining functionality deprecated since Pydantic 2.10.""" - - def __init__(self, message: str, *args: object) -> None: - super().__init__(message, *args, since=(2, 10), expected_removal=(3, 0)) - - -class PydanticDeprecatedSince211(PydanticDeprecationWarning): - """A specific `PydanticDeprecationWarning` subclass defining functionality deprecated since Pydantic 2.11.""" - - def __init__(self, message: str, *args: object) -> None: - super().__init__(message, *args, since=(2, 11), expected_removal=(3, 0)) - - -class PydanticDeprecatedSince212(PydanticDeprecationWarning): - """A specific `PydanticDeprecationWarning` subclass defining functionality deprecated since Pydantic 2.12.""" - - def __init__(self, message: str, *args: object) -> None: - super().__init__(message, *args, since=(2, 12), expected_removal=(3, 0)) - - class GenericBeforeBaseModelWarning(Warning): pass - - -class PydanticExperimentalWarning(Warning): - """A Pydantic specific experimental functionality warning. - - It is raised to warn users that the functionality may change or be removed in future versions of Pydantic. - """ - - -class CoreSchemaGenerationWarning(UserWarning): - """A warning raised during core schema generation.""" - - -class ArbitraryTypeWarning(CoreSchemaGenerationWarning): - """A warning raised when Pydantic fails to generate a core schema for an arbitrary type.""" - - -class UnsupportedFieldAttributeWarning(CoreSchemaGenerationWarning): - """A warning raised when a `Field()` attribute isn't supported in the context it is used.""" - - -class TypedDictExtraConfigWarning(CoreSchemaGenerationWarning): - """A warning raised when the [`extra`][pydantic.ConfigDict.extra] configuration is incompatible with the `closed` or `extra_items` specification.""" diff --git a/Backend/venv/lib/python3.12/site-packages/pydantic_core-2.41.5.dist-info/INSTALLER b/Backend/venv/lib/python3.12/site-packages/pydantic_core-2.14.1.dist-info/INSTALLER similarity index 100% rename from Backend/venv/lib/python3.12/site-packages/pydantic_core-2.41.5.dist-info/INSTALLER rename to Backend/venv/lib/python3.12/site-packages/pydantic_core-2.14.1.dist-info/INSTALLER diff --git a/Backend/venv/lib/python3.12/site-packages/pydantic_core-2.41.5.dist-info/METADATA b/Backend/venv/lib/python3.12/site-packages/pydantic_core-2.14.1.dist-info/METADATA similarity index 68% rename from Backend/venv/lib/python3.12/site-packages/pydantic_core-2.41.5.dist-info/METADATA rename to Backend/venv/lib/python3.12/site-packages/pydantic_core-2.14.1.dist-info/METADATA index 468d2a52..b1db0a54 100644 --- a/Backend/venv/lib/python3.12/site-packages/pydantic_core-2.41.5.dist-info/METADATA +++ b/Backend/venv/lib/python3.12/site-packages/pydantic_core-2.14.1.dist-info/METADATA @@ -1,34 +1,31 @@ -Metadata-Version: 2.4 +Metadata-Version: 2.1 Name: pydantic_core -Version: 2.41.5 +Version: 2.14.1 Classifier: Development Status :: 3 - Alpha Classifier: Programming Language :: Python Classifier: Programming Language :: Python :: 3 Classifier: Programming Language :: Python :: 3 :: Only +Classifier: Programming Language :: Python :: 3.7 +Classifier: Programming Language :: Python :: 3.8 Classifier: Programming Language :: Python :: 3.9 Classifier: Programming Language :: Python :: 3.10 Classifier: Programming Language :: Python :: 3.11 Classifier: Programming Language :: Python :: 3.12 -Classifier: Programming Language :: Python :: 3.13 -Classifier: Programming Language :: Python :: 3.14 -Classifier: Programming Language :: Python :: Implementation :: CPython -Classifier: Programming Language :: Python :: Implementation :: PyPy -Classifier: Programming Language :: Python :: Implementation :: GraalPy Classifier: Programming Language :: Rust Classifier: Framework :: Pydantic Classifier: Intended Audience :: Developers Classifier: Intended Audience :: Information Technology +Classifier: License :: OSI Approved :: MIT License Classifier: Operating System :: POSIX :: Linux Classifier: Operating System :: Microsoft :: Windows Classifier: Operating System :: MacOS Classifier: Typing :: Typed -Requires-Dist: typing-extensions>=4.14.1 +Requires-Dist: typing-extensions >=4.6.0, !=4.7.0 License-File: LICENSE -Summary: Core functionality for Pydantic validation and serialization Home-Page: https://github.com/pydantic/pydantic-core -Author-email: Samuel Colvin , Adrian Garcia Badaracco <1755071+adriangb@users.noreply.github.com>, David Montague , David Hewitt , Sydney Runkle , Victorien Plot -License-Expression: MIT -Requires-Python: >=3.9 +Author-email: Samuel Colvin +License: MIT +Requires-Python: >=3.7 Description-Content-Type: text/markdown; charset=UTF-8; variant=GFM Project-URL: Homepage, https://github.com/pydantic/pydantic-core Project-URL: Funding, https://github.com/sponsors/samuelcolvin @@ -105,52 +102,35 @@ except ValidationError as e: ## Getting Started -### Prerequisites +You'll need rust stable [installed](https://rustup.rs/), or rust nightly if you want to generate accurate coverage. -You'll need: -1. **[Rust](https://rustup.rs/)** - Rust stable (or nightly for coverage) -2. **[uv](https://docs.astral.sh/uv/getting-started/installation/)** - Fast Python package manager (will install Python 3.9+ automatically) -3. **[git](https://git-scm.com/)** - For version control -4. **[make](https://www.gnu.org/software/make/)** - For running development commands (or use `nmake` on Windows) - -### Quick Start +With rust and python 3.7+ installed, compiling pydantic-core should be possible with roughly the following: ```bash -# Clone the repository (or from your fork) +# clone this repo or your fork git clone git@github.com:pydantic/pydantic-core.git cd pydantic-core - -# Install all dependencies using uv, setup pre-commit hooks, and build the development version +# create a new virtual env +python3 -m venv env +source env/bin/activate +# install dependencies and install pydantic-core make install ``` -Verify your installation by running: +That should be it, the example shown above should now run. -```bash -make -``` +You might find it useful to look at [`python/pydantic_core/_pydantic_core.pyi`](./python/pydantic_core/_pydantic_core.pyi) and +[`python/pydantic_core/core_schema.py`](./python/pydantic_core/core_schema.py) for more information on the python API, +beyond that, [`tests/`](./tests) provide a large number of examples of usage. -This runs a full development cycle: formatting, building, linting, and testing - -### Development Commands - -Run `make help` to see all available commands, or use these common ones: - -```bash -make build-dev # to build the package during development -make build-prod # to perform an optimised build for benchmarking -make test # to run the tests -make testcov # to run the tests and generate a coverage report -make lint # to run the linter -make format # to format python and rust code -make all # to run to run build-dev + format + lint + test -``` - -### Useful Resources - -* [`python/pydantic_core/_pydantic_core.pyi`](./python/pydantic_core/_pydantic_core.pyi) - Python API types -* [`python/pydantic_core/core_schema.py`](./python/pydantic_core/core_schema.py) - Core schema definitions -* [`tests/`](./tests) - Comprehensive usage examples +If you want to contribute to pydantic-core, you'll want to use some other make commands: +* `make build-dev` to build the package during development +* `make build-prod` to perform an optimised build for benchmarking +* `make test` to run the tests +* `make testcov` to run the tests and generate a coverage report +* `make lint` to run the linter +* `make format` to format python and rust code +* `make` to run `format build-dev lint test` ## Profiling diff --git a/Backend/venv/lib/python3.12/site-packages/pydantic_core-2.14.1.dist-info/RECORD b/Backend/venv/lib/python3.12/site-packages/pydantic_core-2.14.1.dist-info/RECORD new file mode 100644 index 00000000..ce10a1c1 --- /dev/null +++ b/Backend/venv/lib/python3.12/site-packages/pydantic_core-2.14.1.dist-info/RECORD @@ -0,0 +1,12 @@ +pydantic_core-2.14.1.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 +pydantic_core-2.14.1.dist-info/METADATA,sha256=kcfzHdPYXbwcX-iXWpsKYrM9lMUj30dEvfX6h7fVOG8,6514 +pydantic_core-2.14.1.dist-info/RECORD,, +pydantic_core-2.14.1.dist-info/WHEEL,sha256=jAOrfkJsBGHW-KSv5AFDOItlU2AAZh8UbbXywEon8CY,129 +pydantic_core-2.14.1.dist-info/license_files/LICENSE,sha256=Kv3TDVS01itvSIprzBVG6E7FBh8T9CCcA9ASNIeDeVo,1080 +pydantic_core/__init__.py,sha256=H-OvjcLVZnP4v4DQ6CAXIGqXN_2bK3PIEIv1lcH5HaQ,4197 +pydantic_core/__pycache__/__init__.cpython-312.pyc,, +pydantic_core/__pycache__/core_schema.cpython-312.pyc,, +pydantic_core/_pydantic_core.cpython-312-x86_64-linux-gnu.so,sha256=d0K9hX5Q2HHcJB9s2puX2Dy8986ngRHlnPVPDERNVdQ,5179648 +pydantic_core/_pydantic_core.pyi,sha256=PwmhpPKZ7QRXdk2uKAD1AekkdIY4gC9Yf8MT6eGKiXQ,32260 +pydantic_core/core_schema.py,sha256=7rHKegevzVE5dIhGzv6T1dWCRbppbrqDZnCE0tHSb7I,132810 +pydantic_core/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 diff --git a/Backend/venv/lib/python3.12/site-packages/pydantic_core-2.41.5.dist-info/WHEEL b/Backend/venv/lib/python3.12/site-packages/pydantic_core-2.14.1.dist-info/WHEEL similarity index 79% rename from Backend/venv/lib/python3.12/site-packages/pydantic_core-2.41.5.dist-info/WHEEL rename to Backend/venv/lib/python3.12/site-packages/pydantic_core-2.14.1.dist-info/WHEEL index ecc07619..054c3460 100644 --- a/Backend/venv/lib/python3.12/site-packages/pydantic_core-2.41.5.dist-info/WHEEL +++ b/Backend/venv/lib/python3.12/site-packages/pydantic_core-2.14.1.dist-info/WHEEL @@ -1,4 +1,4 @@ Wheel-Version: 1.0 -Generator: maturin (1.9.6) +Generator: maturin (1.3.1) Root-Is-Purelib: false Tag: cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64 diff --git a/Backend/venv/lib/python3.12/site-packages/pydantic_core-2.41.5.dist-info/licenses/LICENSE b/Backend/venv/lib/python3.12/site-packages/pydantic_core-2.14.1.dist-info/license_files/LICENSE similarity index 100% rename from Backend/venv/lib/python3.12/site-packages/pydantic_core-2.41.5.dist-info/licenses/LICENSE rename to Backend/venv/lib/python3.12/site-packages/pydantic_core-2.14.1.dist-info/license_files/LICENSE diff --git a/Backend/venv/lib/python3.12/site-packages/pydantic_core-2.41.5.dist-info/RECORD b/Backend/venv/lib/python3.12/site-packages/pydantic_core-2.41.5.dist-info/RECORD deleted file mode 100644 index 24582880..00000000 --- a/Backend/venv/lib/python3.12/site-packages/pydantic_core-2.41.5.dist-info/RECORD +++ /dev/null @@ -1,12 +0,0 @@ -pydantic_core-2.41.5.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 -pydantic_core-2.41.5.dist-info/METADATA,sha256=Cfg7qjIC7D2piihKVq_fG6aZduSvcXJIiIflsrIFkak,7277 -pydantic_core-2.41.5.dist-info/RECORD,, -pydantic_core-2.41.5.dist-info/WHEEL,sha256=AUS7tHOBvWg1bDsPcHg1j3P_rKxqebEdeR--lIGHkyI,129 -pydantic_core-2.41.5.dist-info/licenses/LICENSE,sha256=Kv3TDVS01itvSIprzBVG6E7FBh8T9CCcA9ASNIeDeVo,1080 -pydantic_core/__init__.py,sha256=nK1ikrdSVK9gapcKrpv_blrp8LCAic1jrK-jkbYHlNI,5115 -pydantic_core/__pycache__/__init__.cpython-312.pyc,, -pydantic_core/__pycache__/core_schema.cpython-312.pyc,, -pydantic_core/_pydantic_core.cpython-312-x86_64-linux-gnu.so,sha256=sfwayXRW_oTj75OQmcampiKiPl-_d6Q5yWOQqXdPcls,4883472 -pydantic_core/_pydantic_core.pyi,sha256=PqHb1BgvCM-TQfJLPFz323egWzU1_-niNSUSejYXoR8,44927 -pydantic_core/core_schema.py,sha256=u9yFC3LWhRM6DiUP7SY7M2kdzfOBNJLzwOMQAePUYAU,154730 -pydantic_core/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 diff --git a/Backend/venv/lib/python3.12/site-packages/pydantic_core/__init__.py b/Backend/venv/lib/python3.12/site-packages/pydantic_core/__init__.py index d5facd16..5b2655c9 100644 --- a/Backend/venv/lib/python3.12/site-packages/pydantic_core/__init__.py +++ b/Backend/venv/lib/python3.12/site-packages/pydantic_core/__init__.py @@ -3,8 +3,6 @@ from __future__ import annotations import sys as _sys from typing import Any as _Any -from typing_extensions import Sentinel - from ._pydantic_core import ( ArgsKwargs, MultiHostUrl, @@ -27,6 +25,7 @@ from ._pydantic_core import ( from_json, to_json, to_jsonable_python, + validate_core_schema, ) from .core_schema import CoreConfig, CoreSchema, CoreSchemaType, ErrorType @@ -35,14 +34,13 @@ if _sys.version_info < (3, 11): else: from typing import NotRequired as _NotRequired -if _sys.version_info < (3, 12): +if _sys.version_info < (3, 9): from typing_extensions import TypedDict as _TypedDict else: from typing import TypedDict as _TypedDict __all__ = [ '__version__', - 'UNSET', 'CoreConfig', 'CoreSchema', 'CoreSchemaType', @@ -68,6 +66,7 @@ __all__ = [ 'to_json', 'from_json', 'to_jsonable_python', + 'validate_core_schema', ] @@ -90,16 +89,11 @@ class ErrorDetails(_TypedDict): Values which are required to render the error message, and could hence be useful in rendering custom error messages. Also useful for passing custom error data forward. """ - url: _NotRequired[str] - """ - The documentation URL giving information about the error. No URL is available if - a [`PydanticCustomError`][pydantic_core.PydanticCustomError] is used. - """ class InitErrorDetails(_TypedDict): type: str | PydanticCustomError - """The type of error that occurred, this should be a "slug" identifier that changes rarely or never.""" + """The type of error that occurred, this should a "slug" identifier that changes rarely or never.""" loc: _NotRequired[tuple[int | str, ...]] """Tuple of strings and ints identifying where in the schema the error occurred.""" input: _Any @@ -117,7 +111,7 @@ class ErrorTypeInfo(_TypedDict): """ type: ErrorType - """The type of error that occurred, this should be a "slug" identifier that changes rarely or never.""" + """The type of error that occurred, this should a "slug" identifier that changes rarely or never.""" message_template_python: str """String template to render a human readable error message from using context, when the input is Python.""" example_message_python: str @@ -143,29 +137,3 @@ class MultiHostHost(_TypedDict): """The host part of this host, or `None`.""" port: int | None """The port part of this host, or `None`.""" - - -MISSING = Sentinel('MISSING') -"""A singleton indicating a field value was not provided during validation. - -This singleton can be used a default value, as an alternative to `None` when it has -an explicit meaning. During serialization, any field with `MISSING` as a value is excluded -from the output. - -Example: - ```python - from pydantic import BaseModel - - from pydantic_core import MISSING - - - class Configuration(BaseModel): - timeout: int | None | MISSING = MISSING - - - # configuration defaults, stored somewhere else: - defaults = {'timeout': 200} - - conf = Configuration.model_validate({...}) - timeout = conf.timeout if timeout.timeout is not MISSING else defaults['timeout'] -""" diff --git a/Backend/venv/lib/python3.12/site-packages/pydantic_core/__pycache__/__init__.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/pydantic_core/__pycache__/__init__.cpython-312.pyc index 2fdad40d1af5fce1c88e174e38ecbce15ceff74b..9eabd605310acc64d904c020f5600029f095aeb2 100644 GIT binary patch delta 1053 zcmZ{iO-vI(6vt<}+uiMMTWG0JgtmMZwnF7wK|@SxR3t)B6U`c2o9+gxyDjb(v|dW0 z#4BVxc=Dhz9y}WF-aQE#NfS_GJa9vUA<>KTw$UI7lgw}5`_KH}yv*!}@M75i*5?xu z9fPU;RwVpHHN|4yDuam5?SHY$csRn)DPavJ0I> zn)dlSuI`A)lA;fRXa1Qn`tu4T%Gb%yq?R&IbA!Q%@pJYtBz_` zBOn5Z0)l`5payUVzymmd58ww>lP#w0crAni0P0)tXjT2qu!^QaDZ?axpBE7o0qvfTb=# zHy{Z(N-<&eKsX3+?8hLA|HXA0*c}v0XkBbwV_VnRS<=8qIA?F%IqC}kgpLDVET8 zm&+||3rGsxpM)+pgk+_Q5!%K3=qb8sf0-0$fD&QEA<5|(QaMR3hzZ<9mcw&vcuol hs-n`lgo2XAOFL_FwxQ#IgYll|@Y{bs)TW@mRk@-pIk;`JIx zT$2smnQy@bUj$!Wh{tLXC0Q+}TRKM6L7mx!Gsow0Q7bA_E!&c7wOVs+R$H#!YR`38 z9T?f_#iOv$=8Njn3PMbyh`Pjr+pHKyd8f=sHTzGU@w?6~>f+XRJXbArXNgSF6r!Hn z*fJF~gsAr_qCR{3qFQZlC8VtpwswQgm%S$Z^FrQJ%5sp-j4DHnNCt701c3@xv3W zNyMxf5CsGQ0YC^42Iv3{-~-eE{QQNwHMs>s7XUsQa|3Dt(3N=sb$|vyJ?|t@Ji$lE zaKMGAVXM@=R}7RrrkBO|O>!=>?oW*sN+;|~vl(X7v&9mdtf;dr%fFJlH8EHOFe2{a z0sg?zA6n6o(YQn!Rut8tvq3q7_mX<9I1l1DKjLh`34Xz8j&{OOHy{b<0rU!tv7Hd^ z2FUU~5XFCiil7MDHMDGWERl|7GR-T_W~ZDRm#xCuEoTA>O#VpgbFdvE=2*7|`at#r z1_UZvDn$$FREq5a^+(5j;3W8h9>LT6zMiZ$*(aN<>5roa|50}Y9N-#%>KX{iZ9!Vm zjt!5G504F*J=||3y5Q9-{!)1+lb=f2S4wuim?`9o%mLn)nkm!s;s;8n(gkMo3F8L; zZY1a6u&ZYwcP4v{g4?|Lb$xHHKxeb|es)TX!XH??C$OSojNhR4_bBiNML(d}8VO@% z4gHNT(j^fd#Y<@9ovOW3L(f!x#~p6D{9KK`C4(PG@-u02EA!gw{w-L)zGoGQ$7&yc d?QU*dMIOB4Qxv&_*9Vu3=6P*J31cF^=MSK?X+Zk|pWJ4q|o9gTFaq-jPo%AJvI zDGr1trGfBhDUbpI%A=6b6w2}nuhMqA5DF|V@`9LUw}JBNval`A!mfd3zwbYf`Z0-7pKWevc)sD` z2B%@D!D)0>AX>n7I^t)JX5v|)1N z(8kG4Lz^UjOK$VzmZ2?;4Q}GSx0r_df1TFHRx~tttI(1*_EBgL)#~>7`kF|$IuRxZ{3%Ev@U$T{*dP zXeXYoYGps#-)_=bjqYw3x_U*!+Z&uU&onq|-EB_K%j-U#Q13Z(jkA8J*V*9qIUC=C zTas@R@@;mvf4oWONy*(UxVzO&;l3$*t=!*+``ZJ#uXB^m6;f-zJl}!m$w;jOA8d3| z&Xvz3h6dd=?&|SIclFo`DYKiu-PHIBd*^z&vpR5RkGkVtJKkh--QaF=ce~fSd)ynw z5(4Q)v}31S-PEeyYZqE_Riq_1J5BQMYUi3460Hq!|IpTJo!)0w4&5T}(+4Q*1=BmX zN^5QnwC^@`2XEoG?@hYRw+8O*HTUo)3Hv5*#+%&czRBI|zFEJ?TcqA=QSWt;*6-7; zZ*s17`d?^{YrVRMceu_Oz&pHEU=0G+?g*^6IoCUTUT8$le&+_{yj^nMh@3Y?a_+Y| z2b`Oc^A5>*3v%8X$$0?K2A$h5&Ij>U1Mbc4KKE_ze)quGN*S3urR1AXa&M&MA$hYm zzp$e6od9#U^A^wmF}?eR)=F4$cTnq1&OK<` z0|NhEz`rj7|G^meP0sxobv+WQ>s>Fbtb}6j z0NQQN5THFO(2fDxyCcxv8G>d;{rDnB2#G*b>M6&CWP#JT5g(pvG*Z#`gqjGq*D-lH6oCv0O|1vq*2>auLd1?t5XC#N1&7dWjX@I ztqaQAoD+aDCQwcS%BcvH@oH~{H@e-KLD>l@JBzYUM9OAu3!0qM)hG(!?0237oc9Wx zZvdQcjKFzJ;5_xh3go@R`6lGefdV|{-l^&Qq?CLgNYHy}t-RXP_TKu@c`c}YtE&|J2VjB-R--b381@5;4 z?sr7smX-+j?ap@s?zF)DAmDx|0{6rc;ojwZ7vP>0xE}`G?~cGdRRQ;V7Us#+nhmnHPD?G%qn3|EYI!m+m+o=C4iN#yG_4hj;Lr;B+ee<8FhL?2y!_H44 z|F=q=FQU$uB6U7jN1YEiKLr@yR(G8bIv+>=ZMxCDs@YUZTJ^CGi9{oeu`FyQ9f#Hrgub})#7OoF@k2=4Myx%8v{R-;()kt06@9wm4 z6j$hhP)bVP){h(`jr}NvW;YXx~&!dLliPZ3; zx`x=bie7k^^SdbjV^aS2Q2swh%Kx}+Vb#9WEg5otACNvKkj?x+Q(S_IZl2VnWF{?jG2I_>-!YWf+e=}V~T z&m%Q`GPb5B=Pwp3^{|(8PYpYNi8_B)>ijFz`PY#;|3jqCFTVhtQa%4LlQYi$0PLR= z*nb1q|1$#n=OeKHb`h{goWBF?Ul7>;3$VWuf&GgS*lJ|Hy4X=MZ;H1Wb^abT{*u&q z4mG|Wsqq!5@qbs*P&m#%p!6?G>3>A&{}U~p%=v$S_v-@hU!Nfd-4KEJDIX%9Hr4@i9QjrN>TeJ#uA2mIA_Di*A+E6+ zUYtPrX7FF1(XdtutW^!rM9j}ZNG_JkKx-5{n>BnoU0}0nn=!9rAO~Ivse8^$sE3Gp^^G+r)TK% z?&pi+?xyhu_pT2$y7%CFAHIk2eGuP=@I8v}Blx}(-ywY8jqiK#9maPQUl-qTeDnBD z;p^dB!uJHer|^9W-{^RO*mdyKe*-X)7ZdFiL-Ip!79$Ma5 zUh|;twukf5$*8fZ+>DkNPL@}W6}*wGQ(l=J&!bOAQP_U8Eu-<=-{IEt4Q|5_sKL+* zSm_#vnw%AG!fB#)$VuR;S*}*%YL&g$Vy{~5RhwM3BVUKT*J-c1W31y@^bzHRnuyS=(Xu67__l2!gUDDpv_$bfYH+44!vR<*Ie{%}#lrBkndO_|?x}I0?im4=UTFK2g7+gD&9Q$F( zpXRt1hdD$Tbqw6}Xi1e!4x>fG#hTsXxd!W{SxY8AirHoR#@^z*Qe7gQ5a<;%9-cd3 zAcZRI&ATUDuh$<4lPe7b!ol)u!yA}~MBy@$xH0VlqfdLBIr=fWK2*o>p-iqA9PFvW z)N~H`ki)_5@$1OsRfl6BRBumaW|Ejori7CmnMr0#MYWnhF2=Jb+&ph`0Hq83snQ=B z4$>AkmrLR=^U636Ci@<8r*aweYO+_*WLnpRcVO%MA?(F4Ck=W{p4c;(3QgzeD`KG2 zlbKWLoSPpnO{nFD-`UCO$)vic&wyOjRkJ&4){aX4YSt7-A|7VhVILh4=Hj zn7D!uNon=NBv+r@t8YuDfk@Uc z5H&#A{1_%pKGYO>f&mh~0$34<;Be+J=Obq)7w=fEkSUpd4vky{5rMHtzqg3dx6FYW zJi~AVF~2|_wi$lfhA_E7?~ll5b97Jykv?8JzW~REe@{jqNAAT zRUudDuF#^voUht*z4_@}E>QghkUg-})N~1HS|P{KC@}*D2^j=$t64Yv2v#Bx78cx{ z#HYhRuwa*pE|^8$^yiR|T@>*2Xa*QNR71uA>c?9xVhikUDN0+_T3oJz8+RQ8%5Ro*Z$# zBIi7&eyELZo@^tC0W#wKq&4}OIwO%5Ls zY;{C9bxpg=O=wNIS@@iCVx$0;b){-wx${nP9(QPtqr5(r5h<^ZG8X0T2rp3X2vY9z z*K2n77!dZ!%uKPjKdFfrE{fA5!VU~r(%5^vye^K4mRIZfUTvt1p-bhaY`#?P z!utepx&Cdjb9o(~^PPkEw%ozH25;J5g4N2MAxt*A)xMFz6?hX_c4+)si!CgknN8XP zf&q|w1labLo7fc-?kSY&vZVxl%x<$KWYHp@Fe4DLipag%=GK^_ye@7rmp8;O!Sedp zS$}?~tu!!|P_2g~-tt3ZWccjygPiJyu7Vv9TI_-d& zOP9OT>44CePQTP}jxx>pvE37eNq6^n{?zV+Zt<~FVQTkXg_4^axT8>b3m-3n(=m_GD&vhqWB$1 z-rw-m6<0L3eC77WhK}y1@0ssd{q%jWZS9*&^v!SBGMCu$+WO6NiOpYG+0e6bF0tXY zE%(eN?s-i;QRzC|-#D+*EmzDXu9#oD0XbFr8cS__ZPSf&i5utF-87fDX@0{EbBP;X zQ#rRK=Mu^JtvlutJLcEkbT)C5cgQsG5TwIqVZ&!{D7vL%nApkFB;CjHhg`jXr$2dj ze)P^$6nOdYa3Sw{TLGusYVXGjk3Wx0zVPTaIh{^pKmn1EJ1YWrnsKKKN>OO543(ant&nLFvd9cg)0Hb0u1 zcHG&`6+j2|qm#&Yt{KTw4X?Gd%P7^Z&$}O)rAF^Cu0qv;Mpdg$KYD_N-@%0QVaYWm z$Y0NHsC+Bl|HcbbM~jirX17$h3Ug=dq|~uc%%xpMU3tsk057Q{G9FKF)5dtkHk^;R{n=2WMkCTNExn z?j3{ApGTc~Au_pCd8Ox; zroFs(H=ew-!W(CXtB^pSDA(8Uy4$;*_xCfo14+4M$}2!>E6sQh^4<|94>Ng`$-9^w zV{)8Hnn{L>*uo@!tEQ> z_g_Xoom++EsRpcyR@JWyHe@$te_yc;ofq^UB1l3b0$H#`%Z%U1YK>coMnK~|yS}n* zxc#$emFF>85TCJgZeW{4zJ&-LPz0QWIt~K$sOmbXwN1P7OQB>8XfUaMgq$pWM5wuH-9y7trlKLd`Kya-$VsbqVT(ex0zIK*^;R@9OM`+x zl4x|cXhA{1&p=qG{ymw|+ED@HD-EjjFIWBS=1Bkg_~X-fT+~yt!%Rt#7@;GxZ7`T= z!9m|Tza}sfl}KSSZ?;0B62U0LQvcR_+~nw@f$SJaYkv}e&F%ATxMON*i=wUr?0vys zkMpX;M2HqS?^v8x-~%Qlui0DIH3?mRc3`3aoezGO6C8tbVtP93#AEMGDC%Qx zS_&a@tq_}96X;v_k?bUFp&)QdT{L@@F=QUQ^At=~FouSR9}P&w<1ozP@8Opc(eXUU z)<&q%xAGp7Kg0JNU*-J`^KFA?6N9Qd`6z@Yn{Wf)#&cV6@q9yxGMju(H@w{VasBHE z*rC}cWC=Ya>{2nAG1foggkn%oOrFe^Ch&X|sxoNM*?40N^u~i`Ks-=-Ucr6=Ra^+1 z)cR7R_Z(W4YLs{Lz7y9$ac@mgIyQ}hS`p!W5Ly0`*}9QD)$n>(L&w&SCeF5BeI{|W zbOpv^rBas7wom6_9V`yW9Qy$BpI^<99thkX#a;VBfAQ0J?jEG^-T-D2xZWX6X>mtQne)5sl(9I%kmCUuZL+`-$EB}k zx7nPP@Q#;TOewXVdLSDpRE9oOP6S@L1)8ryI^&HiYp`lTxl?h>x}(c2uzutp29r>3 zJ&CI{^r_Ba@7vHb(Yg8EyvL*s)2etiE;u&_<`M(*UDwVfuASe!eJ-(mzH9B%hv$3b zvU}s%#6~r7rSOMPCYA6gpm-l)BC^8^xUzFPfghaq7^B8>H{jy=hSS(T`&b`xuW(j8 zneb=0({#GwbmQq2r<+bEUQT?RXaFC~_2x`sg|>LtKiy4#_R}we<~bM30QTxka;HK# zxt&QY6=g8pX?dvFrD0&HnL^We+Tg)H^)a;<4rWo1<`pBi5QTCtyq&ql1 z2utx};Dm;Sybl|zptkvHmM~&KgjH#n(_|RDi>O>s+^31de$(_+3b)69HK`aKH=Kr{ zgy1mkgax$_Lep+lJ2f!nDyt$>%y!%HxbX ze7?)%QcEngQdXGvy?7Wm8KD5{QeFWtRHTVjAV*ZoTqNZo8?7~ESIH_SD$~m_Z7L6< zHwqa&Tt?U90zB|F4J~Uvc-J4S+VS?*0G^hwOV@|o@w~s zzJSOlqxjlSle%g=cN7=?00mi$x=9X+k8wn5QjSP7ovE(!4i08zC*h8!Jv%K$siZw8 zQPz?kV=Huy#e+PqR>L)Tm%#e@KKz8COe|>%v;P1y5WU9}l#lZ>%js30pWjm7Cxlur<5C0XGjg%^~X(l_A(WCh_EELmxeCo89$L0HID z;v{*MZE>o9_L|xRh(|!js1%sr8lp>pl*kCDWnDBlLX;Y^m4+ESisa3J0 zDLkvaAI5Y9Qj3tJaHb;pA)rxwlnG}S;V(p&K8ZpPaW&qE3(%!&E9ufUpDuN;*QBYt zg`}yaCTZ#i#QHHGlv^$3?n4D{GE=e`Y<6o529qoXb)E0DIcNtguK|w)2qo|oV$RNw zdkY|?|A1zCOs3fl>u^D&boE@~>iLaV%_Xjy4=}Zo_q&hT(U&zwek1iYB|KxiLk zz!Szwvgt(>$ATT9@8_hO$+HD;KqEJLOtZ>9&tthEEpHs}hi`Pr$e2!cYz)qnP%Ubs zkmB0drH9427h?x@<2n5Hex3Q z3Imv?=s+`n7n+^FjQTw$-@^Cl!UboinBoKTk{L$vl@I44=N7(3q6*Bu#+O%ooH_7$ zvhj3-)AZP_sG*sXm6Cr?H_D9sou$r5ykB2xIJujW0j|^Onv*lY;$OV^HQQ?YT~rYs z=bKC|tm9{J4J{ofTDh?pnp*3W=ab+PUsLgG$oU-{jjM4Xnu^xW4_=UXsj|dq(?vbvV0+G&?~sHQq) zFLxRXt$0p(pT#}J)?dY^*!}^BcM<5yEueK7S|{S?=x?zklV4(QaIRUcRgbt9_4Ljq zdgt4_;Mml)=9&A|Y-IuT_HVQB=aJZ%%Nb08K(MKz2GN;IjTB}t=Qlo_y_ugv-7>(T zK7ke%79#zkStxGAiBnAp5L3RB+N`1MT*#|+G!8E8MA9Cm0v>k1fQB~Ig=)$NjWFhM z5)PZB_>~pgX&vE@k5Uz-m~5&GwOvV@!Bk${)eh`tl$D~&f|L;qG)k`!ycpYJR|$3? zOqVc?Y&kR9ducdH7LXabFld~}=F#R-`;&A)m6oH8#u;va zesEIF`7YCDH8UY#3J3BkhEq*KJ1-P3lJH_46%)u#oS^s;3sdQ7z2C#r-!M}W3v?3} zD3m@g9)ESP##4gtejv6_TIbWHGv%b{ionbN7=lubaQGDe?(m(-6mSGYXLDPo=Muv)EEJBU}KC%e^$t=POzFO87 z<_~5E)+DBt=&Y1Zb+6h8H9U;%donv@UxAr4vXw6h>jfRCRbOfYV*#c;&M3|IDkyr< z>QyPb#@@UviHCL4)-ct`JVZ z81B`3yg;3>rRec#pcMx!I5%2(L_xuYB8vno3B|~#k7AAcYaeS>tv@jNqpokFeFK&# z*HviJ?M)s~_NvfbjisbR%1!8KX!m3(ho_aSVs8!;C9HgG^M}U!BRu^hPF<>4v0itQ zpiaNI>y?%>4<0|;{+=_5_tc=N%UY*xhoOSj3w3klLZyN_v{KcgX-7NN%J~AXxP0PQ z<{$GhlfMbB%w2PdUGXcES(mjCn?XcnNETR#;->q?u0{6c1zL<8H0+}*%3EAslGxX* z2(-dv(jndxoO*xAget9=71$ma5bwVt&)-Lv;E5M+d}Y&_cf99pd-_ZwU1JH}j?zmZ zl}?zgZG*dguKHr+ZV|f}MM2)nHzNUEWyI z%dp|e5D+V6Sq$%PB))kd3x397V!LS$d8Zk{J(&LveXu0HE0l)h5JTv{ix8OvcN#@ zyP+RjsrTK|5B<}=8y=Y9yq`1qYlVv`}We6*2Gsd)uyDiFJU>?i#il1`PV2>B=R7M zm516L~QOc$=Y--7y_)wq&aGc#*bJ>~X8 z3=N=(NsK{2Z^TuehKg7a&3kP60*HDE^yGgMDieg7ZYb`<1vyzU6Ug4r`8DF)(bD*;M8F!J8Fb!9^{~650?R@Ee5RK7%(=Yb#ML5cop% zO+bUBX%1MMILv;TC2HBSio`#fHsOyV zPaVN!>-{g}m?Fwl&N#2bO^yU=9i47!(5Q_aq){C;Y19V+`XbOMU&!H=qEVz<5pl;^ zgL^6-S`V%y3fj#2)P{1W4p^rtm+t~^trCukXlF$sQL)G{klI(LT_Q5IF?x}c9Y?UG za+ijbR?6!o3rk;RwM-E0xS@C#E=b(2nM+(VuZi2Hxx}XVmhPwTjV7ymo_;__MW{~a z2>PXt1?b%0vk~W*)DosTkf9r2p?EjoB0}++h1#tUL5e1nmeZ}L+fKKG>XA<3BUJAv z5_M8N-N6gfJ(E$JQ4Xph7F=_|jV)%>i((1vyGWE#zd~QH(8|k1va0a+HI>|aY@nD7 z6U$5qsFZij%v3l-@hy650a3S^ObUf81VrVk08*d)c$rkAzeBdYIxK#x^Z=zg6}c95 zldpXeWt5LPzXS}Y@N5hcRfPL>WGNDja`eqd+xN|6P?*L0N96iBl7u(m0@5YCYDv5| z_;Mv=%%1J@8?PoU2SpExnOnO^!n z$&o;&GwZOwv*U=kF>1OUqrSu}w=|m~WO~vcz5sRwR zZvuU(-8;_;{)x#yGx--L|BuPPGKn<%^St*5NJjCM4_}1doba;!Z$lg?nW4|#YDIz-HD5J57W&^Jb4KAF3Fx*HE9xNP*fI(15Y;}jbnsSSG z3TP6Y(~9UIx)ecEqUYWi^x@OU?uR+hucUl`5P44CNQQ_n6nz_&ZLr{t@4k`I;k=AD zgZCSpC{5;4^!-DGr$FnWUgz($P8Mm;x;&0Jsj`eu%FAGYZ2)3Hm$c+ zs4^(%)w6N(g4z>f5Tz4iMU04dZ3n^aXe=7zfr_09z6UDbS&3lW0TE}mJs*gV1YVZW zk;bOU+#q)D%6#Eux-g}r!Y=-pE{(zrG=|VWOYx#>#ZY)mCO96HvxtU$FS-``o=1`n z?)Lo3%7*pO+-{8bvm-=UA7zsKIbYM)D*P3HwzJv}CSjkZQ9P8-@~w|gCF(@o9G!(R zH*+x>vvFqUZ@~^1UIh!t2CYN?%8L4Kxc&x+dVBCcC1y%}bI+Uf&1HJR1i-j596_aI=F5f*#NjG{ZzkcK9w~F@z}I7(*A03>7`? z1eT07hPHE9jRew-T&IY_wJr1>C4ux%*oZjmK%;8?b?UK&em&6Fqrkk?=_~QF6;gcq zx(b~iOJA>+W4ex6qiF_vSY49YdL1tEq(HBjSL#3BOkV60#N038B7fp~ur9%iI zj&w5jEH*YJ1*NcS1*P;$C+CS))V^B;=ER%@!Bz+TB}=nWq8X1)RGsz=H->|N)lYCv z5~sXrMXERj--2!P^yFaGL15f+RVqL|jRW7e}KnsK3&pWngC=l#k|w#wK+_#DL$(^`oO^l_R5)U66>Ti%g`OLGr~@)8HD60 zcKqOwDx6El&>}iEiRlm$ciKm1Tx%l@_+zn`e0AZ4>#f@2e~|g`1*6NHOzj{moDGZg z=aNY8#+Pdu1H^aE0DJVGM#be()Q1dG1><(H&8$X`I~y2xjevM z&;-i8K+#C#aeId9F>a^q zYCEKc2<}48yNQplM}@FzA5tp#O;I8kqJWEQXoU_dNiLV&?z z_4@JXK3JH>T*wG#x>7?vj%kk@SQkzfyqtq$kpzVwN~z6J%3vL1yK|6a@IG3alNfQ~rE$Gn6=c^KGz`|HDUm0=zC_h~-5ibJ9eXdKv%z|bw> zzLd=d@+$T{%yiqEynBpsXip#zBo5Z&*?V+&fm=4NBm|_^GNA$noD{PUU4_v1ZU#!4 zF?iPF@YX&6ObuJ`moC0M-yT@^aN~UrYeKE_n1v>Y^QGph&!Z;{t*xA2-VIp4+?ZS3 zfttXZ?G=y1Egx-qapIK&ulAi8Dby8C_8yd81S>}6L+u06fFqAgkI1a6i6e_TlfjYR zr)`fB;{@^CjY<}HUYE6QX9+3G3zM0MLxhii;j=ozXX2Gyl8a}&E&XF$PdLS$L6&?jPro?QjXc%z|(@wGM?=*aveO?Z|qOr z)StZhczG3KyNWBM@0q!T<^EPKcP2gXR<$F~uJC;%gZoI(le zL@Fu^fgBpov5EBwa)-TVkr(HU2^U+f7KO-xkSh>*JG;;f{vF7$jc=$KRh~;S-`Vq# zM_+v8m7Y(ZI+M=T#i;g6>)nQ-MyFwDMU`U|?Uuorl~5e4xjR34=cyy^<44Sah_eHg z?mGI&hynMMoQ673gyhM%_jU@j9C1s>=sxQ`h&Fgfki>^oM>xR-k4cKJYYxY`buMx1 zeCPVP#CoJ>6YFKBOSYF*_z*1~2TJx25~Dt`a>yWc6WilMsr&HkrfRQ%(-dR`ZM)Tw z-N_+iJthd%nz3vSic*{=^SBu`9?-a(uhD~iPc`6t(la~W^yypA96ffn{oQ90@2;_4 z--8ktN~G{NclvvlW>%-xl-sDlt-gkNoVXc4@B7f8atHJ?lST7-qDYds46^^L<~lBK zH1p^I@6KG&KMlM_gnc-xH+W2LVIK~l0d^D8S`kI6?+Cs2Y~orqM_3+<&~IkkQb!*7 zP!Gc`MzYlVa8WsL)WOM&7l9c>w1AK3Z5$M;A-LFcGLr1pH(HTgv{7?|#2)KWk7Xac zlmihX;92Z%*F-pp`nZ6q4pPSuQunxQ9y)f@ap|Kfl1FfQ#i^Mys`DUzNKWWnGKdMm z6G*iBMOYfEN%7yP1~7GQdkNugZGebL9AKep@Il$=8g+p3qg2E|GJB$q+Mp1A&|sMw z(jfO#X0(JLyrNZ#fpY2cPol7XsYM~>dx;`yu5G0zTIDUAv$zUNnU+L+)b`YNj)%c^ z52C95L_{fM1ON3FMS{6=zjA}>npW=LZ(aWWecySdCQIhn=;$-usnzB6N2d{b`oTgm z%fp>A=HP{^D+zar83(3pPJ{15=i$N1cL0$%6s0(RT=k_8giiMqw!v76P?H3B_i?Zo zpC_L3Bh*ua$K)~7%S89P=MuZ;*UIU}>KNlFL+7JOrub5Sp~{_`EhyYWl;ZhDhTmEdVERrYjWuQ&~@)<#x}J2M+7Z zw7g&k*jV<|-DIPNCD_fdw0T$^^A-tHb9X*qvw?mSriH@bc=M*-T zjm;!8>U2dOD7#bMaHpn{0|Ouv%?J(Woghgyjjgg2u)zXl$u8N7{ypgq}9b!c8? z%$qox7#NAmL{XoDS#c!L`PI@*0Yq*>Gu%sTSPdl#aRhfhK*8JC6@6XMP1WG z-o(Bjk&s#`rtTn(jD+f|CxXKpA_Mivf_g;H@gqt%8FT8U>R+=K44D+MNOj+0q@jgK z;k!6!On!vDX(XS4xx~PH{gMyMTXW2EB%2rOm29MslmU7iJ7%#5O}g`qC4Odz4E?gm zO%ScVyDv!W>K20p)N%=7?;h+A#@^5yl}{$=p!^cx7l{Z~(yN6;BQ=y4Mm7q=TC#8y z0CSlTR3!vm(oF+q6?lh_&v0e=3xc>mTrc7#2PdZU zuLashX1#%fj zSHscXHxY>}gqYjVlLi|P10#H?5*x4mI>*M{hrGh9n?GW4a?CC%2#&~tcU>+^y#Qt& zK^J;Vy1@!tmRj~k)sLB3{(@lU&)18YZTEcb@Uv~g*D02^?d$Wn1-1{2wP0)i{u8ig z5OqIU(OttMZGRfH?f{)^Avy{( z*_)P**6WH1?AsJ-dZPMfV~Gje{dPBxeL(PH)=H8XWIk@PER4*rVwXi+yB07Ij1h%1 zImAArdDd=kjiT^?tCw#dU{Tlyd~;F6;RBE5146q*`@o0lwGY^iTG$Y*G^!@PBs9k| z2Eu`2LQPtoDq@l$8h}0wNDa{=#_zm8=;Nha@Evyyho$EGQpth0CJj{a(D1!dXR>b2 zN$#oPvv1$S(1suqt*T_HPlZzH(J$?d;P8j@x$I-ud<2Cyjy;7k8@3khZx02$ZC^3z z6eI)!g0{gTpnC?!u{%Al;1!c@X5961Gb)t($aKj%>7UFpe7h9NM2j&31J&9mvIRz1 zG>1RPj*QU~4sV447e~%HN;^)KyKRrseT&5aEI&49fCoY-SLo$I0e0FK*y)!j0#peR z=R|csf`vAg6`?JcnVm_xC^0Qs;XyT8`@Qj^Kajyui6?EgVHc3J`7q_JWHw>1%5ue& zs$gppx=Yw#{xtAe$Q)1&1BT22)iPC>16JDsF?4MLnDjy7Xl)13C-4R6nvFDBj~!qM zUTbT`+vp$;Qt;i@QkB;4sLvPTuUR>S2aCh=jWB!(HhXVp3q;FT;g_~n`=#;S%m7Uy`?G9oz%lLS zS5BUJ@X@pF?>v)uXAQ@+3ABAd$299g=&ZDRU3j(l)7{%-43$+T#?3T1V9G_U{V{jO z_#>1%i56Y+Q=(%B$p1BX73C-p!;F+S+2OC>W39kpVDg>pT*h3r9&2m1&Ly_OQ)Di& zJ#Z{i)S2PBvx)1}JRy`(&JTV7t${muAT>6gBePh`FYWXyc&0J_20r4M)>toB!rok% zAu&eWMKT=978LPU2u#X8VQFZA4vb)kg$Oz&2$A=PHk2=D&k>;Y@f%g$*PiIj^zKcH z-KKX0SCAtabW`1?icsCGr4$UjQat^Yt{0^svnn>Ax?@{tS}z1pWnKv6LIxqffy*Y~ zAy74mw(*sFbi!5q9at#opG@9S6BUjah-CsU6@CbKQEsyY+b12V3X7|Oom!VL7w`daoGJ1iG4KiY#Xu)w_%D*OQ=MjEu?9snUDsA-QFndlILHPbsziAv|!nmr1=`N9Ch ztM#g5-pd=Sl=Hq9HOKP-#-a1$SKDTSfVpL~G-FV3s|=T-k4XtCl!HIE@oM}&WlsBcTjkzD}MCZVCFw;W6=V#Fd z?-NX7cm!_&o%56I1tzbt7q|}rz0f5A20CPONJEqsbz=)JITATPWeTr|xR9H-)}INjhh zy|ChRqw=GFIT46`(46@l6cb!sW%Dm2Y6y@9(ZkWrya3R@92j>(t!{|o3>kz#2Uy7P zv-8HMCm93*qPE$ue-WHgs8Sir_np|Alw)l~vjQUIi{TL9r@egg#2^kmEjTW8FV~q^ zE=p?W>u4T5!YJhn2#zpTNUQgRxn4&UNShw;*(Y;n-&nq1d*FoFqaYgdBicWFYp#AsNAKFB?qZd_2~nqlD$FJOZk(+50SxeYT9H?msnOw zhhs4Jses{rJIg1i&QRHP#~_RDb>%%-m@Z90Pb6ERE$fR14Wt4O_T_QD8-VkDrLxoHB%Bq`G!He+G^U!% z+bUSzN4?C{T`<4pT<`FxW}g8;eek>S97)0R4Koei{kZV%M3QRq9>AY+do~Z185yl< zx7-B<8p7q|3OMo(l75k}jNQolN&J|-x>n_b=`__B>Ga3YBi;z|D`uIMVn^%q>~osT zy^r8(b~TW0@-$QpC8Sgnc;kE~8D8WSo2dZ2ombz(;!J*=&|k6-d21BE>__)NX_&pIfB`$;=>WA4sOn!s?a}}zlfGIIGx@1#v4QmvOSuT&Wed*Sn ziK;x^$%!mN_;5Ybykq!WWya4Whk-DZ!hTrtFc^Vv(=lc9LUamKD&h$|FX0g&L725} zAB!K$-pCffI0}47Cz>maXGf_g1y#fU$!WAo+)I&5!0#;NQ4)a_CJ}{!CMC5KANr=r ztOK0L6N6C^ViF;O&{Sb+8pmlSPr4)U0EO}qmWs#Vo?68)MTMnv@f5C>Cc{2O7S#W3 zdN)=H>nl3~m|qpHE`l3~eF22O??i>UD^`(dq?MCc4RJELZMT^wi?nks*%GDAO}*m$ z6S6%?lZJHk2KuI)(Jk4-z$w&h9Fw}b2~Pl^zqwQUdPu+^uUeE2=2 zZQ?)i4S0!wLtbP*-2(1uA7f!Az2NDMds>?a1j>g+e1n5KM?nUi!*xe!Q z?giHdZmq)yZt2aLFT-a-IH!2m2Jr6mgLbXQmM<4D#F>@}z>R;c7;42wS2Drc@jyqr zqcm{B@~qWtR5dx_Db9sBR@m^C;DDFu;{FElwwJIv@P{z%eSQ?~OtOB(Y98b61TUkQ zM@6dE$RQ}_YHQf3HbJ}>u~v6;abJysFznnGG3?lFSnVt6m_u@x* zc}KjN8Ux-;E9lJ>S@6e!EiTN0k7xNVHn*n*=LPw*i-;0@vQ}-(#ru*vkbg5s;WCqS z!I&gLGCq^^lUT=U4~O=ijB~;vNhVIwNF`v1s5ZsCp90*YL@PROfeM8ju|rhDErM8d zLiPcl#&e52$UDZ>-&elMRVRHf{c!iPO<=X$TZ4UwYk4)(lUi3^L-q4PcPulVGl9eW zT>;jc2cF%`VBC1T&!V_;Riy=?yh=ZxU2^~`OsXf39XsBiWj?ws(chdvV5t`G69oLzOn!!m-#))-4D@XIL=q8p z6$ZTV++DZ`6B4?@D)-mZD^IUF-QsUxe6sa)V+o9+`b;-^&2W@$bs9N%CHSjD5w3H2Wn&GgqzD1;Mp(jtfEF$ z?TR`NVQgcD*1oUqWmT$T0zkls<}{0RZ*spcZAkC}#kebhq$VV@aQ7x3Whe(sGz6Z| zF_rar`Jzj5ER)R@2a^w|<8ynfVg%bzUDi$8cMI-~47V(1XQYJ#3jj8Cu#x`G%IUnr z7#NIWp<5aQ;quHPh0ECr}lqk zLqkjV*$us4Sk*hf@rq{~pG|#B$9#LoQ+J8+coeYgr%7Ec`mo@dWL!>}>N<>Li%C$A zs1N`#hsNb~ju_%Bv@=3BNrk-6Gg*Lk{u~J#lV4}w?LrCCPB}tf?rWX`_y9ic9jS<49#hF?)C8|otsuL0gb^!uHhm91K z`gViIqNoIk)n&w&xd>Laa*LS(aJdnMhTt(-a$!!;h#}RUN1ax?4PXyL`b)j36 zZn22SSm&=i2yWpR-3F4X1#$^@D)?^Z3YijW3l|(M4oztxlcKFWth&c0M2;_pT;??3l%9nZa#^QUa(jfcLQ8Jhh=01)R3(7OWXe`H< zNeGM-#PBQnTDq#L=&?tfHTFoRDl|hclAvfI0okOZ2YJLh4p!kBQ~M{2*t(72BaEm< ziXS>>L+aLqM>TU5d&2}sTb-bcG&Mt-c>ls0!4HmVjF2+F+q#Gt)x2pdgP?9O%4mD z8cz1q5cd51Fk2OLAcm?{fSck>(cO_gHS06`5*Re9kYE z8Z3rFCBLHOr*UIR_UzjH5;>=O`K2{SGvni~^KgJ`x-!5NF(7L0SZ_%(4M@LO z=E)CvBK*r;nc@V6$^PVl;Bj^wlG#xUQYuos&V4xlPqSQx;W-Y)uH24&hKIfinEK!T zq^Xn~S*MdNj(So?COHqXae{s|MhU%$c9R$=!2X8J6V(b{5SE|Vqt6X-ewtu4e7 zsY#${=SAa;xZTCo%+4ZouNE(p%JhyE3Wy{Z&+c@fHIr$d9Fb zP(h9FNG6YeUq`Q4oXSit^p2taWyb_NH*k<=UoaSMC@@Z_XF}kr^i!-(M9sl;5JCIf z;xzf*_e2PMuS_YtU~p>rL!(ETV}d-P!SORa>0gGB%s!cF>ftiE?(>ksR8tJF zkU11kndiwldRg}bb>$hOEthcIK8H44?N!tX#xWOI;?h#;uUiqvE0iJyg z{1|rFjbuh20~-i7lwkd;CNon&dZld6Zww$7Mi?*J^><(sW}n2I#zgZ98SHK#+X_Ef z&&6?V;96ni%mTY53n#HxqBxPAQpZm4O>kGwckrPPL2saD6JdtlPjT*{TdabD0RA{G z=r!n{ilL+ds>h*DzLtX5a0tq<-%IQn&2R_fePl`)6a?>6c+rCRXeag@1Z2kz2!4m{rxlwLw2=I6-F z*U52*M9jq$j1@6^Vi+0kx6qv1C{}1m^R5-5hTj^MG?i)5x&YN9Y2Ln6NwXEQWSeN$ z8SS(Ezyye1b?y2n9~%MDJA(HqHy2CpR59RMQ@0BGw>dgYo@1Zr0G~<)-G234;_7%g ziUq7?unDid3Say+n}`E$m5uO>5z8Qy#J=xzQznhAm zUi#DMw=KdtHfHLD6(sgDD1x9v41^1Fq>M4yQAn4{w(3?oAYP(pe8f8U<0x7K@q+PIXcyg(gds@vfJV6gZt$%? z#u5EjK!c**eBYr=uIMUBF*F+%EO-=lEFC*I7A3O{1z=Q}ss^!IwB@&OpMQyH$idwE zLch$zeXLmEEK^$om4`Au-f*L$Qg7^QNXK7@_Ym!leG}reD&)lPXhl=-+h`0R24H2_ z(Ft|DCO|SWHS-4~4~QHJhAH5yNkXFUrAxieccS}!ByEm=Izu%21tx-st5yK;s_KyDM=54oy;!53F!d&k<1f0Lp@9s5(jBOh>A-y!M`A zA^(8);7n=4`r`PfA6QEFUgTmgPD#EnscYv$OY2k)L+h?WdlzZ8`9qEhldrPd2!Iq$ zc4Mv)Swc~`SmMTFmbg)(pv^@j3c{&I+(6n^;xRr#+CEiVrm&=qJxAK6`p&FC$DMMa z$APXUsFhicaPf$WA_9R$&gctyl_-oF7s|sTnIP{iBZWB{8YEvUPox$Y%&JBKU&YQ6 zAz;Q0rS zCl>mJxmiwS1cCN%tCJ4*BNUCtO=QyZeZBrr7=`pi<^;SG;JxlTz3OeMP=!Fh21N~O zhA^YVTjm~4C{g067FBd^wSsyEMv7j-NWY7{?c*!sl=(+QE%Qv`5Pq{)?RnHGbG-~^ zbRBvB6_C#xqy=2BBQkH-=lWPg9}c8Hs!)$giL>x&JXe=&6X&04wLr4fE8?FivQ5`f z9%eyDfI~djboS~>!A5Mb1JFj72E+y%Liox@pVC6P#d9B@&U&tM{;kXM7C2sBt<~mO zYiZ!Sj8a3Dd$9hp_^tLDs3+z1;hR|DxoPa!u-dA_-nXG~(NK2(jpNSbT3FF##~$g* z?zzP7dF996wf5=5^Ba!NC63N-mNSaB?wCvLnD1Ki%>61(91BAX{_h0z8k0X|@@GtF z?YF8dDyWtwRXty?o4X7UtN~Ch%K$A}qzX_4tvix4Zo_WvQj0qEM493h>s}4V!{O1) z2ZiVbuU5f_3RE?Wrp!8+otBIl$YJhRnnfdtd2I7X=aZ^QrdFR@Oc}fj^g9N-i&$qg zFl*0YtTn0$d9;Fs8=iXtF96zr6_XfFXj7IVQwCf?6*zhh2VM>*;i`EZXd1jFp|sR1 zA_!~}C*rb|*sq0nYw8SO>iax8RN@V03e(Ax8CZ(&x=V~bb$)deDHvW_T-mEF3Z;u* zsc=TMOclJesw*(_yuZLIyNL^zcn7#uxxMco1FbghY}-A5#f`Xry&g9Dn*n4&Ho7); zZHEr2L%iDQ;ibIad8NF$x^WfRX6y9e-a09<9#AJb9nL z;ZMK)5k`P*wRjwjYT%)DAj*yB__oyq2;YbObQ^?;4rIkggo$@1YU;^+FLoJW!RU*| zW$RfZjSJ!x@9)sKEK&U}C;%d^ z{j)cdiem>ZQmDi>UOnH{!>zbRUc&v?H+RxSyR)W?_5~1`C_Kf9Ol|jbK?~WOO+KV$ zo@16e%W|(ODSeScBJzR|%Rl8$axo$~fI@qPSvS9s^zs#!V)9Y;-?b=CQW-cxvr=#o zH)daYVPQxw5y9oFg!_4bvs7>C(#zvjr5EB^jp{C@ydvYEn3=u>M3tJln#IZ{mz1ob z=4%+o2~{O^QV%Ucdn4qM_Q2{3i6qr#dPpRxmZ?G{QPrr)<-Lwo^HW@iA!%d_F&Ge+ z5=BHZdE=##PM|O)gAkdi9k{$w(gWW$(xw0n4D_V)f zms@;^#D{kLxFRn^g5@@~R7w53FB1g`$r7w6ta@1f@cxEbMBccLh*Ow$tL|ASfWbeo zFq7Zsh#4tE?R}MWb9` zG~>WgI*T#!jAyPQ^144EBS8p)!*zaCIq0gV5Yx0a4UTj0YPbFQ1`swf(-%aVG2+Iu z#S=P2#(O}A#7bit!?_ctYKM%$WWYVzcI0A3o(@?Biq|fNgq}rX;E>R>=+f~*Pmfx_ zAvEWm2W|KwX^$3r9#TF4TgfiK4In7_fP27CBl*-N_Iy9+$C7lJwRfiax=dbGjpX4l z3P?n&>1@QkO~O%ZPHic-3ocT;g!dbyf6p=bG?ULTp~GCjsMM}^E@boBQn}456iR97 zRnaw;Tc--e63+3Pp2fSl#0y*@b^5C1f1Tcs71`;|({_%n>V z*a4+OGT@jO=&c~h`FaPPO$B(k8<7PVBEXwgHWXjgbczMl1b*>lgZJX zF~Z|OEf_dprvOF~>lSaQ)g<@TjvVZ|5quI>XZdvqb^%HsPAm08dRX=f;irkgt~K6i z)Ro3l?4y~2UJg+Zb2Ed=9(L!c49~V%gyY5m?4>?X$d6^m`;%(6*HX#KJ16g-k;UQr z9i-F6T%lA$V$3K4sb~)Fh1#Eo?2dr3hgPP={I{c zSKO!H&~G!sSD=gb`MuRgwecjJr*dw7yfm@z=758Uf*3M5s;WX5)~}I7Q$5^Wj)jIXudaq=$Nw8STfRWH{HW3a|0(e>H%7u%S3Wa2@kRRvHQb^doKVucc zDmq>9j%tQQw7=4OKJ^uYlgh4MCaN6`=MP}!umV7`B`3t}sWO3e!bUpqNfU*D5!WK~ zxZ-%bOmg@k#%L6Mfv*0fR6N8yHZKbSHzA^7-?Y~bwM=LxS)Taj0f`YsD_uJ z!X{B1UBz0_2A~`oQ>Fi)xX0m5bTFVxS8;ko^{OqW2A|W8AFbf^+yPT*h$~l9e=x2| zF#5p%DA}9G22@Y&RuF*V4qBzNBBlVPd#RFFJ+wW#c*asXM{~>IibH&x1*=|AkCLqO z+Vkn(k>MfKAq$65@jeH_o9a@m&}VS17@(yw1B#RFRNR!9cJ`yUZOGso zpUy_8c~j(#$l*bY{|$ zGqt>u?QnsJ*uHWshN+!do9Zcd9W*QdkT^&AkyEU;-{OXd#{cKg9p!|mv?3hss>e>I zX$vg35?{%sC){eBX+Zpm$kmBjKHhNNgdy;l%yJw|JnO-^#Nd3J1bfp_t=Bw#|9m&K zTf&i6nh1RB0D(b!+DyPJnM4$$qPJq3E#nD(v4NIuVLbbBu@K`4hLgH3e1zegtg5q8 z)&kqjOSBjq5!zOZ1rtUgVhp#nYBPdGZ5-EqQ2Jnhga8ilB;;V!?LIg`>CskuJ_LZG z5}Lw>eXRTnGv2r{;i?`MJ*K} zyJ-G2PlCi@V?5&#;SFrxsTZ%sX4ELGdoxVe)X;GkJ+urI7$iPi1`3B_mL5+TFbJkS zU`kFRvbG9S0G}+JK8ctG`l)TBU72we`P(WOq8=VJ;4-PuhzJDQvJ4QlTs@h@d09U8Vo>H?@?6s3LUHr5zIhRt#JuHZ?KB5Zzm;f zzc`fCcO;IniU&@Vs21L}=b)ja`+?Yw2+|BVt;LX2tVwH3@`Rdp*%1@RirFgymMHkM z*%}ThcQ<8VirACbp9t`Zc#@FtMRBAE@Kqf8GfXV8^({%__9l9ycmmwcDZ}JfIAmmm zs3ek2Dq8O&rg>#lQZ}TGTjvs6Lz*D^tF628Y~o7gUQBQx!D2*WqrFa6A}ti^ORJGI z>4K5qFV-Z%23Ilch#5+YH!sGfd0DjS%o|9NRgEKyt8pZr2N)?7au=5gNF#K$Zt(@> z2N=K#0kx=;P@$#5tU>T`9bAH)E7}+8D3H1E3y`ph*zI$WZpzd~Queh3@{U@Gp{}D+ zq=jJ#>#_`7mEerwBF1KdC{c2rHMEye|E&rn6W}EZ64I8jU_@sju7UdHB#;$OW}!Df zcn5M3wRnh2S7;^;jcP7*VA~03Z4jADo@x!C%#HIt2^k=LF*Lt}xYc)etBG$7&0kEJ zIGVrS&a*U|V&v)7Xv%K|DF1_s@^9C2GweYi`-oj?1Zdo^i}EkoFyvEy-^tyVoOw@~ zgLtLfN?4+*TZzcu;_ew)rtWdFv%50$?cU!->k+;^XDn?Pz%`==e)Mq&1zs+Ct!`MXBJYCEDAXz)vkfJ)WQb-`%fR!rJR zAh{mXf}%f5ylu#LAD7j7On0bIC7xXA#Y3;G`}D(S+wVP-xVJ_yx%Z&VQqYX!TO8vK z#OgBA(#-1AnsWDkGr5l_eQ1otW8ch3JhQ>bbI^KP7#5{rqwi{4%;08mrWd)E&h+K( z6B#ckc9z%h#$zW@&Pt*+Rig3u>212}MdsNkyLW@~ z&Dq2@h2;nWVLGI}Ny5C6$r->CGicalo>-4Uj9@-``~@+eV`GIX0S0Er7G%Lk%#O#a z>O3WObPNVG63WHGe-#=}e<&|91{Cn=sQR;x>g!X1UQi57<)?1%1w+Q7@{D3+b#pGl{ zb5NLkEJ)*a%_VltZxAzIm!v)7>Me09LS{Zo;|KyfaIYaazZurHXBm6$z+EbN8>p(2 zTbR6opM+yJdX#>crt2WOAt2STbcj;d%vnLH%k8Yn$Y&{#flme~Hlh=CY?<#w=!=~UX@y7__-|BZ zUq2Lk%>g+oSps5e!hK~7;g(DTVn7HJaM5bgxksJmAtL9mQD^q+Og_a#q&}F?wCK0M zF@M*QoHF^#Aaz#TyOVQ? zV1OE@aaQ96Kcpg_hy+i<)?~<{3H3XK_yeKN1B60v6p{AJdD{DW@1K!56WDYV%B1%( z@9ULZ$;sll&RHKFsoc=LM-{9>Ak>>EY^nPpikGD$v<*yUvHcKgId{1!K%r6N?FxEP zFU-2n6gFzLP}Q|si!B;FkUXZr`pIJ2eCbMg=Q~u7D->tQhak7eDMeu&mLVSt=d2_j zJ)vo*2H6_~+WKmMj2u*CL^c=O18)~aMs5e@U6Ll$3Vt&@fT)e(jE^WaXN+ja5W1E! zh-4;RBJ^N!1mJoS046&+A^)1gheSN9vHO+QOj+VS+k|UImE`g~8B()gXnuCIbXS zALFU_oc>$fEX&T|NB8Vr3RISW=uW~Zrtlh78;&KWv|7{=xi0X;gtZC`dJSWi>U0IO z53U4uGp?2l_5~on~ICh;OM=?u$uuE z8pcORXg+e{#j#g*z1nhSc=Bv}{!AiY!@_oY*>uI>$rehXNLmvOzsq}7!|%@Yq}G*N zANGv4aZ{zxGVS@w#yx1P_fJU9w@T<-x)heXA-)w(x{gA(Zc*F`%bgS4>7)I49Hn{e z(9Te4J}cW_Qw1;h3w|Ujbj9Kb-i;)9OdjTN+>S=l=C*S#v2$L9vbtg}am9R(I2Ejw zFcra6wgSdVKm_?xo4mDmGwZm8$*oLoWAY{@z3iCqY#GHZ`A}(zCMmld16kCv%bi|z zy5)2$taFs~@Dc0W7wZ*}9)9S)i$+mnkuWBQrm}tYp~`B3rg|qzrK#fH-MiuL#RwCF za9!{9<4wgp-7UzhiXh_$PEag8erG4ACzC3ef(dqn?y?v$GKp0&eKW~^mG=(>I||Kj z-=m7|2h2VRp$1$3aSlc%$*i`b;2Kc1=sS|l$QkHS#jFSRSOL=3wq zT%$Zf_5u^d9@g6CFH>(HGK~^L>N8rkbJ|)Ra|znD^;hcu!R_hwoYDGqK+4wM&oj#J z!g}**TFk*sa+3J~m*qe#dGl@}QWtD54kLo{MF^{k_v_Zoy^WxmJRhV}vPo`Pbc!G^ zAkDd^UNMd+N~AcoOBHT`#q0Nu-+3W)IbjkND__b zs12+XLLhYDDL*1~jG(ySsXL~#IqW;KcGHPW2}&#-^=<_Fj<`!Bn@2!AlZD%CGRYhc zS0SezcxP_D8J&<#O?p3*)W9$m*jPi>IS5B@SOT8B0B4WKQj0*-j2L5i(V(7=uVOL; z@B8H;>FPkKCSUKE3RaQ|=}!hZ|prT zJ_7ppjmK-z9@R;T^AC=M?G*oou@jjpfSLnr`vkkL)DTwy^$ud1rJ4fj7`f3X^BoTU zvUYf@h;M^AF?(&G9lF20L&)%_Tp&Hj2u)01L&x@y4!pAR)qBsjzw=Duoi%hY%i2t_ z`Ji3*51Bb|L@D@VI8VRf1Lz%#CnT;zo9cc}rTUS>U3hJe$^YTIQwv4ppxDXnbBXOZ zsV$5an0Hh!bmXqFTf+DZ12KRZdb!trT_$~o!cl8xKcwV~ni!C8^ zr5_b@5`j83j=E@uj z3j5u__UrK0D!c8JHz<_#B3Ui$+qcMu_#>52i1ThD0qc~Ztf@_2_->JF9z(5y*KPFy zRm?{3K7jjIqLWQ10#wRl<<9Kb{mMOO-tn$8*%N2mPo7Df6nvVx-uo}e<2}JdL}gJC zQxo9*1Cy(mJjsOIhetPEj~f*{?mqDP=-9HG$t_IY%;X#S0BZCG?--MB;?MUnd78;H zOg_j5?_=^a{P{ynKEa>Az~s|Rev`@XGMQsiX7aa8{x6fyu|zjJZ3B~CO!}A%FrkIO zqdrD)wxmAZy-c3PJ#_gwf@tB5Kj+o&@@~4kCSOPwr$;CJSm5Oju_R^l;>A~Pm0xs# zD0gY}1|Qs9p)gfmHJOFfoF6ZDsQsMEJX!A6zf4@sa<_`}fQdYkb>N3qZr8xM|E}CK zj<~&<60~k3IL|IEZYJhT38{9yGJV-BMR7tY`@ta8?{)r;M%jF;?sn!2c^7j<9c^0f z7?)VZUYZ*|%WH$b(#Vs^m0NRe5jF5}x4l%)yf2~8;D}6q*-huCCr4bb+=`g4X~YzR zF`$K)4DVX*L{U=I}PfVYTazw&6j=m(6 zN6GEsio>zcQ*ITI(SS%^c@oi(O5ZFp?o+zn#RfOKdxfu^D3)z3DO>XBuUEX;EnaeQaSb(YM9{0WPZV#g5MroKjQ}E- zaT$r=UB*iD)joV+^Spcjt`L>Xu6-zmwxKbXE)5Sj8Y9rHC@R133gIy@lJ_0Y3}5JX zT1>dV+{{>8sLQ;EG%$R2czmp|=$!iKMIqzn`{awG80{+O8Q3-NALluQh4uGO0Q`z} zMLUP-V(GsxIw$sMpVmKJcE&f1HTy}FI)VA+HT|`+D`i*pPlfT`k+NSd`&7&i*ZsA! z*Yv~4r91eOn(-tm>DCJYjMNKb-M&IlJ)Tt1Un=OYESmU@No1AeJ-p|BjE@Ok)$$E( zpFi=dC*FAB?Z`u)Idbi(>-yBiFTD2p!>?cbg*~?-51IalevHEyr|i#GtO0 z=9IHrV-T~^ASKDyN#pC^?%wQE+>(tq1YoMeFdL9JiZq|%IuL3+G>Xrru3QlBpC0TV z*sy4sLjOUyc?6&|dT|b%TKaE5ANRZGzUW-nwQ;&1@(&M!mkpH-lwHw>^((%Ass9o< z+U+}NOmkMhfGl6|7eW~GBe3sd1wT8;0pxpkQUuI_3Dl4nMnW5$IM8- z`TQwB)88+i*uvl`=c5Fxa`t13MA+vf6iI>#{sh3s7s;@8MR!C|cF?#%QG5x>7s?9g zEev zi6Z-bN(=wJ;n3_3hm~43{s`HtKWsE?m>M@DJEmWmiR>`_JJe|Cb4CNd9rh6h!^*{6 z32|}i{`)7f^nXkiEL_{J zcXO>7=`)YM0BHLAT%+TPaD_%bY*Jmhn9FFF$vplnhl24I8T=4Fmhn}T=q00j(18-KV-cfazGosw--Pi#YCiQG zpc_qx6X;5Er4~L+VOJ^VGTh@fz|T};{~KBTUzvPBV?EQl61|3ra@&_t*+u@_GN!fL zUr6uc3-F#*9yFZG18|QE)uks#jeX8D+l87()u*SN>?K#~q{MTu&>y(wZRsa3$wQc1 z{rxWiKxuhS{+%l|!p^xX+83c^{P&uEMZcODXKDGzy8~}%17)A{xjFusKHwYB&SQZx z;FoKGEBZMu8kYP+so>`VuldU0grDQ?$R+=-_{Q<*hWa;9{#zmUwxkaK5N>+-;6yh9 zS(or;hc53MPYhsp$)|QkMvGt6YwlXmy9`K1ThLEUR4=cL6BRh`C>!6B&6QLIK7e!P zrStgg%=zx}LM@i~?mDIquQNl4igCM_F1=jvA?8+yKkNqGLhEyhv&MM_+62{KGZBF`ixoh;1G3d5OrSFzL{9_cA{q{(KB`IR$}Yb z{rU2QS)To7yxwfuf3x;x#5{b&YD^;) z-uveBX8h3WzI>?a_0XqdzYx22<}Y&VZ?ydP(Dr;H`+7pGsS{l;)a`YG28RdnMve2s z6S5FLfjY2vd$cq5!NQB56Rp&3Q7yppE=eDz|+56A?``E};>AH+Y9)`cI6X)85YQt};^ z%t-Whp#srJS6JU?CI6ERyz8OA^w1AHbXSdi7sa}(jjb##s`5Rcg{TBN7d8C9yoLoy z!-Aw?L3h>gU$fyl)o`b@&W7WAR9t9L(?9f@79>pzlBNZ{#~Oq;?|bO3$eBa2?iyo( zr9~fPd#Kd-6R*bqLnK`K2M_(Dhjs!@bbD{}Gq5)qw~x*azA7*ByNs`qjo^3JNw;rz zMc2FW&c!g zx7fKTvMGVwfyRfICyHU-MMV8?k0?Pxl%O<;>hy?`Kr*S42(u7XGLEW9T87CTkXA|3 z>X!1$3u-SS?{7Ww1POV9$TQ=wd6k43e?wGc&|T4!BR!d=^d!kD35YKu$npphBm@b% zt0tS-WQEa*!-U*`QAYR??LJhAwDBV+1`Y+j&yDz=6fiJPQ+f+L{ zahRxcbqE`KdV89;^fcf5(Z=fzRvI)8adagP4~`#)0(vza##v*IT{=sI=VqPga?*I5 zSf(Bv$I)E|*CJ)S45%8u=%J6MIweD5l=UlL(|DEDiiam2)rwsyGWjY? zJ8op{bGR45wblogOC@!3<$cFyL2CcVwEa?%He;UrEcWcKsE~RbD&Dwj4t>5zMWMmv z(6Wolk4m4kP@%#WBEdV5+rJ`JPM?G~cf}DYohhMLHj9Ya|JSH^qGq>q!}a*_lj?nG zu5$kyUS8{3-Y%nmcx;ffH$QmBBX-en4|~zM*yx$TJ1|g1z5FfJzoNwNs`T%$bhYsn z65GARW}+vu9ihaG;$waCDTv=ker2-%J(2j9@}d_(eA~-Jj@uoMBfFGAU8QpcUr0N# z#$yilNf^SE^Mga!&@kF(44-|mgf(~7r5kA7?NS}h&GG&HV=wZicu#Zbgz%q957~-_$wRin0C~fLgu3K43v%vGwNAL+yIkYO-{Y)$kHb&9 zJwAntwNlZ3>|s+fsS7>3c|D}IW{YTw)`G#^l7-HG=EQqQSYBLJDNls@<(^;B5neoE z-0Qbl^a5*La^2amw75LldWQuhFWV{v)%MBmZy3Azv!V}sySO#8ug~C}qC&K)xc#9SNhXy{QcTiF3YDs4AGSshj&OtDn33W6sI%WscAFVl=C5T^$0Wz3 z0ZAdY=oXT}N8<{S19Fc?-OTw3nX-oY+n5|+vWLmzOkQF#%H%uD_lrc=kQCaT`*eqR zC;H$h*O?!@Wl?A?&9zb8QpJ1E?tNzCHDBoT&RBNB7-IiNz-^6>&L{Ec5{ zB0FrjDmSK>{3a7FfsKF5gv(ju_n2@MX#61)E|HA4m~i1^e3c28F2-Ll;WEVd1{1Ce zjCYyP(>DHw34LY5W?mI<8$`Gksm&O^Obo)fLn z&4kmTylYV2w5JwPoN?qW8}gC|dAeC1W|RjM`Q3ab0rf6etwP>2<({=s5GN10Buh8_~?`aj^&=T)xZQs_m+|stZqvgJ>z3{gD zy{oO6^#$MdrDuHUYiGaaYxtIb-Mjwg#pk~5-}yEF&L8-<%=otyuMB<7SN|=4_q+ba z@A#76@^7>%e1VR4LcLanR#{`#^v)!=T#ebmhjsnlYqgUd^BR$bd9mgR{c8C2ZMU?? z?cf?cdOc)oIN;q|K0RtSY?#JxAUoQmN3R{VH5@FAw8jprEE9;%`KlYsOs&q|tm_-E z4NqR0*8uELx!!42Yil-5r>6tcW78EgT@RXC`)tShsWEfQUUS2~n?7^H<1-ykm|Clx zo!&il?nc|x=uF2Bo@!e+b$GhX-1?;1bI?3=*z7qx({{wvn)6k4dHv`mK;A&P3r8jJbSM6lCN0NK0rGCexE-_~$IhOUj% zKJ(tE&5ei6XO5a1kIr-+Gqtwa_MWLTX73^M=`-f~0dr{BTt7V1e$Lcd~6c|!_nz3k?Jl{g%)eHB1BPkJVq2}$63-! zYQYY>63E^M#i&uD20-Th`t$m2Eux>%?fNpk=6ZOlY93svL5;n8e_+HXXZ5kE2TZI ze?m7;4b1uC=uEoWl4I9B>iE#3>iGOgInD-Bb^!V8R=?hGEj$UL0MMn5?i=mq>7mMUI&quSC0v#J2@W@^VoV=jG zY#?C=nAzS?;nDzLHEK%0L5K)+@ zf+#{1C5jQnwHO3Nl+-FRRwYqNOQftcQAW$OTdWs64<_s^kbO#zfTZrpd*>m#2CG?X z?aV`2vbo}4DOK4`peo&H1#kpasYa`u2vk*BVIojfWkrZURh1PZiW4P>lBBPaC`J0x zL>baoMO01t*aC)Vu+pvtvWN5-=o8rkSnXP_DGw5B8;XAoE%}y?d?}T=t)wz*1#l#l z%~m-PsLWbnB2byNB1E7vYsH8_W!6d%B{lH9k|?EBHCbt*3@NW7swU-Gq8d_OOH@b7 z*{W5q1=Dr|kUg$PLHV}Hz4ID?)k?}iD*oEn(EQ+U$0Li#uDu^*$3QlYAR9!K6NQMv zL={@L)rt^BX`W(4aiRoKQcG{QDv44gHcgZvu~kIXBsNP_Lt@z$$PT9L9FYBrUhb*^ z0J1c;lG0M9CfY$=vd#+N=uk%#Vq0ON3bqv?0(B`XMiggTED7o$(n=uvpomn)nkQ1I zz4y1Vm-6%mLiQfCi%}N95$%RERyh%bnX$q|5GL9sf-o~yj0gi^y_FzJQiPR6O67=@ z$`L7*BZA5$?OGuFMHv!8pBfSnoJSnM_Fef0_kL{pG7q@)HEg?E`Vx?pSWy6L4HXN5 z^8Ua-kO&r*QkmQ4a1lpxvBoMV0v91YB5<+BiV%T|nC6HS7m1P@=&dADLxL!yf$}OM zH6)1CkRVb+f(Sz*V>bZVuj;ga;vOjb2g*zTN(rvo;1G->39hxui9m3z6($0~wN``( z1lL+IqBu!P5Gngdr0gG&vVTOde^quC$Ud#pv^#SPP5Z{)H}{z5U#4|`MbF2@x&ySV zqb@vsAq4J#lM3@=%m#PQfa6FG1-WCw$&_wtnZ92`&>?w(4=nlNvLqm~ax^eutD z5rsH_!bBAuKoKHL!tECGqi?}#I{{?x(O0Xxm35~qAC6AlM5=BgRX35Un@H6SWIv{J zA{6D~M3~g-8u94DbI0d=X?*~*9VS}=-8~N2b3}pJK-v!QlHEhINgZ|Mn$6~W zrni~R+h^(?GPSH74C(6>F#r%l*Sa}h7b*-cwQyVRpR2@$e5%cIGSL1qtFpgD@QpA= zh@uo#j0pBOWhIC(MmAfl16l-X(?IqS*wuB{4@|*z0Z{IkXH?N-qMJ>&T0R^>6CAE` zB4t#Glu;#8MwJLgb+g5iXfl|yD}n5zI{J6LdkXV-v7^kgY)5fHI;t|TqeQBsM5?1i zs-r}zqeQBsMCfR(od%Nj9rr3E69^g2EFWkez6~kUS(GjA$AcdhJvPJ?tzh*!rM(^aO{;F%FOV7PF;y`k2|WV~BUbcL0#7I%nqYHy=1==8nx&J&)y}9fX0uet8;(7{E?qU23*(e-mCA z5NLv@s~qmw8uTsRVfk>Jg`ErF2qw@Z6Dg}iq^uGVtWukuAc8F5F?j}_E_goPW%+QF zy6AK(2@@#^6DbK3DNl(A5^l5Uy2Clw^$lj*gKuI~11+Mq)1ekeX#q!vS|UX)k)oCe z)VA6QqUV3Q)V8|Raw&YjyA*Efn(~?J513t#-P~<b`+~E3wu#nvFZnhX>5Yfti{?Q>&8sb+UUJ zIXKJImB?`&In!&T2dQl3L|BfetS}Lx5A7Cnp$UjD zMucc)DUo!vMcL?Pt7QX`Qe7g|Wg^vOBBcyKaL3_`sTq|{Su-Y~{H87W2X}Iv;>}fD zk#5#w;sD@?cH)&*IZ;Tf-e84^(9Sk1LKNjfB}SxHq(sUiBT^n2k@Coh;E`qRERcOp zyc_XADA^jix8A^t)uXR;LU05PbRLLQUx`#-iBw;S(ASKe0J3**NhXV3F3H-t*hME1 z2)ciJ{@!hidYkPY&|_K;4}U|k4i(zZib8=PF>BWn+CydZmW6>-hv?yv+D ze~>HWg=6c$3&+-h7mlr?`#@eS;!3i}6-RX#Khn44)!%CzaRwBhjBFtE|HfIT#nYcSj0jwT}ElR{5HIOw%EJkSq#*0W8N8t}g z66UgMHCkbN5ZB;2NH^z>Q4uarD%lc!=pe0e2Pp24t}^gO4@IjMy+q3V5Mj}a28q<_9%%kN8&q?c zY7jS;V2IoX->Za6DH8#Xvsr{r>0%;C(P4#&FiUT;B1Eb|BGn*~YLEyGX6MsDw@*m4 zN_wc~-xl2XS%*6dh&vVP4{Gf7PeQW{2{V9-`KHqi&B9x9LbI4#ozN_h6Pg8bLbDjwcNUsW%ri85 zTSBu+SO5Q_ug0YhVo?eKFrUm|*?oHh0%?=s=_+;ODXDR0ob%P`uj=@Sj-@~o*3@$5 zfyWe>4K&UNc*c4_3&pPb=Ym=&ny;+3$~J~GuZJxShkOXr1dg*f25^K3FmaRjx{tqzztq9kt}RT8C$(nJ~F2&p2fW+XUERKr?oiRu_^%@NfTH4rtj zL=#anYiS{B)xwQd8&SI!uD3dfI!Rv_(Hhp=O|+J19Z?Up8(kfpgX|!B~|e|8c?CoDy!eP6|eBA)KD;BcAi!lM4RaV_c>NBM@z>cCKtA zZ@=G@D!UrDuyZBbID;i}HI~R}T#seu%3ja|^>e;cI`5>;@53I19djwIEIJdtcuO~I zIP|CW_kCK~m~IK4OUlKuTl)BWII&AEUXqKubm!veE&XMd?3ardpCJ-1r_hT3Z&>Yc(3>O`+wj0&STCz zb~g!?W|BF3=A7^QfA9bM`+uMB=xD9O=g8Wv>4#p^Q1|!z;e9&PP5qhQTwhoB-n#qi z?7BmBcD>z@sUK@N)L75^#!TW+LjE=#YQo<{X3^NimCrcBFN>!H@MmP0LL zZHL;%+7GqM^F^7CvCc!Ca=$pUWNhi7rE=e#SvI!((DJdaLtSIthq}jB99l89^3Y0o z*OFN^w))WOu{DR*)YmzQhpzD|>i@M{A8x3ta~Go~ZAiWD(7O7%>>~NKO#Ld8uU+!B zA!P^htv|GW?2<#5jBPly0r^|y>9X)sXStNpnb|mI9kP&WaSQvy{B~B@OV*%bhqg4- z-Ck!eJy~ZjbJp3*pY3`kq3V0+QoH-mW%df^a(m^=@u;EBS#7VfSKDizUHeRNosecq}q&BTOzgVe@DH& z*S_>*;?P#7+vysqce;ifB+meUqr@)$8fh@kx5@Laz>}-g6Q@t7Z8T}OJ1d<5XPa}C zvwb)rP_IUvE|a?*E$9pM+2yEJPo!4Y*p2e9*Y0~F(NY)p5B0v?zT)JfL)QwFD*>e+ z{o?iLbyBD60=2weJuxlvYk7mN|8*n&vm3ojm}Qps+UO}wxSLL zk(Rt%x1`bTwYNRd6xR~<4DGqYz6$NxC9t*w*3}VMH`zPvYo4e_%6;~=Ncjp$c^y(- zA4z$$NqMJz15(~1DQ`r|ospEc0@^F>mtp*GL#z6oYn+!mH#s*uw+=6oQQ9pzUyhu+ zB02XU=Uw>TZQpdV>Cj$D_X?!DIg;*n>496GXeezva__fqMg8uO+_xe3?nv%^y8re( z(HPE;y!Y69k@rr?dpq*p5y|_?3VH9f_aX0HlJ`#JePtx?-Ck)Z=ZCy||1X~2XWxZ( z?-vMn1H%3YgnP`$tGUeUJx{dwFe=>v{sH@5)bL(`|3iR(Uj+US#lUa04?NLY32yiu zN;zmBL@D=4Dfgq42O^~$h%JR}dGLw$Ftl2Jp~U;`SE0m%QsS#o;-N^1_nQ(A$E|%p zc))%QAUq%tjsU`IBM=@m5d5B3cgcCy`9XUSCB8~ZOrgZ1krH1WDskwEMdkYf^?#LZ z1KJ^h<^bAo1lr*cG_MUKa~#=M+oLE2)E+oCjZz+plyW3g%ES6sW{#yCvd2)$Yo(Md zO36h^Nrp;cTfCCS=Q$RK?bo5iK`GHiiTOy0sX&QdS%o>QyVuwgfPYlr9|Qd35%@zI zehEh6m}7L0*e8(Rmi&{*KNZRE1nSplKT>I~c(VvlUu#bT>aak46i|OS0(C@}ewUX= z>XNj71UPCGH1{#V=4r|QdgTAnNdAXRtsakCbsGAheG;_*6NNeT20(dZ1WKkRC@K5L z0A);|ya`a=9D$N8*Td+CqxO#@Z%*>Q1$o~Z$vbXp&}jceIeH5?L-yMM=XC<-?SS)+ z2pm`7yz_|$q_ypzMA|&)qwDO}+)+Vtz6&|u9mzQ%Js%$BM*BTafOD+&4`mJ8KXr2P zp<{toytiB{^q7p;KaJWQk16$Ms?9BwH){VZ$~z&gc>=9@U!*mYftn~x^m9)%S8IoQ z59n$8=TWyQf&P9#|3C!#BQdqEy{{g!KZv?d3-n(A^k0lXe{@06AGV(a^dA=JzXa&N z9D)8LCD4DR%1CAGrvULW=k=ILKk7WLW|FMSlTymlDCI+uQr-}lhhz3L=*>4G_Z!SS z{4vS-EOP#8BF22y_{Qp2A>OWxxAgkDi^lXM?Ny5EeXd%L{(Exh?{=j|cc>K&$SA1jBobW3vf zbLhKwn)HqK?^GHsoon3wUF7;nDgXCS{>LNbzsta@R{rbk-v^|3oAjTkQeW5p1EhbC zl>AAQ{D%SA=BK2me<~o`yjRlw5z>7sFe2|$=^SrNeCg(=CH<$7{*NPl{WBPo_c=eK z$K+=v-Jc-cXCmpIFfFOp^1S_7wB+YZ`bPV6HS~PJ{!`@oc`5(%DE|wQ^51XZl`S9m zXTtt7K>2`4TV>Rd#=f#C{(6pOO53i~N5V$^WdWVcA~PHJP^m z9*}-jAblN>z7c`+Yn5uEVLWR817Q5R!1zbN_@@Yr51ZO>G`?8_W&UCNp8@eV1mgb$ z#Qzn6_>mAqZ;Tu5|NTT8>om82nE5|q{|n0dsFe4wDDPX5@_sW^-nVOL!DIG!0P(j3 z;u%1EAp-HYLlC_de0MGqi0=K@+y91=J|-poJ4*ULk&>Q^Er})m$9$v^uW!+7KWd*v z$-g5de-9=9XQbrcjVby6&IMoS7CvtOKa}%(QqF&!q?}O~De2?ElJLI1+6ZaLCy}-R zuz#Phao;G=6A|d22txPok-lj@^DWSWZvc!%DE|+1`HQ9e=1BRUWSL0WQbv#TM!ahU zls|M<;I2)$sz0LE6~Ee*-c?%HA<#P`&_Ct3NZldVl3MW@(*78}OHul#bsLsRDa#|J z{Be~wya`ac0Oe0Klx~5tA_CcO&3_LBq8K?xqObKMQf-<> zwg{|CBe4F$uVe5Ic`uvm{6?Oi!1r?0|CBDXN6PGtl=;PAN&fvj%X}O1^`Xo!=`yd7 zGOvu3IfGPh$G0CE-_trJ^wxM1)m(pBtx>#rhqqe&zj*pie78Zn@IUP3hyK#}%Y4pR zIa25Bd1t+|58qefdpExK;QK@P9>DiOd|!?4VSJC^o5VMT?-0Ht_&WGLgl`7lEWQ)? zPU8CrzK`PjBlx}v-*@5r4t$@$_xYw`1jMuxBH32p>M#>*5F)m=pXR=r|{i_{`<$t z#w~Turc3MGwt8C4Hk;hmtLxs;@zzfquRGEB>bm3gz3)W_PdTjzN7H$0EN4$-9BU|- zEu_-fyk$GX>1?`?&f&h0vyM)rGq#l<8g<4}dF%LSdT7)d9G|pP*+P0KIh1pqL2D?L zZ9SICr0rC}u~Jzicic37PdNjv-{i>k)fd}R*=(+m61e;O8j8(#r1GPwqZy~T`0mvB zcse`MmnbF(q1eo8AwA|46LM|g)pjz46yPl0?F^;IQW@Ufn<^9>H`~`#>^S)9d-o)7 zyJOF7uiUr)_G05L*~wz_ZK+H~m2g)Y=~9_u)BRbr3#BhUI63Y-kaCNywlnTJLnzSh zYxpK@Vc%?56>eb?dv|)M(AVI0@kJY7G!~ohb#sN>P%cw!zR!8xMA~)iq9nd0lTPJP zuVwe@?zulJoe9v5#U@lHcf7c0IOiTs+r>rcku3Ud2q4WzTjJ`^T!Gj5iPQq>^UA7arYm&P~xLa(VHJiH@bJr?&ZAd3HUGjFwvrar)V(ylj9Lvnz za&y;Z?z-h}1@ek*)?S6X)$(i&?$*lPI^3-{&n}TW)_H@u+i31Ax!Z)do8@i`?k+WN zFEe+So4X!!*UP)fzP>Apt+$~sZ_8ze(<7;W!}zsY_}rSxV_IiY`MiZr*Hf7D9H}N; znTb|zTqfi|tK_()P;k>nCkjq}r~D?ALb{M~c3KBV9V?p}bFAF3Rlt1+%z#Oq2Y{i% zPV2!@2dUiBq*i`3H^BuZ2{V&c%0@beD=j~cnLV6#Y|F)h%=60Ay{2+%2qmF@_7%Hfo)*xy$n6KC^uH#|G zBuhzUhcLTL-Bjfd-O^&o``?8!RE9Jj|G2rpF<$cKaFmxdO2FNx-5 zB=KOv0oI>zIdk-DbbY9d!M&+WJ~-Iuh2&W3L^9)KM+&2AF5-83Y+}q(&(xa3Yyi~g zOqAT|Y&bWFPVKq5e8!WYMp&!ksUa*-v*NIj_>!bbzqB|t zel3LaaS}+;D%qdf&%xr* zab^!^a;bvX&y`jwD0A|md@h?bG*u0rN3nxwQ6LYRgoC=k(9Gyb=W{n)ch&a5{Nu{m zp93dQ7)71Z!{i2ZnaflKfzVet8zqagweWVir;Waf~ zP^~MZP$9A$;AnsgES3=HArF|rL#FeNPLeJOAu2yuk|=(lCJMth1V+igH4~0)FAKTM zMP*M zp%my*sDzXa!iFku9iJ?Wg1k8=hJ?u`?MkZj$s|cZ%8C^07sH;`d}p2j9ARNb+}y;t zbu=~fFjiQB6U@3-m9b-B`*uI~P|k6OoMd)l>?me7krr@QsE$sSJTtl(2}y!ko9v`D zxL>k>3}Sf@4GtpXpw$be-U9!gNe@Xj%mKatlQAgttj{mnbw->MNf3;5Rx?!c#8OWP zl57I8nR-61xchQ6smGnj7q&{$o&oEC<5+_SgxnkuStY=k45jdd?Zku$&|VZMZ#0IF zBjf#=%dt?Y!5*ODoWGu2>=9^&l}~f!>-ho(#IkeQo`Uso zHg}x(60>2l2Lp({Opya(=_!T8{NB{LoyrW6P~IM3FtSV_i9omBG{xdcjZoq%ut3b1 z+%e35JFoykt0~Iv1rE3NRGk-h-de7yru)}z6d?Ew!js3u4 z0^{x>vod{TURy^&Q`te`2CE|bvBtodLq3$z29G_WroXVi9HR$z_@gr6W|D#(++$7> z)UGg@#54wj6ksg8_m;f3?!WIYP`|=x>F}V7J^G%KWL$ctj)FKsj9IY}bG+Cj5=$|0 zGzSTFky?wzjy;qiZq>3waYd|1QC!Lbf+9k3NrbB}wg-9evsY=s`Y_hU@zi9#r{B`- zC~oo-M}@K9YM9)fBgO7Gez>^Q%qGp278}#qLa`II53rf~w_zNM-F(j$23f&kJD++i zo%tmUSFt0+WKFFz_4n8q)LVEdRCT$bErtb}+8UQ3?|@gdrSW56VA9_2BgJJt2+jIT zSq6fTCzN*-tmJjquBH4c6HDp|BGHRM$>_oo? z$ZWAYjs_N2>fQ&o4^pn;idbTCcC)EZ00W~|ilzZ0qblt|WIuJKs9g?oM)v#dCptwo zig+?_a#`d&QtSw!>*6vqH9W~LFkAGRm!VP$CxZ@)tIDj!{ZJP*Ck0m|lf~9#QYpZ2 z-=0jqZX%T-7QwH@$)pW=Gg(}cOa^pU$>h^@XQ;9{JG^Z)H|A^`$)4D@+sQv%$c=Bi z18i?*>#e!m!x)lnw}KiwS$o?tCwpvLCVh09>LC#1tGDGLoNR^U@^EUz$>T*ppSF!k zwWQLx4UA8^8&Q~CuEb6LH*tAG-M1Thnwr0LUwvKslE?3yZD0EMUC*!Uok{f0u3S5l zSo{2nH8Y7d-&$1HwQ44@^7*xQ&Lr-9Uf$r@iq$iTRkPiAvubwjhMB~M+2t#dN?o64 zj#baE-Z7KdF}rH_Ok($J_cb$#Yi3vOnn~#doDHM?%(Ok(5ga!J#5(@f%~ z*;VUi66;hwW>>GDNvxl}WYg)yCif1n8GE53YZ86J)YXsz4r8TT)1;tB@Q3ON|4F~K zFFUm71QmIFxgS%+rP{dIVxB|I2hAn$*};QTtx)^vWYF=ofO}6t4+%uFSfiC829++)f0ZEXI>AyD9Lb8Be-ls`KHr$dko^ zC#~|NIq-zax^BBA@T6Uyv<9AZ$dk6f6RPvN?e@TvCHUO|weV7Vh24q2%kXyz{w|+f z+PAW}?10wM3KzRCJDi)kOo)WyeL=x(PbmPjB8yA$yF*$zAMD5aGu*rJ-nz;9zJ{r* z4ubLzg2l;9*ia6q+>r?(*BI+~i2L2!k^AZTVj}NkhVz7Px%+S}F4j<{)|AwCK)-q; z(w$k1%VTwz+%4@g&uXkAxaYam(Y+4^g(|2)#8ptgdJD3+_w&LPP_<^8*?U71u1gLl z)brFnaiR~X{wl4DejisC{puZatBZ_exDM1&p;{G3vZQ7S=9*erI);4yp1IX&yUZ?+ z7SukyN-EXt!I)ZGS~2h4&&;iI*Gc8{z$YiN=%@wMup(~`^k4xMZucroI8z(SSC;Reo?At44po#o z3z!vbt;AnIomY8vj)0u%D_{Lc(qEffOVm8cdltQ9Di3yOasf>so2r>L1uJfzMALk9 zZk664-4C5e)=pABSU`1KeJE4wOFP+r`&{i+1hFfF#M_Aylj*#0?QwH5`2P1%;u-Ag ztb2V8#HG%Cm=z?cEm^wYbtyC@<4A{o^#{y1#!FQ)R;eU#-qfF=s2Hs4z5ByZS+o`} za-G72n{{7_H%~XXE)(2^3rw@TpW0|-62)UvprD$&hioI7rqj8b1NklH?{aU&ANMw1 zcJs0amtr%tAyDNPCf$R4_8>2>=H)OiM|er{lH!F-rR(rA!b_T$3@;5XS?fIsT?=&t%Fwh%r3{8wMuf4Ij1(o*L%QE@)>l2&oSk-t6m>o(cfjs(9EL5Z zpLKu1N5QLCcBD+b1TRi?MJh#7Rh(OudO1)S{1mK!Tw1zh$fC3hNGB0$rc6D=fhbi{ z5d!?$+$wV1sPb#U0Dd(^eeVw?DxJ<7P%voFS|FO_lrr}#6}hiKj%N#GiBGMG^skRG zzK+J_7vlmUxZM+i_q%yK(UkA(vcTk1niP+At|?19y}X^Gl>r&;x1eD;;yrG~6HndJ zS{^+K;rwBCzfjND^DYi$J;E2f{29La5nPC}`a>w|Tv5d)O=Z8`fIEc(Su*q@2{QX` zKYj?aP;3%)uxsH#u}KuN#TNcaxo&E*n1Hso0BzO;Op;K)JB4BkH0DzdCBI^eGW`^C zF6JflS}sS(UBpW>FD-=G2sP!|&N29Dq_>XdV9~-+TZSri?8|r3T2TmsjRG;!y2sM(-<6D1bEpFahS3oxPnXY@b{u%x204D9! zBeH7l6SfcbE6;t4XdoZdN5QII7{&V`SOekZ!ODByTrRAAX6^BXvYzuUXl)FElk`v5 zyYEG{`s$@^E|ma5rO&dwbZinCwVKxbStMy=A1uMmV|6cd*0rzuK;m@UWv3FCNmpPz z7AYIaRNF)r?p^tCZ0ZaBmGf9>P=eL4Wa6f96hH#Kdnd9(G<4&Mnlfj%m?>kB#IR1Z6^6Jp80;g` zS5xav%2Ieoip^dwwWzuv;3({cK2*GuTWp5aBA0~vLAmp(8WcMe=dU}u*bGBj_I@ZQ zi!HP#CaI^~@4gQ`6P=r)4&h}R$K^8IaBgm$No<|%ykaJC#q63(W)hdob}oN>|7@4s zE?IRtu}V!`$@~QJ^d;P1An;%0<(GK*6h-jr%+&@PL$Pj|0B;SZ6@(q+cMGJq#Z%G#_A z&YNjARvvGgEiZZO((qoY<>CFRyhOy`qjV4hhE5Q2e{g9v=h96ndIzKGz{mhx{T>GQ zGbj`t5;~o3Xfqb4J*_qFHw&00((?(L<>4I6@Jhdo>^>PBG>N^b6t0ioG$|Mzr-6Ao zFOxqs>2_LbF2?l;nG}_nyvl@QAeh-HRiKv>nx>bI=h8_#O0db=>_!grXr4np%Ne zj<7-m6cBxl?g2b3wkgLS8KYuL8jjf~lC(S$gy{|_CpaEZPF!BG^Z_s3tI;dIQbZIi z7_Sclrpq8;wO9?#L-7#>F`kdR!)zTt5a^StJq_I|DCy&< zrpwDuvm3f`LzHycOyaWHRhP~rE}adqqmuULkOU%0i2p>^IwBlFHmc#%*vM>R%5^eb(p>m>VxLP6j@km}mXO3%(j(xb#8*jgF#|kd ziUg8gL}sA`*rx;V$3Z!%ENcKJ5pb=;n#uL~6~oDBN#RI8wyx3VTBJieJv@wkEHJ5S z!=n`BvP<{No-B+VSOwvJxaL6~D7ns?=6b|~jM5+C_4_%RTX2I(y%dxB zRQKgyT70?3DZTH+sh8b#>Q$-JZAVWfj#l7}Nbssn;>o7IMa5+YbE;SU$-BW!O+$PO zxviL{=s<7&R-2ulLisK)zsmM>;)b(RT#N$qk_m?Jl@I4)qxyQXP+<1eKilvOQ{eMx z{dAq(`0({8p@}k)l3b_jWk!BpMrIx}67B2l8??4rgW6(MadKXe`8CyI`dyR=GT&rs zVI996JpoM`mvgZ`ADUX-$}L-PiLYb$6QukIN8>Wwh>oG9;~iI?ZrUp+i z^PB45bmf~nXWQBzyQ9MVng^2XyqlU=GtJJfEuCf}$$3-kY?nzumCIqO4v!QYhcfxI z-R2Fok_Uv09&t&0;@P*);*HD8C)s`vR|=MF5f`&|>vY0W3^9`paiMx2gC95GNl@ox zV;)X(UUJsrgZbAu^^LjBKdr`%MSy6j;uDMqvD%Hu-so3*)u8#;N(>C^R#dO12=*`wJxh6OKw3ZZIpC*0ryF-|?qzdv4L`wpW}=yrRM! zybd|4;W*pZXDx;>B3oQ1Tl!jy9s9DPbyt%opnftqFRc=I(^08#8(n7@F%YrlnnAi! zv{Epd9&Pe#8bzgEiv0lwd zrk?+tOdUZ%;c1x#mnqHHXE*QUmjxdf`6@({gim$(df^~@xCX4^X9xZJtkED`1a+W89p z2ynAph{`D!14(<{0YSFHQ>p@u6Vc;CG@km9w`4;7p|f^HMlVn)EElW@HjJ4(#0N0Bi2}UUOuh@S{?2xKbyl+ydKO{D z{~E)oCZL%YYC$I4m{<7(l1t~&%cf{xDpP~|H9S1aIY~YMlxj5=Cp4E&9r^6mQ%U<& z?)VFh4U{e$DoU3NB3doLV47g9HY|`KSU|XDIa;WrLOLW?3KgB^9c}#a3-53FnwK^# znfw~uaN%v9No)?#rP(fj$uaHIjXr7<*h6?IA2LN0?Pc9rxG80wrW>&8*y;Gls{0ODh1t3vh7-Lq*OabInpGCEH2)C|a(Thg6#mlOGLzU+W@$3* zf>vS^3X(CYvJz!aO$?iN9v34!^Bk>4jvAtOnIravz~tjhor1 zExcH~2-c~YWd2WP;f2N);R{GIWnFSlU75wn3`3gi;dVaksZ;CnWLq!n@??qUXnFQ< zk93bLP~KHqpwv!A11E{_8L*YZDUiJZ)>rR_2jdDa$|2fKy3^g#ou9w4bc_SEomTRz)-YH;jy zTlQ2UTLDqH$W|3m(5XqqIpdvjYT})8YT})WcxEJEyA97&oU;zxb-o;>*h_FH(ak28 z^)2Vd(SpV-F&sE7^#-v}Lt1PT$2@q^C3C~Y2Ke|jjNqFo;BUcY*UlUDe4Ckh8DTfx zfE&ZDFYBI3bk8=oJ$`%iQUNIu)YC2QcL??jFE8-&U0(i;mzV(_!gKl1T-}auBSmbb z8IBXNrxVjn(~G7TPd9_@Z&g`^?f)%gl(klk*`Ozctm=?T={)ipDA2=Yfsx#Gbw8q1 z?YgcX%GX_2FHj=rxds>xGQl;K&|9EzC4np4HU@^8&Rfty&;b$j&0KrIN)I)?pD8vmXalbCH zg4kvmW1LBb>-_*H2s9l!Nc5j?*>+t`>#NWO|`H#J@qK$f(wu*X~X~3;YL44x@?-bqO zouV7OQ*N=mQ+`gQD&in(x8u%>l-Z~wWiG`tiH|wCysxX+wwF=YG&PB_hUq{e%0X69 zi>py<_s4jt+}jqDe2JHudD-tVH7`%Hw{OA?35wXrB&fseGVyC_?s$CPY~)gbtPtSS zt*+F&a+RgFqB5t7%Fq_l3A(xoZ5hB#oEnKfu^w%iZUJ>^LqdFnx_rA<>LUGpVd;w$ z=}{Pvl&c1A5TbI`z=FxjRRh;5!h)Mhqy-L(x#N|?28!P-f(oj>30PJ%(E)Q4huSYv zr675nKUGrmvNpOTX)jVHOORw=o1#o}#y*NX{U(_HBy3ssn-G}ufc z#mhEOA!FGPdRc)8O0IuFX+!wR2SjKd-ZwZos5aWA+gzP?ol9>3U8pCvEmZ%v{mQE! zQj(em+`GNs(&ArPKY~zF(I1AMR3c@yAurZxc?g~LSZQ`l!%c;e2%b)_1xk?JayM|1zJc8>~yt8PC+Epwune*QAH#)Z$ZM} z`t9%K<6Tt8#b-)<;GH@b#%R0j<#?vffa%8F3ffgBSN5$cwjYp91sbQt7*sGfZxBNLNp}gjd6q7d?Ra&)N^?B(L0^TT~^K~#O z6F8mzLZQP040w{bt=6C))_Ra0vMMaW;Xx^C@JR1yp)j7`xosPwL+1zF{5E;sXWa)| zUI>z94dIk2?DSBFrqQN{C?7nc0ioE37$I8pvS>2MD%=<`+_>!CojVW#gVQDuWdyo<|4KDH7t6o_oVE=S?8FA5Ta(NqH|KHn+4$hKLP{wnilz$hjlib}(YK zn{p@7zJbxgSf-Ee$~c%R9Ff7&t(h$@+>2DC43k2KavF?LRQ;LDaT8IE2ACA6Ll+|fKB5l&uUbV)>8T6Lmq?N4pEEhC z*%1*Jy&r<-;6W4TiT-_KFsfs8HA=N1bV+OQ`Ab&@b>D==;012*SAWcUQ)qJyR%S_b zhW6lOb=M)uZ*bjnEkZuMLFChJjV^;yYAul$rU9fXex$EOG(cILPlgFq=3`2`6M4(Z zrjy-$D~heV!E$Ld8so^19bUd8zmGPFmg2nT&IV#5f}v(q;o%8#SUBQj5l(AL=EjxG z+Q}aig&|ndhY|X3K6v;N428?fEXU(!)QEW4_eE~z-qOgWol>Yd(<5HQBuIF0$SgU- zcKV80(bH~ZxfU;FaQ4DII39x*QPyuYp_0Q>9d$F69KWXxS^O>F&%G53kUhK(6BY~V zz51%FA#g&)x4lnXJ@muvH|mEAR3`?&!9Q_(pCJ3_!%9fMHjbJQYt#iYslmQ;_CpNi zo{tw|2*BLzSfQ*VbM-(Brm3hVfDn2ElBlG#Nj(oB53NJ zN(||u#1Zj$gi*>kJ=Wq+@?s#c2XRDcc>+tkY{V3wz&4Zc#898Jmno&NaXd*O3Wh^E zn@wT$^dO24d`WRASYZnLKw-mh5p%R~cD+fD)0ndicfc%iq$eoz%CYp2o71PT@i@Mr zbRK~M=0lV(BVFWWJxG{ws;o?uyKb0C+%UUduJI(90E^9D)hiL_9+uz7%XuTtZ>p6z z3(2jj@8wDe5@+6@AL2~N0piS`z1!j059)lCBF*v$R8*cUkS+@>(0B!l4*#Ji3#Z5g zS0hDcQiIaxOp!ym=R=W00Om%KLs{ockwdvd7$J^!GW8TTh+2YE*tLRF`lXW@Kt)Fk z(eYATeJZ?Fn2J)(czmMDJgU#sREMi-q+^YyK>9_WD_bkBL*yO0!?EZfFsh;pIcUid zfYu+;moSkgov2Er%OOQYq^|_Fj3?5Z5FU}P_a&v<+&$bKL%^wuizDFf1`;QcAus2hj19d&l}Opk zXF|U$KAW3nl7YKjUS7+Ax(fg(5li$K(ML9Oi*Dp167j5%U?Ue-BEmklaCFEVprrPUa4gGXQQVgMdt9tQAJXDsVM16~k^ zj~`b8GHw=5fxXgeq{3eE`BUN&2=k%FB|zpzkxR1AnJSk+z+gZz7DtljE-RaPN+Z+- zB>61v;61zV*(ouSBurFcic!Z%=V7K*aP|cDB#z6} z_R)Y-D|_i&3;%)-B;=`h4a6t_g4~BM8eL>%D#wT8Y?!MBloZpmfG&W%D5mBrkf|~j z&?Vk<^H`g!k#?LEQ=35_Q2K{eG5QB^H&8(Y8Jt?ope|Z=q1F7d;d04A&^yE+Eu=IL z6Bp^$OA^Dx(DE3|#4LzSxd#31^71S@-P_48p>h?Qvh4A@XPd*9N-POMVJCmtIa7%T zVGGHJK>akYo%~18gqpYyVj3BVxw9W8s}yw3`40m=q8pIf_S&h*{4TAzH!0QAtNPA? zia?bznwxM@%+-oH@yjvK7tX90pfz$UCjI=`l~NG%;a5tb%#C3w%|B<3r4+KDOkHgyS1{Q|nIX7eX z99bZp2)gmq;9=|yahyO!^`?rkj7YAcoA-D3zjW1z#l?CEy*RQj<4g}*Pz0agbhnsS z(LEjE`QY9JVBg`2(Xp?tg3rwRCO>?`C%Zm-;?zjtblb$K#6*SISECEYAeG}>`P;rH zyZX9|t$VP~vb@30!CQ}24jgKNK($BQ&!eX9PBgc;c+43)>bUu-4R6ajfN;vqZ3K$&H1V6efwAO6Gcu!-2#0+IZpwQwa)UR# z7)kN)5iiE?AzLl{b=KmzR7ZP~O1r^uoEOYetMJ#i@syI(rPv`$w|p<(?)BVQRUdIRC)C(QauYfu_>_awV8zEy(; zuD4;R8tNpRZNZ`7!+^b{j8N|KQ#G z4jkCG|Mo$s5>=B2&Mu9%%{zc%1_k?pvvDwjd5|Y1@CYH-Y8>K>+WM?*CI7W zxm_H4H|hXuixV8ugdWnq#W?kPB9l=xnM0{Ulv%v{ab9><(Gb4oL$)8E^Kd5d(tY`T zdatsc5&jX8hWAM4w|X0z&1ATRV=PO`Ld}ZJK;=o-8F%Msbi9XPco|~vT?$Z~Dso`3 zVl6tU$&2^vVK%Uo_Yy>y+cfeL_(uQ0U_vj)K7er`tAUR&4*y8LgHq%=c@;2y1`3I_q=y>)_K_2sThn~e71rI8&zN! za8k5aE01r$$nLtOHW{omfd4JvC~D#Wg#SQXP932$+?Qfr39|>@eA{X58@6!L$1xm( zW2@bpq>I??har(8Xf%yQ0oekm~HvXxE>MxU>UcZ%Oh`TsE=Oy)c zMC^~PdoS0sgjVU-k=uIw~TWmoA$FiAB%zil?}qvyz^n6>LiH}jRzlO27X#n$^L(zag9F&i)^@YY+$ zQ!71z4!h}g^jp{TTi5nm*CQSf4)Ty48=KLjd2eh_amn-YS3#ad_HK0eJ2>K3KeK_0 zJW3E-Sc!-@hez@Oysx=B{Ma#t2L=`OmKtAMbH{7+m{{MbK-#Wx&w}@hkR?P`bMA0xz#x# zM=3&$gF`}b_NSQ!&Df!KnA?0@23T+(#3lZOyAcitFaOHsdTN~OXA;-XcC465tibhj zVuj3hN%nMu57FRqs!upFl3cU9Jf@Jx@l^)LRYND2I&Ycxswu!|4pHxi~lX zb>65wj5Ob6GrExOvAVCctvR*v#!p^<>fqtiZLc|%cuj>hJ4XW&-O8ha1p`v3fcJhZ z;c`c&wB7{;efbqlO}96c?vrRtu^lF&vAow%(I-h*t0f#hF6m;+a4MZi4r9w?+0|WK znYVhMu+m)L}^IGwmcO&>zRR(rqR zIl_)Z1$ZtW`unxvEA#3K+{Ez+exUn^Vd!U&O*rNf^`V?`WX|LjYe{vx(782-=glE1 zL6!h3R*!Knwp#@vaAAv-A9(`dxoYDT$~t-<#tAD&WE=G1YmQV>-2|syoUuHmIuBBc zq=aq;r$O4>%|r_hpG-maSz?0fh(T$h zn%x?c$C+)2T0JycK&j1;K|HgK7S_5L%18w_TE4D=*`}|l*x{VO_F03MV{loq?cfAL z&?;PSR5m1*+?OSY?Os7_)Ag@k&I+l|blo%h{?SD|j(Mbh3NIe5%Qo2ck1i@8pO+36 z@dkwgBkJwlRXO`IE@~AQR z1}o7ZO@+)Bh#eVh)^jKlBpG}lwJT%lu8u8LUkiqdL6{Caj`SdyP6*Agcyv=4D3nJE zrU7Z;b8r;TkEeKqeSSRcLamOIuJ1f>&wibl#tUro9!{UwN6uqV;_3}bod?w+*pY~M z`?3ME2Q-Ax&JP^q%o^;M@aSrd@0TY)Q`No6E} z@Wudl4EB&uL7z{>W2hDBVR@-SIno$#Eaj%D*BG!4=tH~YNOtRZj-@kL9yX4M4L)TJ zhH8lh!ZTBy^@&X@3|{P# z(ZXKgB3WX{OfLc%AZfuzbY@QhoUECe$w0~)L7a%JMg$j@8hGp1L+EC; z3+B;JcLlM3%`CHkS}0}c*$&S<1Vq@OwjoGZa{dzF=ZPwmBJgT#bN~%4n2!#_s>n!J zVu=G_YQl{7j4P(Vn#iW1+pu8y1u_OQcRl|wMb!G0{TD`e5G(8=gc3y23#D;|T{s8w z;achh3p1U@oI(nQ;uL(jAX%s++=}Qzb^$XY6ze$9Kdt#%Q*j|Y`KjRO)BG**S7por z7nUg|`UZ1pbm%kDF{q{#9j;L5FtY62M*((($nY9~)@F>=vnw}$Y30>VKJ<&3Q!94N zu9xVaV3UJ>P0Lz{`C2OaHMsye2h)bHYVr5-`=`_LE*f_|CZZj;y1B>DsHvDZpwb1N zy5+2&fTF_T+YmtbfXt;MM-;&kCqTW2oJFy0jbEFtuJYEmS%1I61 z#ct;|L+V-NsKMppa=T`3+7`^BNFDv^MHH_nSw5s1?f44)QL0N{AOVdD1QLxsvi76% z7dVv2kG1NpdXF;@uJFQ=Aca?Y4XT)j6w)8E^8`;u>+L(@2YdD!8DM{QZC9@sN~e4Y z#%!@bau zdWUm7@rXV`_wKpZy6&3mRF{$ye36pRbFYWGNOZH+k6Loy0-WbY0(QIJbSBmQA|+{Kt1TG5qyIk_j1d#zY^uA=T zo11d72Mm&ri53FwDw3e#o=7DY?DK@`-^dZ*r4z{6pn3@uGFMbjDCY>(*VQTsnZEk| zA$(JX7b)5|_3L#R7pfPUH$ngY^G9GDCoOn%fm%2N@f^~F2+Rdjg;IDIm^MTzaFIfk zvvRmU0R&y0LM$~M>d}ce0S~PuHVe~<)iqkBd@uSsqmJCGPYEyfa?m(0JM$rHL z*-ZLj_%(?7pO#}dHfYx#Si4RA@|K;GeFO-D4)eS28Q1{!xNgqPTTW`kaWj)jEq8Q6 z9s9~nWyjMzmQ6CHqS;jBV(c4C=Xhp;cc>#R)bIzIkp1jXTG`4JP5ZW~k1{lic^;{u z-~um&(@|j50P)yt8nD^Vk%#G{z}@PEa}hdHQ$;hAlE zRVU1y93ChB)yu^Nb~g@4G~TaMebpVT;iO>XnPQ89;rl|zTXo(>%EZeX*ywIljFf4| zOkxL)Q=dt!#PxJyrBXF9nIYaZ1d`earK!!Mx?9^RjZ--5>^{UAh=^L^LA_jiP&1u3 zK<`BIx3I1O7wT)DJAUfk2T!-X>Qv%YQdLt+RFE~~r~ZtKYgHD*IJ?`6FhI(Mns?1I zRP(ay;e0BNrr7AFVzx&FhfX|7kdOmx_4kAd$`>Bor^p`<(Wn^)+nGLmjRlkd) z!pl#xuRUv@?4Ve-ZYHq~?uRppOJ=M2R$qBKaiy9(gk>Tu0Oo=WdDqv#nP65(iSV?)Y%S3lB|>e*?Dt4PmL+(9zs z;TGyKwV3K*CB0>!N%3S^x?c2_Oscqp@_yH$IbIE*N?Z+OH6xl|!3ERx5U7f@d||rK z2S**nEP{`cUQHo-kM4~;;*5gjg|!h6=pGIpQo3I`y@->b45+x8IWO5mY8lqVGp4

    BtYNQI)NZn*p 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 diff --git a/Backend/venv/lib/python3.12/site-packages/pydantic_core/_pydantic_core.cpython-312-x86_64-linux-gnu.so b/Backend/venv/lib/python3.12/site-packages/pydantic_core/_pydantic_core.cpython-312-x86_64-linux-gnu.so index 1b4819c8d0faac481c3ee75fff7e7206e8297f64..ac0e95c2cfbdad5e141156600a8a3af729cfd31a 100755 GIT binary patch literal 5179648 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 r8Pbg@2hI7JeGdcWz9fIOOMxn`3`e z&|!U5d^r8{o%nF)GniSPp%B$gfcPx{u#|tkf-kLM710PRKm~{|W$CE>^Z%Yp|NMO& z0>l&k`3CC(YwjvQygGfp6Z|aQKOZ5$J2Jc-HOz*mr#M7FPi9^Kgo-Qg2{ZTKGh$E!Oo+VdH{&(|@-1>B|u zl5a%iU)d

    FN1fuKrHv{4J&6NSWaYe)NXqf~<@ATk@}Az8J~h@~tjv z+XSkO?sStsX5=NE+kZ^HNYh=hKdo1;yZu=0*%os=Xg+qqF3y9!2l-!+Pv$W;50oH| zdNE#zp*asX;1i0l+7(R*riA-&WOzPb#NK|M-5+E>bAZnH(&s0Vv*z*Sz-p`0yO~T( za{$zt)9ZIt+Y@$k+7s~ozY8yWcb)p5!^@CDtQsqTTf-ap0oJ6#wr~S$l9)d% zZg=hfG^^Y8FZ!nKhm!60?9_f426S1Na75V7`DB(F8|DES5Cn%>09ddF?zY!IG>n~3 zNed3Wzz{ZfGmEddyBo!D|LpOuAaW`Jx}jn{M5<6l}We}mEE7rA2WNwQczV!=@7AUz;bR_YD=TdJnC_32EHB00+hdW4W&Gcz6E zRaz?;IR(M%@GIk=|Irp)>DI4&v;yhoFhq`twU>U2oCbe=9NilCe=5+s!nf~1-YczY z4X3_T7n?04Y&<>FDcaq-RoO|N7|sfeRc9%<(rYw{{H2O_R*^u zi5?72_CWQj8okPO?x7nFC78_Dr=nNWI`s-f9lhdTg7Mq&QxnVlQ&=<7kw^5suZ1t` z2uL0pD^0dt#v;~yxc{r*`G!=(C92`H_T~gl1kHm*I4qLcp=7xd^p7-QwT4e`G6bPywaPjm@O$XE1K|D^qc_MwBRRt!0jy&g6f-`J4-!*XLYPmW>X&!1A01KEzT9Cyc-To^h~zvq zgFP1feCgKC_<6G|r=!1A+uJ5mgiGTmT&1x9%T)gyx-rA)OuDd8KbH+qSoq`+7pXgV zOw!lGhtuE@@RLSg+tBYc`l`?~LC-gTkpzcEX-Uy@jGz6@>8ig?cdE%t@2}?%hST5C zQcH%t0hlq&CqAr>Ps<$a)1(|&9dDMydiZ_V-(C@iGIJ{(SW^iAlHM$W9<;c59pBZY zBa2wnj^20m^bVXmpRL8aAf)$v{3 zbP~-Aj3=D}`B>sf7acaBGp&l=i5t!?){pq?Ij|f4!!A~H`2pxJIinUUi$aP6CHz^2 zCH+^2>5V5U7%yEeJ0MHkjybYXozf||MM-HV416E5A&#=h%qrA!j${OkL4@LxTy zn-A>hL{;S;P&-7=(ig4f1-3EgveOP;S-rd++qk}hoKr9441hZb#5<&u)9!=&4tUd8ucueku|6~8|Caq zJ)30@${v(Gjk<^B9F%iV&S}(hSnh#x50rZ}>OEM_ML8Gc+(tc@c_C$6Xl*L_iWUAvRr_20m=o9dI8IYC>Nq!*r*q>d@Rbx zqI_(lek{ux${NaAqpq=xUF~WP-`mJ+TT4SlC>Nnz)Tkqo)Y8y#C?ALNagF+MEF%u7 z`goL&Z`6-xxfja4Q0~>J_hPvixhkB#j8|B`OI@8>Q`k>qg5a$|pDKC$o$kZ`J)#?%$~Qk6sQI>+mOu58fYW@$^ghCj)jRPulc! z59KY~A7U&UQVfF9++3nZCP8J|%7ilxzk$Iy58g{#f`ekZC3@y0Z}d^J0SXM@3c}b* zQz1zQ+YND7VsyKNtI3wqA5r>hXXV%6qj5M9Vl2+eHUp#O%c+~~LsQkLdt<5U$i=g71;6~GI3 zt-a$(Wn0^B_xXbo(IEeJmiJ6%At|0nnXf~B;kr*cDh!ZE;dtShb)pt#ay$r5{Z4?D z>V^W$OLKh3Q|>EQLJsZo#oUv0bHB*jRaS1*2zPB?>?3)=T0KbPJ2QqbkuNOQ2v2YA z-li*8mg9fz+1#5(^pK*qH1|B`>RAw_i?f<{c=MaJXF;$o&uV_po4=xRqr9j`Mt%IP z^U;aoMbIK&E<=axQTsEyyoBS`&5>Y>HPkjFA=GaB{_4|2X7xMsv0o`8k(}YbM5YJG z%U%p^|BoociWt23j?S}ly)=~}|CQ)372i2w-g9@H`v@!aB0%Khfb1nC?JYrT)S=_W z^|j_Yp#69_uaq?#$nUWEBYqeCb1(Fv{o8d8<;s**H7)y=GnEAJfWtznY4nlqC6f`y9r`?dR40|T&;%9>-b zV=s(&&>iflntA?zxSbLf5@bt^g7(CX<*xDr7mlbJSb~pRo@2&9EwsKSH%JN-J63)I zBdYVX`VSubWW?|sbce+UFY1mYW^YDx?hga!YgpcFkSdOPqadR z{hpdWm=$-dh?hM$K`{^hW+DFz461?F@um0#wun|3COS-94koVV{N>E}f*tJV=i^sp z6=}+x$oRk=AA=?!nl)p7qeCe|W1R=%H?|B&F&f|tB5Y6CLzDor9Qd{%%O`&}9Aw#t zkQI4yTBSVM@HafU01ev*}kIS%?vN|^IpwxJyNIhA>km}jH}4a?(m^3ZP9N5aIyxUE-_b_(aj&mn;JINd=fna z?b#L0r>RdIKiP&wtOI6$FPd>o3wgD*R6}Rj7p}$2R=wD6*bY3cV4cyt2`f&}SFH`A zu}HqJ$=j#L3;WYegFQzt@G(9TgMn@aO0_b)tCjJqBEzc{fhU7Wr|>IiofV~P12WX* z*^grF;PMZ;FxH_9Zwp68gNX~a z`7`J#v3c?0pM7MwqI_y79EZe0vBk`rUXtZN|W=e@BTsF;6Tjh8bGP?IW)}Z#e;NyS@8SJ{11f34h2KD$vm3 z!U@0xt>I}vD3IwR6pfb?$Q0E6x*up%dJ~|z?!7~G>pVn}HF!s>|CykW)-Z>^o|<=` z$RjEpGxI#6QXb!X4DZ#xO@MUPanxxxP-y^ql|-fUf{|rJr6>Hane06T$Di=s6{s#&hm|bH+an8V&kMAS_qmML z@d@NP0rw3v7k31CNc}l7V9#I-`BGrdV1+%^otsHO{cigz_8L%|n5DmCCmhjxJ>tbi z)F3tf8*Tt%qkveX?;cEi44M@enRlZ06f!y8Pt}`^ddY}{-KW-D;nU)7@o5Sg1wM5~ z4NyHK6L7)06fgc5FM)K<0A>z;%Dpg0Ll>XOt62-8?!l$K=*81qu@}Ij9-##po4>!? z6_3Yghx_wgl(_)7DRLUgskqrMH`DBJpwuF*+CeNi@UR#-XqT=;wI%l24+S+-h?!^a zdO;!PMZe;s)M%MqIX6Sz;Ua4bc#sn$U|R^c zeL)!ssYoDZu8;{$%1=RSG~BnV^9&1~a4Yam4Lp^H9B6jeA`9!~;{H4iUnJi**M;8$ zk5KK@45a~sU}wkfcl1F-yM^CFqI>5J5YFc4?V!D|r+fG5;nTlt9Vg%h#iT@5FDW;`D3mpI)cmuQCoJc)4``2H?H*%c5I&$=0(I^tofzfZVpk=<(rW(SFd zw5N}+-5YJYWU+9f)Wt-7hn0ljv6uj*+SA^fo4(5L@{m>e&$E4h}1YlVTFg(Qp z=mXE!;ms6-2*h7kZ`8hvI?LCh?&u(V2;nMS%Sw$G_UY>7v@Dk&u%80F0q($tG4hj6 z$(!J+>5p9Qdicjc)_mO>5iibpUu3m-@fYtw12#WZ0hM_?!$hrT>Ua`P{XD4dvp^I^ zfDp0~SIuoY5+q)TQ&sF!-aQSdb>;`C5CfVe4UKTsoQ-I7e076lQalliHV{XKZ$&VU zM=@SJA5F)Eyj}MOIvhc;ax1YPZHy6Gg`-rwNiGKkZq$4~w$LKQb->P-&%uj!3-D7U z#lh#xliyL{`Zk~ZNuEGxi5-hSXb%DX_U+?596-l5i0S|QMJ5J{{XHCy*Nz1CpI*}i z_Mdm7za#b!Kb9}buEC2tRL^pb@9NtlQ#yb9IYyBmWZ@UHh$`rrU6 zfu`t#J-A(v)RvQO3KzehIXL)x%KGB)nfV_za>mV97~cwAbdGM`>#O4}Y)sY^3e42@ z;Nrx9(%bD1D1caCMxqjF^$!VWD*Ol5Qn&K;hP7IKBX3o%sX1A<#(>5!F+D7QMLj^A z*%nt6Co{l(15nbrfw0p6=`^KabO`POScLEXMs2%I;$7L6oQ%8w_GQT`OvUvEZrbAQ zQWEJh^a6_wDHp$(6jp*~LwKt~o^hQxS*7-0|B1aD;F~CNLnv71QI;+R7kfKrf@?Vm zSG@Q^;tXVq`o92xC>#!y2B&xRGah;B( zYKdjh8+&)Wcr53ZE1=*7Qz;OGnbYc-ZIHx7x2_Umax$sM@dBAz{qOmZ)MV(p5Z@mp z@Bm7W-E^8OdN&HT2jh)t%SlgO<}%uszD-;JmBLqaqPStS2NTk6zjCj0pB*f>U> zPOyswb4b(VZjW2DT(RSvVxIl%>v#!AgCHOAcKZ(~$o{KTWWV*E;9OE4z;RE+whf#p z^Dq;7e$6*(d?edK-$@QGOx7348J}KD0`E)F z(~d(B`~)ief{(xumagIE>x;gpeX`;ym)ZjyK18smh8J_ zt(1oVo|f^|CaGGvL;d~{HD*eXE4gEhm#R6JlXCbLE@t2tx7!3sctcKX)6vB`J^*#9 zwu{ios4H#g)lRjbggHT})>*x8GV~W(IrL|`8hTryGj!SJMI-&+NgJ}vl{iJHA*Ut* z^pN~wn8QX zw@RZRMO%p3O1*Yq$$s@g(zES$!xBD&@J08DEjN=lZMSF0%}jnyTCfDQQ?gBP+yvSx zysnw7aGD^4>BeHqm4d9$uM&_2bntWDIlY?n+yRD8s4UBqLgiS1s5AthxssJda=!Q> z2j3k$rB$I&=}tKN0FQ26jnzT_P*DAQxTgXkfrdI6Cpa`-4(vUwzAk3 zw+Q z-bh>B&%du$_h*X}H^CyN+AAMWknm%@SPzY>~4{T-F94LtU^xTWMz?@KIv6-A{uE`Bo=uNC*EAC78wOW^PFY*YLT(7 zbVb8m0^xfnD~XJK{Y!d7od7beA?XC>53{ff`m(}x!i}@YbK=F{c|$GojN~Fub{4tf zi{v7Iw)LnMxn*kii~Q|>CDs!tT#Q%|qVS*ZPTWK%=h*Mwrxy8sxlQ?;@-)|&eP(iI z^G(rNg+r$>86##yF{Vq#&glyOLM<|oyhcspWZWGq9qewA1r|CkGAlbLSy?3K+v!zw zTI94U5{nGv-DN-CoQBDSo6Wh&Mb6P~=CpN39MYCEQ6*a0WnaQ7GZA*-zeuzJFN$J2 z(BlQsgwV+YH?M)*3G}`8^W@6*C5}VE{2Jo@(M`#f* zzWU!`UXWbhh(nyLE~%rd+=iN+n44G02sYGiQ@e8jgc9VYFbu0-6Y{AxsjEb%HcJ0ivws`WKPEr13ec;GO)y?=*BWT1 z4T6WoS8DaA<8xGafnK=<$&HYq>2MC5$hMUuqJ-xnj==6H)B-t-O-?8!GL+GNQd)y- zOYlP5fgGGu6uX=J97T5M2WxRA6Skl|{>B!)c^4#NutJ`J6~Wep-TT*A6o3|H62tOq z4Ugg@!-Ux@F;ecgArcdo{IuC12av7)QXa)9p-%+}f12pYGvcjLx;Y14Wb@^3!P;=r z(DPhO`-n+z3z>&(ZV}KYtPd0ym}90UEfm+p2mWOvmL%hz!#@1@$lmgrfSDW$`}WdP zU9n@>Pu*^k`=XK%{_V#`WMNL*?TSXeukKS-X>{(F%Kc1vB0+yBv4qU^01!vAc#7SH zWI?S$4k2`78K8K)KNlKDr1;cti&yeSJ-iP|*zff<$?HnnNbsl|5`xGaR#e9~K*3N@ z1i$&`T~V;`4MfCmOu=fBl|^!9q*w9v6zoN3Z)}&n{Y53)J|SIA?3tl2ksMF9Birhc zdgU^WQBbTOu?bWP*TB4#ykCk3@BK^-uZ;436KezriXcSt*l!Al$%%mQUY!u@r{Xo- zZsU_ld@@<^kGz92y>5>}4=K)45pl#>N*nRwX|E~DI42>?HcCzGW0E-fKNsQ{_$)~r zk8CH!0Bpa!q8VIEk-s{#D`~yTpwAw%6BJdKbMiEw}$9O-y8cX%v zJUDC|gnA6KGJx0IR=Xl-!U+*`4N3{>MotPf`IdcfC_D(VSpqK~A)E2y*NLFinSYMz zKr@488C+EI0^*mhNMaC_1uF~k5_l<-Y6c}Sh}Da}jH~ecu?GnbFt;BJReoIi9hg7#c#BrwpP!m5f{`<^J&I!oXx`Sw z?L`!P4l*p+G?4JX1X52pCNXxstfnt1qC+bu`X-BV0#j;ajyv|fa!}Y0GbrYrq?oVS z(O+Th(uw6`=xc&lk`R(JB*&=nf*KxJ@~rXP%?r^cYxcMfH;V zd+qN!_di*{`-(n>Kbj2545@rT903^d{YeaZ5qKwn!6UH^oa{;U5CIcNkkZ+-cd_6R ztyR`Iya*h}n>}b46Efh(ih@Ma8ukyHwyTQ7dqd>CK{Qd~ajE^r9@>mxhiZuzkKTYD zfLoOiLzNA(2o5x>CU=rymaI)+Br5USJ7Tax^|ybpAvylIeGN{?APXtx)>9$%QRz+( z*%{bwzdN7r+ULqAo%e%Da}2l~o1Y>PQqZ~{U24Y$hyL94&u(8l^Ri3N*5QQv+>eTe z&;NGYtcUdSb$b4a+UtVWU}f(|e()2L4{OEKfQ}G7UO{ou6Iy zYCebi%&1jWezv;v3WiGL%wB?eBXEj)`CNQrU-wVEm2SjcjL#?;wQ_0T-*D{duGslb zQMYHXc(zji&yz-!2x82>Ct3 zUxKof?E8^ggJh--kN%^0voTHBEbNvt$pXy7`;#X}OPa7(f@bo(XmS1nbdh;Y>U3%} z@_-`)yh;u>Or07nE<#c<4pa0Wki!&%ow9?qpo55|px;ksEQMr}>48qlvC-lJh!#3z z2ZL8SvV(PfY&0ewyAqrCLPvOR2wGvNID_3ia z?&d9U10Ec`03I+ZUBj~wo5ZX1+;yb5I^l{VG>_*pUaq}y){Gl(nLbN7{+7R?FS}*>lv}?y zbNUpbT?xq;7T>Qg``*kOZ@uyRcT8hoJ?>QK%VynJbI0{lZmendXI-pRW}m z@3mX=`oY!cYKA?tq5!is`b+W0z@K?K{{%|;QFYLovjO2KTbOnL8TGY#o~TQLQNiK( zMWMr?gs>8%`zPq`PxR)N!V9f}K04;Oc}1yFz9#5yHJY2e299QMufSEY?rz6hMSA%W zy}1={YyjUt$Ou@{ikUA}nXiU-=7zt_o;`ZJZg# zWa*XmtbvAm#dt(w^g;eUB#hhqUMT-xI88oQOb3pnKL+j)k*=V;=8Y8WVSUT!Y^rZ= z3+A^0v2trKbSA|>Pt=@rnh;Jw#+)D;rMxLtBvnb>iF_c@<%9Ri6oVwqc+ zWh9<=K6Jj)=eM(?o%)j55$Tz%X?K0^?)_B7vgGKhGeYY6O{F>y?7)OT8gF)7=H=M< zH}@gN4S4-6;l{Ymm~Y+vIeh4e+CVP&-b4350L}q9uls=RenTJdF3xuuo^f9H1|%{0 zBxr8Z2d#qu#XQmFZz8D}vo2{1F68zv2{}@7M0y#5YtX`*H^9ph^$?$fk#R^2hWzKC zBS7jhublI88G;LfZX}kTi0lU8ds)p0U?}pN^0KuFG9CO&P)h+qZ-yZhXIOS)0Yh`VtfdhPv=SaMoLmZSG5m zs0NUCo;&&oLpvZq%^>WN5zlZ!G;ns?Wi3jC`!$TdtY?Ojtx=NGxaUGg*@q!!2hGot zS-*}j>ldUKbriQ80r$HVAh?64k-`Q+VR;xgr3Wf-UqG;w>|gqG85CCHs-V2-FLxlb z>&dMB`pYRY3jvow_RputEY=A}GCJK$iVfutN&HEh{3gX#-ncT;jY?A>QJQrlYN)q-N z3NRpR$j9YMJD(;+XhC#xH-MSsZsE7pB)Sk(9gFfDUitOJMlcFPSfD`9Cten)uCoBC z-r4bt)cYR8O_7%&KKs2WKn$Dan?cu@O9psc2no)OOQ13C(1ej|pNHGJRqw0AySk-z z=Je*>6?)GXm0`tlcA-JFXXtKN@0tqra)iTS;af_{4d*a0rMcP5B}0O>=4Q}m%wH4e z^L{cx5OGrK#HZ@J`JV`t>-J0Mv;7@DJL>mSFS0-AtkWgP59~IMA1+@HibQ=m{XB34 z>-nDNye0fU-5Y}HJVo4~v4KZA9>p(J3Y6OGPFU_{pl#3z0ZHz1 zfpkojXCNIVYODLSCr_nj^nG{}IeL^2q4d;IhHx&*5;{srr%l^wK{hF-tvZe|ecNvG z^NwarB2{7sg34g9btZ2o)+?Fc=8PYJ`eGm$C~ZlRoajVW?Sb{M_+?%K`XS$A2U(?s z_~a$2J^B56FLn6-L9rId_m6zH^Y?#C`#wGYj9I`I|J217b@D|@7U&QU5&j6e9GC-_ z3>KStkk(WhV-v!uZcRt$FN1QzbA4b=-<*uX`w}DGia@+qQ)!HmSr$2hk+hg|QOa6z zh_IYkl#Kdj24nH8|9O)h>8F&G1}?NT043$X3Lf|#v{bzJ6;w$i!`z#AsXQJ%qmzyz zXBE8zi#x4@FW@mg5EbR94k*%FS5igMH^;Ci;T&ABMO2iZpvts^3y{f~2Ny^Jk{ z8CebWB29iv=r08s@!xa1jsHHETZt|-dQIl;=kj?Ye@ho9x|74 zQS>etGbKLIhrb9H*I!8SO#q5s{;Bao2Fo z{*_99Fs$GO;75)E@oLDu*Jxht4V8Zei3?Z7hWh{&h+z2v1KhwU$3gM%dv48R_~46U z&E`OOM{aq()8OKt@i>E9_ z28=;ps)nr+YV4qg2ekS#St)2%o{I0r{!{FSY4lmm=meg@m5lGkaYES_Mm+P#CL!7* z|0zh*cVKI!*e`;9z$R_2^4ORS=$E4pVn>JDHz0I8BCiss2;nfQ`!HtYRvaO@6_HqT zi%>Xg;!1oLT)9s~M0T{q{@rF;BN5r18T5UI3i?jxCy4(>SJU7!jN?ZEZ!%y)7G&+< zfKQwt@RO+{W(I-xB-7;bIA<#n@2G?T$P4DsF2R_3p^6!;~E5r zuY`FuUi>&>Hake4;Z>8;MbB+Nr0B^_3hy*trD%7`-@UUu^kQ{q32MeOl)y5-PqWuL z@(|z-Q<^Rh>5e=UjEsfXG!`@peH0?}`^lewKg6NHfu?kMNQF@yM8KWMLz}vjhko@xFAo{r%R}Ev$U_6WkcZa75lhKKJrnZK z+-EZ7p;J@x(15Pxp)Mrk&`hTfKbo z;-}GBeiec@eNptBlvujH@<(h`LjMr^t?tN69+8*WNl|-(m9WA(;?g=PKwP?9 ziA%j4aj6VM#9r z1if-$WaMC679+KN$h|*=tTN5brNN;f-g^0V5M#u)(qvmR?k1dv95#}y(4af->z7tL+q_j1FZXU{%moHemWhA;)0 zapp;}@hO~77ntyH)|s%kf^>cc3BO8vcG|HCfyvmsGnD@!BQVXq6qqWM*>%ILUWU5~ zIn2?HBQU*Z0y;jy!`d0%M0EZ$;PQ%(M*oKqSQfH}VW!CcZ|V5y7j}KIb20|D`8xAt_eCv<_Gr zig&rg2ltkr%#p^SvTIAtdR#ZsB5C!j2*G+1IFOYUG?7^lt_9f5SFtY$`wJf_)E0aS zmxX{e<^Pcg!9={`Z=6Qm9n7Z6@hwEdz2L(%2(D3= zp}~-Q18i{rm_r*Jjogu94zBSJDH5&0%A@lbf8omy?;S_oXouf-x4%`s z(!Cu~M)j!9u;i#Az4DN@@ZKUW^F8D*hP9{(KUTkGM&;YHPc$mGY73{z<7c11{Xpf& zN3{CWu%MJ(`^0<= z>s#xq1J`%edSks&e(j7{FIC37S$XDbwK=?7Y90x%hf)aW2~_-)@U4w)XJ!1+mY(N7 z(3)3MCLh)mCK@TMDU20Kp(k3b?cuN6?THnJ*F&G(?UDQA0`OjLvXN+RQ!r9^+v(@I zup$M=jICd*-M6A@$cpEQFfY{6@o4NetirbW>s%-y8Lw8a0r>D@?Z8-HlmpBB^Rryf z*Dc5b7LDDI|B1O7cWd(SK^fw#X$wXk$Ay!X2}S~Kq9SD4cHz=8AROL~y#bf7MY3v| zS3m*f2iBlU{65O6f#;8^=S7QD*}G_;y1$4$!gD!=iuJg-c%TdF`yx4p3ZO+4H%vkL z41_-u;w22-l0z*xs10`6{8@pJxeG_<d9&^?@+DxtEzpnDW2`BEs9M< zW$@Ig`Mcbx8OssC%M3nGg?IYS!`@(?s}>>z`oI0yMF02TO8P&4tqW+-IM&^GOBTkG zHUI%*!&*)%Le{V#7oF2hz(NBMWHQt>5-5pV7?P* z-b1#9qc!U#G!^uujWwdUK|UD%;HKfiMuxWhU8&5&QrJUso+7KndS#4WsZ}4tQlQpGd)qB?#vz--KWgCIQpx zX>UPaJldjOxbioCf_`tnjhvZpO08MRTG6@J(KIu&dVE$j<_#1hh;3F*s{O{(ke`TE zA#(@4GloQ0fwW5%*I-^SBz~qXbs>+{t?YLgj}?v&g8q0gTU)dg^~gM|LOziP(XNt= zBK`7%mG1+^-^LbVzVg)5MsI=ZHNBzAU^*$)>Xk1elu~eFATYe71XH6TubBUI8X_G* zL#weo2rq|)2o2pQ(@BdG8qzCQ>e@KQhvYw>hwfm{X&V}1tVG2+cO!k#Z=pGw%#-v9wM|M=9FSg6rD}WU^sXq*kj@lGW*0WNQmx@%oLSHv z-5Tj5Gb@Yr%cMSXGx-6M-JGtQBiYr{*;Qm!NkDylZ|EY?FORCHBf9MA=^c8C-e?W$ zGCD|_i_|CSTr z0*st_Aee#}a#v>p7JkgB`70*W2rn0*yUKdpSI1d_9m21qug6f#;4x3ShGx5JazSKj zieig|!%%;#8-N65euJ ztbG0}F391Oo~pJv0#Ae1j;^-h&nRJMg;Md4RKO5C+P8M+it@@fkWYhEdaR%YM*_iQwKS01u& zm7oW%vF6UP=J)#<=5?hwi>@q|jT;1^P~`h_7|;Mc7w*Z*VuhJI35ql&uz*ztR<7u; zsEvRv4os#MPTQg(Lgs@kApdHRpDX_%+CQiG{Lvr7gh=JBjPB!&zeKOoPy^@AVt=VO z>|;H+Bfr4nCm$jv=8=bQFlS3Z=s-;y%O4 zsboN4lvF7Opu|g$b!Z;&TBl%!d?*_qW=f(d+=+NR31Jlp2qV1skzfReG5e7m7eE4! zpEjnFzS~DId0D~8uAqA#Y=5%N3Z0AKg1Mih!|a&7oU4i-1ue@Jv@B!kYq71W9t0``0M=o z{KIH4Z|3l>KloengL5-K(84bPybwL3)wf}#sKgqPd59rN3>A$65_j2;-dpAh?{qis z?3@1%;1qg0uo1NyJ>l5JUr08MQU-RiHRP?WSCN}Lbt}SY19rj7qOTS{1x>zycTn;B zPRF(Iskn(V;DeDrvl>tgm#b7%=?`LXvhH7nRi5AC;vB?R8S}rOZS(eP%b_6e5T7w! z`|Sp9lQn;sEiUKiGm?ev3mjPG*R`=N&*60l0b}41qlYauf2uO~&)?xf zWfIhI1kh0uFt^x&UzNFH_Ye*$47XYtUp75GJs9kU0t`FJ|5$`o7(ks4tBn>&p-Fv3b)*k?gI1vkmAYY`fMppmU z6%dc(NVE?B^o{Tc0mqD;#HSmL_V3T=__$SUwJ?kcZH18FsF&6=;^SzS{UsYAyo%HX zD9A9x1Ihl1??GsM>;%Nb;rbz7BSOk~CrFI6@=*Gaeu6$ zJ(}P5Qr};$zCU1}#hY=WYNYrCd=$&YMHwzo`vF_y(;aw9cH4%9(^3{5Ng2D{EI&=L;U`-obFJOFbaA3W_)j3O3C>HxyBrmKW&msC{bZnAQ~P>; z`Z%jZAog|A%Efme!_H4tD;L7y&OVu4B3VS;pQ9=XDTG_bYTL)JZ^9FJ4)&zR-0&;( z)-GfX5*ZdLuEYm{7ol0XVkhZ<#b4k`n%VMGd@KHLk>U@oRJA6%^+#4*sJf++)5#sa zJCWjnGCz=1osn@JjGyDV#pjrqT50_pv>y9$q6WEjJZgzeU51W=L$q;@tI?HPEDB5EKoUa)YR^(Lsq|Rz%C-M=TpwVQW{n=sFWJI2^UbCHXZSOeu zYvq1d@ndi@>=Ql$!t2IV(&insa+l4(b*vy!szJ%f7CRQ>!}6*uP$Y08-5L)g))SQa zbn6$CP=eMIewJG6coY9|gFrW#+^CMvMGv#Jr8tQCAj13+5Ny`?rpy{gr<8CjY<&+x z;R!~D^$k@X32EangaeM5Z!FaMhPROCkE>-)1O31nvzsVg?VA(58&{#oUHLG-oh9bC zvv30s!Aa0Z>ASXc33m>(rH#ZWbq~qwb~V9I_J)x!BRV4v`8IbMD1a+)z<-;&HrL!7 zoet44WHrvgC*}sDa{gpiv9J~|ae5%~Wf|G?t8p{hM$*n+Ny8Cry;0Yn$}}Pet~(tD zM%+P%Agk4UH%-1(ro~BG!!KwPHg|mU5%@5I2{(*fC?mkx1|nHrF+Oh}8A|y7g{UO;aPzd1;Q8G=@A+ zpwbIbzkCSDVE56rJ?L%5hrOc3c#8vR#=K!r&^0mOr|=$>*gRI_NmR27H~mXJ(cj}u zWhA{KdNv-yy!&nWYBgR^?KI#jV+xQzq{9?AbG#Rofnl7XQHgfL^hkOxwVjGOs7Obd zVc)O>dLbq&k7NkPA}-&6p@}@~k1hj2Mpq`u$LHZ=|5BVq#8J0Hd}eRnZ2s6AFgFD9 z_Epg`%LTbBxgf{Xo}4i==yB$hDl>3Es(%YLs=6Oy-LzPDXYti7*wR|-wqOwa7sFO; z#to_OH_7@gRDG3~B8?@O-eBaZC-9+AO9L_%QL>6DM)uj`AQY1-3?VT9uZ7m5M;OZn zA9>t^Pl!q|XTLL@!nXRB#0AFxZU3jtg-x{@Uk%;-AfhAOgn@8#NUVdA8%6D9Qqpbq z*}qfT?g(ypzeExjH04JRzeMte;-C4ew>FRr@*lEvLMVwB_q!V*rN6-?ef_FI%Gk*g zt#KU|D~%Yy$0bAAeF2ZDesbU(TPe&|Db2SP8~PYsym;X~U1+}hk&ZHIU>cR?+lAJ9 zHML#{oJTn5Qi*hWd$Ce_b+$^0A!z=|_ZWYzyZpL!8I%#xb4f91cNb_(=(^D1mawDH zUUloPNpJ$uvtL@qJJ~O7P(SFO_1Jf^M5SuAbc>QoZ2wQO#u+ zt7o4f#=7twPLu-6l0w>w%C| znXTC~j1jX1-wSCuBNmJvwdgWz) zZQ;8z6sb8OJLs(vevZ{|f1}|IB%i`7=;9RY9bl-FY6gaJo(j%PXzdX@k%EL)e>T<% zz3T-?2W1*L9?uGpcz=@kMD&*y#zOI5M%s;dllM#YdMeXa7Eg^hmF&In+7*S5 z>8+aiY><38YX2c58H*I}`Zg4TGueS&jZQ;9MnkdQR7I|`|N28HLGA2kq_{8cI~t<> zz(Ult9rvMOj5%GDp?>%g<>>uSs1+6ZSVlT?n01?X{BmXc-2U(2RzlUzg&! z(u{`S0X3s5d8dGUh|k9i;rFA)Wuf*+;g^Ix`9|V*iXIU4_>)tR!^Rg zwtQ}n*x5HNsTqtwRA^d^5-|7MFYOTtfu{CxI0W*1SMB;(eho7BgALPkqlZ@^x&74v zCqv0i>G`SVf26qlVMIwp<{-s>JZo03VC6XP>}l*PJlkAN+QUt;@4;vjv@Qbuy%jk> zZo;O~+)`_neH}_4WLiLKbX8qx^icaSPjNM1EyB3p6VBE<#2Pux`Zls zY6~8AZutoX5Tam6x!2c*o79TR?4SQy5p0NA_xkF18_{^R$8qz!5ha7lmObmS*kW!k zz$l9JH)eLsTU(k)oR2%^g-njiSxcK!^r!YjK=MR4A-VWd#DFTW3;?_6=%45%1;$dE zkst)g9&OI_Dau?mnRmfw#7vd*WWBlzE7kCvQbIa~Lkwb4+KI~4_x(4Wj)%h^l&I6~ zc0dw7b%4hdBqB*CdtPPrM$9`_`(W0rzFci>;SSD5+KNXv;|48tnA<$8wyeBvT?_ah zS6XFVBPA&R4sw6yX^}l3mjASPr z3Pz^FJb5*CA~`umn1R~UMOZ_4ah|B**x@F;>8%uEK=rEg5C{@G26#l7PDd0`r{(7qc)5Nh ziB)~@`m|M*wT51hvw1;kRnI>8D^~RfQ)E?FUV?Y9$Um$j6ea!rGS-va*y<6CRAX!P z^91tVp1zc^X-GMTHM|!5`BtpowOGH)o%MqqCkS(hpQ+U#?OYAx2ptX0EnLfyMBm9q zCG-Z7+DH0k4GmSU)E4gM#Lxx=r0fAa-imVcApUfm;OIua8JU4S_8MPV$SMz6cjSev z?|DNw4Kq2O5a?UqWPMF{7Db7TDIl)7Q;)A!ViIRsCK*{>reXhofj|n4QnKgjm|sog zjr*L~0)Ml%5H>J=P&gPJR)@a>HiYdbe6Ii@%;ttg+M+ewM&q_c9T7c%!q^MP$Eac& zFm#rX&_9L$UtWOW7Jqti68~l8(s~Wh5^#W>#sL=s#t$YZ0mBIqr%C$pI^Iok+b{bP zVt%Ez1u?j(9Z13O>jh{Qqj3VwIdcg##J8`9m+2YsG6k^WQ2N;&;6<#aKy{8N1urRJ z(JSB4O~Q%L`?oNK>Gb|pl%t36rxToP;+v5%fD>>I!;;_9bYSV0AKVFkFbBGZR!?q1 zV8;BCm{bDdv<1&NH>>qXVuu8dEgit4?=1w6M5+h{CMniHXmQBMeX%fidO;xye6f>j z%R9qH40*W=zyKL!NJ>HU%wQBP0w{wI3!tnEB><&FRx8zgPO!j8l6Z`}wksH^o0|b6 zTTl3E7%7@8F!BSmOBgxsPQpm%^G72&Ye=3gtiTU4iGJfw}^+t1R!r9u7wg&rRB``LMd+w`R>v+T^u2 zY2RC`Rd0opi=mC(bYNu`el{Oi>A}y&11s|aJbS{0!W-s0{tbKlbvtwXWiedW?Ht+^ z%c^^SsNcn6(;koC#k-mxj@i2VT_fD|MJ?o+c+FXGfL8m}dK@vMB^)?vmw70>0~V`z+U!$|(8IgG2#5w!zKOHnyANjnx&KSto4`j^o&Wy{5J(W1AV#C2 zj2bYgXi!ihB8d>VgA>3VcWf1LEtN#EiUyOY<2YYwYpu50TC1)4wXIfb-Ks={;EGFC zTC2vDJ4OYy3Uy)r@6U7YELk9+{r>*EGyzR!N)xLb>PV z&i`Z}5hiC=p}M?XH!MRn>rl-?ROi_fR${VSiOH-)H2)36 z@2~5d@b#w$epq&HA}DBO+8;EyB37e2Ux2W91Z0 zmHg=<^n0+s!^G}{34-OIKWr)GY<-u$jOlx#BAsJIb^NdE^-VJkt@a=L5`zP%<$}Gf zBhMR#>2ALh0wRSD=gVE_Hm&ySlM|#}G_-T@e*El&Jub5$Gn{dh9XM8Hja35_jXoy| zZvGO)%EO#<>Bjzhj9TJj{;n6OQx2Yq&VMCznQ@}z@RnJLs5zyE3r!^*(T1XGmy|O! z31%W~5z@p!5gDskLF_K>v-+Mp45(Q1t#5^eEa9y_^)DG!#*|5~C;73wZo3@SYh`Oa zn$;)9X^VKV@f`XEPzJX^en0=7<4FnwNkOIT|Ex}(4`t7z~P~uyk?u{H(dmx*eXi+Fwmiz4%Z(sbABXumuO$#}PM{g867W?PuC;i*c8=VKoCUV+4)O;-$sUk)? z6TGgA^@wYOU9pHMF)61cV3pOMD*dr!rK}7b0DVZ6e0F{W50g~g*5U{;A_%8b(o<5fl7t+tEoEkYMsCBo(>#z{&!-+s`+4qm-e7u z;{#$?#9|$rd!8NVodGX|UB&xJ=-uhTo9K(j6XUG%kH^#@9w z&!JXJYH@?YJC5$8>_kAo@1YpQ9u(X_sE8X+y~@tJu#ov~9M`ArG1uMeZ3yfK^`EY5 z2u-g4N$`XQ=jclsUTyrJde~KLzl=RLXTPA1n$QHEaQV-It%A82D0%rjQ8R3mU*^t2 zcE_Lqr`+f-QYF2a5pt~to96L$sJi)w8T}k*8LtJv$}80c-xO4vMI#En@g6+-DEn7H zs+G#;szN_mPDJnL)C54ciP%v9%xhSPh=5(w?`9BEp?zRu2+3bt{vEKAMrk|)5iB98v1!=ehEl9)OeE+2LWb{x9JCkXtpXEAFy)z_yMi+uja|h z>4`ps%tX)!iC7iqi_Fz>z&O!Cd7;7R?ITFQyoy*h;yz_W3!!`d3v zC3M*z_=foex-h&><8PUdrhdTTZu|pQP8&afYA@2M7b2BQ=3i);p#;wqsA8lm2}_CK z&im?gHwUkV8jqyQ8n2Dt22JOp@oDsp9EgKa=kQLOE*d)|=vptvUj$IqYWz65d6ka` zDXu}}#uVfyedbV&jQ75$O zrd12Zo0Se&AoV)7fN#14#(em)W-spXESKyd*&ZC}dT@xkFkJv7=X^@#bV1H_HU}#dz}}MV=Z$W0 z&qy7p?_(XQUKMS_i?|u^Z&tM(Hs2G%yS* z*TT2@m!B&H;G7D-+}(h|KhK^i{TX(R;Mqy`EK428&&hc~)kjquMG9M@buxTy*mr&u z1$L>CoyhpU@c(@P$;Ras#=UzZ|C!k@USdptDq!OJ81|l&Y?1i>6f7l13J96smi#A= z)fUanAL33nxSNchU**?NOFp4@iRqbE-RlnYYg%H=fv)|l)P8(4f?6r3qomu{;V(Z~ z5=k7B@+$usYWxj_NRHmr%$1W2*uiC&9vYwgv17L(Tp@SYy1t z*^NAV-ylqnh(Ao_pT8{xUbOxvukI&Wub-!{+K)7CZ-yF6_{^b+Z9WEBzVF5J?#cJY z_d0LXp@{+b6}PaDjz~o-zYI04gnD-A`g_*(mQ2^*rx3vpO;2(CuXMfFdFigd`bwtj zcQFd<`f+@wOV{_!?YhxR>wjo-`adG*fB*k}|F_Hb|3iLS|9=4j+1&om5VGkEI-TcV z&Xk(}XS)O*HE^{{!8vw|F2SE@X%yPOy1?G`hO)AyBfgPoX2?cQtO;uK=Z%hvDJqa%U?(OZ`i_qwXvsj<+1p% z>hU|)V{>jLd~s=?XyvQteOMhouzLJK`SthSoqzmNQNJAdZO#K~f61I(9G+q;Fr0{$-~3z>!BBb$H%!Gitp`Wou6qTyqOkT{$&eKiP|)Tpo>IP?0J*?zBiA z-Wmfxy-Kh(;j>c_azEY?AWdB`lZQD*LwmZnPjuqXX1Htc6hf_#!= z|3Cy(nu`dDFK>xn@e-n&tdOf9snxNi)g%vzz2H=cMC85^y2ZQVv)HS#=c*gOBA*C* z;JhIZ^y7oDSh3gjwmr6@z0c^66pe}TmevfQ)&45Azf_t0Py@+6(r2=)5_MYxvTUM; zbct#_i9U<1ZEVYLX)BZyP%lWC0_*d_46Nm?U8-Yit6Th{>P2mN1JuiZRP!#cN{3kN zSRMOk^`f_Fjk~u8SI0i9ZfW1X8i%lIPAgd?D_xkpeFe2eZ&t@XCun_Wb>n+|YKy+9 zj;*PVwNp4m;li5O*VT*O#Xm!t9ER2w{i`PSRrR8GxaYw;!)uG)!4@$zMy(I48{aLC zkdnXXiAd2iwM9?V>hIrU>s$P-8{5LsB7f0)d^Dfr;Df!QWi4xlELy#U2VT({Jn4o; zi&n?{7QcA7#uhEY#)u}jP=h2WYjSM;a9LboZg=vER@Cr48e=jdE$@wt6fKJseY5VB zb<1gOK&bgg6!dEbjbZ7RuY3OXzM*DmlNP<-#%n@7`P+wf=;|_bUZn%h-~WMuJTq*9 zsIHa!Dz-%KzjXDjJ!6kIzTJyx%e}m!ryASnP}@ka=y@t*KenYPwx!svrF{_7Ql;@c zt^PH>7p`u3uYaWIb;>T<(8edE;$ydC^H2_vKA~oL=-AL08{;M8y_PRb6K=%%ndq}f zuaf=rsxWxPnlp|*+^w*eTj?dqn~PeiTh{cq)h*786s@c+!WCq_$M~x9nm>w!B8b44 z(I>}}jc@g8d22hupc>x}GrAoaojt8;d21W5=mlD`^j?L`vA$Bh&fNCA&}4d+YVeT+I9f|P)_je7O&_N)FqEr*VoNG?cBOElsA0Q zr{Axxo$M8TTDPNKc^97kgL9{zcCLF>f5y3|@v43(eu9l}(Zjygi{95fMOxn9I#Tpp zq-Z%u=(Qa@>BzbsWwC>@L;-r!-Tg` zROQw0bClOOVFRV;;(Mg8OiXwvJSES6c3aMlhs>px7d%M0{1eml(%0lgyv)Jp9q=pB zMjW0b*b*#{nSW`wnSxZ3g&oFf%CVyG~E(uid1i5 zq=QX+qga(5Yc10B-Dw(ESY!fEYT=x-zt{r$*37b5F6cwNpmq z`Pc6&t#4a(aEuqqthPw}KJ@t@$np1;N$Xc%ny%zeqe@N*`+2ps7mXdn8LUlKu{z!_ zwWO|hb*vv9+86w%*Q$vY=%kH|XH%)vNsDnuEZ)Hm2cQYEKlVx0lC?c#AB?XAnvtEtl5YPt=anOt zs70>9@^}?AIQrpn24UGY3cG9Lf4ga8&F<+oMp+v<_}ZNZ366&K4mFumX2L_;Is-Ug z;KT2Snr>mP0HXDr`*m^vM0e^Do>qwoXCDg?ozAF$sZKz2awK7%3INe{)hy#%qqK}` ztCwHiKy`p0LwAzDkLduI9`KeZI9Xd6oMSce^zof|73*o)l$ zI@lY33H$3h^&>Gg?8W-}1NIvpY^U$dVkS-u^{}0;u3{!$-D}GL`U)y-ay!Xb+!f}` z(^nIa9h2!>@mtY)Pc5$RH~O{YT{apIH!H3A1Y; zmizY;8RVyXZrO6*LZu#;yO-^!U|B1emR#L}!5xu@iJbCZIjCsQzTeh%& zq*B*~B?(y?PexM9YGZUhc2=PTO`HufSSsLF{XLkstiB=G&qg#tO}D$X1t&o`f>r&q zwum?n17q97zdwo*-a@L-O>W{BCNRRGHp0!{#LrNv$5rjiChmo;CbMCWW?nR=s=Q$T zfrD|~$F@qQ(1TItrAqFl&!&rt$Y;430fDeL@F`dOQK}!#P=6#?77q-$GZ@>l9-O5K zP=upJ^Hs+&IpgJBEe=01;rb()j-QeUev{Mj_(4p^z>!-9#vpmgh|ehZ;>8{Z$zN%cSj850`AtIi=U+LwtN;{DD%q+qzx(lf z9J%WFNif(;G-%s11SmTiTX;AV+PkO|0y3uD_@$Gw+}fxEnbid&dcZ;m2gcs{ds93; zpW@Z>}2CVpamm--W_iI7YU&x%{~3xeY%RtGV~d?kwXw`|_>g zwBwKz+;{-rtX8GVYbO`z8h1QKaN6*7U`={9nAN zW51Tkxk~HZnfcBErnUnBraj9x7nt6n_{M-KL(q(}hMK;j`%u^9XPSlhsB`BC=szOI zAorue?tcK}Z5I@2M{QPb_f>Bf?zXwT-EXsd>-d1i2`i)>!I_Su0PlyPq}zWrt;$FB zyFfHfdlvM|Ic4uo3Br92$AThH$WcG0RFhS(L6=ymic3c)>>kn?9hwdNLrfmk%^{*X^`qFARt|Yfs&c1V)b_^HJ z)*e+GuLt2QEY(S5qFmLf?IMkr@@5D(sS>XiLmM!h@<&KiXsto7DqM70VW^zFgB`Jk zjl9z*GnxOb9+2RL;EV(1PH*xgwpDBeG~XD?H~sfuCB<7UdO|cHM-?C?PI`2%pF-qI zC=?ppcxo0LTG> z(lpR-!*&pWrixsKCRl#wIyB!Hh=s>j^h47q%IA$)G9t z3KY!P8f*!77aS8mZaTiD9LxQPkzu9bnd1o;`Kf(Ptu=R_-Dt)Cggf&10BQIeukj!M zOMYJass5fb9NJpiK8P3WGdY}0A&EpJQB&MykKsv%QqaFHPnBF#Mr7(oqx0I%e}kR~ z2g0}*dTT=>69z%6iJbwo-j>;;E>k4+$ZBW5_IK)aYmGBe7YPyvC zN7n7MebwxTvCrgq96vZ!a#JKCi`<@*3h{bc5s3{#|=|$PnCSBHpE5rrEQp0QLqJ(Sj|k)=(!?_Rr*yPDkdf}R7~Qr zP%*Kdyg0FfKSzc6Q)|SN+9%GcUS2bAEB5^YbxC#&W|4@S^<>pRrVKS%R41QnR{o-B zjFdI;i}2i^FQSb#ol4|Up#P=qJ4l|7Bn}#e^T90tB{G9WE6I5A7qy!h`jNGt-%j$0 zK2|8T%)bU-uG;vi!xkWM)J?CA-!)7SEbV@It*mG5{TIvEFOqt;j)3<|*2_KNV@18! z`KgjUYTypqB8`tYM{{+zR5p#(sge+{;Cm+zo7d;_gL;Loz(*x@5ZNru*%u8dSp6cn zj42ESugmWAAYe&G-WHeq>Y|u}^y~@Oxz`g!yvSUnE`-yRo zi?p^G0BoJ)qC{FJl^Rw`O)14wK!|D46B=7C=aDG5VCyMtPFaxz6RLom|5U4!^T!2p zepRG#ndJQAR5)>8S%VcL`Wm?MYron60=8tdj|x2e6AlqZwrqD__%rOrpEXkSKx>D> zBl#PO1;34qz3+Rs_s&bot&7)2xBM?K6elg=-`7T2c+tKSe}dIr;2$-pS9Yljam^#? zNU*|dbo2_TdBg#hMn--}ynK#*E|PktZm^g5wRLu4xkQyW+dmKt19$U4;VD1%2Mj0n zKthm!QbCqjM_Q|b$*r=<1xfke;9>=-JKE8|8FtCl0OaTkk^k3A!is%uYJO?^75SRc z8hVv4g&HkCB?`l6{Ge5qmE=&X!U~>BI--mX4N18i95~|;aNsn$(AB7STG~E`q_$uW zkl@m7g#mDnl%87nMT4a5KEWZd z9LK^W1EWo4VXpee94mlf2Y@&&kn9TVSqmTW$Wi@#$fyOkf|X#BvOYZfEGG3SZs*Ifj+Z z=4lVl6sn!&+zw=&P*ATJvQk*k+xeX;8C^~Hq_GJ#|B44miyfp=Zgo00I|@&tF%!2k zhY>xrgi$a)0!vJM5Pz?9!|G{RByz28)V+tW)=_dp1g${o?@IAqoD?Y9OaGw?n5_Qp z_aFJK&Q;~r;mOo-1g2BEh>n73Nd2`C1ag{Tnv<;)X-rc$%jW!qDo{!-nEnVvWjm5A zRZ^T@2T9SkHw&iSRLQTt;(A8$&~mgz6Qe$Uo(0hd>#vc(wA%k1M$!uerU)Teu@k{$ z%ZeY~pGwhKJ^!CmsKqL_P$_Y5nkidT8-1!|ze&VPeYL-KabbObCHGR@_PsQBq9fFe zFj--tB-IV7ea)7L#DlSpw=bZ{`D7GXV@Oq&pX+@0R6FzsE%dfu2+MquxCCVz)_&fDYo#jernTkMd z36r)65Z3Y_u+dNC+GLXo#h#D%N59Z3M$T;DFL{MFOxz`}^Ws+rDfBFkRutVaQJ_T@ z+1QOx)Be_AhUEw~?W6~}YzG22#ghYh-hrj;3wB8BBlopR8J03Gm`hK;SW3^hN&T56 zmJ(*rv6Qnl+#Htj13U%-mh$&$xLqcQgb84k8W=O-ipEvWW4})^t`b#AR81aP#)}im zX7l1CVS}T^RZbUI*%yKYQ#nOU<&*_9lJ_?n#iu*)$kPN7I$9fhPunjuPfe>72dQZn zjaSFn$}pfx4=Bb-TqiJ1{MGRYk0ff9n=dC($5LN3;!D@ex zz1gDdNi;MZ+e^@J>@1_MVZ1*Ij&RyIL!IC=RBT`P<`3Js7yDzK_(KeL0eg7nZ^a(!9zoTM!NNtEI`N16 zV0JjknIFuK2f}*Oe{GF%h-0jO{wTX-!KI`8?1=+_a6vt$&@?12nz*&>hX5p5k!W_1 zlI!q}h7r*e_b{6~J_WBMwS1KjjMu@xnlyODk;+zb$+t#0)`{3afl4(N>7i>4jtlsv zc{)f_nV9hP0nm$eA8#O>VOfs9#V$DQ%<&S!-k__oBf`*%9}XBzZ~f)X4LroW?~|mj zSntRGrH~6+>zFU*E6Y$0qgtAw1Rm%vbrO`NouQw2sb*Ctzly+ZwmVG{MN7Qlb{^ls z|9!}gm2d#7+i?BNWDD0^e{yX|vhg8_@`7e9R`ySoqVBGu$RgXkDW%u(4$X(_&exY= z{#Z|ZsNT>*&h(2eDFTPzXxW$_@>LDuvVcXw%PJZlbrn0MI`wkHSG$Lr6tyYMW;GRi zvld&iGKHBsvo-gzkF9XIT+dmoky9?3-8G6-9`@ z9DQ`sI8&&gnze732x_X6FBmW*DdY=VRmUz*Qn5PrKOgFH<*zh^pIMCVR(veQ2O&~YV)qJ828m&)Y%q*M{g&9Wtd3hEXb z3RF<1AD5$o3NsiM7C^|dB7!5)#8apvRwUfM7bjcp#hsi4Id6?$vBKnbTsrUzuYg6; z{K9b6&8nb|=T!#O#V?E#ovqRzPlz81@A!q8?1yj;zwpqp8GhjcwV_E7fEm9)4u&+d zAfCW63t=$}w0ER9297G>MQ3I~7=Vf$83sWiYie4kP}B387EMBkj|H4wRsr=YZ=C|F zxP5!kkF@^jh-A{yIOq zJ}+?+M)yji;y`I+`tc6>qR_V8>5Gp2r5FORZIH-qQ~IK3R~t7l!aC>=vrCp60De07 zi;OeGMM8ZqzO(WoMk~JxH4O!AnY*ZC5lY1($Q%GC;3U&Dg8;+ec!O|`{!65$3Z{~9 z$emrMAv3d4`+fg2<}?{lfNNFzO#=_7sDE!CM<@_#KE~=yN2Rv9|#NcWNR( znNhVyp(VkK6xuBgnJO6n zKDa^T3f0kpJTUF+sgffA(e~{)AN`=ACLiqg9($kEQ+9Cjp^2ei1d8dQ@IU?+p8=`y z$wL=t9q^1_Qg?c7{MMnOmQqz8Xe$>@EGTR*6}OkOz8o_FQ~r$f)t9FA)f_N{yznE! zN!r__Pr>Wsk)aK=MR)0yOx7qXQYEt}A+#|x5F2nXFtznjT$5--Qlau-p2~xHDtGgw zRU8)@e7F}HJdNui<*{C|X?>!xGhv6%WI;`MID{z^M-w|F%vrUj03XkE1=RiBx)JRE zv;n?;P&+xHG|NIi5=qdiKS+FwGspjYml0s%J>|6+G)|5%*SMqd<60fiEqX#*C!Sk(PNB>mx&E=qquJS~s2y$0>0?tAj)c|Ky7{J;->HuGz zwPG}~NL7W9kFLzA;EIpjl!ms+D z?pSNAi(X88HQ%tzIw}7Oj-m%NkCFfNFNzF^Vxav1g5$Hmp=d~-;IEm)O>CxJ; zm1BYYoNbMUzzUn&4V;lS5USQx$pXFPBc^>zA72{95+r6%*X!+iYgq$VC@@|DXnJqv zMm-bDABi7TAvm8Yi@-epn3n|@WZgB}j38mQ>;~{L-}Dhd3)c^^H4HWVfH|p-^-app zN0tIJ2317jsB17OhnkF85V78e0-7-hGg*FXHRxKt0O7_@VIM#a^oJI1I~sJJS78-9EL6 z3kut}&iGes+`jzO2uH8!1N3_D2KvNCr!!*mS%N!xFKWGaK&=VyG-@qlb5bPRS(58K z4Gv@gGcF+-J9Ea*t$zFVJ#79|RAy!-K=WK2IKWL+7np&RKOB}l659*4DJsGo6AZB7 zr6xhgWMJ0z%iZK_2WgXwLY2$nR!!P9$k?>4#Mo!&9)(QuQfhX1LMK&aZ<6A)pGFDO z>IHMZz&~cK5oNa!{jn88l$n1=l-W9buy*8Xi1M7pMvv3_ycyX0Y1z@^aGD+$`ai$M z(PJJ-uy;DWQt9+;s6_Db@J+w?Uq+74AoCsL_?}%l;2*J`mU$nsJkGf+;KPJF$2K*S zi4C}7<>zX8SEvVmRC5NRE;e!YCT>J`$JNG9M|gE?wf2SpQf|*}y0R~D?7Poy{EHi% z^}~n=+s7-lB9GX1((dtatyJdzcWe(`?Vi(>+pS4)m$4PbA#+RsrVxc$*2exFiM_6A zS2O(Wte{Dh_j{IvG`AJ|B|`1~*ou@DqT&Df^H zPr~q%k_$Qf^rl=&)HL`h)HqM2G!)vk(Rx`Nb=t@@jw%f`FAH##mz=IDMza*VXeN>; zYGbDtCoi=kfy@G9SFTlfK<#qFatA#8r>ZZsAccn0N5IHSRtnftIuX&ZrxOeq8aeB4Dm82@vtSHT-Bo{M|1V}y1b`Ov`j01S^R832O)PFnNA$0>Z z?bX>@-?{oTPct?vt+!dArOVOV^uhxyu=6~oHkjt7FSPp{k+2 zgfm*?$PH<37K8@Rst6698BS+~jUUS5c(ayQ%?pgHtyK%C?v8)e(w3us;8Gz4kz4C% zti3k&etN~52Z;kSA!KhSgq#I-e76n{2!xQM@|=UPlRK(+aaeGTKdeLyw+S)54cvfr zV|mK?VG>A~AIM*(!A7w)uh@(u>*+)eV$3m)j2b3fVobd7-OhIF@7~v;NWc#cBx&i9 z1dH65#PYFU(hOq!kys~_1ePOACIxu@GsD#&FQoct4J4NZ{_yr3F=iEcKhk1MG=H_B z{o0YA6ALDM`D|8x8CH-Zzc4=e$E^0xxXNKm9w1l;*i!4kROHApOoazwNcsPG#n9%y z)-!)kyJYBJ2mC1zaQ=g)_%7$xFhPa=z|t5v36^^azMLw#rp(lnP1C?6Qht}`aB}3+ z83q@(7awOLa!eVWxVYo{!NvU!<;RwAaYs{WlU$rb9bzpoeH#YdTo1wfz(9d|b_M2ds9ErT7>({$}&?gKk%J_7DV>R23)prpXTK*#p2AY4z*@hVe4y+(!U*A>VPD z@+~pv?nq~YZN5rvXq!L9?vwckoZCQiX(z#Xhzib05an!VbMEFj2?Bc=C&AKC)4yol z@V9tn^;$|8{tvta-{!Sb(uUj1I_XQ&`r6;V)U&?!mo%I(C2m0DK zd9@k(+Nrtv+I`ttIsSsB?IQ!@Nr2?h{4))KHTM#I8%A!me?l=REUmTe)?u*Nh+H=g zgE?sH{2hd43>SUjpJ6xtdHF(GHu-2?ElGX)hOWw2W_ANA+sh0P%+IgFAM_S@>t{Ui zx7o$vtxhW2bKW<+BffB{1P&q{6CybHw-I|EU3BEf7hMW zV2()FPsIc3f7?zDEf|&kZ-{hFz~H7ux}BwD82E4W&nakY7wMuq>FxtfIf$p(bh4m< zZlybw>L}gi_-|z7yPvKUKlfqx^4-yI2oZcY`R;>K;RBJa?&Z6uc>jMa-<_^5fEH4I z&4BLZJK$uYIHj}P#{F3n8#lrQr) zF2i-uKX#DkF2$hJojljNXtU(Gs^@HP-!Rn1^b@<}@FUJ13);X6dosLDMww)ux}r2v zCPm|8R+%#C444p@mn;in`Wl!}gun^6Z3{1Q^RqqhA}cox&+~U^-!fk0DJpH67m<^$ zJQG=)OuWK5&SIRA*c7jDEc69o&BZI6X)>BZX98~Iz=Iq&a;$Jon8h~PEXP><2-C{d?Aw}-yZD*qnvHF6p(cf!8bT`NYh7%|@}x)yFYJ`I zAEfz_Ay4r&kEH#_X7Fk=_>nD$Ul3Y|XN<^ehNRh%XJMo>>_}H5 zGVp_knW>jL*^saOdN>#;hb4Juuy%34lDuL!{+sKCrZn&3NUmqPgWmx|vhsq!p-g}P zYaR9%u7V-?DFyw;Qnkm6jyB|fq4oo9Ifmq#&o{=9lm<3r0crVd0DMG%BfAISNR$8F!6$q49q~Ug18fm8m%5UKx z+^x%xF~U9i2>)HIkfwfsCe6f52oOwW+KIN4kFfm8(>}sOQF%<3W-xF@-H);Kg{2*nQQ_gGhS9gN{`mv#lEvs<{R96y z{AkGl(0(zW?uhm~>Bc7h8hOUMCmbuu(qz=({vB_XqyodcSB{&AvuJH_oA9SMq z$E37N0@^>#Zu}$O&qV`W;~6HM2JLSKWHXrH6C^|z&#P`kSa`@M^$T=<4 zw1Um$#TCc2M7|Z@#tTvwvm7tTt7*|$%r2DoNsnHTy&(u0FGzFXg-r;&AWLW~*JQS) zms-p*nH8)1fywMVy+rZxUo)8Dkrc@K-F5PU zRH=@3vQqfRjQ`_(?DdV=$M#<;MDX40V^4kKZPGq=C+~$6{xAI>)di3P{*Rw14fmG% zKfWitkg=UrTdo{`+S_T(hO{fF}B;o}{4{l)(=w)RKxwJVXwKdc@rcj~+4&~G1d#$gPXId3cs$CjM zvMSd==O-NUm6zvF__HDnmgczoC~}!Immj7{N{v1H9aI{BU8z{7Rm&S2cu1J$DldL- zvEGlrmv(jNyiR%g2Hi+H70zi?3$h!MmBq^pfSR&T)1d}r zQw>5#e4}}ghME;S zCf6jKQA=Jlr7EYQq`y2+Uw))_=P%zux!}vg+?THpY7R**AxeQSOFx@FFGkpp??2z| z_iuFg(Gq@ssa%hLsB&=@D?mgRK|Me-MRJZdX5%5LDiq#^8wb<3I*K#xdOeD5NRSKho?M+~}%?nqDn%!Laf=b(60X|4Ocr z-J;9<&(!=AlCiy{HJ2!^0grT=8>{hS~X(sW6P>j&kI+eVI3mv0p+)% ze0iw($Lbw(bGLdIcW6a(w1oTgu1#M1l|t?d{!vVvi^73qr^tfQ@`|D{R)#d zAcVWwW2HPul|1tw;7Ov5tX0Mt&BuT zD64fw?Ft42!v@f)mm@JBAT9)mw_<4o41{fg&&*M|WZ63qwb-Ct|$em#F-)v*@gDq5dvI{_)1??jm>O-U+Op zako~&LF`G68@505U&fy$CKR1#xwU7;(z&(2__sJ62*R2l+ME3| zZ~n!bbY?I?xPR6sDk`B(L2U2)7ah}^m00J$bBCVW=_kBQD$9vUc5Wm2_x+P>xEEz) zy^=<5dk43({a1dE=(kACf4wefUV(DNzONQ_-HvaViK$ib%`DO^NY7l@$px(SI)AQx zx_wOWy*9OTBwV7_McdRrfRF2@K{r48vw~^Y`TJU}ppKx?4^u~PO6`sRL+eVebca2& z1OIm=?K%JLahd$DpR)e}B7JI0^S^%KNmVib7ZZKh}g#52Uc|7cr|5b&dU=3P~L^}WLZ9-3v zi7W*9Uq93X!&BscwHtrdOHTE*(fqH6qx!mvCIb9d?tk%T@Sk*K{@0(T@n6UMuV^DP zOI--Z*}Y$QY2b#HMOq#8U$_T!)rZH9;i)L|=Geb}tM2(nTQB_?cFBIMqy3BguQo=! zX?unD*hJbdUyijJ95`An@eBh+tNMA<2 z53%H(;{*HNEkyL);sby2L4c2jHt+=)Bed0uFM(^llvlz>>BJsA#|I8$z{yek$yIme zfp$8?2hP^C1nSPlj~r>4sgG|-eBj$SSOlcy*J?wg$jSYS;mpW*x=bZX5hz*oI(clneRlpto zCyLVW5>s9&OURvn0GD1%G5_w594_q?8(4I&;ZhgI`Uo*w8;K1J@*(BK2d19M!JlaE zTzp{UaECv6AhhA4so5+Wiw}J8SB68kw%++$*(GCt&fzaPCetH5Z0sOhtEM3Nf}5hq z5<0Mrw1~=(U5tJ@K9zijPmu5M3Cnjl0TAVxG>2@>uNptvv zY|g`dSHemzd{~;pjpsbv!*U*eZ7Gk*QTYJVp68cSGte+bV_%UHQG#u8Hd%>N9;TBY zT8>RPL0I{Z{RuntV<+QFFDbb+uYN}x18%<@y(D!@F%9=ABW$*?{Y2;Mqr(U`GkM|_jAP@GzB$kumu0oaX7vrbEH%>XxLoBG$dsDTV*h(< z$b*G`1Va4P{&nYDI&lec(%(ogGZP)#1|S(78#y)lNfRe?ls1F}urR+ZN4Dy?RO9zq z0i_sk{OSNAB0zhRw<8JE^)PxW6lB%@9qoFt*V|7PRUur7Of#IJbSe2{M&)LjVMVf; zW`>xWrq8<$#@6|7zsfYYd@+JAQanSGEM-g;fz4ADNQ0aH-iq`B407f4+n*7jF{8Q3 zVup~u(E(ac9!A(wz~vAItb{SWf^;#nej#9U_Rk!A;?Co=W z%hG}ieCMW0cJ`e}x-U~BcaVx~v=1P(FxgVy4+rTP z>OAwNx&%0JTvwzp%XQ7)H#;xD@Z4-hhL->hiDrr;7PB?CeTd^3O0b)u|6^N;XOPjx z9Xo}6;C)LIbC_N++w*L;V`gkq)B;X@spZ+$mgfjd5yPK4PMsTb zjRS`Y(O_W9Qop1VZv4lx#FW=>lU=R|IkbzD=P*BFERC9kr88SX(^6y3)K&wN1PLPK z8et6J_BNyQp*%_$z@Xmcjaf<0CSSAVciY+JfBw1ny$?f8ODO=qM}87Jcw}eghuQXb z;`c7zd4cl7oJKx~ov*YHd{j5FHt~aw`5=~AK8W2T@rCJpZVR!;pd`Dajji>jg)?VG z4&>3D8)(a@Mq!XD=2A+E|Jyl86>|*qL+6p4z%@Bd#KgFrs@!C&dxFq2>DY#}LvuAB zE*m6(6J&@Pu0EKBwD;dd^2#$X09G02rfhR(=;#eqjwtf;^sWnk~M`!^Vb=&3KGF&^7rKC zXPfv$SN>(4AB*JhFF*#n2cH7*FVa~voGLVJYy4ikhrl&Z3w2a?r~wf9?UjbUN|qaw?^9%f=Cl_TqQRXRy9^j>fA( zKq`$_PCkPx-1xURpTX&GWi?)%@)>*xfC|Zs)8{k*PvYB5{h1{xg>)m`r>8%Z&IV#h zAMY>6OMd=4a@RHZqj6lTZ#_1?S}CGtAgBj{2{3K7$aiHbejQ?eiJ@@im8bR{K|rx89@zY;*D%{O%vx z#DUi82D|ZZS>m)-Ogwt2?(!Kd#wge^pTWU5BWqbcgUObnj*1<_2X8_vnbBL#giv;` zw+cJGRXW}zozLK!$GYMx@~ccvD*c+r(?48B z{6D{yfA*ByYxw=D)(#++6=J@N_VF}IsvWtsIa*71|EmH%RD=f>DQDux5_?!tIz;ECm6V| zOJ*mlq+y78Di}YP40e~ml#r{ciU&q*6?bcyXVd`2;KL@HCy976tCXNw%qq+yHHqm$>}1XwfP)0ONJGdm3^X+uM%5QsZP0x35(2!@jcl`Dc}Q$DfLct7HDzV3`*9 zXM>_MYc`BCOt|SW|70qTC=Cf;>)KM3w${VkK~c=st6O9=!}$iNC20X*mDN4wbnB@RJ{JkE$onp52&wte}Kd?)dUFfL4Yy8j)lJ9yQlka+!FNYdy0eFvmDPDZ2Zyr7~ zZ3k>fyN`j2!{|^hegPrpf-8Fva(?$9Le3|*ZJChs8!B}ba=h$8WnO9-o+DD0WPJ1H zn?^+fM5%T?TuARrzXH9f zx3tW=<|@lLvuub1VI_)4YR3GsN|e)?C|Y{IQuwq_qusq31tq0+&`7Tql|a+d#_$Jo%Q$!Fz- znvOz2Cm5ftg&=LTb39g-QiLdE`hbh19{gr-D8cBxovCy--Bu>zSz2;6O-g8_#o!dV zi!PC(iPaT<5G1RFiF;mUjajl2<#Y^1B=#>(3qy0yxpz%UB;K7SPHNel9I0Mxud-0n ziP|fWm15J#-Axgvk^3v29a%f*F)F2g@-6GH~jmzx(f^PI(4?fH8*o3}| z9tHZYYbd!%eb?U@US9itUVJa|LNAmNg`tL;KjLXpP;08o!Gd-d-9dU@RDGp3DR6A$ zxW1OHs>z>CX-W|yB0hV8)RqlAk-SdoQt<=MBU9^?tG0A7OZ*gnELGCI8DpE6Q$>OIa(DW8vJ?UxFK z_z~#xj;VkIo~0KZba@Te<>>PE`(rnh&Qy9(x;4t}9M~gs&Rh5aX7qsGrSmbY^B)4} zy|~NAz`%^zWn501$GDs}Z_H)Z?ZoqTx!f+D_*v(_5smL39e+Og{dBUZ$8xu6tt^h& zxk^S7QxKc_@(5Zt9d}ri?Br&w=G)F=m^bC2`%CeYUA-2@P#Y>$a_e&eYMoc8X6Y^v zQ>b_PQOuR6ZMNooV77js`7RhJwKu;3r-BQw6}(D3--TM8g}F-FCj-~epQ)f z7J&Ku`b|SfXBajZN{n3&zKSNCyT5@kz4Sj>B_$7eq?zdx1ckSJ&T*A5@kqsnL_T+t|wq6{2VxmAuw|s*A01J(pZGnDdz; z>NdSrx4%BMO2tD>1T~dk78bJ&3!oU~NgVBai76j?m217wq~%`a^P$Uj zr(CFME9N_z7_gm}7|^daacq7hwj?rgZKQDtUWP9kKCW)4d@OX$%Z#Qr_K!&F@tV=E zMJk`H4*hItZT{1>mCx6|k$kkn(CY_k*qx+9SWnK!QK)ajsvYW#nedilcA=IzENlC zO!6%K%Ay(DJlYh(@6Tev)dm!P|Ig2Q>P@%!{m#qPn_z{lL#tliH80ubI^s43xwMae zLXeJ)uj^!ony--p@_PP6@?VU`o+rWyF`#ZYukzFRgBuRo?lCX+3Fi}Ex=qs9S>3Fy z>zCw&HF9cr`K{hayyG<=u%3nzG_+4IcM9Keh5$53kEdlF25H-SlSC{)0Lz-)AZ;7i zAV2%NFk0O(%`x&8O3|XPnP(_OI4{(^ju4>adc^_h-~s`U@!SFq|3ZW~V+avb>o0b6 z0WQw%kj!QiW@CX1_6&wGi{HP#c9Sc_ns%aVV+VHW_jv1fsClx?vO(X$QP%IezNwOX zA7`BuA#*$^=5Uf_xS`$?;Dh!>0f?6w`2W3(P#Uj z?ap?vgSA%bpTCG>*?ZfqqXqt{nI~YUW4M8@^g|0&e`ETOMISx@Gzyu94Vm9proa>9 z1L05BYrlbU+_P!ui+e@m=fRC;(#l3EUkNq-d5DTtWzXlmdYcaCX`QeHdHa|PByT^F z^;Huv7S@dY8i+l2Q%d53qHA4;# z5>aP=+Xcf%+#ZX-=nk}8=1HWyRbKy4YQ^dfl_ z)hs;Q1(c};4PXDfc)oG*xoYQtMr)slTn{krG#I)lsYd$M3sfI~`fZDUY)WB%}o7c8pFX^rDhTBJp`p zoJY#4G;gsBsxZCD2It8Jr$a@K;c$@|T&EV>*~jC6)(VQk4vpbr2N*k3=(S}Y50WSG z$I$7=>_%Y?;p39QYW&SKA3Wb)xtUkI?DaOBTgz_dD%0TuYJMxrNy=}+=Fn}Y*5AOct1^Ab*x_ihHs!1@`oLk26Hv~dUjbK=r3^fY#@ZBcDW0gC=XMjN(OQ1R7eH|v&HswKfg zH914-&H<_^mq+$X19c}(^*kHt?37`V#%~I$jbhY>CVlQbaFqL3p!4u_to@e* z^YW%8`h2cQ@Df9-Y)2M?$dJMpy{S!#dcEpz`hhPZJLVHeb#eo>I{DAx%9o5t2p-m? zwkUtCi$Y-f7uyqc@_WoOy3j@yh@S_035hv}#vF+#?Jyv)R7SUOHx(j{UuTE%@2*4H zvFlLk&SV%5;r?aAxbTtmFzSy9WwSnPTAqx#z(5t9-o7l1XqnBvl}O^;nXD(|yHLYGb+ zW#8a{jAfkqy0n)BIW-i`U#mstNF_TrP1;#)^Wtgoy0xffnfS5VUm^znug~a{SDTmv zE6klk<N{Gm2gIvHLx;3+++7Ct2s5Y(UAG*tdylttVVf$i<$btFL^tU(sx)2W+@d(BmUgDX zfAVr+i9jdd0q||q4mG_lDb=Qv+Xk-^1*cH1=BbH8j8e&C=#v^Z4+GRPfzFG`Knal5 zhB3ts1Vr~ssh+%&`QPZW!u@Gl0HI>8{O7`}+Zn>G?p3g2T8uf1y+ohmkx-WjDkd*u z$?mgykS}d}xY}yMFP0I0vCOMn8fv^vZF4+qG=9)3Lqw++bworU>?|8wR}L0GyAu|F z=q9jG!BxUS6kguYKtE8#IEE%#V&-Tm1+x0EtO$`11zP6Aevni{$^yU`?|Xy6j3;pBdYc^Ev?~oaMeQ znBTYh5kb@DKvJU5>-q{UREahVF?uYnuPY1I#?^rrl;2BSZ3X-@n;a1;Wdaa(Lrwd2 z3s}~{rcnZ{*Nw-%%N>@@{tzJOJJ0Jo+zTpnza+RffJp;cz-~KGs|)L!;}Ey&wiP2@ z1^G{vo8C*hYb;%g86ZHVS2V^efUPP@7y-MGm*RT7)JnDHH9n3<_KNzyh>Kdmm)eP( z>PDH^pFx;o_^mG2M=Z$o!F4?o`Y0?k9iFiEKyf$=AINez|4Z-Eu-gNL{?#wo8%b#( zg8k4lhx1FSq)VrFPj@>bhr@{@F9-x$-rv=0*)Y-D_!JXI_Y8ZSqMZuhQnNp-VzKl19bnRacmlavi*>kEbh^7x?^D|DsBVy=zr zPYE^sdrc}e#|xdiM5CT(Z;>EFe58t-5T~kJqvbaSA2~sCkFD3-G^;()%dC(TNN72Bn@V=Xud*|FgP+>-?g%_>UncQuYgXWs07Wxe;>>B z43y44oR!3FfL2dHwiY4Nrb0U2X@GcAHisU1fGQ6kaUDTYtMK=HSnw4rCgmUrHwIG0 zUG~l7sn%I6)5*)#o%;*gUd9YoOiQVfo7gnQ=AUP53+kDI=N3sE$JQ~aPR1Pg zy~L=?8*1{B7FL4hvP$76UeYb>*$4ueXHtkwm5<-(TKI&*_90mnPNcCFdvkaGiqrmt zji^mn408Z+v}n%`;E@=i;v|M_^?XFO=kNSE==qa2YwGz92aHYke6%`EQ&QGVVEp1x zs-&txS%+$JS3Sx-&n?unoqLojdHj#4?20sJnej+PT$~(AA2jzur~a+KV%pQVHPjT> zJ67TP%w(|&H|vJ2bUW9i{KvKIs9$Z7GV`~L7y3YlRo}gTcdM>1OFpmg$KrRQ@7a^| zs@uo;-pv%#2~bCNZ1aJl&TTTIe}5?h3qQUmm{IXBrkg9+e%H*5j-k;GuyAI5O$HSG zznq6R0(fgZrIf&_uEu$M9*nnVkbNdqw~I}AaM)+Mblr|TO_fCd!0JOF$Ux&-@pt`= z9C0kijBOXZ_HYb8iP*Js;mANNOnGbGY(9utNSeSLvk(LO>cz~!9=JOg*b=RhbdUv~ z+FTfrkLofF`N#cXLn>KM%l^Ed zq2E1A-@q`0g3M8P|H&Vt{y$O$W~jilpg^_pmj3_h?f!aZ#-?QQ`g$RKj(9 zi0Tf~gChMh`xR4Vyos1p|8Uj#h`|Ip;zM*VekQozSNG3y?~l_bm+IHv`X#;`!dSP5 zrQUhCI-Qi~6b8nJ`>Txk*e|}856czF|6(!E7U|c;JZt|E)yKN(7iX&PO7-^Hma0O! z!h1<-(|%ay_Ey~iFX)M{O zKQHsgoTk`Y{=aeFPA+#(g48~&@5lZ@)DbiZaLGTx{BkQ&D1Uy8S>*WvIj{4ZPEq%4 z%!c(O_bl0w>9#^SVylvmddKn;=aBXYAn;8?1Nj?J zYx5E_eutXtt$hq*$&pmabxT74MSLM_8@je0j{jvfDb)?97rWlq#up-hl9UyXN;3fe zg^v-hZX~*W$B@q3$#~8##lTmqd_apSG%ex$)1vw9L0IN6PCxc9#VVhThaxO6kGWkWe#v@CE*~3t@lz!`{9gP*hkQV3f9BNhdhlnC#&M5IJED=f zL~*;x9r*J%{?F6#+;AU@?$iuhwqfUwR;d|*LP@RLM=x_AMA%*#vKCC8``7~BCRmXsH4z~>sv3>A1CYS|Z?f?7+aT|a$X{YQ*m>=e+ zR$;EOdPk3z5Q0kd7kG6&Bw3p^ha`J!5E^^mztg4gx%VnOi*V((Bt`9)1V8A9%KWYf z6XTg+jE>Pu0PM0W@`0;^MDY+l*LW?f`$Y52DqCDT@c`@A1|!rziuSQf5k3c{M8J4<-a=}E*ud{ zzRekPqj_cjUTn6VV!4-ZlJ=i?fQ=|OLk0i}`WYah=_LJDnTU?`p)- z!xwCst8XtVrHzugF{pc`U3~-hY~{~YcZ3?U_PozE>+l`U`Aus8S9Q!`&R08QbuYB% zWLXobz31c+#*>$W{-6k;KM1o^)q;lcQ;^4kgdFWb;V`S!ehGd!aPq3PfH$yqVZ6x# z`Q>$Xy2&r+g6}POzu-qm0g)J<;51dZ4^3sb*225<83)<}zDsKdf!7osHBNF&m956> z>J}M%j^dLG3n^2oGD_)l*DXi|{p}9lQ+0DLO&iYj><9SDvy#1TcW48L4KohQJs{Mi zh=b6T|DXW|aPkVtHK3TC)%{p2BdA|sP65fkQ$pJb_E8RDnhtB8K8LNh#i6EO>BGD( zw2?&<6W%xQv_DWS*u2|=W}6k z^b*piByUjD)`L*f6WIn^ymkNZLf#5PJ@j;_dYXKXKaBArys?5s8b_nHNN>@OTcqEP z%~>SbuNcMlj3T>M$#-2l`_WGIBgNbVt$lE-wWgJ0E`DvJ9=PjMO-{ldRR9)ap1%J*=+qRjMTto6bJX=0b|bz7OWQh%TKKZm*;RR^Na6rvOK* zi*GQTE|=qI>@>>Eu{*_lsBFSOIU%d&=e7N7%ggeU4 zInN){^MUq2Sp9BpT>=|2wvfPP4N&Jl%vaiv$=?4j_v%J*4mZy9dGv8MeO$m8-}Jx0 z#Vl}Tu}02UBjqOAfhqiB`onNK_Y%d;dAjZI?{aHUNxNjOe;&e=+Pc%)>XzRWhixY& z{D4h!0AwIlGT_(RvD%-NIGZGhvqX89Yje~7z~D*{y*y81U`zQ`5R9{0^x`o zgg{WD0fQt;IFv|`!z>1vg+#(7;ZhWgoQjY@5Rk+KVO>_DqT-FWh$t$zhza*0DjwrBU_8Tp{4vr7!YhW|BAoZY)(cUnr(q;F+KM=>w#*iXFV9_Rl>Y!&HIImkku>b zc@I7A;*A}x^GOB`$#lKjni@_5qfMrJs+!Mai|KFkv7f(vp6q9GBL_YYeJ#pqQ^)_s z^Bx8f1PpACo-!X?>a@;#5U~%~mLvy2aBCL?jYvrp!RELIT7w3pvx_Nli6AzaFd$jTiI zZF=O)#W3DaEDpOgx-eglzlY6L(Vu%~cypy_HOLmG4;tB0B>yPoOELEoBM1U+Hue+8 zlflYXv_1&lA0etC`{ANso0X;lu*n7K$ZVyy?aJcDT>CQrT+Kh;kE#0!3y-BT%Thqe zg=kR^h+R?#h$|L1X7dV5czZy~V%m}6UMGT;My@clCI{NXFkExIpP*@P8j;@N#4Bk= zjK@cy-$o8Y6ovcEP0npxO~l>gZV7xhAJ<3jrJfa0X_{)S2K8Ct;rdHl(|;Ns9zm5# z=?@fa!!K77!`s+u_U3F_5{wZ}>qMZg!B*HZfHNcNVKU2>wwZ|FcYVhzF>LIJ90btd zA1t(T5Kxdzr!V361pii*gP;c@17yWO2Gzp<`_S^ILGk1tD8OBcWt8wQVjTD_s;q%i z1*iu)4MP}l_67DJv#zuw$ooC*0tHGRjOsAoh!iM1wcp zM)JhSKj51W^Yk!qsw=%|KJ|mhKY-n0O@&bT`O^6ZKFh`Ye3m&sN47G|&mVk7$QPi& zB)w??nh3lwW3BuH*{DGh#!Qo$1+OZlNg9aX@>}r_hlB7Kg;JPQh}0~?-@Mw#R==NS ztKTctR=-=KGtAj5JcIKOjKvt?T@*_G0g-U26X=CVBhl+;%0FPO*rogfJY(jBOJuph zIA8O$DV?5q6qcLwdW}-`iI?BXUxAT+D|!Y_{jGxO3OCUZk_8mev%G*X(-q!J@?tAC zWT^QEATy|&^7UgQSZ0VmdpW;)`3KB=C5Ilg=C|Y;FyuwF-V)w9f(cs?!*?``3taf+ zA9y)~#Y83NZ`1$eAHfkcn)Fgy?uj0Z)TeMozxl7&qJ>zADJSry9*{#&lo{B@C61+m zoFb`0&Nx$G#8%Wd?JrtLH2YT&5z|h*2Jts5vEWu)kw+BJYF#iJ76I17ST}bx!;X3n zTe9@Uy?s{e<|bf%b&s@0cmE6+Qq9L)dW~)qUZcC&Of2~Yo^!ZXM58-{uFl=c9Kw4c zK=F7^E4VI!=8;C0lUP0SWy&o0uDFRfQ9KGM+MdY2?~3?k(S@6GM;S>6vBy?(FHcBC zxhLjPj2coxsVrJ)k&i|eMwV7|p;g`#nx>7w#C16>LO@?-dt&~45)a^ZYAahYEN}!a zaINpX8}8x9@TXw`;Lwd?HyXxq8(ZI0>&JH!7(}-tJx_8 z1e-)}J_p41o-vT=#4!dO`XPC}70=>n><5BklE#~UY`S-DLSNN8aRMH4C5eRov@lce zaR!Tu(LI^kh9wErL02UZjvp$|{>YJaT z2ZHL;{|EVe8Vn4iPrtv}t4|*v@xP`|Z-0pN=`cy3#zUV%8=GnrYqVjR=ryNU zyytOCm(mCjy7d2-`FwurA?Z`!d_Hdugy8;P&gXMoiO{E*Q3T276NwuCAI|49X1=LU zdlr$k|G$^dXX;5`eQM?Nd0{ZCP?3YF&jZ!dr>6ZqA1BvX_P3-@_g4zZ1yu$$8a$s* zpYE(r-+q#RUf~}}pH95Z)Th^SML&HS34w2>V0H`J8V;@dpf{1bgXYA$AiLD{K8PJb z*G^8&=y*E!#tip*l7a97wG|>5Vhm{|<~~8oy+-kL2TSB`%56}-1=ZMJPP6L7oA6pk z(&-GW@>=7ZEB@2Y9C0|ma+Dp5glpYv-{bjEgb&;+=|f2NuR$i}!D$PB|Sxv1qN+t+6mX-5QA883~n0fH&dU8`ikt|Ron<&yL!~Le9 z$jB^`HM-3LI#_L_6Onc75smC5+BRrA8%X4__@8mR&)#i zPvY=%+sgZzr4?MLk%w)%H7fG3b!HPtthvA}NA=w{48Nkz2_eKIumwym?18x|mYN9D z15bzL!M2)?MM-IztCLo=DSoK^j^Umb&(Rh==4MxKd`=r}i>_gd?hR*?mW}DR24D0< zYLxLZZlCcmcG(^>UsPUaE>VPzGt&F?5k^I0(aee12C8mFKi6G<%K%0o)Ec}kZZyJ8Hu=2JB z{txWY{Sg}8fBdBo}q^y0K$q8Iz#;@f@c%K1&m z-{ioHofm8?F;_)|9)TD{G-#0uJc+sYb7F0DTaM(% zchE=v&pwmas8@}qwH-xek(nL0<>55IAGEUH<8zy7t|siFe5#D5P76yTx6uaaMR-qn zZ7@x{gP4oo4@c!xY_>R^dlyOnGOUl8JvE%B0&Q+{Cs5E2UPcOM;Q@5%(^y)-bLD|9 zqeJ_mGQ!T~FqJVnkQp2efYiqJe&ge%*d*Mnd?8-MQ#}g8*_o2%wA`@W!FH&SHv?t) zQ?)bVulqE25$YFcyn}$Kpmp3fDI0Km#?DPosAWL56(`_j7Hm2`(HHiur~uf9-Zfyq zL}Qrv@Htc_*w>>1$u&$!F6t$R5?D`ybKvl%SxH-xTB-cu&Y^i7Al$l zh6K-)-$4Z)7dwElm%ASKC9qapK@4Q+t9Ez!ZdJ_pMV35GX8U~-Jv(k*M^ri2gOy4b)f$3`miiw*+2d<^k@qBpw2r191w zEd=wp+=N>8f{USfL+vXqK88PRF-ip`F-pNV=Jh8;c|I{$_*@uhiY6$qR2q5brBw{ofdcSPBQ- zChuLhABQCp!FRziltQNs?vP&H+L7uD`xg6Owd-psb}dpVfVpdKB>RDnOQ-TB?}-0k z_lojxE?3s0@$?ltah#nK$if2|kj4Y7LXmq~woD77A}ccF@kOLb)0{jwfB<3GbSnlvrt?Y0(H8f2NJwdHT9Fg2evFJb!dhrf4 zTGx@7;aVb^=c1NjLuf{luC1N_Q|e>%Kkdwq86C@Q#kb(YVvc3>adYt{a`bj~P>O$>kXKrfk?%}1^ZO&}j@>cf z@9hOJ4g%ymiz~p3SUzcnEP5F=$#ESw(XE{-I2$&#cEMTrt;ymbI26ANzt9;QtxDIB zU2D6wtaHt&t?(xdn2g0Ur}j0W_&xZKG5g3~TY>^H`=|kF;8$}abSN#^ z+G>y?UvCOy$fSw>1)OHR-QmcmdpO(?x|u*}nMr@sgwkie@FIN(D+KgZKCCJQ88$iIYfH1{wAqCL6J5<-nzg3-ux?3~NohN_9UrolvyVL~~VMigDgW|c{A4(nt){<+MwX^(FMjNfYm9p(y-2u|0aXNI9onC!`&h}v3?JeKIi9M-q=Jw|so}XFmD7P6B!6N- zvUnm{rt8gZ_=VRZa!MWK5LaZc zMWeA|AfjUfvC1vcpm|$rN*ZdBw6PWcjtgV)2MIo`dzqV!fJD(2u{3g2!f06^APp<# z99O|q$xY|A6or5%vYB>vh$|6p z^$MgPFQzBJFo!%bt1!^90*c{LqGA|3un+kiol!($dLl&=@@ZRm0X+pWB+`hVNSn^) z)EueTIVG-U$JGY37DcV`U zzi5lCK20$()vQm`sEu>C`L*ROpJ_^(D@Q(7Go%e}p}5M^ud#aZa*nEn`UBnzOE zXq73kuvb!H3X1hWKj=NC!Fsp_eKor?jTx{K(U7LbXc_>}E$h5Z44M0=8ns#f?m-^? zF(b(CsHlZeUSSi41{Zh1Oo=MS>U-hjBHLnIJ04{wy_NAr!9W-fJdDoMW7^si1i`t* z6SEOaYIi+CfAe^QPY8Rd*VEtT5Y%uB>Dv}3m_u(J4LurjF_yfv##_tWt9ZQ8N^lx) z8SW5l$utMt&lTf|06 zRwASYR7i$HKP_R!9KUxn0Hd9(+~XbFgIf9bUNrRXt+L5a48=cAB$|a$IebQ{mkVz zvWb&U?>JF_^&1UQZ_U*9A!|u4BXV2*RS_b7?vw^oJBO@|Fz%J&p6Q2#!Ab)H3gMx6 zj{dt-T7G|1$lAuJOPh0`T_WMDiQbZ)P@i7Z424KccIrjZ@JL!I8M_u47ee%JK5kCa z$@)-(cp$fHap|(qJmI1}oz^})uaV};$2ZcTpi*2@fQQVIiiXnNd3m@CKBX_i$MsYx zd+*r(g8c@Pz#Ke@6`c~;^vbRw?e@q>HNz24h>?K@+Q?D3g?gN><1wrsAUZmKA~r+& z4(WfcClbXx%DRNA;NJIi&xO?AD`}w?d|?AW3N7BAhm*=-nUgmzFNvF)+uVM-2ikTe zwzxT`MXub6yf~?-WR1578Y;}Wv-qHBW+EAyUYoC^zgBpx0F*%gxNd8Ix(sVp zEAZ#(GOREnX{@~z#I`XKM=?%sm7-diT)^1z%ZKk{bKllx| z=X7(XH|5L0e0ed`xfkE`96lAHId@N8sui6ZIi-zl)rK-XY)q+mPyKP*MkVdAt=a(s zm%rRO#I~wlFFc&l@S>w=!$opB6`iYNDWs~<*boG6k z-}4=+dLA>wi&~+l0CjA0=HOrZnnL{RNZJjTZfCUZia)!CtRa3zoM=7BAEKYn0|ymu zD!?^n0nQyn9orln+~z5dgiQn+=bM*^9^qL;OhFGMfy6xi+0xtG;SKF;r~@;TcH`}L zo`Otqo^ftzw_Sftd9OR>$)gZ7^cB6yBq2NK4^%&)xooZ}IN~&)PG%|k72ch!*uRju zfyBbDbHv}ZwY7jk|IN~x?I4f+jvQO-sQ9Ms*@s^?xdZCQ)TTdeiQnYdHhdeJV;i&w z7rVoAYy!cn-n z0G$T^Lv$C92OfuC&U{(%3W>PL4?^Mcjw3N4$*^q`y)AK;A!9_*rdUb0nB&h&k1TXm zhU@A~ckeU|wfIc;xM+u)LZkJtGWi$;Y+Tw6-63;r4<3e=*?J=?K*2<>t;Ov*r01a=g10v7n8@5N ztYe@L!V~;dOd@rJpNdJk-`hQ=ib4O#vX|%EUVQ@zT$CD?hcL|ac(~o*M8n}6?v(JK z&_33vMVm-?!zl#5LJgyqJLTw)Mh!zdMT4o?7L7z>LcrZk(6|^EC2|D^qobjF^iiv6 zV1l_w^H6k2);w?!8Jed_NFdF#WP;o{Me{WJ$XgUZ^FZH-;A;ST;P@fACw=UJ$2M|L zb-B-K1=$1Cqx$xbs&5ZWzb{Z{%~0B-+5=KN6(&7KP~%K@uQZ3dm!0ep|#t=NtE*&@TwLZY0$*HX@vq?W2aw}a*peof`n%J9A16WeeLLTn`d!hm|NE=jhiUifQmG)QM(jeKR$V_T^UY8zcp zA6+m=|6>hzK{j;(1+bO%dtP~}1(Bx*p7+XAeKgC{H{1;65%fQx{BVTj>4&8T<6lCa z-hih_o~Gd?raXNCgNE*HLL0O6JBVkhl&8M>fJoTZ;T{Z~FeVnHgtcetgXCJNnwVIKf|>DbklCDg*Ts7{dE zA&&+%BO2FF)ozdL{`!k+t8Rd*4;=0u(El{o_RcE${Qxk?t{6xkI6h?|vJfAJVJ_=~ z+3(}K?v(e$tYbg#0U>=L+H*+12j$h&2eD%ViI^s1y!>CKKJb$_)I;&;8H{h*fGp(A zQ`dRrjXQ_Brpu$ya^UiXyQq!HxiBlxppjoOhxOkBqR>>!z8dK|O=b@_n7t;;o3K^P z?EhWfd@!au@@C@=1kBPy-+h3uDthQ&$eU~Km5Hjzo5$Yu76p(up(a*HSfN#e$eSwk z)#8I7Y9o`=eDu{_U~*U%Df6w?TJzT?ORKN1c2W!djEm25yp1!NDSjyH2Wun5UG!$K+Ud4?pO5v7`8|_I^q=Q^GNIsHFStOw& z<&mOTs^j1G76q_WjrpY4K3DxgZ+!(}M*}l>QyfU~z^1x8=DzEdCLMkEf6%1XcYATu zyihW-o_)((6tGEYpyVy(m2V|@^FNxJQ^<=-Xb&-)GUSD~{g%DClz7Bv4zglob!30f zWQ7cem-v$5U&#KJcX`|DV{1O~rne}7?2j<929y2r{L@FC?)VJ!Ve3MnPpoh>1hPkt zAHWkVfyv9M&QI5@WF-+v=7wsIoO%74@eqS(YQ#@JlJ7|gnZ(R7o+A&c{^4TcmjC7|J$HxPT4l`K^SZZ4 z9WxqD*TMDewijTUwE!nG4RAz2Duz;g*B#Lm4{EmbGC`EvFkg3|gSU8&c-aT@g(~ca zf%|06@Ub6WTF$JId8ajEtoiOYuUFrGaNQZG^XDn#Q0BYd`2j3VgRP}*??UgR9%Hd5 zakJ$=n}@=x{AafY@Sl|(sgdFQO-tG#TxdlbDoGD|eP@Hpv6>|e{V#lHEy;I={A83* z%IiNX+Famup6PI&y&l|o<{Iv8MgZrTw+BnS^vGgs76Js7_;(nM{= zfs5n>NY)>w&KgfHmbhJCQvb!Rz%3XZhaysFI4{OcFwlz~JBH9H9MGsVE@|pH5c8z| zm@W+(8wO*8+-YH8u{ZG;W<{7I(O=D4cjP(JG*XCulRQ&jN%MzzNG0%Zh6^iuXluAN zc;EcCtJI4!=h0fft`20)?&EH?63zJJF0x$MC5WIl_?gxM#5!O!8;(uqxB3{IGJ`DP z2l9U6fDC&pjlJC7Kumk-lLp1(y`Bv(!4-W|lv=~jAJ%iYp=m7X?W>ED%o@Q}Gi1`o z3D(HUh2LYq8@{^eUsxH>5Am{-k4mnIV2C+jRPn-*m=e;*+e({Q`nU>taXUGUh;58^ zDe*E5h0qkAcx@+=7o>Oe#fz#hFNO{UTt8(oOlhAYFTncwrt#Z14VJG?9POTlv(oG% zVDlcvpT?{LfWZ9chmbDFNC0yVpfw~>b%u%?ZE2+-)I(Gg<3^e}xkxl_SjKJ#zs@`afX6E3&;@=EH!qU-T9QU_jAcL(s#1!E8kJr}X>+Tt^-*%|5Z^q8#&CSI4HTI+5`Gm#a1P)QIOiA0R#my0;$aBFi5Mp`!i9*irxN3wU4)n# z=^v~z@`-PrwcvAb>6L5I5=1vQ&eP;*$re|qv|4_sb!AUs*< z5%JCaMtrlKZPmH5Kf=a%_&tBrPan5+RC>||+bTM)s}{bFS2fJaaSjN-2;VOvoaaP@ zlY+O1aLyeN?m<%Y@)P(|j&Irn#5e7ijBg^mnU3)0-iofi?OM^f3D-DTz2 z6BAQ>K!i3wM`&|fw){?a%<3IxXtOKldh%+c97+Fs?IAjN)EzYhE=y~nt~GMRN{u2pph3 z8DpXr%Rvt5&3sVbV4+S_P~Wbi-Znr&eeqVHF4}@!E)Y#RqGkt>pWiH9j9L0W_@&KuH2nrXQe>pH?aKS(-_q4Y=}BXdwi( zBpdFQ0WCz$KomN?7!;y4SOIuwA<96ZbzObC>^dJno$zwOL+unm*QkJYXGs*QMSx7> z#7D#~eG{PS2L@F`fU3oy6a!_!Q!HXbo@HUxqrR`O%0;;>VrSoCqMnW`FBzR!?mptJ@?% zbqG+9&j0FlfTAE>05aATpz1Ivg^bTU$z&|X!(ds5&6kW*Q7)5lZWoh`58=v7#=|)D zKo!^AmHHa7UCBcmwZYIQX=eP9%WVZlyPyp?|Q6c003<*#a0SeOj zr(XrAAZAK!0V;|?DV_fu&MScRmGL)EOM2w~LA?p(GU|OWqJ)&)$>x-4 z625qYLhEt8C0f6Nn!!-Nek!4?tCP@S}D9e5Up37L2-%AL?wB%d{Q?1cKIgvSDV@ zdQ3Zo)*gq1I;9HKHxcR}YPOv~o#Kyr!()v4-anZ`22cg2H4PBb4X>hHM*R^i5`lU# z+a@OJFWM@o9Wv@!s2NB%)TEIZL_ExTh3Wj-O+;r|Jk<9A)Z79Ts{k6J0$Qy}Wc(dQ z13Dl6i|~X@_ib1V)FU1M5f&tmY?t?Hliz0)t!PZX_!7B-l7|9EhCAk0{00AP_l88K zl$*|D!=5|pDFS-IT>;Yq=;PZu>w~oD^y?+)jmvo?hR{5T*1C#iDdQA`#H$@p(IgOTbDI|Vx zp4#VF|6=s{3btF!K5x)Q>GOd-B@(+(GuZgr_98$9F`4JQ%%EKD36vrgVu1=oFP_h~ z*N$35EedX#6U9oGin_Li+QVjoiF#UV1@+54B-Hy*GZ3fd0#&fFwU4_m;w-HORmga+ z51@R!TnwH26hPrBpvz=H=|KP;$47%%FzEu&Xg@$-<8TCdEFXnR7l6KJGyZZpT-2#-M0J=g2bSzy0gl$Ga8EwMz!5Qr; z0jfEJQW))hCo|f)=NR=X5hkOV=JI@$%Vb;xl`hEmG%I(Lj0LR}GTtPk9*>&AhR0@n zI9T6~et|)a=VclS>a%kh_1yw>MYu2OZ%{6y{te1epgzoM(nS61^$O~OTP0erM9pBR zn-c06h^hbv%7^F&Fu=;TG(;5Cw+htbcBN80*LVcZrIzvUhqnm`9 zPO=V$de-Ig3Ix^D_KzTCh(Bug9H#Z>$8IFlw^*o6KlKEZ%d~z7DqYYzmzBFo>kqF} zXx&go-3v7X4m5n!459n_ta=H=_q8E9%LDDZM^r$^p&SLEpIA+rfV!xFieP)2%T>zP zpk^>KwqJ4i-?*UYh=pQ;+qQ??yMWSEpgSvx-I$1&eT9QJ>U1<{P z8iYE4>+iaX;AE^J5VvH+G8vzmt&;IgC_q8R7g!aVWNfVh>MR4Agqnc>rQoB%ruLIS zUNG9zv=Bz=*Ki*|F&3b@3ZONK3Wb*3B2nlF)K4HlOQ}zTxc-hj!+;|E08K7dDO8M? z3kp5RTF#_Ux(etD8BkUbK(lBHL_;iqgvk3{YUI3l!xL;s1gCFoRx|R z=!=#Lg`8a_3Vn*2fhhC@J{pYcKYf}h^b;-NQo5|K51_j(K-mhQAu6ECE)t;DK>*bw zKtZ~!wE)!54^ZjDDus4KZ3zl(Wd&wZ=$C613f(IMdJ#1PQRrcOG??A=;!{kaGFp?Y zP^gU$pfn56O$wliDxj}BOBAXX1kibWG??jGPXKD`2k50jl|t`B*$4`~!D`2((D@b$ zg}TdtrlV#c3gr`^dV!gG`U0lV%d{$0p-_|$psOrE4HZB*q(k;JE$<{z=r@S^K!8r- zqrv3RZ%;Cy%lrV%C{QWn#>)kTiddtV6soTRx<&>xI0&F|1SklF1`9wl6MZREF-ryX z4 z0d*iiLA+X@lmJvzU_QE0fa<`Y6!UA-L#%;qc$n<7bLoZ#u7elR?EiI?%hGcN#I_*g z5*FYl8Qs??WbEBhB4Z(H21DJDPzUMTnU6E5LSAdEpuS9?o;sf^g!rNUeWr@q15qka zpJJhEqCVMNLH$&!gnB1x217j-9}XtfwhB`2Y(Wg5pw0#=SUZ~v*xKnu%~GtLR3Fq1 z3-v7uYJ|4sL462bQOib)sRH%-$AJ2>z#LLvppNlJ{pt)xeVIVLfGQ}cA4a*%Ax}am z3tBr_Je#!sw3&iBNk)wm+=$lLRBCum46g~T?>v(Z&Ky9ln7C)YB6GXTwlH#}wD|sG z@>nI`&Ff)O{&4e(9S8MHU9{2in($U3S|UeYlk)yx>|njR3a<#pi+_T4G(Wk=YV7ccWaU&tynIL7y=!3r+fb9Iw!)_Dxc+-h!He1kn_HG?+nj zi$FY*5z990?gv#sKSJOLKnGa#n1Fhyfbvr$K<}YuFfz`VXLLaTEA1VS7-W2}xgQxj z0Tl+vTQhlZL=kF*&93x8-O57UTtWRV{9saSWkY)jbtQyUFx0!@ukvP}ibp&l!w*5H(9deGkgz&YuDVg4W|%V4AePTt!_^M%|522bjQ&A$DyHE(<{C zZUS)*BbGb=t9%vEFOVey&_R|eCZHFuQph;{Mv08rdKD1RiSL7R;|CxwNVqSaNGJok z)d$c33s5fwP@)Rxw;Lot@j(FHL7YgMEC7Y#1)y|4Kp#$3DYOxCOHgPHOE8l{AH^vY z8Y}~vkD7tH?CbA>Q)vF9Oreji_N7oWA3!%)fD#ozT~$Ea+DR0;h_M`u^M9Wke7v4R zoEqJB@hU&gcTHi=KQoOve>kC5IDZ_R{1T8V zn4s1K;_-}FX0&hfR6rFNastp19(-oMwow5Uww1`Z3N?d~@xwU)WeW+&Y#)KdAmgey zKQg8R6~x}Md?sTfLamT7!3TAUh5C90^;1_WWZcbitFh|}%@%78l5AN6Co zjQZSEMxA!T)OitTKIy#sP%d}=EDT;j>pULDCauq3p`ebDQTIm8K%M_Gv1<^Ev9~~c zKdl>8q|En|RY1REtO!6q^QbWaJ)#0CZY_~1yFqz(8**8P*M;;&rqKRnF%BbK$(7kKAxmf=rarhL7@#iAWRCq&_wC7yJbKN zQ8N&Q8dL#j;cTYRx+{FU>^dJnoh(4@6hJLiK)YK>6skplICU=Dl{heLOE`u2U{~%v z?X@f07ZZjq2Y>-~WfcFFT!#?3Q|jO^g!ul%4|lR+SJpP{N|AY?l8k|(OCpTEwPS9?%SFc|@t8L|rcet1(RE^Zih~a4lK9M z7jfr!VhNNomzg(_B|zn5mH>AUYDI31N4YEkW&(jgJ()S$MEwd37|C2~Aft8=>Hy;Z z2kMI;{Ou5kCop1pz#Y6_1#}E-BLMx#3}gaor2=~RI*E*{Q8O4BFBSq+5V5rUVJ741 z#(re%4pd;Wb$A$(_RMd-g0zJX>YFUotrXNxG*Za;S(1c0tP0cvsz6OG0;n*5)bsCS z)HOu~yC3TNQ7(6W0a#PedI~eCN$W}|9;x#i$*40>Gf?OM4q67IbA|vkkrqBH;{S&U zDxg2m$pX+X+}$RiA{Ef=M2UH{FVf z#b21bo|;8BQ_k~G)GN4Y?B%K@l%^cruVL>uFbkpn{t#3TV?lJ5{sNg>MVls;cN8$h zehVUyw3_+o=HNrQEu)BNPs^*-p&Z3ZPZjN`Q`| zrvm|c+w7MBQ-VrBDf8E-3T}Gn7f8d==2OGN55W09{LfFoFZkVTK7n z1+;ENq0sMRRX`qejR16tJIMr8Lk09y3yDHIQ8N&Q-b1&ng=7u{Xy;6(&>xrk0vhfE z=spY3Cks5}?>1fNmo|7#e{9 z#R@>3{Q$i)TBXp(poE~%2TT)_LTyw)ePuv%P%{vP_M%&Yg{kIDX9_K$Mal|=n)m>^ z&H@y#03u^X(ki9RB?_Ge*kBsG;6Z>2;w|_KWe|?1Y00lDJ&W#T>G=n;_n<<`Pp0%V zr$Qr9E=$i`AP{66%Y-w@7_XwPBco2M0`*tZfEw)&)VG}l>NJ1UyK)$HM}hifs-T!} zOHnSPUJrBv^>W5(qJ9JuUWwKNnn|>N6g7j05D7`5F8bw3~wwAK{V{Z!QY)e`Ef2z3BcdBTq14yUUG;%x{K$9(P=Sn(AhQwZ{MjLs zjOIW)H&R7i*Fqhtp#Dxp{mNAm8TX?s80zPz1V_CWWdOAwD?EKzb`($n^@MfY`L|oB z&CXBvK|K%%1g(2BPLtMdOf4i@SHwxEn-S^&ou5nWO0kdtwoEgDxH}`3JO87*RWfeE zhXo+Ay1jn8SQXF^8Bhtz0s;D+Iv$-72vA8LlW=(*BB2bZxeuTlEkH>Mphak@M4|0X zB?@^^7OY=?TpQeIKA+2=JXj9w)35XH;(mQxRM_&f$&IEc8jo^WfX)O0LB`39)9lw8 zD(VI@YDX2QJ6D0ay8z|zNB#8(M*YiVZdSB~n)-wU=t`8!sJEgy0`(`j@^*d>|7C3u z9e$-m>nBkbjMk6f!@-o*d;#joNIzP~3)Edig&~%TMfWr65Fga_E!4FX)Y~DtB@TJ( z3IlcdCbi&=CMXCMZ0cL)l*`^$pPL|;%~Q+z%4HMPvJ|;&fLhi>E=yI*F2qVWo2q3; z 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™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

    ~Z()#~D;in^x9B>?EopKLii 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

    n9$^IE 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

j2q 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 literal 0 HcmV?d00001 diff --git a/Backend/venv/lib/python3.12/site-packages/pip/_internal/commands/__pycache__/download.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/pip/_internal/commands/__pycache__/download.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..523e8ba3b62ce6a64844c3ca4db6dc3433fa315a GIT binary patch literal 7271 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 diff --git a/Backend/venv/lib/python3.12/site-packages/pip/_internal/commands/__pycache__/hash.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/pip/_internal/commands/__pycache__/hash.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a03400db3c8b2c8b423ed93cb012ad46bc6c091e GIT binary patch literal 2958 zcmai0-A^3X6~FVjGyB0uz{bYd9t%@vq_W#MiCtSUk^?kOVqpoWD{mEzhMmjqtmk8M z@2oLvPrw^p?tz+Dh%)CQwE4Q_r2*1>7R_ z!rpt%x#xbK-}&A7V=k9QP=-fecUM(}{>GJd0X;7Jzky~AImi(_R7_f-D8#y06rmM8 z$(M_=!22Xm@ztUl%d(g9wW8+hMLpIPFYRZF89!Uh#=7d|{ElLW-&yPwkchBQHIgNd z*SLFANc7?>B69cyOqc>w@7rD- zQ;<@lq3_#)V~R`}pPalm$x>549335>ngUDi2eJH0IO;6sNcqdlI zd4Gmr+p$WOdhn34>>P0;Y=!lxR*y=_R+9Sg-fn`vhA`rH1@|NrB}XjEj#N~fw4=f< zRVRg0a25^gXTjHzaT@loLr-R2F*7W4$EKCmjvF7P4Je?&df2dy3iKJ_EJ$8hvOS|_ zmmb<>=pm(w`v~XLvHx@hQ*4y%z?i{ConptBbEAqeJRA>q0~k*5hjo`=9|sXNW?c^( zQD`_J*lXC1>=_ToGr0kcY|o?lSZnkT)ks)2ejL^!Hw@?p##?;oh>_3drp_s592sS1W z9|-PNnS}KkWRFa-H%s~5880e@O6cQ4Ie1(c!}MVk)(UsR2z$eChv7pvC>P!aJmSD9 zJi@`Fg6GZ@YV%Pg3|`N_cC|nub%tAjrG=VXD_Cw2VG`J0p_F7OEpUY9Yx68~v~k+# zJC+jpV;wwys0Gy$+SRhFxs}|GW^8H3ZnkSTdv>>bV6XSmZcjh2yRYwbk8E|1>~{68 z=|9tdKD^!a>b@kt($VZh`lSPu*3-??NYAZiRx&%BOvp#`BDb9md5 zw2RV$IEFsxM`%%wc;>~$5fI5c7EK?&8I;&2BdzeJ$0gyCuFd;;NZo-!$e19xw@qk+4ti_3f@bj4p8Q}c} zuP*V5yED0FM-|G4bH+2sd2W}L-E4#(Fv!cxat6b zUWe)_`dU;Jt=WNc=F<3X|AjB)zI{2X+-we{mA>_BO$5zG??&m_*;xFH0<4w3WX^ax zesf81_{mBw#sU!`9+?=yO%T>lbjaZg@CDFD%bRFXj1F;MJ>+ISK~ffkHeMH{sKu@b z@}X@7boOv`E=VUa_=4Q_13aFRkq%!O{I9(}@U(Oi$8WY)pF)G^HAICuQ9uun0DnLE zKmL!U2WU<(rN*Vn`0+BLHYGc585lQtYdLoFOe8ZCrpn~7hJkoFu7Ti~6yQ0+Un8d0 zYmOaZrdROeWHdni@XA@L^+p3#!%(IqpA;_xo_q%;imNw3p!}^|LVwqD%g)DR+d70* zQZBClXs`41>XVfx>o>MLhnD5NQ^qHK+o#NLkf2{&9&hEty7FcA!q*a*zExmQQ$vs^ zBP%1@nR8#r=f2hd*Y<+)*Yl(6x6ezzJFnb+Gi9D8*TBM3URW*zxs%IW(|`q&2P4Mu z1>o`gA&=)vo|~VsDYjaKPB=!`2~O}?5!ETU!Mm1_21g+4e|frk zcIG56-=(EE5DD|>WgOjwjRPr}d}fuO0+curzQ?DE@A@j2c)G_~_d40nTy8i*{8nzVx literal 0 HcmV?d00001 diff --git a/Backend/venv/lib/python3.12/site-packages/pip/_internal/commands/__pycache__/help.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/pip/_internal/commands/__pycache__/help.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d320adf09ede131405c2e2f0e045b90cdceccab4 GIT binary patch literal 1648 zcmZux&2Jk;6rc63ch}B`6UX_cVVe{hBgIP-2{<$rO^65_BB2zd`m)-1C(b(i)tTKS zwro+M90Eduo)T0ca&(nT{sp*lag|CmBPs<^4%`e00_DWa+S`PR(dy0by?yiM&F{UL zAG^AefR3s88S{<+z^_b+M!XG9Kcrw67{K5xU~_qnV>o8TY(CG2n70Hwo{xuEutZzR zOB{%S_kj`L28Iav1HKh2FPEjP{5w;!91%a!tpH+*q=mJKNR; zgj`f;MQBN}t(;C%unQo_a|X!A3@*{O=XQ*lvNigg;p}SGLTfl@tTL+qH?oszjcR5uIHPsgNdM{A|@h& zet?`p`;=jFj6J5GUgJXcILa7hug2T4nqc!a%2onYY050UnphR9{04{Kje%;sDjv`^ zY}6!!uZj*n2W?3A4SR~I%U}Zda^!Ojpv2|Bh1gx{u?e>LyI_;cN=qn4 zU9&vtiYlNPX2B=j1q5{;YHcgY6rrzS(>5&~MMhld4V-ny-E^YzDdXqdc%|3Y%PUYR zyMbau-SL(23a?Bl*$y(`nO;sa9Ume`w{p>zh>?rBnPBvh znaSOlRNnN@gIci{3;C(9YgTG@!BKZfP zqS+}VMo$Ju_ijJf+*xeOpfj^K`?zEBI5SxvI?7D%ES&VezQ46!I^-IC(~b1Z&irvI z^R%aLH~AphxRR>}_2S`2jnTKC^t|&tJ+>EoSNWz=pLqD`QCe+us=uU_{h_1u8#~fd zIrUZd=iNWaS0Bq)pU4x>Qv*BQ|D3%FdPe>PTw?U+zL77Mnmk44nDzOW@!PZD``Of7 zivOXTqjHJXTh>ChHH{=S&328zf)saZ+Py%xSRJS)X`0~{D2NA`az*;gqT?c{A$Tt^ z>CDJQ>{b)OGO?6X{nxiY!_z0X*3D7G{u&xgU1NcoUw!yKWGzG3}`2NDl$XG)d zYzo8i!M(SdfKK&Hz3^x_gopTyS|4zU{f;!O#2FQ4rJF(M9ukqr z$SB7o8HUttvMp(&C7WcSWMzAfOLBC~E<1A0q?6V;na{bBuADpRrfrAp$$67rT6fC6 zoImNObzW}B1(E?;cgc;pU^19%N;c89TW-#^BwKQ!WQevsa%(P}4Cf-rNUkl}M*F;S zd#)qdLF+zwTdp(NN$Y;OD<>ocT5ph}x$Y#01N#lg+jBdTJ7~R8-kIB#+{GXplGw>H z>j2hDY4-y-1Co+48#;}|;JZj{k^&D{vv<$5E!O;d(ugs-C!NnLT3X90d36lh{8>%H z=_|4Xb;qT&T$I$9O=pkir*(cLEz9PR^OA&Bm;+SqOiok^lmWCF&*nwx=4q@H3nNM{ zm(GhYog01SmA`&PcaFb0GBP?o4n1uXl9tNmRSj55VoJ=a8qQuR5-xg20cZ0X?XyVe z{-AMHiLtuZWIT$og7xN;>*kIr+9{=&7j^zZwm`>WOTP2j{Pht97RqP}CLI^jnd|8Z z=~Nc>N;;ayB{B$$U%=8;2}}75h|TEUi)joSy)dm^GeiZhQ=bm=P0=kzTws{;gN8JLXvw5`uvIyj`aE>0FkiL=5(k~}m#Y#>n z7~%s7d@4ze(|H$XcF~gX*jd2JgmA<7#HuiCPB=yhGNyJ>QSFd}w9LvEHX^B3ADe{s z=2SwHgnmRpq7-bL&x3z|vdtlHs zirL06X~ulm1%)0-i(*QnFp(-yoJg5qsPh1fq@n6=LS%I7q3lFn!BPrKZx*vyQq5U9 zTfmZTpHu+=U3n#SC7Vy=@dC)Rb`t7L z_$&b+6Taf>MtWdh>X(q+LXY@hmET+D_by!g+2xNfFY!m7@ZQ_L_k2}eDD%Qk+N#kL z<>-k@^yCshTH84E)6S1NE786szJK#T*GFBIX#WyFuxX$gJy4Dws6+>s_(RVP4VI&W zmFUnCfB1`*u4+qPxux%sH&pd@m%ZIJZ{YU1_s*?wY{)(5UUnmw@3!YXPnGW}^F0g9 z!r>+UAYr(^Z~xDZeth(EerN>*MH^6+d>4wUolpU9hUh*a+LW@)IMGL)w~!i4Rwps6 zb-YiRA11X%f$8BA%oT79a@}(cjI=D_R4!fE^hwr@90F3c6|!6Ci8nNFuZEA5!$+1` zTfn`HY%VwMg|Uoj_@Igq0cI-17%X;=fP39I&~chsus6$=Y}i=>6G`rKiM_$#{hE30 z5SldIyR~@;oH~)+(ln53NmGfn3_!g!IWkDAgZntLR-LuGz^N*+B|F^%1O0XpwbdaA zX4OG(9BoHh9maPc+&|0x>HU_t$t}Rykk{JZ`h8_=uY>D1%l!>EZkAKb6uQa2j;5Fx zXMoU5*O(-ULOL&`srMr6-l@g}O%VzbCe}ax%(hqfJvsK63n!q^9kMbp0T97S)OoT` zD%rg5P!+66BK80UZX{%O05la7`C<;LFuK!#9Tg7}B7>K)sLn{L13HQ0AecJE;$nU# zu;F?`&rzUK{}HlVs1|CghIW-hyDFjGbDpOT6llJq%^$xzb^m&~6|PnA_WAeD*8+XD zK=VD}c8Pgu)&pLJ+;{oc~W;!2JZ`-$D62Y}#a&bf_mBM2i{N^6pkuDgI& z2{L0LT>y^{+-@=m>Z4tg4ChcV5!`SQ36~gy2^5?nemMB<%2aAPoxd)LdW+G5JO!2v zgF~HGB^8si1X{lgK6ol)IpKN(*doK@Ce&9|-M7Jp#yCv;2i=jO8^*+4z+EJ3BK(|G zC+S9XC#*soa(tW&ljZP>B>OAKRN^|CvKwI6lDbmN%3>WC4f$ufH>m2CG~P3NV)rRfm zhV8ZXSgoVC*46_<1UBtk!6w-y@cwvtUAGuEQ*1h0aCvdETtwjkRzy(nfDmm9vYD6VyDmg7qFyE>AwH9kcbe8P@fPS?8 zl!z^(spJ&-Ph6J2coN;_Gqwqov0e7T$?#g;zbx?<_q(?D8|-M-HOrS=<_WqXN{2s- z3jle0oqt`vSr16nVfC+-_{Ea_ZP(jw(fuJi>n(Y{8(z1nXOigjrey7;lV{-nEI$P%whyVy6trJQ4E(+Sz%+k>G29PxXLi4?6oou7 zfdE=0?9E=C7NnbCm*ia}wSMT)=lCUr^H<*WRtn?>u7@c0Xfc zGoj=4hZf7>J}kU7i~C@DtVL&KDUS&P8lhv5hI1S2p6)kok7d+O5^4efdJ{2KDPmsN zw27KTomC|b6R^Yw2_XwlX&A5zVS!}i@G${9ofC_>f~q@=cOiU$3=o$TLRoTojmtsZ zJ7P+8?#-fvr|E5hIn+-u&VdEl^q|27+{SurfiIA0c5<$IBW$9W(TW(xjR!K7Y{|66 zMnP`@jzjlM@BcynWtgDOGc-8#_~*309hzspckEHHbFu4eCHT^!_oXkw-PQ1ca`?c{ zCo17%b3Sk)?|kd7bB=rBYpnW&vQN0*TJgn}QN-1|@a&3{41$4aB-DfthqDG;ElH5JMx1gPwk*` zwcY{f?+D)E!6gW{&ma1`*|{_S-qijmw5Jvtdbsmp>tgfq71q`ogt)0O2(Ikl(TA`7 zN?SU3@z>E;7u26@zn}T1-HXvz7rmX3*IFQaEVt~LJN4B7YDv^Vqdk0~gzR3LO{NVlW`o@ z-Y}k__X;v-78$#Id9OewUA_#_3GqfT@u6vCGUKWfQHDATj}Z_fkHy^UD5(V?k3!T8 z%rvck<`qhmH@$Q-o-2wXTRmihhX45utHLAsWx6W90;DmI&ZklYK2j;&ol4~tu_%+e zH_%H<5Dt|-giYh!*<2__)5_I7sB%`Q6F3!h@#@)tEBAyB+ z89_yL0v}Kb6A7 zKcy(7J4xILsH-=aF#ve%YCL@Q3Wy) z!WbGF6BpOq$r?BFi7T#3X`H!c053sRJ-m^nbTcCvzmgaxfC4rRwm0pMAnna~JybFR zq3(^$3>xck#{_4v+DPBAkr0$ll2zE;hG>h%Q~D;JCg}!ygoy{eS>(K=O)2;~Ff{@% za*;Mm3%}&Rvbn69F>H?ue46w0=>dyCjt59a6_$8aYfAi#A2#mEF+2+cfbvKs6P8(q zVIHII-yzR$kpD5-@ffxL771UXzAw@4$LPp!(a={mma%=sBjy#RjK1|44L(N0kI^U$ rK1TZ=qrNAuwz<}-tF7#6n?F=>?YQMwb)2vGTo!gynX8D(RJc6K&O`Ix~VhH_{P5c)0i0!`uv5E|22qwz2Q8b0Jm=^^` z2h2cO%1fM<%wSp0%bX6Hp|X-!I4zsuawH$&bjXaBWBC}T6*FG$$aio$Y$nQ``A$wp z%&u~GzPp^vC;2>T_LO_`y_}AjedYdqzko!9(cDSj+1(Kjt_!VMJ|&`ekP*L)j1Jtf z9`LwB3qmIGZ#J3A2vq*DZdS1aRN#WO07KHiGkVo@HEi7|5!)(b%LR6%LQ0ma%{jIO zv#6%sz{DxpmZmXbp={U{7pBZmXu>X+b<1Gn^am3Ym!_vPBJI4WJ9x6>xTJKw%2a8h zi1+UjbzH+NUDqn}MP?~l(cM|iwY4fS3oZ9sz3ff4uK}?NCy^Hnlot&lA27tcWCZd- zBWB3ArMzr}aL7=wg2RKLYe+aUBO76mM2!fJ!90$`xMN0S(izE!f+VpJ%*1KO70apM zg6n{B}=_J z{r;3XW0SJ(X1UR8i+y}l)uW(aR6q0%^CKz~>{f|2Rq*bVe|HFacAMLyz+FX4XpXb@ zc5_T)Uo!+lGy;b7D7Y@QM8daO4QI*ME04nK9y-3wde=u3n)C0k&A)Yz_M?|uR@xLi zaxVH!o)J0t4A#Y#u7DO$COWkk8XGh1f^O1?L?r_Qf_mVy zNH6R9SjWCHBU1%Xs6pg7G@=`v0+bPUgfz??))<JKM9*);<5z{#zkURD*!pk z!RCy^qD}pJJ~wNZajt0nEH{ardDpJw-nCt9j$O3v`I1%4U4+lYmXW&wN0tNJ<|-Tn zr?Rh)=a|Q1{(0morAkhN1cHgBo4GT zw@^cg-HCq|uPbUzQ5&(|MslRlGuV`bu3R&U!s(Yt2}hdUC>(EB>uGfLw=^4F=RG|c z^g8zF{WeukpQ)wKY^LA%QhAf@6#Xn(SB}+`V{5|N=|7x(c=oCC-EHs#(U1pMD(R%? z6xxBuPM<^dDu=4O1LHX_G?@XvEeX59zYCTn;Xt@}mgd6#>fI4m@UphcVH9wo#O-fx z!soc1KIMDyNbrlsGNe_v+m|l|CearIzGl&H=&qjWXo04$FpCTG+75I)s1SCFRN`P7h9D;p z*B)FoqpiL`P^Qt8?V@ z(C=cuiEVa{)jO}&I>WZucn=v#n zv^Dfvrc+||XU41tQ`#^G@X%Fmz=aUjV_E>~-7s%Tn_L0D%1mYVzd3<)QezXB(f5K81GB1YWK92 zNF&<25luJL<8^hsrjBo_r&lKK#-79uHD#0;tB+o;jb7e}9c?5=Hxj4+HT2rXv9~ve zE<7JN^7&*lAg23X1cOJr?*{I^SL;keiRm3&ow_%*5^h8jch3F%Tw`Pu%tdRl;pfpr zJv#a%I@%a{<<~cVb<<-v65T5ik_LA(BI$x*D$_|7O|$ee)-)Q?v@*OeO-9Ew?PGYo zc#@E&8Fm5K$x_i`Zyk1vaQBb|ts690b>NvoR4_;w*r>#^93&~1&;XQa@&=QzKxa7z z5)?xeKir3id&4shVe!a2C<4g&0J_`gg(wDHl+ThD8vVEUD}qrgWqe8CW8I< zztco8to5uF9u9Kyv9rxM%_Bp>X2+ zD@S*61^>~KEtsWNT{!#=e)c;2x6!;;4Ph0T9-st8!mT=>25&f?=V{+wOFp*v!MDmx zYOec7-92h3#9p;wIP7fyh=6(d6-P`7%SmTvwx$)-qA67^>(-L@2&vPq6C+wzYj$CjNqe_mtkWCjd^Mw?xtnr^Z= z)lJ(JC~OwULBm<2Q4|EhRST7wd9~0E=Tf_ax@>c@*$Ng$MP{tX4SrO zJRdJ7@(C*+R{P7zeA1F5>OgrgKWNEOb*P-mr!1LMhsz`R5f9^K&>$Lp;;}8wk9nDQ z7&-PiBln@m6Q5H$UiYNqzo(fSX%7j0EU7i5gXF&{8EcS6ezJy;x*`?U5X}|JvQ{+| zt)i#BB>7|XvzmfY8C8rGtz4EWGU4tk#+q1AkyNQwp+)G{M=LAWZruX);LW z5~z>eM&;^Nu%uvUxL&Y_Wl|6Z%?9Kb-upIc@pAVp*97G{G zgjf_F1x?w9BCA1}{oMb=0mw(|{&a*yKY$@PgO&ard>i56ckQP)ul@Ml53k+0efa}E z!&4o;3f4o?!!k5f$zR57oB+5?yf zzNRacB9FU{=JhHnD60w#KI=68c;yyf#aao5&)2ZJTMlMO>TZqf_y_uS8`=sQ2K=&S zAYRvMxPW*G7uJ+}RL$xDe9cR$uJL-UTGgnDgQ|ZeabI_1A07Lg;!;n&t~nW``aw`c&Iyl%ls$K z63JMzo!RZ<&m(0p-wS5D`>z37bmo|@m)x%XB#4nw!<8EaXVb9OeiWW`yV$-CFViEY z!IYd=qBkiy8%l4P;ck*lDcD+U*Z2J zvUM2jMgM`2xxJ_~_X8pK9U5}t(2$ddhCFy^$UqNX|NTHSIPyB~54JYO4h{Lpp&?Hm z8Zv)q$VU$idFs%R-#j$r512tHarK{m*!l} zZYr}4kK4{VjSj&5GwlvMBfD62CLO-9&So-N&8XIlb#F!^QCqgyF!9qfc|B?qO*NK!l+s!LBOL()rKCqUWPr@31H>;Q-5{YdGNgMFCVrz{ zMI_|3C;m00Rx$NYdX%uh@I_!EI*CZKB>~08^!O&>n@aU>Eb>pd9!8^+XaVj6z}A%t zH0!s?dv8&wqKQC#b>gdHL|7y%hIB_o#HZr|Nh!sOhLPwX>ToHb+>9ilkqxEj8gMf( zgG6dN604|sW^REb;6_ro>!?`hap-eZDT+EW3}B}^2~!BABH=nX7Z{?OiGdlb2)o%n zr)zOd($|nqI7<02(sl6;IIF)b-9^+RV1QV}TCGZ=7GHBR!K#FHgvkKVRfLT_nsDjy z>quQC5xWKTt4Q#jjV7hbFS3vI5L!j-0QwZ&e0t)I5A zYzoUw;jI>Xd0*98Q#jic&b8R{`>GaAVX-MJx7bUs8POIln!?4Vu+(Cg_f?%Sg)>cI zp~art2lyBKcit4vH-(EWc5z>;3#M?PDJ-_wrF~W1xq3D9Mtf+^9GbIc{;0_v?Qn@N z-hcT1cEFd4Y(};sbfTjVqiuG^WM>|G9>WY<6Vh9D`d3TeEd7=}zYWWZAtC$q(TQKe zMZM5_RiLEWx?Ipr{SjkOed~A7g+lgp4~AWOU@a)aS-tHvG_bz-`e@jUiXw9iwBj3=#YRED4I`uTT+eZ-k7 zdZ1_J@YBc>=lZu11(bBRwJSCJJ#!l^op8&$X#?<|M%|-&gM+>fAQ>`u7l;fVGIDOq z(vMuJo4WJ25vyG3Y95T}+O^SV%)1DUKDSg)^}HDet?n4;?!F0)zS3zIqnmETj0HDW zI_FB=w851wbaSp$T5_ds>W-@sd%D|e=~B1em0Z1z_`zd#yf|&V<+dnYaiwlry4ICl zsS$TQ1MmHHxAYeCw|%8|+*~(p#O3(YMAtvPEzPJ>J8H#IM#MoI>j$9tymS z#zujXL0C)yes*8N6*%a#X&LNs3A;KuXoeq&c145uK8&a^17~2y_#TO}VaFucqOk$Kv!5rE;7<`kn(Kj@ zv6?wYiy*G5$>7lRGzqF!w3vkKQ6Ws@ASC2?+@`a`y#%tCt`5)uvqO%7Oj>h7h8*8I zqzhO&^`bq%7%U3#BVZWlfq`i>2h%fwus}eqP&mvPVD^$`Ok-mtY3&aqh5Is& zQi-xxupZN6kc`rJE;O>ju6wPe2LcJgY{1t65|VV0UP*w!*L4!K?-?X;AJc^tu@cep z1U+Wc2~77hYt7*ERHDn!UPqTfB4IZ$T_=7RrjFmHr9KcbeentF+E3!WUI3Pl->3D7 zo_mu>uT8|cHd!|6^mw8n`raQtV|P)jtjBx#Fs@a83N`w1*hxQQUa@^&^gZnR#riKV zHIJQcv1gouEw48=z2ozTBRd=u9%!?(COi8Wc-s8SWU8H|v`v2H$``Bgk*yXJdlRUZ2_>+;%An>WtiT22>IWpTivDiGZ+#I>I8GAJ-bcQF} z!!zda%(H=+PXAbELf8rUha#KdEsjYHw&PP~eCq4lj~9OZ_P6ge<5xHRuTuQi!)@V| zDV%Di<~O5&JUH@4#uLtNu5{9w&6VGBZ*KV@yA_0r_Q0GuFxMHMqK1vl(C5HtXY7qm zYV1+v%gR=q89cSku!E6Jb}MP=Pn!e4`6s9vD32VY$`iuwpgI%Tt$t?k&21)ZHKG@S zHalUm6JM>i*y)#JN84kw=Gg4x)BoasHa6QF`*1VO*T?=XI{kcj{LzCi zAN<4m!|Si!IQI2B?WqNGYN7eYxo6yw=L097WtLh4%g+<3M}1%Rbp{tYgHt;JUw?9o zWk!y-hqLBzcJuo4)RA`TteHC7;l|tCag#gV=5i*NYjShnUf=O~ha^go>W`}9@- z>;zA61HBe-@h{$c_+FbkVsb~m`lQ9BcUUGdyx9lZv57V}V{$W(qu&;vaWgIM?N{;C zW*??!YTAow)bd7}BdlnB$`VBq5yi45*WlZhNH|gaSxr*u_650+D9Ty^gg{M)4IH0^ zwwN*(?1KmKs|sA#eXv~;A6)CO3WeV=R!7###r;&3J}4X1>HG3I^9OG%z-~?YV?X-r z+BTOCT-f^9!vvFC-W#64@KC8MT;E(9|$-C4-^UL|lgf{$NzIK^<(}UNsFiS}UBOXRYJWe!5>9t=;=| zu|tjI@k~C!Ma&P@Tc)1!umab+uZ&IWr>b_c+E!vh8Ux`PKlh~G$II$IPBNg#B?OAfyw;HKPA%c%xZzf zzE{nrC`XIgX+c%5t6sgTu6oD!ivQ;Ix(GbIXOG7IzLt>R`?QHBkl}2*%(1_#oZw{qpgZ3?hSbvZBr`Z zzL1~McBL|26{=#iL#d7jLIFlQm6~{Ms5V{~s$=gir9R#eYGAZmX^c08ni%a-n&T~@ z7DjuO)_7Z}jnNf~7;g`?Guo$g#5+TsjP@&C@$OJJM=azyB2~Uaq$=5amp8sWw9i6h z%fzs`B|Ej;a~F06pHPsEtcH;Rxk?V)6^iW#q(-Uc9U*j3YLaT9J|s0ubx`*@iIYez zSnm8uty29v)=;0+CN%(0|Fk72euIL7obHY!5=kwh#gYki7~fx_l1yc3Fc#I|)%Hq6 zNy{ow&e7>qso9!}P*sLj``KhX9!W?*R*%T43Sx>a7h+SfM9`x9hhGX`I6Zpy`Js{U zvoBp59@On4m(HFY8X18xo+9%QrAZ3!bz`y?mgK9Ew4#OO#Pt|WCgO4eSK>btQRTsy zs?pe$G%gp~gp1P`&p};vF_wBQuFzC;ltvP2DoJsKE0&O8Y*lJLmt4SJ{rRQUs z&cph2ArXnox?N4f*3ju~rvj^f13E72j_WeTJ%X(kbVoRhjN!2E3WwuKDXk#w35VZG zN0efZFB~pApm6vjvWbh{p6DM>#^wI8#8m&FtX|WSss87anymDmNhYtw5@Y>mBGGGd zLh8Q`yV$S9uJos-wee))Xy4%@{VHrkZweS9W3t+xilzF)v4kemL`3P28t19@t8#=! z$NN&#GyoH_q7ewS3W|40!R3AXT*2#q`+T9I?txH8+f1fiTWf(q^UW_IaS|pZG#V6lN%XIpwzL{2+$e!*LO^%6gBvVZBFPjXb(W2q8Wjmk*<={4d z#a5po6Rdf6F;P^X@>YqHED|pXTG3nynJ7BEU0l|WZFfyaNI*Ky_sBEhexw0jCHvkh zxohq=nI=KU@QkH5He>JYMJt%ntwzOPding!Q8XnHC^2~z_7U|$ylAL{cn-P6o}vwk z-9;h@`YK4Ws_FK)tVOOzsBSNI>B6|Iq$o}vwCRp$TnfXss=6y8F$&b3`k+&Hq^47` zaGEN*jkyo1SHs!JR6~B?3XjobI)!Gf%F0z0PeP<3j&$#cQfC@==|o>y*8$*F&p|Oq z3J%XL?+x#&LtJr)1&_brsVP*}7Xl4yf%-caZeJ)=KD*&1&h{;0ce*yJh|_z^eZ#%# z*uUb~zr-ya`}L`hPJQ9{0aNQ}`3d8RGM)GzAnuTiMRjW>osl@xasPzNSY~-Rr}D8d z0-p?@;mos|6*Q~S3hjb9dKQA*tW7KF%>P$2?iNMSI?ZcJov1LWo!aD+EDg{IGgX>> z8EeM&F>kJpgEdi`h9=LR5u%|pDAGY;cqVuu22MXQCQ|vWbPVE#7@=cnblGB$;Xy=Z zdci(JK{&kv98Ek1t|mMgleF=mn|eT=ZZo){8$CEW)bMx=w1`)yRp`_taNN2rrbaYv z8s5ht1SonXhKrIsH8vyb-V_C27N)WaAw;EUJ``a{&`$et9(&Q`bpaNt>Q=To-N{sw zO(5tgT(mAu<^%m%=bEo&A(r>`WQB(fE!m1Scg3xN8w0EE<`sAI19$6MOXq6K@s*b2 z`IaZ{aVsqY+2OApHS^NaQ(rg+zH|rHsvEPzYreLeqwV|ZiOR&(a}Jae)pIYG^?xd+ zrKEu6YRQ9Q7G2A%^)FXSPvox-iRh8 zc|e@8Ty_P$v*%(q5(7)q-6JvuU~!Qqr>5yquyGl0D4M{85ZY?f#IrJBoUQ$0U=7z#Y}{r0txgaigB`_!CbbzxB}hD3=|=j zE}+%Wr`d!|JO&3eON1#a~o6yUf6P3WJq&WBaCt5pY9 zstznYk*_+MwSOJhw>Z7LKOY!C3#z#_dt-Lh*R$g5S!!55m-juD6*eq3XHTKJ?#{{E zCzq`Ex>wqsx!;wqel9z>|J4nicmrEDQr)&NnXlTP^X&ic4JVA* zR#7{D>#jL{jQsXk%b8RBXO;WUoZvq@VFenLK(|p@OVfld3?~zE(8jixqOnqhk`#y2 zm!Z&k@Ltf*&VaSzK^UCaza3y;QUY|2i1Lt#u<~-yNfDdTCM=qv(Cy){l#BwLw5IVq zAkvN{l2iu2$lP=oVIf6OMxVg~m4>!r!El_2REJq~0-?4;@ecV?cws}}yzO&C4;x!^ zLfxj|vJPz4S6Ia@(Ps@9qjBIa9EEX=Ii*_Wly>5!8HZ-M3>hSsuRtuaWGoWLq7o03 z5uXI0c-Cgc*tu6sH6>l=s2g~MjCG8Yg!h3v!(jW(exy)_WW{o#6m{XH_<)-#MskRI zRt>#Bdv=dBd9L-qu5dTsfVoV`ELFHE2}E=5jNJ>tnX5HrjR10*`6m||%;>l*;t`8i zX)-RNfr&8{yhTJ&rp1WS1*px;Bl^TwWpOeB;kMMr#Owg$m^LnIrqHsHpgEurk{C-U zv4q?Q6T>_Jm_f3p;s_?^(WNA`qzD=;PRe35k`U9X+{gIJyqvwbwjjULNO8|u0lJM4 zN*Aul7}z7J6l5v7Z#*_O4(<^2lI2JAMdYzvH@B;@QzuPgiqa z^e&A(@I1a@BmTPg`Ma(r3)H1kR33;*EP{^o`7lJslkBjthrSfVg4d8je4#Z~YIuP*V#gQq#WJw!H5_;0J$f0J$3|90H%C{*M;(bz4Qu z{@PtTF_cJ5}yHdLP zF;JDxLloP!gN?{p+&Wnb<4&4mC?er^;a|llIY-u9?Ri({+}VP=V%6QY;%-|M^6u`O z(EWW-jqs7huU0rM0M(#&(_m(E!#iJw@#_{JwTzLdyXjP*V80YB?<5)JPi z*pqRYqd8KR?e1jUZmqh+YsO6pKM3GjqOf1M%afRFlyYE5B6xH^H-A%t{Jvo$ zFk!&k=6b&opf=Dy`3Cp;8{Cj>&b7^n-=K!fSj3)fE;z%By&_zA@$tx%&MR_)UWQJc z2YuEZnmnaV(nv}djB+9wOE3?^becH^z3NgThB?Ggf|cw()nmlXN_LkRO)BYl!brMV zdQ0Dg8OoxlgcEu+NQ=RSSZ=O+ix+8Ogb1qcW`a!jg>6)ZLChJT3pF1D?hl}NEPjeS zAu#MY@~sO(UBOXNu-E78;@2J@gh{dMKdpRa)x-LxEuPfWFYpV`{@k4pbp1m8`00B` z|M`i3eB%BE+?P{n-9_)xO0uS^HY0xLEzmx)1A?8keKXm-6i=^Oa9#Z3TBj&fQ&T3g!--T4_3U zpId1odw#Cj|aNyowtpuN1>3Djj>FL$R zp_Rs=`|*6^=)4_L`vu#=mBrdc#}b#TJ&<)5s#a1Mz)Gq`ccv{!0dzYkq_0jC$nx|)}b~*5c=kagb;fwz3yGr=#KW!Z$e#lig zXXTe3_-LrNRm?AMojiNe@h`Ogg?jIQlS8lajR0 zK)%q|X98r57VIeWR>o*v;Ny&aR{+3-i#PccZOJSmMEaWiLU1LA10AY;g6< zuF=?qnqI$qN_i?O8yD%u%|h+&ZoDv-BH&n9FmKwsldYLzq}3ZA;eg2%wU1pz7#GRS zyBQL)HkqW?`iw0%u1Fr41#b)0KJ%;)rak%%21h)mMh(x3K3;c%D?ASeEK`h=UYNN%blQ*P(c6wEjo)^jqCbaT#5d}vP=Mib+&by_J*oJLc)ud9uZZs} z5?Cjl>!fL&H2;A-^9OQdot*l2GPq6-uakjwa$=nvTqh^jvHkFtjpyp;U*957ffIB! zW$RX*jVsQ^g%f#a*PLz3c7zMeKbLEHY>NQ3Il(n>otq~rxPi?M3%75hf^-K9?cE#p oF0QiRYTe+WepuJOVTBspa!niS*>Dh>YtspBTf?y6L(Gc*7q@;V-~a#s literal 0 HcmV?d00001 diff --git a/Backend/venv/lib/python3.12/site-packages/pip/_internal/commands/__pycache__/show.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/pip/_internal/commands/__pycache__/show.cpython-312.pyc index 42cc941d2a30b7621b340c2fb5776edf1ebe9704..fec827d3c831511f010b5cdc584d7e2a7137ba47 100644 GIT binary patch delta 20 acmX>bem0!@G%qg~0}$vs8*k)3qzwQ;iUp4V delta 20 acmX>bem0!@G%qg~0}wngP}<0SNE-k}s0JPY diff --git a/Backend/venv/lib/python3.12/site-packages/pip/_internal/commands/__pycache__/uninstall.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/pip/_internal/commands/__pycache__/uninstall.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..3c4f344caf38ba62ca00a959811c380e30865b9f GIT binary patch literal 4708 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 U;4cKB@599neCk`oNdDIU0&o1TZvX%Q literal 0 HcmV?d00001 diff --git a/Backend/venv/lib/python3.12/site-packages/pip/_internal/commands/__pycache__/wheel.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/pip/_internal/commands/__pycache__/wheel.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..31337b808d6c7161d49cd50c81a08c56208c0b57 GIT binary patch literal 8367 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 literal 0 HcmV?d00001 diff --git a/Backend/venv/lib/python3.12/site-packages/pip/_internal/distributions/__pycache__/__init__.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/pip/_internal/distributions/__pycache__/__init__.cpython-312.pyc index c0700ef2bc0ce24753cbe221b51e631986b0c311..c6514f9f53c7916603266c2eee85a46db345f8b5 100644 GIT binary patch delta 20 acmdnazMY->G%qg~0}$vs8*k)Z!wdj2vIKG%qg~0}wngP}<17h8X}h&;=9# diff --git a/Backend/venv/lib/python3.12/site-packages/pip/_internal/distributions/__pycache__/base.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/pip/_internal/distributions/__pycache__/base.cpython-312.pyc index b0b6c35750a0d693ab5bb2cc947244eb3138d8b4..8c1a1cbfba77ca1b624a05bf87d69d8587d6a020 100644 GIT binary patch delta 20 acmew;_EC)cG%qg~0}$vs8*k)J;|2gc<^dChpU`yj%=GpzCbBk$c(_08h0BYybcN delta 22 ccmZ2@l4;>dChpU`yj%=G@W4Q6Blol=08`Tj`v3p{ diff --git a/Backend/venv/lib/python3.12/site-packages/pip/_internal/index/__pycache__/sources.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/pip/_internal/index/__pycache__/sources.cpython-312.pyc index 3d6a7fe4ffaa2f9ce1b16a98780154e0d27d3f22..6f93002f2b449ef0613b4c85bbf380b870064243 100644 GIT binary patch delta 20 acmZ3Rur`7FG%qg~0}$vs8*k)RG5`QP(*(u< delta 20 acmZ3Rur`7FG%qg~0}wngP}<0?WB>p_@dZ@? diff --git a/Backend/venv/lib/python3.12/site-packages/pip/_internal/locations/__pycache__/__init__.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/pip/_internal/locations/__pycache__/__init__.cpython-312.pyc index 098d9463b6de563d2d497514bbb494f480b13aee..fc3df910880b0b6a0ee71913c224de3dd69e7dd3 100644 GIT binary patch delta 20 acmca#e!raiG%qg~0}$vs8*k*kVhsRD>IM}6 delta 20 acmca#e!raiG%qg~0}wngP}<0S#To!j2nM78 diff --git a/Backend/venv/lib/python3.12/site-packages/pip/_internal/locations/__pycache__/_distutils.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/pip/_internal/locations/__pycache__/_distutils.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..34a0c6272ba9423a5b81cc7528439ce487800098 GIT binary patch literal 6784 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 delta 20 acmX>uc3h16G%qg~0}wngP}<0C!wmpBbOh=E diff --git a/Backend/venv/lib/python3.12/site-packages/pip/_internal/metadata/__pycache__/base.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/pip/_internal/metadata/__pycache__/base.cpython-312.pyc index b91e63392f230b383c78486fb61966cddaf7b10e..9050b477e877a7750290865c41386ab48424c161 100644 GIT binary patch delta 22 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 literal 0 HcmV?d00001 diff --git a/Backend/venv/lib/python3.12/site-packages/pip/_internal/metadata/importlib/__pycache__/__init__.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/pip/_internal/metadata/importlib/__pycache__/__init__.cpython-312.pyc index 651a5452719b9405d91b2df84ef3dc9b441ced98..188ec0ee186e415c9a002aa49bf4013f19a0e535 100644 GIT binary patch delta 20 acmeys^nr={G%qg~0}$vs8*k)JWdr~@G%qg~0}$vs8*k)hV*~&z3G%qg~0}wngP}<1N#s~l}Dg+h) diff --git a/Backend/venv/lib/python3.12/site-packages/pip/_internal/models/__pycache__/candidate.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/pip/_internal/models/__pycache__/candidate.cpython-312.pyc index 5c9da878b2afeb95ff14b2059d43581a0e5e8dfd..e414a569bf1585413d235c6f341ce2c28f0708ad 100644 GIT binary patch delta 20 acmX@dbB>4mG%qg~0}$vs8*k)xW&;2=0R&e7 delta 20 acmX@dbB>4mG%qg~0}wngP}<1t%mx5D9|YzA diff --git a/Backend/venv/lib/python3.12/site-packages/pip/_internal/models/__pycache__/direct_url.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/pip/_internal/models/__pycache__/direct_url.cpython-312.pyc index 6602847a4c18855e29fd40baefaa54def26fc99e..864ff0a394070c6b5e532f09e37a61530e6f723d 100644 GIT binary patch delta 20 ZcmeAP>IvdL&CAQh00g?u#v8dAH32oO1V8`) delta 20 acmeAP>IvdL&CAQh00a*Vls0lRY61W`$^_2< diff --git a/Backend/venv/lib/python3.12/site-packages/pip/_internal/models/__pycache__/format_control.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/pip/_internal/models/__pycache__/format_control.cpython-312.pyc index dc498d1548f5e5c95dd1e43dddcbbfb87683e7ab..d5f7e6456f4b7707fb18951be4b5d59babe8c3f2 100644 GIT binary patch delta 20 acmZ3buu6gZG%qg~0}$vs8*k*67XSb=I|Lm7 delta 20 acmZ3buu6gZG%qg~0}wngP};~XF8}~HSp=*A diff --git a/Backend/venv/lib/python3.12/site-packages/pip/_internal/models/__pycache__/index.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/pip/_internal/models/__pycache__/index.cpython-312.pyc index c1ff97abf2dbedf1a5476a919fdc93a21917b52c..6487af07b058c29443dc75077a246ac3f6abed93 100644 GIT binary patch delta 20 acmZ3%yMmYdG%qg~0}$vs8*k*E%LV{3H3Vk> delta 20 acmZ3%yMmYdG%qg~0}wngP};~nmkj_lQv~(^ diff --git a/Backend/venv/lib/python3.12/site-packages/pip/_internal/models/__pycache__/installation_report.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/pip/_internal/models/__pycache__/installation_report.cpython-312.pyc index cd343a3421d7f203e159c486a29a9ca4d64d0afe..540e27d4ccabfe71be120f7ddab96c8c82ec8085 100644 GIT binary patch delta 20 acmew^_+60uG%qg~0}$vs8*k)(!vO$39|c|j delta 20 acmew^_+60uG%qg~0}wngP}<1-h64aXJq7Im diff --git a/Backend/venv/lib/python3.12/site-packages/pip/_internal/models/__pycache__/link.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/pip/_internal/models/__pycache__/link.cpython-312.pyc index d4e522b5d8c45a34e0efc615c4975e2c020b3b0c..3c83f2aeaf1c7791ec32110c70726f39cfd28243 100644 GIT binary patch delta 22 ccmbPxfpP8yM()$Ryj%=GpzCbBky|JO08Y6DumAu6 delta 22 ccmbPxfpP8yM()$Ryj%=G@W4Q6Bezfn08-ZmKL7v# diff --git a/Backend/venv/lib/python3.12/site-packages/pip/_internal/models/__pycache__/pylock.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/pip/_internal/models/__pycache__/pylock.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e95bbe78ff78bd17b4e45cd828e90f1e21f03624 GIT binary patch literal 7869 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 delta 20 acmaD6^&*P diff --git a/Backend/venv/lib/python3.12/site-packages/pip/_internal/network/__pycache__/session.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/pip/_internal/network/__pycache__/session.cpython-312.pyc index d1a5da7d966d9abe9de3a01bb30cc47547153c42..0acb7350366f4f1cb5a4882416da051c0be36b58 100644 GIT binary patch delta 22 ccmbO*jd8*>M()$Ryj%=GpzCbBk(<>U07I7q_y7O^ delta 22 ccmbO*jd8*>M()$Ryj%=G@W4Q6BR8uz07tb2hX4Qo diff --git a/Backend/venv/lib/python3.12/site-packages/pip/_internal/network/__pycache__/utils.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/pip/_internal/network/__pycache__/utils.cpython-312.pyc index 70c8285d4a003f1c5d2c6411bd40590d8d431fb2..464a47289ab9a90a23304edcd7cc3d379427fed4 100644 GIT binary patch delta 20 acmcaDcw3PBG%qg~0}$vs8*k*kzySa`zXb{a delta 20 acmcaDcw3PBG%qg~0}wngP}<0Sfdc?N-36Hd diff --git a/Backend/venv/lib/python3.12/site-packages/pip/_internal/network/__pycache__/xmlrpc.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/pip/_internal/network/__pycache__/xmlrpc.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8fb270bc49416970b523d7ffc9ec43f90be22b45 GIT binary patch literal 2940 zcmZuzO>7&-6`tk(^IxPz>epr*N->j&bYde7Qln`sJC@s2F=7Etc<6e?9Z5?scbVCx z{;(>Hz(8prLFxd3)KgucKvKAe9(!!lV=q!|K+MKQ90WP^Mpq7MxR<`!<&v)J1^DK@ znK!e;Z@%}<{ymY1B6wzIPw3MkLf_ILeE6Po@DFgdk%p>BW3-6DR2jdGR9U~}sywu; zAvDCQ$j}_lkQ#DT_I=)nHe%J7?+Zq}k*FpZghi5sJkj79$!fBZs;2yL$w)VbszVHl zAk5T@;YJ26&fa8#sCp=Z&LK^{inJ)^>(38zLa+W}=ndMNY~WY(8oMk%;8%^vbl%J`@UQrE0 zT{JM{$1dudSUcTXTEe6@*g8V-UU2XWaDD|Rf)Shqszx-X%F0MfYZ1(8Eao*13mUHp zOHvyx0m@esRnZ@pG#Sw1w3rsx5;O-(T5=RtTZ(F_t9(^%qjjbly@*OfUIzZeyFNU9 zXg1%uK&(|=!v(c)=_$}%dIGz`s;<)10UVd21$eB*IsjJoeNWa+4X-OLVtAq*fab+p z0GOsa*wGu<69{%%#GJ2jkD);ilKu`p0rM%djhz1AHQq%Z0eM|EBnyL_{@l9IPwYE& zx$pKJmkDQYaV}T)%cMW(J1$cCYq=4Kpn!sB1C^NhlH~DrtBHvxDT;3Dj-q%1{7qn+ z$2Z~3u_r+oc!FJ90n&M*(sLxG2S!QoI2#*FgdRUhP?H4X#RA-5x?=;Ml$xR1wxZZ{ zOBCe7l}CDI#cJTnvbkP4gYC-XHE~ZG*_pU4P2b5)Y#Y~&{oD(Cxfeb^e=GM&JJ!h`-Orcy@})NSVZ1YP zq|JSlIDpy6<5r+@2!+}cS5#9o0N^;m@3*k+D2tZ1LFi$6;wmPKmW@jhB0*fPg=z)? zq8Rz)`3tBCP^YIUKpDn~&;6$oRP4%h{)?(vMble!k$4JAm&VjJ@q4@H)u8f z>2vFaK~CtoLa5se`T(%rl7A_$F>7d@eGjcMC1HLu4kGM;WY17Z-IN@>?oe_rlvs}g z9Z`WQSk*AGJpssr)yC%GxrK!b1xyvYFl86kR&)awma*eNT|fs2U{tqt6BOI5VULAb zBoF%`S!xb}@uEVwLSgZ^CS@k&0C|SSNq&|2Gdd;R< zcjG4?-bqdU3yH9LHn)B1lT*9#Bfma%C!YEE?Q3s$(#K)(?fCWhe)`y6`WOTcL@tr+ zMo}X3pKc0fJ+dj9f92muogPMC49l~V>=%b$n;l{QHo}8nV%{vps92k71A|yc6{TTm zEra@TMR~ua8od!wQ8cTjDC9XQn3rv+aSk-B zo9fMv{c|By6nsNDWz$RS;Z<}$65%D-_<3fYxz7rGp))$s_1ouO3fec$`t3bA@jVaY z-7z$J_p52p+|4u+mCc|x% zM#vAq_e4res0Fx-{VS^+5S`NBOZ0RfKAfQDJRt}@!P#iS3__LF8-W|6+`lo(Kug@D z-$-^)0h9kb+`CZ9y*n>}bo}W#Ek`%(pv>qk;LAH)fbeo`uV5{Ze;G>oEx)wLNt!f6 z_ayW-Ecd@?eB}Rtg1=Aeq=Zmjr77 delta 20 acmdmBvB84-G%qg~0}wngP}<0?DgyvJwFLSA diff --git a/Backend/venv/lib/python3.12/site-packages/pip/_internal/operations/__pycache__/freeze.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/pip/_internal/operations/__pycache__/freeze.cpython-312.pyc index 5c2b33307d77a2adf08969764ae03ce8a6fc9ea6..49eb9b976e4af4a694cba4426951694909507826 100644 GIT binary patch delta 20 acmbOfFe!lhG%qg~0}$vs8*k)h*8l)EQv^)_ delta 20 acmbOfFe!lhG%qg~0}wngP}<1Nt^oi#aRl4| diff --git a/Backend/venv/lib/python3.12/site-packages/pip/_internal/operations/__pycache__/prepare.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/pip/_internal/operations/__pycache__/prepare.cpython-312.pyc index 31c23e13cf1b9fe9d55d5d62259f903975d2afa0..b47bf058d67c1a2f1b6a29e68373e42487e66851 100644 GIT binary patch delta 22 ccmZ2~fpPr>M()$Ryj%=GpzCbBky|AL08zgM<^TWy delta 22 ccmZ2~fpPr>M()$Ryj%=G@W4Q6BezNh09D-vbpQYW diff --git a/Backend/venv/lib/python3.12/site-packages/pip/_internal/operations/install/__pycache__/__init__.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/pip/_internal/operations/install/__pycache__/__init__.cpython-312.pyc index 6000dbe7a2921bc6331dcbf0d5f16d29f0a7f43b..faca0369ebe46aa83230ebb592e3a29d70dfaf60 100644 GIT binary patch delta 20 acmbQpG?9t>G%qg~0}$vs8*k)hV*~&z3G%qg~0}wngP}<1N#s~l}Dg+h) diff --git a/Backend/venv/lib/python3.12/site-packages/pip/_internal/operations/install/__pycache__/wheel.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/pip/_internal/operations/install/__pycache__/wheel.cpython-312.pyc index ceccc6dedb2eb4a7902b6bca5c2ccf5d2bf1731a..41a7ab527b146fc3987e7e672e2dc3a22072c743 100644 GIT binary patch delta 22 ccmdnk&9t$biTgA!FBbz4=sFv3-} ztXfnx45$W>;s$zjcT!op+k+Jj6YUFSgBG;VPzdGFs8WJKOR{%@6i95!YJ|dv!WBiT Z$9a9|sO}{m&B}klJ#7%*h;wctuYPCiI>`V4 literal 0 HcmV?d00001 diff --git a/Backend/venv/lib/python3.12/site-packages/pip/_internal/resolution/legacy/__pycache__/resolver.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/pip/_internal/resolution/legacy/__pycache__/resolver.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..08e60ce4a33cc8c1c1eaf23f8330a86ae89f8150 GIT binary patch literal 22562 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%0A@129i1E-Y(r;7)k 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 diff --git a/Backend/venv/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/__pycache__/factory.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/__pycache__/factory.cpython-312.pyc index a0f193fa012cb26054bc42943939fd8e30ffb954..e0c57c9b867605a32ca02de3f9aedd4cb37a648f 100644 GIT binary patch delta 22 ccmdnp!L+-BiTgA!FBbz4=sFv3H+{dG6g{Z diff --git a/Backend/venv/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/__pycache__/reporter.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/__pycache__/reporter.cpython-312.pyc index 54dcb9e115cb13561ff3c84019563e546f22001a..53697259d4c71d5faba284c950b2f2294cd5b8c8 100644 GIT binary patch delta 20 acmdn4yIq(2G%qg~0}$vs8*k)ZBL)CC9R%b6 delta 20 acmdn4yIq(2G%qg~0}wngP}<17MhpNvI|Xw9 diff --git a/Backend/venv/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/__pycache__/requirements.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/__pycache__/requirements.cpython-312.pyc index 5d1535a172e38a710a2920798f94531e915da22f..6abc5f59c9adc12972db774c3603e7dc06bc6505 100644 GIT binary patch delta 20 acmZ2gysDV{G%qg~0}$vs8*k*EZwUZE5Cv=i delta 20 acmZ2gysDV{G%qg~0}wngP};~n-x2^sE(QAl diff --git a/Backend/venv/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/__pycache__/resolver.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/__pycache__/resolver.cpython-312.pyc index 6f321e2a2816c57b7f44a7c1933579397dc69b25..e17ec7ee6a94a4ecc51b4971f1e4d19d69b598cc 100644 GIT binary patch delta 20 acmeyE@G*h=G%qg~0}$vs8*k)JGXMZba|MzB delta 20 acmeyE@G*h=G%qg~0}wngP}<0yW&i+7kp>|E diff --git a/Backend/venv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/__init__.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/__init__.cpython-312.pyc index 0af4121cc826f131e92701fa9a38d6eb406514a1..6a39418485e71eb92a2b7224cc4bf407525276b7 100644 GIT binary patch delta 19 ZcmX@bc#4txG%qg~0}$vs8&Blk4*)N~1djj! delta 19 ZcmX@bc#4txG%qg~0}wngP@2fS9{@8?1s(tZ diff --git a/Backend/venv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/_jaraco_text.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/_jaraco_text.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..95608aafbba8a83d051909e54a6d24e3121a3961 GIT binary patch literal 4542 zcmcgvOKcm*8J;C6TUuIvM70$=a59#RN>phQb&4M1Rt_yv7Gs(eNGh&uIrNG<5?5O8 zE_RoeDL9D{ks z>R!4McV}n**L?qL_K*GjD#LYT;&o$RKVyHVm-ZEG4K^-gaGmMwEYlS|U@B)7`3#&5 z=)n)!*`QFCdfQB!Pd)S@yV-g@+ar3GApglrY`>{A=k%T~>Rx>tAyhIg{94# zf?pJtZo7uH$StuVT(xXFhVZz(0Da4gC0BTM%`FS>f;7Xf`MjcCByxyo^75^sHB0A) z??JwAz%*Sr&>*aGotJG(9OIr{6|^5nsAvGF=62cO3BTrW!;@H)Ypx3^CO9=m8f!18 z705Ti4Gc3zSy({P6^?7`wKAZRNMk#T1|WheG95UY_R1ToI$=9?EWs;pX`XHIe2h=n zc6HuU)oI~Y4bOw?NO?uLV!qB7T@7ICQAibn5GhwQcTq%X>zY;PfSknG^S)+Sv>^>! zbm}T7u|W^&7yK1+EJ31qo?SLH$m6KvL2EB%*(o}mpE^XNJ;dlesJGR?QXX(;SCr|=UrFbDXSv-@-r+B)+r}MeD z)5%nl4EcvwrpQ5&Ph^X;JU7V`*;#%nolQo0>L=6rRH49gc{P1{I+IRe zE}fmo%p}v z%ch!A2xa;wnGa!;*=ej72|uCvSR zlH$Ik;JMUIB}o~YPP<9$U1x)e_e zZ`rq<_>}Dn^T-L?UPh?LPiW<3l+8FQ?8Ufg%*UNN(%O1G_Wh%A&+x?&2L#%p@Zx9+ z@lI2S*L=hD;-zM-FUelx)Ej*z%eLlC&02P;3m(SL+mG87c0auHPvNm^-u3rBeed(~ z+Throfw4QGu?;M;EpTkZgoI-bgX_#E0(mV3+M~_q5?bMtm%qI|<99moWp=a0-G&d~ zDcT1BN#(d^4Pom1qGlR8>Y3GSOB$!*gmPfJ=rh8l#(;bz`tk8`(0Tr7ofu1!WprdD z5|OLt&Oe{%+{l7$k3{*%yylLaZ!>I}d_FUg%~{0xzcS8Ql64roBw&>fm+dOGhG$6X zTKsPtX&NJUvnn?QxaKVSd-mS8QjRpmM|v84gs*Sgrq}2}?=!4MKQ-7=8}>%9syU5t z7upE(-u7xU)?M)e;4YmteyaPm$l z>GpwWO9)cf$PlzJKnQm7(C>tx-w8aQ0#;tnI`|=r!|nCWXZtAF3CfmS3d(F`TVoqq zH2{%0e(Z zH{x+|Nvk@@S!j$y83q4HGebwdg+ki08sNh&c?AgfIjF7jI6!bq++}f<0oT~ky(#wq zSl-0Xdl|PYZ2e`nWA`WHSI2K0UJJkWxpFr=bSE_QG~g6X!}x9d4YyNF*%EaqUabgx z7p_RM^J&K3RW2(_IR(_^j zR}}W~sSv9NhS_GxJ<+s5VB@)u!0k9I~w``m_oAnk)F5j?f zI49veta0Df3@j`nJj%&9$p*tJrKQvJ?XCd1*qY zlKP|&`b~CVCZZ@e-R89(PAWox>@fsY|)nQ?ewJTWYAX~#A;jYN-yA(N;*|4zX(6d zFDe|e+dig~w*!kk9M@s341gCg4LRKMZQIGK7;N!xtED_r=CWV?`|;z)=q({?6OCRR za^(5Q9YAn5LKdoKqrZRyQ5wrKfFglLkF-UyR6R<6&YM}j=c({;4`VrppGQZOf3k1T zXJV{>&$YcDow|~`zkBaPwykI2r=j~hU;3nawR$7@=beYv1Ht~m`-89Cn7EO@R=@uK zr|+)~j^6sg?|W_@yF2*9YoYZXwrikC{TEQHc>73w&<{D^eBH~wbLb&c`Ue}k_pJx< z{Fg@u#t()PN0eW^mN*!=9omE8?S0$ney}ew)^q#2K^jLC8jsO95^iiSmGD_uDmD7# zM?Cdhms*r;HjSMgV#q`!q2T)EifpHiURNyQumhJ<8hFbnkGQ}*6f_FgNmDF+?|6y;4x@XERzKJ4A03~#*psxlz;{|AXP({um; literal 0 HcmV?d00001 diff --git a/Backend/venv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/_log.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/_log.cpython-312.pyc index 6f7ea42bb40abe4fbdcf7ebad4c35fc281c9dda0..1af973df93f37ca5bf846736a8d010304244e69d 100644 GIT binary patch delta 20 acmcb}cae|#G%qg~0}$vs8*k)xV+Q~>!USai delta 20 acmcb}cae|#G%qg~0}wngP}<1t#tr~F-~{vl diff --git a/Backend/venv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/appdirs.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/appdirs.cpython-312.pyc index c2c2651898c46233684a23f195498ca99b208b7f..514065c983a40f85a05d4b8be80e69c7780fbe7a 100644 GIT binary patch delta 20 acmbOyJWrVWG%qg~0}$vs8*k*E%n1N6fCN|o delta 20 acmbOyJWrVWG%qg~0}wngP};~nnG*mso&@Ir diff --git a/Backend/venv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/compat.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/compat.cpython-312.pyc index 531b73ffe248c9ebc00b6223cc21f1b253d8ff28..5e5db2af9ab1798bb093b72f6d3568e596bbac82 100644 GIT binary patch delta 20 acmcaAepQ_NG%qg~0}$vs8*k)3#SH*Css#rC delta 20 acmcaAepQ_NG%qg~0}wngP}<0SiW>ku$OV=F diff --git a/Backend/venv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/compatibility_tags.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/compatibility_tags.cpython-312.pyc index bef63b7f8568b1591460208c9ac9110d8b081d8b..6ec5cb0c30a457e2726fe8723dd7877d09be6399 100644 GIT binary patch delta 20 acmexi{KJ_0G%qg~0}$vs8*k)(D+vHYAO*Gn delta 20 acmexi{KJ_0G%qg~0}wngP}<1-RuTY5J_bbq diff --git a/Backend/venv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/datetime.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/datetime.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..cdd9a4279263d4d8455207df190e809a7ae99db3 GIT binary patch literal 686 zcmZuvF>ljA6h6o2)B*>P+5x5-!9WDb6{2py(58r`UD&c%uJ4Giaqg`1B_$}8GO%=l ztsOgpx-jw|SU?>RCkCWWY(Zh_#Jk`K3Gt-&eeXTLcklD*KGtfN5Ljcg#eV{y+hk#W z8O-iLaD*u8AnMRc=5!qDvI@oE9(a|x&waY|3U~0RQukjro=6q$r%Z%7&%^y#=pxiI zOj4HgLY=aZ#+rrDqj{e-f7mTM29H>*jMtY!r^co6$W#^610@o-lwrvOxA|-caD+7A zAKR-eqQAUnyZ^D%GCy#&v-tGC*)bYBg}v zOVC{Rl$}u6g59p{?HaGkhfEZ<5L&z7B$a(ey5a?Cv!bVEPM%85vc`s#JubRrBTjlu zPy%B^lJQ-Vk8~xYj% z;p;P)L3Ph8MG=)r6e;^oj0+kJ-jy<&pZ*T1D^OMez=i*?FXLj;>Ct*tv0>OcBuATXTB9Ij0ZpU$!_u?Kg>;ri}mq literal 0 HcmV?d00001 diff --git a/Backend/venv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/deprecation.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/deprecation.cpython-312.pyc index 5da0ab84f2b11b61dc418d39a138c266591ca3f8..baf28fa94c3f68011a029af12fb9b14119e0e76f 100644 GIT binary patch delta 20 acmeya@LhrXG%qg~0}$vs8*k*!5dZ)`Lj?o? delta 20 acmeya@LhrXG%qg~0}wngP}<0yBLDzHVFi-_ diff --git a/Backend/venv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/direct_url_helpers.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/direct_url_helpers.cpython-312.pyc index 3f861407b873af5482b09dae28bec360b2737f99..318dcbbe1f62aa6fd34665965635fd495a7a150b 100644 GIT binary patch delta 20 acmca5eM_4AG%qg~0}$vs8*k)3&kF!M1O*@f delta 20 acmca5eM_4AG%qg~0}wngP}<0So)-W=A_cDi diff --git a/Backend/venv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/egg_link.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/egg_link.cpython-312.pyc index 4a900ad42efebeb4f57b1fffabf560a6ae386902..208aa66bef5c3a6702323936091ef0c1f8510bf8 100644 GIT binary patch delta 20 acmaDX@mPZUG%qg~0}$vs8*k)}-~j+S{{*xE delta 20 acmaDX@mPZUG%qg~0}wngP};~H!2zXY=Y delta 20 acmeys@qvT;G%qg~0}wngP}<0y$^rmB-33Ab diff --git a/Backend/venv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/glibc.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/glibc.cpython-312.pyc index 1f03c930424f5de724d05d19e6ee201fc1aaee73..b40bbbc495bf17e130b0698b20dad2067a4e1a34 100644 GIT binary patch delta 20 acmdlgv{i`vG%qg~0}$vs8*k*+;sgLP^aL9K delta 20 acmdlgv{i`vG%qg~0}wngP}<0?#R&j65(KIM diff --git a/Backend/venv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/hashes.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/hashes.cpython-312.pyc index 412d6234785dc8562bc048eb9f738f0e5e4b4133..ac82ae94281030e3a0713e92d797fd11a70be3bf 100644 GIT binary patch delta 20 acmdmNwb_dMG%qg~0}$vs8*k*+kOcrZSOj?h delta 20 acmdmNwb_dMG%qg~0}wngP}<0?AqxOJb_ECk diff --git a/Backend/venv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/logging.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/logging.cpython-312.pyc index 5d2bbc3b3499a467e161808d131ec4164ba4146b..610deddb2e33f51ddb1eec572550a2c1a6aac471 100644 GIT binary patch delta 20 acmZ3Nvo44GG%qg~0}$vs8*k)RHUj`Yu>|J; delta 20 acmZ3Nvo44GG%qg~0}wngP}<0?Yz6>A&joe> diff --git a/Backend/venv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/misc.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/misc.cpython-312.pyc index 551ed61bf15f984521a221526f18187d9ea05c2f..7d90d2ea378b1b245829061f0e688c03acad514d 100644 GIT binary patch delta 22 ccmX^7pYia2M()$Ryj%=GpzCbBk$Xoy09{)L7XSbN delta 22 ccmX^7pYia2M()$Ryj%=G@W4Q6BlnJa0AYCtrT_o{ diff --git a/Backend/venv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/packaging.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/packaging.cpython-312.pyc index a4d5cd54027331104781973a0c0db407adadfa52..92de06e3159911b41dd8084d61ee745b9cecadef 100644 GIT binary patch delta 20 acmaFD_k@r8G%qg~0}$vs8*k)}WCs8_x&)p8 delta 20 acmaFD_k@r8G%qg~0}wngP};~H$qoQL*aa;B diff --git a/Backend/venv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/retry.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/retry.cpython-312.pyc index 9acbdedb4c1f8552cf2167a2f811de58d9a22839..70c7fdb03cf817798d342b43580e37f5e4e6c3c9 100644 GIT binary patch delta 20 acmdnZznh=?G%qg~0}$vs8*k*^zzzU3b_AsW delta 20 acmdnZznh=?G%qg~0}wngP}<17fgJ!ilm#>Z diff --git a/Backend/venv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/subprocess.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/subprocess.cpython-312.pyc index 7c9f51b01f4ec0e4020fc130311230964aa56a26..e0e03620c3149f572890581f2f8d0cdcb48087d4 100644 GIT binary patch delta 20 acmccZblZvhG%qg~0}$vs8*k(ePy_%!yafdS delta 20 acmccZblZvhG%qg~0}wngP};~Hpa=j%+69yV diff --git a/Backend/venv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/temp_dir.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/temp_dir.cpython-312.pyc index 7469061387ac13eddd13abebf6d38d9dccd6e978..63c2b640651fd06809772ed4f58578449721b819 100644 GIT binary patch delta 20 acmdlKyD66YG%qg~0}$vs8*k)Zt_J`( delta 20 acmeA#=r7utI?QG%qg~0}$vs8*k*6utI?QG%qg~0}wngP};~X%K-p1!32H) diff --git a/Backend/venv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/virtualenv.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/virtualenv.cpython-312.pyc index 71331461112798ea1efafce317cc041e4d2cf776..88dd4b3bcda4dddd6f14403efec17927e7b9a840 100644 GIT binary patch delta 20 acmdm}v{8xsG%qg~0}$vs8*k)R69fP>oCG%j delta 20 acmdm}v{8xsG%qg~0}wngP}<0?CI|pHx&+1m diff --git a/Backend/venv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/wheel.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/wheel.cpython-312.pyc index 08aa47a14cb1cc10a933c5aa5de2a8bec34f0b07..e198dcdff2cc69cb4e176b447b211d45c8e0ec28 100644 GIT binary patch delta 20 acmaE>`&O6xG%qg~0}$vs8*k)(BnALLjRl4P delta 20 acmaE>`&O6xG%qg~0}wngP}<1-NDKf(s|FPS diff --git a/Backend/venv/lib/python3.12/site-packages/pip/_internal/vcs/__pycache__/__init__.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/pip/_internal/vcs/__pycache__/__init__.cpython-312.pyc index 8a473abd0f40ad197a0af9fa2461e7d0a3aab23b..637fab63c04404bef78c2b2f864e6d6f034ebb93 100644 GIT binary patch delta 20 acmbQsGM9z>G%qg~0}$vs8*k(mVgdjyH3P5! delta 20 acmbQsGM9z>G%qg~0}wngP};~X!~_5_Qv^Q% diff --git a/Backend/venv/lib/python3.12/site-packages/pip/_internal/vcs/__pycache__/bazaar.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/pip/_internal/vcs/__pycache__/bazaar.cpython-312.pyc index a438bf5a07e9ad713306b1abc1486156a8a800e3..d572ca0529fd5d6fbcbbbb3cd74d5ec67eeedb1f 100644 GIT binary patch delta 20 acmdm}u~CEjG%qg~0}$vs8*k)R69E7i_@% diff --git a/Backend/venv/lib/python3.12/site-packages/pip/_internal/vcs/__pycache__/mercurial.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/pip/_internal/vcs/__pycache__/mercurial.cpython-312.pyc index 78b6b7f6f17a1e4068ac9228072e361bd6f270da..db147c06d4ec91f79ff2df4594292da47ff2a95a 100644 GIT binary patch delta 20 acmca-bI*qRG%qg~0}$vs8*k(emIDAkSp@$8 delta 20 acmca-bI*qRG%qg~0}wngP};~HEC&EXcLk0B diff --git a/Backend/venv/lib/python3.12/site-packages/pip/_internal/vcs/__pycache__/subversion.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/pip/_internal/vcs/__pycache__/subversion.cpython-312.pyc index 95444ba059055a4108ff87fc543b8c95b7948902..a12cb2752648a6518975b17ebb8b7b78f8d4731c 100644 GIT binary patch delta 20 acmdm!uqT20G%qg~0}$vs8*k(`GyniUD+KcZ delta 20 acmdm!uqT20G%qg~0}wngP}<0CXaE31Nd7fK6rS~t?Ty!V9FjmNNiaBt_z+tZ)FRrZg&2}TFsMMKT9sB?@6jJ2MLF~qDfGgrZ^pZcp`j!1%$qlF z-oAa``|+=lNC?50m^xhgC4kUlw(*9qLkJr`0I`TPqzO8z2suGuv`_cte6WhTSiw2W zd06*X0=WRE{d%w>YHRg8w9x%F9tB%6jG9MV8tdS~Y%)N5 zfbU2av1iF;qB}wM#U-QQ_%kO@T$*+w7i>z@%8Y7g@S#pf)ijp|KLm>%w#Dp>KP#t; zW`(2+#^>n_vF2>Enw~LjqEDPK%{kDSKB4C4h@qt~6XSAPFMXV@*6pHc98Mj2Ep3%- zG6DXbQwzjOS4-8j0%Dp;(|LwdzJpU*$yc;gweCc~;#yU4t)&BCz)pCq6iiLDibL1V zT{-v7^y1mC&o1NrtI@%BG|`GCmZGmVr{T1X2U~dXX5kSY-GCeDIRqIJ9KoM~=tj_H z*z)0dToWM1(S6@N7e_!~3#si8b?+|-^Fo=q{)M55fRUG_=p{1vIT=*m4rxKzeEYm` z0VVy}i%HRuxi1xBs|CvmL6VeIz0?3)dy1q+OO{>AH-bgmt{zLL8xkWdpprov1Uo5< zJj&EM!3)H)AnzQ1#jF{&6LR5UArkAnV~dmYIYG6PUkKwzCG|@?5DA(qOUj5oPHWW;eocirzP)Ml1G}E6)asledYA^ z`mKY2w6|;AdSe+U{uoZQhf}TLR5P=Tcdy93%`X` z2O)O=_`dsM7hI^k3BD(Tkf#Mez*$GEQN1yAu}I>V-k*)zX56OrIAl?rdku057l~d? zij-O9gdyD&)h%mIsLBc(+q3!=;5*vMy^b#>=1X==55jFIpvanl2^<;OvlJO=o?2m% zzpI6J-SR&in|z3OE#r4q(cveZp@>%)-LSCG7HBS#`d~AYiZbK z!Ni9qcwA^xsEhCG<|oB$BRIwCnYOPH$(nWtb}fEvJSlU~cnUZo07>_QVqVzj2vAP6 zlUEeF5HvjE1l?Zdh*bT|J=GMC>95j~VJESJc|7c88Zf)dm02vh;xIaKgDYyupof6R z%BNL_31UX>zj3UYS(SI*c)OWdhpdZzb@a=lH#3VfU(fK&gG}`AxO#3~LOqeTG}4kr z)PL+#yaZ=p-Zc$6Q<&2j_XY{3F z{0=XhPU7W4oz4cOllNl&0aRutv!=%5p%WPlALbYX{)s5ccZg>y2k@EnR>jn6I+>)C zAjG<{bsna5Q4oZGBqSsrqv#q+tfBZ5_Iq~?9a%%K|0%}S@ct)wY9k;DdpE*8LTqD* cQv<@@^%TP4>y6*U-M?e$i&KCseucmBU!t!}(EtDd literal 0 HcmV?d00001 diff --git a/Backend/venv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/__pycache__/adapter.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/__pycache__/adapter.cpython-312.pyc index 4ae19b16190aa9b7ca9ca37114d2e95e4abec8bb..4da2985d360191163e04a4e0f74ed4b117fd1aa2 100644 GIT binary patch delta 20 acmX?Pa>#`HG%qg~0}$vs8*k(`mjVDe)dZIS delta 20 acmX?Pa>#`HG%qg~0}wngP}<0CE(HKR^93dV diff --git a/Backend/venv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/__pycache__/cache.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/__pycache__/cache.cpython-312.pyc index fcf2d987829c5d472498a5148af9ed8ed9d25bba..7fc4e01b2c98879a6a4328afcf76f618faae5325 100644 GIT binary patch delta 20 acmaDO`$m@gG%qg~0}$vs8*k)($OiyE9R*te delta 20 acmaDO`$m@gG%qg~0}wngP}<1-kPiStI|b?h diff --git a/Backend/venv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/__pycache__/controller.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/__pycache__/controller.cpython-312.pyc index 891b4d2cdb065a7ef8e53805cb64e98e2166f466..2524ce87db9db5919f55bf034e72621867cefd47 100644 GIT binary patch delta 22 ccmcc6z<8m7k^3|+FBbz4=sFv3$; delta 20 acmZouYE$Aq&CAQh00a*Vls0nz761S=0R=<= diff --git a/Backend/venv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/__pycache__/heuristics.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/__pycache__/heuristics.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..34e24de4b4dba3769f07de3867b76e8d857284d5 GIT binary patch literal 6708 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⪼=;dVKRYp7?+Cwt?!9yC(xamQ$2Qp(f+4rc;ooyGxrj;o{36eJ3O!z9@`Sepxz1hz5nie@2;0NM>faTe^d*{ zE1sQx()1``gr*~j|c>VgupNYIoUV9xhRDXDk1uX|AG+=b9?sN`y;K|e_LeZX9UR&?{8{j%z1+^; zt%2vNozGSL+mV5fCVz4M!}Fi^|9bK_=YDnWx68FtS89i+x56`9!pzr^28hn~ROm|J z&dt7Eba37X5UB`NGq__>xYXTpAaxk<5waq%L>SQ3i267~Q@%O@e*p^|pkfmK4FCWy zs=pZkypFwCv4vvliU1(s75=Y3H0Im#4DTK}>V1vhdzt6G-8KkdL)bN{k7=Y0XwgTM z!p;?GJs-DIY?KZx87H?BBFxM!HyBH_AJc6+5ru34@se$0KWOlxKMG3j7n zhzW!pqrGGFT2F*2uuQlXc!{d;mxss5K=mg#&+}gi96$O;F8rTd@C$CD%1wO1ovU)^ zzTo0jF8&911uC@G%qg~0}$vs8*k*^#03B~p#-`B delta 20 acmdlhx>uC@G%qg~0}wngP}<17i3IA+3 diff --git a/Backend/venv/lib/python3.12/site-packages/pip/_vendor/certifi/__pycache__/__main__.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/pip/_vendor/certifi/__pycache__/__main__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..3d1424205876e8f21fef245eb65af74416d93616 GIT binary patch literal 656 zcmZutKW`H;9JTNNok)v_kRqlC2|*AS3%a&QlnzW4Bg%3*&gSCe?tJn&g;Wd`5^Ae1 z-QXjD!Z%?dYEg<=iWm?ZQnxPPOYfQmOZM;iz2~2w{khTbfExbe75Z1zpXH_=W(CfU z6?g|Qz%T*5vT6xTwVsyhJskoK5HN7+LyJ18V9zAxpt0a(0$ zB=Of78`3OB>tQrh5s=EUg%bK4#YI7ohBOO; zZazMDR#S#Y337)R7OtA^p6U6w9VhWml5OK5WH9X^1g}#7XR18uaZh(s z-4kaTTbPIy;b$Q^IgyZvIG`Xq+G{wivjj#r9AI7EA~l&m88w6EH3kDVB; zL|N1I>b+NAzxv*L)&3!!P9PZS;RE{3C_=yRMK~gB!h>NDrV&8|8)#&8#v_ssAC!D zDHmOj7o+!tN@wWToJps??lUPu1YJ#AD6yT*{7#6K-J!lYho|`rL1`gC z+0(RzlC!Z&x_(!cbcd(Ah{>)>Pl(){-QG~15X*S$IKIL+qo1J=X;K2OT)3+_zn|S& zPj(0Gl-j_^dOh;9Z_4HtxMUCc!>kh4QIOH~-kFdlA{+bT@eI~cFWQeBJRZU5ZD1Os zPycg4cpHu5$Mtozs?YZfdxK{jtxOfln8jXF2(_t6s9CD3WoFfEM>%}*gu>`MH67Yt z;eD?w7E?~w-E)?y9O&P_zYi`1aa1?xecrj=@xiS@`jyj6H(f`uYObOIWN?`fC3wwq zib=-}-J~j^hF;ZOO8NmdNvKm|y6x(g=_iI>f9=fa;_%?9qdtDt>wWVa-SDPWoPACn zVhq9i^ATS%HCA?f@f1Q@n(Orrnw$v` zx4?E>0ybbE+-Z1GRW)?S^%D-D)1u32)XSX&P4If{yrvu4S>s7Y9Ec;Tl{kX|m>*$h zz1Anv>~#z(O@0;K33E>F^ZHxCi50B+c-)g}?x^}F$c+p|ViBMqzl}-Y;!8HquP-=t z$B)7ZprZW58+FH})uR`5*Ows?w#FRlX9iihRt36F^Ck0B8X-ln20A|xIPo>4&4P0D zn+YoNJoutvX~Y-G)CG}~B976z!}wRy7b})-GJaqC(N%u)Q9l|$GG7cpBcrw-U(c_< zy-7xKwdRXV8~0-+%XA?|hkvD%V5~TWb5@lW%I1Z_5$cS&mR&e*xztb(S=Ja(Q8=WP z#-M)+=c#$V03XPL9rOvb$qNMss#>+d0ou(e*t%UPf*Y||;fVkW#bQ;{&0?|NuKOYv zSwBP}!_WB^Zulv*6w6G#wmScfc1nWj@*xu5}b~n-oHf>L}Ehcx(CwDC*_e>qR7f)Xziwl5rjg8k{_4lCa$9EKtn&}=8}BFirKL>A8Z&n@ zZJ+BO>0iX=l!3X9T zJ##PJdO0`Ucct&DbK|c+rUxM8cg9p+Bdt7oDpamG z9gxC*9o%v3pzvKTGZYiPJ17l_vF~HjP)p30!?g3BWz?-Pb2u-vZrH>4Mn7BBtF}RT z>u5no2X&q*@@uPDvZ}V`2E7@!sTuSY_D5Lqe;1rS vcq|JT<2xvO2PJ+*xqqXc2hjnXTedM0Qs literal 0 HcmV?d00001 diff --git a/Backend/venv/lib/python3.12/site-packages/pip/_vendor/dependency_groups/__pycache__/_implementation.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/pip/_vendor/dependency_groups/__pycache__/_implementation.cpython-312.pyc index f4cacefa571b01851bf3d2010769964f5b149e32..e38800dcfd8256eef32f5b256aea2985b1d5c916 100644 GIT binary patch delta 20 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 literal 0 HcmV?d00001 diff --git a/Backend/venv/lib/python3.12/site-packages/pip/_vendor/distlib/__pycache__/__init__.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/pip/_vendor/distlib/__pycache__/__init__.cpython-312.pyc index 59f774e19ae194ef21c8f1eabae9cf7591d9aa8d..2aece85b3e3417a9b199be76745932ab4dc127a8 100644 GIT binary patch delta 20 acmZqRYT)8N&CAQh00g?u#v8f6vH$=phXiK; delta 20 acmZqRYT)8N&CAQh00a*Vls0mIWdQ&$r3Cf> diff --git a/Backend/venv/lib/python3.12/site-packages/pip/_vendor/distlib/__pycache__/compat.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/pip/_vendor/distlib/__pycache__/compat.cpython-312.pyc index fa0cd966e880b8c086e64b32c823086800e4019b..ece60823e3d429dfb5d58df775f5bcf4ebe98ad5 100644 GIT binary patch delta 22 ccmZ4eglY8?ChpU`yj%=GpzCbBky~LC091|!P5=M^ delta 22 ccmZ4eglY8?ChpU`yj%=G@W4Q6Be%jP09dRB-2eap diff --git a/Backend/venv/lib/python3.12/site-packages/pip/_vendor/distlib/__pycache__/resources.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/pip/_vendor/distlib/__pycache__/resources.cpython-312.pyc index a0184701c64621cca55fc8f13cb18a57b23c4286..1dd77e09ef4cd46af856d7572e241533a1f6c4c6 100644 GIT binary patch delta 22 ccmdnd&bXtUk^3|+FBbz4=sFv3k>=T5El9Y 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 TUJ`%q`I)Ea`5dMnx8Q#Pr2!i` literal 0 HcmV?d00001 diff --git a/Backend/venv/lib/python3.12/site-packages/pip/_vendor/idna/__pycache__/compat.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/pip/_vendor/idna/__pycache__/compat.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..fb4a9dedc1798de49a4c3f19ad713dc4b6c8bf8d GIT binary patch literal 901 zcmb7Cy=xRf6rb6z`$~)&lmv-vW3iZIVnVhbn56^P=m&fHHr5T z@ervY(&TlZ+~p1Qo9MTSM$kGl$pWjimqk&!TOyX?3=1+x9*3^vPQvm)hwEOyyS)ZGWc*&&ESmc-jEEA*Ze3$qXASsrVc$uJ<=g`8z^#$I9=mx{$) zM64^*EYh=CQPwu)^2Tbrt*&8G5BFdM#ar^db>ryXhethUVt_vR|F%>MuVG{6O=aG^ zXiJTvSvEE$a%$*PH_`+f6K?|kj8g3u)^2V?X_^(pP!q1=yM6VFQoPl zbezOF_##RnQ;_+Yl3I3U63}uyl)9Z}38Wx2@Fz-1g(Z(;5r0=(AKq2B5ivyNMj%Pe zsovdZ-fsLu9m-|^ literal 0 HcmV?d00001 diff --git a/Backend/venv/lib/python3.12/site-packages/pip/_vendor/idna/__pycache__/core.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/pip/_vendor/idna/__pycache__/core.cpython-312.pyc index dd2d11fc1f52636595233ff697ef8edb7f8b7f2d..bf23b7091594256cc62e64911c09cb7443807464 100644 GIT binary patch delta 20 acmdm8x4Vw}G%qg~0}$vs8*k(`um=D`N(DOr delta 20 acmdm8x4Vw}G%qg~0}wngP}<0CU=ILCXa&ju diff --git a/Backend/venv/lib/python3.12/site-packages/pip/_vendor/idna/__pycache__/idnadata.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/pip/_vendor/idna/__pycache__/idnadata.cpython-312.pyc index b1f9d69b2db978814084028355f203df43c5d3eb..0aa7c70cfc4b447dc9a36e6c843a703fc05f7318 100644 GIT binary patch delta 25 fcmbQ=$u_@}jr%k&FBbz4=sFuWa&P5koYDdSR-Fc4 delta 25 fcmbQ=$u_@}jr%k&FBbz4JTOpd>&K1l<4t delta 19 ZcmaFD_=J)BG%qg~0}wngP@2en696|61#AES diff --git a/Backend/venv/lib/python3.12/site-packages/pip/_vendor/idna/__pycache__/uts46data.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/pip/_vendor/idna/__pycache__/uts46data.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..1e54f15827789ed0373676738c4169b01d203d45 GIT binary patch literal 158857 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 literal 0 HcmV?d00001 diff --git a/Backend/venv/lib/python3.12/site-packages/pip/_vendor/msgpack/__pycache__/__init__.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/pip/_vendor/msgpack/__pycache__/__init__.cpython-312.pyc index 582b4b4f159dabec6b9a4ee4ab0387f695482872..769d24ad0bee7a61b80a39f8ebe1b3c6aad1a4d6 100644 GIT binary patch delta 20 acmcb{dySX-G%qg~0}$vs8*k)3%?1ECWd!j6 delta 20 acmcb{dySX-G%qg~0}wngP}<0SnhgLvg9U&9 diff --git a/Backend/venv/lib/python3.12/site-packages/pip/_vendor/msgpack/__pycache__/exceptions.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/pip/_vendor/msgpack/__pycache__/exceptions.cpython-312.pyc index dc26f44f7637181652fc68d309c46cf4f8bfecb5..a4f64fd95c9f52d5bf8f1369322852234b3d2dd3 100644 GIT binary patch delta 20 acmeyu|An9XG%qg~0}$vs8*k)($qoQLUIkD9 delta 20 acmeyu|An9XG%qg~0}wngP}<1-k{tj+d`I; delta 20 acmdnVvXh1TG%qg~0}wngP}<0?#{>X1vjmd> diff --git a/Backend/venv/lib/python3.12/site-packages/pip/_vendor/packaging/__pycache__/_elffile.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/pip/_vendor/packaging/__pycache__/_elffile.cpython-312.pyc index 67ed4c4df824d67678e846a4d73721c7563a4c5f..24aeaae5507a2201d131161e0914f892fc15a1b4 100644 GIT binary patch delta 20 acmZ3bzDk|@G%qg~0}$vs8*k*EFAM-RIs~o& delta 20 acmZ3bzDk|@G%qg~0}wngP};~nUl;&6SOq-* diff --git a/Backend/venv/lib/python3.12/site-packages/pip/_vendor/packaging/__pycache__/_manylinux.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/pip/_vendor/packaging/__pycache__/_manylinux.cpython-312.pyc index fa33a35c2476fab0ba7b3111b9e4c416e6e6924d..f0878266656d2ea4791c04fbbca82258df17b769 100644 GIT binary patch delta 20 acmZ4Fv&e`0G%qg~0}$vs8*k(mR|5bzK?HLE delta 20 acmZ4Fv&e`0G%qg~0}wngP};~Xt_A=+Uj+gH diff --git a/Backend/venv/lib/python3.12/site-packages/pip/_vendor/packaging/__pycache__/_musllinux.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/pip/_vendor/packaging/__pycache__/_musllinux.cpython-312.pyc index 292078470fa35e216b2fd3705997f39ad7cc2985..cf02bc10b4a7e7d59392a49873359faa30dc99ef 100644 GIT binary patch delta 20 acmaE&{6v}iG%qg~0}$vs8*k*kDF^^PxCK%G delta 20 acmaE&{6v}iG%qg~0}wngP}<0SQxE__)&=1J diff --git a/Backend/venv/lib/python3.12/site-packages/pip/_vendor/packaging/__pycache__/_parser.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/pip/_vendor/packaging/__pycache__/_parser.cpython-312.pyc index 127d83303764d2cab1d4cbc1a25c5cdc39966166..097a3bf884bc7563201afdb7ad7f8cd8cc867081 100644 GIT binary patch delta 20 acmdm)yEB*jG%qg~0}$vs8*k)ZX9fU4jRlGT delta 20 acmdm)yEB*jG%qg~0}wngP}<17&I|xWs|FbW diff --git a/Backend/venv/lib/python3.12/site-packages/pip/_vendor/packaging/__pycache__/_structures.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/pip/_vendor/packaging/__pycache__/_structures.cpython-312.pyc index a03654b329572032e9d1e56ac014dff67f8b4556..7642177ce4d9adb794ffaa74c3df2af839e096f4 100644 GIT binary patch delta 20 acmdlYxkZxuG%qg~0}$vs8*k)Z$pZj1%LJ(a delta 20 acmdlYxkZxuG%qg~0}wngP}<17k_P}d=><3d diff --git a/Backend/venv/lib/python3.12/site-packages/pip/_vendor/packaging/__pycache__/_tokenizer.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/pip/_vendor/packaging/__pycache__/_tokenizer.cpython-312.pyc index 270daa652fac8c33fc00e7313fbc387d6c03f181..864b4fd9da51a70602eebe5ce755f6ce6c7002ea 100644 GIT binary patch delta 20 acmbPkH{Fi=G%qg~0}$vs8*k+1kp}=YiUcnJ delta 20 acmbPkH{Fi=G%qg~0}wngP}<1NBM$&Ls06+M diff --git a/Backend/venv/lib/python3.12/site-packages/pip/_vendor/packaging/__pycache__/markers.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/pip/_vendor/packaging/__pycache__/markers.cpython-312.pyc index bbd2a5540cb233fb25832280df3ce01ca7115a21..2ab2ab896c885b42938663e0f5f48b1dd39b9f5a 100644 GIT binary patch delta 20 acmaEn{34nAG%qg~0}$vs8*k*kYX|^Gcm@6d delta 20 acmaEn{34nAG%qg~0}wngP}<0S*AM_pmIjRg diff --git a/Backend/venv/lib/python3.12/site-packages/pip/_vendor/packaging/__pycache__/metadata.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/pip/_vendor/packaging/__pycache__/metadata.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a0a00f62d2a9aacdb26c25f58ab5b3113534b8bb GIT binary patch literal 27261 zcmc(I33OZ6dFFcn9(E8b3GM@skK|T8#l&_$Cjmp=ge9ePqmd`S1VPET@6<_^`b<{R!8?_JGM;(KX z(UQTEQRkp@)HUb=e1j;AxJNyMo>A|hchooN8!a6yW${MDmks(^*fio9EgvlBIUN_V zp6^l{p8tyGw|M#2U}eN|ep5b04T+Wu&vBfjk5msnz!^y$!ZpB zN30`KtHrKju_cIgMx3JShWjmpl0PuaiJoupgLU|N@vRqq!~9@_xK}LwoMEt0+$Wad z+a&H6{rIkqa$>ny{zYD_5G&zViPi9H#2Wau;wtz7u?~K{SP#EJY=qw=Ho;#lu7=+% zw!jaHt?<`~Yv8wu?eIIqPWWrZweZ)8>)>~Z>qVcqLEI>A5;u!m#I52s@hNe;xI^6e zy5slw!RAQw`DfH|$$#Hcg1y`;+$;Q$KFSU0PMJCGIjo9lZknIsr?@ZbUbY&zA^kKz z%?$>{1L7|9tQE7eMlC(qc8(Kwf1Mv}kCceJD*$t_1L>WJ?fyEi&C*&nsy!IhJrPHw zlJaRIzK*5!BCYQ&)J<-%>#}Z0$162o;(`Z%PSHU=YYUH!jmN|B==fNyKWNPAyT>kP z&3nQlBjGb6k*sN7WGo^@hq9(a(Rf4(k7O+amnR}(Z*(Z0H4KGg@t@Pe2^zBIk?2rl zEEb7n?Na2^lTj%$8X1envewu{WGH$z8j)gIVKN>aiJ?~0Mf^mS2v+rvOQYeDXd)sW zk|FdxKOse8l$_-Ug1Vp6`ue#I-VpvYr>r`Di5BZMF2W7+A~&czf!&Awq>C6t{dS~? z2809_vWP~Ewjf$X6TZgF=AbQG()avOWP*CXPa2<`Nc^}vFd7|;qCtV^=)?%?0~?&c z_}Rd=$nzM3vG522L)%U-FM2v~RvI4-9K9SL9v=&=?^w64!)gsE?!ZSDj>ZDv5h)TD zF9*cP+2~kA44k>FLW{;@k&&})8o2myI37@jFo2SiF=UU9#o{R6q2&{l_a@&T z)JcA%NVEup`mBN4nvaPQXbi)n3!TH`qgcpe&v*7lVi)4$6P^3Vj7XkukCJVr1-M=ScKS=L8!|3}shm46Cnw0vXVgSm#7^qBDeS;<(f)M^gFGNIWct zVW=t(UBX@d7A$0}!ilu9XY7<*^)TS@q_X zTW?qNQ`{FUv^CY^fyc&_s!%Mbmpbvu3bDzFh{OglXkaUa#mm#zfE+Pequ8Z0^0?Ay zC(2iJN!vP`sQ_*HUt-~uR?Zq;w%#{8u9#Bh@_GMz<~laWSR7O}>t4Y!VT+*|3Cd!S zS|}53MyZv&HRMtCS%qRxYCx&c zQfsx;Raz*ZrPgV2^%T0?5Nyoaj)gC&t3Ui_Se@Mg5mW+>*06M$j!!9k341__X!}Ar zAp62Y!^#$kjxEm-7!6Ov0`c)cIB+4tfW(J!-W9-YxilOZV><~4Av^jer16VUF(L*# z0t3SlRt`l*#xF&rb`UI)KzK|HOpb}5K&Ul1chRK66O`I2hGWAK8Q#$N=mfHe)QmU) z5^;n53*u%)TiF)w2!MbpmVmP1IBVcgcr0)x5>V+PF)%tg5|4t|2*jf}tOMgxfU*pa z17~PSsBsc$7@%+I|I@TpAvy!HCDD=$Xm5(%I2)9Fsxa#CW4AXAxdD;L4osDV#@n@-R`Ebmg?@^(&mHalqiR`61mo z;;}v8ufbiPN9mPL<*KjhUiN|S)=l%r;e!uG2wbo(vFG^2NHh+Fi3Q3~&RO7Y?B4cR z1V|sqMkGYY_APKPJBVatbykb-c*M5_bs(__5ozQ^f-qOnt#%>ZkM{J($ymY5kPp zJWbmQC+g4fag!QJBC0s3Q`t=!-cs6^e$Ajj2^93=)mVNau-Tht$cQ2uEqsV}bl+ zgXa#*E1*LPN%RXZ0W&vgW5Fm-{4XTmk|7DavAC*w8?Y$?_9f0V@Pz6M+HG>M4=N60|uvc^P?? zWmJeyr6_WJ7k{xY!^2XtIc9n@F5d@SKmduJYvh`O-#qxWgV$p>yVH%E{>rs^{?l{r zYyPYLFIOa8n`Z@h8MEUR`xX1#nYn@2k1x0vx^L*O_q}EPT7SA`eX4ZBUGqlZo3g4a z)>&aTma)0!davwwXy&|C$*LV`&(5TMC-B*dp1?oZU6^^gn%2$GNw} zXtBKR@7`e?qM=ls0RgsnJ#6vDwZ%Hc=b0RJsYs1rn~N+ub*E433d-vqFCWt#AtgKzWI&y zcb&~ib92(!oN<=TmgLNw&wp*#)m_&c=XRyNowH`j*78Q*U1w|3+?sT@=5%_?em>)^ zqFf7`u5U?uHze&FetF+n_W{Qv>At5rSwjo?_MW7D->-6dihRU4%R80s?l$gDo2AF7 zzq8Ta!|UJX1%%m|no!8Mc1FIjGc;?>(`E9RNXKiUkmhMuXr6YWdDzjK&`7&>YVOPkab|Q=91DQ_wL;>BWG?&i!M;e*i zu8_I%sn5uUKB|qK;p~L(rJw9@XGi)T`pJ%YcDO%HKN)$kn?gim1RaSy_1MmcOS4MO zCTt20V?8F&361b%SrZyDh%SN{Wb{TtqgCZR8tqAWn1nW=(WmV)eahOD@Mr{eyV?TQ z#ASym?PZ3K{vJF28b^mI{tEF5_c&gW_Qwg2F;`5iR}4cGl+bX43WMX$+w);HbVH+m z&eO=Qa8ueLI;|huR{&kZT=@d$-TAN@Dk$;KZ;w}nlK&RACr&aq=723pcC^B&_*=z< zz1$ps3dh;B0YpZ{ip=<_=102zJc+tixICfpJRbwacaEDD@Mjct)21l_q|tu|Y;ysA zHy8B2dId22JWn#I6)wLD&T6ETd?x(A!BtNU=?YqG`G|Jat!NZ}PHEaa^bUoF%2Df`UwvVBwb zILQu~136kAU#I?>(#TQKbODk~$vR~e&9q!WnlfP@>W-j1$#9uNd4ir#jZfL3Tcxsf z9|G4KCoYURwFY%`3Sj*%U|AU~w}p$7m{uuKB=5~-W?Z-xDV$lDYiq2k%8(7%Ii|^L3*>f;(g_Sh z-w3H#pe53Au0z&;o<4oJZ=k!kd!YOD>7XJ>8z2$l*~u{`3=YWJAxQKB@k`_F(Cdu` z;$W#FOzaA>H73h#&qgH(1(`$;rN_@&8T$j`^V}HeidC5-Q@WBcaG7LT6|RC!Ll-&% zdr1MaOhC!NF=iZcNC<>MT8zaY!UJT+=O1OdM|A$oWOO9n4!J9lX|k{wgd3J;L>nqqq)7vfv5k%mjZ8uqCsz;Y_2ihea-2H?2hf3$ z*tnJ(qjp*CqAYTyHi8U=fG^)0$hnn4R-`A(h7*Gu4?r#-3BU${#JUhaQ{fdux;F}) z`^aTk|6NcmlQ*xZmCDlijgO6hQvzGV>Yz-}c}Cd$;s@)h(r?BdX;N-wR3SbyPK<+w zzC0j}Vk=2w@UliMkm%UDy-X^=WC9W+#YvbY%g-(#6kIKhQv|6zvw|$rHL_8VvPQPW zB+hwIr*+rpwxTh~<)VWvwilF=1H?rY}JT7O=a3_=qF~q|(Tmh=IcJ zWR3D}%o_KzU72;rJYh(VW=xzUQME=IBFH3cqu~n?B{^Ff>O0(h;81AbNa$GiCqjq2 zj~+eHzb~r?^lVA!_`osz3hh16cc}Nc6ecM4(4hmz2h^x%5yd1B(isX}CXeXotbSsA z0yZF#IIJ4N&~r#3N`hR9lP1XfGf2VqJ-QLu? zy-9a4?cTTOK9+JHOCJA3+WpB{<3lUwuAE=})itlKd96L|YFXmqywCvYj*)ZuUP)X@ zyflR$R?b^-t>bFPf-mh^{jR6&di|^^=i%JmSpgXT`*V-2AH>T=0em9n^d+M%td(yr=>D~U&$GIx!>s~+c)#qM)Zn0)Du6^SQ4*x7f5R)wJt2pKj{;fU~&QUp+jxXTChAGnKYx%B#L=ebq|r_TBOg zP|G*A&YLs7%4>(O9$r{~-MrBGp06wCMWI|ZhoP`vwZDG+jnZ#cf3144ZfmM;>#f!4 zy6$vM&wH*tXuO)r)X(mp8@SSc&+hv>Z_A>$E#+;yK9Kfy z&6+bdZ_-wkb8)o|TArMbv-`gELdw>3qv3kwt=3!ow>mS`bqjT`?w{Q=XMX80x>r*6 zdUeXtglHwoj;Q&{cO4C~Q0!*-Th9B{Yp(a*tb22Rx_YCM%SX9t-*q%Y+TduuA6S30 zFCEx6r=Q#ZMF)B>H{zxKToke;p&=L7dxZA;p4$0~3-Pq4ZPxU@owIvsI%^j6DQCm| zrXZRa`}U5_9k8R8CUtDt0CoTSU7yMEA85}=-QET?Z}iiU-u_{>;6%% zb9(^7vudFws*{_5dD9p|ftxWv(%sari~p7(vJ1acBb z^RFIOa`rNm5v&=rYtdYlGFQzXzTTBKcPyGWrpy~NcF&@{Hf67Un# zY5UIqrPo=kIX%ifiV?;7!)DLZ+l@b}DLLfQ{b-Z@P!sp#?T$kZ%TMe)`L2>f^}lo?E{LHm6Of11OF zCdV&j;eRZ100Am zIzA`B;)_&UTo(Ti`13ITSGKKypV(vhqsU0Qr2 zvzi3`FaHM{NV1;vpnN&L-plsjY8c=^a2JJwVq6Me1Ts^8k+58)4dkO;ISso(N`xS& z8G^_$)Y=lHT*Koas6cc;R}UxqzyoAHsQsW1i`%HAOCHEwT_` zm>uK>X`XRtt1+YlX4pOebq&HY6{(P5pw3_-7pRYnLGC#m5$hQ(p^&AgPb(s=j+3$m z_cToP6bPN zRw|KAW7t|;z#7WBLWdQDA*E4SAuPg>LHY(#-{hqm_-KME%o?nDRlzv|EA4|63n1wa zkOm_x5@|39h59IFXp`{fSA%Ba^Y?Vb*-!>YoE0MfS;H5sOuM+uL`iD^vBzit*#;sc zy8`}D$2ejxMERM^n9niR^%Gc3qJ zUMLoE3IDRrFzr6jrm?~e7t~nm>8mR_=5cs783ewn~N5o18 z4H#d{?ys0)p}4i*TQrYw5Mvd!28^5KbdI~o#URf3&3dq}G%w6e$@Yas#CxxCU(rNT z(}IqJCQZ}4kw|R{41O^&B_T72iHi2Bc!?ccToWb6p^B9qYEvegvC^6-6D+cxv7S9D z>j?(BL@lMIwyLQ?T|X=zRn!x-l2s$IIWQ44gn%5Rt0*fIhtANkzGqGxIM&x2>K+(4 zcAQbhWZsf3=~j(gn5sf1QHeU0sO8Ytu@z?46d~V1Y*rY8SyDv$T?$)Nj!%lwSjz;W zy!v3VNCbE&;aRruSls)x=Kcf)u!+o^yJFE*mvYt33OJFkIj%b7p9_uO41O(`cC~>x zqr>=>tyi|b?o8R5uWwAQ*`Cu0j^O>Zn{OFzTi$8>%ixcK?^Gpso=C4fIcIs_%vIDc zG^NX1=7a}T0qEq!SE5&knPE&iSk?(J2Uo;CWnTY2(3 zEIr%wZ*S${_b)>Xnh1Rsy}t$`6(8oXhBPFg#*whB*p3kkw8+KFskp-$NAWwo2HozgPLMDHWaBEX_U=uMMGZl z$WK|6HOvSnr6eelx6x^A5;mcP#ItT#|BXXW4C*owVMlV-rVvW~u$p^QKFk?Xm3NXJ zrGQRlTfVvk#ivoWW$NxNmna+8a{# zhK0VHz391j( z=-4{ZR$tL|V(6ECg!W56A@48XDU%Jsi%d!@cKpm}B?iMiWv&(aRZ61Ba$?P;O{4-L zQB`b~mBbdBXcDPCX`*$4#ed&hx9Dw7d7G~bX>Ui;-T{Sv&7!j{M7jdq7xFjT@#C3=BYW0>D1LUg1|IGMKsyd0waNS7x|b6q%i+s zaBy@6fNdSi8o+*t`naZp&tJX3l^;NSP4^Xz+=jK0P)yq{3NU8Fn3032n^81gfc!(M zc|vWbg4#5#BO~**qgynKmSLvfE?S=zw>;JQ%u@!@#x#YEQ|2kthxF23P_IeFKdhJL z6}_aD?dac0TjP;64oi$q*jPlzl<@QI(C0jIuy|NUUmz>ygq@Z>?0%UIOv1l%spI|- zX@wpc+ZeTxH4P1uG&r6RP7LgA-;!9X79gW@Ch?bz>Myg6#qtD{A_@fkzP*RD);%!s z93MN3R^TRL7)Iq|ap`AhcA`ZVF;EJ%57Z4yg!T#o1GO?zCIl_g3<|J|Em?aXnQb4I z?Xj{hqWzVAF?(j|3UV?*c6c<#wrkcv8XU&E01$B>GN0inEEZFM7sfG-0M14jxx}RZ zLSWtMSccTLO8*t{F`~d_K1DlT>onY3DE%%3pJ*$FjGvTy3l>wX6RU5A%a-@eI_`V? z*V?bPFM8Tip0>27W7d?ZZ=N;Hm88t8!2dXWi}uEpy)kWHy=ZSs+1t|gj*Q(q*N-!L z(cYS}x8_Wozi!qJ8$)~f{B+9JcGG^l@6VsU^Yr%*r`A5BVWf;_&5hohHR-lp$u+xg z8*fkE277Z9RI;}u$LSno3FfU~^6!f4`_i5bXot-+ckW$VO#z7B9}K+H{QXn6k0f0K z%Zk=EEF4N!uS=RMGM;J$N?+R3MNs_nyWX|6UcZ#wc_h_&qyXCX|1gm3IiB7zklcPE z$MGk5f5u-scL6+TbLB<%eg*qWr z=`-*W^%{$zs7L9tNIej{_))4Pev)>@zXJRj?tV?+4evKAzE*L)FJ0610cW;&W)Eka)ycrVlye`h zTrQTirOMhe{>EfkbF%qB(svL`(eJ@3Rs{HWS3mWx`>Drr_9lIO1vwo6{Ln+({hrtL zU$wkyS=gBN1=Gy#@$mzjrk5SqMAcm*!zdj|e6WOIghG6CF}5a7Se?0|jEtU{%_@hB zI=L{#X(h7~GPeC#Yz@i42yd-$zoBP$Vj=yyp-GjPp)90k%M4|O{sHMfp>P4cDoFpD zB8WMW{xf-hN#6J2K?;yZysk0r5<25rV)Ali%s!Fw43o-CieJN`U_9xfSq!&PU_Fqi zFNQmp=Miabya;$qAXHtOBvFmo(wHf)AxX?he$J3_1r}Y+P}kfL7F%|uT6Wzwyc56M zGVq@3#QPA^oaBKWeT_+b!-p|4{<)T9<@%&+!>v6Z&d7YOeFOJhZ+C+F$tG`n# zAiRvw)fk!IL9?%6HuIak7-0vLq>v+Q&QV5o#a4~R$`(U7id+J$tR}}S#-hBb?=P5b zgG6*%)_z=la^N_$*Di%A(IRC$@HlT$uFb4=l}WZ8O*9mn+7+3I`i`AM^_W|kEvZ@b zwx+zT*EgoU>yq|$U`r|%ovkTn>%W*S`K-^+UGsJu_22S$^I$#&1eeX0MvT9MhAi9L ztN-PDTb)t$i+$blYune5Jz-zx=a>xOSL|!)Av%NY%62kIl5y2E|H4Gpqs(tX+~XS@ zqP>6S zs_pedi`5%a)f;XePgie!&$W#<^Ha2!%V(cvTe*7C*^zRR)^(XoqHL}?S<#hrt-rPY zBewFIF76M#-F5mqg1@_3f2UeNc-i96wlW!?{Ij>R0fm_Rb!=OCN)3_?5VNb6360e2 zd<6#W%vywSb`gO>l{Rya7fh@!Hhquh`)!)TqkxY&G%|@o)uQ*Ql=rDyeQ9q`(%wT` zcjd%ybZJ|Z&-E|FVc2}R6(y$a|%)gIL%GbvAB$y z6LE3tBl1H!sBUA3dOzY&S92Dl2vt5i)=&UNQ&wq>1PA|dpfHN{NqrQa(B==Xjh5C5 zr?z=Y&p2(OlAlzkv9L~%L`C@je9wRo@4@C6WKPi3pU`!5Bzm79Gi@VlIJ!A5;(eSU zsNXL`vI>0`Y2rcODu!^-j*~@TmTygTeh8rWFibNQp%Aq2<0BU%;yF|jJH~{j-!)O|U!tBa#aU{Jg z%a>?_n=sc<{sKh{86UQDsb$q{Z^r4Ji(i>4ps=gvhQYzD>fzy+_VD1|h#=R4Acy|U zJ11WG%<|01+9OFHai0p^4mFz_);UcnSJQ%+cCA@-ZBDs1-*s)h@2yk_f(>c!+C}g7 zlz01G@6HE#HUL#W1`U=#{zd2NlyfxJlWUnp3MRQOm%B`q19R>L?&rih!=qSAJ;at60j21$|Gx=}wnbq(3C@ zPsw9v=buw3Mc!YLcaOaPM&AD$G zgiG@t4)3lU$dtHWJe;vr;Z8aXM;cn*Hwi)&*|P<5EM(@aB}*2>EtTkm4NK+<=s*`;mSjv|K#4mXaLi>{4CR8j{ng#!o&mfd8*=ynL=B>h-T)9JN zeBdn43HYKeYvYm$p`}`*;Lo`nLb;Mgm+q}ClvbXr1sq(m&*|}fU|F*y;QP>5E|kiB zrEU)4Pjd?S!!Lauhvt)w!y*FRcYdA6!*RyX8Px-4(5S_4!Q*53coUv>Gi$jlq8SEd z>;)MMr0E4IR?&(S<@&<16q{&A3VTgPE+dxQaH>Zx%*R|vWpBu=faqW;>`fV^oVTD{ z2}@SC|atVr>)GVFC41!7?v zeJr(_)C4Qam9iA}md%QkGM2*LwoxFiDrlphrLtFUilmmaRQB@C3aAw_qC?g4DuR)icQJo{-wWQo9OL3;Wy1QrABrwTY!}ctYxGmb#HrFK-HN zWrtJvAh6UiSan2Vpt`h&{0i^4Xcmu(ts`^;M58f-M)lF0WBHejPPaj~0EIZa-WyQG zJAv^t^sot;B`S5{ezlcI7u703y(*!+(no3yrm&c#$9z^?GLhd9iYl*!sSp^rOHr6& zGE0;vnIXas6G}p9nI$4Cx^3d}HZq6WcKU@LJcFbiz_9sa07IeE`PYEh+dTOvcT|hT z4H#VM-@}syZ5n%tQN|`zbXe+WsZ%=XFCddNKyIin zCN-KC@^&f3q=i%3W%_Ajf$Bv7={Ge!<67s1FFBzv3=d*(!A-j)vv1K3eP zma8dMAq=R&h1%jZYU)B}1rUj*L(0#C*J>n(owY;lrO&(!xsu# zAzX0aY@k&&t7#>+D=tk&+UNpU9!;STMFph*$=x*9gTk{MUs zU{eifD1Q$86E0TCm)jIEQ&QRzkd1Ow*9()XzWc5QMF?MH2`Y~d&dd!9V3MJY2XYFdsLiEsT$CwTgGBFV?NdDj0p~L4U5dg2_~~8jFq4+nvJ}ZnN>60wj&GG zg!{0(7=< z!|KI`&8ddXNmt=PjU`tD6?4-mO}Hzj5oWhE(Iu`M&%0>oS3+Ohd~; zb24}!)37yJzwOrQWcM@4-N&HytQ+8$1VcmZ{2nj?HO-6F?WyYa>qB>|yE4^{_kC6K zdltO!`I>T_XxICjaKY$)S!1$k^R3EsS#Q$S`+zJQaSes%d<`E!rQ4EmRm#?~$@)!q z@lH)c^LwtqugET|NH~3zJ@2IMYZ(DAyO#XX zn3rytXaH2q`Tr5~CftExAZZnM(hFiz36_L(4P(kwn~7>Q5e6yhB}uIhc+rPlP?Y8< zKSQS^QIVg?tsp=|qrl|EP2o>b5}{7%-;l@Zp!BR=1x)Xh$yO*9pv%xXdLp}+Wr>wx zHa7SP?{ajb?ho4L6@lZs<+c_Ra0n5W*XsH`{KT()Ih_a~;Up2mnwj!zT-a zH-S#JCtcff1_2rwZ`rl&SGO2d1stoQd=^>14RgbU5RpIv#0=M+2a63)CTf?h;C z#l&ibI^$>6gGqiGSruHJV(-&P-=rD(19;2oVp1i7rig@2$?x)Qq0DcPx0_0oEw5V3 zyOnZmBk%XgJ3`)5t=V|1 z@9vtOnL|lWOWM$rF>JWk)cK9)X7(oScoTG8#?XN*Z*5o7H&c3W{jH|E!QC?lldjci z!|sfs>t5&9+rr(>y=+X{(uTbm!W{O!rRn+_)prAhz#wBc~Zu=U=i-7JneCP%GD&OZJKF9YfWp#G$X%zPsxWQqHw$1D*!ogaN-5x!c~WjCpUy&`>O@W6Q0{yB&SXjQ3>>jk0u@ZCZo8 ztBG-yx9DbsAo^!}ox*bLVTzUYABj?S8g{5J_bC>m(j;YGrEPVBsKU`=6D{nKlxGV> zQElwO4;h7NC&8&x!S(dO{@F>q!B7800L0a}S}Iq3HWCrpV+N8mL(z6QT7Cc_>sZ!0 zHBrv5{bFxoNVvlXhAW0wD2!12K!PP108b(cQ!qGypZy$*{yO=4I{bkr*9={cR~_uxMPX{DuT0Zx~|z9Rl)2%3}}p9@tal zWs1v`gD4{~op^O7CUcZurwF4gzr(=wA3@0@C;EFOVozn|*ykzqJ@ObjWwWniBgiNx zW_Q1KE#vzhnYYX5_fBao#t8r8UswPx15d&8KjZ5Emh=CV^Zu0cF&}}FpK{ipa*ki< zOuX(F9C;p&-;(Aw|BP$?8Mp3%!85b>^ZmcsKZoV-pW(ra8BB|MZ%Xf-yY#NUHdEU0 zoBa=sPT>>$e8oeKz7HGCeEr<{ha5f+Yx{VRcY(Ovwk0B`)2J zJy*{Gh3a(_Ub5==wM*6}-nDd;ck%oA+|E@Mx{Sd-JDk%agqFk9XShyt(>qb8Q7My(GNR7qkx0LC7e()dpYN%u!|F1b5%Jvg*}|$oU`V<6!yt^ zN-12%2^Go8j+~!p(tcN*gm}tCc_nj4)g9$aAK$6aEJ~kUPnh=63Vk=0p7Are{){ zo=I;yzF0o+ruDjTJvQ&1kGxu$E+0UqCF7`$Z+ri=z?Jx3`s9rD12b2Bm``#bI4hG? z2UFgslbq{sJXP;j?@4=lXPgg>1A4x6&Oh(ITKSNp@Gr)U<2t_S1CIQET8i4aiW7W{ Nw$Tp+N1wy^e*sep%Vz)p literal 0 HcmV?d00001 diff --git a/Backend/venv/lib/python3.12/site-packages/pip/_vendor/packaging/__pycache__/requirements.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/pip/_vendor/packaging/__pycache__/requirements.cpython-312.pyc index c0e99597dc92512b22db321c99deda0e9b4ce4df..88b03206423fe0386b6b90d4b488bb3bd1f30d66 100644 GIT binary patch delta 20 acmX@AbX1A^G%qg~0}$vs8*k*c5(EG@yaaOq delta 20 acmX@AbX1A^G%qg~0}wngP}<0CB?tgJ+64jt diff --git a/Backend/venv/lib/python3.12/site-packages/pip/_vendor/packaging/__pycache__/specifiers.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/pip/_vendor/packaging/__pycache__/specifiers.cpython-312.pyc index 05ca010a032befb9d07d25e97a172e85a28fd1d0..32100cde20e65406b9d1974e06f8bf1b733c7116 100644 GIT binary patch delta 22 ccmZ3yk!kTpChpU`yj%=GpzCbBk$c7r08Cc~HUIzs delta 22 ccmZ3yk!kTpChpU`yj%=G@W4Q6BlnCM08n)X#Q*>R diff --git a/Backend/venv/lib/python3.12/site-packages/pip/_vendor/packaging/__pycache__/tags.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/pip/_vendor/packaging/__pycache__/tags.cpython-312.pyc index 538d8d2d1f9c9eb1a5aa7a1531ba989dfc5ef694..458d425643cd0734fc973ef5c49941459ea8655a 100644 GIT binary patch delta 22 ccmex;kn#6HM()$Ryj%=GpzCbBk^4ge09`T%Bme*a delta 22 ccmex;kn#6HM()$Ryj%=G@W4Q6Blm{{0AWxEvj6}9 diff --git a/Backend/venv/lib/python3.12/site-packages/pip/_vendor/packaging/__pycache__/utils.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/pip/_vendor/packaging/__pycache__/utils.cpython-312.pyc index 42bde423376cec18cfeca2ef4b5cd630dafc2442..a0ebb52cdd390c808be05c93d2a884c7117f3a19 100644 GIT binary patch delta 20 acmexn{LPsAG%qg~0}$vs8*k)(EeQZZ&;_sn delta 20 acmexn{LPsAG%qg~0}wngP}<1-S`q+8?gl>q diff --git a/Backend/venv/lib/python3.12/site-packages/pip/_vendor/packaging/__pycache__/version.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/pip/_vendor/packaging/__pycache__/version.cpython-312.pyc index 641aa7b33f0226716735a5ed554e288fce7f3a1d..1e4d965609a3fcde6afb272f2cad823f2f9caf1f 100644 GIT binary patch delta 21 bcmeBPz}UTjk^3|+FBbz4=sFuOFL5BOXhm3>L#M6UNhc z42RK?c4UYcks)KGg(uR^j4S5KP%#QabBHH@g~i-B67W>OX51Kg=R>SEi_t(s@GgOQ zh}SV*934kIbsO<+q3NNcj`g`w?Z?x+=Qa`Z-^3%#H|AmlGw8S|W|g>-%!=|%1UFnW z!ovBRIl&+jaajR`XZp>l=^vdxd3NTUL7h1{H9d1~`dq|ebet5g$J0svOfn&evM_xk zCke6)Y>cj%tdxPJys*XMjznC{iphkv&ZTRcIbnTw-v9Qc!$Yz7P<~`+e0b>c3%evY zXqu?mQtRsuz@GVGejf=ahVckoi^UvZnnR)ho&Warcv2R4cHycZvT?R9X{aHIl@%!| z&ap|EP1a2DcvxtYlauWCC^^_)-_akjww#yZ3E@gSag80!WMzew1n`LhT+(SaZMyNG zMP_mz9v-&f98kySK>l!DGkN&C9D0zguh>Sg4I>V+yX&g#w%E=@2!rA{F`f}P&hT(t zCd<#KO_<@hpU%hA^%WP#@!15&{T4kleY&PZuVynsbWXexJu1l8lx!|~BC81Lp(EMs zHPAA81oRa|K6+gcuSe6#E79Cdge}%F zk)s@!6q5?a4d-rJAIj?Xfex|@y4&a}?j$Lx8DMKAQUBO5M{tZ0f>RCm3vSwdq$1hR zV=DSN{tLW-DeIIf_OK4W3#+O6J+L^`J09m9_O01+o#07(y@2!1f%pLZc&F+mlRZ8JRJhYJOk3c|J!e=jk-~rpAd-mrhE-uZAf+5S`^%F zq?qT?YN}glwPE{vDs7uFcI+*9R1fc)$E4=%&nb`I#lfSr>Cr{(vUA<12);PIl}}YF zWjbP0vo*4H2Y(N$v^1g8b-(#7U+z~arPJPOd9qohw!KAL>d@e!Qr1^#G5Za&XFNRhU%?&)NtBlfbOR~Hd{D1g2c+}+ZmiIPGTg2|Vzw?aJwpN8EC2VV? z4A_v`v}J7T;Bh;)ZMh!e347fh&p~9v;9npX&`zX4-cxJ4kmQ6Mrm5h03(oD`g#~oO z@fKRZBAqk&?(JT!HEb~NU$ERbp3^rK!JQC>Y;}Jq~gWki{EhCaxr|O6Kz;nSQj=r-;vJm*NXsOb_Do~V+@&D?Xp=l+0Ryu5VoQL8pIS&F=@MGkA>BYN8rojOu=0Ha%HstAUv zA9enq9NMdg_Lf4UAbHihqwEdq-f+pg`_{3l2ek!ny;^AwK1FVF@D5p_{aVMEPLEZX zP?=$MhFuCiVImc8%i`?&Tmu<+!VH+m#QQ(~I8*d4U(rVnf6=3lTL*M4|f+dreV zpS^Q@rR9YOW2Kf+jTv2CXV~_H*i(4am|E&7bwo{v;0`jl($cO42OsTz z82SCh-@RFCnY`lyk5axxL3ed+?eyY#jT#4UhPr?W81oEulV`D-HGxr`9<4AvWoDPo z>{`0;n@hjE^y|xy8Nda;qPw-eeZ_rx-+|?UKli;-@dZ9PrTYdd-DAsS@ut>!c+s`e zKKx*z)IO&9$5w4FpT&x#9zIZ1^zg(J=A~6%;NCm$z4KAxv9G_Gh9Ni*zN_ z{h@QUcc%$;Ejm|yon>EG_l1`-kA3@Bf-jVVBYJS8*!4L0Qia`Lyi`1^^&VY3zS6m` zI9BRBqy-LD{C#Erpza@h&|SQyM~-}cQIDK{;y<(6+WXm6y>+<4?k(;q?$CMycOg;-9IGo4%<|pdR+q6Ca<@!Usy-V;T|q8|_=6c2=mKG8NXT z@Dl%Eszi;HsTXzX#pS@VT%x9)kq*XLMGn&W@26*RI9>mGK7p9FrwAj1m6rAoTvZ1^ zYqI&&{lR@WaB7VB*+cye7@g%%2U<#dvyNn3klhR4XK`OK+Bhwd%nP1Z&hptpJ*oj>FWf3gkF+ zU^9k&`wE7zonIsOUlIFvH2styX#AF|%AjE1;+6ZU4^vv-XsLa_hFZVs4Qm5apPwuB lp43p+bEgZVKFU8wFjNBAga9dM=muH}mYyJ|LysAMbq*=JWebpPik3c4k)j zY-?*%4gSyT?@YFRpr+>gQrQ3JA!FU6`@A(ZFRq!a5jA36swTZ|X5Bhz*QRRIt{K<5 zn%bJa8sU0!ji`&c-sGZGGj)o(LF*ZH3(rh_vPLwBM$sgiUsn74b)rSIYP(IW*Y*an zQQMouW^Hc~TeZDSY}fVW|iV#XcRfUmVbOyXdfEiB54)^F!huZQm>I)AnKUSZ&`g9;fXG#N)O7 zpg5v!pXk!IUvz7`NAzmDPxNbhKn!YoNCdP!EJkemHS5rxQ4zGY7!%{#4v7hEPl}`3 zo)XjAJ|En- z+J3rthPIz6{$AV963^E5bHsDC{g8Or9!IJ@&lAtLwRnMep^o<=@nUU1B3`2Hmx_PT z_RGXSYWttWKWqEt;uYF{rFfOLUoBpv?bnLeY5Vo!4cdOAc$2o@EZ(B+w~DuE`|aW# z+J2{amu;)|yj%Q>t;Ku9ziRuv;@`CWKJo9`e!uvDwm&HTL)#w`AJ+Cq#7DLLG4XM2 ze?ojx+n*Aj*7j$_XSMw~@p)~3L3~l$mql6IUlL!^*WkOFSY$E z@oQ~Y#1(C?h)1>k8}VD)R_*zn_`R*gAH*NE{U`BfZU2w>i?;t){MEJ}S|@7oTgP-Q zw2SFFXgAaK&>p56pc|QPf^KHI1-g~#Ht6+CZ-CZM64;yY(@zuFTkzY;;%|fAZfn_o z=pFd&v>EK{@VlPrUC=i$eIxX4ruRVK#PrS3w=lgI`c|fIgT9^VJD~4m`Z3UVF?~0* zm+5`b`A5A?lE-v@oz)>fZ97VLhT!G0Wm4>0|B=m(iT0_|hE z3);_gH*^ovz0iG3_d^dbJqSI-bO3so=@IBrri0L9Opil{n4W;1Wcn!d6w}kt$C#dh zK5lEPPfmcHv>EJE_{}nX8am8$1UkyJfQ~U8hfXj(2c2a44D>wHDd;rQ8R#t2IcWWC zgnd^2Sa=?~z;qG1#PkC6BGXII%S;>4=WK2D$$78~HiLZ;ze`L%0s8Nlej@afn0_+! zQ<#1#^i!FB8uZhceme9sn0_Yo-!uIz=w~zi9O&mV{SfrSOg|6$`Aok6`h`rt2>QiL zKLY&{re6yEQd?Vn@(*DDU^Cb+!|xxN{wL^vX8PsOFK7A{(640rRnV_y`Zdt6W%_l{ zuV?xV&~Ie=P0(*<`Yq6JW%_NC-^293LciD6R-gPE z*!%2fD(rv9@BMZh*dM^}gG~Pi^oN-KF!V>5{wVavnEp8QCz$>u^rx8qH1ubf{w(z8 znEpKU=b8Qj^cR`F3|(gWOVD3t`YX_1W%_H-UuXIo(BHJR)h8y{f7%T8f8qDvOn(dd z+f084`nybj5BmE|{{Z@jO#cY_$4vhO`ln3)4EpCx{{s4#O#ce{*GyNSuQ0s={V3DF zf&LBCzlHuC)4zxQ1Ji$m{*yf>tUmcO*#EFNe}VpArvLg-E#6M8w@cXT@T+Co1zpFq z8@irp4|IcFChSK1npk)^zG1hFnuTVW0<}R`fjGZ&|aqZ zLGNd6Iso0ybO&@Ni+>RM5YzWS-^=3P2Ys07$3oxF;y(`h0b5&r@_4WZS(+ozKBl{% z{Y-a5_b}ZH-N$r4^Z?U?&_hfIpoi@`z#hSGl<6S!7>hp+9b$R{dXmLI3hnqGwPG52 znuQ;O*6-S|kK=cOg`b2zX=|%bPJuc8NUb;x?f4_LA_DFBBeg<6JN`(mh(kO6NUfNI zcKnfAaR%D)M`}e1I&Iehb_TyJ(>Z9z|ELvt=mHBbLYJ6cfOhV{zt8NBDCXw)QTrVJN`$lcq+8xZ`6vXLp%OPt#~H1<8Rc8 zXF)%k)!{kN&t>`{Xvg2E70-iyJ_~;V^b47O5wzoP)QU%-9e<-%ycF8;Eo$Lg)H2_q zR{RsR<6G2C4b%roROJWv0IZ{Z%$!d=2{R zOn(Df`wy^9{Qi@r|1aqOX7RrT{cWbd1N~hV|9jBiXZi=wKeXdpeexr)AKMJ}Pw@LG zOY<}6pELan=wCAZE9hS{U4gDJeFgdo(<{&`Og{?k_!G6_x6qD1Q7e8A?f4V5;*ZdO zV(I@3?f4S4;xEvSFHtN0`jCtH5-#`>F6K+PgbP~x5~@#J!VTv56E5L_ZqQ}A;7_=q zZ2!b1nxP$k!X;Xv9e=_l)(KdKh|y=~3uWri0KyrpKVinGQiuFg*!< zl<6sG$KP;?W6;M~_zd)MrcXd?e*^X@{AOABY3MN15$LF`tv(T8F`L1Tk$*e`7c`&an=n&}Gk6{c69A7%PC(7$E+chJ9Q`VY{5Wcp9ge`flB zp#Q@3|3d#&>pJX>)UmyhI#CPlV&QerZl>#@Jxn)1H!|G>-OO|gbgQjZpVWyqu=O^B zy#c?COmBkT%=8xMtxRu&-p=$6=p9V&gm%^|>csWXj(<@nc0u33;@=3po9R8!H!*!P z^es&9g}#;P+n}Abi#l;T^zAJC4(L0Xehl=FD%nGQmaF+C0)VtN94lIf$+Q%p}oA7gq3`Z&`k zpieS=3VN35)6ik2BhXQ%1$2z*ICO&PIp`$QXQ1bqPC=(_ZS_e8ENe5^IsDEtorlgd zU4Sk!U4mX1Akx>2uKMnZ5vhk?Bj&mzaJ6^xrZ4MCd0m{bcB;F#S~Mr!oC> z=x69>aUIq&>X>g)hqa74$G5QhzdgML2KFMxgl(=UX65z{Y*euU|l zK);mfe}H}&)BgzlPfY(a^vjuk1@tSJekJs)n0__%YnXm5^y`>@J@gxxek1gon0_<# zTWoFh$y>qRW;57t$L}3XzZ3dhOurlYUzmOm^uIFwUg&>g`hC#vWBT8r-_P_1pg+j; ze?WhT=?_DHgz1k$e~jsmLw|zlPeMC;C3WJ{(4S%9pN0M$)1Qa_f~~DS`6Ae5o53#Q z_a&yk4E+_RzY6^|roRsT4W_>d{Y|D#=>KH;zo7q{>2E=Qo9XXBf0ya+L4Ti({U1R8 zkcIyU`o~QF1p22;{|x%)O#cG!4am!LrssV6E3|!^>Q+SvTVW+ZdC1Z+aY#8{&k98>=Ar**U@9 zg5OrAw?S`bdI$7Qrmus(p6OlCH!yu8^lqm2K;Ojl&Cs_ny%+jcrf-A3o#{KE?_~Nh z(04I?H?)`OebD=vJ^f*fQq4ng0;^u5scGJPNPVWuAo{aB{&hj!LL z+~NUfXAQ(H9)xz*K-|Iy?W}>gg&$h4fxzy;&sqO)WBtR;)<4{00D6FxKL|aTa1G_K8jmRKs!E)TO5TxYNvrch2J#O$Dn7JJ`R0?>66f>n4X0` z&2$(#!gLf`Fdc)AGo64=Fg*vI)N_;@`z>zfv$(O};&yx%*ctq?EPW0-XKSlZ&Vo5U zi(3?+i*_8?CHxkcUW8s^dKuba`W*CmrY}HWVEQ7o zFdH?(dZC()UL_li5rGvTlr;g;^KLW>aR9h~@IJXt)>?BX6iP8)j!S;dE?v)@+)cO=m?ZCGD2k*|Vi^$_iOO zJIg9MJNt&3M`hjqbaww-HXYla$Sm#ejuqyM+1&pAY%!Mdc4f2k$xLE@S2#K!%ZU98 zvCP8$R5G$Zw_KddW;*w^ckC}Di!pBw5yFXBVSg@}+dqqFBAee&P^M2&6AJrh3pug0 zFSnepN4e@h(s;BL|9MKyHyWCs)c1`ITfS1aCBM-Q|Nrd4R@s9+OVLhk5?G0&Zy29a<>GJskW>b2KvXD!Km%X`cp;(CKlewa?gJN}CAwh(MCVq*(QbMo;n;k-G;eykETcXWp2IzF)_2k0x=1*m zH|x6aUt?<|nqSTpy@hNlocD@YA(_bFuCZ}QVLTxeHX9p)p6k-cZ=p6P)8=jZhpvzmkAV;-qh-71PX>THGG;}Ge&yOC<=A*IF5_*gbV_PJj3}@aUQnoCB* zRGJ;dhN_30n8ji~87WDRfqF|q|Xrz%w@>rE$9 zn3nR(7$?g6H1<>_9?5!#?HB3L?V`! z_p7>&J{G~ZI)W@W?A$8exm*S-9mxV_&SVO$=nsx`^9XA8NoL})JjNm>lp<;~ zPqWW}MKPlgZIh+t@_1p1s$t$H8ya-9x+4nN5~g);B$h~KGO|(eWGZH;J0f(|Al188 zs%TcksCTWnehFG-xrOCIF_un73wXAm*pQZL?C4PMV&`HuKVP7+qhooeI;Rx&L@c+* z(`9=-k&;62b-E@MYsd98lDQ7`EIY)-Jw{{HTM}XQux#{uC%b*h^hDuUNcYC$_mMBP z+alg*HXXqeKzL=fyfOO)$=Geh^!n`xvVvay24%`T1s>9-$4`c_*&<$CD!h?~(|GzC zo2^g|%?3`Mq7o$RsM=r$)b`%CzYr zhaNIoH1&o{MvEQ&kk>bf{!+QaW4BXC(@G)z_;ArqA(d~UDop35!X|kb#)Vaq4D0SO zT6Ia@WFl*{QZ;1YKp*ZyClu2;ONp7Bg_R0CY%*lm|DaQUX<8{VmQPDXjrdj1Ibq5Z z)nQ6eEs(BbANq}jLFq8mnT1KUo`=C-G}h~+R_mSAs(w0HDkn822RTZe)R+tu(D@^V ztY}pX1*&5lS{(y`$555ll|U&HY+4mVHe}PPNb*WStXOJnWs?qS^9JuyRIAl%kvw#%hZ& zsjPmWFfT5lHL@t!>s&t-quqNZR~4h(I~cUeNmGXU3omWS?x%ZIdzN<=#O3Vnt!ICdy&`hH$AoNS_lTif5i5t03KeNe-xP10kaU z{|bS%%HZ$rwpJM|hUcxturw95qIvvQtj!={FW&akNxWb#&?3oZg!<(Beid9DQ(l}k zF(urfVixdVlzxf4z8h4AAx4^_v1l?yb#C(a_y+=1YlmYUMswI!e3`$^m94oGUoOHm zSUiH(Q|?`w;qBOBevAxwWZvwYtVugYWzYDCceG#D1&W1rRE2dIZ8|KcMroT)86>U4 z3#-CItHKvog-=NhuOyCDhGZ6AN$5W4gS#q8V8$@ zHeJdji_6|ZE=JG)O-N(0kjlQoaKTx_=A=Y>WSLxfPQNourZp;supz^ zjsD=MYEp+;ABCs5ykyq<>2D)+p#XnXn2kV|*@h*n0v6El!yZN6Z1a;2kv5v6rLZ?^ zmDuc`^m#|ARI@Hxip0!1zxr>qgw;Av6nAtnTQVAjH*PuPjosc}%O!6S=vn(k-e~FW z@#}YZvjOkf@pKq3DJ_^Y1l}~3)j(~*#L?X&-B)@0wNaQ6%V$Yb=uFS}s2avN$s9FZ z-J^cQ%to=zGw&^6@TRdu)}4*Y-576(bh914lujAVcHs1I!1Rc0u@F0ph39TE43Egu zc=2?P({Ql}W;i14W*yE*=ghk9PL_$Q?A2vSs5B61G-63s#cDSid-5q25A$FQ!zUb3^=XRX zHL4g+{?6Bjk3E6ekH1>ASuB)cAL$B9q(Q&Jbyj~~0O5pBmrL?o&eXZ1X zgjSsc?TG34N^W#Q?F1X07&fx|5M$U1?9hGKv8F+GAFd6t`>;C1F2(M{tB2Zs*dd44 zwfgX?fp#CR3A78g`|z3(>^|(UcK_^7uyz%#K18UUquqxL*?ril`><2@Vdt6#*?qV+ z#O}lD5W8Tz53e3-_hIMX>cguB+I_et&@R~S!)r#c`>?aR4=rhrLr6PEyAK^?HYAeq zBJD5r*_Jzz>X4pVU!WrxGNFmh`KV8{LL%#w<4(a=?GV8pAM^TUuz;C zmb=~sFBa^vFx_X%J}H|Lg={znXQ30v5E7wLUr^b&J&Nu} z@cHwx95yA))_#)XBbyj)Boi@v>2G z0kt+-X?MYvZ7MXjB-`S}%4(YmwlvmOZ>$bqv;A>nb^JBqTUVu5dvMFf)>X+Yyq?AG zkkwhw;&pgYpPed3JeJACBJlpOowk65fE>Da4&c?) z=N%aK^%+en-z2>0l+mOz8c_Bo#ph!S*dq4M$-I}1O)7kdSU<51DxQ4jDHXi)r8(?( zsaV5Ah9ucVabkI#2FMh{5xHl$?6tfwW0#7L4WX-sZl<)!B6m7BQxO9b95$<%*e1%y z=8a|*1G_^~w5X6=B%MpiHFOmewA3CICPxT%J9#1Ar9v!^4JTudimze}SCyz^Y;^L- z<5gxUhw~0jB8{9_cGFob8?pLWXjQ#iMWxxI3}z zj(tVkomeWzej>HDB%IQ_1$&lGFS4^jhNwI7;^iK>2CI-5X84bxu+M7#8 z;Ij{O4J*rZC8H(NHQ=8#b|mp)EjQWJ5=b_KSG|HaR!W799RqmDmb-0g0mKUFnGE2J zRPsy$sR#RvMp(36YBWNVX*R2O8w~tpblz-MZ#Tmv>Jd_u@0`hD>u(xIvasGTp#Gw+ znRwQVoi@}}S~CMdqZPY`ILwD3rk>=j14?3$Nol&(O=P<1{%KMQ(*m}Nn-uc;{Fo1s z2hPJp!UbA2L>^3{Jvag88VLFfPttnT^bC+Mg0KRX1qMP`e}m;+h+!!(oEJt5koTyi zOxKw(-XsUZX`|^(7^^^eRn?}!Z~;q`%5FS^oK?RVjf2QrnWpoEXwnFO@@Yc!EoBdiTJ=F4QJq?RLajgyfgR>q7iFmRv-OJm`MB(7=+ z>pn$?b}KqUv^j;x#96QOQLyJ7NCuK)Ug@MjPzbGGS|Q^qWW5z4=XnB@Zd`+HR4aLe zD<_XCzc`B zXbYv4=TvaSw1wiz<0%7OW?d?q#rj@gbQIe=sT@vYWTPc@nxiEU#L){|d1!$QzHxvi zAKXYZ9bq}ZLahQbcLmH0sbOYF)_2jm@c2 z6t1Ngr~cCLT;*Fp!Pp!ih@*iL_A0nFWu(L20@l$E?`v95A*9W`=#<5LVTy za4U=5(P6Z*Sdg32YC$<4E;wtxn}!+l({aC>*2cr!Z=aY^U3}BpWUHc>Zak^NhS`t~ zCsVmRHZmI1;rUoHBVtQt<1owtX&M{gZWZB{MUweMI+lcwvH|XvBwY?kM{{$rm^^@v zBb;;DMZ}2)s|d=$qNgm&^rVv+c~IZ<3|odfoy2;j=^jqzM?bf_#TjlS{5qpm20OA|hAx(jdWok>rqr2u*pzyt*N6U1CzojLVt9C9nyhpd zCtdI}8-^_lJ%Y^>Z=sMtk6^#V8w&NIX1OHWVnp6p=bpn86izIrHr$%S)-7idEaMY_ zA>+U$AtH?%EFu?y?0Jg43*R79%JqY*24h$%$GJXT@M0Q3b3z!8=-oVbjAq`PHUD*ITs6DF(agh81eq{Cw$TX#sJ3|AU%h-(-Z zswor3xo!CsM5oa-;u{D}klm08V?!9PwMN5;51YZT%=%1NPI6}bi27?ZWFq#wHPU5w zVkR0ve+$Di;_n)e2j`nJ(L@Sc=c*%{NBn&OY@17Ax-wBLPmlP~%1jh{5p^T}kPo@S z4=iNTa2TaW7#bN4qU2aHD&iM8im6l#V|T zlh=WmY-?QxR~)s&^)}rZdh8WHAGWHN1(Y>n(MkW!s zMHzgcLSK9|js)d#FL)d1*}Uvoj2~B~h$}rZ5j5PehazYquCCZ zfz5WH46*V;9}&fYc8c4+Dles3UhS$NE3bA{iYJ?(-CxgWA07N!pG{y(q!>;v!t;^S z$NJGe?2Jq}pe>8x9t~&k;gRZG--H9s6`Wq^Wa}v2`v=*!inycK#~49ir>rfjLUoQrEp>AFDeKGTM2- zv~$2YPn*KD>AenxY18{0dY{pdO{w9Exp6e0#%m|;75S0TsQk!CKK61ExqsV2 zUUzl67-7js_>Y=c$T%`Di@=aXRzMLsZtHSkf%z`z>&6oe?+kJY>mKzzNlUOwSz-59 zg^_B&nIvnb!J#B-izkQGPE}G6>z~qSun0V73$>f>TyhDsnmefecyjXzxx#PO=kOsx zsbJOz>2G5$lZMMw#9@_PI8Ct}&*syZJ~HxP2o~6qbPNM!>#xY@>^1uy`#5d@~Ar;(J6>K)iZx0jsSm7+bPnBOA!VZmLPRHwl>4LLwcyfg} z`Ww9)4E0I_4Jlv?J7FS3z93?OnhwjTSWVUu7@4BQ;kaHcPKX={R+yYpO!wJ2>@1t^ zG5N>voV7>XnDtEBWDzf|j>3~TXl$|qy|h3ond#2MofY^aPp+Hparwt+%HuE*oKHDf zHI4VH(+<-1x!1)-I7Q*Qm zvo2qXESq)X_%Bl9zup|aTxgJ5S@nhRlJpPiL%wP09yF1rz9XhO*#jve*(ll!kp%xBK zBfPd)ZW*W4&Bl;6-Gy{2a|SsK2Sx^wUs?`uC=7AbG6P?!E;KTL_kcnMZ*!Sq+-#Em zSfP~1kq)v$WP9+9fqKjH;M)TAj@N{>yA005d9g9lgp*s^w)x?M4wts(hZ)Bf3O)x` zUGE851HZXYnDfrZmJ4{;8%oGd1~i&Op?=lN_=^rfH1+)nIs}}|jq{0*~PX}lDxpTteG+&b0>&$K9g{s}+k{$e!eUBqS@)>g5ZFyRksWj13i zH;s=U1iII3o`4vK7{b;`V=-YbmNZWE(SpYTv#mIXLpOL}6tOFUTDh@`QN*7KtVzd= zCVc&Pwj|eyG09Afj*m_DNZYKFpGuf@@*@e@Ir&tY2;!;a!9F)4U{=LOw=@u1M8oSQ zCeU(svACSWsGpcP7Q{D@#S%V)$)gKYiq?rqZx@qJsJs(dsFdqVkx~XR)JCi!4y*umYsa8?vq73ZEcaqdCcR;KcppDtlybkb}@$dda0)oeu8OE^cE z!#!WhSYN_eag>iH= zG%-Gkqh1SY!ol@AN@ojA*J3A@_@_Ft#1Bh;uYBKud$DxY0>qRIlWje4sJ)ZIY$bER z%Ku`xh$p`4^`c*IQV!kY5|kWpl>*DFX8A9tq6)#X?DLLDWytU-x1$F6XqV ziC)ZUjf+e8x>RHr3(}mjOxIF-yXl&4Z#VYBk~?zr-DFHI!07J|3wj-9FQWe6v6^LG zg++Or38Psi(PBx&A|-W38jk9;BTV-aj#Mt0?rHU>ZYiEjn03?muhG0D54zoV54r?y z!n8cc`zsXt3bHj5*a%l7?w%$kZV0xy9G`q799(=~(txQ$pW9yi@H@{iGA z;IXToU=1_2)np{okvy$-G|ezub37I_$0Jj1+SJWp5#HD$ZMOVK-}HHARK-vqX~=us zGTQHS86HDbAA!BB+XU7vj^n!Dy@&lz<|GJB-9haKYnrFVYcA32|G!+ z*9-ikvrWFWY_E>E7rEP=VDYVw)xhammz+Y_;NLv7)~E0FesV zjPv=0oRcv@e_$XKTm^Tj2^_D8rJQmgrDNxe79J{HO1Lj9bi4eg7^I7U#~WUFoMhYO zKgBRE1A0e8Ar`Pny$R@us#=@W8$mVOh36~&0S|8$>sj_V)iI16@$lk2_M`H6wBqYn zmj8}k3K?G$(iTq@`5n~O8<-ekDO=-devE2U^~ou!sN6Dfk|?%K&XsvM8LRlls>4Sr z>c*-wN0fR^EWCiio7uJ|D)Cjh;$IUoR^=*DTOtj2)akCazEwJr3A1(>ZG9s?>@Dai zVn-r_f7}QF|6mHfSKuLiBcsDTR}0yOqk`%z0zMMv1A1HE$mCVIjDIG)pte+43F>Sc zW(d4#V$zF;@ddI|F?F`>T7f&|?zIeDJ6?9m?d+=usq=U|$ohcUDO8=u`T?*`pRBuf&SQsP zpg-{7%O|TYd)-KNq@9E$MsDvRen284q-|#_t_l&39#^^4}s--MMy5?i%&WP}QMp zLpQ0#cwH4WoHnU-`D%8fd>uU_zkv_P~IJO3@ z$2$s+YU-rM_4zzL1;TKS%a6UB05#iRKR({A0(%2hPem2jRtRVKT-O%zjmVkS`gho9 z^+q|8a;Zica`i?n#1g@?pinH~m=)^}EIchHSuU-isR1U}BNSh-Ii;)*tpXcy;7FbB za^h^9ScA6U1sRTulMywk6u}Cvldx^F3+uR!-i4P&92zWOp|#pgkVE%RI~EFYys%$o zWNx3b->00+Fuk|`X$Rhe7Vu5}n!$W$ov{lqt5#vv&WbE7e|jDM4Z7|6m90A8d{~C= zsP@}?>??B;pFK_cdx8@Kqa&e_JDcRcCKxXjOL_cjf_eE57@GB1On^I{uao~Kp899} zt$d>TGjuq-k%yChgUDTv3`)KpyS)~)+d z&CNfo+4Y;c+I3qWy7M&r{!W^cu#NJEW#{X@pvx0W~DTWM6Jsm8tO5%1ee z<;@RNniXlOac_KN*V`w{o9?f)D$-Wt-hKIY-{rBRkHQcJmwi|*2wMQ&tdw<3F3 z%WhKSW+Ge48}7Msiz0h#+*|A(x>b?eYTP?6@9F%|q4Lgw%Iyl>;UufvsmNnkvbz+y zn@?%3(zw%i4Os zB9G%0dO)Gav%(%!t<}FhgdII>qFD8pDed^R{DtbgXya|Kx~k+ zAz}eAJ?e&ujc_(fEXdgyv2o5q#3sP>n4Khc6iko4DPq%L+b{2K|IpU*j=stgyr%L7Bla*P5m{b@H6T~g<^h1=G0Mq>yBZiw@-w!JZVsl`- zF7LhnQ-{hoj8&2Z&j9KUnpT=zUf$Hmgs5F+b{1QyBv;}??_a_L?fWLUEVi( zc~+Efk5!^X1?XLuJC9vXX3BSGD>0(+>Kqb8=Rn!;BzOi;-&ZU11XF;ztJ1_WV9t2R z63hWQO+8C652$bH0@;U#Vi7PsRHDQLj~62r=kXH6<~U0dJHy#Lu@soTPHAEp7H=g> zEXP>oEHSuvPTLB^iacJ4*aByZ#FjW)R_ux)*-I?X=p3>0VB5;}4S#{)MIP}Iu_JXn zqE9(~SGua8pI~>=1&1^Wp01MV!_bKL;JLBQ+E_EbAWFi@3znBYhi93>d!aAl0( zIG|Hdh~PvOoFsU(3QiH6=6P0*5uB-l#|fUON`8{yDL|)1vjk69B@Yvf0O~6gB_=qF z5sPz{AU4NYlGqtA=jzTAO!0_mVj0e|#B!XSC59IbC&QHj!6Jv162S$YdXd-?XUoKl zs>J6Ap09!z2wnu-Ubfw+O9YR&S&#YD>&BHXu(pRS@7_M0bFS$y!I3IBN-zlMRC|ozIN-*YST8prViSz5OcFcFSY?XXG-t<%&4B5q z94B^yvy;S5f$0G@OYAgfVPX-mt!3MxixL!7Fh($51rr440QD6}5<3I7;U(6CW1d)w z$4e8-fa$Ku63c9yGU$_vt?oiV=L!~ zod=UWBUceB7l>VC@hX>y9r3Vs_|#&{l`b$n6#T@x!E_(=5bNb>`-t^}={s+L*dUKL zL@dDBFtHIZebq;a1;O-PGDd8ivk1%nM*av?OZl#W z%g0WY_s&+*L^C{QmRJrD;Cx_+AC1OXgxVO8km+5>BG!=rf_W6l+gWg8fbroo&_9V0jcs4I1x*a9cMI|JqnPGTv}(!?@gdREC2%W-y=82*=7oZ(s^R}chDlSB{2PrSSDtGId|hZg6DaL7l>Wt8D1iGq>*LlQ!CF`y1;aXD}I9AfYhxLIYwN3b7|O(O$D2SFW= zbckR8P(QbZiH(5ip*Bh^2u1^4t?rEx9S3!0mJq>-DmY2-Xm$E2qSK&vmGwH{F`_e| z`l25vcA_fNlLSuz>MJ};>@;U#Vi7R?IE)e#U~B@85smYh31V|#_G5e{N$d=m?zVYi zDKLAWSJK2XoMnmSz;vz862t!jmNNzm#EM{gHZBoc0Mp}Qk=PPXyG+ag(=9$n>^zw6 z)(gZg@_3hs9cgBl-={X@u5^Lv{QSha!E{}Ei1mWmeO2ir)(@uJF+gk(%)Vb&hKL2g zbp3{jjezMs9VHe7)8&p48|P_5#3neKBzBauDPq%L?6y2cbOuznm|_{Oq={vChFM}c zp5a+y_}^b+H7pP;0_qD;BDTQUBC#bfeNmQ)8DP#NdXC_EKz)@j5W5I=eHr^EYMJ~J z!6VoN*0-3ig{DQ${KUG!ocXhdU@zbeWqTW_k6=F_yX6On4uUd2YKUk6lue<-L`OjF znQ>*5SP;w}%9Sx<<1Ah!L~H^~H++)VQ7}CfOc9&r>=>~b&W;m1!P!Y-r@-`}oh5df zvoNs;n67h_m;iGg4>5vqKAUFr8hj)_L88GMJG*2)Ect`m_=yG(fd}p$fCYk}& z^Ffwa4$SU|m9xb1V7f5{Vns0hxT};1E>yuqf=evN$}%wnOkaX?#Lk21+FT%Z5lqi^ zmxvu{W$}FKP{NfiFlXrb33dbOLVAexg4xZh^bzal@dk(ug4yG%GDIu@<`gnaa0Jll z?oon4K<9oNBRCFdU#yi7u?aAJQ%@2*%GngLX)s;wW5i}SJ5KBbXD5lB0&^-eOYk(H zE;vjq0;c;bN=$GTBNpc@L2M3eZ~5+_%g0ZbZw*(HM9+ZgOFB<11*S_*6U*>;SzAR&stO#absg)A31;#3i#FoHx>z0WbV0w6+BX%B4&z~2FT?EtJe~H);9E8#B z@U_vb2&UutiFJeNa(jsNg6SExk61sLuFC+iK``CkAz}eAS%zAK8YVUZrt30FENI13 z$9u+zjr06M#3sP>%{@u%D41R6l__G=V9pJHjNlBQJ*F$iiJbt`op6%aDb8kzod(m5 z3locg=>ZcZCV0FUu{e*HAT|ePSGtlUc80TgVkt1);54xenC|>6u^eY-iRHm`{R+g2 z7CTsOJy0nTTL9B#ED~E{`K>GyGr)A6&k;Khru**#v5TBtB6egw8>l{Y5bH`8n696n zST~q1qlZ{8m@_Bz5$p%lqjG@QAWu9*EKrqrnBWLcJW4Fc6OR!a2XiLT5W$J69484L z1=Kg<6tQW}juD$-Y~?ty6JWX@P7*r>rmx8?vD2J|iA6Yz5)+)oh{ZWe5Ss(jU6>?x zhR2&Hmf|c;EW^`giRCyuOAJQ|opuz66*(&rTi|Sw*b-;U#0<{P5j)S=$^~Kc^c5#>Z$mNb%Qx$kXSF6^W^L!*bk^L`T(&(o_L5@fX5pqHUg$E z@F=k$n6Ativ2mVXh}Z;Ylf;g4Hbrcjvtz_&I6F@41el)OP7*r>rk_-^#7;9-2@{Ke z>5h&P6JWXnW5nV-UV_*hm>&2^VrO{Td15Ir{lrKU%YfH3@_cAm$(K(WQ8AIuq;0|W%0;rCctzVF=BBrdr(&r z#OA&S@54be33};zlInK@!!~Zh5Q|AJ)BABjUiP!>|-Hys4u_Z8F zzhzrENoCYlAobbfwf-C%ZpD?P+|8LRXW>j%^A z7$7zXrt3UJEC8mj+c2>aFx}o!VnH5njMzA5Az~ApO%glG^P3_z4W@6dW5i}SJ5KBb znC^p<#7==Zt1q(zPXp@4g^5MLi6o?ghekEcHJl-O)B{1EC%ft*Y-CO5~odI&puc3rr6qKe2AkdWiLc*&SHvBi7I2tqc$w1k>dX5etCn z+j^MT2xp_jf?$r@H%4$AP**TSYywPIW|G)Z9&d`+G??zeW5i}SJ5KBbnDg3llHjQ- zI7{#}PaP%}0n^tcN=$GTBNhkKwN4P5<19(+446IMR_2MNc)T>R3};zlIhM9^mRKIl z8H2=%oRx?z@U)A>mcaDvu}sVWb1u_4g69GCjdOw6MKC=UE)hF|PdsF2sRdZy7McdZ z>;_l-#Ja)QUPBMjUQm5O`-t^(Hb86;OqV=FEC6N?q?KV}BRuUWu^^ak$r!P5Ft+F% zB02%8OPM5g6wEHAGDU0}Oty^L282g3Y#cl5#*GSLi^M_A z3SoVa9T#g=4DZTpb8x+4a2wfz^G3xmjq2uAHY0M-6~c!~%yYg$F?_1zq};6#zEyIZ&6^aunWwyRi(-4L8gQ#(xABL=?F!w& zrsF#mc?{40E`{#q{peL_AAc(ESLgtb)viznkJYKrL0*SL3gN3I=b3e{LilWnb^l?- z@ZpkkHSbplUoJW50fq48l5^ss@}Oe!+a-3(`qn8bzg}V+qkf|5`z7m;C%#`&G3ED5 ztU7%}l5OsYu}O`7sk4u3@6` zYbK{gQG)VwCU%3xh{_L|oOa@qCY7!Hq{(@pBniq-n%Hi{JW=^k6RSa*sQjwQx&N{R z!TsJ?8nk1?MkCckXb^Y#T| z^1~*l@Jj^chfTWkeYG@7!JG>D3Cb^7#KV literal 0 HcmV?d00001 diff --git a/Backend/venv/lib/python3.12/site-packages/pip/_vendor/pkg_resources/__pycache__/__init__.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/pip/_vendor/pkg_resources/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..aa9399b28d4da51c5e9e6110f1b012985a269a73 GIT binary patch literal 161524 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 f=(EIamOXOk@@EX*H_yhHc;{v`(h>PV8pz(rF6 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 literal 0 HcmV?d00001 diff --git a/Backend/venv/lib/python3.12/site-packages/pip/_vendor/pygments/__pycache__/__init__.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/pip/_vendor/pygments/__pycache__/__init__.cpython-312.pyc index 5e03fadf4dca5de3c89036895ab710ca9c65bd13..a6b2851491a5989913fa45705dfbe87ec33c1b7a 100644 GIT binary patch delta 20 acmZ1@y+)e*G%qg~0}$vs8*k)Z$O`~7)C86Q delta 20 acmZ1@y+)e*G%qg~0}wngP}<17kQV?q@&zRT diff --git a/Backend/venv/lib/python3.12/site-packages/pip/_vendor/pygments/__pycache__/__main__.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/pip/_vendor/pygments/__pycache__/__main__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c28b7cf1f411a49d14fd2bd540767f1c53fb305e GIT binary patch literal 746 zcmZ`$J8u&~5Z?7&uyF_^5(tVED?$-V+^yp%6c$2?ok+F<;o(rk1?RJGId6P-d)nPN zJ_-a44A#X4 zhVQ5fq^fy@LPi6L9y5*_jWCjJ79hhv?$&6SBSf*q!iZD1EsLl;aZw?kzhM;eg%#9{ zkZcolZ#)H(#P+WvK?quXxK+9Ppk@w=W^H{qf>jr2-aI5+hUvwo3$7BjNE#s%Z2hc=97^$U)|&&zxP4+~VgIb+VVJDs`km z2!EwAQ14#^aQX)@j&u#q9_Z(um0wn#S6*+uTi9QGzxd|ScYXfPLHf#X08gb~-G8x> Yw3r=;3#!}Ot4rYX<<)8JOBO2q7YK~U>Hq)$ literal 0 HcmV?d00001 diff --git a/Backend/venv/lib/python3.12/site-packages/pip/_vendor/pygments/__pycache__/console.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/pip/_vendor/pygments/__pycache__/console.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..7507fe570de39e15e6df58ce7b3a31e083e6ed90 GIT binary patch literal 2645 zcmbVN%}*Og6rcUF*It|OO@OA|5}d{mYy#wqM5!QzrXryqG#As>ti2PnVDGxSYl0n8 z*;1uCYNgmxq_{Uy_0TBy{sX;K>IJJ*a#uYd^~8;mTQ2RJ-33wFG)+g^nfH62^WMz7 z{V^EyBN#(hMwRb82>nLD-r!u~X+MR~LnNaZlBpP_pcpOF7`{uOfGL?Nkd>BM7jrK5 zxY+Ar-o-u_`&}%!IN;)-i}keL_1soj2A9kyex0NFWyu-En5E_VPQOb*DLJ#unqAqdvommwC-d*}Ii4)XJKJ9%~y zd->>RDCU#9VfM>CFbnzK@GFJy{UVHPK9#|$X+)BmYG`R}Ge12v{5E%5(=(DOCbhJt zV;NT4K-6+(HfKg0o$;iW&Fe~P(Hs}A?2+Qg@bKB8k>QauVj?e^i&%WujVhX0%A67n zjKztYA6$Fq{ke!8YCNqZv1;IPadK|TkzarN%GKGqtKuz97iDZpO4^9{3v}5RoDw6qN52(WKSib~j{8H+beNtI#S0LL{_Pb(@0 zdUrGWWa<{mYjP;s zDGzo+!mfv7?Q;O};qo0%0f+DU^Y58}*Pui1`F2Hi1n%~tV&d&r$-Q7gN@km!_BOl# zq`wAJ62ARG?i&N&({`91B6D9LQ{=A9p~v*BP81$f7MIjyY&=F!iPAGAx~OGvG^MUa zr?9bXYT4*D&BW=UNljZ;)Kqj5%7Rrnx`Ne}Xj(}`vw3q-Q%57GN1_I7a3~83P#Pne zRkG1IsL7fRO3uZLy7wrO&0B(fcyarN=>rh_Bz#5yrXu=PXs&eKyS%}6>x7$h9}tjE zVs>&700)y>LnOI1iaedeDHGlt()(f2LokJD%V$T9FXOz$nt0VTNDxuf!?0MqEmR6v zCs9tpXY|74?5w*k^w#9M(D%*FZ_hpYxGs!tu%mz9C<_MmMmOv}l|pyvHRx0_-Gg9d zWU2=eTcwvFL!FaZdlglhLh7+KdWoFup<(WqLFP!RPh1^}_@iZ}2i+yq^CEa&DuVZa zMBra4g73KzUXZrNBuSGMH&a{>Hq6qWMOIVFLU4w*62Ntb0{1r{NN`&)oqju z3*-(hEQq%ib5WF>#wkMUi9!oA;7y5=Y3fQMXJTV~-07dh+`eaofT5C}n|4^XZ^9g~ zH3kSNk`{MJ?7W}2E#B{Khm{6xAA^n$((vFVAMi7)_d%B1f53P~4eIcRK^8TjlL}Z= zTo+)qyM<2fUzo8xQZ@_kT0cP)*dV*Q`rDBXAvsgDd@; zY?n)e%v+6YvadIU;Qe#=&Q;ES@#Y5GV>gD`aKQ4$4axRT8>k}X#&B0(`-eD+; z`km$}cBdVAn~Ka9?=NzVKvR(`CQ80WOMB%`y`>LOs?@aA+*ZL=0l=+Nkce{CUPsbs z@2Z8WGXR$AsHM?yw05RC4`{iLTK`3Hm!*yj6a`qC&ldwb9>jTz)GuwFl{@R#e`-6u zix^5M%@n7~p+;**ja#R_@>Qe7tL6UEOrx!{*0J8V{>h^g_3m)JEez~X>3W0Z$}Oeo q(!`DzYw{3n*@IV delta 20 acmZ1`xlEG#G%qg~0}wngP};~nn+E_kxdjdY diff --git a/Backend/venv/lib/python3.12/site-packages/pip/_vendor/pygments/__pycache__/formatter.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/pip/_vendor/pygments/__pycache__/formatter.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..bc962ff686ff5dab860829ec0d88e1317168df7e GIT binary patch literal 4732 zcmb7I&2QYs6({#YyZW*$e<)7k!~^9+-d0*U3Y?~!I6y2XaSB^0D&^44fy*UlcWH6S z&2VUW1vSvY2en9>1}Go|C{X8=1irYZ=G1?nmn14sgGhk@MN#DDSOp5?)ZZI^?8;UT zC9orM_~y-<_kQp99`%>W$uSMr!t(RZv(uXP4|+(iLUOZz88^F{t<^PKw{xyu*YP*+ z=DPWMUZ=T&Tj&<+McfzLdVRzmxvAAlIqeP2F5Sf3?Od#>Uhd~A<;_2jF+g zpUDnqKTS4dlAGOm7I4m9eS7WlTR&T^svT;sV{tFwHFk0JQvCkPo6E1QtiDG3GMh`& zak1yObeNTj9!<2lG@8Ee8h%gWd77RB*>}0o>>Hlh<ESFr_JJD7vw8gXU&gSj z$?V;hCKF$2TIw}1E{kdvhAr)OBD;$FRqZor==FLsBRfCb0#3r=I$*1j%H z|Mr>RAOCCViLa;Ft&@9Gb6=F_?v5YbzOs+^nngo;rS90TVP;q38o;O3bGBa3+qrt7 zt<{V8joA5m$u0nPWxH$_Z|e0?1;Q}`V0|308x`b4a|WY|_OkC?=RyX|WYWjE8Tr*It+KTa54hUN6r2T4 z*Ktjuv;&HkF9Z*IzGu^dngVmJ@m}i7s>^S1QN2QABi4~^m>5>AGBcEZW=O5Z2yjXm z$yM|Gh3lpp@>-lChlrc5gOm#Xj}}&bpktU^OhO9Ad=bSZnjcoE50OEHZcjWwyR`N zwq%WquH%_*29@|EjYcbU-C@JH>jEw?FUu4%(GO)Wl(1-)OPr3otp&^XKt~>IN*561oB)qJ@aCk#X=bD8!SGfK098~LfCvUw1Vg88nQp)< z=?SDGT|RV#H(M+{7Q;7B_D>?}cP#rNQZRAag}wPHg!sBB)QgxCfCN`g)aHP1FWj@4mZAIGAJ z1=m@JMDrS=Md4(gFSGSQ*z5U14!Mo?&m0H6sZWM{_ZEmwI5x?TE?u(Asq_s!$e|@EV-=l7U0d2UDn<`n_ULs@l^6`3^G5jRsb9VtxFPw3Bd z2V6RzDKkBrg4zcQ`$@r@YL)FAF8cwL~k{Sb@1!6_i@f>Lw zo5u$HoX)M1^bUq??cWpH%u~01^vO#fzx3(G=c9X1UEDjlyi<68?CTTk)+3)jd*_+G z6EEU<^zO;iyYGDX4(4X}PA-td-BV}&F#gf_t)JW}?43IQ)u{`gpTP9w-SMdpF8uPs z7pKpCIezY&(@*VOdjD!FdUfyA(pRUJ@7RCp{;{isA9-@8@aqXN31h4*XYfE5oqV5? zWLN9!m7H0CKo)bw`CX1i&5oH-a2X2fW=yH#ghEWcE21Y<$k51yjx?KbfkeDeL^5p@ zY%4@>;(^Fjg+#5wf@Z+q4QaB2F59I}8-<73Bz9KS!{yc07$1Y)AfZpzxV(1tO6L0p zs4ClSjhIl?gdse$2D*esTC|fI0(P{WR@}z7xyR$9paj^NGUUymuG+kZ?vxBZ8*?=^ z$2QRBY*H2HmI=i~^X z(b3pMBlHy2a=Vg`aWOu0&Zv}_7?3Kol`%_>#A`Q?X4WPjPog|E{&${jhuM(kE9xzPdNFbmzG*XU^Yg@6Eij^Tyq&8ZV(mJr^YauPaB3RLI&WAz;watj}I(<=;bz) zC9u9bb!=x$*-_C2rA=jmN(1d+7}1zvfL}shsL)D;))r)v}Q~NGAS1jLK)8XRn zOZUp!)b#cn_r|p8Exr^SML{&6wmCl$>Op5PmUE|+CQxqkH-fZ6^pdNEQaV& ze3@61FLQi`C;wmxrQ@pl89jdJd&TsD`lmsJ6NAriV(OA&TMyd*efj0sS+9r}AVQ%G y7BJk)>$?73uB;dKPiXp)e`-sA*M9uX_{`42cIo~|UZ4KYL`T<;-`8kVmj4$a_7+Y6 literal 0 HcmV?d00001 diff --git a/Backend/venv/lib/python3.12/site-packages/pip/_vendor/pygments/__pycache__/lexer.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/pip/_vendor/pygments/__pycache__/lexer.cpython-312.pyc index 7e7af94eb6b86e9a84791a9106f50224b6b688e3..0786bd414e5ea2f47a657decabc3b7f1997c52ad 100644 GIT binary patch delta 22 ccmX@RhUx4YChpU`yj%=GpzCbBk=tn+08yX@C;$Ke delta 22 ccmX@RhUx4YChpU`yj%=G@W4Q6Be&Bu09C#Qw*UYD diff --git a/Backend/venv/lib/python3.12/site-packages/pip/_vendor/pygments/__pycache__/modeline.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/pip/_vendor/pygments/__pycache__/modeline.cpython-312.pyc index 88393f131fb21cbf5540772d60b897ca22c17127..6b58bbea7201ac1d9d50b6a340dadc45cfa57ee7 100644 GIT binary patch delta 20 acmZ3>vzCYZG%qg~0}$vs8*k)RVgmp$*#qvzCYZG%qg~0}wngP}<0?#0CH~_XL9g diff --git a/Backend/venv/lib/python3.12/site-packages/pip/_vendor/pygments/__pycache__/plugin.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/pip/_vendor/pygments/__pycache__/plugin.cpython-312.pyc index 5f9591e23bca2d5c85de3d7d8c20444a48f5211d..99f6d617881897f806b9afbb1da0982daa580cd5 100644 GIT binary patch delta 20 acmca0azTXqG%qg~0}$vs8*k)x|5u*-G%qg~0}$vs8*k+P#18;L4h53{ delta 20 acmew>|5u*-G%qg~0}wngP}<1-i5~z(ECwO~ diff --git a/Backend/venv/lib/python3.12/site-packages/pip/_vendor/pygments/__pycache__/scanner.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/pip/_vendor/pygments/__pycache__/scanner.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..873804be00ae8d4a18599d93ee9670ca26313c64 GIT binary patch literal 4768 zcmdT|&2JmW72hSf5=qgLYs+7e(@f$|#xm*HaXtjsfMmN>gH#DD1&M_M%N2J-uC&}` zXP36fs)kV*g;cb#4Id;UEsUOO!-u4~Bst{|=*5Bym>_&8&{J==6rg}l{k>W4Qj+B! za_hi)oR2qe-^_dO_ulyL+qR_@wBzSaS^XJB`4v23@Iz%b3ws`XNZJHD6miiYEGAt$eHYH2w; zQMNp0TT{Xib!JtnHkUh@!2~byIW}c@++=MzIX3QAII|6>R5ME4lM-xema~ryu-MEH zoN>deGv8%ZLwKA`)qGYqE_3G5&RJf+;tJDae%bKlZj)EJV=~vl6lX=(@%fyeV962)d}p3kQ0tmauxDNw#<8-nq?#EEx~pFDB$G$~FW`nYX2=5wPm$UM&3@Fx?a zA6*>JNy$UDRpgGxhuFyY`C$FSpP#!hHhzIkyMmeAH!R!BrTVmf;Zwj7B=+ z)PZ~X!ooD}0e%2SU=_nJmf3X8Df+nm-~eOUL@TN5j#1&d-b(9w#Wia-^)tHutD0fA zSGslGbc?!vUs)r)pIiAdyeD6B=JMycH|x9A{HW`5`}hdV1cT>CjN&X5&0prutx=ue15zN2J+Z^)vD%ou$is^QxGQk&{{B30^gIQA04k7Mj9phJ6BNOdT1??xT;tkIm*n3-qBz#f1bDkmME7LU>;g@h z-JoeR3EERnWqVrP<3Uh2s?t#7GH64G3;b;u7N~ICfQcydeJ&hNh9*LKb5wY+n^W@G zQO6AevglT-mJL&OLdSbOD?e3?uhW|P^tbjqkR@eaomcc|*^fBq)dy|g!+IO86aXAX z5sw^&7pct0uoi-%V$vwOGC3ln$Yv>6ONJxzPml`sw8XvJ;rw0fwk zqgV3Ft(4~*!q)*}tvC@)?r$Y*!}D934476*7hEq=j3Fu$9=E4k2~t}~f21peN}>n9 z6iJq2`MTcN-gb#xICB8&-Z02D7>*4_qz;guQuZf=;3jNMtA{iULe zD_OOXD@=$QFA%;Eh_vG`0vDQFhda4!Ozead@gtD?s@RJkk5p=3M4Y=`qbIxr4BjG! zJs{VVfA;OXF}FCk{PyF4V=MUAckE&ESa7KI3X=E9L!}}2Wrq^!j$c2(25P@m$@6C- z?+s>&URK3%Kl0U?$WJ>Qa;Gc|I&;(u;b3dI^XeJ!ylibB)@HVml#LDiy&Gp}gjq@m zn_BpNX{y_ie-BrycAXX4h*F4hc1;Kr8w?(85!B1nAh=%>PPCN_8YBdFYK9k);E$en zx#t`~hIMNQM{LgK*e6IiGTkGcMSCd~8)a^oK@NfYvusMd3Y`P6COfxcg15Tc&?Q4f z>?VdjBIG*vW72C{-60;5@xwsU5N*ZT#6}{xb9Bo^K9*_vW{6K0171;rxxU#j)jgS272h@V={y zSC>mGeTN_S4X*SJ-kbR1()~-{B)&_2n|#za{4hEEqBD{sN@qNZj&#QL@rOBT9bh%p znhI0J8fIW2BLw~bX(4&Y=#mkL7EDMvn|nF-f^j-`KbBR+0eoM)4&tr9M&Oj^H!|TZ z(rAQuC|q%gNo9NgjmBbQ`N*TbH|`yL*q3{l%)NN{C=$Q=|A|DD^qU(pQxy9@AXc}C zN=VtU`70f)_)Tm+c1^9T^Rby-TX40fpcSPK*}zF)v8jc)2F_Ht1kQo5-}zm~8Rcin z!N#9qxX7`{8zjcd+)HIDVL{142^P62)snR;G9@P*$V;Gz1kj@3HWp1bZE@R#drm+^ zfH3T`Vb@TnqP}5Mu4{Aowf5VBpu%!YtBB2bJp{R?4FCZgaWfDmKZy^7(xR_>zAG@_ zex6tkGPqO31Hog3g4|Rn49XKx4u9!($xa-FLJk|FGN6DANN*u|?f^XHgC}@Mkor~E z!iz|tPQlg5hf8#8S0J^m_aKDg<|1*C`jkXNT<(PMPbadyn*db22Ez(QgbIxSJ;{+e z5ZcnD-h!O46^G=ORuXQlnvF|n6>reITJZ?Epm|WEBs|!^g9$Vm#k%(=5MV<84+hr$ zy-Oe5`asqzz~&HdA7`>Fne4rTUu5rRznu8`v%h`zD06l}ZT4gq-f!-tvghueJ9|E- zdWedjrPH@g-+mVZlt8f!Z&YJ#;MkTRRN$GEg?7YFAZcJ-S=^Kc6#- zK60n);E7u{MDDqoBOE;jQDQ&H`f4VL=cP_uow6>Rp#s~Z;DmE6e!Auc5Whr+}Y4!~?12aF)9H6|4!RX>BejaD`uVnT=?M}Rwex@Y0 zr=Kc`R9ae(E|}6&HWTPTASDQs1(jmr6(Uqcw31cfR=M!&L0&sV3(_(<>QOBz2nwZ8 z>D7WvAPK>u_Y;uo%CnfJCD(d0+Wyu3F>UZ!m(sKI=BefQ-JUx=kJ1OPom)+$wGnl7 zZ$itjW_D@)tGSrAXDz8|fx1#&RtuD)Xl!LJ)*Roe@C!n?BB*ubhc_zoJb5N~MV}Q^ tkW;1L9RYb7S5@^{tWQm>F-1*(-<434H#6TW`1w!oFH|+Xst}c@`Y)2oI(`5E literal 0 HcmV?d00001 diff --git a/Backend/venv/lib/python3.12/site-packages/pip/_vendor/pygments/__pycache__/sphinxext.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/pip/_vendor/pygments/__pycache__/sphinxext.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..de2a15661befdac8d8d1f4f68a45013e2791e409 GIT binary patch literal 12153 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 diff --git a/Backend/venv/lib/python3.12/site-packages/pip/_vendor/pygments/__pycache__/token.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/pip/_vendor/pygments/__pycache__/token.cpython-312.pyc index 63a7e2e9b2e1a8be1fa3c5542ebeb1fa0e698789..d59365a0db14165b045e82c1a0cf7311d7c73fe1 100644 GIT binary patch delta 20 ZcmeBk=yTvc&CAQh00g?u#v8er6#z491Q`GT delta 20 acmeBk=yTvc&CAQh00a*Vls0lRD*ymDi3F$s diff --git a/Backend/venv/lib/python3.12/site-packages/pip/_vendor/pygments/__pycache__/unistring.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/pip/_vendor/pygments/__pycache__/unistring.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a9d32b8cc11afd364af1990868c4578ebabac027 GIT binary patch literal 33023 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 UWih^JIEfnL56vfw#&v4`4{R7!3;+NC literal 0 HcmV?d00001 diff --git a/Backend/venv/lib/python3.12/site-packages/pip/_vendor/pygments/__pycache__/util.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/pip/_vendor/pygments/__pycache__/util.cpython-312.pyc index 2281eac4562f06a5590bb88e06e825f39b2dfe7c..b6329e06394fa0fae48149797c45fd46e05bb6d2 100644 GIT binary patch delta 20 ZcmeCr>(App&CAQh00g?u#v8d=%mF$g1djj! delta 20 acmeCr>(App&CAQh00a*Vls0m+m;(SlKm{HE diff --git a/Backend/venv/lib/python3.12/site-packages/pip/_vendor/pygments/filters/__pycache__/__init__.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/pip/_vendor/pygments/filters/__pycache__/__init__.cpython-312.pyc index 20da6aed3326397a9e8f20b8ac2d90982b038e74..52523e4bed4994173b1244c455c64472741753b3 100644 GIT binary patch delta 22 ccmaF9g6a7RChpU`yj%=GpzCbBkvnDz099ZHYybcN delta 22 ccmaF9g6a7RChpU`yj%=G@W4Q6BX`Uc09k$p`v3p{ diff --git a/Backend/venv/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/__pycache__/__init__.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..0a3b103d75f6ce84ad77f3889db2565d4dfad205 GIT binary patch literal 6965 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 Qv$;dL;707jII)ty0+i>-6aWAK literal 0 HcmV?d00001 diff --git a/Backend/venv/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/__pycache__/_mapping.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/__pycache__/_mapping.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..2d0efd80d66eac8fddacc65b93278f9f1b9d4cbd GIT binary patch literal 4227 zcmd5<&2JmW6{onQEbGfwEL*Z{$KyCo!@wr%r1dEX8Y$L?At{2yq(v^~aCf+zXt}eU z9ZDh(1^PGi&{Kh4dg$NLV|wVZ*i(S~16$;#Q-5z}Nl-CQ0cuo$X6Mbk_vXFdypQ2` zOH1=5{5{+HL>}ENm3|;%^yd|mAI~uPb4iwhQZVzUnV=ka7%M>)<7{vZ<6LkZ<9x7y zaWPoJxE$QTcr#eR_)c&O<7#jl6+B5cWiD(t2mKn%3KGA8gsIW3QF7*!%`M?E&lYc);5IC=y1-tgW~X z(x)s{Y@qtg=P~Qbup8mu(2B-RU;BdexU)tkv$nuFf+Z@2qL4|$Ojl@8&sH{j$zG3# zldfK_jpQa>mAx>#hT(O)m%vdEA9yQGk0-U6VfCXr7KZ0rT5uy6XKsf{(#<+r^$O#x zm*l)m$<34uVMhbgRWTz&$h>{o)?5z&8w*7&w9}Z#3!LS2k&tuN>C0AjWap=T=sARt zvpJNV+Dzuz57~;z(2Q-}+1q|=hA!`D)#(gxNf+?%) zHV^iJWre6(c{uw~on{0ozQgaYTEtUE{Onh()%r9|c>Gzb#S9M-{+k09hz{>Z=BbSV zANC-<7~(?2exxV`5cHfR6D+dnd6G=91oEt4VIQ{p@Jv{jSu0k=+F~j( zQpGi!ccjw^{32yrCnwC0c$(UbY9p|Oq2!|&Yx!wv_eS#dY;o^+YZ9vI$)f$t10yAh z)V^NBZMiG^;3`12B!IEFm{k0}5AQ{qEl-bT4;hGf*r0gu_6~M3FNs5!f0#_f^wHtY zTZ`$HS4lYCTw5@{O+vx}pRDq2A_{Xs4*TO2e0B8l?b*A$kBV|Jd5KeVFe0w3y3d>9 zcW|KUXb+1Ha7>0@UA<1kyJerOatqEilYIHtiULfRbq%2MqZfV^Dp}*K~7La(?09Rt|$by zO(<+pqv^Q5h6-HIR*z6L)B)G0{ba(9;lpW#0eKy&p5+}bT0!O{2{pT!ElluCtzAHF zQnCPW&)B4d;b?z?X%Po#TLG0dbib3YchJF(`FWH2>x7y51FDYm*eO~s#h>Qq*{tit z4jL>Bf8(SIHU=v=!#Ykv%}G&@I8_aT2G^uCbtkI=6gpiGSG9O-u9Wks^+20W<{dY; zsR?0ToNqeAf4p%%xX||rcPdq=hB(_jLKyEGz-*+?qiDczZManIE`*u;}IxSQ@ zb4;UC7zBz#Z~^=Blw4%3kxgSy2(By2?K8H}Vvw-huvnbawYUeY>0%{u&piUJFymb5 zQ-WJ-#A7r-cE52Hp5phX6`_&I+1yA3Nk2DUy;iv4F#5~S#>m#sF(h068?QG;E;Myt z*fYjR*Q)vjHUBX%W0uM2c>bc7jiQ6*9tP+6KYzaGu;u?SJW}KHbn@qmE&db*ZU^-S zQQ+ndf?r;RfNFk{Xq9M*WVcDdDOk}eomBl0I_9^(JU;lm*?f6?VzvB;ODJ9T8(q~C zjWE7wd?C_Pqmst1G9r4msnjXTMPm~!9ZjooCgQV3B-@R|{?z%T{`})cDvfwH>iLaC zCXLr%3zPEOJjB0<{c#R)F3H9b=a5?vBPX+x*e5PN)iW&T;PcY`*%*;$acWb%) z@5=4GR9YW;xd-a|${MJRZ@jz;DxWP?*NHy#@@quTm8!(O7MAntM9-J1tDx`vp^`5U zy;!Q=`q!$-mxx#{n44aHgXo)uvah{-h3I#ReN)bF5xrU{J1OV4iM~^+-h=W77v+47 z==DOrTh8wiy@A89f4f=9?-6~!piL!zK=iwX{BAXWNHikBeFXW(UsdzR UM899`zbgOd3Ftr0>s`S0UxxCuh5!Hn literal 0 HcmV?d00001 diff --git a/Backend/venv/lib/python3.12/site-packages/pip/_vendor/pygments/lexers/__pycache__/__init__.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/pip/_vendor/pygments/lexers/__pycache__/__init__.cpython-312.pyc index b7e82b2beaaf709684fa7637093730e13720c1cd..e2addd8b252788316f991ff47be7576e679e53e7 100644 GIT binary patch delta 20 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�^KXQqIefW6SweD$vDDpLIajPSu3b za8_Eg*LzS}{HBSe^XJKn!;wt74%0@QghBu+c~f(`V$z{mO+2x>+hN`*sl3BOmvkBo z)&3iM*?%Ya9|RBtG0hey%{0l9&_t8=`v{%0`{lkb4}VX86X0K&f5bLt2TbevImu)E zD>>sing^!ajNkuki*fHPepf7EcZ}nR_#q@Y!J4kXp5I~9H5;0)FKFh*UKH+mY;zK1$1UO6#(C->gg>Ea#N9N*3>{!aPoYlpv6UjOdlzb>z#tKr(=e{kpI zc9?&$;F*cfXOPp)f7kKQSvgTLRkP*S&wkYNVb4S7$!|KQohM~I=gqI@E3EN(v%cUZ z3FeU~dJ%HvGs`jo+q74<5>78-j`>CAdI#SAk%~2Cn5Uaf?zLH`@fp|3s|N(v<-68G z+biaTiBNtJ(woyq`Dyrj`YBSKzY@=!2^BkK5*3Hy#M7bVLMG7#nZ!KRg?>{#MqPVEXB0t`C@{BYwVaq-7f1t&-g%Z27f=!C z@j^K+cvHc!AT$>1<#uIDte4gf`5JfdNso%T`;}CM#4G0nY-vh`Xijw0xCP4#Z9hJI zya{H`KF6NLiiJ~e{K&b3BfM1vQXgRjTa^KCq+dvm_{$Oshh2Rehi`&5Y3y8r#nKh zUwN1R zg-&S2gkCRADW- z_4QMYZBvDZ;gpj{)z#zBMalqyo2lRQsD9_e`lJG8Q%VsM+6qUh(*b*mD^febeP*(rm5GDz9lLex&f0tS`_}sk zG$TDHNb(i)W6!qv2+;04z`#QY6#98Xw`=d@P1kI_H#F_p_uxf_wIi&S5r-z%-)Wil zY^Udr$DXzH8=$_(WLaRfsvPt6w$9x4!!TEUPPS)BKSe-Xpf;*2SjY^kMV6lYAKSi=z; zFmnnmPEDZ&2BV4;%aD#SwPFgzatJZqS*K8$r{ok`3>uu+7sD=2)e11NY~Zxc^eTon z&MPopGjV}er4*;8+Z?4#Oqt~nF5=oX{(JMM%+wt4d1k`TB4U`Dt&&q>a_&n?9L`4& z)`*`Yb0{Z7<2or=G`^HEDPlU@oSX*fm^<5TUNGBjYpy4 z^EencOcgfH8HvGtUoS_(!;h9XJzU-d9qW5`F|3g%*PMNrEpTGcDmCT*a}2Y}twWQI z)5|x=QFD+cdb2^_8(B~$y zTG^s({YvUCAGHK?;C9T*+tI}5{V;P=fulymdO_KNcrPYrPRwfL5zPC6R!jDfp_X~5 zconJ_)lj;bPkC21T%iuK87ekq+0}-iVpBG>H(N|)4?^~54Qb8ZPO~fdK3%*$$_csqteLHZuZK1KlZxL5(YP(Ld~$;d06 z_e+&*wbCwf?h<`Jy+%8MvYeb339q1j(!j^Kl5ClxRr!>I$(BFBdzw}$uOula`;5r< zsl_M*JCg?0TbiKW;?Ax}CBE+&|wRX1|`nt-npid?;c8Gvpop!t*zj1;WP z&c#weo+_0ysd6z-4N8|0tNU}rs#VU(SaT_gw>Rd{U$69h7R-PdDl&~@=Y4+7i}J@C zT--rRCXc3G5;wleJ3;5_#}G@m%aC~L7^6=J--(+hERaJNZ`38ZMD7X5`7HA4h)d#e zNs*60>YfJ~WBxr4hA$WFH2^Y#6dQR_{P~d<~Xj=9{y=7D7h&v>&s#W_V z)I?gP17@CS301cY1cDjr9YWYLgoJckIKrT}ndt8jTqXDd!4DCi3BgYyD$HPm(I*r?v_GZi7fJM|32qWh z5Zog8Glu>-!O!sZX9>PU@MVIZBY2NslHfMM6p2))AP`wnAQU! zkvQzeX%C3>m!$LW2_6xAoqoSd@OuQmPw?*u{(#^c1m7h1LxMjd5C=$qLf4-X%#g~r z0d!b)iv|Y3r536ln$CbfC(0DTLxA|M?@Q04{p_)0{MH-)e^d0(^I-`0Xxf7IJjD;~ zKd@~7g~j@>1POvC1m9u6r*!@EsCeX%o)sXzPD;+hNaT{D^Kt7&jF#H}&3FmMv+(r^ zUDmz0*GA*Xlic>#)(yj2VxVsv*8?ap=07$L%Yx828ut$e#sgsr?V#4<%j)EKIZo^D z<4_oggrRu@J9P|%M%oUpuz`*YU=nkpe6^);yl4E+(!Nom4z^y>kcGSMX zM7Sx?zR8qw!oj7*?%RD$i?gZ)Z~8q_O!KS7iKJk5*qKTR!8{@Md7|q@K*7}y7@egM zIt9+9#JU(~DQ_SR96CQGdSgbAyLIwNJR_L@&Q;6dh6C(cP`zp ze(?HCdG*B0Pc2~ML-^KHpI8RWCtk|EQcyjynh|Tj0-tLDF|mgJYhgAJa^()NhgN~9 zKIJ}?sHK0MNeYbJ>6~8n;*`53;iGT;94ar<;8Fwq8zlp1;7)vcMa%tTI5J2y(ZAUc z8oSpry?W0Bn36l1*Z}`08&jFv#MjNK*DZ{-m1XX~hs^9wY@^5a438J+vBQ)P`%CvA zf7X(Cksd7>9y{r=%amU^Q4WE%=KJfWSMQs0?@#Qe|DJ{Zt@H z!w+9L4E`fEMP8e7Z=3OK5KLHcf|S9%gkjGN|9h#f_t;ZD;g|#m6GHNkSw~l=^{$*cvRlzV+I%L>1YghvauZPo05m!ts6?-jDEXX4}&8@Qa#i z%eBE&8)SxAw-Cjlfc)y)JMO%6-!Z)g#?Zu(U0Mb{c@~yyg9Ln3#-g&oq7v|LOPn@{ z-V3{V>t-@^=^^krfv#Em7`g&(Fl_oDtsRN(c{t>*@#4a z>-nfp-WI4yaa7JnefUfLC>X`x(|^dx%C!b30;hp6s{-*G3dK7V8%_i55WaB;;Tvam zVHt2Xa$#zN5A%vzoyz{*AiVzx0s>vGSSu`XcA#1b7DNxDBE>#MZ zBAl{ee&!E+mXefz=^X#Elz;gg|B94< z1pf*Kb3PlcvN}7JYzAFWvo*lxqHf*~A!`;5S*tG3&b?J?X%0$Rhw!W%TV=fnuM;=I z`&2JDUDZlGIEDM?C68Bf!ITDs9n2P{GzzX`lYq?vZXkr}!$$BWH<2@{Y)-khq+DB5 zu5Dj(bgUWM?t4L7jTGXV;82NUP9bEZ3^WQKzn3QU4MAbZ#CYZ9NKFwfz^gG7FV>X< znm>f=lLnvx5FQx8O_Cy}HWKD#Kwj8efuM}{fFS_1#rx`UX(&a{Q3iOuDPXQ4)B|TF zg?Dkq>hM@3+B^W+r;*;~Kx6|#z^U4<4KlMfTr}9a7MvQ~-nX$==>0-(fG-iL6HFCe zyj`NQFig#NH^gz-V8ACV>q`aVu4ehHQ!_k;wsG}5Oo@P<6OHW83xk)uLXg+;wf469 z$jc$)MKE-5(UY(>F%Kuj6OtDNrlKZoaUi30NzWR|_i>!Zc5QwA`FJI+NW)jamW-F( z;i9`y$RLTWS!L(ywYBT&8@igBH?-_(+S}E2Zv3sCjbOG_Np44)(IMCyf}cTFM%>05 z71n2PDg+yX+=jS~=Fit_|Ar+JyoFEbdO$$#KpaxH2o~&tG-n{i6o}i!4OZ(VbAUU4 z+!u%o-n!OzjduG47r?hWE6*mysZk_DM(|?hv0+ji7+gOFy?8yBP~JE<$qe2G(7~P> zgp5^8Fk@hY19xJ@9T2oqf}2{kUnGWwHwgSPBh2N^=+;4Oh0`1wTqp)%XvwFU%bme3 zao8%0o6e{LBbhaVPm_&BlZ`tg7+_y#9@5+wGG5{i7=I5VtGE{|tVj+F`7XE-0Jj(u zUQnTI11QV=XCy&3OMK59=E`DsfeGUp!hD9Xq~YVo5#J`h#faYt&3G!t*9n6a=@{>gQB7xAzcSwf27$|m;PA8GN2;Ly* z0BHBEU7UX~k9Ck1b<1b;0s^7yUP_nHNEf>4VwW#A{eo2>SPX(oP)IzX4!@|@JDCmI zi_Gi`1cDV&Nx!8T0jr5Z@Pv$jGl)t?0JWW5CU+qvFiNiVQv##nx|4i><<~tFz*tK; zYC{yR^!k}=?G#}fHMC}V9q_B~b=-nUaiIm@N1TFojM_(R*%Vg9wQUSc(SAV9$f?-`p`>e`d;kRv3?-@3nH$j{5^v zJ}CR9bGq&oan-;AFRrF5#frG@PTkj~Ks5x7q=Ik;ptG&}r&Es8C z^O$zIVeWd_6L1|$5+-NqaWi-f0;wbyNMJ5Vx3CQ8JhDp%xr_vP(#kg zLE%q>-SAmKk-*xSb@lIuZ-?mt%jo9(tuxzpJ=%8Y;WnYGjx8jjt(iP1>TS*BYrIeZ zbt23^!`}5{Y@Beb0#^9a&Q{3$0(M3)Gm};2)@9EBEPIUPj-n_R+aDSxzrI~;Be2DQ z6)&)97I;AQRcr)+f#iWP$K#1V=d?L3mBMB=XMK;>CVo%%;E`P_B`NFI;egR!C;oB= zO^W>&pk$^vVBjtfYGy0tAxXU`WfSm-%@J-F|3qn@MT8SN2Pt#G5K zqGXu1vh+o8r)6K{BJSUe;8GFXM+z{88$A2_@hUD)355H3Std{dmvBdDFfzakFk|V{ z1H9tSPD|L23rU7!ARw;S#FaXjcw&m+^}}@$D6n4ypapabOz7#B(ZPsr_2V8GKwhZ{ z$a^$?a)Ko+@L`M!IDi*;nI~>6wThcQac?&B5LI!SW#yR$VYp8~C_btGIX6h9xs>gxSQEtl}I>xAkce-mRql>XwbRor(hYRuj@7>VFkVte06h}Wsw<&A%M zLM2jxzasO3CrlMxz*V$pn?YP%%jXEvhjl8bJK@QTsBv@cpn*SV;Nx;U-m5H)vcWQ( zybur1sAxC#3%nE=@!7?2caa^ID`9L>x8n;`1PP;ac*x069YL^bw`)1)I8a8kSMDuXqeqM2xumep&!_E(v z1EaaJKRHn7{{BsLT;fOPmD2q&G|@NV;I+XRGjQWC+9+;Gatxs6*urq*uh>e`A-0cL zT%+6Ko=&mK4x!Y#1B0$ioy|Cg8+)OUa48VNr*@!TrGpo&qOIdLadi}dh;CTwf>z)K z+zp2j!hx%gqfrbSa0JINs!9iINBE$*NJl?!nI#TRj->-P@<|8Qm(sy2jvXvGqzT{{ ziG}>p3%Ua>85w~O$~^*|4?0BWz)=;dOk_Sf2>XNhv<{9gy-W+=QdKdo&|V(axG0x6 zYGY-Ns<l9aSj-vhGhUjn)F6#y!Z{9>{qI88Xie3(v zropIOzwYF~E(UJlqMkARu%YLG=|ocyw?x8)vp>;dg^N2W-H8s^&pXfI()p<3Dhux3&Z7|U|e&5}uAABMY9IZfqquI-^YT|IX= zp!TWUnZeSe8iEEJ`&q7rTSMgll#2>9MhrTWnZz)GzRosHqZ0UdZ0NZc#Z9Nw@zoZ;RAH##A6ipxNCmoc8PTf4*@ zEX(6!yA>p(x^Nq%7w+LPGR>sF@wHv@8;CKTZj_HkGmI#XK}a5Q2@#5YRY;BuDN%)EiXN`+_5w#q(0l7hf;^f>AsV z11>LN?~CCZ=cTWN$4#B$#i+5oWUY!^CtpOalP@CIm{OR@K4`n^d1$q$dCBd`!xASn zBCj>o^R&RgVDjVT$s{(zr~!(NTE|86y($NXyyzfWJc`>N7|`=LO3;=jS0!#y@tck2 z;_k!X9tsSnJ*rK1C(v$>-x=Jr8Oo#OI& zJdqP|d$R5^CSaq*c{p!HLOsT!!^3qAZW)HUI=i1|BrKMG_!gXE^D)K9aYA;ne10a` zjKq>7KjV9#-Rk+qY~5pghyr1pw+H%_T8|hb3yjnm54R#l^#W8OTRhhau&qfCtV3u= z74|oAYi>|4lr;RpfTtLw3z-XHr^B!bpcjVxkblA_QDLMqgp0KGLeiasQ)Db?din-0 z7_$t#@V#Pzfsx3FvDzsjZLwKPHOFGsBuVp|i^50s5|Wo6v?s|$*Gu~``W(OxXkS=4 zlN!-V4T`ebj5gkv+`n=YYsKFh{5`z~@UqE_{cH>_`5Q7$agy(Rj>AesQnvS?sryBf zsS8+Fa;{jeSjRKWFpR+P>$r8?G(@qJdB2O$n;g$c+q4)Ww`ksP+}dyXY4c69+4N&u z#&c-DBK5x03JVoqwT$8>QxwH#7kZU?Im;@qvxLo2j#(J$AYf7q!g~Ip*Uy~V*YonB zH(on&>fmW0JO*M-X-6>ff5xcT1J`=!%`dp@<;a_b+uS6w@FecMFsL@fS$1dbqx#(s@qhL1net^{dX3kL-8nl|zInQE^W*Ym6K5w6O_lqm3w^lmEw}!A zQC962_Lc4{H_tJc!Eeeh_w)$BO?)xj5o@kCT`|W{Ncn?bPVy__E?J0wDVA~bMVP_S zTyR^ZTlm}PhA|I&yLJolwVMPJ0CBhEka|UvjTdqJkZ!LG5Y{|le?r!6kcTl*w!LIk z(l%whBBLrZt$Kcy6?hQXS4}g8rPt41SFYz>vwf#<)ueT5-LC1v-MDbJXw6Jv)x_DU z!kSOP>UqihxM>Jc*_t-Dghr-Xx|o;3w1DFjSBWyQ3+U)w5j>2b)UK1 zezpD6He9S)|FqC*Gjb{@`WmDy+^Q4bH1vZp3`MTYHD!QB=7TXr!iStdBcf{9yB zzX}4u&aEQd(rk%q)kOLQmJ+6jv3P-{V4k4sZh5q~MRYT1W8|OsMR))%j2!4?1_lPa zK9wf%CF&|7cnMY$h;Q_OF?aKIC%~*TY4b??7CtS)Oi>;rfvagYKgn^Ltxro$=7R59 z&E~D&H39rR!GAU#fJGGZPWnjjl&-%qZTi%jlegun$7&@&Sr&t5V&n_n?cta@hR^I5NX3&MbjM7Eb|%5+vwquov)O(P)cAbXX6ZJYUou}`_V*^?5GDS90mW3# A00000 literal 0 HcmV?d00001 diff --git a/Backend/venv/lib/python3.12/site-packages/pip/_vendor/pygments/styles/__pycache__/__init__.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/pip/_vendor/pygments/styles/__pycache__/__init__.cpython-312.pyc index 18d9aa31b3265ba18a78b3e58ecb039232030cf4..c175a1a31423c012f67afb55781cff1bf7c8c9f5 100644 GIT binary patch delta 20 acmew@@>_)aG%qg~0}$vs8*k(;-~s?XEd=ra delta 20 acmew@@>_)aG%qg~0}wngP};~{zy$z8O9g=d diff --git a/Backend/venv/lib/python3.12/site-packages/pip/_vendor/pygments/styles/__pycache__/_mapping.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/pip/_vendor/pygments/styles/__pycache__/_mapping.cpython-312.pyc index 1f7af8b9f2f797982cb008bbeb15a653926ec453..dbed83899e245933ed92fafbc3444d7bfe59a84c 100644 GIT binary patch delta 20 acmX>jb4G^yG%qg~0}$vs8*k)xjb4G^yG%qg~0}wngP}<1t$OiyC7X=6a diff --git a/Backend/venv/lib/python3.12/site-packages/pip/_vendor/pyproject_hooks/__pycache__/__init__.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/pip/_vendor/pyproject_hooks/__pycache__/__init__.cpython-312.pyc index b0a546edd3d0441ab8546bbe1565fa72a48ce9c3..6c7582690264457b26f87114e678ded0d04d9a57 100644 GIT binary patch delta 20 acmey)`kj^gG%qg~0}$vs8*k)(!vp|4X$3$4 delta 20 acmey)`kj^gG%qg~0}wngP}<1-h6w;bhXv07 diff --git a/Backend/venv/lib/python3.12/site-packages/pip/_vendor/pyproject_hooks/__pycache__/_impl.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/pip/_vendor/pyproject_hooks/__pycache__/_impl.cpython-312.pyc index bb54964541b92d8a6c8f5fff38563636ea746538..f49caac6c39cbc1cb46ccce5f26b3fbb916ea933 100644 GIT binary patch delta 22 ccmZ48%ecCik^3|+FBbz4=sFv3z>% diff --git a/Backend/venv/lib/python3.12/site-packages/pip/_vendor/pyproject_hooks/_in_process/__pycache__/__init__.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/pip/_vendor/pyproject_hooks/_in_process/__pycache__/__init__.cpython-312.pyc index 9e47d6bd36464b82526efaba3eb7e92a76bccddd..1bef11597387f5d84ead03cf479cb81a27f9d403 100644 GIT binary patch delta 20 acmX@Wae#ySG%qg~0}$vs8*k(`WdQ&)KLjHH delta 20 acmX@Wae#ySG%qg~0}wngP}<0C$^rm4T?DcK diff --git a/Backend/venv/lib/python3.12/site-packages/pip/_vendor/pyproject_hooks/_in_process/__pycache__/_in_process.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/pip/_vendor/pyproject_hooks/_in_process/__pycache__/_in_process.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..1d3162eee0b6ccc946b43162f8fb0138bdae720c GIT binary patch literal 15370 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 literal 0 HcmV?d00001 diff --git a/Backend/venv/lib/python3.12/site-packages/pip/_vendor/requests/__pycache__/__init__.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/pip/_vendor/requests/__pycache__/__init__.cpython-312.pyc index 777fd771db4ea0e079c1c3682dc930e12edba13b..029afe743a7a6c0d79c8e8adfe7ba03663df4ad2 100644 GIT binary patch delta 20 acmbQJIZ>1QG%qg~0}$vs8*k)p69E7*n*?Y8 delta 20 acmbQJIZ>1QG%qg~0}wngP}<1dCISF8xditB diff --git a/Backend/venv/lib/python3.12/site-packages/pip/_vendor/requests/__pycache__/__version__.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/pip/_vendor/requests/__pycache__/__version__.cpython-312.pyc index 9f41f01ee9e81311f787bd033cc36e63093cb746..9c7b0ba36dcbf3a238d73f2b0ed5d3e7645d3391 100644 GIT binary patch delta 20 acmcb@a)pKaG%qg~0}$vs8*k+HWC8#+%>-2d delta 20 acmcb@a)pKaG%qg~0}wngP}<1t$pip7>jdNg diff --git a/Backend/venv/lib/python3.12/site-packages/pip/_vendor/requests/__pycache__/_internal_utils.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/pip/_vendor/requests/__pycache__/_internal_utils.cpython-312.pyc index 9391ac70df60af4aace62f7c1cab6274c8e1bf4b..3ec1a4b335222cc7e8cdefcab3b32b68c1ba04ae 100644 GIT binary patch delta 20 acmeyu|An9XG%qg~0}$vs8*k)($qoQLUIkD9 delta 20 acmeyu|An9XG%qg~0}wngP}<1-k{tj+dM()$Ryj%=GpzCbBk^5l|0A67SGXMYp delta 22 ccmaEJlkv?>M()$Ryj%=G@W4Q6Blp7`0Aha!!Tq=Zmjr77 delta 20 acmdmBvB84-G%qg~0}wngP}<0?DgyvJwFLSA diff --git a/Backend/venv/lib/python3.12/site-packages/pip/_vendor/requests/__pycache__/auth.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/pip/_vendor/requests/__pycache__/auth.cpython-312.pyc index 7142ce47021618a8e04de3a9d4d705c205ad9439..20ed5648b3d8ae5210e77e2683927ed1d5f232eb 100644 GIT binary patch delta 20 acmaE#^FD|BG%qg~0}$vs8*k)JF#`Zd*#)Wq delta 20 acmaE#^FD|BG%qg~0}wngP}<0yVg>+A_Xart diff --git a/Backend/venv/lib/python3.12/site-packages/pip/_vendor/requests/__pycache__/certs.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/pip/_vendor/requests/__pycache__/certs.cpython-312.pyc index 2437574d628a2f202c3095ec1f100e0d66855720..d664a98d4c2b3537c3dabeebfe9baaa24513645e 100644 GIT binary patch delta 20 acmdnQx`~zhG%qg~0}$vs8*k)Z&IAB4p#*UN delta 20 acmdnQx`~zhG%qg~0}wngP}<17oCyFmzXbpQ diff --git a/Backend/venv/lib/python3.12/site-packages/pip/_vendor/requests/__pycache__/compat.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/pip/_vendor/requests/__pycache__/compat.cpython-312.pyc index fe34d49bd160c0309f71ea8d537848b93a404993..7e32e9a84053ae3323404af0c46e503753596156 100644 GIT binary patch delta 20 acmX@hf0m#7G%qg~0}$vs8*k)3#0~&AMg-dc delta 20 acmX@hf0m#7G%qg~0}wngP}<0Sh#desWCdyf diff --git a/Backend/venv/lib/python3.12/site-packages/pip/_vendor/requests/__pycache__/cookies.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/pip/_vendor/requests/__pycache__/cookies.cpython-312.pyc index a8ffae9f438ec5d3f104f3706b4bf78292897f9c..c5e7c30022c715e025d23c17c79574c209e80286 100644 GIT binary patch delta 22 ccmX?cl<~w-M()$Ryj%=GpzCbBk$Z0v098K*l>h($ delta 22 ccmX?cl<~w-M()$Ryj%=G@W4Q6Blq4U09joJBme*a diff --git a/Backend/venv/lib/python3.12/site-packages/pip/_vendor/requests/__pycache__/exceptions.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/pip/_vendor/requests/__pycache__/exceptions.cpython-312.pyc index 820cf55b83fbc85e5530cf23aa9ecb8a1d6c89fe..5db43769b5307d1095e96519ac15ed9a1bef9c9f 100644 GIT binary patch delta 20 acmdmGy~~>WG%qg~0}$vs8*k)ZFAD%Vlm!p~ delta 20 acmdmGy~~>WG%qg~0}wngP}<17UKRj8vIU<2 diff --git a/Backend/venv/lib/python3.12/site-packages/pip/_vendor/requests/__pycache__/help.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/pip/_vendor/requests/__pycache__/help.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8e058e78f119ddf1ff84664068819f8e5c8a8b2a GIT binary patch literal 4240 zcmbUkTWk~A^^Rxk89x%|Wji5|jFT+J39%_zNJLk(un8<|NKyi9@sH(rCdnlBjC*IC z;H;y%t5%}bN>$aB7O8xIw9?YDAAI(6SK7b+*a?-*5Y$KuAN0#hsI)?=)N^OXj!B{H z_S$nFXU^-Md*+;T|JKyxLePfa9g&_iBlHbf)EZ+=cD{tkr$|6CBv67aMa3v%w8d=3 zNXKYnWMT}AbjqG~#2ggCWnj+6SeV-dM~X{3V=kE6Vs3amPJ+Rvn$pd&W&_)n^2WRd zrODSWpLr=rAbI?Z2rx9YK zEx~$kt8Hf;<-sh*Hhm2gwWDYtt5Z<&KY+$&(0nG)OKby@HPyHpY{@w8+R7Z4JTI@w z>J1d&Dtp@-C|dU7BXpNo2iiLI2HG|gudx@H;|= z4iaNe}dqOdFR0F<~WYFRAv30{zr8ow%Oi@dfd@-sPY zQIUBmok@vl5qww!59AZFz+2uJak+SCGgw)X1d*RpEJ8Vv77aYY#lq#4`PVZw*d((U zgOpT`$61+tEfM~Vf_d>;f+%p92ifmhDvd;bbR;suOGMdJ3ce_!zrp0g5D^|a!G|o| z&|yAgsX(A6WoX?}{nDbO^7C0aX>4s(!OJQ?C#qVbFtXv9+)VBSFUfo+fi)?aO(pPQ zB0htaxx`#5XUG;5QI$iW6R_duLG|;d0bzCyE3&COY$^-diok3I1W5~~Rnn8=7Vb0!rqJdp)QrHXtemC#_7RwD)rowcl>Gh_#A z+=uHCg;8CSyoo%uuW%(Id#^uVA!p5H4(ZmV{9+}vVZ8! z7T6-u9YmjmrqgOp)mt;UOs*cxBza!Z?dimlf?<$kb4X%E_h2z4CRFHF#FWk~DH2hp zd56IT}?ZO&rbuLSjKwqZug^1@^L_;3yVrx1a1g|8 zck~sb6D9YVB6DU3c8gw0NlgGSQqs?jl;r%LN$L9~B7wSTTSuCcNF{AIK?$^0Pdl$l zHWIaN6KH{fk+w!gtEU*;2K4pSYv^gMo?s08`sy|KjKGkZ1T?m5_4I;=cjvF7Yk1pX z?y<37@;9!`xxoI3F{QvBx@zyWeYKgu3HDkVgxxz{!rK2DELQ8Oy?K?)bxxr3+^?8C zN2JS?UQHI@yIyIz)()N(Wf3Pd5>?G`LoyW!i;0GkD*_?J0Z~X3(>iMf80-ZRxD~o7 zOv;k5%~lK&QJ*W^t&*bZ=ILkP@$#W_qUyNG>L@Dr#{E zZs|lyS`#s;-=?8{o1LA+q|VY=f+L8U-u4P)PZH-cnzDcsnZ+C?ACu12B2c)^RHmP3 zG+?lro}IuL5(Q5{gu9_NK1^mq(CMrtTBkw2?w_8Sn1V_C%EZOlbJJ7tsmm8mPh8a5 z1rgG{hVd{VG^En7OH67#y`?6pt*xDnLb_e5p`=&{OL6D9E9n>Al}EOVGE zNGG+UFqpJ9+QUR~lCs&D;tvp*mt4G^*&;oE1kj5M$7%j zOZ~@-fzj(8h`t@2mF@!|#_uRh{fk4K_i>=792hJG2DkdcpAX$0D))_-`o_QfSuuDP z(Du2mH&*5xQNzA9(J-@bL=9>7Nc-s&ivd(NRYU%7Rt z)H+l+UkUK{){3JSZpH3Vx2KA;my7-@g=x^k*H_s$T=BoP)je=$yx4tYYhdV(c5Axg z>#wx;l7G*!N@uvz(zWgJ-4BF-x6k!$m)GN{BCp-?-SY_wdD@>L#_rno_kt9|a=&Y; z(g1m(l27fU@OUTsy0dvaOn-fdf<6hrdLuqYJZ|R-bdC2IjX;gIL_B*>)9Uw-S|T7< zyD#WkxVvjr+i-zn!uGZB3{;I;Za9M_*{rX~-OO+bs8)9w#(#;q&WkJT557cpOg5rg-+G`XubgcPzf zV;@98QX7I+X9=vn*B9J7Y2)5|5>LYmVs-VG&{b)Qq8^~(Z;<;T@;*c^_&-7WAEDkS zXn5P#RYYwSS95`_G91Dhy%Bysm@AEN8wzhxvg-v(jNF|vdRL?biBVfPI=K+UiYa3^jG^S G=>G$XXA^_~ literal 0 HcmV?d00001 diff --git a/Backend/venv/lib/python3.12/site-packages/pip/_vendor/requests/__pycache__/hooks.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/pip/_vendor/requests/__pycache__/hooks.cpython-312.pyc index a4e2ca7682f103889019ae69cf2a50920e66dc5d..679a71a0cf81b9735295767a0aeb8ec7dbb2434b 100644 GIT binary patch delta 20 acmZ3%v4Vs9G%qg~0}$vs8*k*6WdQ&$e*@b9 delta 20 acmZ3%v4Vs9G%qg~0}wngP};~X%K`v1odjwC diff --git a/Backend/venv/lib/python3.12/site-packages/pip/_vendor/requests/__pycache__/models.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/pip/_vendor/requests/__pycache__/models.cpython-312.pyc index 2794bb53ccf9e7d2d3627869bc60474f16c5e84a..4645d90ec1e45af09959f306cac63976e10d916a 100644 GIT binary patch delta 22 ccmZpi#?&~CiTgA!FBbz4=sFv31O^`f diff --git a/Backend/venv/lib/python3.12/site-packages/pip/_vendor/resolvelib/resolvers/__pycache__/resolution.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/pip/_vendor/resolvelib/resolvers/__pycache__/resolution.cpython-312.pyc index 45f8d22bf62c725ff9bf24d969385d5e2e8e36c7..d33516b08121328d8706a1ae67bce2bc6ce49889 100644 GIT binary patch delta 22 ccmcb0gz?r9M()$Ryj%=GpzCbBk=s8B09PIcNdN!< delta 22 ccmcb0gz?r9M()$Ryj%=G@W4Q6Be#DN09!l;*Z=?k diff --git a/Backend/venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/__init__.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/__init__.cpython-312.pyc index b00538180a126680cd60ce3f645d8cf4a260ef6f..dcfcbbdc658fab11d063a684f1bcd85376ccbccf 100644 GIT binary patch delta 20 acmext_Sua4G%qg~0}$vs8*k*!kOlxj#sx0` delta 20 acmext_Sua4G%qg~0}wngP}<0yAq@aU$A_QKDtZ)Hn5QiMCrX2y(_)gq|i-xubOSvz`7ChwKQsNUamvp186naHLM#{Au6r z;Q&g4>ip=D*nPYE_U+r!z_`4`8o5zJvU;WpPi)6ZeL^w9O%v z$16e=6n09L@v2Z2g*mA@UK6UJuuH0q*M;gR?3U`|4WR}Kmr0HB6`>Ur_DCz^O`#?V zd!^=hOQ^-dSeXNiP=1~fD&DgiGYPE{Dsj`0Rj4}8hE`)FRF7_8m??`=3;fqet?@OX zHKZSQ!Ot?X-&}}d{$3swYG>;TRM!IbYO^J@4obE{X+2&$a=h5zgz&oeECx)++pxS3 zUY~(I5$ZE`NE-^H_`ZrKyf)Hi(qB$5^#8}hMxg70xi^~Jhy2+8N6gPvSdX=(*F#u= zeQz+r%C~GLWef9I%#DEA^wpT=n2)0bb6GPIGFPma3(Z1{uxfVodm#1XD{_>!q%A)5 z8L2$xv*@0rB1f^RMl>;wp==wJ&p>A1BTKU4v+K@1azd3Qte5A3<4H|~D&2lSkyA;% z{3K2YSm6gH+@DTj-D8wbVl^dcK!`iaE2DxumH@cyDCX6ag5x+rnj9w-tZ8Y0oTqRs zUui$3r6t0M<5W7K@syW-LLI8uetbrY63)%fkq7Q=2H-M-8FHdSR>6X8f)%rZ4cmtt z0t+X_Ay@=^zRn4C4yfbOP9LXpbgH}MGrBXHpQ}^OPtpM#rj$f9zlwA;7o<e~_{3)iC@`<@Ofd3P~XUEync$qS2wF|a! zm>YowmYl8(P?>OO02$wixh7@>0lJ z?ur={a=T)8pS`x~n|D9h_1XVGRfZ(cv|v+DLJIZnEBFh&8NOSdb0B8GKWoIev8 z69sKp=V+6fR(1EV1m{tXD6v6>jHq)%iX5lKawsZfwmK_`3GA!TSrtn|N*$@MC-s)J zZaJe{hINaiTa^yo8iU^;{FF|B;WyZ+G!yJ5NK`@!J^1}$C^#&~aWIxR6Woi{QB6(; z56T*rHtm+>Q85tc7rX(QnF{}oYVlo&3 zG(lE^iWnUZMj~-uOhh7qWLmF`L`YpEf9fKU%nI`;1|DvzAUcKi}kEsN3{=#_2s|nX+VS>!zKz8h!KdU+W{~hUwm` zmMiAnd+J7yNz?5*K8kbyLR%%6CeJ`!pi+q&fASGZgk&{dRrJG=Ar~xw;$9#dQZ4>iZTd`*Ib8ByR|Afzbd#;(SDO_zXwfVfLuBk zi6r?+!>82LQ6QwIy1&83A<=!LP44;L0 z45rI8A(rK)$Ssr^f3u$Vh#G-!!ZL0dDJX8Ej--NDBlDr3sRT`K>8Pdpl#g4!5~o6_ zEaC`N6V{?JeC#?^n>{9MLfN=2QZQ)awo<$=Q~p+=hB~!GYTRqX`xB*(VE<Ke&#K_YR9I^wjtJc|r=6G65p^bz3K68wRbCAeG6RyXMa+r)F92s{JH&I(% zpjgmIk5YRKrK7?z6PIWlFi^)c+YVq2@kl9z7)TrDH6-9TIO>|hYgmQmL@GXr6(kR# zAq<@j*KaMQg@D|R81U8>vomIC%SiUfd`0&j_vo^6{4hd2R@VJ6M|l*4$EVaVa!8p zq`PQ=46gJ5QtIy@`OTY`&;T7NreK^1Z{9R0YKXdk1HrJn*gPnuaCqC}TI1kmL6{Wo zS5laEMjJY|2D(vPlq6ux_aLn_mLz#BycZS>!Bpd7f|t|>QKD%+5$;WCa-7%1sKF4V ziPKn7fuQc7E}9DA8CeH4^P^r#LVQ9M5nULy$Cy=^Obsae(SRVv!|*c-qQ*;NG;Cx8 z!F&<0QY4BbE^W8~89iX1#ZeqKGHn=w&e*WgqF}-l4(D@P32Tp_Isse&vC%M1p(T)c z>We9i!~_E5 zl!{a=AeB#wFbo8_;KPa_he-$(MIg;1kWeBmasVCWF$fi}A}JLm9ZwU2h{!aQfdO#- z#dt~$fDg8vNKYkfp~NRu95Ka~mGF?J+o_BI)=t1ub`eyEv6m1>h_PW!XNj2T>`+RQ zbQ{R7Ld;HP;00L`5D{S5?lUlzLxvQi0Ym5rabqp>l3^SHqlyY1r4D5T+ztTUFd2cY zr&}*89?Op9g-(U~N(Ju*7$Fv%c<}eW3(0a{3H%~@1qZ%S-p84+g5#RE(tup}1Xi%m zF4KdL!E!!=mG^uKga8<49`IbOpli5e`}=*YvKw0I8KtLL>4l7d#K?jIm#gS!vi z(g}VtG4;9|lnaC}QYxO%odj0oF=#tRs2nET?cWU(NQ;S?MTTy$#L;c!JeXlC=3AY4+XbRMbTTLaCvZAG0AuQ+_ zlK5C;NLC`zVbBsi2>te_KltSDFMaympMLu4*^jTi|LN=B`rY+cKfU||06zK7tDn97 zE&$~J&Dq~wKkF{`AK^hELjR?6?=HRc&eFNp32^SmOJ{!yR6cp*7r*`SUoTCbC4}Cb zHQ>+QzLc*&`;(<}f3ft^`%5op%yKh~G?C!N!@4h{I_lL80zx`eG`8yZ?{pat0{`$}S zfN}lq-(CX{-JN?4eeu0FjRy3^H~;eUZ@=@!x3As(!FBZck0w8VW9p0Vy?ghS3wK|6 zCo^YgZ&Lviqe9L}ei4aXQpI>u!e~GY4-Q6U0fV{=Z<0WnfpQAR;aV(}90(4E5v(#A zFb^P6Ovd>u=t0nZplWF)Rc~>5L~KPp8#{VX51)h~NS@Fj9mKpsGCr1qn>8F6gcT4- zMGEw??jTojaAn6Pm&O8+oMCq)$#n}2FFJ;qC;V7NVNJG-~|+uPg8 z4@zB7>ge3+@95Z;@f_vTsB;UYwJp;E8*mC%8rHN2^%f}uBr9psb$ge;V@rp>Yjd~3 zMu*Y0JJVWV1MN!&(DQwLeFi^AcvVA(upkmXwsscyXrgiwUJJy!I{jO^w)?kj+Yb8< z_AzX*)v?`=I<{}$p4s#uZD6vG2nd)|F-)eM9ENR{19ebf^Gyr6ec|#^~s2 z%21vcA8po@v@sMJ4$SFkQBJ85iVx@sFkl;&Q84=8Gf|w>$i5{F?m*~@M2y>8N}L=r zgA|zYWn_xTX%U0pw;$9m_CGW{rBIS9N|H7k-H9LeaPL@M%RhaxYpv@UpDp7(!KWnD zt0`C%zgQnYsPrZXWQR@4E$KzkSyyC9(G@hX4V;3 z8pvN8QCj3KzYRqqD!rbML|WbMP3RzXbX9bRQ+$t;NYMS!wb1To&PQV-3QtA!pb^vi)FQb`Jr@TP0$_=U!e1<2ML-*!^d_R^f znqFpXb41`ZUavHF#O$Mz3o;_9#%J8y0o~_LoXkiesN~= zqNjawU$(k+a^LyGS=M!nt(|9Ur~Y(?og2O}a+9rHWS=coM;6(2A6GYIJ(b{8WNTMs z0j{dQU*@QBOdigaGxo|`Y{NX;kYiczw)-B&RrQMdewEAa$kj7;_qUFoJvy~v`tTyV z;Um^XN?EQlXJuT9mE65Ka&E>uVx8P~ySm|W+r_r4&t9uttll|!INO9Kp;Kd)tuV;n z<~$dko8CY3zFn8$UKysQ=6w(%+=oLU-TRzrKe_uMNii~yN&FW z1Lj=mYUDstbG3zSslIq<`pnI?p83^1*AL#@_uRsc=ND>UxNoxpwz)STds*&;v2z^b zshT`OePnVwZ9G^I_x}W+z!JGtV24EVA_`hAO1yU?kTza{o_XyVGhBej!zjdGnUypI zHlihn9Krq!BxJb7fVenQ9VhWO+5q}NKv6zAjD3Z=Fr%gf<2o=10izM_AC!|A zrR5aDi4i%CQYz7N#06~yYHs%l32x{yjcP%|L!g@^51U{YVi3V1afo&WzbtPNiAF>5 zG#ZnY(SX~%kHpVJ--9KIQXh*)znT6Xu#!N7G$4d_Ko|HlDF0ziOR7D=U<~YkYLEmj z!TfM)a13rC;?YXNFc2kg z=yjq>^%akFF;y;A@cN@9^G_i3fkJP1q`RTMsfj4jSv4NQm2xunqjNDK!h(p`l(mfVu@ z3fx;zUj*W28G;$T0;UdOF330-G}Q@Y8}h4-94a661Ap`FTK zK?At5j5-Ku&StS#e#KP$igDdxT0UXW9cIJ7G5o(U{2eB6hiSjVwB2F+P)Pwu*Z-%Z z+S2hQ14*teX0=pJ+wU$#9wu&ubm`hQ(sm-RMYIQiPZ%LA{3vkgt45h@&$ z2fpN(s?`gXXtM81FbpeRIR;jeEu$vPx5zgCvcBoc*WUR044!Z4nmaw;{PeXK7wUT_ zkAGCNYO3?{Qx~7Q^z`I`^GAN|X?&!or|RO4OFOUbo3HWBJU?IEHTUd-r+aeWuepjT zZINr9?9H(dWvVHmL^T+c*maDp8f6eu>D`&NNw}J{>xjI|jdEe`Fx&OmP%yT!xuB3bLzk7u4 AasU7T literal 0 HcmV?d00001 diff --git a/Backend/venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/_cell_widths.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/_cell_widths.cpython-312.pyc index 57992b68c65e80726f544aca2f58affe4bedde82..f66c0fdda02b1975e1a050fc631b97886b2cd199 100644 GIT binary patch delta 20 acmX?Od&ZXgG%qg~0}$vs8*k)3Cw5@6#$j?2u=V1 diff --git a/Backend/venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/_emoji_replace.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/_emoji_replace.cpython-312.pyc index ab2c751668bbf9eab973eedc7274898b9f51cc33..2ef16d543f7de7acb6c2999e02b1337c2dbfb3e6 100644 GIT binary patch delta 20 acmX@hdzP2`G%qg~0}$vs8*k)3#0CI1{RGwk delta 20 acmX@hdzP2`G%qg~0}wngP}<0Shz$Tc8wF(m diff --git a/Backend/venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/_export_format.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/_export_format.cpython-312.pyc index a7f5b84a56b072b16e111a8e4203673e97361c8b..54e396b02f8fa3e253d03637c6bfc9b686e67844 100644 GIT binary patch delta 20 acmdlfv{Q)tG%qg~0}$vs8*k*+;{*URlmsUL delta 20 acmdlfv{Q)tG%qg~0}wngP}<0?#|Z#8vIMpO diff --git a/Backend/venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/_extension.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/_extension.cpython-312.pyc index dc2c05043dd11eb326f15c949b46bf0d14c8386d..11885d0fc3092578dedd5ac8304234c631290c8f 100644 GIT binary patch delta 20 acmZ3=vXq7UG%qg~0}$vs8*k*6Vgdjzbpyx% delta 20 acmZ3=vXq7UG%qg~0}wngP};~X#RLE{lLS`) diff --git a/Backend/venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/_fileno.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/_fileno.cpython-312.pyc index af4d647a1f0def090bda351c64705ba09d39285e..3e140fac16ec30ec0a31a7af773c60a246c2d87b 100644 GIT binary patch delta 20 acmaFN_Lz%xIsvoLGO5rl=bfM{#t58pha= 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 Rtu#sBG1=~#po}c)e*x~Ta?$_* literal 0 HcmV?d00001 diff --git a/Backend/venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/_log_render.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/_log_render.cpython-312.pyc index 4438a793b6b5d8d96c904c800e6bcf17fc523320..8a54e21bf9046c0ddbe9bf48bec5a2304d993e2f 100644 GIT binary patch delta 20 acmdn5uwQ}uG%qg~0}$vs8*k(`5dZ)-g9Kav delta 20 acmdn5uwQ}uG%qg~0}wngP}<0CA^-q7p#d delta 20 acmaFF`iPbLG%qg~0}wngP}<0Soe2OvKLwBg diff --git a/Backend/venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/_ratio.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/_ratio.cpython-312.pyc index 9e24b2996dae675df976ffddb27980c745e5a97d..bb112e9052d440d5fe6b575252461f72981f38a9 100644 GIT binary patch delta 20 acmZ2ww91J4G%qg~0}$vs8*k*6mjnPc%mhjR delta 20 acmZ2ww91J4G%qg~0}wngP};~XF9`rS>IB&U diff --git a/Backend/venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/_spinners.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/_spinners.cpython-312.pyc index 75f530773cd20b6021ca79957df71da6f773f81b..b64e992bfaee75ea37f7332452813ddb7f8aa03d 100644 GIT binary patch delta 20 ZcmZoqZ%^kw&CAQh00g?u#v8e7i~%^}1myq# delta 20 acmZoqZ%^kw&CAQh00a*Vls0nL7y|%300nda diff --git a/Backend/venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/_stack.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/_stack.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..83ffb4e5d66127ba9c72ad2e6730e9ea06f4b4d7 GIT binary patch literal 977 zcmY*Yzfaph6uvwENJt1j)D9&}uS-=A#G*)@P}Kqw9S~{->fpsPxeGD)SI-V25d%^g zU}`q_7b^ag&K>HdRGrwOhAu4adv=i88$Q2#e)qojeP@4ZG-?Fa;@YzBQbK;>=6;!z zVEhV#3nGZ10ST!?L*_6_7?Dh{D>#MA(HPkvLOUfwmsDyCkh{`~SH#i#hGpL1#$vg? z>8Dv<+36?py{B@z(=Mw@)F+$q3kWWVBn}nCVS+lE)CH49hXILxH7RpUpfdy$Mn@Os zsqR#Os*)Sqnb$rTJbum7&!~+tCp_-(6e(Iae_(wk7R~ik2Avc;@jGF6<51dr(UH9_(*rnR zzlk#$EUw1!fgkPJt8i9E!akJIp&j_UcGAzfakSi8dTytFCKnSZ@b+YCCw^kPP$pt! zE5F^f-I6%z=Nj}KOchdF5KaMg+5k8qBa_TM9Il=poz0FRL2?~>hFfjacE3<#q4OyO zsB`~c7baE5^!|b==~HlEB!N*m7+g%rBd{TA2OhXA zt=1OUWR@isQ|Pan14wZ!&K1s{>j@AHYNaZSXRrd{gj`prKh@9c!}YJ#1vLvPtD09` zH}XR1x_QlY!&vkJjHg}qL(dB)Zz`@U;x?qKiHZ}cvc59lw8F0H0YV)CI~GHz3PuR{ z52Q-~r{tS%T^o%NW5%Q5yI%wzV~v(YZY=5#2j3b%rx0{e=$3$&5}Y8 z50zf(#TJU7w@UFZ@zNedS?j5ndTWh>dh%_$>7@_mz3=UN^UeEq=2JeeBCx`2(SDB+ zI!uzjWmC|724E9WR7Mn2$-yozW1L{wk;)Q8;>a#36O5R&*yHO{oJK0q3{$AW2+dxG zPYZ+&yv*#TP33G$)^kxoeQdjoYc<~!Y(;2p#jDgAzoGe_)6$wDqnhn$lvSH`Lsfqy zn{^x$0h>wya&ydMydr!aXTxT7k<~=3a3-4E)8$gBR0DNqrT`j;)eXQsLKxJEvwDB7 zRZQ_4ya`Ir*V;G&ovTt?qEeIrBn!FE-bUMq%59mFZ9+3|$!^MwQ44>RpJQE#ZU)@; zgeDqHV@@SVv?V$W?fQAKb=#}!CHn~Yqug10BpVY8vE+uj#FLZbOpj709HxOR6csMw zY|0+1DX`oyB+#IN{i9~XcbQrDR?NFBToQg@KJW!|3NyaH1gDxamD&>XsJYC%Wz(^% zX3!E1-zypulV)fORtTU0E-5qvJ1{M1qdqseU2B+DqK6wnE6(%~AA(Z{VTIG+j?kYD z`lX=!@cRAEy>BFUFmz#kVWauV>&$%}zO*&Yh6B znN0reDR?n;3+n@M*0QKyv#isfpr(%pW{nlm3P1!;zIQ9q~N4 ze*?E&pEeyf%|{?jt}UDecPwL!Pb3+W-zvf*hiLdax_Yc2Y48gk-N&ORl7fpH#bX5F Y-Ta<0y?^b_&m`%}NV?Li@{7RpAHh51=l}o! literal 0 HcmV?d00001 diff --git a/Backend/venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/_win32_console.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/_win32_console.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..352fdecaefb486041e3dd171999c0f59a094b0da GIT binary patch literal 28823 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­KEJLc`=u4 z(v%^-jrqwSiFPDN9&z8G*f%L(CJUQv^`Vh!m0$546pA$D5`?BasSjylXxw|B|1GEZVPL^V#BkyE!=mC_WLjo?yg~;)ylt3#a4g`8t?7F{tcc+S&*! zBR4_(A?v5uE8%Por{>7@v&2Uw3$_p9e>9A<1Z?d|AyD-V(sIZkN$wnQKY-iOsAQ)E z-q~@0W+F2c1)5qKiT1FVy`u}p!Ii#b)m){AK}-NKHt}l+QINcc4;!WM-{ul5D;N3WZ zX0m?}>qb4UdznW%aq6s}$kUnPWuDXl@zR`WLgl~df?-u?>-iq3{G2qMtlwqxocRso zoOue@T_CP|m4#T0b4^a~5(`opSS|89&H9NYYt<^|NR2@~PFJNc6Y?*cr|ihrQ7BN4 z7Z1^I?*Bbo>B2gi9uHB)BsJ+tO?fSYL5RFI?EmAxJWfNMi;3)()g_AQa`No${x zJUr-WnP#ngS^1|`{EX{bUC30I_26tDrnM#S7NjJZZ&TN51zDFQK`beh29XYTTn-Y^ z_>d!&cWzvcki)+i5>olt%}1 zbF6Vck#Z)wEuP{w5haMHL! zabim1Kce7!6#QcZ&_hX+HQRzY zSyn~IqzidTTgf{Izi}|xuwhBKx@V#H6I)5rQGNaJwZlKyzufvH^C zvbtQmm50TSXmL~2+JrEviT~W%l(d(;Gw}An4_?0Qx#hVxa)0E5m)?IRw);f9t?zG5 z#{2@D{(_wszg@ft9lGIxwP}gJZNFu|U%veO$=LHJKei4?oZSvfj;hIJ2v%ax#PC-y zA^?Lo=rMSo;Q}Z!RE%7r%&ec3D;j2vnu9-XLfz4&i_aO}Go_b0zV_lHcVWe0@>bC^ zRgH?7u+utH?h@3F=?O<9x!O>!10@-{^a0RlPBiqvy9SYtHQ*MkehSbG9%vQJP{m9m|bYQu4XRLMSJ?}@Y zdy@9D2Uh1&`R)2!_4fiFTf1|$X_^N%!@op?sZMxi|1M)^tT(sV>Fa)MbJ?WXG#T|a zO+LeWMrE$y$Efa@(T|SM_K{_Pe~*8c=n+2y7bY_W`{~y}YKc-J{mgC!#w|H z$~WihY}8fiO97B)r9M67QJ)?o1yELu8k*$vX%coTqRTXuY3Wi`IRUEtTZ8tpTA>d{ zBFA#6jD1_j%$(A3tjc0!O#@%=N$d{Jt~8(G9ds++ML?gHFq&eN!U#)`oJ6fNd$>w;-v_(4g_(#|`Ec*$nicC0N+yKW!2b>N=k{_uz9 zzp@T$sA9u%ZAYxO|a`5WoRihug+6hjuq1von9xMLC^;sa19iLXpPxc#6L!C@UA>(vaWY$L`gSV!dd zbw#H}fiuh*(+dPDo4h4}O^uYT{_M%YZg7S^4a`_CozAnkZ$a5{Ptoq1>0&sx6NN8L z!xrc3l-3kuhNOCBF08a%%v@r3Ws#^d!%UIr&`zcdSwx2o>J&2ql8{@P_DnXIv=v?5 zuw2#>D{EOU+ZZd`c&9X0w)rF5=A^y&>h`z$7P^yVj<>rXDsSnlI1xb%N@p76e+V--Oy9U)fPMHmOGmY`!X3h85oG*+(!Ne^K=W118m$vh zG*Ju!6;92Ljj>{E)tG*iNhe5U4ERrh7N)MJ44y2JS)nBYDCiPgkxftL5Ng39q8AsM zXIr?k%H`6wSZUka76{Il)ID3`xxNn_ACASJJM*#ilyBEa0ive1-=Qtyo&Ys{sT|5{gnh zE_4J1s1ZlZJ7bMIgX<-}roV&xwz%(p>`o z_aJ`wd=So7V5JfxlZ4-&6E6P)fnHXSNYy6{MV-%52#fwL3XHx#OGXN(f zOc?IT*|B?f`j|I_!@HCTpJ6e7G{qt~hK4fq{QMBs4r?${m&=OO%r2Uo4XBJGbvsw$ zxVrnBk;U$h$XxtVwE3kt!s4a})~ZEpxEgci2alR;I;IfOPKSc{4ECX`EWlo(stB;k zks`u=(Aup^JpELTbeKy-ui`+Bd%Q+rb;I3Fs&!ZW6p(!_#(a%oe1ivze3y=9B@q3? zaKQxAEvCz#|?1!x+OI_PT1z8a(j$>R4Z_@@-Sg&<{xGaHZ- zo|O*ZnVv$LZOR1SGU>F1Jh;R^q~M=X@E!&Kl7f2_{Fs7&L&3kLfFb4IQ|to@KBV9; zDfn*`5JIxABDp|m6r7}8jS;~WT!mx7RX8PFnPdKiUs_75Eb~LF8|`N2NiDJx}itj`c_=%UO%gPPlCSSiahS1g8BkY2GAUZuxMS)2KkVac(= z(eut3>3I*C^u97^u$p@e(Jcp8IEs9*VU;~s%Ztnft4=$D`aA?>Rs`kw2r3KA1uNBg z=Cg)7-PF%n!@VBr=&WJ23|Xtyyt&`7YUj--3@i3LbCU#3lLSrEN*Qn7wAA{T!-GvP zLkit*Hi-{%JRaPgmM8OpNF|OGG#AnJzV4mG#cS}+I)_`bF5t>5c=j062V#*TmQE`0 zI9*^7sq8*4jM9~7%C|ajFTj-;k>XcT1eITt9?cQktLJdv!)p{YBX<^thTzO=(xW+2 z^C}(eIptJMygAbF>N$~oLp(~R_N_V6_9_klotZ^)Qm6xe*cZ{{+C5;3RM|lA0rXUX{-&;q{-L``X%BY7Z*v7!0h9jHKpB6OaV7tLO!~w66>q zbZdr!euhrWH3Ka~t=O)V_h%wS$(AnA9BLoELUJ?0@AG+s4;o4LjWg>@1pr?RP zarGPaa^x@z&)_u2mQGIKAuN4)CVAG7!!WFz%nbR6PHsLm9EjM}xk77^mI8v{C;-j2 zk4q;t$o$lBC<3oJ#0F(`2_G862FC_61L;8@7_&Zn1ZY+Nrb(cSmKvJ$`9pN4q*rW? z6sjE)UBSDY&agi<6u7=1GCtjlS1{q(P|AW!-B4d7F)ETg6-gX}a|gU(7!W2?g#-R` zqF0<92+|RJ$^z!lGcb^{^|R|I*-eQ|6u_$qcU*|1hfALvllTdLGFZZ7wIdgQtGtztdRR16% zFP&yka$Vg1EYB*4&YmHJC$!VKh*ThLl+!9Hp%(y8B z$9j3^1urgw98d8gZYo78E(HloLi#(bSSTRiR-YduE{Ss{x|t+rvY!ciCia;Ez+^go z<{*hG`e^P`>j8MDq47iF-{Y0Gj3Ls{R!jzi;g?2}fnP1)3`PH)EBI@!@?lZgJPZ+W zt}JP?ymjD>16TKaWU5UTHZQ!qT-Y2dY+l-UyW>_zyl~qa$3H2kSgc+wh_)PyR(8h= zdZK*K&p6xv;5uSl2f{el@i$!OUvupb^X>DNWZT9l*YeO>LQVnX#j>3n$ z{jI?_23JhRTH}0Sf~$n*LrwF|;v2>ER)II?#$RyxhP{i>C-At_{==@jU8@vbspcFt z*SoHDEthSJm2I0ZPS$U@Ido&_&gYgp4#qkTM(YmE7bm#tWNpjMjvE~muUfG<42_Gg zlN-niJ`ZcWw{w*qD_hYGB`!C;5NmoN%GDEGLvIWv`GU7jy>TijLHSeOx=_9#yj>Tq zY>)GXtFtWI#vsJ>zA?Sr=tvRCJdrOgb5`o#;v(n>A}}g@%oqo;E%-H&NRg(R4#A(aLgtPprNt%GJowXU#C0-iT4uB)Arg zqOIfhsavPmYx9c5ZaAzqO>x)$6%(Eed^}egxtb=T4UL178J1>pSt9;A)a}tv3(ez%1jXdc~4&a4q73O+1!%(Ry|L zUGeqsLj-|*W$DXRFUfBwWLw)(~4o9-KKeA_kO zgS&lciA5b-68zRr?4^r&cPbM0uKC`FMKue;I~U%*5Ut%DFWNGH0t9Qezcuj2K(y4A z;5R3E8?BINS!;sdAirGgNZ?){os4K1ayr$V?FoK|`tp2&->1H06x*NR52!gO6a0Ys zl997B!S7OYGMdiF$#|g#Gy|f+%S~JXQ?f4e4KcnU!8c{aiDyO2_a^w~lYG&9&s#6N z@xsEFu7H1`MpcZjO7Jy=P?Wm*0;`=}s3ykOB>1`~7fQGEWH=geMB z#oage-`KzOm3ZBA34RaDQgN*ThGo>p`1%Cjn9=k@1p;Xn7_xOBct}(7bP#0sS{vhQ z6MVgXuZI)-5p_J#%C37~zBm1oFaPMv9~_SF8IJN534SD_BFYjuBzW*AKqMpgr+ogx QhOeJonKW{IEz?E*4}8)uod5s; literal 0 HcmV?d00001 diff --git a/Backend/venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/_windows.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/_windows.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..bb05862883ffe905bb83c6ee18b593d234e6df29 GIT binary patch literal 2502 zcmZ`*O>7&-6`tLlUH<>*|IbxuS#?BPBK?;`-MFY|OR^e8P9!Hq76BG3?ntJ!++}80 zKNLt@n~)7s+%XdTj$Xa>|W}TqMvbZNm>es{*HIDQUv1unUFY<$$}!Y+V-9lGFR=f}xok)Or1;<)n22- z+8Xlosbx=-QrFdjt}f{$Gwtx}wiB}H8p)fwN$1l+C#WcfS|p0%gcYS|YHK>1M-}D0 zHC6X^0*a!Uc}1ZTcz5uUY3fcwQB=b)ZPhM71h5DAL;petAkpD+_L^BF*%f0mdx==9 zwpq$vHf^F$sh_9lr5F*Yo>8FbNWoyD%fPA1P1B~v9hH? zDXV~)X3{Jz06r7~q0cLkeRFM;?7J;lF$lIY&f)o>kmH}F`acW8UIX4mmh z1E*=iKLM4A%@vlYO3QPmsuAjlaPiqQTakIwPI*4k*cq9cpUlloDR0j%TzzYDPPsa@ z@cQgLOx{?ya&c;Ladv*jiO&$*tHbN2Mw}?D7j5mbYG^ufI_JoWnlF2GnWEIBjzkHR z%lH{0FoecXad6HhtnCp7As?(&K!WY#233#`%_^sHRo-R=a7TsTj`;g8B6ZuZSP@@DX$`MlLTHn-QsC>?ETAnwGzr%t>3e(r)x_0z5vpRl z%hy$e3jVj`x1*|5krvT0WV7tJ1Be#@;_>imp~?g4s%_E*w*CT{_luXxx2Vx(LM9we zd1Jv%zjeN?V0y1YzhKn))TEIr7?!OXd6F`hf5j}*zUnGvt#tZZ)|w0Z=MhTtE^%Cj zq{Fla^t79aUM5&KrR?>NV3jSWV};lr`ql}xfLxAPRIdYO#HF=@uDNhe2OQ~I3tds~ zm5jT@30Q0SJh80j4xI?x1_Wwd74*A;#n9pbzI1WJjl|A5#= z&!VVv`19eK)a1p`kw-)6o#XYP)3v!q?_h1_SrElLZ@zr5^U7`g{=}8N;Vbpn8#TVs zJx~ihh{PTZ{$_tLyEmAv51y{Q*62UB-=E&=Pw(XR`ZM1lejwgR4(%t8?j?_Yxv-af z`Cf8*=e7Ou3wz@izUtWT_ z5f;kO-)5R3EDx;?2>R1lE`aU^V!1xyZZ8M&XXIlgbICUdlUwLTZ9rMWprV(8IzCo)?snbdCeo0p)C zX1q3UuYMAEl|4fbdkww?!+f;n--SVY|^?Z{I;sEwdRy{7dHz|@|XA1 zm3sxOHVp_YSM%F z!0m~8d~7#3_B|Fw=>UOf4)=)tyC?p5fZ*Fag>baCbx#<0h`XL9PSz6>+m|2X<4QVq{!S-_X3+;{5g0sTL`Gy2Op=YTNkhbtG)9a` zQ^dqlxglXrS|XODHDcA~#zalBHd33ci_|4;5gW)%h()%`z$2QGMYM?4C5u?|D^sL? z!|JMiO*e9xNKHUNIJ%fXq-GY~&!AKc5%XLo4FXdvDl0AnX`V*Q(b&d9JS9r&@*KiR za!H?zOA;32si=Zvmyy`UrIdoD#JD7);$&_kjfiy?EhkY*A(q9=(h|bN1iL1Q1tTSc zQ^A;lTBEmG=#B6@duFB~$TAbmw&Bwp!+ZkLO~a;f)08#IU0EY;$+DlZg=M8aYsea( z=!`70)dncacdlg(PxQ5b>C2in%~`Xy(;r|LOV%Q?G<2KRtW_};mVQ<^o`L}S)ozBt z0fkzvHAOpIIxMYI>hn5~6-P@(%Ad6qEY-ZL*{t2H1A7|__)@Pl7slB-(eOF!lC916 zPmA7`d4wwLzEoIS>NUGB{cvnVQyJ5*E10+vLt&&bUAf3=krmm3uVw7tRItBO;4JkT zdo!@paGh&U^f{d1-zs>1d=3cHqQCD|>q1s8)$kbk~t6=J?V7gX~E;2c* zbrnq06-@6}qcx_V{I6NKWH^_5@U?8#Y}z2ou4?YAEuUwlQ-dh|w!)&G>QzPGdaHF6 zzWup^$z6>uGWAvKDwtkXF!fiXHKyhNGfMT@dXX*KG+4b$nN5Z*7oZJA^oJLq#{g}n zXxXrB*t!kp@zDh3>;&rjiD-s`*Qfmk+bO;6w z^q0(V7kO!w;=8NrAF$3-Ln#Z`ty%j6PUU$pEk&cLDE#t2~|H; zG-5IoUhst{NJ}|lNy6(5woUnx3Bt5=S{$kpzfR zCYd6(slbF^$S)zbmAF`Nme^*eLJLKWydtgZVIX#Y*f;AJ0zqLq5cHE~c;d)NKq*m> zmV`t+g-A~m&<AnXIeZV-#^wkb(pQD$u`xdHZ| zd0uL7CC`eKM4si;1J4AKR~0GknUWNg=)EOLtMSyb=N5z;Joc=i)S4#|U-YCmlocs8 z;O^`9$dGTnX#hl*k?cvw(;fj}qJ%v-9$WDU>-o2yfI)~b!tV42aU`^7;5i*00n@DT zlkY$}|B`vrz_fRrF+JuUwdTr0(?hhq@S^dZ7meI$6L-?ot~Ryrc0M*AH@UxW;vO~b zH13*?o1EVdcpuK3^1WxwHG9u?{b}3v$G$Ir0fUydy`htin`+0+!(SA#pZw|(39zi2<@T2HtxmFs%m?cKlsZQnPU@7lkM{>Ayc`|dG! z@6^%0_wk8yOm&VOI>rF|D6|vWojB%Px@J&y4jwuND_HvWqetCi$DB{ccvYwO(BUm& zN~?!e=kTFpSkt&v&Xwb?>uW|;=jfqhRMUK*av$V4ca<$CT(8RY<~Wb8nN*#VhmOgY zeCOW$)1ha^gX=@Uzn?hb@9YG?+ck~Nt#a7%OwEw;+(kKX;_{%GiMWgC4KiIkf-DQQJ>!z9Orr9~r z58s|C`P=+W!D_!&jgH literal 0 HcmV?d00001 diff --git a/Backend/venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/_wrap.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/_wrap.cpython-312.pyc index 136ba0a0b211196e320fc310b97470547f09fd2a..c3b53aaf0029a6a1b002aa3b4dfd3243d2b10b8e 100644 GIT binary patch delta 20 acmbOtHARa1G%qg~0}$vs8*k+1M delta 20 acmbOtHARa1G%qg~0}wngP}<1N$qN884g^~O diff --git a/Backend/venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/abc.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/abc.cpython-312.pyc index a9846a3c4cc7db1dd9403832799f1d8120e020f3..5078a9987e6be45dfb14779a1241d73c3cf559fd 100644 GIT binary patch delta 20 acmcb@bA^ZdG%qg~0}$vs8*k+HWCH*;@dRlA delta 20 acmcb@bA^ZdG%qg~0}wngP}<1t$p!#B4+QuC diff --git a/Backend/venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/align.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/align.cpython-312.pyc index 5b2fee0ff4e72ac15a7c5bd78b16743b80cb8131..0dd9a7773a879d4bd18e31d9e921c1a952e83e40 100644 GIT binary patch delta 20 acmZopXinfh&CAQh00g?u#v8eR=mP*aLIpqTtW&`7#(GqB$M?dJq%Jj z3ahhOZ_-O?ug+zCNne&v@>wA%P#LHDvtm-Dv`-IYrKCh@Uhl{TlR-)gdS^D23^8aL zDgNIx$uM9MaF-HDuJfRSNRiGXr9%~Ou+Dmtk=bCp^8sPv9$R>E#?o>|TDQ3q1`rPz zB4=!FG^giqoVEGUoMGm4)egFZGr_c_msLYi@yn{2*DaVK9nR0pS}H!Koz)EB1IN^~ zna65YHHex&u1>oocifuQ)wu8-S<&A`Qotcx!G zz{T&o_&pcD>*9A@e1QhYfS1-F{>fM>0l0)zlw=f?^e9Y{CB=b1?{8U!Q@x50emwjH zl~a8^V6FI7UKLdTl!tQSa&Age0_S~6QIUvV={WCA29%&GDV=Hu$bwToB?Pk0WwH>+ z!XOLJdg5I+JCerf@1YP*hD|vwLj^QNp44-hGxB5_4~n7;<9R%74pWM7rdCkpol|-) zZN-P>SJQf4m8Wu8woa)sluFJ`QIbw4_GC<|)0)wqG(y>#oMu?^&PmmJOH~bdubhV2 z#QT7(85uoqYHzCX!B$-2yA^gEm>)R*Elsgb$vYwDfShwrBW&PjRNP)PD6xF<{cA@NYV%$aGN%Nxqd^{#S1Ve@W0cmg@PKbxb`Y~BrPdr3uXj#kiS zp$Iq%2NQP_upU6h3xEvrybzjT_ox?{B1!@442x*!D8k{t;c;n{aw&u?-Zel)wz%A) z83Pr);IY~9kk!$$=Zd~Rc$WEWd74FWb^?Qi(EHC|@d%7aNF(!(yxkJ5=#xvZL)HqIu-RP&6Ln@JqXS*pHgB$qp* z8PkaoC=lc_@uq6Lnb5V#1oX61IpguceM1RTv(!B^V33|x&BTm0lSqM?lEVqCWlkl? zgEcd23#pW5XjUp!kVZh#Hy^BE z)c~omN(AhgU%-hTvI0#F)Ql~_0|eIaBC&cjV|>h9Vi?q(b(&nAtHuqNcWh^o6>b_7 z;a+oNtg%j4)77+Y;{vSmhMUVdZ_x{0AjfkYrNGmiZ_OBM?D~I*JDbYnvNO7BsVP;PK4qD9$dyA^1YO>+>~*fh zF>r;E$(%C#Uz3AW+MXJw{ECS_$D8dXD%)q~r(hK(xgFeI?;xiUg`g2Zi-tJ#T^1Tr z#Oci|rF&tvnS_J>PxS9|=%EjVBlX_CE4wc5s`l``&+hEPF#QK>d&F!^?u%4+y2Z=<(Bq^R@;7Xam%5q&{yBEZ{eldh9|2+ ztlsy;!W*@|r>nw-`i+B2pU-}Fwzl=Do7-;1zlhhijxKHiQkE@Q#x2>p&mG|FU~mb@zc<_j5JrxzY>wJA29# zwa#57@7IBibt&{^|Quh=00UBW1skIv3M=KtK_>MjLuJ$txrd< z`#w2RIab{~RO=pEc(vC3%*|JBCBH~61`pj94&4bxFX|Wcca241@HvSm1 zqI;8WOK-4W0da|RLBOlW+w!tkl{GEap4aT2$5DGeJo#((__l4_Gx2~d3vN34W<^>x z-t7p;P1k-BOtNw~Zz~U5*7^Qfb=X=`a#foL0Kf}@h(eKzg$sph=k|vz>WG!SSH#O= zW$fDFtA`h*M1%GEML3RKo60X$_^;%BHF@7+c&NdHm|l(W(ExX?kW_st)I`AGxLR7xPOWGYsd`uv@SI4s1QRXbd;Z8n4zRNovVn zq=;sRzEF}BIdxx|7@I%seEnkb{{WkJt4vd6^QQCZi(73OlRkw92_QWOCkUVk948cc z+rct`N5ZpCDG%Voz>+K2d=5Z^Wf{|iFe#%r) b#Eu@RqON*J*Eu*mM;S&e4Sa_PrUCu~FF)R~ literal 0 HcmV?d00001 diff --git a/Backend/venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/box.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/box.cpython-312.pyc index cf4ae3cc17330df4106e3db1d22a7d070f5f8a2e..e637d9799db1e00e05bb54179dddd731865d69a8 100644 GIT binary patch delta 20 acmX>deL9-^G%qg~0}$vs8*k)3pbG#&%mtGG delta 20 acmX>deL9-^G%qg~0}wngP}<0SKoINbJ diff --git a/Backend/venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/cells.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/cells.cpython-312.pyc index 28f4ffd56823f350b452f158fffdedbd6c906e55..e7e30d9dd73709957ee5c34482010f6fd5083f95 100644 GIT binary patch delta 20 acmcbneNCJDG%qg~0}$vs8*k)3EeZfUtOYy( delta 20 acmcbneNCJDG%qg~0}wngP}<0SS`+|4$_2{+ diff --git a/Backend/venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/color.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/color.cpython-312.pyc index 20dcee3f5b4802a1b77a95926f78f4e882d3bd13..cf4be64da38e76e9e7a742335b76b4ea6170fda6 100644 GIT binary patch delta 22 ccmX?lp7H2;M()$Ryj%=GpzCbBk$YD<09Hu`r2qf` delta 22 ccmX?lp7H2;M()$Ryj%=G@W4Q6BloU!09t1UGynhq diff --git a/Backend/venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/color_triplet.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/color_triplet.cpython-312.pyc index 3739b61b6bd3f07c42e2f04bfd5e01649247a561..e9a653720a796bc208d8aa17ca5e7d50dc1af2c8 100644 GIT binary patch delta 20 acmdnUyOEdsG%qg~0}$vs8*k)Z#s&Z~odkja delta 20 acmdnUyOEdsG%qg~0}wngP}<17j12%by9E&d diff --git a/Backend/venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/columns.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/columns.cpython-312.pyc index c9dae992ecc8faa191164968292d3e53b35f6aad..c4b99d3212263f9ac05c56e617b761f91c52415a 100644 GIT binary patch delta 20 acmbR4Jl&c5G%qg~0}$vs8*k+9Q3L=sKm@x0 delta 20 acmbR4Jl&c5G%qg~0}wngP}<1dqX+;xUIj`3 diff --git a/Backend/venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/console.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/console.cpython-312.pyc index e04b15157f588426345c8d8b1461c4d32011a68f..1fbf28335e18c063a0db4e7c31cf8ee6c2931e52 100644 GIT binary patch delta 25 fcmey+!v3L!o%=K|FBbz4=sFuWa&P5kOg#huWTpoQ delta 25 fcmey+!v3L!o%=K|FBbz4JTOpdIny8vAPS!Tue6L5oJGZ8T9Id?WHCPtNS!7Gs@czrW`@^PSIkzYh|L z7+`BCGhzx5fZwPjF-tS&oNk1<&>F@cx?cHO=&|S{On*Y zDWP=CH>5DbE%B4n5NtxW2Q0;pBSMKJLTRZdl#V&+3*`+MW;Dcaq}>jfp-lk)pWT4u z`7p!MiBLM`VfA-_5&81zof&X)LljuGo6;IcMc3b~VACN$YT7IICrM+CwmzZxnQ_Ih0>8aV7OnEY^&1S0;<(aHjDCctdQf__V>io5=vua}3 zu@S3yR>!73Z?!v-n8ZTsG0)NoukY>iN5c71DvsHY1~6|k%)5$;u1{sw)yP?;5syC{ zmbqP8FbU>eLzOTEmHn1ake!OqXs7q75;i~WVi`0?w~u5n;bZw+I zo$Kl(@|TJ0sZ%aN*3g9OE;Ag|3B9q597A1Y`&7%ESG^Wlbe)m(@aw8?5;Wwo0KJKP z)iXU+V_}AiRctmERm0Sqj_aee*P?P8b$o%H%*Ttr&Bzw`z31e|=2q@8jBn@m;fcq+ zuRZJ?+M43})IL0U0DJo6t^C1RkRJOnHg>PJJ$k!;XYl6W=cBjIeHTye#m2TWjQj-S z9~Iv(-hO!}bu)E$_Fm@B)xF_&_xlU`u=s1+_u2H_>tEgY;>N>sm-fyMf7`d$Kk@?{ z{rj&dh+hugk;Vv16=q8Og{k^pMX~n literal 0 HcmV?d00001 diff --git a/Backend/venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/emoji.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/emoji.cpython-312.pyc index b9335386d64ed327a448fb09e9bef49cbc73c838..e56aba90f9dea4314b95caaebc480897bd2e36c6 100644 GIT binary patch delta 20 acmew*|4W|xG%qg~0}$vs8*k)(&kq1VmIaCc delta 20 acmew*|4W|xG%qg~0}wngP}<1-o*w{2v<4Xf diff --git a/Backend/venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/errors.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/errors.cpython-312.pyc index e1b577bf0dde03d0927842de427dd384f88c9824..ea039a413a1e4679f368b1af7ff08a0253be1662 100644 GIT binary patch delta 20 acmX@ecaV?!G%qg~0}$vs8*k(`V+Q~{#Ts)G%qg~0}$vs8*k+P#0>yH>IHuQ delta 20 acmew>{#Ts)G%qg~0}wngP}<1-i5mb!2nG%S diff --git a/Backend/venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/highlighter.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/highlighter.cpython-312.pyc index 351208cbe00b38b50810720533378fda0b055dfc..2a795b8bf57ef8366e96199bc93ba5f30334181a 100644 GIT binary patch delta 20 acmdntyTh0JG%qg~0}$vs8*k)Zs|El()de>I delta 20 acmdntyTh0JG%qg~0}wngP}<17Rt*3^^99BL diff --git a/Backend/venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/json.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/json.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c4725399f254e7f8a2b75981f78a59f42c3a72cb GIT binary patch literal 6047 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 literal 0 HcmV?d00001 diff --git a/Backend/venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/jupyter.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/jupyter.cpython-312.pyc index 27ea0a875034c5fd05c5a8e74fc1c8f577f14a5d..9d574d13f1583b5b8fc300d46e868590a5a7fbaf 100644 GIT binary patch delta 20 acmaE=@l=ERG%qg~0}$vs8*k)}5&-}`mjvPf delta 20 acmaE=@l=ERG%qg~0}wngP};~HB?16JwFPki diff --git a/Backend/venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/layout.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/layout.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..1a7ad6566d186f1cc0cda70ab80666cb199051f9 GIT binary patch literal 20232 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 NjrlED>M&vPe*ooLAQk`s literal 0 HcmV?d00001 diff --git a/Backend/venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/live.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/live.cpython-312.pyc index 42303257c8144324811f6cdd057b386db4489038..7945043b7355480b34a4c24b491bb39a3cdc25e7 100644 GIT binary patch delta 22 ccmdlmmvO^fM()$Ryj%=GpzCbBk$b5h080x6=>Px# delta 22 ccmdlmmvO^fM()$Ryj%=G@W4Q6Bll8208c3fcmMzZ diff --git a/Backend/venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/live_render.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/live_render.cpython-312.pyc index 7f6f74af1972bcdfec3e59d589715d9b4ee002e4..4a838be17d62c2411d163997c52a8ec497cd2ba5 100644 GIT binary patch delta 20 acmbQGI!l%NG%qg~0}$vs8*k+97Xkn>aRhk) delta 20 acmbQGI!l%NG%qg~0}wngP}<1dF9ZNKj|B(- diff --git a/Backend/venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/logging.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/logging.cpython-312.pyc index d4bf2e4d2df9f4254233d7faf45bd48b36c96d51..f427d50463e4e2996db55f273886b78ff3955a44 100644 GIT binary patch delta 20 acmZq6Ys=$4&CAQh00g?u#v8eRn*jhixdn3o delta 20 acmZq6Ys=$4&CAQh00a*Vls0nzHUj`Y*9HOr diff --git a/Backend/venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/markup.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/markup.cpython-312.pyc index e398eabd3f8f0af688f5e241f3dbe8883595acbb..bb3b70cb6c23310266384520b5b74e0a6643a136 100644 GIT binary patch delta 20 ZcmZqjZt~_n&CAQh00g?u#v8fIRRJ^{1dsp# delta 20 acmZqjZt~_n&CAQh00a*Vls0mgs{#NxIt3p9 diff --git a/Backend/venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/measure.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/measure.cpython-312.pyc index fe2db59cde849d5aeb34140d8f174f8edf21ec7a..3f59fc18405f184da9a17e21d96186698359a329 100644 GIT binary patch delta 20 acmexj_{EU>G%qg~0}$vs8*k)(DFFaNHwC2t delta 20 acmexj_{EU>G%qg~0}wngP}<1-QUU-*RR%Nw diff --git a/Backend/venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/padding.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/padding.cpython-312.pyc index d682754f0564ce31b1e70c691ab313123bc55ae6..a740dcb04a05f5879cb5c17f28f8f77c826af328 100644 GIT binary patch delta 20 acmZ2&w%UyQG%qg~0}$vs8*k)RkOlxYh6Gmt delta 20 acmZ2&w%UyQG%qg~0}wngP}<0?APoRIqy**w diff --git a/Backend/venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/pager.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/pager.cpython-312.pyc index 129768a806a24a4345488373b55f6879d43d894b..e5937b48e5b65a86ea795f4df4de557fd6a654d8 100644 GIT binary patch delta 20 acmZ3%w}OxRG%qg~0}$vs8*k*6Wd{H-S_A3; delta 20 acmZ3%w}OxRG%qg~0}wngP};~X%MJiEcm#O> diff --git a/Backend/venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/palette.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/palette.cpython-312.pyc index b63c45c08f1ea6835ecd1d92d2ec5ac3dbbc0e19..2bae01883af1732bce3e3f43763b212e288984f5 100644 GIT binary patch delta 20 acmX@7c}|o2G%qg~0}$vs8*k)3ECK*KBLyD- delta 20 acmX@7c}|o2G%qg~0}wngP}<0SSOfq+K?SY= diff --git a/Backend/venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/panel.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/panel.cpython-312.pyc index 65f2a0921ea39d55d58f01d3a6b6c8b7e86103ee..7158156f6526587df1b9a8a66a8203edf6b71c68 100644 GIT binary patch delta 20 acmX?_d^DN+G%qg~0}$vs8*k*^We5O500or* delta 20 acmX?_d^DN+G%qg~0}wngP}<17%MbuY9tI=; diff --git a/Backend/venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/pretty.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/pretty.cpython-312.pyc index 8c52d9eb1a9f428c8931c5d289ba06b484c4bdb5..6cf9f0c5f3f34e5ba7b12d57319edda2dba4bc69 100644 GIT binary patch delta 22 ccmX@Qm+9zUChpU`yj%=GpzCbBk$cxX08{4%x&QzG delta 22 ccmX@Qm+9zUChpU`yj%=G@W4Q6BloU(09XYFNdN!< diff --git a/Backend/venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/progress.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/progress.cpython-312.pyc index e6224e06b1900867cfb4470e75e12436df86eaa2..548df7a0e8ba91c1799f6ab0eb3d5e6e223894e8 100644 GIT binary patch delta 25 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 literal 0 HcmV?d00001 diff --git a/Backend/venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/protocol.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/protocol.cpython-312.pyc index 23eb67f4cf2c882863243bd73748ad210a90ea49..b158e074ada1b846b2299b391e3e922990ad511f 100644 GIT binary patch delta 20 ZcmeC->*3=*&CAQh00g?u#v8dA*#Rs11C{^) delta 20 acmeC->*3=*&CAQh00a*Vls0lRvI77x7z8B% diff --git a/Backend/venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/region.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/region.cpython-312.pyc index e8ccceefab1836a7df0e5608f90600dcb954805b..970b149cc5687ca554dfbf6ac3ac4848a290c80b 100644 GIT binary patch delta 20 acmX@ia+rntG%qg~0}$vs8*k*cU;+R$B?KY> delta 20 acmX@ia+rntG%qg~0}wngP}<0C!2|#|LjTKn0Qj delta 20 acmaE3{KlC3G%qg~0}wngP}<1-P!a$|UIrlm diff --git a/Backend/venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/rule.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/rule.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8bb74ac82eb982b5ea3ffc9ba3509f4902d61a6f GIT binary patch literal 6580 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 literal 0 HcmV?d00001 diff --git a/Backend/venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/scope.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/scope.cpython-312.pyc index a0a38b62e4a9eb0232e25c7a6fda9c8769d6511d..c5ee04b14ccc9d107e12b59f7e9993f74e92304f 100644 GIT binary patch delta 20 acmZpYYm(zW&CAQh00g?u#v8f6^8o-Zu>_w0 delta 20 acmZpYYm(zW&CAQh00a*Vls0mI=K}yT&jl_3 diff --git a/Backend/venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/screen.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/screen.cpython-312.pyc index de10ef2cc2a897bce94ebfc1fa0532983d943218..17fe3217a3135881e5b5c079c65bc7986b511fc0 100644 GIT binary patch delta 20 acmX>gd_b7{G%qg~0}$vs8*k*^$_W59&;-5! delta 20 acmX>gd_b7{G%qg~0}wngP}<17l@kCt?gdQ% diff --git a/Backend/venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/segment.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/segment.cpython-312.pyc index 13b67f5c7eaf3ada791c733cf8e3ed8de84b9a63..011763ff86bf9575df18325a8e6747111e7210d7 100644 GIT binary patch delta 22 ccmdmdpK>M43N z-lCWhq3@-lDiwVhU(uiO^S-3Y#Xu&&VV@c-hB6@z`_*tUl8JCwR-?sOCMFOMIZbHb zDxpCZxaqa^X5y@khAxc|qJIMV!fJc5Bh$h8BDOB%W4@b?nHh;mOR0wO%{PtS6ztw} zB$EJ+4jOA<1OhyVo3ssx#+wvhlcViRI1)=^4avA5+T zaSp)>pIt6jOr}p4RthB$DgLljf6@KtByJnTA<_Mp$4zOruwQnIH?%7z@vPX#A?^ zdRzps`)Jz^Of*1f66E8r{XH+pmYC?sm6)GHA;8HT3Ii12P>g!!gS6wSKNF(^G;vkT z#Npiu?>5jYg5EBG+vyw^@SWvaOoT@m2(#jN@&n>H_fy7AE)a6W&8`Yv`CRb#N zHm@`Y+ywwq#uV_#MXjWa6&1aZUrakxsa93PR5Oj?J<75MdaE+xI&F($j@_Yomq>f5 z8wy*5Ge(t>c~#4qtpdw9FrUlg#^UPinNq8YiS*H?$vT_YnX#BHGd*iCSkT9+m{~5) zG1%03#i3`00vw9Xu}l21^mDfS8B4?kszzJqv|vYV{ksm3dNCzgerGQ&zhk`>aR7TY zEy=)XTJ3ucwtTjHJr06(sBlDY$EE|D1T=Xk{}Ks0Sn;s>Z2t+) z4X-7d5IZns^dmlx^C_=AJ)DmfF!fx?D6o>5lJ!o&?3gfWx8$s|csiDTE7*)qOUkO4 zUj3G6Fm>MMe$v7jXc)#nJYUf9MXkuj7fLJRQ_Q$zYUS~lG?S@gCpGO-p|mi55{dw1 zf$__%ba`AY%#GVIbUZzAY}_cAY^)3fxdmp7mkZ_bERa!6AII<-cO0Z#0n4+6Qo+n- ztFc+0w9*YkH`rpFf#wZTPmu29ns_Z#OOCFIx8=TCXCHKfpY{yC@Bd)_x6_+H`tj|a zp8zWIX=iUO9N##%ey*12uMJMry80dkq^{ta_*QTmgb~Z9Gjmxl<=t%uB*NTD`TzhY zAxrSy{mhaZ!c0og`(faQpbx;yKt@F$gjU}NO|{LLL~{dzqL3JhM=htA|fBNWF{9&8Cn+sWMmLINKyen_FUe(@3X0dJ=eT z_j(4Pos&S%s79ShI3aozY0wX0BYY&D*r={o@5Y9+WQn;LO#&>JMM~q<~8b%rix(lt<|6)rKnqgNO3{78eso5n>$uH(g3#_$Vw3chG z*FKXdO~r7ac#JlOZ0EV)X>~LzwL3+(WItISPs;!6%y4>&Np1o-kU@6E@-^kUNFA28HVk3oTK7S3&O+Rj$v&a$|ep8@%2DujFx_q_871v(etCVO5`!Rs^0jf<6cGvbO(tt-G&wVB}$2hZMXYAE-<4uFIso@A{#ww&8jJyFt?4Sq~u; zCOt#-2trX3@2tlVij(B4yYf+ujBOGNCW}(BqMY9UMR)?8wo& zG$2Jm-|)fO*hFpUnTHYR-;eiPAJ~eIGzP(#{ck7h0VEBQ9_9VOR`+NQ8UAkJlx@ zfQf(`+iDxB`>`vNw%+T>t@xpO0J}jD{U`*Gy}Y=n=nTbNp_I)+@sbRcu`&cYdQf%v zLJ{r~B{O&NlyW8# zqeqS&b^qb(M7aR>WVkeQ#^cA*Y=u>yvBm3*UYrKQLG+GM{C)u+)Qm+dJO?84Fnkg| zo>;yLQ&sH>oU2`>{L1$L9d)L9(3ZKNGgfk!LxlyQim{x}GsBo)#!oOkmW1iU;J$46 z@Y_sj!44l3WM2Vzd}3T#{w4dvoF2fQi1$W*pR^D6JeKey6c0Ea1Nt{Pp;;(0{REDn zwU$@a7IX|XODgMylBs_ehla4hi_#bJ^LCVfN1uT%W>@1s(A2$xAlxH^e{Z)>v<*vy!Ikpj64{at6-M ze9px?{4d^?Pq;WvTkDvtC5CH#!*xFibUh+sAoy931fr<+^Fc5I4nb1*7t?P}Z?;d~ h5x-p@BVym@VH`jczu?L9c@h5!Hn diff --git a/Backend/venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/table.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/table.cpython-312.pyc index b140502eb328042ec93727b12eb497249bf8b62f..b6d6e43b4b94adfb86512ea1a96ae3adf3d57da7 100644 GIT binary patch delta 22 ccmex%jp^GpChpU`yj%=GpzCbBkvn@e0ABtF3;+NC delta 22 ccmex%jp^GpChpU`yj%=G@W4Q6BX{;{0Am~nn*aa+ diff --git a/Backend/venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/terminal_theme.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/terminal_theme.cpython-312.pyc index 5f42af1da008eba79fe4650a6df93c1f565b9085..cf3860ab983a82e3c518c36b06d594021f919d41 100644 GIT binary patch delta 20 acmZ1=wLpsdG%qg~0}$vs8*k(mHq)$ delta 22 ccmbO;n`zE$ChpU`yj%=G@W4Q6BlpB!088Trc>n+a diff --git a/Backend/venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/tree.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/tree.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f69d61f34b2f164c5bad88eca2222f03550c4adc GIT binary patch literal 11808 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 literal 0 HcmV?d00001 diff --git a/Backend/venv/lib/python3.12/site-packages/pip/_vendor/tomli/__pycache__/__init__.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/pip/_vendor/tomli/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f3dc7d6790d65236664d5e033d8423f8389ea975 GIT binary patch literal 350 zcmZ8dJx{|h6twGvqL#vhSXnbPkG2~^45dg6d@M{^tWaC2Rmab=Lq(bTFZd1o7B(i7 zl>xC;>edNIf`uFI-bwFtdhe~*>yUu{#Ymk}LOvVwht}_~IS#`M5hNpmW>mBU)2)(a ztcbZB^2ffCeqIb3rF7jPU0Ah0_77LxFEV&11J}Iu2N~R5^Z)<= literal 0 HcmV?d00001 diff --git a/Backend/venv/lib/python3.12/site-packages/pip/_vendor/tomli/__pycache__/_parser.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/pip/_vendor/tomli/__pycache__/_parser.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..379c78e58a571ccd9625d7e61aba9bc7fe339c0c GIT binary patch literal 29453 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 Zp;wcK6-J)rr!+jjpTBP`=H<1<{|jFu&gcLD literal 0 HcmV?d00001 diff --git a/Backend/venv/lib/python3.12/site-packages/pip/_vendor/tomli/__pycache__/_re.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/pip/_vendor/tomli/__pycache__/_re.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..3f595a4c7f0396a8f98da23ae8b206a1c02dcea9 GIT binary patch literal 4088 zcmahM?{5^xb@s>o+Pm}l{2K#h9T&n9d}l*wz|gp0pCJl3ks(og##%48Yx~UJ?rC-p z;bT|1N=UVvN|>e+u1Hl&i7G1dAypz3srdsc^^1{dW45k})K(SWoI2_UzO--VZjXbe zWMsd6^XAQa^M1^GbAO1(1q7pS_;CKC7(#y|6MqD%2(yhDgl?gCkcw1BM+GL!Fa&3H zw!me%0-I$Ee3mZ+vVlS{8!UvfA-c}#;X))Ep*XJ#SwRhCqgoUPByK|nGc0DGm65~Y`!!T{d&YOlM1wCF>Y|RT3Xy*%>$5R*~P}Ou> z@xlZxn}+5E?Q-6jHbF*2$0a$Z;27%Ofq)K~svVUmsVv4LDo4ht~@H?(V(F4*DhKxd9Ouq2O zxr{uXk+RQLa+_HdKgK7Ukf)qY9=KP96NfnZveKuRuAXI1zVh? z_Ls+fH|(FtmM0}=KQTr6hP;x%KMjVFJQmIAX-k6u4GCTpY#2FtAwx{a)vhkNBPa_0 z974?YkAZp%IcTnNm9ik@U$%?D?J_RwaxU)%+@KqB!*0YC+^7vQs>5McYZ4l0?AOpZ zpXN5XaX04hmAG9ioCrBFC+;+@)})?C4YGKDUjr@hHMF2lbCYhfn{YySXTy%rT*yE1 z)33^^oL>h0-3FubZi^GaO?JfRbOa~rMEujatwy^O#z~tt1i~{%uJ3aLxLB2OTkV9u zP_@xXIL%JdX>nTb23Et>wev^{mVY&D8do%Ii;6ha5WOj}pxC)t(Kf{?zmTPTWJ)yg zbL6R%AdqV@uH-Gv65mzyl9s_3`0~@DJ*(BksU|E!trT-6#+n7!LM18`@rt77Rhqn1 z4D9ojr6^(SaS#seG5whI4~fCVOH$Yi&S0}tv^);(JLU;XK%XmFwiltbRF&;ACgyrv z$Hf29VcmU3G z4F0V@0jQv@Z=*=ljo4!B{iZK>!~(&MaPvkuxe-oKq=g~?fznC;cKp4wd->=G?#H=1 z(nrQ;xqB~vsxP%J?5&J!gc56^&do&Y(#Z1OmDcsd-nH=F&90rxXKu$ow(bmm^xo&( zz0<#oE%h$!tBgEM9sSAqrS311J@=D6D?Kac*OStN_AVwQ9QZ8ZboaWR@6JApA6sY_&xg|`sNz{<~CSHx^SqV zT($CLEmto^Kqtuvb7s2;2$VOtf|ud-gISe@i_N*5T`zYH#er)mM941$Wyn#daiw19 z$jV**`N9F0I575vc?HKo_2d7*fY(ESq>lw>rHN}v9K8dW)FRvkK;p4T@E!nOxSp## z!7Or%NMhlB!qV*n84!!Sm@4Q|bJz0lPZNs+E8~?B@Yp7VvZdq0*5&Wt-hIDi-$q;4 zhliKTw}(>? zQV{PVxJUpA0Dg&pUIJ18EW$+mUyFd(QonDynNxI9W-y7v9AO>~pH_ommQnKeFB4N>it4$=`K zCejdH2ju^SNUb{$cd*D|UfkmSY=5TZzVK1-G?3tGZp@3+-*Z)8L(^?PKgslHC$ThcC1kmczT zDA!~eLj)0RfV550RIC;RqJg$k@M+1&*`}#mm^?B(7HeMo!Vlig$irtc!*9MZb{c-L z%om}LV4|S<^C2h$NwccT$*aRl$a2FEB3brAIkQmA>zWsOH#2_ft@9b2B->jEXeEI3 zk7}hMiA{s?YeaoYi_nwsiGrz?bnSKg7Oaz6YW)$w7RNBmzXinf{u7OUfkyv=_WT(| z9yPaD;t#pzzw$l*;9uH`p};w2i$hF&LEA~^=voMpZ|%OEzo^y&kq>tAe$32t+U-LXZn PHjWu(zKU^74>kM0!9%p? literal 0 HcmV?d00001 diff --git a/Backend/venv/lib/python3.12/site-packages/pip/_vendor/tomli/__pycache__/_types.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/pip/_vendor/tomli/__pycache__/_types.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..5a4b6070e1e8c3b94a07026384c4fabac0a07114 GIT binary patch literal 378 zcmXv|F-yZh6u!%)v5iCrL2z`^4((ChLf5HpluA19V? zCB!EffdzJi0Y6(u#^YCjfE`*}<-m?#%}L$;<~^S)lw zj><)xMp+q|*(FpAXd+dn-CmGMxMe(0n%qIINt_zi$dTfL zcDVx9XmdU?XK6cl8bKP;38WLs;sF)88uIkK**c>#R?rZ}5JVuUhz0E%TgWr2c*0`Z zH?M(gihNVOOn5kEaFy+wRBT$d46F#o_{T-~bb(G*4%#~`WC8CF#mmAwp1MnCcit%u Q=G_^elBH9dk<2q&e|z<5p8x;= literal 0 HcmV?d00001 diff --git a/Backend/venv/lib/python3.12/site-packages/pip/_vendor/tomli_w/__pycache__/__init__.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/pip/_vendor/tomli_w/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b820638a9e97d83300028e93947ad6fd5d16d348 GIT binary patch literal 339 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 literal 0 HcmV?d00001 diff --git a/Backend/venv/lib/python3.12/site-packages/pip/_vendor/truststore/__pycache__/__init__.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/pip/_vendor/truststore/__pycache__/__init__.cpython-312.pyc index 275eff45787fdf90c9dca88784bce0cbda02808c..c4556b33d7ceaf2a3b33bc77a14a571b98bee91f 100644 GIT binary patch delta 20 acmdnNy@Q+kG%qg~0}$vs8*k)Z%L)K9Yy^@3 delta 20 acmdnNy@Q+kG%qg~0}wngP}<17mK6XuiUlD6 diff --git a/Backend/venv/lib/python3.12/site-packages/pip/_vendor/truststore/__pycache__/_api.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/pip/_vendor/truststore/__pycache__/_api.cpython-312.pyc index 5808faa113ece8197cc8f783419435ed9be17b13..ed19c7d9d099d5f6ebb2df286edf28b43f39b241 100644 GIT binary patch delta 22 ccmbQ*$vCx>k^3|+FBbz4=sFv3k^3|+FBbz4JTOq&$lc`v07r@i^#A|> diff --git a/Backend/venv/lib/python3.12/site-packages/pip/_vendor/truststore/__pycache__/_macos.cpython-312.pyc b/Backend/venv/lib/python3.12/site-packages/pip/_vendor/truststore/__pycache__/_macos.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..07914b6d3dddc7662f27f008315a48e3a98f1d0e GIT binary patch literal 19004 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