diff --git a/pointblank/_constants_translations.py b/pointblank/_constants_translations.py index c5b5bc15b..b3a4bb8b4 100644 --- a/pointblank/_constants_translations.py +++ b/pointblank/_constants_translations.py @@ -2817,6 +2817,342 @@ "th": "ประเภท SQL", "fa": "انواع SQL", }, + "note_schema_comparison_disclosure": { + "en": "Schema Comparison", + "fr": "Comparaison de schéma", + "de": "Schema-Vergleich", + "it": "Confronto dello schema", + "es": "Comparación de esquema", + "pt": "Comparação de esquema", + "ro": "Compararea schemei", + "tr": "Şema Karşılaştırması", + "zh-Hans": "模式比较", + "zh-Hant": "綱要比較", + "ja": "スキーマの比較", + "ko": "스키마 비교", + "vi": "So sánh lược đồ", + "ru": "Сравнение схемы", + "cs": "Porovnání schématu", + "pl": "Porównanie schematu", + "da": "Skemasammenligning", + "sv": "Schemajämförelse", + "nb": "Skjemasammenligning", + "nl": "Schemavergelijking", + "fi": "Skeeman vertailu", + "is": "Samanburður skema", + "ar": "مقارنة المخطط", + "hi": "स्कीमा तुलना", + "el": "Σύγκριση σχήματος", + "id": "Perbandingan Skema", + "uk": "Порівняння схеми", + "bg": "Сравнение на схемата", + "hr": "Usporedba sheme", + "et": "Skeemi võrdlus", + "hu": "Séma összehasonlítás", + "ga": "Comparáid Scéimre", + "lv": "Shēmas salīdzinājums", + "lt": "Schemos palyginimas", + "mt": "Paragun tal-Iskema", + "sk": "Porovnanie schémy", + "sl": "Primerjava sheme", + "he": "השוואת סכמה", + "th": "การเปรียบเทียบสคีมา", + "fa": "مقایسه طرح", + }, + "note_schema_comparison_passed": { + "en": "Schema validation **passed**", + "fr": "La validation du schéma a **réussi**", + "de": "Schema-Validierung **bestanden**", + "it": "La convalida dello schema è **passata**", + "es": "La validación del esquema **pasó**", + "pt": "A validação do esquema **passou**", + "ro": "Validarea schemei a **trecut**", + "tr": "Şema doğrulaması **başarılı**", + "zh-Hans": "模式验证**通过**", + "zh-Hant": "綱要驗證**通過**", + "ja": "スキーマ検証が**合格**しました", + "ko": "스키마 검증이 **통과**했습니다", + "vi": "Xác thực lược đồ **đạt**", + "ru": "Проверка схемы **пройдена**", + "cs": "Validace schématu **prošla**", + "pl": "Walidacja schematu **zaliczona**", + "da": "Skemavalidering **bestået**", + "sv": "Schemavalidering **godkänd**", + "nb": "Skjemavalidering **bestått**", + "nl": "Schemavalidatie **geslaagd**", + "fi": "Skeeman validointi **läpäisty**", + "is": "Staðfesting skema **tókst**", + "ar": "التحقق من المخطط **نجح**", + "hi": "स्कीमा सत्यापन **सफल**", + "el": "Η επικύρωση σχήματος **πέρασε**", + "id": "Validasi skema **lulus**", + "uk": "Перевірка схеми **пройдена**", + "bg": "Валидацията на схемата **премина**", + "hr": "Validacija sheme **prošla**", + "et": "Skeemi valideerimine **õnnestus**", + "hu": "Séma érvényesítés **sikeres**", + "ga": "Bailíochtú scéimre **rath**", + "lv": "Shēmas validācija **izturēta**", + "lt": "Schemos patvirtinimas **pavyko**", + "mt": "Validazzjoni tal-iskema **għaddiet**", + "sk": "Validácia schémy **prešla**", + "sl": "Validacija sheme **uspešna**", + "he": "אימות סכמה **עבר**", + "th": "การตรวจสอบสคีมา**ผ่าน**", + "fa": "اعتبارسنجی طرح **موفق**", + }, + "note_schema_comparison_failed": { + "en": "Schema validation **failed**", + "fr": "La validation du schéma a **échoué**", + "de": "Schema-Validierung **fehlgeschlagen**", + "it": "La convalida dello schema è **fallita**", + "es": "La validación del esquema **falló**", + "pt": "A validação do esquema **falhou**", + "ro": "Validarea schemei a **eșuat**", + "tr": "Şema doğrulaması **başarısız**", + "zh-Hans": "模式验证**失败**", + "zh-Hant": "綱要驗證**失敗**", + "ja": "スキーマ検証が**不合格**でした", + "ko": "스키마 검증이 **실패**했습니다", + "vi": "Xác thực lược đồ **thất bại**", + "ru": "Проверка схемы **не пройдена**", + "cs": "Validace schématu **selhala**", + "pl": "Walidacja schematu **nieudana**", + "da": "Skemavalidering **fejlet**", + "sv": "Schemavalidering **misslyckades**", + "nb": "Skjemavalidering **mislyktes**", + "nl": "Schemavalidatie **mislukt**", + "fi": "Skeeman validointi **epäonnistui**", + "is": "Staðfesting skema **mistókst**", + "ar": "التحقق من المخطط **فشل**", + "hi": "स्कीमा सत्यापन **असफल**", + "el": "Η επικύρωση σχήματος **απέτυχε**", + "id": "Validasi skema **gagal**", + "uk": "Перевірка схеми **не пройдена**", + "bg": "Валидацията на схемата **се провали**", + "hr": "Validacija sheme **nije uspjela**", + "et": "Skeemi valideerimine **ebaõnnestus**", + "hu": "Séma érvényesítés **sikertelen**", + "ga": "Bailíochtú scéimre **theip**", + "lv": "Shēmas validācija **neizdevās**", + "lt": "Schemos patvirtinimas **nepavyko**", + "mt": "Validazzjoni tal-iskema **falliet**", + "sk": "Validácia schémy **zlyhala**", + "sl": "Validacija sheme **neuspešna**", + "he": "אימות סכמה **נכשל**", + "th": "การตรวจสอบสคีมา**ล้มเหลว**", + "fa": "اعتبارسنجی طرح **ناموفق**", + }, + "note_schema_comparison_match_settings_title": { + "en": "Schema Match Settings", + "fr": "Paramètres de correspondance de schéma", + "de": "Schema-Übereinstimmungseinstellungen", + "it": "Impostazioni di corrispondenza dello schema", + "es": "Configuración de coincidencia de esquema", + "pt": "Configurações de correspondência de esquema", + "ro": "Setări de potrivire a schemei", + "tr": "Şema Eşleştirme Ayarları", + "zh-Hans": "模式匹配设置", + "zh-Hant": "綱要匹配設定", + "ja": "スキーマ一致設定", + "ko": "스키마 일치 설정", + "vi": "Cài đặt khớp lược đồ", + "ru": "Настройки соответствия схемы", + "cs": "Nastavení shody schématu", + "pl": "Ustawienia dopasowania schematu", + "da": "Indstillinger for skemamatch", + "sv": "Inställningar för schemamatchning", + "nb": "Innstillinger for skjemamatching", + "nl": "Schema-overeenkomstinstellingen", + "fi": "Skeeman vastaavuusasetukset", + "is": "Stillingar skemapörunar", + "ar": "إعدادات مطابقة المخطط", + "hi": "स्कीमा मिलान सेटिंग्स", + "el": "Ρυθμίσεις αντιστοίχισης σχήματος", + "id": "Pengaturan Pencocokan Skema", + "uk": "Налаштування відповідності схеми", + "bg": "Настройки за съвпадение на схемата", + "hr": "Postavke podudaranja sheme", + "et": "Skeemi vastavuse seaded", + "hu": "Séma egyezési beállítások", + "ga": "Socruithe Meaitseála Scéimre", + "lv": "Shēmas atbilstības iestatījumi", + "lt": "Schemos atitikimo nustatymai", + "mt": "Settings tal-Qbil tal-Iskema", + "sk": "Nastavenia zhody schémy", + "sl": "Nastavitve ujemanja sheme", + "he": "הגדרות התאמת סכמה", + "th": "การตั้งค่าการจับคู่สคีมา", + "fa": "تنظیمات تطابق طرح", + }, + "note_schema_column_count_mismatch": { + "en": "column count mismatch (expected: {n_expect}, actual: {n_target})", + "fr": "nombre de colonnes incompatible (attendu : {n_expect}, réel : {n_target})", + "de": "Spaltenanzahl stimmt nicht überein (erwartet: {n_expect}, tatsächlich: {n_target})", + "it": "numero di colonne non corrispondente (previsto: {n_expect}, effettivo: {n_target})", + "es": "desajuste en el número de columnas (esperado: {n_expect}, real: {n_target})", + "pt": "contagem de colunas incompatível (esperado: {n_expect}, real: {n_target})", + "ro": "nepotrivire număr coloane (așteptat: {n_expect}, real: {n_target})", + "tr": "sütun sayısı uyumsuzluğu (beklenen: {n_expect}, gerçek: {n_target})", + "zh-Hans": "列数不匹配(预期:{n_expect},实际:{n_target})", + "zh-Hant": "欄位數量不符(預期:{n_expect},實際:{n_target})", + "ja": "列数の不一致(予想: {n_expect}、実際: {n_target})", + "ko": "열 개수 불일치 (예상: {n_expect}, 실제: {n_target})", + "vi": "số lượng cột không khớp (mong đợi: {n_expect}, thực tế: {n_target})", + "ru": "несоответствие количества столбцов (ожидается: {n_expect}, фактически: {n_target})", + "cs": "nesoulad počtu sloupců (očekáváno: {n_expect}, skutečnost: {n_target})", + "pl": "niezgodność liczby kolumn (oczekiwano: {n_expect}, rzeczywiste: {n_target})", + "da": "uoverensstemmelse i antal kolonner (forventet: {n_expect}, faktisk: {n_target})", + "sv": "kolumnantal matchar inte (förväntat: {n_expect}, faktiskt: {n_target})", + "nb": "uoverensstemmelse i antall kolonner (forventet: {n_expect}, faktisk: {n_target})", + "nl": "aantal kolommen komt niet overeen (verwacht: {n_expect}, werkelijk: {n_target})", + "fi": "sarakkeiden määrä ei täsmää (odotettu: {n_expect}, todellinen: {n_target})", + "is": "misræmi í fjölda dálka (búist við: {n_expect}, raunverulegt: {n_target})", + "ar": "عدم تطابق عدد الأعمدة (متوقع: {n_expect}، فعلي: {n_target})", + "hi": "स्तंभ संख्या बेमेल (अपेक्षित: {n_expect}, वास्तविक: {n_target})", + "el": "αναντιστοιχία αριθμού στηλών (αναμενόμενο: {n_expect}, πραγματικό: {n_target})", + "id": "ketidakcocokan jumlah kolom (diharapkan: {n_expect}, aktual: {n_target})", + "uk": "невідповідність кількості стовпців (очікувано: {n_expect}, фактично: {n_target})", + "bg": "несъответствие в броя колони (очаквано: {n_expect}, действително: {n_target})", + "hr": "nepodudaranje broja stupaca (očekivano: {n_expect}, stvarno: {n_target})", + "et": "veergude arvu mittevastavus (oodatud: {n_expect}, tegelik: {n_target})", + "hu": "oszlopszám eltérés (várt: {n_expect}, tényleges: {n_target})", + "ga": "míréir líon colún (ag súil le: {n_expect}, iarbhír: {n_target})", + "lv": "nesakritība kolonnu skaitā (sagaidīts: {n_expect}, faktiskais: {n_target})", + "lt": "stulpelių skaičiaus neatitikimas (tikėtasi: {n_expect}, faktinis: {n_target})", + "mt": "nuqqas ta' qbil fl-għadd ta' kolonni (mistenni: {n_expect}, attwali: {n_target})", + "sk": "nesúlad počtu stĺpcov (očakávané: {n_expect}, skutočné: {n_target})", + "sl": "neskladje števila stolpcev (pričakovano: {n_expect}, dejansko: {n_target})", + "he": "אי התאמה במספר העמודות (צפוי: {n_expect}, בפועל: {n_target})", + "th": "จำนวนคอลัมน์ไม่ตรงกัน (คาดหวัง: {n_expect}, จริง: {n_target})", + "fa": "عدم تطابق تعداد ستون (مورد انتظار: {n_expect}، واقعی: {n_target})", + }, + "note_schema_unmatched_columns": { + "en": "{n} unmatched column(s)", + "fr": "{n} colonne(s) non correspondante(s)", + "de": "{n} nicht übereinstimmende Spalte(n)", + "it": "{n} colonna/e non corrispondente/i", + "es": "{n} columna(s) sin coincidencia", + "pt": "{n} coluna(s) sem correspondência", + "ro": "{n} coloană/coloane nepotrivite", + "tr": "{n} eşleşmeyen sütun", + "zh-Hans": "{n} 个不匹配的列", + "zh-Hant": "{n} 個不符的欄位", + "ja": "{n} 個の不一致列", + "ko": "{n}개의 불일치 열", + "vi": "{n} cột không khớp", + "ru": "{n} несовпадающих столбца/столбцов", + "cs": "{n} nesouladných sloupců", + "pl": "{n} niezgodnych kolumn", + "da": "{n} ikke-matchende kolonner", + "sv": "{n} omatchade kolumner", + "nb": "{n} umatchede kolonner", + "nl": "{n} niet-overeenkomende kolom(men)", + "fi": "{n} täsmäämätöntä saraketta", + "is": "{n} ósamræmdir dálkar", + "ar": "{n} عمود/أعمدة غير متطابقة", + "hi": "{n} बेमेल स्तंभ", + "el": "{n} μη ταιριαστές στήλες", + "id": "{n} kolom tidak cocok", + "uk": "{n} невідповідних стовпця/стовпців", + "bg": "{n} несъответстващи колони", + "hr": "{n} nepodudarnih stupaca", + "et": "{n} mittevastavat veergu", + "hu": "{n} nem egyező oszlop", + "ga": "{n} colún neamhréir", + "lv": "{n} nesakrītošas kolonnas", + "lt": "{n} neatitinkantys stulpeliai", + "mt": "{n} kolonni li ma jaqblux", + "sk": "{n} nezodpovedajúcich stĺpcov", + "sl": "{n} neujemajočih stolpcev", + "he": "{n} עמודות לא תואמות", + "th": "{n} คอลัมน์ที่ไม่ตรงกัน", + "fa": "{n} ستون ناهماهنگ", + }, + "note_schema_wrong_order": { + "en": "{n} column(s) in wrong order", + "fr": "{n} colonne(s) dans le mauvais ordre", + "de": "{n} Spalte(n) in falscher Reihenfolge", + "it": "{n} colonna/e nell'ordine sbagliato", + "es": "{n} columna(s) en orden incorrecto", + "pt": "{n} coluna(s) em ordem incorreta", + "ro": "{n} coloană/coloane în ordine greșită", + "tr": "{n} sütun yanlış sırada", + "zh-Hans": "{n} 个列的顺序错误", + "zh-Hant": "{n} 個欄位順序錯誤", + "ja": "{n} 個の列の順序が間違っています", + "ko": "{n}개의 열이 잘못된 순서입니다", + "vi": "{n} cột theo thứ tự sai", + "ru": "{n} столбца/столбцов в неправильном порядке", + "cs": "{n} sloupců v nesprávném pořadí", + "pl": "{n} kolumn w złej kolejności", + "da": "{n} kolonner i forkert rækkefølge", + "sv": "{n} kolumner i fel ordning", + "nb": "{n} kolonner i feil rekkefølge", + "nl": "{n} kolom(men) in verkeerde volgorde", + "fi": "{n} saraketta väärässä järjestyksessä", + "is": "{n} dálkar í rangri röð", + "ar": "{n} عمود/أعمدة بترتيب خاطئ", + "hi": "{n} स्तंभ गलत क्रम में", + "el": "{n} στήλες σε λάθος σειρά", + "id": "{n} kolom dalam urutan yang salah", + "uk": "{n} стовпця/стовпців у неправильному порядку", + "bg": "{n} колони в грешен ред", + "hr": "{n} stupaca u pogrešnom redoslijedu", + "et": "{n} veergu vales järjekorras", + "hu": "{n} oszlop rossz sorrendben", + "ga": "{n} colún in ord mícheart", + "lv": "{n} kolonnas nepareizā secībā", + "lt": "{n} stulpeliai netinkama tvarka", + "mt": "{n} kolonni f'ordni ħażin", + "sk": "{n} stĺpcov v nesprávnom poradí", + "sl": "{n} stolpcev v napačnem vrstnem redu", + "he": "{n} עמודות בסדר שגוי", + "th": "{n} คอลัมน์อยู่ในลำดับที่ผิด", + "fa": "{n} ستون در ترتیب اشتباه", + }, + "note_schema_dtype_mismatch": { + "en": "{n} dtype mismatch(es)", + "fr": "{n} type(s) de données incompatible(s)", + "de": "{n} Datentyp-Diskrepanz(en)", + "it": "{n} tipo/i di dati non corrispondente/i", + "es": "{n} tipo(s) de datos no coincidente(s)", + "pt": "{n} tipo(s) de dados incompatível/eis", + "ro": "{n} nepotrivire/nepotriviri tip date", + "tr": "{n} veri tipi uyumsuzluğu", + "zh-Hans": "{n} 个数据类型不匹配", + "zh-Hant": "{n} 個資料類型不符", + "ja": "{n} 個のデータ型の不一致", + "ko": "{n}개의 데이터 타입 불일치", + "vi": "{n} kiểu dữ liệu không khớp", + "ru": "{n} несовпадения/несовпадений типов данных", + "cs": "{n} nesouladů datových typů", + "pl": "{n} niezgodności typów danych", + "da": "{n} datatype-uoverensstemmelser", + "sv": "{n} datatypsmatchningsfel", + "nb": "{n} datatypeuoverensstemmelser", + "nl": "{n} datatype-discrepantie(s)", + "fi": "{n} tietotyyppien eroavaisuutta", + "is": "{n} gagnategundamisræmi", + "ar": "{n} عدم تطابق نوع البيانات", + "hi": "{n} डेटा प्रकार बेमेल", + "el": "{n} αναντιστοιχίες τύπου δεδομένων", + "id": "{n} ketidakcocokan tipe data", + "uk": "{n} невідповідностей типів даних", + "bg": "{n} несъответствия на тип данни", + "hr": "{n} nepodudaranja tipa podataka", + "et": "{n} andmetüübi mittevastavust", + "hu": "{n} adattípus eltérés", + "ga": "{n} míréir cineál sonraí", + "lv": "{n} datu tipu nesakritības", + "lt": "{n} duomenų tipo neatitikimai", + "mt": "{n} nuqqas ta' qbil ta' tip ta' data", + "sk": "{n} nesúladov dátového typu", + "sl": "{n} neskladij tipa podatkov", + "he": "{n} אי התאמות סוג נתונים", + "th": "{n} ประเภทข้อมูลไม่ตรงกัน", + "fa": "{n} عدم تطابق نوع داده", + }, } diff --git a/pointblank/validate.py b/pointblank/validate.py index 4d00af6bf..f08a1fd22 100644 --- a/pointblank/validate.py +++ b/pointblank/validate.py @@ -12602,6 +12602,17 @@ def interrogate( # Add the schema validation info to the validation object validation.val_info = schema_validation_info + # Add a note with the schema expectation and results + schema_note_html = _create_col_schema_match_note_html( + schema_info=schema_validation_info, locale=self.locale + ) + schema_note_text = _create_col_schema_match_note_text( + schema_info=schema_validation_info + ) + validation._add_note( + key="schema_check", markdown=schema_note_html, text=schema_note_text + ) + validation.all_passed = result_bool validation.n = 1 validation.n_passed = int(result_bool) @@ -18433,6 +18444,184 @@ def _create_threshold_reset_note_text() -> str: return "Global thresholds explicitly not used for this step." +def _create_col_schema_match_note_html(schema_info: dict, locale: str = "en") -> str: + """ + Create an HTML note with collapsible schema expectation and results. + + This generates a disclosure-style note showing: + 1. A summary of what failed (if anything) + 2. The full step report table (collapsible) + + Parameters + ---------- + schema_info + The schema validation information dictionary from interrogation. + locale + The locale string (e.g., 'en', 'fr'). + + Returns + ------- + str + HTML-formatted note with collapsible schema details. + """ + passed = schema_info["passed"] + expect_schema = schema_info["expect_schema"] + target_schema = schema_info["target_schema"] + params = schema_info["params"] + columns_dict = schema_info["columns"] + in_order = params["in_order"] + + # Get translations for the locale + passed_text = VALIDATION_REPORT_TEXT["note_schema_comparison_passed"].get( + locale, VALIDATION_REPORT_TEXT["note_schema_comparison_passed"]["en"] + ) + failed_text = VALIDATION_REPORT_TEXT["note_schema_comparison_failed"].get( + locale, VALIDATION_REPORT_TEXT["note_schema_comparison_failed"]["en"] + ) + disclosure_text = VALIDATION_REPORT_TEXT["note_schema_comparison_disclosure"].get( + locale, VALIDATION_REPORT_TEXT["note_schema_comparison_disclosure"]["en"] + ) + settings_title_text = VALIDATION_REPORT_TEXT["note_schema_comparison_match_settings_title"].get( + locale, VALIDATION_REPORT_TEXT["note_schema_comparison_match_settings_title"]["en"] + ) + + # Build summary message + if passed: + summary = f' {passed_text}.' + else: + # Analyze what failed + failures = [] + + # Check column count mismatch + n_expect = len(expect_schema) + n_target = len(target_schema) + if n_expect != n_target: + count_mismatch_text = VALIDATION_REPORT_TEXT["note_schema_column_count_mismatch"].get( + locale, VALIDATION_REPORT_TEXT["note_schema_column_count_mismatch"]["en"] + ) + failures.append(count_mismatch_text.format(n_expect=n_expect, n_target=n_target)) + + # Check for unmatched columns + unmatched_cols = [col for col, info in columns_dict.items() if not info["colname_matched"]] + if unmatched_cols: + unmatched_text = VALIDATION_REPORT_TEXT["note_schema_unmatched_columns"].get( + locale, VALIDATION_REPORT_TEXT["note_schema_unmatched_columns"]["en"] + ) + failures.append(unmatched_text.format(n=len(unmatched_cols))) + + # Check for wrong order (if in_order=True) + if params["in_order"]: + wrong_order = [ + col + for col, info in columns_dict.items() + if info["colname_matched"] and not info["index_matched"] + ] + if wrong_order: + wrong_order_text = VALIDATION_REPORT_TEXT["note_schema_wrong_order"].get( + locale, VALIDATION_REPORT_TEXT["note_schema_wrong_order"]["en"] + ) + failures.append(wrong_order_text.format(n=len(wrong_order))) + + # Check for dtype mismatches + dtype_mismatches = [ + col + for col, info in columns_dict.items() + if info["colname_matched"] and info["dtype_present"] and not info["dtype_matched"] + ] + if dtype_mismatches: + dtype_mismatch_text = VALIDATION_REPORT_TEXT["note_schema_dtype_mismatch"].get( + locale, VALIDATION_REPORT_TEXT["note_schema_dtype_mismatch"]["en"] + ) + failures.append(dtype_mismatch_text.format(n=len(dtype_mismatches))) + + if failures: + summary = ( + f' {failed_text}: ' + ", ".join(failures) + "." + ) + else: + summary = f' {failed_text}.' + + # Generate the step report table using the existing function + # We'll call either _step_report_schema_in_order or _step_report_schema_any_order + # depending on the in_order parameter + if in_order: + step_report_gt = _step_report_schema_in_order( + step=1, schema_info=schema_info, header=None, lang=locale, debug_return_df=False + ) + else: + step_report_gt = _step_report_schema_any_order( + step=1, schema_info=schema_info, header=None, lang=locale, debug_return_df=False + ) + + # Generate the settings HTML using the existing function + settings_html = _create_col_schema_match_params_html( + lang=locale, + complete=params["complete"], + in_order=params["in_order"], + case_sensitive_colnames=params["case_sensitive_colnames"], + case_sensitive_dtypes=params["case_sensitive_dtypes"], + full_match_dtypes=params["full_match_dtypes"], + ) + + # Remove the inner div containing column_schema_match_str + settings_html = re.sub(r'
.*?
', "", settings_html, count=1) + + # Change padding-top from 7px to 2px + settings_html = settings_html.replace("padding-top: 7px;", "padding-top: 2px;") + + # Create new source note HTML that includes both settings and schema + source_note_html = f""" +
{settings_title_text}
+
{settings_html}
+""" + + # Add the settings as an additional source note to the step report + step_report_gt = step_report_gt.tab_source_note(source_note=html(source_note_html)) + + # Extract the HTML from the GT object + step_report_html = step_report_gt._repr_html_() + + # Create collapsible section with the step report + note_html = f""" +{summary} + +
+{disclosure_text} +
+ +{step_report_html} + +
+
+""" + + return note_html.strip() + + +def _create_col_schema_match_note_text(schema_info: dict) -> str: + """ + Create a plain text note for schema validation. + + Parameters + ---------- + schema_info + The schema validation information dictionary from interrogation. + + Returns + ------- + str + Plain text note. + """ + passed = schema_info["passed"] + expect_schema = schema_info["expect_schema"] + target_schema = schema_info["target_schema"] + + if passed: + return f"Schema validation passed. Expected {len(expect_schema)} column(s), found {len(target_schema)}." + else: + return f"Schema validation failed. Expected {len(expect_schema)} column(s), found {len(target_schema)}." + + def _step_report_row_based( assertion_type: str, i: int, @@ -18880,16 +19069,33 @@ def _step_report_schema_in_order( dtype_exp = [] dtype_exp_correct = [] - for i in range(len(exp_columns_dict)): + for i in range(len(expect_schema)): # # `col_name_exp` values # - # The column name is the key in the dictionary, get the column name and - # append it to the `col_name_exp` list - col_name_exp.append(list(exp_columns_dict.keys())[i]) + # Get the column name from expect_schema (which can have duplicates) + column_name_exp_i = expect_schema[i][0] + col_name_exp.append(column_name_exp_i) - column_name_exp_i = col_name_exp[i] + # Check if this column exists in exp_columns_dict (it might not if it's a duplicate) + # For duplicates, we need to handle them specially + if column_name_exp_i not in exp_columns_dict: + # This is a duplicate or invalid column, mark it as incorrect + col_exp_correct.append(CROSS_MARK_SPAN) + + # For dtype, check if there's a dtype specified in the schema + if len(expect_schema[i]) > 1: + dtype_value = expect_schema[i][1] + if isinstance(dtype_value, list): + dtype_exp.append(" | ".join(dtype_value)) + else: + dtype_exp.append(str(dtype_value)) + else: + dtype_exp.append("—") + + dtype_exp_correct.append("—") + continue # # `col_exp_correct` values diff --git a/tests/snapshots/test_validate/test_comprehensive_validation_report_html_snap/comprehensive_validation_report.html b/tests/snapshots/test_validate/test_comprehensive_validation_report_html_snap/comprehensive_validation_report.html index 74b609a99..5d9681bcc 100644 --- a/tests/snapshots/test_validate/test_comprehensive_validation_report_html_snap/comprehensive_validation_report.html +++ b/tests/snapshots/test_validate/test_comprehensive_validation_report_html_snap/comprehensive_validation_report.html @@ -1343,6 +1343,14 @@ + + + + + + + +